{"repo": "1974410167/ibkr-trade-agent", "files": {"ibkr_show_backend/README.md": {"d6d0e67a5c5f437d32bce372d81f5d033a036edd": {"t": 1785595271.7855215, "n": 7749, "h": "60345591199229dd", "c": "# ibkr_show_backend\n\nFastAPI 查询层,从 Elasticsearch 读取 IBKR ETL 数据并对前端提供 REST API。\n\n## 快速开始\n\n```bash\ncd /path/to/ibkr_show/ibkr_show_backend\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\ncp .env.example .env\n```\n\n## ES 配置\n\n`.env` 至少需要配置:\n\n- `ES_HOST=http://localhost:9200`\n- `CORS_ALLOW_ORIGINS=http://localhost:5173,http://127.0.0.1:5173`\n- `CORS_ALLOW_ORIGIN_REGEX=https?://.*`\n- `ES_USERNAME=`\n- `ES_PASSWORD=`\n- `ES_VERIFY_CERTS=false`\n- `ES_ACCOUNT_INDEX=ibkr_account_daily_snapshot_v1`\n- `ES_POSITION_INDEX=ibkr_position_daily_snapshot_v1`\n- `ES_TRADE_INDEX=ibkr_trade_records_v1`\n- `ES_CASH_FLOW_INDEX=ibkr_cash_flow_records_v1`\n- `ES_PRICE_HISTORY_INDEX=ibkr_symbol_price_history_v1`\n\n## Longbridge 外部数据源配置\n\nLongbridge 只用于外部行情和资讯数据。IBKR Flex 仍是账户、持仓、交易、成本、盈亏、股息和出入金的唯一数据源。\n\n如需启用,在 `ibkr_show_backend/.env` 中配置:\n\n```env\nLONGBRIDGE_ENABLE=true\nLONGBRIDGE_OPENAPI_OAUTH_CLIENT_ID=\nLONGBRIDGE_OPENAPI_OAUTH_FILE=./data/config/longbridge_openapi_oauth.json\nLONGBRIDGE_OPENAPI_OAUTH_SCOPE=\nLONGBRIDGE_MCP_ENABLED=true\nLONGBRIDGE_MCP_ENDPOINT=https://openapi.longbridge.com/mcp\n```\n\n不要把 `.env` 提交到 git。即使 `LONGBRIDGE_ENABLE=false` 或 LongBridge OAuth 未连接,后端也会正常启动,只是 `/api/longbridge/*`、依赖 OpenAPI / SDK 的外部数据功能,以及 MCP 工具调用不可用。\n\nLongBridge 只需要一次 OAuth 授权。OpenAPI OAuth 是唯一授权源,OpenAPI / SDK 和 hosted MCP 复用同一个 OAuth token。MCP 仍只允许公开市场只读工具,不会调用 LongBridge TradeContext,不会下单,不会访问长桥账户、订单、持仓、成交或出入金接口。\n\n第二阶段已验证 OpenAPI OAuth token 与 MCP 双向复用成功,因此第三阶段已统一为 OpenAPI OAuth 单授权。旧版 `LONGBRIDGE_APP_KEY`、`LONGBRIDGE_APP_SECRET`、`LONGBRIDGE_ACCESS_TOKEN` 已废弃,不再作为后端 SDK fallback。\n\n生产环境配置步骤:\n\n1. 在 LongBridge 注册 OAuth client_id。\n2. 配置 `LONGBRIDGE_OPENAPI_OAUTH_CLIENT_ID`。\n3. 重启 backend。\n4. 到管理后台 `/admin/longbridge-mcp` 完成一次 LongBridge OAuth 授权。\n5. 检查 OpenAPI / SDK 和 MCP 健康状态均为可用。\n\n历史的 `data/config/longbridge_mcp_oauth.json` 已废弃,可手动删除;程序不会再读取它。\n\n## LLM 配置管理\n\n后台路径:\n\n- `/admin/llm`\n\n当前支持 OpenAI-compatible 协议,后续交易得失复盘 Agent、个股决策 Agent 都应统一通过后端 `LLMService` 读取 active Provider,不直接读取厂商 API Key 或写死 `base_url`。\n\n可在后台新增多个 Provider,但同一时间只能有一个 active/default Provider。API Key 只保存在后端配置文件中,前端接口只返回 masked key,例如 `sk-****abcd`。\n\n小米 LLM 示例配置:\n\n```text\nBase URL: https://token-plan-cn.xiaomimimo.com/v1\nModel: 由用户在后台填写\nAPI Key: 在后台填写,或通过环境变量 LLM_DEFAULT_API_KEY 提供\n```\n\n阿里百炼 / DashScope OpenAI-compatible 示例配置:\n\n```text\nBase URL: https://dashscope.aliyuncs.com/compatible-mode/v1\nModel: deepseek-v4-pro\nAPI Key: 在后台填写,或通过环境变量 LLM_DEFAULT_API_KEY 提供\n```\n\n环境变量:\n\n```env\nLLM_ENABLE=true\nLLM_DEFAULT_PROVIDER_NAME=\nLLM_DEFAULT_BASE_URL=\nLLM_DEFAULT_API_KEY=\nLLM_DEFAULT_MODEL=\nLLM_CONFIG_FILE=\n```\n\n如果本地 JSON 配置文件没有任何 Provider,但环境变量中存在 `LLM_DEFAULT_BASE_URL`、`LLM_DEFAULT_API_KEY`、`LLM_DEFAULT_MODEL`,后端会构造一个临时默认 Provider 用于 health/test/chat。环境变量中的 API Key 不会自动写入配置文件,除非你在后台主动保存。\n\n默认配置文件路径是 `ibkr_show_backend/data/config/llm_providers.json`,也可以用 `LLM_CONFIG_FILE` 覆盖。`data/config/*.json` 已加入 git 忽略规则。不要提交真实 API Key。\n\n## 每日持仓复盘邮件\n\n后台路径:\n\n- `/admin/email`\n\n开启后,worker 触发的每日自动复盘在生成成功后会通过 SMTP 发送摘要邮件。手动点击生成或重新生成复盘默认不发送邮件,避免重复通知。后台支持保存 SMTP 配置和发送测试邮件,密码/授权码只保存在后端配置文件中,前端只显示 masked 状态。\n\n环境变量:\n\n```env\nDAILY_REVIEW_EMAIL_ENABLE=false\nSMTP_HOST=\nSMTP_PORT=465\nSMTP_USERNAME=\nSMTP_PASSWORD=\nSMTP_USE_SSL=true\nSMTP_USE_STARTTLS=false\nEMAIL_FROM=\nDAILY_REVIEW_EMAIL_TO=\nDAILY_REVIEW_EMAIL_SUBJECT_PREFIX=IBKR每日持仓复盘\nPUBLIC_SITE_BASE_URL=\nEMAIL_CONFIG_FILE=\n```\n\n默认配置文件路径是 `ibkr_show_backend/data/config/email.json`,也可以用 `EMAIL_CONFIG_FILE` 覆盖。后台保存的配置优先于环境变量。邮件密码建议使用邮箱授权码,不要使用邮箱登录密码;网易、QQ、Gmail 等邮箱通常需要先开启 SMTP 服务。\n\n## 交易得失复盘 Agent\n\n前端页面:\n\n- `/agent/trade-review`\n\n数据来源:\n\n- IBKR Flex:交易事实、账户、持仓、成本、盈亏\n- Longbridge:历史行情、默认基准 ETF `SPY.US`、`QQQ.US`、`SMH.US`,以及资讯\n- LLMService:基于 Evidence Pack 进行复盘分析和打分\n\n复盘目标:\n\n- 以平均年化 30% 为目标\n- 投资风格为 aggressive growth\n- 用 100 分制评估交易是否帮助长期最大化账户复合收益\n- 支持标的级复盘和单笔交易复盘\n\n评分维度:\n\n- 收益结果 20 分\n- 相对收益 15 分\n- 买点质量 15 分\n- 卖点质量 15 分\n- 仓位质量 15 分\n- 持仓周期 5 分\n- 风险控制 10 分\n- 决策归因 5 分\n\n后端接口:\n\n- `GET /api/agent/trade-review/health`\n- `POST /api/agent/trade-review/symbol/{symbol}/generate`\n- `POST /api/agent/trade-review/trade/{trade_id}/generate`\n- `GET /api/agent/trade-review/symbol/{symbol}`\n- `GET /api/agent/trade-review/recent`\n- `GET /api/agent/trade-review/{review_id}`\n- `GET /api/agent/trade-review/mistakes/summary`\n\n复盘结果保存到 Elasticsearch 索引:\n\n- `ibkr_trade_reviews_v1`\n\n安全说明:\n\n- 不会自动交易\n- 不会调用 IBKR 下单接口\n- 不会调用 Longbridge TradeContext\n- 不会从长桥获取账户、持仓、订单、成交\n- 不会暴露 LLM API Key 或 Longbridge Key\n- Evidence Pack 原文只在后端保存,前端页面只展示复盘结论、分数、标签和建议\n\n## 交易决策 Agent\n\n前端页面:\n\n- `/agent/trade-decision`\n\n支持两种模式:\n\n- 持仓标的决策:展示 IBKR 当前持仓,针对单个持仓生成加仓、持有、减仓、清仓或等待建议\n- 任意股票建仓建议:输入任意股票代码,结合账户净值、现金比例、已有持仓集中度和公开市场数据生成建仓建议\n\n数据来源:\n\n- IBKR Flex:账户、持仓、交易、成本、盈亏、现金、保证金、股息、出入金等个人账户数据\n- Longbridge:公开行情、历史 K 线、基准 ETF、新闻、公告、财报、估值等公开数据\n- Trade Review Agent:历史复盘结果和错误标签\n- LLMService:基于 Evidence Pack 输出结构化决策\n\n评分维度:\n\n- 公司质量 20 分\n- 估值 15 分\n- 趋势 15 分\n- 账户适配 20 分\n- 风险收益 15 分\n- 复盘约束 10 分\n- 事件催化 5 分\n\n后端接口:\n\n- `GET /api/agent/trade-decision/health`\n- `GET /api/agent/trade-decision/holdings`\n- `POST /api/agent/trade-decision/holding/{symbol}/analyze`\n- `POST /api/agent/trade-decision/entry/analyze`\n- `GET /api/agent/trade-decision/recent`\n- `GET /api/agent/trade-decision/symbol/{symbol}`\n- `GET /api/agent/trade-decision/{decision_id}`\n\n交易决策结果保存到 Elasticsearch 索引:\n\n- `ibkr_trade_decisions_v1`\n\n安全说明:\n\n- 不会自动交易\n- 不会生成订单草稿\n- 不会调用 IBKR 下单接口\n- 不会调用 Longbridge TradeContext\n- 不会从长桥获取账户、持仓、订单、成交或资金数据\n- 不会暴露 LLM API Key 或 Longbridge Key\n- Evidence Pack 原文只在后端保存,前端页面只展示决策结论、分数、仓位建议和风险提示\n\n## 启动 API\n\n```bash\ncd /path/to/ibkr_show/ibkr_show_backend\n./.venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000\n```\n\n## 接口说明\n\n- `GET /health`\n- `GET /api/account/overview`\n- `GET /api/account/latest-report-date`\n- `GET /api/charts/equity-curve`\n- `GET /api/positions`\n- `GET /api/positions/detail`\n- `GET /api/trades`\n- `GET /api/trades/summary`\n- `GET /api/cash-flows`\n- `GET /api/cash-flows/summary`\n- `GET /api/longbridge/health`\n- `GET /api/longbridge/candles`\n- `GET /api/longbridge/benchmark-candles`\n- `GET /api/longbridge/news`\n- `GET /api/admin/llm/health`\n- `GET /api/admin/llm/providers`\n- `POST /api/admin/llm/providers`\n- `PUT /api/admin/llm/providers/{provider_id}`\n- `DELETE /api/admin/llm/providers/{provider_id}`\n- `POST /api/admin/llm/providers/{provider_id}/activate`\n- `POST /api/admin/llm/providers/{provider_id}/test`\n- `POST /api/admin/llm/chat-test`\n- `GET /api/admin/email/settings`\n- `PUT /api/admin/email/settings`\n- `POST /api/admin/email/test`\n- `GET /api/agent/trade-review/health`\n- `POST /api/agent/trade-review/symbol/{symbol}/generate`\n- `POST /api/agent/trade-review/trade/{trade_id}/generate`\n- `GET /api/agent/trade-review/recent`\n- `GET /api/agent/trade-review/mistakes/summary`\n\n## 接口示例\n\n```bash\ncurl http://localhost:8000/health\ncurl http://localhost:8000/api/account/overview\ncurl 'http://localhost:8000/api/charts/equity-curve?start_date=2026-01-01&end_date=2026-04-17'\ncurl 'http://localhost:8000/api/positions?sort_by=position_value&sort_order=desc&page=1&page_size=20'\ncurl 'http://localhost:8000/api/positions/detail?symbol=AAPL&asset_class=STK'\ncurl 'http://localhost:8000/api/trades?sort_by=date_time&sort_order=desc&page=1&page_size=20'\ncurl 'http://localhost:8000/api/trades/summary?start_date=2026-01-01&end_date=2026-04-17'\ncurl 'http://localhost:8000/api/cash-flows?page=1&page_size=20'\ncurl 'http://localhost:8000/api/cash-flows/summary'\ncurl http://localhost:8000/api/longbridge/health\ncurl 'http://localhost:8000/api/longbridge/candles?symbol=AAPL&start=2025-01-01&end=2025-01-31'\ncurl 'http://localhost:8000/api/longbridge/benchmark-candles?symbols=SPY,QQQ,SMH&start=2025-01-01&end=2025-01-31'\ncurl 'http://localhost:8000/api/longbridge/news?symbol=AAPL&limit=10'\n```\n\n如果 ES 不可达或索引不存在,接口会返回清晰错误,不会把 ES 原始响应直接透传给前端。\n"}, "a7b28e5d3ec3fbf07ea49c6b865ee785b3c9150b": {"t": 1785771696.6709483, "n": 7749, "h": "60345591199229dd", "c": "# ibkr_show_backend\n\nFastAPI 查询层,从 Elasticsearch 读取 IBKR ETL 数据并对前端提供 REST API。\n\n## 快速开始\n\n```bash\ncd /path/to/ibkr_show/ibkr_show_backend\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\ncp .env.example .env\n```\n\n## ES 配置\n\n`.env` 至少需要配置:\n\n- `ES_HOST=http://localhost:9200`\n- `CORS_ALLOW_ORIGINS=http://localhost:5173,http://127.0.0.1:5173`\n- `CORS_ALLOW_ORIGIN_REGEX=https?://.*`\n- `ES_USERNAME=`\n- `ES_PASSWORD=`\n- `ES_VERIFY_CERTS=false`\n- `ES_ACCOUNT_INDEX=ibkr_account_daily_snapshot_v1`\n- `ES_POSITION_INDEX=ibkr_position_daily_snapshot_v1`\n- `ES_TRADE_INDEX=ibkr_trade_records_v1`\n- `ES_CASH_FLOW_INDEX=ibkr_cash_flow_records_v1`\n- `ES_PRICE_HISTORY_INDEX=ibkr_symbol_price_history_v1`\n\n## Longbridge 外部数据源配置\n\nLongbridge 只用于外部行情和资讯数据。IBKR Flex 仍是账户、持仓、交易、成本、盈亏、股息和出入金的唯一数据源。\n\n如需启用,在 `ibkr_show_backend/.env` 中配置:\n\n```env\nLONGBRIDGE_ENABLE=true\nLONGBRIDGE_OPENAPI_OAUTH_CLIENT_ID=\nLONGBRIDGE_OPENAPI_OAUTH_FILE=./data/config/longbridge_openapi_oauth.json\nLONGBRIDGE_OPENAPI_OAUTH_SCOPE=\nLONGBRIDGE_MCP_ENABLED=true\nLONGBRIDGE_MCP_ENDPOINT=https://openapi.longbridge.com/mcp\n```\n\n不要把 `.env` 提交到 git。即使 `LONGBRIDGE_ENABLE=false` 或 LongBridge OAuth 未连接,后端也会正常启动,只是 `/api/longbridge/*`、依赖 OpenAPI / SDK 的外部数据功能,以及 MCP 工具调用不可用。\n\nLongBridge 只需要一次 OAuth 授权。OpenAPI OAuth 是唯一授权源,OpenAPI / SDK 和 hosted MCP 复用同一个 OAuth token。MCP 仍只允许公开市场只读工具,不会调用 LongBridge TradeContext,不会下单,不会访问长桥账户、订单、持仓、成交或出入金接口。\n\n第二阶段已验证 OpenAPI OAuth token 与 MCP 双向复用成功,因此第三阶段已统一为 OpenAPI OAuth 单授权。旧版 `LONGBRIDGE_APP_KEY`、`LONGBRIDGE_APP_SECRET`、`LONGBRIDGE_ACCESS_TOKEN` 已废弃,不再作为后端 SDK fallback。\n\n生产环境配置步骤:\n\n1. 在 LongBridge 注册 OAuth client_id。\n2. 配置 `LONGBRIDGE_OPENAPI_OAUTH_CLIENT_ID`。\n3. 重启 backend。\n4. 到管理后台 `/admin/longbridge-mcp` 完成一次 LongBridge OAuth 授权。\n5. 检查 OpenAPI / SDK 和 MCP 健康状态均为可用。\n\n历史的 `data/config/longbridge_mcp_oauth.json` 已废弃,可手动删除;程序不会再读取它。\n\n## LLM 配置管理\n\n后台路径:\n\n- `/admin/llm`\n\n当前支持 OpenAI-compatible 协议,后续交易得失复盘 Agent、个股决策 Agent 都应统一通过后端 `LLMService` 读取 active Provider,不直接读取厂商 API Key 或写死 `base_url`。\n\n可在后台新增多个 Provider,但同一时间只能有一个 active/default Provider。API Key 只保存在后端配置文件中,前端接口只返回 masked key,例如 `sk-****abcd`。\n\n小米 LLM 示例配置:\n\n```text\nBase URL: https://token-plan-cn.xiaomimimo.com/v1\nModel: 由用户在后台填写\nAPI Key: 在后台填写,或通过环境变量 LLM_DEFAULT_API_KEY 提供\n```\n\n阿里百炼 / DashScope OpenAI-compatible 示例配置:\n\n```text\nBase URL: https://dashscope.aliyuncs.com/compatible-mode/v1\nModel: deepseek-v4-pro\nAPI Key: 在后台填写,或通过环境变量 LLM_DEFAULT_API_KEY 提供\n```\n\n环境变量:\n\n```env\nLLM_ENABLE=true\nLLM_DEFAULT_PROVIDER_NAME=\nLLM_DEFAULT_BASE_URL=\nLLM_DEFAULT_API_KEY=\nLLM_DEFAULT_MODEL=\nLLM_CONFIG_FILE=\n```\n\n如果本地 JSON 配置文件没有任何 Provider,但环境变量中存在 `LLM_DEFAULT_BASE_URL`、`LLM_DEFAULT_API_KEY`、`LLM_DEFAULT_MODEL`,后端会构造一个临时默认 Provider 用于 health/test/chat。环境变量中的 API Key 不会自动写入配置文件,除非你在后台主动保存。\n\n默认配置文件路径是 `ibkr_show_backend/data/config/llm_providers.json`,也可以用 `LLM_CONFIG_FILE` 覆盖。`data/config/*.json` 已加入 git 忽略规则。不要提交真实 API Key。\n\n## 每日持仓复盘邮件\n\n后台路径:\n\n- `/admin/email`\n\n开启后,worker 触发的每日自动复盘在生成成功后会通过 SMTP 发送摘要邮件。手动点击生成或重新生成复盘默认不发送邮件,避免重复通知。后台支持保存 SMTP 配置和发送测试邮件,密码/授权码只保存在后端配置文件中,前端只显示 masked 状态。\n\n环境变量:\n\n```env\nDAILY_REVIEW_EMAIL_ENABLE=false\nSMTP_HOST=\nSMTP_PORT=465\nSMTP_USERNAME=\nSMTP_PASSWORD=\nSMTP_USE_SSL=true\nSMTP_USE_STARTTLS=false\nEMAIL_FROM=\nDAILY_REVIEW_EMAIL_TO=\nDAILY_REVIEW_EMAIL_SUBJECT_PREFIX=IBKR每日持仓复盘\nPUBLIC_SITE_BASE_URL=\nEMAIL_CONFIG_FILE=\n```\n\n默认配置文件路径是 `ibkr_show_backend/data/config/email.json`,也可以用 `EMAIL_CONFIG_FILE` 覆盖。后台保存的配置优先于环境变量。邮件密码建议使用邮箱授权码,不要使用邮箱登录密码;网易、QQ、Gmail 等邮箱通常需要先开启 SMTP 服务。\n\n## 交易得失复盘 Agent\n\n前端页面:\n\n- `/agent/trade-review`\n\n数据来源:\n\n- IBKR Flex:交易事实、账户、持仓、成本、盈亏\n- Longbridge:历史行情、默认基准 ETF `SPY.US`、`QQQ.US`、`SMH.US`,以及资讯\n- LLMService:基于 Evidence Pack 进行复盘分析和打分\n\n复盘目标:\n\n- 以平均年化 30% 为目标\n- 投资风格为 aggressive growth\n- 用 100 分制评估交易是否帮助长期最大化账户复合收益\n- 支持标的级复盘和单笔交易复盘\n\n评分维度:\n\n- 收益结果 20 分\n- 相对收益 15 分\n- 买点质量 15 分\n- 卖点质量 15 分\n- 仓位质量 15 分\n- 持仓周期 5 分\n- 风险控制 10 分\n- 决策归因 5 分\n\n后端接口:\n\n- `GET /api/agent/trade-review/health`\n- `POST /api/agent/trade-review/symbol/{symbol}/generate`\n- `POST /api/agent/trade-review/trade/{trade_id}/generate`\n- `GET /api/agent/trade-review/symbol/{symbol}`\n- `GET /api/agent/trade-review/recent`\n- `GET /api/agent/trade-review/{review_id}`\n- `GET /api/agent/trade-review/mistakes/summary`\n\n复盘结果保存到 Elasticsearch 索引:\n\n- `ibkr_trade_reviews_v1`\n\n安全说明:\n\n- 不会自动交易\n- 不会调用 IBKR 下单接口\n- 不会调用 Longbridge TradeContext\n- 不会从长桥获取账户、持仓、订单、成交\n- 不会暴露 LLM API Key 或 Longbridge Key\n- Evidence Pack 原文只在后端保存,前端页面只展示复盘结论、分数、标签和建议\n\n## 交易决策 Agent\n\n前端页面:\n\n- `/agent/trade-decision`\n\n支持两种模式:\n\n- 持仓标的决策:展示 IBKR 当前持仓,针对单个持仓生成加仓、持有、减仓、清仓或等待建议\n- 任意股票建仓建议:输入任意股票代码,结合账户净值、现金比例、已有持仓集中度和公开市场数据生成建仓建议\n\n数据来源:\n\n- IBKR Flex:账户、持仓、交易、成本、盈亏、现金、保证金、股息、出入金等个人账户数据\n- Longbridge:公开行情、历史 K 线、基准 ETF、新闻、公告、财报、估值等公开数据\n- Trade Review Agent:历史复盘结果和错误标签\n- LLMService:基于 Evidence Pack 输出结构化决策\n\n评分维度:\n\n- 公司质量 20 分\n- 估值 15 分\n- 趋势 15 分\n- 账户适配 20 分\n- 风险收益 15 分\n- 复盘约束 10 分\n- 事件催化 5 分\n\n后端接口:\n\n- `GET /api/agent/trade-decision/health`\n- `GET /api/agent/trade-decision/holdings`\n- `POST /api/agent/trade-decision/holding/{symbol}/analyze`\n- `POST /api/agent/trade-decision/entry/analyze`\n- `GET /api/agent/trade-decision/recent`\n- `GET /api/agent/trade-decision/symbol/{symbol}`\n- `GET /api/agent/trade-decision/{decision_id}`\n\n交易决策结果保存到 Elasticsearch 索引:\n\n- `ibkr_trade_decisions_v1`\n\n安全说明:\n\n- 不会自动交易\n- 不会生成订单草稿\n- 不会调用 IBKR 下单接口\n- 不会调用 Longbridge TradeContext\n- 不会从长桥获取账户、持仓、订单、成交或资金数据\n- 不会暴露 LLM API Key 或 Longbridge Key\n- Evidence Pack 原文只在后端保存,前端页面只展示决策结论、分数、仓位建议和风险提示\n\n## 启动 API\n\n```bash\ncd /path/to/ibkr_show/ibkr_show_backend\n./.venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000\n```\n\n## 接口说明\n\n- `GET /health`\n- `GET /api/account/overview`\n- `GET /api/account/latest-report-date`\n- `GET /api/charts/equity-curve`\n- `GET /api/positions`\n- `GET /api/positions/detail`\n- `GET /api/trades`\n- `GET /api/trades/summary`\n- `GET /api/cash-flows`\n- `GET /api/cash-flows/summary`\n- `GET /api/longbridge/health`\n- `GET /api/longbridge/candles`\n- `GET /api/longbridge/benchmark-candles`\n- `GET /api/longbridge/news`\n- `GET /api/admin/llm/health`\n- `GET /api/admin/llm/providers`\n- `POST /api/admin/llm/providers`\n- `PUT /api/admin/llm/providers/{provider_id}`\n- `DELETE /api/admin/llm/providers/{provider_id}`\n- `POST /api/admin/llm/providers/{provider_id}/activate`\n- `POST /api/admin/llm/providers/{provider_id}/test`\n- `POST /api/admin/llm/chat-test`\n- `GET /api/admin/email/settings`\n- `PUT /api/admin/email/settings`\n- `POST /api/admin/email/test`\n- `GET /api/agent/trade-review/health`\n- `POST /api/agent/trade-review/symbol/{symbol}/generate`\n- `POST /api/agent/trade-review/trade/{trade_id}/generate`\n- `GET /api/agent/trade-review/recent`\n- `GET /api/agent/trade-review/mistakes/summary`\n\n## 接口示例\n\n```bash\ncurl http://localhost:8000/health\ncurl http://localhost:8000/api/account/overview\ncurl 'http://localhost:8000/api/charts/equity-curve?start_date=2026-01-01&end_date=2026-04-17'\ncurl 'http://localhost:8000/api/positions?sort_by=position_value&sort_order=desc&page=1&page_size=20'\ncurl 'http://localhost:8000/api/positions/detail?symbol=AAPL&asset_class=STK'\ncurl 'http://localhost:8000/api/trades?sort_by=date_time&sort_order=desc&page=1&page_size=20'\ncurl 'http://localhost:8000/api/trades/summary?start_date=2026-01-01&end_date=2026-04-17'\ncurl 'http://localhost:8000/api/cash-flows?page=1&page_size=20'\ncurl 'http://localhost:8000/api/cash-flows/summary'\ncurl http://localhost:8000/api/longbridge/health\ncurl 'http://localhost:8000/api/longbridge/candles?symbol=AAPL&start=2025-01-01&end=2025-01-31'\ncurl 'http://localhost:8000/api/longbridge/benchmark-candles?symbols=SPY,QQQ,SMH&start=2025-01-01&end=2025-01-31'\ncurl 'http://localhost:8000/api/longbridge/news?symbol=AAPL&limit=10'\n```\n\n如果 ES 不可达或索引不存在,接口会返回清晰错误,不会把 ES 原始响应直接透传给前端。\n"}, "223bc91af986924406bc49c420173a8861d715dc": {"t": 1785771698.1787362, "n": 1859, "h": "d64c8d587f804a12", "c": "# ibkr_show_backend\n\nFastAPI 查询层,从 Elasticsearch 读取 IBKR ETL 数据并对前端提供 REST API。\n\n## 快速开始\n\n```bash\ncd /path/to/ibkr_show/ibkr_show_backend\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\ncp .env.example .env\n```\n\n## ES 配置\n\n`.env` 至少需要配置:\n\n- `ES_HOST=http://localhost:9200`\n- `CORS_ALLOW_ORIGINS=http://localhost:5173,http://127.0.0.1:5173`\n- `CORS_ALLOW_ORIGIN_REGEX=https?://.*`\n- `ES_USERNAME=`\n- `ES_PASSWORD=`\n- `ES_VERIFY_CERTS=false`\n- `ES_ACCOUNT_INDEX=ibkr_account_daily_snapshot_v1`\n- `ES_POSITION_INDEX=ibkr_position_daily_snapshot_v1`\n- `ES_TRADE_INDEX=ibkr_trade_records_v1`\n- `ES_CASH_FLOW_INDEX=ibkr_cash_flow_records_v1`\n- `ES_PRICE_HISTORY_INDEX=ibkr_symbol_price_history_v1`\n\n## 启动 API\n\n```bash\ncd /path/to/ibkr_show/ibkr_show_backend\n./.venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000\n```\n\n## 接口说明\n\n- `GET /health`\n- `GET /api/account/overview`\n- `GET /api/account/latest-report-date`\n- `GET /api/charts/equity-curve`\n- `GET /api/positions`\n- `GET /api/positions/detail`\n- `GET /api/trades`\n- `GET /api/trades/summary`\n- `GET /api/cash-flows`\n- `GET /api/cash-flows/summary`\n\n## 接口示例\n\n```bash\ncurl http://localhost:8000/health\ncurl http://localhost:8000/api/account/overview\ncurl 'http://localhost:8000/api/charts/equity-curve?start_date=2026-01-01&end_date=2026-04-17'\ncurl 'http://localhost:8000/api/positions?sort_by=position_value&sort_order=desc&page=1&page_size=20'\ncurl 'http://localhost:8000/api/positions/detail?symbol=AAPL&asset_class=STK'\ncurl 'http://localhost:8000/api/trades?sort_by=date_time&sort_order=desc&page=1&page_size=20'\ncurl 'http://localhost:8000/api/trades/summary?start_date=2026-01-01&end_date=2026-04-17'\ncurl 'http://localhost:8000/api/cash-flows?page=1&page_size=20'\ncurl 'http://localhost:8000/api/cash-flows/summary'\n```\n\n如果 ES 不可达或索引不存在,接口会返回清晰错误,不会把 ES 原始响应直接透传给前端。\n"}, "19fb4483e5ba19ad1f1e421af9ee48cd1acbb136": {"t": 1785771699.5343714, "n": 1973, "h": "7789244e17ba49b5", "c": "# ibkr_show_backend\n\nFastAPI 查询层,从 Elasticsearch 读取 IBKR ETL 数据并对前端提供 REST API。\n\n## 快速开始\n\n```bash\ncd /path/to/ibkr_show/ibkr_show_backend\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\ncp .env.example .env\n```\n\n## ES 配置\n\n`.env` 至少需要配置:\n\n- `ES_HOST=http://localhost:9200`\n- `CORS_ALLOW_ORIGINS=http://localhost:5173,http://127.0.0.1:5173`\n- `CORS_ALLOW_ORIGIN_REGEX=https?://.*`\n- `ES_USERNAME=`\n- `ES_PASSWORD=`\n- `ES_VERIFY_CERTS=false`\n- `ES_ACCOUNT_INDEX=ibkr_account_daily_snapshot_v1`\n- `ES_POSITION_INDEX=ibkr_position_daily_snapshot_v1`\n- `ES_TRADE_INDEX=ibkr_trade_records_v1`\n- `ES_CASH_FLOW_INDEX=ibkr_cash_flow_records_v1`\n- `ES_PRICE_HISTORY_INDEX=ibkr_symbol_price_history_v1`\n\n如果你要公开部署或打开交易 / 出入金等登录保护接口,也要显式设置:\n\n- `AUTH_USERNAME=你的登录名`\n- `AUTH_PASSWORD=强密码`\n- `AUTH_SESSION_SECRET=长随机字符串`\n\n## 启动 API\n\n```bash\ncd /path/to/ibkr_show/ibkr_show_backend\n./.venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000\n```\n\n## 接口说明\n\n- `GET /health`\n- `GET /api/account/overview`\n- `GET /api/account/latest-report-date`\n- `GET /api/charts/equity-curve`\n- `GET /api/positions`\n- `GET /api/positions/detail`\n- `GET /api/trades`\n- `GET /api/trades/summary`\n- `GET /api/cash-flows`\n- `GET /api/cash-flows/summary`\n\n## 接口示例\n\n```bash\ncurl http://localhost:8000/health\ncurl http://localhost:8000/api/account/overview\ncurl 'http://localhost:8000/api/charts/equity-curve?start_date=2026-01-01&end_date=2026-04-17'\ncurl 'http://localhost:8000/api/positions?sort_by=position_value&sort_order=desc&page=1&page_size=20'\ncurl 'http://localhost:8000/api/positions/detail?symbol=AAPL&asset_class=STK'\ncurl 'http://localhost:8000/api/trades?sort_by=date_time&sort_order=desc&page=1&page_size=20'\ncurl 'http://localhost:8000/api/trades/summary?start_date=2026-01-01&end_date=2026-04-17'\ncurl 'http://localhost:8000/api/cash-flows?page=1&page_size=20'\ncurl 'http://localhost:8000/api/cash-flows/summary'\n```\n\n如果 ES 不可达或索引不存在,接口会返回清晰错误,不会把 ES 原始响应直接透传给前端。\n"}}}}