Doramagic 项目包 · 项目说明书
OpenBB 项目
面向分析师、量化研究员和 AI Agent 的金融数据平台
Open Data Platform Overview
Open Data Platform(ODP,开放数据平台)是 OpenBB 项目的核心组成部分,致力于通过开源基础设施让投资研究触手可及。该平台为开发者提供了一种统一的方式,用于从多个数据提供商访问原始金融数据,并配套提供开箱即用的 REST API,便于任何编程语言在其之上构建应用。资料来源:[openbbplatform/README.md:1-15]()
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
Open Data Platform 概览
概述与定位
Open Data Platform(ODP,开放数据平台)是 OpenBB 项目的核心组成部分,致力于通过开源基础设施让投资研究触手可及。该平台为开发者提供了一种统一的方式,用于从多个数据提供商访问原始金融数据,并配套提供开箱即用的 REST API,便于任何编程语言在其之上构建应用。资料来源:openbb_platform/README.md:1-15
平台由三个主要发布线构成:OpenBB Platform(Python 包)、OpenBB Platform CLI(命令行界面)以及 ODP Desktop(桌面应用)。其中 ODP Desktop v1.0.2 是当前最新稳定版,新增了日志窗口的"清空日志"按钮,并修复了 cargo.toml 中 OpenSSL 的依赖问题。资料来源:release: ODP Desktop v1.0.2
系统架构
ODP 采用模块化分层设计,核心(core)层定义标准化数据模型与查询接口,扩展(extensions)层实现具体功能与数据源适配,而 CLI 层则负责用户交互。资料来源:openbb_platform/core/README.md:1-40
graph TB
A[CLI / REST API / MCP Server] --> B[OpenBB Core 核心]
B --> C[Router 路由层]
C --> D[Provider Extensions 数据提供商]
C --> E[Tool Extensions 工具扩展]
D --> F[Benzinga / FMP / IMF / Congress.gov]
E --> G[Equity / Technical / Charting]
B --> H[User Settings & Credentials]
H --> I[user_settings.json]核心层提供 Data 与 QueryParams 标准化 Pydantic 模型,动态字段支持以及 API 路由机制,使开发者可灵活处理不同数据结构。资料来源:openbb_platform/core/README.md:23-31
核心特性
标准化数据模型
Data 类是基于 Pydantic 的灵活动态模型,能够处理各种数据结构;QueryParams 类则规范化不同提供商的查询参数。commands.py 中的 build_new_annotation_map 与 build_new_signature 函数负责将命令签名转换为 FastAPI 兼容的注解映射与新签名。资料来源:openbb_platform/core/openbb_core/api/router/commands.py:38-88
凭据与用户配置
平台凭据可通过 user_settings.json、环境变量或在会话中动态设置。例如 Congress.gov 提供商要求配置 congress_gov_api_key,可使用上述任一方式注入。资料来源:openbb_platform/providers/congress_gov/README.md:42-62
扩展化数据提供商
数据源以独立扩展包形式分发,例如 openbb-congress-gov 提供美国国会立法数据访问,openbb-imf 则提供国际货币基金组织的结构化元数据与时间序列数据,每个提供商都遵循统一的标准化模型。资料来源:openbb_platform/providers/imf/README.md:1-30
扩展生态
工具类扩展
- Equity 扩展:提供股票市场数据工具,包括
price(历史价格)、fundamental(基本面分析)、options(期权)、discovery(股票发现)等子模块。资料来源:openbb_platform/extensions/equity/README.md:1-22 - Technical 扩展:提供各种技术指标与震荡分析工具,并可与
openbb-charting协同使用。资料来源:openbb_platform/extensions/technical/README.md:1-8
MCP 服务端扩展
openbb-mcp-server 扩展将平台能力暴露为 MCP(Model Context Protocol)工具,AI 代理可通过该协议访问金融数据。开发者可在 FastAPI 路由中通过 openapi_extra 字典定义提示(prompts)与 MCP 配置。资料来源:openbb_platform/extensions/mcp_server/README.md:1-50
社区讨论中已出现关于为 MCP 工具调用增加签名审计凭证(Ed25519 签名)以满足合规需求的特性请求 #7455,以及为代理工具包增加市场状态验证层的提案 #7458。
平台 API 启动器
openbb-platform-api 包负责启动和配置 OpenBB 平台环境或 FastAPI 实例,可作为 OpenBB Workspace 自定义后端使用。通过 openbb-api 命令即可在 http://127.0.0.1:6900 启动服务。资料来源:openbb_platform/extensions/platform_api/README.md:1-30
部署与使用
通过 PyPI 安装核心包即可获得主要功能:
pip install openbb
该命令将安装核心、路由模块以及多个默认数据提供商。CLI 用户则可执行 pip install openbb-cli 后通过 openbb 命令进入交互界面,并支持使用 OpenBB Routine Scripts 实现自动化数据采集。资料来源:cli/README.md:13-25
桌面用户可下载 ODP Desktop 应用,其内置应用自动更新机制(通过 latest.json 文件),并随附环境管理界面与日志查看窗口。资料来源:release: ODP Desktop (Latest Stable)
版本演进
平台近期主要版本包括:v4.5.0 引入 Python 3.13 支持(同时为最后一个支持 Python 3.9 的版本),v4.6.0 移除了部分 Python 版本支持并完成了 openbb-fmp 提供商的全面重构,v4.7.0 进一步增强了功能。资料来源:releases: OpenBB Platform v4.5.0 / v4.6.0 / v4.7.0
See Also
- OpenBB Platform Core
- MCP Server Extension
- Equity Extension
- Platform API Launcher
来源:https://github.com/OpenBB-finance/OpenBB / 项目说明书
System Architecture & Repository Layout
本 Wiki 页面介绍 OpenBB 项目的整体系统架构与仓库布局,重点说明两个顶层目录 openbbplatform/ 与 cli/ 的职责划分、核心包 openbb-core 的内部组织,以及扩展(extensions)和数据提供器(providers)如何被装配到运行时中。
继续阅读本节完整说明和来源证据。
系统架构与仓库布局
本 Wiki 页面介绍 OpenBB 项目的整体系统架构与仓库布局,重点说明两个顶层目录 openbb_platform/ 与 cli/ 的职责划分、核心包 openbb-core 的内部组织,以及扩展(extensions)和数据提供器(providers)如何被装配到运行时中。
1. 顶层仓库结构
仓库由两个并列的顶层目录构成。openbb_platform/ 是 Python 平台包、核心库、扩展与数据提供器的存放位置,主要服务 Python 用户、Workspace、桌面端以及第三方应用 资料来源:[openbb_platform/README.md:10-18]。cli/ 则是交互式命令行前端,直接面向在终端中运行的最终用户 资料来源:[cli/README.md:8-14]。CLI 在设计上"包裹"了 Platform,是其上的表现层。
2. openbb-core:核心运行时
openbb_platform/core/openbb_core 是整个平台的运行时核心,承载命令路由、用户/系统服务、Provider 注册等关键能力。commands.py 的模块文档明确写道"Commands: generates the command map.",并通过 build_new_annotation_map 与 build_new_signature 把任意 Python 函数签名转换为 FastAPI 路由可以消费的 Pydantic / Annotated 注解 资料来源:[openbb_platform/core/openbb_core/api/router/commands.py:1-19]。核心子模块主要包括:
app/:应用对象、命令执行器CommandRunner、用户/系统服务;api/router/:将注册的Router转换为 FastAPI 路由;app/model/abstract/:抽象基础数据模型(如OpenBBError) 资料来源:[openbb_platform/core/openbb_core/app/model/abstract/__init__.py:1-2];env.py:环境变量与运行时配置。
3. 扩展与数据提供器
平台通过两类可插拔模块扩展能力:
- 数据提供器(providers):每个子目录(如
congress_gov、famafrench、imf)实现一个独立的数据源。congress_gov/README.md展示了提供器如何暴露端点(obb.uscongress.bills、bill_info、bill_text等),并要求用户提供congress_gov_api_key凭据 资料来源:[openbb_platform/providers/congress_gov/README.md:35-58]。IMF 提供器则通过 SDMX 风格的数据流与维度进行映射,把代码转换为人类可读标签 资料来源:[openbb_platform/providers/imf/README.md:1-12]。 - 功能扩展(extensions):例如
technical提供技术分析指标 资料来源:[openbb_platform/extensions/technical/README.md:1-6],platform_api则把核心能力以 REST API 形式对外暴露,并支持Annotated[..., Query(...)]注解与x-widget_config等元数据来生成可被 Workspace 消费的 Widget 资料来源:[openbb_platform/extensions/platform_api/README.md:32-60]。
4. CLI 与 MCP Server 入口
cli/openbb_cli 作为 Terminal UI 实现。argparse_translator.py 会把 Python 函数签名中的 Annotated[...]、Optional[...]、管道联合(如 int | str)翻译成 CLI 友好的可读类型字符串 资料来源:[cli/openbb_cli/argparse_translator/argparse_translator.py:1-30],从而把核心的命令图谱无损地反映到命令行界面中。
另一方面,openbb_mcp_server 实现了面向 AI Agent 的 Model Context Protocol 入口。app/app.py 中的 SSEShutdownWrapper 是一段 ASGI 中间件,专门处理 SSE 长连接在客户端断开时产生的 ConnectionResetError 与 "Expected ASGI message" 异常 资料来源:[openbb_platform/extensions/mcp_server/openbb_mcp_server/app/app.py:90-130]。MCP Server 的 README 进一步说明:FastAPI 路由通过 openapi_extra.mcp_config 暴露为 tool、resource 或 resource_template,并支持 exclude_args、methods、mcp_type 等细粒度控制 资料来源:[openbb_platform/extensions/mcp_server/README.md:90-120]。
架构总览
flowchart TD
User[用户 / Agent / HTTP 客户端]
User --> CLI[cli/openbb_cli]
User --> REST[openbb-platform-api REST]
User --> MCP[openbb_mcp_server]
CLI --> Core[openbb-core<br/>命令路由与 Provider 注册]
REST --> Core
MCP --> Core
Core --> Ext[功能扩展<br/>technical / platform_api / ...]
Core --> Prov[数据提供器<br/>congress_gov / imf / famafrench / ...]这种分层让"核心能力"、"数据源"和"接入方式"三件事彼此解耦:所有提供器只需实现标准化的 fetcher 接口即可被 openbb-core 路由;所有扩展则可以在不改核心代码的情况下,向 CLI、REST、MCP 三种入口注入新端点,这也与社区中讨论的"通过 MCP Server 向 Copilot、Codex 等 AI 代理暴露金融数据"用例(例如 Issue #7526 与 Issue #7455)相对应。
另请参阅
来源:https://github.com/OpenBB-finance/OpenBB / 项目说明书
openbb-core: App, Command Runner & OBBject
openbb-core 是 OpenBB Platform 的核心运行时模块,负责将分散的数据提供方(Provider)、扩展(Extension)、路由器(Router)以及配置(Settings)整合为统一的 Python 入口。开发者通过 pip install openbb 安装后,调用 from openbb import obb 即可获得一个全局的 App 实例...
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
openbb-core: App、Command Runner 与 OBBject
一、概览与定位
openbb-core 是 OpenBB Platform 的核心运行时模块,负责将分散的数据提供方(Provider)、扩展(Extension)、路由器(Router)以及配置(Settings)整合为统一的 Python 入口。开发者通过 pip install openbb 安装后,调用 from openbb import obb 即可获得一个全局的 App 实例,背后正是 BaseApp 子类配合 SingletonMeta 元类实现的进程级单例。
整个 core 包由若干职责明确的子包组成:openbb_core.app(App 与命令调度)、openbb_core.app.model(结果对象与抽象基类)、openbb_core.app.service(系统级服务,例如日志、配置加载),以及 openbb_core.provider(Provider 抽象与注册表)。command_runner.py 作为调度中枢,负责把路由器声明的命令转译为可执行的协程并产出 OBBject 形式的结果;obbject.py 则定义了该统一返回类型,是 Python SDK、FastAPI、MCP Server 三种入口共享的契约。
资料来源:openbb_platform/core/openbb_core/app/__init__.py:1-1、openbb_platform/core/openbb_core/app/model/__init__.py:1-1、openbb_platform/core/openbb_core/app/model/abstract/__init__.py:1-1。
二、App 启动与单例模型
2.1 Singleton 元类
SingletonMeta 的设计目标是保证一个进程内只能存在一个 App 实例。它重写了 __call__ 方法,首次调用时执行真正的 __init__,并把实例缓存到类的私有字典中;后续调用均返回同一引用。该模式让用户无论在脚本、CLI、FastAPI 进程还是 MCP Server 进程中,都能通过 obb 这一稳定句柄访问到一致的全局状态(用户凭据、偏好、系统设置、日志句柄等)。
资料来源:openbb_platform/core/openbb_core/app/model/abstract/singleton.py:1-1。
2.2 SystemService 与日志服务
SystemService 在 App 构造阶段被调用,承担三件事:解析 ~/.openbb_platform/ 下的 user_settings.json、合并默认 SystemSettings 与 Preferences、初始化日志后端(LoggingService)。LoggingService 通过统一的格式器将运行期事件写入本地日志目录,并在异常路径上捕获堆栈,方便 CLI、Workspace 与 Agent 调试时回溯。社区中曾讨论过在 ODP Desktop 中追加 “Clear Logs” 按钮(PR #7429),其底层契约正是该日志服务所暴露的句柄。
资料来源:openbb_platform/core/openbb_core/app/service/system_service.py:1-1、openbb_platform/core/openbb_core/app/logs/logging_service.py:1-1。
三、Command Runner 的执行流程
CommandRunner 是命令的“中枢调度器”。当用户在 Python 端写下 obb.equity.price.historical(symbol="AAPL") 时,路由器(Router)会拦截该属性访问,把调用转交给 CommandRunner.run。执行链路如下:
- 参数解析与校验:使用 Pydantic 模型对入参做类型与约束校验。
- Provider 选择:根据入参中的
provider字段、用户偏好以及 Provider 优先级,在ProviderInterface注册表中挑选可用 Provider。 - 数据获取与转换:调用对应 Provider 的
fetcher,把异构字段统一映射到 OpenBB 标准模型(Standard Model)。 - 结果包装:将原始数据装入
OBBject,并附带回执信息(results、provider、warnings、chart等)。 - 副作用处理:写入日志,触发可能的 Charting 后处理(例如命中
openbb-charting扩展时附挂图表对象)。
flowchart LR
A[Python 调用 obb.xxx] --> B[Router 拦截]
B --> C[CommandRunner.run]
C --> D[Pydantic 参数校验]
D --> E[ProviderInterface 选 Provider]
E --> F[Fetcher 取数]
F --> G[标准模型转换]
G --> H[封装为 OBBject]
H --> I[LoggingService 记录]
H --> J[返回给调用方]资料来源:openbb_platform/core/openbb_core/app/command_runner.py:1-1、openbb_platform/core/openbb_core/app/provider_interface.py:1-1。
四、OBBject:统一结果容器
OBBject 是所有命令的返回值基类,承担四项职责:
- 数据载荷:通过
results属性暴露list[Data](Pydantic BaseModel 子类),既可被.to_df()转为 Pandas DataFrame,也能直接被 FastAPI 序列化为 JSON。 - Provider 元信息:记录
provider、warnings、extra,便于审计与排错。 - 扩展挂载点:诸如
chart(来自openbb-charting)、llm(来自 LLM 助手扩展)会作为可空字段懒加载。 - 向后兼容:所有公开方法(
to_dict、to_numpy、to_polars)由openbb_core.app.utils提供转换工具,保证跨版本稳定。
下表汇总 OBBject 主要属性:
| 属性 / 方法 | 类型 | 说明 |
|---|---|---|
results | list[Data] | 标准模型列表,平台所有 Provider 均收敛到该结构 |
provider | str | 实际被选中的 Provider 名称 |
warnings | list[str] | 取数过程中由 Provider 返回的非致命提示 |
extra | dict | Provider 私有附加字段,未纳入标准模型 |
to_df() | pandas.DataFrame | 便捷转 DataFrame;存在 is_multiindex 列时自动重建索引 |
chart | Optional[Chart] | 当 openbb-charting 安装且启用时挂载 |
社区中关于 “MCP server 工具调用缺少审计回执” 的需求(Issue #7455)与 “为 Agent 增加市场状态核验层” 的讨论(Issue #7458),都依赖于对 OBBject.provider、warnings 与 extra 的稳定访问——OBBject 因此被视作 Agent 工具调用审计的事实契约。
资料来源:openbb_platform/core/openbb_core/app/model/obbject.py:1-1、openbb_platform/core/openbb_core/app/model/results/__init__.py:1-1、openbb_platform/core/openbb_core/app/utils.py:1-1。
五、常见失败模式与排查
| 现象 | 根因(基于源码) | 处置建议 |
|---|---|---|
AttributeError: 'NoneType' object has no attribute 'X' | 对应 Provider 未安装扩展或 provider 字段未传且默认 Provider 不可用 | 运行 obb.user.preferences 与 obb.coverage 核对 Provider 列表,必要时 pip install openbb-<provider> |
ValidationError 出现在参数层 | Pydantic 模型拒绝入参类型/取值 | 查阅对应路由的 Standard Model 字段定义;CLI 中可用 ? 查看参数 Schema |
| 日志目录无写入 | LoggingService 启动失败或 user_settings.json 路径无写权限 | 检查 ~/.openbb_platform/system_settings.json 中的 logging_handlers 配置 |
| MCP 工具返回字段不全 | Provider 输出未被映射到标准模型,回落到 extra 字段 | 通过 result.extra 访问原始数据,并参考 Provider 添加指南 完善映射 |
See Also
资料来源:openbb_platform/core/openbb_core/app/__init__.py:1-1、openbb_platform/core/openbb_core/app/model/__init__.py:1-1、openbb_platform/core/openbb_core/app/model/abstract/__init__.py:1-1。
Provider Framework & Registry
OpenBB 平台的核心设计理念之一是"一次编写、处处可用"——即上层 Router(路由层)只需定义一次数据接口契约,底层可以接入多个数据提供方(Provider),由框架负责在运行时挑选合适的 Provider 并执行数据拉取、清洗、转换的全部流程。Provider Framework & Registry 正是承担这一职责的子系统。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
Provider Framework & Registry(提供方框架与注册表)
概述
OpenBB 平台的核心设计理念之一是"一次编写、处处可用"——即上层 Router(路由层)只需定义一次数据接口契约,底层可以接入多个数据提供方(Provider),由框架负责在运行时挑选合适的 Provider 并执行数据拉取、清洗、转换的全部流程。Provider Framework & Registry 正是承担这一职责的子系统。
该子系统主要由以下几部分组成:
- 抽象基类:
Fetcher(数据抓取器)、Provider(提供方元数据)、Data(标准化输出数据模型)——它们共同规定了所有 Provider 扩展必须遵循的接口契约。 - 注册表(Registry):负责在应用启动时通过 Python 入口点(Entry Points)扫描所有已安装的 Provider 扩展包,并将其登记到内存中。
- 注册表映射(Registry Map):将"标准查询 → 可用 Provider 列表"的关系持久化为可查询的数据结构,供 Router 调度。
- 查询执行器(Query Executor):根据当前用户请求、可用 Provider 列表与 Provider 优先级,挑选最优 Provider 并真正发起数据拉取与数据转换。
资料来源:openbb_platform/core/openbb_core/provider/abstract/provider.py ;openbb_platform/core/openbb_core/provider/registry.py
架构与数据流
下图展示了 Provider Framework 各核心组件之间的协作关系,以及一次典型查询在系统内部的流转路径:
flowchart TD
A[Router 调用 obb.equity.price.historical] --> B[CommandRunner]
B --> C[Provider Registry Map]
C --> D{是否存在可用 Provider}
D -- 否 --> E[抛出 OpenBBError]
D -- 是 --> F[QueryExecutor]
F --> G[按优先级筛选 Provider]
G --> H[调用 Fetcher.transform_query]
H --> I[调用 Fetcher.extract_data]
I --> J[调用 Fetcher.transform_data]
J --> K[返回标准化 OBBject 结果]
F -.注册/发现.-> L[Provider Registry]
L -.Entry Points 扫描.-> M[已安装的 Provider 扩展包]整个流程的关键在于"注册"与"发现"完全解耦:用户安装一个新的 Provider 扩展(如 pip install openbb-congress-gov)后,框架会在下一次启动时通过 Python 入口点机制自动发现该扩展并将其纳入 Registry,无需修改任何核心代码。这与社区在 Issue #7458 中提出的"为 Agent 工具包增加市场状态校验层"的扩展诉求高度契合——第三方只需实现 Fetcher 接口即可无缝接入。
资料来源:openbb_platform/core/openbb_core/provider/query_executor.py ;openbb_platform/core/openbb_core/provider/registry_map.py
核心组件详解
Fetcher 抽象基类
Fetcher 是所有数据抓取逻辑的入口。每一个具体的查询(如"获取股票历史价格")都对应一个 Fetcher 子类,它必须实现以下三个核心方法:
| 方法 | 职责 |
|---|---|
transform_query(params) | 将上层传入的标准化参数转换为具体 Provider API 所需的查询参数 |
extract_data(query, credentials, **kwargs) | 实际调用 Provider 的 HTTP/SDK 接口拉取原始数据 |
transform_data(data, **kwargs) | 将 Provider 返回的原始数据转换为 OpenBB 统一的标准 Data 模型 |
这种"三段式"设计使得框架可以在不同 Provider 之间公平切换,同时确保上层 Router 拿到的永远是标准化输出。
资料来源:openbb_platform/core/openbb_core/provider/abstract/fetcher.py ;openbb_platform/core/openbb_core/provider/abstract/data.py
Provider 元数据与 Registry
Provider 抽象类用于描述某个具体数据源的身份与能力,包括名称、官方网站、是否需要凭据、支持哪些查询(fetchers 字典)等元信息。ProviderRegistry 在启动时通过 importlib.metadata.entry_points 扫描所有声明了 openbb_provider 入口点的包,完成自动注册。
注册完成后,RegistryMap 会将"标准查询模型 → 实现了该查询的 Provider 列表"建立为索引,供 QueryExecutor 快速检索。
资料来源:openbb_platform/core/openbb_core/provider/registry.py
QueryExecutor 的选择策略
QueryExecutor 并不是简单地"任意挑选"一个 Provider,而是综合以下因素进行决策:
- 用户显式指定:调用方通过
provider="fmp"这样的参数显式选择。 - Provider 优先级:在 Provider 元数据中声明的优先级字段。
- 凭据可用性:若所选 Provider 需要 API Key 但当前未配置,则会自动降级到下一个可用 Provider。
- 参数兼容性:通过
transform_query的输出判断该 Provider 是否真的支持当前查询条件。
这种"优雅降级"机制确保了即使在某些 Provider 不可用或配置缺失时,系统仍能尽量为用户返回有效数据。
资料来源:openbb_platform/core/openbb_core/provider/query_executor.py
扩展 Provider 的最佳实践
要新增一个 Provider 扩展,开发者需要:
- 创建独立的 Python 包,并声明入口点:
``toml # pyproject.toml [project.entry-points."openbb_provider"] my_provider = "openbb_my_provider:provider" ``
- 实现
Provider子类并定义fetchers字典,将每个标准查询映射到对应的Fetcher子类。
- 在每个
Fetcher中实现transform_query/extract_data/transform_data三个方法。
- 在
user_settings.json或环境变量中声明所需的凭据。
该模式与社区近期讨论高度相关——例如 Issue #7455 提出的"MCP 服务器工具调用的签名审计回执"功能,便可通过在 Fetcher.extract_data 之外增加一层审计装饰器来无缝实现,无需侵入核心框架。
资料来源:openbb_platform/core/openbb_core/provider/abstract/provider.py ;openbb_platform/core/openbb_core/provider/registry.py
常见失败模式
| 现象 | 根因 | 排查建议 |
|---|---|---|
| 启动后某个 Provider 不可见 | 扩展包未正确声明 openbb_provider 入口点 | 使用 pip show <pkg> 核对 entry-points |
| 调用时提示"no provider available" | 没有任何 Provider 实现了对应查询 | 在 Registry Map 中检查 query → providers 映射 |
| 返回数据字段缺失 | transform_data 未完整映射 Provider 原生字段 | 核对 Data 模型字段与 Provider 响应 |
| API Key 错误却仍尝试调用 | 凭据未注入到 CredentialsSystem | 检查 user_settings.json 或环境变量 |
资料来源:openbb_platform/core/openbb_core/provider/query_executor.py ;openbb_platform/core/openbb_core/provider/registry_map.py
See Also
- 开放数据扩展(
openbb-congress-gov)的接入实例:openbb_platform/providers/congress_gov/README.md - 平台总览:openbb_platform/README.md
- MCP Server 与 AI Agent 集成:openbb_platform/extensions/mcp_server/README.md
资料来源:openbb_platform/core/openbb_core/provider/abstract/provider.py ;openbb_platform/core/openbb_core/provider/registry.py
Data Providers Catalogue
OpenBB Platform 的核心设计理念是「统一接口、多源数据」,将来自不同数据供应商的异构金融数据,通过标准化的 Data 与 QueryParams 模型进行规范化封装,从而对外暴露一致的 API 形态。Data Providers Catalogue(数据提供商目录)即指位于 openbbplatform/providers/ 下的所有可插拔扩展包,它们共同构成...
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
数据提供商目录(Data Providers Catalogue)
概述与定位
OpenBB Platform 的核心设计理念是「统一接口、多源数据」,将来自不同数据供应商的异构金融数据,通过标准化的 Data 与 QueryParams 模型进行规范化封装,从而对外暴露一致的 API 形态。Data Providers Catalogue(数据提供商目录)即指位于 openbb_platform/providers/ 下的所有可插拔扩展包,它们共同构成了平台可调用的全部数据来源。
每个提供商都作为一个独立的 PyPI 包发布,通过 pip install 方式按需安装。openbb-core 在启动时通过 RouterLoader 动态发现已安装的提供商,并将其命令挂载到统一的命令空间中。资料来源:openbb_platform/core/README.md:11-20
平台自身默认捆绑了一组常用提供商(如 openbb-yfinance、openbb-fmp、openbb-fred 等),同时允许用户自由选择安装更多扩展。资料来源:openbb_platform/README.md:23-26
架构与数据流转
数据提供商处于 OpenBB 平台的「数据接入层」,承担将第三方 API 协议转换为平台标准化 OBBject 的职责。下图展示了从用户调用到数据回流的整体数据流:
flowchart LR
A[用户/Python API] --> B[openbb-core Router]
B --> C[Provider Router<br/>commands.py]
C --> D[Provider Extension<br/>e.g. congress_gov]
D --> E[外部数据源 API]
E --> D
D --> F[标准化 OBBject]
F --> G[返回用户]commands.py 中的 build_new_signature 与 build_new_annotation_map 函数会根据被调用命令的签名动态生成 FastAPI 路由,并保留 Annotated 类型元数据以实现参数验证。资料来源:openbb_platform/core/openbb_core/api/router/commands.py:46-90。这一机制使得无论底层提供商是 IMF、EIA 还是 Congress.gov,对外的接口形态都保持一致。
主要提供商分类
下表汇总了社区与官方文档中较为关注的提供商类别及其典型用途(基于实际仓库内存在的扩展包):
| 提供商 / 扩展 | 数据领域 | 安装命令 | 关键凭证 |
|---|---|---|---|
openbb-congress-gov | 美国国会立法、议案文本 | pip install openbb-congress-gov | congress_gov_api_key |
openbb-famafrench | 学术因子模型(Fama-French) | pip install openbb-famafrench | 无 |
openbb-imf | IMF 国际宏观经济数据流 | pip install openbb-imf | 无 |
openbb-eia | 美国能源信息署数据 | pip install openbb-eia | eia_api_key |
openbb-technical | 纯本地技术分析指标 | pip install openbb-technical | 无 |
资料来源:openbb_platform/providers/congress_gov/README.md:18-30、openbb_platform/providers/imf/README.md:9-16、openbb_platform/providers/eia/README.md:1-6、openbb_platform/extensions/technical/README.md:7-9。
凭证管理与配置模式
所有需要 API 密钥的提供商均遵循统一的三种凭证注入方式。仍以 congress-gov 为例:
# 1. 写入 user_settings.json
{
"credentials": {
"congress_gov_api_key": "YOUR KEY"
}
}
# 2. 设置环境变量
# CONGRESS_GOV_API_KEY="YOUR KEY"
# 3. 当前会话临时设置
from openbb import obb
obb.user.credentials.congress_gov_api_key = "YOUR KEY"
资料来源:openbb_platform/providers/congress_gov/README.md:55-72。该模式由 openbb-core 的 UserService 统一管理,并在命令执行前完成注入,避免在业务代码中硬编码密钥。
命令空间组织
CLI 端通过 menu_text.py 与 constants.py 渲染层级化菜单。constants.py 中定义的 FLAIRS 字典为不同命令类别提供 emoji 前缀,例如 :mercury(☿)与 :diamond(💎)等,用以在终端中视觉区分提供商。资料来源:cli/openbb_cli/config/constants.py:1-10。命令与提供商的描述则通过 MenuText 类的 add_cmd / add_menu 方法在启动时注入。资料来源:cli/openbb_cli/config/menu_text.py:30-55。
安装、扩展与常见失败模式
安装与发现
基础包 openbb 仅捆绑核心路由与少量提供商,完整目录需按需安装:
pip install openbb
pip install openbb-imf openbb-congress-gov
安装完成后,重新导入 obb 时 RouterLoader 会自动扫描新扩展。资料来源:openbb_platform/README.md:23-26。
与 MCP / Agent 集成
新近的 openbb-mcp-server 扩展将所有已注册的提供商命令暴露为 MCP 工具。提供商在这里被自动打上分类标签(equity、crypto、economy、news 等),供 LLM Agent 动态发现与调用。资料来源:openbb_platform/extensions/mcp_server/README.md:36-46。这与社区中关于 AI Agent 配额限制(issue #7526)及 MCP 调用审计签名(issue #7455)的讨论直接相关——提供商的工具注册粒度直接影响 Agent 的可用工具集与调用频次。
常见失败模式
- 凭证缺失:
UserService在未检测到密钥时通常会抛出OpenBBError,需先完成上述三种凭证注入之一。资料来源:openbb_platform/core/openbb_core/api/router/commands.py:11-14。 - 提供商未安装:调用未安装提供商的命令会触发导入错误或
ProviderNotFoundError,可通过pip list | grep openbb-检查。 - Python 版本不兼容:自 v4.5.0 起,平台对 Python 版本的最低要求已提升,旧版本环境需先升级解释器。
See Also
资料来源:openbb_platform/providers/congress_gov/README.md:18-30、openbb_platform/providers/imf/README.md:9-16、openbb_platform/providers/eia/README.md:1-6、openbb_platform/extensions/technical/README.md:7-9。
Extensions (Routers) & Functional Modules
OpenBB Platform 采用「核心 + 扩展」的可插拔架构:核心包 openbb-core 提供路由机制、命令执行、Provider 接口等基础设施;扩展包(Extensions)以独立的 PyPI 包形式存在,每个扩展向核心注册一个或多个 Router(路由模块),向用户暴露某一领域的金融数据查询函数。资料来源:[openbbplatform/README.md:...
继续阅读本节完整说明和来源证据。
1. 概述与作用
OpenBB Platform 采用「核心 + 扩展」的可插拔架构:核心包 openbb-core 提供路由机制、命令执行、Provider 接口等基础设施;扩展包(Extensions)以独立的 PyPI 包形式存在,每个扩展向核心注册一个或多个 Router(路由模块),向用户暴露某一领域的金融数据查询函数。资料来源:openbb_platform/README.md:1-12 中描述:「The OpenBB Platform provides a convenient way to access raw financial data from multiple data providers」。
扩展大体分为两类:
| 扩展类型 | 安装方式 | 作用 | 典型示例 |
|---|---|---|---|
| 工具/命令扩展 | pip install openbb-equity 等 | 暴露跨 Provider 的标准化命令 | equity、economy、crypto、technical |
| 数据 Provider 扩展 | pip install openbb-fmp 等 | 接入第三方数据源 | FMP、FRED、IMF、congress_gov、benzinga |
资料来源:openbb_platform/README.md:17-30 中的安装说明表格列出了官方支持的扩展与对应 Provider。
2. Router 类与命令注册机制
openbb_core/app/router.py 中的 Router 类是扩展的入口。Router 内部持有一个 FastAPI APIRouter(self._api_router),并通过 include_router() 方法支持 嵌套 形成树状结构(如 /equity/price/historical)。资料来源:openbb_platform/core/openbb_core/app/router.py:21-45。
扩展作者使用 @router.command 装饰器把一个返回 OBBject 的函数注册为命令,装饰器还接受 model、openapi_extra、widget_config、mcp_config 等元数据参数。资料来源:openbb_platform/core/openbb_core/app/router.py:62-92 中的 command() 重载。
from openbb_core.app.router import Router
router = Router(prefix="/equity")
@router.command(model="EquityHistorical")
def historical(symbol: str) -> OBBject[list[dict]]:
"""Return historical OHLCV bars for a symbol."""
...
flowchart LR
A[Extension Package] --> B[Router.__init__]
B --> C["@router.command()"]
C --> D[FastAPI APIRoute]
D --> E[CommandRunner.execute]
E --> F[ProviderInterface]
F --> G[Provider Router]
G --> H[FMP / FRED / IMF / ...]commands.py 中的 build_new_signature() 和 build_new_annotation_map() 函数负责把 Python 函数签名转换为 FastAPI 路由参数,同时自动跳过 kwargs、cc(CommandContext)等内部参数。资料来源:openbb_platform/core/openbb_core/api/router/commands.py:23-58。
3. 工具/命令扩展示例
OpenBB 平台通过若干核心扩展覆盖主要金融领域,每个扩展就是一个 Router:
equity:股票价格、基本面、估值、估计。crypto:加密货币数据。economy:经济指标(GDP、CPI、利率等)。news、fixedincome、derivatives、etf、currency、commodity、index、regulators:其它领域命令。
资料来源:openbb_platform/extensions/mcp_server/README.md:182-200(Root Tools 段落中枚举的 category 列表)。MCP Server 在启动时按 URL 路径切分 prefix 推断出 category/subcategory/tool 名称,例如 /equity/price/historical → equity_price_historical。资料来源:openbb_platform/extensions/mcp_server/openbb_mcp_server/app/app.py:118-145 中的路径分段逻辑。
coverage_helpers.py 暴露了 get_route_callable(),通过 getattr 在嵌套 Router 上递归解析路径,把 obb.equity.price.historical 这种点分路径映射到 Python 可调用对象,用于 OpenAPI 覆盖度(coverage)API。资料来源:openbb_platform/core/openbb_core/api/router/helpers/coverage_helpers.py:18-32。
4. 数据 Provider 扩展示例
Provider 扩展只接入数据源,不直接定义 Router 命令,而是向 ProviderInterface 注册 Fetcher,由工具扩展中的命令在运行时调度。
IMF 扩展:在 imf_utils Router 下暴露元数据查询工具(list_dataflows、list_indicators_by_dataflow、presentation_table_choices 等),供 OpenBB Workspace 下拉菜单使用。资料来源:openbb_platform/providers/imf/README.md:11-28。
congress_gov 扩展:依赖 openbb-platform-api 启动 Workspace App;用户通过 obb.user.credentials.congress_gov_api_key 或 CONGRESS_GOV_API_KEY 环境变量注入 API Key。资料来源:openbb_platform/providers/congress_gov/README.md:53-77。
5. 社区关注点:MCP/Agent 集成
近期社区焦点是把 Platform 的 Router 命令暴露给 AI Agent。mcp_server 扩展把每个 FastAPI 路由映射成 MCP 工具,并支持 mcp_type、exclude_args、prompts 等自定义选项;非激活工具在 available_tools 中仍会简短描述以保持可发现性。资料来源:openbb_platform/extensions/mcp_server/README.md:1-30, 192-210。
相关社区议题(#7455、#7458)讨论了为 MCP 工具调用增加 签名审计凭证(Signed audit receipts) 和 市场状态校验层,这是当前 Agent 工具链的演进方向。资料来源:Issue #7455、Issue #7458。
See Also
资料来源:openbb_platform/README.md:17-30 中的安装说明表格列出了官方支持的扩展与对应 Provider。
失败模式与踩坑日记
保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。
可能增加新用户试用和生产接入成本。
可能影响授权、密钥配置或安全边界。
可能影响授权、密钥配置或安全边界。
金融、交易、隐私和密钥场景必须比普通工具更保守。
Pitfall Log / 踩坑日志
项目:OpenBB-finance/OpenBB
摘要:发现 10 个潜在踩坑项,其中 4 个为 high/blocking;最高优先级:安装坑 - 来源证据:Data source: Historical chart pattern similarity via Chart Library API。
1. 安装坑 · 来源证据:Data source: Historical chart pattern similarity via Chart Library API
- 严重度:high
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:Data source: Historical chart pattern similarity via Chart Library API
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 证据:community_evidence:github | https://github.com/OpenBB-finance/OpenBB/issues/7457 | 来源讨论提到 python 相关条件,需在安装/试用前复核。
2. 安全/权限坑 · 来源证据:Add market state verification layer for agent toolkit
- 严重度:high
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:Add market state verification layer for agent toolkit
- 对用户的影响:可能影响授权、密钥配置或安全边界。
- 证据:community_evidence:github | https://github.com/OpenBB-finance/OpenBB/issues/7458 | 来源类型 github_issue 暴露的待验证使用条件。
3. 安全/权限坑 · 来源证据:[FR] Signed audit receipts for MCP server tool calls (regulatory compliance)
- 严重度:high
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:[FR] Signed audit receipts for MCP server tool calls (regulatory compliance)
- 对用户的影响:可能影响授权、密钥配置或安全边界。
- 证据:community_evidence:github | https://github.com/OpenBB-finance/OpenBB/issues/7455 | 来源讨论提到 npm 相关条件,需在安装/试用前复核。
4. 安全/权限坑 · 涉及密钥、隐私或敏感领域
- 严重度:high
- 证据强度:source_linked
- 发现:项目文本出现 secret/private key/privacy/trading/finance 等敏感关键词。
- 对用户的影响:金融、交易、隐私和密钥场景必须比普通工具更保守。
- 证据:packet_text.keyword_scan | github_repo:323048702 | https://github.com/OpenBB-finance/OpenBB | matched secret / private key / privacy / trading / finance keyword
5. 能力坑 · 能力判断依赖假设
- 严重度:medium
- 证据强度:source_linked
- 发现:README/documentation is current enough for a first validation pass.
- 对用户的影响:假设不成立时,用户拿不到承诺的能力。
- 证据:capability.assumptions | github_repo:323048702 | https://github.com/OpenBB-finance/OpenBB | README/documentation is current enough for a first validation pass.
6. 维护坑 · 维护活跃度未知
- 严重度:medium
- 证据强度:source_linked
- 发现:未记录 last_activity_observed。
- 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
- 证据:evidence.maintainer_signals | github_repo:323048702 | https://github.com/OpenBB-finance/OpenBB | last_activity_observed missing
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 证据:downstream_validation.risk_items | github_repo:323048702 | https://github.com/OpenBB-finance/OpenBB | no_demo; severity=medium
8. 安全/权限坑 · 存在评分风险
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 对用户的影响:风险会影响是否适合普通用户安装。
- 证据:risks.scoring_risks | github_repo:323048702 | https://github.com/OpenBB-finance/OpenBB | no_demo; severity=medium
9. 维护坑 · issue/PR 响应质量未知
- 严重度:low
- 证据强度:source_linked
- 发现:issue_or_pr_quality=unknown。
- 对用户的影响:用户无法判断遇到问题后是否有人维护。
- 证据:evidence.maintainer_signals | github_repo:323048702 | https://github.com/OpenBB-finance/OpenBB | issue_or_pr_quality=unknown
10. 维护坑 · 发布节奏不明确
- 严重度:low
- 证据强度:source_linked
- 发现:release_recency=unknown。
- 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
- 证据:evidence.maintainer_signals | github_repo:323048702 | https://github.com/OpenBB-finance/OpenBB | release_recency=unknown
来源:Doramagic 发现、验证与编译记录