agent-compose-kit


Nameagent-compose-kit JSON
Version 0.2.1 PyPI version JSON
download
home_pageNone
SummaryCore library to compose, validate, and run ADK agent systems from YAML.
upload_time2025-09-07 16:54:06
maintainerNone
docs_urlNone
authorDeadMeme5441
requires_python>=3.12
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            Agent Compose Kit
=================

![CI](https://github.com/DeadMeme5441/agent-compose-kit/actions/workflows/ci.yml/badge.svg)
![Publish](https://github.com/DeadMeme5441/agent-compose-kit/actions/workflows/publish.yml/badge.svg)
[![PyPI](https://img.shields.io/pypi/v/agent-compose-kit.svg)](https://pypi.org/project/agent-compose-kit/)
[![Python Versions](https://img.shields.io/pypi/pyversions/agent-compose-kit.svg)](https://pypi.org/project/agent-compose-kit/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)

Core Python library for YAML-driven construction of agent systems using Google ADK. This package provides configuration models, service factories, agent and tool builders, registries, runtime utilities, and a programmatic graph builder. It is designed to be consumed by external clients (CLI or web) that handle end-user interaction. No server, CLI, or TUI is included in this repo.

Features
- Config schema (Pydantic) with environment interpolation and provider defaults.
- Services (conservative defaults):
  - Sessions: in-memory (default), Redis (host/port/db/password or URL), Mongo, SQL (database_url), YAML file.
- Artifacts: in-memory (default), Local folder, S3, Mongo, SQL.
- Memory: in-memory (default), Redis, Mongo, SQL, YAML file.
- Agents: direct model IDs (Gemini/Vertex) or LiteLLM models (OpenAI, Anthropic, Ollama, vLLM), function tools, sub-agent wiring.
- Workflows: sequential, parallel, loop composition.
- Runtime: map YAML runtime to ADK RunConfig; build ADK Runner instances.
- Public API for external CLIs: system/session helpers, run helpers, env-based path helpers.

Design notes
- Conservative by default: when required service parameters are not provided, factories fall back to in-memory implementations (never attempt network/local resources silently).
- Provider defaults: `model_providers` merge into LiteLLM configs (e.g., OpenAI keys, API base) without overwriting explicit values.

Tools
- Function tools: `{type: function, ref: "module:callable", name?}`. The callable must be Python; for cross-language tools use MCP/OpenAPI below.
- MCP toolsets: connect to MCP servers via stdio/SSE/HTTP and expose their tools to agents.
- OpenAPI toolsets: generate `RestApiTool`s from an OpenAPI spec (inline/path/url with allowlist); agents can call REST APIs directly.
- Shared toolsets: define once under `toolsets:` and reference from agents with `{use: name}`.
- Registry references: reference MCP/OpenAPI toolsets declared under `mcp_registry` / `openapi_registry` via `{use: 'mcp:<id>'}`, `{use: 'mcp_group:<id>'}`, `{use: 'openapi:<id>'}`, `{use: 'openapi_group:<id>'}`.
- A2A remote agents: declare remote clients under `a2a_clients` and set `AgentConfig.kind: a2a_remote` + `client: <id>`.

YAML Examples (Tools)
```yaml
toolsets:
  # Reusable MCP toolset via stdio (requires `mcp` package installed)
  fs_tools:
    type: mcp
    mode: stdio
    command: npx
    args: ["-y", "@modelcontextprotocol/server-filesystem", "./sandbox"]
    tool_filter: [list_directory, read_file]

agents:
  - name: planner
    model: gemini-2.0-flash
    instruction: Use tools when appropriate.
    tools:
      # Function tool (Python callable)
      - {type: function, ref: tests.helpers:sample_tool, name: add}
      # Reuse shared toolset
      - {use: fs_tools}

  - name: api_caller
    model: gemini-2.0-flash
    instruction: Use REST API tools.
    tools:
      - type: openapi
        spec:
          path: ./specs/petstore.yaml  # or inline: "{...}" (json/yaml)
        spec_type: yaml  # json|yaml; inferred from path extension when omitted
        tool_filter: []

      # Registry references (resolved when registries are provided)
      - {use: 'mcp:files'}
      - {use: 'mcp_group:default'}
      - {use: 'openapi:petstore'}
      - {use: 'openapi_group:public'}
```

Requirements
- Python 3.12+
- Optional extras at runtime depending on backends:
  - google-adk, google-adk-extras, litellm
  - For MCP stdio mode: `mcp` package (and any server requirements)

Install
- pip: `pip install agent-compose-kit`
- uv: `uv add agent-compose-kit`

Install (dev)
- uv sync

Quickstart (Programmatic)
```python
from pathlib import Path
from agent_compose_kit.config.models import load_config_file
from agent_compose_kit.services.factory import build_session_service, build_artifact_service, build_memory_service
from agent_compose_kit.agents.builder import build_agents
from agent_compose_kit.runtime.supervisor import build_plan, build_run_config

cfg = load_config_file(Path("configs/app.yaml"))
print(build_plan(cfg))

artifact_svc = build_artifact_service(cfg.artifact_service)
session_svc = build_session_service(cfg.session_service)
memory_svc = build_memory_service(cfg.memory_service)

agents = build_agents(cfg.agents, provider_defaults=cfg.model_providers)
root = agents[cfg.workflow.nodes[0]] if (cfg.workflow and cfg.workflow.nodes) else agents[cfg.agents[0].name]

from google.adk.runners import Runner
runner = Runner(app_name="template-agent-builder", agent=root, artifact_service=artifact_svc, session_service=session_svc, memory_service=memory_svc)
rc = build_run_config(cfg)
# Use runner in your application according to ADK docs
```

Registries (Tools & Agents)
- Define reusable tools and agents in your config, then build registries:
```python
from pathlib import Path
from agent_compose_kit.config.models import load_config_file
from agent_compose_kit.tools.builders import build_tool_registry_from_config
from agent_compose_kit.agents.builders_registry import build_agent_registry_from_config

cfg = load_config_file(Path("configs/app.yaml"))
tool_reg = build_tool_registry_from_config(cfg, base_dir=".")
agent_reg = build_agent_registry_from_config(cfg, base_dir=".", provider_defaults=cfg.model_providers, tool_registry=tool_reg)

root = agent_reg.get("parent")  # or agent_reg.get_group("core")[0]
```

MCP/OpenAPI Registries (Config)
```yaml
mcp_registry:
  servers:
    - id: files
      mode: sse        # sse|stdio|http
      url: http://localhost:3000/sse
      headers: {Authorization: 'Bearer ${TOKEN}'}
      tool_filter: [list_directory, read_file]
  groups:
    - {id: default, include: [files]}

openapi_registry:
  fetch_allowlist: ["api.example.com", "*.trusted.com"]
  apis:
    - id: petstore
      spec: {path: ./specs/petstore.yaml}   # or inline: "{...}" or url: https://api.example.com/openapi.json
      spec_type: yaml
      tool_filter: []
  groups:
    - {id: public, include: [petstore]}
```

A2A Remote Agents (Config)
```yaml
a2a_clients:
  - id: my_remote
    # Prefer agent card URL (well-known path); url remains supported as a fallback
    agent_card_url: https://remote.agents.example.com/.well-known/agent-card.json
    headers: {Authorization: 'Bearer ${A2A_TOKEN}'}  # optional

agents:
  - name: remote
    kind: a2a_remote
    client: my_remote
    model: gemini-2.0-flash  # allowed but ignored by remote
```

Migration note (A2A)
- Prior releases used `url` as a base URL for a remote agent. The latest A2A wrapper prefers an agent card reference instead.
- Use `agent_card_url` pointing to the remote agent’s well-known card (e.g., `/a2a/<name>/.well-known/agent-card.json`).
- The old `url` field is still accepted and treated as an agent-card URL for backward compatibility.

Public API (for external CLI)
- Build a system and run a message:
```python
from pathlib import Path
from agent_compose_kit.api.public import SystemManager, SessionManager, run_text, event_to_minimal_json

sm = SystemManager(base_dir=Path("./systems/my_system"))
cfg = sm.load("config.yaml")
runner, _resources = sm.build_runner(cfg)

import asyncio

async def main():
    sess = await SessionManager(runner).get_or_create(user_id="u1")
    async for ev in run_text(runner=runner, user_id="u1", session_id=sess.id, text="hello"):
        print(event_to_minimal_json(ev))

asyncio.run(main())
```

Environment variables (optional)
- `AGENT_SYS_DIR`: root directory where systems live (default `./systems`).
- `AGENT_OUTPUTS_DIR`: root directory for outputs/artifacts (default `./outputs`).
- `AGENT_SESSIONS_URI`: default sessions storage URI (default `sqlite:///./sessions.db`).

System Graph (Programmatic)
```python
from pathlib import Path
from agent_compose_kit.config.models import load_config_file
from agent_compose_kit.graph.build import build_system_graph

cfg = load_config_file(Path("configs/app.yaml"))
graph = build_system_graph(cfg)
print(graph["nodes"], graph["edges"])  # nodes/edges dicts
```

YAML Example
```yaml
services:
  session_service: {type: in_memory}
  artifact_service: {type: local_folder, base_path: ./artifacts_storage}

agents:
  - name: planner
    model: gemini-2.0-flash
    instruction: You are a helpful planner.
    tools: []

workflow:
  type: sequential
  nodes: [planner]

runtime:
  streaming_mode: NONE
  max_llm_calls: 200
```

Testing
- Run all tests: `uv run --with pytest pytest -q`
- Current coverage includes config/env interpolation, service factories (with in-memory fallbacks), function tool loading, workflow composition, and RunConfig mapping.
- Cloud-backed integrations (e.g., GCS) are skipped unless credentials are configured.

Development
- Lint: `uv run --with ruff ruff check .`
- Format: `uv run --with ruff ruff format .`
- Tests: `uv run --with pytest pytest -q`

Project Structure
- `src/config/models.py` — Pydantic models, env interpolation, example writer.
- `src/services/factory.py` — session/artifact/memory service builders.
- `src/agents/builder.py` — model resolution (string/LiteLLM), function tools, sub-agent wiring.
- `src/tools/loader.py` — unified loader for function/MCP/OpenAPI tools and shared toolsets.
- `src/tools/registry.py` — global ToolRegistry (ids, groups, caching, close_all).
- `src/agents/registry.py` — global AgentRegistry (ids, groups, sub-agent wiring).
- `src/agents/builders_registry.py` — helpers to build AgentRegistry from AppConfig.
- `src/tools/builders.py` — helpers to build ToolRegistry from AppConfig.
 - `src/tools/mcp_registry.py` — McpRegistry for building/caching MCP toolsets.
 - `src/tools/openapi_registry.py` — OpenAPIRegistry for building/caching OpenAPI toolsets.
- `src/registry/fs.py` — filesystem helpers for saving/loading systems.
 - `src/api/public.py` — public API for external CLIs (SystemManager, SessionManager, run helpers).
 - `src/paths.py` — path/env helpers (AGENT_SYS_DIR, AGENT_OUTPUTS_DIR, AGENT_SESSIONS_URI).

Schema & Registry
- Export AppConfig JSON schema programmatically:
  - `from agent_compose_kit.config.models import export_app_config_schema`
- Save/load system configs:
  - `from agent_compose_kit.registry.fs import save_system, load_system, list_systems, list_versions, promote`
- `src/runtime/supervisor.py` — plan summary, Runner construction, RunConfig mapping.
- `templates/app.yaml` — example config template.

Roadmap
- See `FULL_IMPLEMENTATION_PLAN.md` for detailed milestones (MCP/OpenAPI toolsets, JSON Schema export, registry helpers, observability hooks).

Optional Dependencies
- `mcp` for MCP stdio mode
- `requests` for OpenAPI URL fetching (when using `spec.url`)

Service Config: URI vs dict
```yaml
services:
  # URI strings are accepted and parsed into structured configs
  session_service: "sqlite:///./sessions.db"       # or "redis://localhost:6379/0", "mongodb://localhost/adk"
  artifact_service: "file://./artifacts"           # or "s3://my-bucket/prefix", "sqlite:///./artifacts.db"
  # memory service optional
  # memory_service: "redis://localhost:6379/0"
```

Equivalent programmatic usage:
```python
from agent_compose_kit.services.factory import build_session_service, build_artifact_service

session = build_session_service("sqlite:///./sessions.db")
artifacts = build_artifact_service("file://./artifacts")
```

License
MIT

Publishing plan (summary)
- Finalize metadata in `pyproject.toml`: project name, description, license, classifiers, homepage/repo URLs, keywords.
- Optional extras: define `[project.optional-dependencies]` for `tools` and `dev`.
- Versioning: adopt SemVer; tag releases in VCS (e.g., v0.1.0).
- Build: `python -m build` (ensure `build` in dev deps) or `uv build`.
- Publish: `twine upload dist/*` (or GitHub Actions workflow for publish-on-tag).
- Docs: keep README as long_description; ensure `README.md` renders on PyPI.
- CI: add GitHub Actions for lint/test on PR; optional publish job on tag.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "agent-compose-kit",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.12",
    "maintainer_email": null,
    "keywords": null,
    "author": "DeadMeme5441",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/4d/35/66b103f4e093d06854b4df4e8b14d7cf8fa85e53ab22ed86fbef24b0f6ad/agent_compose_kit-0.2.1.tar.gz",
    "platform": null,
    "description": "Agent Compose Kit\n=================\n\n![CI](https://github.com/DeadMeme5441/agent-compose-kit/actions/workflows/ci.yml/badge.svg)\n![Publish](https://github.com/DeadMeme5441/agent-compose-kit/actions/workflows/publish.yml/badge.svg)\n[![PyPI](https://img.shields.io/pypi/v/agent-compose-kit.svg)](https://pypi.org/project/agent-compose-kit/)\n[![Python Versions](https://img.shields.io/pypi/pyversions/agent-compose-kit.svg)](https://pypi.org/project/agent-compose-kit/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\nCore Python library for YAML-driven construction of agent systems using Google ADK. This package provides configuration models, service factories, agent and tool builders, registries, runtime utilities, and a programmatic graph builder. It is designed to be consumed by external clients (CLI or web) that handle end-user interaction. No server, CLI, or TUI is included in this repo.\n\nFeatures\n- Config schema (Pydantic) with environment interpolation and provider defaults.\n- Services (conservative defaults):\n  - Sessions: in-memory (default), Redis (host/port/db/password or URL), Mongo, SQL (database_url), YAML file.\n- Artifacts: in-memory (default), Local folder, S3, Mongo, SQL.\n- Memory: in-memory (default), Redis, Mongo, SQL, YAML file.\n- Agents: direct model IDs (Gemini/Vertex) or LiteLLM models (OpenAI, Anthropic, Ollama, vLLM), function tools, sub-agent wiring.\n- Workflows: sequential, parallel, loop composition.\n- Runtime: map YAML runtime to ADK RunConfig; build ADK Runner instances.\n- Public API for external CLIs: system/session helpers, run helpers, env-based path helpers.\n\nDesign notes\n- Conservative by default: when required service parameters are not provided, factories fall back to in-memory implementations (never attempt network/local resources silently).\n- Provider defaults: `model_providers` merge into LiteLLM configs (e.g., OpenAI keys, API base) without overwriting explicit values.\n\nTools\n- Function tools: `{type: function, ref: \"module:callable\", name?}`. The callable must be Python; for cross-language tools use MCP/OpenAPI below.\n- MCP toolsets: connect to MCP servers via stdio/SSE/HTTP and expose their tools to agents.\n- OpenAPI toolsets: generate `RestApiTool`s from an OpenAPI spec (inline/path/url with allowlist); agents can call REST APIs directly.\n- Shared toolsets: define once under `toolsets:` and reference from agents with `{use: name}`.\n- Registry references: reference MCP/OpenAPI toolsets declared under `mcp_registry` / `openapi_registry` via `{use: 'mcp:<id>'}`, `{use: 'mcp_group:<id>'}`, `{use: 'openapi:<id>'}`, `{use: 'openapi_group:<id>'}`.\n- A2A remote agents: declare remote clients under `a2a_clients` and set `AgentConfig.kind: a2a_remote` + `client: <id>`.\n\nYAML Examples (Tools)\n```yaml\ntoolsets:\n  # Reusable MCP toolset via stdio (requires `mcp` package installed)\n  fs_tools:\n    type: mcp\n    mode: stdio\n    command: npx\n    args: [\"-y\", \"@modelcontextprotocol/server-filesystem\", \"./sandbox\"]\n    tool_filter: [list_directory, read_file]\n\nagents:\n  - name: planner\n    model: gemini-2.0-flash\n    instruction: Use tools when appropriate.\n    tools:\n      # Function tool (Python callable)\n      - {type: function, ref: tests.helpers:sample_tool, name: add}\n      # Reuse shared toolset\n      - {use: fs_tools}\n\n  - name: api_caller\n    model: gemini-2.0-flash\n    instruction: Use REST API tools.\n    tools:\n      - type: openapi\n        spec:\n          path: ./specs/petstore.yaml  # or inline: \"{...}\" (json/yaml)\n        spec_type: yaml  # json|yaml; inferred from path extension when omitted\n        tool_filter: []\n\n      # Registry references (resolved when registries are provided)\n      - {use: 'mcp:files'}\n      - {use: 'mcp_group:default'}\n      - {use: 'openapi:petstore'}\n      - {use: 'openapi_group:public'}\n```\n\nRequirements\n- Python 3.12+\n- Optional extras at runtime depending on backends:\n  - google-adk, google-adk-extras, litellm\n  - For MCP stdio mode: `mcp` package (and any server requirements)\n\nInstall\n- pip: `pip install agent-compose-kit`\n- uv: `uv add agent-compose-kit`\n\nInstall (dev)\n- uv sync\n\nQuickstart (Programmatic)\n```python\nfrom pathlib import Path\nfrom agent_compose_kit.config.models import load_config_file\nfrom agent_compose_kit.services.factory import build_session_service, build_artifact_service, build_memory_service\nfrom agent_compose_kit.agents.builder import build_agents\nfrom agent_compose_kit.runtime.supervisor import build_plan, build_run_config\n\ncfg = load_config_file(Path(\"configs/app.yaml\"))\nprint(build_plan(cfg))\n\nartifact_svc = build_artifact_service(cfg.artifact_service)\nsession_svc = build_session_service(cfg.session_service)\nmemory_svc = build_memory_service(cfg.memory_service)\n\nagents = build_agents(cfg.agents, provider_defaults=cfg.model_providers)\nroot = agents[cfg.workflow.nodes[0]] if (cfg.workflow and cfg.workflow.nodes) else agents[cfg.agents[0].name]\n\nfrom google.adk.runners import Runner\nrunner = Runner(app_name=\"template-agent-builder\", agent=root, artifact_service=artifact_svc, session_service=session_svc, memory_service=memory_svc)\nrc = build_run_config(cfg)\n# Use runner in your application according to ADK docs\n```\n\nRegistries (Tools & Agents)\n- Define reusable tools and agents in your config, then build registries:\n```python\nfrom pathlib import Path\nfrom agent_compose_kit.config.models import load_config_file\nfrom agent_compose_kit.tools.builders import build_tool_registry_from_config\nfrom agent_compose_kit.agents.builders_registry import build_agent_registry_from_config\n\ncfg = load_config_file(Path(\"configs/app.yaml\"))\ntool_reg = build_tool_registry_from_config(cfg, base_dir=\".\")\nagent_reg = build_agent_registry_from_config(cfg, base_dir=\".\", provider_defaults=cfg.model_providers, tool_registry=tool_reg)\n\nroot = agent_reg.get(\"parent\")  # or agent_reg.get_group(\"core\")[0]\n```\n\nMCP/OpenAPI Registries (Config)\n```yaml\nmcp_registry:\n  servers:\n    - id: files\n      mode: sse        # sse|stdio|http\n      url: http://localhost:3000/sse\n      headers: {Authorization: 'Bearer ${TOKEN}'}\n      tool_filter: [list_directory, read_file]\n  groups:\n    - {id: default, include: [files]}\n\nopenapi_registry:\n  fetch_allowlist: [\"api.example.com\", \"*.trusted.com\"]\n  apis:\n    - id: petstore\n      spec: {path: ./specs/petstore.yaml}   # or inline: \"{...}\" or url: https://api.example.com/openapi.json\n      spec_type: yaml\n      tool_filter: []\n  groups:\n    - {id: public, include: [petstore]}\n```\n\nA2A Remote Agents (Config)\n```yaml\na2a_clients:\n  - id: my_remote\n    # Prefer agent card URL (well-known path); url remains supported as a fallback\n    agent_card_url: https://remote.agents.example.com/.well-known/agent-card.json\n    headers: {Authorization: 'Bearer ${A2A_TOKEN}'}  # optional\n\nagents:\n  - name: remote\n    kind: a2a_remote\n    client: my_remote\n    model: gemini-2.0-flash  # allowed but ignored by remote\n```\n\nMigration note (A2A)\n- Prior releases used `url` as a base URL for a remote agent. The latest A2A wrapper prefers an agent card reference instead.\n- Use `agent_card_url` pointing to the remote agent\u2019s well-known card (e.g., `/a2a/<name>/.well-known/agent-card.json`).\n- The old `url` field is still accepted and treated as an agent-card URL for backward compatibility.\n\nPublic API (for external CLI)\n- Build a system and run a message:\n```python\nfrom pathlib import Path\nfrom agent_compose_kit.api.public import SystemManager, SessionManager, run_text, event_to_minimal_json\n\nsm = SystemManager(base_dir=Path(\"./systems/my_system\"))\ncfg = sm.load(\"config.yaml\")\nrunner, _resources = sm.build_runner(cfg)\n\nimport asyncio\n\nasync def main():\n    sess = await SessionManager(runner).get_or_create(user_id=\"u1\")\n    async for ev in run_text(runner=runner, user_id=\"u1\", session_id=sess.id, text=\"hello\"):\n        print(event_to_minimal_json(ev))\n\nasyncio.run(main())\n```\n\nEnvironment variables (optional)\n- `AGENT_SYS_DIR`: root directory where systems live (default `./systems`).\n- `AGENT_OUTPUTS_DIR`: root directory for outputs/artifacts (default `./outputs`).\n- `AGENT_SESSIONS_URI`: default sessions storage URI (default `sqlite:///./sessions.db`).\n\nSystem Graph (Programmatic)\n```python\nfrom pathlib import Path\nfrom agent_compose_kit.config.models import load_config_file\nfrom agent_compose_kit.graph.build import build_system_graph\n\ncfg = load_config_file(Path(\"configs/app.yaml\"))\ngraph = build_system_graph(cfg)\nprint(graph[\"nodes\"], graph[\"edges\"])  # nodes/edges dicts\n```\n\nYAML Example\n```yaml\nservices:\n  session_service: {type: in_memory}\n  artifact_service: {type: local_folder, base_path: ./artifacts_storage}\n\nagents:\n  - name: planner\n    model: gemini-2.0-flash\n    instruction: You are a helpful planner.\n    tools: []\n\nworkflow:\n  type: sequential\n  nodes: [planner]\n\nruntime:\n  streaming_mode: NONE\n  max_llm_calls: 200\n```\n\nTesting\n- Run all tests: `uv run --with pytest pytest -q`\n- Current coverage includes config/env interpolation, service factories (with in-memory fallbacks), function tool loading, workflow composition, and RunConfig mapping.\n- Cloud-backed integrations (e.g., GCS) are skipped unless credentials are configured.\n\nDevelopment\n- Lint: `uv run --with ruff ruff check .`\n- Format: `uv run --with ruff ruff format .`\n- Tests: `uv run --with pytest pytest -q`\n\nProject Structure\n- `src/config/models.py` \u2014 Pydantic models, env interpolation, example writer.\n- `src/services/factory.py` \u2014 session/artifact/memory service builders.\n- `src/agents/builder.py` \u2014 model resolution (string/LiteLLM), function tools, sub-agent wiring.\n- `src/tools/loader.py` \u2014 unified loader for function/MCP/OpenAPI tools and shared toolsets.\n- `src/tools/registry.py` \u2014 global ToolRegistry (ids, groups, caching, close_all).\n- `src/agents/registry.py` \u2014 global AgentRegistry (ids, groups, sub-agent wiring).\n- `src/agents/builders_registry.py` \u2014 helpers to build AgentRegistry from AppConfig.\n- `src/tools/builders.py` \u2014 helpers to build ToolRegistry from AppConfig.\n - `src/tools/mcp_registry.py` \u2014 McpRegistry for building/caching MCP toolsets.\n - `src/tools/openapi_registry.py` \u2014 OpenAPIRegistry for building/caching OpenAPI toolsets.\n- `src/registry/fs.py` \u2014 filesystem helpers for saving/loading systems.\n - `src/api/public.py` \u2014 public API for external CLIs (SystemManager, SessionManager, run helpers).\n - `src/paths.py` \u2014 path/env helpers (AGENT_SYS_DIR, AGENT_OUTPUTS_DIR, AGENT_SESSIONS_URI).\n\nSchema & Registry\n- Export AppConfig JSON schema programmatically:\n  - `from agent_compose_kit.config.models import export_app_config_schema`\n- Save/load system configs:\n  - `from agent_compose_kit.registry.fs import save_system, load_system, list_systems, list_versions, promote`\n- `src/runtime/supervisor.py` \u2014 plan summary, Runner construction, RunConfig mapping.\n- `templates/app.yaml` \u2014 example config template.\n\nRoadmap\n- See `FULL_IMPLEMENTATION_PLAN.md` for detailed milestones (MCP/OpenAPI toolsets, JSON Schema export, registry helpers, observability hooks).\n\nOptional Dependencies\n- `mcp` for MCP stdio mode\n- `requests` for OpenAPI URL fetching (when using `spec.url`)\n\nService Config: URI vs dict\n```yaml\nservices:\n  # URI strings are accepted and parsed into structured configs\n  session_service: \"sqlite:///./sessions.db\"       # or \"redis://localhost:6379/0\", \"mongodb://localhost/adk\"\n  artifact_service: \"file://./artifacts\"           # or \"s3://my-bucket/prefix\", \"sqlite:///./artifacts.db\"\n  # memory service optional\n  # memory_service: \"redis://localhost:6379/0\"\n```\n\nEquivalent programmatic usage:\n```python\nfrom agent_compose_kit.services.factory import build_session_service, build_artifact_service\n\nsession = build_session_service(\"sqlite:///./sessions.db\")\nartifacts = build_artifact_service(\"file://./artifacts\")\n```\n\nLicense\nMIT\n\nPublishing plan (summary)\n- Finalize metadata in `pyproject.toml`: project name, description, license, classifiers, homepage/repo URLs, keywords.\n- Optional extras: define `[project.optional-dependencies]` for `tools` and `dev`.\n- Versioning: adopt SemVer; tag releases in VCS (e.g., v0.1.0).\n- Build: `python -m build` (ensure `build` in dev deps) or `uv build`.\n- Publish: `twine upload dist/*` (or GitHub Actions workflow for publish-on-tag).\n- Docs: keep README as long_description; ensure `README.md` renders on PyPI.\n- CI: add GitHub Actions for lint/test on PR; optional publish job on tag.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Core library to compose, validate, and run ADK agent systems from YAML.",
    "version": "0.2.1",
    "project_urls": {
        "Homepage": "https://github.com/DeadMeme5441/agent-compose-kit",
        "Repository": "https://github.com/DeadMeme5441/agent-compose-kit"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "99730fb3b805c5b64f10a1a8b50516ffe7f3f661a75458d90616c2b9931f36f1",
                "md5": "adaeb58cf43c397c87eed0765d1416ef",
                "sha256": "1c320f8121dbefbb0bf2b67ca4f37cb741d417395bea68614959e3843921d7db"
            },
            "downloads": -1,
            "filename": "agent_compose_kit-0.2.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "adaeb58cf43c397c87eed0765d1416ef",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.12",
            "size": 40009,
            "upload_time": "2025-09-07T16:54:05",
            "upload_time_iso_8601": "2025-09-07T16:54:05.719942Z",
            "url": "https://files.pythonhosted.org/packages/99/73/0fb3b805c5b64f10a1a8b50516ffe7f3f661a75458d90616c2b9931f36f1/agent_compose_kit-0.2.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4d3566b103f4e093d06854b4df4e8b14d7cf8fa85e53ab22ed86fbef24b0f6ad",
                "md5": "ff0082e6584d50a8aa39855aaa033487",
                "sha256": "6aee11f893585017dbc9771ce51b4f2124036e00251bf8f119a09ef22c16203d"
            },
            "downloads": -1,
            "filename": "agent_compose_kit-0.2.1.tar.gz",
            "has_sig": false,
            "md5_digest": "ff0082e6584d50a8aa39855aaa033487",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.12",
            "size": 30169,
            "upload_time": "2025-09-07T16:54:06",
            "upload_time_iso_8601": "2025-09-07T16:54:06.841084Z",
            "url": "https://files.pythonhosted.org/packages/4d/35/66b103f4e093d06854b4df4e8b14d7cf8fa85e53ab22ed86fbef24b0f6ad/agent_compose_kit-0.2.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-07 16:54:06",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "DeadMeme5441",
    "github_project": "agent-compose-kit",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "agent-compose-kit"
}
        
Elapsed time: 1.09457s