No description
  • Python 99.9%
Find a file
chenxya 1f2d1b4606
Some checks failed
Publish Python distribution to PyPI / Build distribution (push) Has been cancelled
Publish Python distribution to PyPI / Publish Python distribution to PyPI (push) Has been cancelled
V0.1.0 Release
Agentconf TUI + SDK
2026-05-21 23:08:42 +08:00
.github/workflows V0.1.0 Release 2026-05-21 23:08:42 +08:00
LICENSES V0.1.0 Release 2026-05-21 23:08:42 +08:00
src/agentconf V0.1.0 Release 2026-05-21 23:08:42 +08:00
tests V0.1.0 Release 2026-05-21 23:08:42 +08:00
.gitignore V0.1.0 Release 2026-05-21 23:08:42 +08:00
.python-version V0.1.0 Release 2026-05-21 23:08:42 +08:00
example.ipynb V0.1.0 Release 2026-05-21 23:08:42 +08:00
main.py V0.1.0 Release 2026-05-21 23:08:42 +08:00
pyproject.toml V0.1.0 Release 2026-05-21 23:08:42 +08:00
README.en.md V0.1.0 Release 2026-05-21 23:08:42 +08:00
README.md V0.1.0 Release 2026-05-21 23:08:42 +08:00
uv.lock V0.1.0 Release 2026-05-21 23:08:42 +08:00

agentconf

中文

A universal multi-model configuration management SDK designed for single-user terminal AI applications.

Built on Pydantic + SQLite, supporting Any2Any multimodal model capability tagging.

Features

  • Hierarchical Configuration: Provider(BaseURL+APIKEY) → Model Instance(ModelName+ModelType+Capabilities) → Agent, with automatic inheritance from upper layers
  • Multimodal Capability Tagging: Describe model capabilities via model_type and capabilities (vision, function calling, embedding, TTS, ASR, etc.)
  • Secure Storage: API Keys are protected by SecretStr
  • Type Safety: Full-chain Pydantic validation with discriminated union type support for polymorphic capabilities
  • Simple API: Intuitive CRUD + configuration resolution interface
  • User-level Configuration: Configure once, read consistently across multiple applications

Roadmap

  • Connection proxy layer (missing encryption and protection solution)
  • Localization

Limitations

1. Configuration Only

This SDK only provides configuration management. The configuration needs to be combined with a specific model SDK (such as OpenAI, LangChain) to instantiate models.

Application-level implementation details such as timeouts, retries, and prompts are not within the scope of support.

2. No Encryption

The generated SQLite database itself is not encrypted. It only ensures that API keys do not appear in your code files. If you use SQL queries or print(), it is still possible to accidentally print the API key!

Quick Start

Installation

uv add agentconf

Usage

agentconf provides two usage modes:

  1. TUI Tool - Suitable for visual interactive configuration management and viewing
  2. Python SDK - Suitable for programmatic configuration management

Python SDK Usage

Basic Usage

from agentconf import AgentsConfig, ProviderType

with AgentsConfig() as config:
    # Create a Provider
    config.create_provider(
        name="openai",
        provider_type=ProviderType.OPENAI,
        base_url="https://api.openai.com/v1",
        api_key="sk-your-api-key",
    )

    # Create a Model Instance
    config.create_model(
        provider_name="openai",
        name="gpt4o",
        model_name="gpt-4o",
        model_type="llm",
    )

    # Create an Agent
    config.create_agent(
        name="code-reviewer",
        model_name="gpt4o",
        temperature=0.3,
        top_p=0.9,
    )

    # Resolve complete configuration (including inheritance and overrides)
    resolved = config.resolve_agent("code-reviewer")
    print(resolved.model_dump())

Multimodal Capability Tagging

from agentconf import AgentsConfig, ProviderType
from agentconf.models.capabilities import LLMCapabilities, EmbeddingCapabilities

with AgentsConfig() as config:
    config.create_provider(
        name="openai",
        provider_type=ProviderType.OPENAI,
        base_url="https://api.openai.com/v1",
        api_key="sk-xxx",
    )

    # Create an LLM with vision capabilities
    config.create_model(
        provider_name="openai",
        name="gpt4o-vision",
        model_name="gpt-4o",
        model_type="llm",
        capabilities=LLMCapabilities(
            input_modalities=["text", "image"],
            supports_vision=True,
            supports_function_calling=True,
            max_context_length=128000,
        ),
    )

    # Create an Embedding model
    config.create_model(
        provider_name="openai",
        name="text-embed",
        model_name="text-embedding-3-large",
        model_type="embedding",
        capabilities=EmbeddingCapabilities(dimensions=1536),
    )

    # You can also pass a dict as capabilities
    config.create_model(
        provider_name="openai",
        name="rerank-v1",
        model_name="rerank-v1",
        model_type="rerank",
        capabilities={"top_n": 5, "max_input_length": 4096},
    )

    # Filter models by capability
    vision_models = config.find_models_by_capability("supports_vision")
    function_call_models = config.find_models_by_capability("supports_function_calling")
    image_input_models = config.find_models_by_capability("input_modality:image")
    audio_output_models = config.find_models_by_capability("output_modality:audio")

    # Filter by type
    llm_models = config.list_models(model_type="llm")
    embed_models = config.list_models(model_type="embedding")

SDK API Reference

AgentsConfig Client

from agentconf import AgentsConfig

# Initialize (default uses ~/.agentconf/config.db)
config = AgentsConfig()
# Or use a custom path
config = AgentsConfig(db_path="/path/to/config.db")

# Use context manager for automatic connection cleanup
with AgentsConfig() as config:
    # operations...
    pass

Provider Operations

# Create
provider = config.create_provider(
    name="openai-main",
    provider_type=ProviderType.OPENAI,  # or "openai"
    base_url="https://api.openai.com/v1",
    api_key="sk-xxx",
)

# Query
provider = config.get_provider("openai-main")
providers = config.list_providers()

# Update
provider = config.update_provider("openai-main", base_url="https://new-url.com")

# Delete (cascades to associated Models and Agents)
config.delete_provider("openai-main")

Model Instance Operations

from agentconf.models.capabilities import LLMCapabilities

# Create
model = config.create_model(
    provider_name="openai-main",
    name="gpt4o",
    model_name="gpt-4o",
    model_type="llm",  # default "llm", options: embedding, rerank, tts, stt, asr, image_gen
    base_url="https://proxy.com/v1",  # optional: overrides Provider
    api_key="sk-proxy-key",          # optional: overrides Provider
    capabilities=LLMCapabilities(     # optional: capability tags
        supports_vision=True,
        max_context_length=128000,
    ),
)

# Query
model = config.get_model("gpt4o")
models = config.list_models()
models = config.list_models(provider_name="openai-main")  # filter by Provider
models = config.list_models(model_type="embedding")       # filter by type

# Filter by capability
vision_models = config.find_models_by_capability("supports_vision")

# Update
model = config.update_model("gpt4o", model_name="gpt-4o-turbo")

# Delete (cascades to associated Agents)
config.delete_model("gpt4o")

Agent Operations

# Create
agent = config.create_agent(
    name="code-reviewer",
    model_name="gpt4o",
    temperature=0.3,
    top_p=0.9,
    top_k=40,
    max_tokens=2000,
    extra_params={"stop": ["\n\n"]},
)

# Query
agent = config.get_agent("code-reviewer")
agents = config.list_agents()

# Update
agent = config.update_agent("code-reviewer", temperature=0.5)
agent = config.update_agent("code-reviewer", model_name="gpt35")  # change Model

# Delete
config.delete_agent("code-reviewer")

Configuration Resolution

# Resolve Model's complete configuration (including Provider inheritance and Model overrides)
resolved_model = config.resolve_model("gpt4o")
print(resolved_model.api_key)        # complete API Key
print(resolved_model.model_type)     # model type
print(resolved_model.capabilities)   # capability tags

# Resolve Agent's complete configuration (full inheritance chain)
resolved_agent = config.resolve_agent("code-reviewer")
print(resolved_agent.model.base_url)   # final URL used
print(resolved_agent.temperature)       # Agent parameters
print(resolved_agent.model.capabilities)  # model capabilities

Data Models

Provider

Field Type Description
name str Unique name
provider_type enum openai / anthropic / custom
base_url str API base URL
api_key SecretStr API Key stored in plaintext (protected by SecretStr)

Model Instance

Field Type Description
provider_name str Associated Provider
name str Instance name
model_name str Model identifier (e.g., gpt-4o)
model_type str Model type (llm / embedding / rerank / tts / stt / asr / image_gen)
base_url str? Optional URL override for Provider
api_key SecretStr? Optional Key override for Provider
capabilities Capabilities? Model capability tags (varies by model_type)

Agent

Field Type Description
name str Unique name
model_name str Associated Model Instance
temperature float? Temperature parameter (0.0-2.0)
top_p float? Top-P parameter (0.0-1.0)
top_k int? Top-K parameter
max_tokens int? Maximum output token count
extra_params dict? Extended parameters

Model Capability Tags (Capabilities)

Each model_type corresponds to a different capability description class with fields specific to that type:

Modality (Modality Enum)

Value Description
text Text
image Image
audio Audio
video Video
document_pdf PDF document
embedding Vector embedding
score Score (Rerank output)

LLMCapabilities (Large Language Model)

Field Type Default Description
input_modalities list[Modality] [text] Supported input modalities
output_modalities list[Modality] [text] Supported output modalities
supports_streaming bool True Whether streaming output is supported
supports_function_calling bool False Whether function calling is supported
supports_vision bool False Whether vision understanding is supported
supports_json_mode bool False Whether JSON mode is supported
max_context_length int? None Maximum context length (tokens)
max_output_length int? None Maximum output length (tokens)

EmbeddingCapabilities (Vector Embedding)

Field Type Default Description
input_modalities list[Modality] [text] Supported input modalities
output_modalities list[Modality] [embedding] Supported output modalities
dimensions int? None Vector dimensions
max_input_length int? None Maximum input length (tokens)

RerankCapabilities (Reranking)

Field Type Default Description
input_modalities list[Modality] [text] Supported input modalities
output_modalities list[Modality] [score] Supported output modalities
max_input_length int? None Maximum input length (tokens)
top_n int? None Maximum number of documents returned

TTSCapabilities (Text-to-Speech)

Field Type Default Description
input_modalities list[Modality] [text] Supported input modalities
output_modalities list[Modality] [audio] Supported output modalities
languages list[str]? None Supported language list
voices list[str]? None Supported voice list

STTCapabilities (Speech-to-Text / ASR)

Field Type Default Description
input_modalities list[Modality] [audio] Supported input modalities
output_modalities list[Modality] [text] Supported output modalities
languages list[str]? None Supported language list

ImageGenCapabilities (Image Generation)

Field Type Default Description
input_modalities list[Modality] [text] Supported input modalities
output_modalities list[Modality] [image] Supported output modalities
supported_sizes list[str]? None Supported image size list

Configuration Resolution Priority

Agent → Model Instance → Provider (lower layer overrides upper layer)

# Model Instance can override Provider's base_url and api_key
config.create_model(
    provider_name="openai",
    name="gpt4o-proxy",
    model_name="gpt-4o",
    base_url="https://proxy.example.com/v1",  # override
    api_key="sk-proxy-key",                      # override
)

Development

# Install development dependencies
uv sync --extra dev

# Run tests
uv run pytest -v

# Run main.py to start TUI
uv run python main.py

License

Apache-2.0