重构 API 路由并新增工作流编排功能

后端:
- 重构 agents, heartbeats, locks, meetings, resources, roles, workflows 路由
- 新增 orchestrator 和 providers 路由
- 新增 CLI 调用器和流程编排服务
- 添加日志配置和依赖项

前端:
- 更新 AgentsPage、SettingsPage、WorkflowPage 页面
- 扩展 api.ts 新增 API 接口

其他:
- 清理测试 agent 数据文件
- 新增示例工作流和项目审计报告

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Claude Code
2026-03-10 16:36:25 +08:00
parent 7a5a58b4e5
commit 1719d1f1f9
54 changed files with 3175 additions and 612 deletions
+129
View File
@@ -0,0 +1,129 @@
"""
Provider / CLI 检测与配置 API
提供系统可用的 AI CLI 工具检测和 LLM Provider 状态查询
"""
import os
from fastapi import APIRouter
from ..services.cli_invoker import detect_available_clis, CLI_REGISTRY
router = APIRouter(prefix="/providers", tags=["providers"])
# 支持的 CLI 工具元信息
CLI_META = {
"claude": {
"display_name": "Claude Code",
"description": "Anthropic Claude CLI",
"models": ["claude", "claude-sonnet", "claude-opus"],
},
"kimi": {
"display_name": "Kimi CLI",
"description": "Moonshot Kimi CLI",
"models": ["kimi", "kimi-k2", "moonshot"],
},
"opencode": {
"display_name": "OpenCode",
"description": "OpenCode CLI (支持多种模型)",
"models": ["opencode"],
},
}
# 支持的 LLM API Provider
API_PROVIDERS = {
"anthropic": {
"display_name": "Anthropic",
"env_key": "ANTHROPIC_API_KEY",
"models": ["claude-opus-4.6", "claude-sonnet-4.6", "claude-haiku-4.6"],
},
"openai": {
"display_name": "OpenAI",
"env_key": "OPENAI_API_KEY",
"models": ["gpt-4o", "gpt-4-turbo", "gpt-3.5-turbo"],
},
"deepseek": {
"display_name": "DeepSeek",
"env_key": "DEEPSEEK_API_KEY",
"models": ["deepseek-chat", "deepseek-coder"],
},
"google": {
"display_name": "Google Gemini",
"env_key": "GOOGLE_API_KEY",
"models": ["gemini-2.5-pro", "gemini-2.5-flash"],
},
}
@router.get("/")
async def list_providers():
"""
列出所有可用的 AI ProviderCLI + API
前端用于填充 Agent 注册的模型下拉框和 Settings 的 Provider 配置区
"""
available_clis = detect_available_clis()
cli_list = []
for name, meta in CLI_META.items():
installed = name in available_clis
cli_list.append({
"id": name,
"type": "cli",
"display_name": meta["display_name"],
"description": meta["description"],
"installed": installed,
"path": available_clis.get(name, ""),
"models": meta["models"],
})
api_list = []
for name, meta in API_PROVIDERS.items():
has_key = bool(os.environ.get(meta["env_key"]))
api_list.append({
"id": name,
"type": "api",
"display_name": meta["display_name"],
"env_key": meta["env_key"],
"configured": has_key,
"models": meta["models"],
})
return {
"cli": cli_list,
"api": api_list,
}
@router.get("/models")
async def list_available_models():
"""
列出当前可用的所有模型(已安装 CLI + 已配置 API Key 的模型)
前端 Agent 注册弹窗的模型下拉框直接使用此接口
"""
available_clis = detect_available_clis()
models = []
for name in available_clis:
meta = CLI_META.get(name, {})
display = meta.get("display_name", name)
for model in meta.get("models", [name]):
models.append({
"value": model,
"label": f"{model} ({display})",
"provider": name,
"type": "cli",
})
for name, meta in API_PROVIDERS.items():
if os.environ.get(meta["env_key"]):
for model in meta["models"]:
models.append({
"value": model,
"label": f"{model} ({meta['display_name']} API)",
"provider": name,
"type": "api",
})
return {"models": models}