feat: Phase 5 — AI Research Agent(受控工具白名单 + LLM 编排 + API)
- agent/tools.py:Tool 元数据(JSON Schema)+ 白名单调用(异常转可读反馈,不中断对话) - agent/tools_impl.py:6 个受控工具 search_stocks / get_market_data / test_factor / run_backtest / get_experiment / compare_experiments —— 全部只读经 Job/Experiment 链路,研究自动归档;无 shell/任意执行/写删数据能力 - agent/llm.py:LLMClient 抽象 + OpenAI 兼容客户端(LLM_API_KEY/LLM_BASE_URL/LLM_MODEL 走 .env,未配置给出引导提示)+ 研究纪律 system prompt(反过拟合/样本外/成本) - agent/service.py:编排循环(tool/final JSON 决策 → 执行 → 回喂 → 结论),轮次上限兜底,未知工具拒绝 - /api/agent/chat;httpx 移至主依赖;Job 默认工厂抽取(api/agent/executor 复用) - 测试 6 项(白名单无 shell、完整研究循环产出、未知工具拒绝、轮次兜底),全量 79 passed / ruff clean
This commit is contained in:
@@ -68,6 +68,9 @@ class Settings:
|
||||
data_source_primary: str
|
||||
data_source_fallback: str
|
||||
tushare_token: str
|
||||
llm_api_key: str
|
||||
llm_base_url: str | None
|
||||
llm_model: str
|
||||
storage: dict[str, Path]
|
||||
config_path: Path = CONFIG_PATH
|
||||
env_path: Path = ENV_PATH
|
||||
@@ -102,6 +105,9 @@ def get_settings() -> Settings:
|
||||
secret_env = _deep(cfg, "app.secret_key_env") or "APP_SECRET_KEY"
|
||||
url_env = _deep(cfg, "database.url_env") or "DATABASE_URL"
|
||||
token_env = _deep(cfg, "data_source.tushare_token_env") or "TUSHARE_TOKEN"
|
||||
llm_key_env = _deep(cfg, "agent.llm_key_env") or "LLM_API_KEY"
|
||||
llm_url_env = _deep(cfg, "agent.llm_base_url_env") or "LLM_BASE_URL"
|
||||
llm_model_env = _deep(cfg, "agent.llm_model_env") or "LLM_MODEL"
|
||||
|
||||
default_url = "sqlite:///./data/quant.db"
|
||||
database_url = os.environ.get(url_env) or default_url
|
||||
@@ -122,5 +128,8 @@ def get_settings() -> Settings:
|
||||
data_source_primary=str(_deep(cfg, "data_source.primary") or "tushare"),
|
||||
data_source_fallback=str(_deep(cfg, "data_source.fallback") or "sina"),
|
||||
tushare_token=os.environ.get(token_env, ""),
|
||||
llm_api_key=os.environ.get(llm_key_env, ""),
|
||||
llm_base_url=os.environ.get(llm_url_env) or None,
|
||||
llm_model=os.environ.get(llm_model_env) or "qwen-plus",
|
||||
storage=_resolve_storage_dirs(cfg),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user