后端: - 重构 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>
130 lines
3.6 KiB
Python
130 lines
3.6 KiB
Python
"""
|
||
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 Provider(CLI + 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}
|