11 KiB
| status | date |
|---|---|
| active | 2026-06-05 |
feat: AgentKit CLI + 独立部署能力
类型: feat
文件: docs/plans/2026-06-05-007-feat-agentkit-cli-deployment-plan.md
深度: Standard — 新增 CLI 模块 + 部署配置改造,涉及 6 个新文件 + 4 个修改
问题框架
AgentKit v2 Phase 1 + Phase 2 已实现 12 个核心模块、544 个测试通过,但无法独立部署和使用:
- 无 CLI — 没有
agentkit命令行工具,只能写 Python 脚本或手动敲 uvicorn 命令 - 无
__main__.py— 不能python -m agentkit启动 - 无
init脚手架 — 新用户不知道如何初始化配置 - Dockerfile 硬编码 GEO —
CMD直接调用configs.geo_server,不是通用入口 - 无生产级 docker-compose — 只有
docker-compose.test.yml(测试用),缺少生产部署配置
架构总览
agentkit CLI (Typer)
├── agentkit init → 生成 agentkit.yaml + .env.example + skills/ + docker-compose.yaml
├── agentkit serve → uvicorn agentkit.server.app:create_app --factory
├── agentkit task submit → AgentKitClient.submit_task()
├── agentkit task status → AgentKitClient.get_task_status()
├── agentkit task list → AgentKitClient.list_tasks()
├── agentkit task cancel → AgentKitClient.cancel_task()
├── agentkit skill list → SkillRegistry.list_skills() (本地) 或 API (远程)
├── agentkit skill load → SkillLoader.load_from_file() (本地)
├── agentkit skill info → Skill 详情
├── agentkit usage → LLMGateway.get_usage_summary()
├── agentkit health → /api/v1/health
└── agentkit version → importlib.metadata.version()
核心设计决策:CLI 是薄封装层,底层复用已有的 AgentKitClient(远程模式)和 create_app() + 各 Registry(本地模式)。
关键技术决策
KTD-1: CLI 框架选择 Typer
决策: 使用 Typer(而非 Click 或 argparse)
理由:
- 与 FastAPI 同作者,类型注解驱动,团队学习成本最低
- 底层基于 Click,可无缝使用 Click 生态
- Rich 集成提供开箱即用的彩色输出、表格、进度条
- 自动生成帮助文档和 shell 补全
- 项目已使用 Pydantic v2 + 类型注解,Typer 风格完美契合
KTD-2: 双模式运行(本地 vs 远程)
决策: CLI 支持两种运行模式
- 本地模式(默认): 直接 import 模块执行,无需 Server 运行
- 远程模式(
--server-url): 通过 HTTP API 调用 AgentKit Server
理由: 开发调试时直接本地运行更方便;生产环境通过 Server 远程调用更安全。agentkit task submit 在本地模式下直接创建 Agent 执行,在远程模式下调用 API。
KTD-3: 配置文件格式 agentkit.yaml
决策: 使用 YAML 格式,支持 ${ENV_VAR} 环境变量替换
理由: 与现有 configs/llm_config.yaml 格式一致,复用 _substitute_env_vars() 逻辑。YAML 比 TOML 更适合嵌套配置,比 JSON 支持注释。
KTD-4: Dockerfile 入口改为 CLI
决策: Dockerfile ENTRYPOINT 改为 agentkit CLI,CMD 默认 serve
理由: 统一入口,支持 docker run agentkit task submit ... 等一次性命令,比硬编码 uvicorn 更灵活。
实施单元
U1. CLI 框架搭建 + serve + version + health
Goal: 建立 CLI 模块骨架,实现最基础的 3 个命令
Dependencies: 无
Files:
src/agentkit/cli/__init__.py(新建)src/agentkit/cli/main.py(新建) — Typer app + serve/version/health 命令src/agentkit/__main__.py(新建) —python -m agentkit入口pyproject.toml(修改) — 添加typer>=0.12依赖 +[project.scripts]入口点Dockerfile(修改) — ENTRYPOINT 改为agentkit
Approach:
main.py创建app = typer.Typer()并注册子命令serve命令调用uvicorn.run()启动create_app()工厂函数version命令使用importlib.metadata.version("fischer-agentkit")health命令调用http://localhost:{port}/api/v1/health__main__.py简单调用app()- pyproject.toml 添加
[project.scripts] agentkit = "agentkit.cli.main:app"
Test scenarios:
agentkit version输出正确版本号agentkit serve --help显示帮助信息agentkit health在 server 未运行时返回连接错误agentkit health在 server 运行时返回健康状态python -m agentkit version等同于agentkit version- Dockerfile ENTRYPOINT 正确执行
agentkit serve
Verification: pip install -e . && agentkit version 输出版本号
U2. task 命令组(submit/status/list/cancel)
Goal: 实现任务管理的 CLI 命令
Dependencies: U1
Files:
src/agentkit/cli/task.py(新建) — task 子命令组src/agentkit/cli/main.py(修改) — 注册 task 子命令
Approach:
task submit:- 本地模式: 创建 Agent → 执行任务 → 输出结果
- 远程模式:
AgentKitClient.submit_task()/submit_task_async() --mode sync|async控制同步/异步--stream启用 SSE 流式输出
task status <task_id>: 调用AgentKitClient.get_task_status()task list: 调用AgentKitClient.list_tasks(),Rich 表格输出task cancel <task_id>: 调用AgentKitClient.cancel_task()- 输入数据通过
--input参数(JSON 字符串)或--input-file参数(JSON 文件路径)
Test scenarios:
agentkit task submit --skill content_generator --input '{"topic":"AI"}'提交同步任务agentkit task submit --mode async --skill content_generator --input '{"topic":"AI"}'返回 task_idagentkit task status <task_id>显示任务状态agentkit task list列出所有任务agentkit task list --status completed过滤已完成任务agentkit task cancel <task_id>取消运行中任务agentkit task submit --input-file input.json从文件读取输入- 远程模式下所有命令正确调用 API
- 本地模式下直接执行无需 Server
Verification: agentkit task submit --help 显示完整帮助
U3. skill 命令组(list/load/info)
Goal: 实现技能管理的 CLI 命令
Dependencies: U1
Files:
src/agentkit/cli/skill.py(新建) — skill 子命令组src/agentkit/cli/main.py(修改) — 注册 skill 子命令
Approach:
skill list: 列出已注册技能,Rich 表格输出(name, mode, description)skill load <path>: 从 YAML 文件加载技能到 Registryskill info <name>: 显示技能详情(config 完整信息)- 本地模式直接操作 SkillRegistry,远程模式调用
/api/v1/skillsAPI
Test scenarios:
agentkit skill list列出所有技能agentkit skill load ./my_skill.yaml加载技能agentkit skill info content_generator显示技能详情- 无技能注册时
skill list显示空列表 - 加载无效 YAML 文件报错
Verification: agentkit skill list 输出技能表格
U4. init 命令 + usage 命令
Goal: 实现项目初始化和用量查询
Dependencies: U1
Files:
src/agentkit/cli/init.py(新建) — init 命令src/agentkit/cli/usage.py(新建) — usage 命令src/agentkit/cli/main.py(修改) — 注册 init/usage 子命令src/agentkit/cli/templates.py(新建) — 模板文件内容(agentkit.yaml、.env.example、docker-compose.yaml、示例 skill)
Approach:
init命令:- 交互式引导(使用 Typer
prompt)或--non-interactive使用默认值 - 生成文件:
agentkit.yaml,.env.example,skills/example_skill.yaml,docker-compose.yaml agentkit.yaml包含 server/llm/memory/skills/logging 配置.env.example包含 API key 占位符docker-compose.yaml包含 agentkit + redis + postgres 服务- 如果文件已存在,询问是否覆盖
- 交互式引导(使用 Typer
usage命令:- 本地模式: 从 LLMGateway.UsageTracker 获取统计
- 远程模式: 调用
/api/v1/llm/usageAPI --agent过滤特定 Agent--format table|json输出格式
Test scenarios:
agentkit init在空目录生成完整配置文件agentkit init --non-interactive使用默认值生成agentkit init文件已存在时提示覆盖- 生成的
agentkit.yaml包含所有必要配置段 - 生成的
.env.example包含 API key 占位符 - 生成的
docker-compose.yaml包含 3 个服务 agentkit usage显示用量统计表格agentkit usage --agent content_generator过滤特定 Agentagentkit usage --format json输出 JSON 格式
Verification: mkdir /tmp/test-init && cd /tmp/test-init && agentkit init && ls -la 看到生成的文件
U5. Dockerfile 改造 + 生产级 docker-compose
Goal: 改造部署配置,支持 CLI 入口 + 生产部署
Dependencies: U1
Files:
Dockerfile(修改) — ENTRYPOINT 改为agentkitdocker-compose.yaml(新建) — 生产部署配置.dockerignore(修改/新建) — 排除 tests/docs
Approach:
- Dockerfile:
ENTRYPOINT ["agentkit"]CMD ["serve", "--host", "0.0.0.0", "--port", "8001"]- 复制
configs/目录到镜像 - 保持多阶段构建 + 非 root 用户
- docker-compose.yaml:
agentkit服务: build ., command: serve, ports: 8001, env_file: .envredis服务: redis:7-alpine, healthcheckpostgres服务: pgvector/pgvector:pg15, healthcheck, volumeagentkitdepends_on redis + postgres (condition: service_healthy)
.dockerignore: 排除 tests/, docs/, .git/, pycache/
Test scenarios:
docker build -t agentkit .构建成功docker run agentkit version输出版本号docker run agentkit serve启动 Serverdocker-compose up启动完整环境docker-compose exec agentkit agentkit health健康检查通过
Verification: docker build -t agentkit . && docker run agentkit version
U6. README 更新 + 集成测试
Goal: 更新文档,添加 CLI 使用示例,编写集成测试
Dependencies: U1-U5
Files:
README.md(修改) — 添加 CLI 使用章节tests/unit/test_cli.py(新建) — CLI 命令测试
Approach:
- README 添加:
- CLI 安装和快速开始
- 所有命令的使用示例
- Docker 部署说明
agentkit init生成的文件结构说明
- 测试:
- 使用
typer.testing.CliRunner测试所有命令 - Mock 远程 API 调用
- 测试 init 生成的文件内容
- 使用
Test scenarios:
agentkit --help显示所有子命令agentkit task --help显示 task 子命令agentkit init --non-interactive生成正确文件agentkit skill list在无技能时显示空列表agentkit version输出格式正确agentkit usage在无用量时显示空表格
Verification: pytest tests/unit/test_cli.py -v 全部通过
范围边界
包含
- CLI 模块(Typer 框架)
__main__.py入口init脚手架生成- Dockerfile 改造
- 生产级 docker-compose
- README 更新
不包含
- 交互式 REPL 模式(后续可加)
- Web UI 管理界面
- CI/CD pipeline 配置
- Kubernetes 部署配置
- 插件市场/注册中心
执行顺序
U1 (CLI 骨架) → U2 (task) + U3 (skill) + U4 (init/usage) 并行 → U5 (Docker) → U6 (README + 测试)
U2/U3/U4 互相独立,可并行实现。U5 依赖 U1(Dockerfile 需要 CLI 入口)。U6 依赖所有前置单元。