Name | agent-compose-kit JSON |
Version |
0.2.1
JSON |
| download |
home_page | None |
Summary | Core library to compose, validate, and run ADK agent systems from YAML. |
upload_time | 2025-09-07 16:54:06 |
maintainer | None |
docs_url | None |
author | DeadMeme5441 |
requires_python | >=3.12 |
license | MIT |
keywords |
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
Agent Compose Kit
=================


[](https://pypi.org/project/agent-compose-kit/)
[](https://pypi.org/project/agent-compose-kit/)
[](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\n\n[](https://pypi.org/project/agent-compose-kit/)\n[](https://pypi.org/project/agent-compose-kit/)\n[](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"
}