连接器架构设计

📎 引用文件

本文引用的文件 - agent/src/trading/service.py - agent/src/tools/trading_connector_tool.py - agent/src/trading/connectors/longbridge/sdk.py - agent/src/trading/connectors/trading212/sdk.py - agent/src/trading/connectors/binance/sdk.py - agent/tests/test_longbridge_runtime.py - frontend/src/lib/api.ts

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与并发
  8. 故障恢复与错误处理
  9. 配置与动态加载
  10. 扩展开发指南
  11. 注册、发现与路由
  12. 结论

简介

本文件面向 Vibe-Trading 的“连接器架构”,聚焦于统一抽象层、认证机制、错误处理策略、连接池管理、生命周期与状态同步、故障恢复、配置文件结构与验证规则、动态加载、性能优化、并发控制与资源管理,以及新券商接入的标准流程。文档以代码级事实为依据,结合类图、时序图和流程图,帮助读者从高层到细节全面理解系统如何把多家券商/数据源抽象为一致的“连接器”能力,并通过服务层进行路由与编排。

项目结构

Vibe-Trading 将“连接器”按券商或协议拆分为独立模块,每个模块提供统一的只读接口(账户、持仓、订单、行情、历史),并在需要时暴露下单/撤单等写操作。服务层负责根据“交易资料(profile)”选择具体实现;工具层对外暴露稳定的 CLI/MCP/REST 入口;前端通过 API 类型定义消费连接器状态。

graph TB subgraph "工具与入口" T["trading_connector_tool.py<br/>CLI/MCP/Agent 工具"] end subgraph "服务层" S["service.py<br/>路由与分发"] end subgraph "连接器实现" L["longbridge/sdk.py"] T212["trading212/sdk.py"] B["binance/sdk.py"] end subgraph "前端" F["frontend/src/lib/api.ts<br/>连接器状态类型"] end T --> S S --> L S --> T212 S --> B F --> S

图表来源 - agent/src/tools/trading_connector_tool.py:1-800 - agent/src/trading/service.py:1-200 - agent/src/trading/connectors/longbridge/sdk.py:1-800 - agent/src/trading/connectors/trading212/sdk.py:1-587 - agent/src/trading/connectors/binance/sdk.py:475-503 - frontend/src/lib/api.ts:1125-1184

章节来源 - agent/src/tools/trading_connector_tool.py:1-800 - agent/src/trading/service.py:1-200

核心组件

章节来源 - agent/src/trading/service.py:1-200 - agent/src/trading/connectors/longbridge/sdk.py:58-171 - agent/src/trading/connectors/trading212/sdk.py:46-131

架构总览

下图展示从工具到服务再到具体连接器的调用链,以及前端对连接器状态的消费。

sequenceDiagram participant U as "用户/Agent" participant Tool as "trading_connector_tool.py" participant Svc as "service.py" participant Mod as "broker_sdk 模块" participant Conn as "具体连接器 SDK" U->>Tool : 调用 trading_check / trading_account / trading_history ... Tool->>Svc : check_connection / get_account / get_history(...) Svc->>Svc : 解析 profile_id, transport alt local_tws Svc->>Conn : IBKR 本地客户端 else broker_sdk Svc->>Mod : import 对应 sdk 模块 Mod->>Mod : build_config(profile.config, overrides) Svc->>Mod : check_status/get_account/get_history(...) Mod->>Conn : 调用 SDK 方法 Conn-->>Mod : 原始响应 Mod-->>Svc : 标准化结果 end Svc-->>Tool : 带 profile 元信息的统一结果 Tool-->>U : JSON 结果

图表来源 - agent/src/tools/trading_connector_tool.py:262-428 - agent/src/trading/service.py:42-200 - agent/src/trading/connectors/longbridge/sdk.py:220-269 - agent/src/trading/connectors/trading212/sdk.py:162-195

详细组件分析

Longbridge 连接器

classDiagram class LongbridgeConfig { +string app_key +string app_secret +string access_token +string profile +string region +float timeout +bool readonly +from_mapping(data) +with_overrides(...) +environment } class Module { +build_config(profile_config, overrides) +check_status(config) +get_account_snapshot(config) +get_positions(config) +get_open_orders(config, include_executions) +get_quote(symbol, config) +get_historical_bars(symbol, period, limit, config) +place_order(config, ...) +cancel_order(config, order_id, symbol) } LongbridgeConfig <.. Module : "被构建/使用"

图表来源 - agent/src/trading/connectors/longbridge/sdk.py:58-171 - agent/src/trading/connectors/longbridge/sdk.py:220-428 - agent/src/trading/connectors/longbridge/sdk.py:449-619

章节来源 - agent/src/trading/connectors/longbridge/sdk.py:58-171 - agent/src/trading/connectors/longbridge/sdk.py:220-428 - agent/src/trading/connectors/longbridge/sdk.py:449-619

Trading 212 连接器

flowchart TD Start(["进入 place_order"]) --> CheckEnv{"environment == 'paper'?"} CheckEnv -- 否 --> RefuseLive["返回错误: 非纸面环境不允许下单"] CheckEnv -- 是 --> RefuseAll["返回错误: 连接器只读/未开放下单"] RefuseLive --> End(["结束"]) RefuseAll --> End

图表来源 - agent/src/trading/connectors/trading212/sdk.py:350-390

章节来源 - agent/src/trading/connectors/trading212/sdk.py:46-131 - agent/src/trading/connectors/trading212/sdk.py:162-195 - agent/src/trading/connectors/trading212/sdk.py:317-336 - agent/src/trading/connectors/trading212/sdk.py:350-390

Binance 连接器(示例:下单前置校验)

flowchart TD A["进入下单"] --> B{"quantity/notional 是否恰好一个提供?"} B -- 否 --> E["返回错误: 必须提供其中一个"] B -- 是 --> C{"type == 'limit' ?"} C -- 是 --> D{"limit_price > 0 ?"} D -- 否 --> F["返回错误: 限价单价格无效"] D -- 是 --> G["_assert_host(cfg)"] C -- 否 --> G G -- 失败 --> H["返回错误: host 不匹配/不安全"] G -- 成功 --> I["继续调用 SDK"]

图表来源 - agent/src/trading/connectors/binance/sdk.py:475-503

章节来源 - agent/src/trading/connectors/binance/sdk.py:475-503

依赖关系分析

服务层通过“transport”和“connector”两个维度决定调用路径: - local_tws:直接调用 IBKR 本地客户端。 - broker_sdk:通过映射表动态导入对应 sdk 模块,并调用其统一接口。 - remote:走远程 MCP/其他通道(不在本节展开)。

graph LR P["profiles<br/>profile_by_id()"] --> S["service.py<br/>路由分发"] S --> |local_tws| IBKR["IBKR 本地客户端"] S --> |broker_sdk| M["动态导入<br/>_SDK_CONNECTOR_MODULES"] M --> L["longbridge.sdk"] M --> T212["trading212.sdk"] M --> B["binance.sdk"]

图表来源 - agent/src/trading/service.py:13-39 - agent/src/trading/service.py:42-65

章节来源 - agent/src/trading/service.py:13-65

性能与并发

[本节为通用指导,不直接分析具体文件]

故障恢复与错误处理

flowchart TD Q["check_status(config)"] --> C{"配置完整?"} C -- 否 --> E1["返回 error_code=credentials_missing/partial"] C -- 是 --> D{"SDK 可用?"} D -- 否 --> E2["返回 error_code=sdk_missing"] D -- 是 --> H["尝试健康调用(如账户快照)"] H -- 失败 --> E3["映射为 network/authentication/broker 错误"] H -- 成功 --> OK["返回 ok + last_checked_at + account 摘要"]

图表来源 - agent/src/trading/connectors/longbridge/sdk.py:220-318 - agent/src/trading/connectors/trading212/sdk.py:162-195 - frontend/src/lib/api.ts:1125-1184

章节来源 - agent/src/trading/connectors/longbridge/sdk.py:220-318 - agent/src/trading/connectors/trading212/sdk.py:162-195 - frontend/src/lib/api.ts:1125-1184

配置与动态加载

章节来源 - agent/src/trading/connectors/longbridge/sdk.py:174-208 - agent/src/trading/connectors/trading212/sdk.py:134-159 - agent/src/trading/service.py:13-39 - agent/cli/main.py:289-327

扩展开发指南

新增券商接入标准流程(以 broker_sdk 为例): 1. 创建模块目录与 sdk.py,定义不可变 Config dataclass,实现 from_mapping/with_overrides/environment。 2. 实现统一接口:build_config、check_status、get_account_snapshot、get_positions、get_open_orders、get_quote、get_historical_bars;如需下单,实现 place_order/cancel_order 并确保结构性安全守卫。 3. 在 service.py 的 _SDK_CONNECTOR_MODULES 中注册 connector key → 模块路径。 4. 编写测试:覆盖配置校验、健康检查、只读能力、错误映射、下单拒绝路径(若适用)。 5. 文档与类型:在前端 api.ts 中补充连接器状态字段(如 capabilities、readonly、connection_state)。

最佳实践 - 始终在入口处进行结构性安全判断(host 隔离、profile 标签、能力白名单)。 - 错误分类清晰,消息脱敏,避免泄露密钥。 - 对不支持的能力明确返回“不支持”,而不是伪造数据。 - 配置变更幂等,保存时设置最小权限。

章节来源 - agent/src/trading/service.py:13-39 - agent/src/trading/connectors/longbridge/sdk.py:58-171 - agent/src/trading/connectors/trading212/sdk.py:46-131 - frontend/src/lib/api.ts:1125-1184

注册、发现与路由

sequenceDiagram participant UI as "前端/CLI" participant API as "服务层" participant REG as "注册表" participant MOD as "连接器模块" UI->>API : GET /live/status?broker=... API->>REG : 查找 connector key REG-->>API : 模块路径 API->>MOD : check_status(build_config(...)) MOD-->>API : 标准化状态 API-->>UI : brokers[].auth/connection_state/capabilities

图表来源 - agent/src/trading/service.py:42-65 - agent/tests/test_longbridge_runtime.py:104-136 - agent/tests/test_longbridge_runtime.py:230-247 - agent/tests/test_longbridge_runtime.py:389-427

章节来源 - agent/src/trading/service.py:42-65 - agent/tests/test_longbridge_runtime.py:104-136 - agent/tests/test_longbridge_runtime.py:230-247 - agent/tests/test_longbridge_runtime.py:389-427

结论

Vibe-Trading 的连接器架构通过“统一接口 + 服务层路由 + 模块化实现”的方式,实现了多券商/协议的解耦接入与一致体验。其关键优势在于: - 强约束的配置与校验,降低误配风险。 - 标准化的健康检查与错误分类,提升可观测性与可运维性。 - 结构性安全守卫(host/profile/能力)保障 live 环境安全。 - 动态加载与注册表机制,使扩展成本低、耦合小。 - 工具/服务/连接器分层清晰,便于测试与维护。

遵循本文档的流程与最佳实践,可以快速、安全地接入新的券商或协议,并保持与现有生态的一致性。