中国 A 股 / 港股 / 美股 ADR 深度研究 Agent,工具可插拔,多 LLM provider,自带 Web UI。
dexter / autogen 等开源 agent 默认面向美股 + I/B/E/S,中国市场几乎空白。 Faro Research 把 agent 内核 + 5 个 Tushare 工具 + 多会话 SQLite + 聊天 UI 打包成 docker compose up 一行就跑 的产品;用户挂自家工具即可适配 FOF / 私募 / 研报 等场景。
┌───────────┐ ┌────────────┐ ┌────────────────────┐
│ Chat UI │──SSE→│ FastAPI │──→──▶│ Agent (LLM loop) │
│ (React) │ │ /api/... │ │ ├─ Provider │
└───────────┘ └────────────┘ │ └─ ToolRegistry │
│ │ ├─ Tushare ×5 │
▼ │ └─ <你的插件> │
┌────────────┐ └────────────────────┘
│ SQLite │
│ sessions / │
│ messages / │
│ audit │
└────────────┘
| 痛点 | 现状 | Faro Research |
|---|---|---|
| 国内 LLM agent 没好用的市场数据接入 | 只能去抓 Yahoo / Alpha Vantage | 内建 Tushare HTTP,5 个工具开箱即用 |
| 单 provider 锁定 | 大多绑 OpenAI | DeepSeek / Moonshot / Ark / OpenAI / Anthropic / Ollama 都行 |
| 工具难以扩展 | langchain 学习曲线陡 | 5 行代码加一个 ToolSpec,立刻被 LLM 调到 |
| 没多会话/历史 | 一次性 prompt | SQLite 自动持久化、SSE 流式 trace |
git clone https://github.com/your-org/faro-research.git
cd faro-research
cp .env.example .env
# 在 .env 里至少填 FARO_OPENAI_API_KEY 和 TUSHARE_TOKENdocker compose up --build
# 浏览器打开 http://localhost:5173# 后端
python -m venv .venv && source .venv/bin/activate
pip install -e ".[server]"
uvicorn faro_research.server.app:app --reload --port 8000
# 另开终端:前端
cd web && pnpm install && pnpm dev
# 浏览器: http://localhost:5173pip install -e .
faro-research "贵州茅台最近的 PE_TTM"
faro-research "宁德时代过去 6 个月有无董监高减持"from faro_research import Agent, Message, ToolRegistry, make_provider
from faro_research.tools.builtin.tushare import tushare_tools
reg = ToolRegistry()
reg.register_many(tushare_tools())
agent = Agent(provider=make_provider(), tools=reg)
trace = agent.run([Message(role="user", content="比亚迪 2024 vs 2025 营收")])
print(trace.final_answer)主 agent 默认看到 6 个工具,结构清晰:
| 工具 | 用途 |
|---|---|
get_company_data |
元工具:自然语言 → 自动路由到 4 个 finance 子工具,并行拉齐返回 |
get_stock_quote |
短期 OHLCV |
skill |
调用工作流模板(dcf-cn / research-report / screener) |
memory_search / memory_get / memory_update |
跨会话长期记忆 |
get_company_data 内部包了 5 个 raw Tushare 工具(resolve_ticker /
get_key_ratios / get_three_statements / get_holder_trades),如需要单独使用
传 --legacy-tools 给 CLI 即可。
每个工具自带 formatter:raw API JSON → 紧凑中文 markdown 表(¥1.73 万亿 /
PE_TTM 20.97× / 25Q4),token 比 v0.1 少 5-10×。
需要 Tushare 积分 ≥ 2000(基本面端点门槛)。在 tushare.pro 申请。
from faro_research import Agent, Message, ToolRegistry, ToolSpec, make_provider
from faro_research.tools.builtin.tushare import tushare_tools
def my_portfolio(ticker: str | None = None) -> dict:
"""读取你自家的持仓。返回 dict 即可。"""
return {"ticker": ticker, "weight": 0.18, "as_of": "2026-04-30"}
PORTFOLIO_TOOL = ToolSpec(
name="get_my_portfolio",
description="读取用户当前持仓。可选传 ticker 过滤。",
parameters={
"type": "object",
"properties": {"ticker": {"type": "string"}},
},
fn=my_portfolio,
)
reg = ToolRegistry()
reg.register_many(tushare_tools())
reg.register(PORTFOLIO_TOOL)
agent = Agent(provider=make_provider(), tools=reg)
print(agent.run([Message(role="user", content="我组合里 NVDA 多少")]).final_answer)完整示例见 examples/custom_plugin.py。
| Provider | env | 备注 |
|---|---|---|
| DeepSeek (默认) | FARO_PROVIDER=openai_compat + FARO_OPENAI_BASE_URL=https://api.deepseek.com |
推理模型 OK |
| Moonshot Kimi | 同上,base_url 换成 Moonshot | |
| Volcengine Ark | 同上,base_url 换成 Ark | GLM / Doubao / Kimi 都行 |
| OpenAI 官方 | FARO_OPENAI_BASE_URL=https://api.openai.com/v1 |
|
| Ollama 本地 | FARO_OPENAI_BASE_URL=http://127.0.0.1:11434/v1 |
qwen2.5 / llama3.2 已验证 |
| Anthropic Claude | FARO_PROVIDER=anthropic |
走 Messages API |
- v0.1 — 单租户 / SSE / 2 provider / 5 内建工具 / Docker compose
- v0.2 — 报告级输出质量:formatters / strict output rules / meta-tool / 3 内建 skills (DCF-CN / research-report / screener) / SQLite memory + SOUL/RULES / per-tool cache + timeout + 并行执行
- v0.3 — Embeddings 加持的 memory 语义搜索 / Redis 工具缓存 / 全市场因子筛选
- v0.4 — 多用户登录(OIDC / API key)/ entry_points 插件自动发现
- v0.5 — Markdown / PDF 研报导出 / 多 agent 协作(研究员 / 风控 / 编辑)
详见 CHANGELOG 和发布博客 docs/blog/。
MIT — 见 LICENSE。
- 设计模式借鉴自 virattt/dexter
- 数据源 Tushare
- LLM provider:DeepSeek / Anthropic / OpenAI / Moonshot / Volcengine