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]

核心层提供 DataQueryParams 标准化 Pydantic 模型,动态字段支持以及 API 路由机制,使开发者可灵活处理不同数据结构。资料来源:openbb_platform/core/README.md:23-31

核心特性

标准化数据模型

Data 类是基于 Pydantic 的灵活动态模型,能够处理各种数据结构;QueryParams 类则规范化不同提供商的查询参数。commands.py 中的 build_new_annotation_mapbuild_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

扩展生态

工具类扩展

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_mapbuild_new_signature 把任意 Python 函数签名转换为 FastAPI 路由可以消费的 Pydantic / Annotated 注解 资料来源:[openbb_platform/core/openbb_core/api/router/commands.py:1-19]。核心子模块主要包括:

3. 扩展与数据提供器

平台通过两类可插拔模块扩展能力:

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 暴露为 toolresourceresource_template,并支持 exclude_argsmethodsmcp_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 #7526Issue #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 实例...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 2.1 Singleton 元类

继续阅读本节完整说明和来源证据。

章节 2.2 SystemService 与日志服务

继续阅读本节完整说明和来源证据。

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-1openbb_platform/core/openbb_core/app/model/__init__.py:1-1openbb_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、合并默认 SystemSettingsPreferences、初始化日志后端(LoggingService)。LoggingService 通过统一的格式器将运行期事件写入本地日志目录,并在异常路径上捕获堆栈,方便 CLI、Workspace 与 Agent 调试时回溯。社区中曾讨论过在 ODP Desktop 中追加 “Clear Logs” 按钮(PR #7429),其底层契约正是该日志服务所暴露的句柄。

资料来源:openbb_platform/core/openbb_core/app/service/system_service.py:1-1openbb_platform/core/openbb_core/app/logs/logging_service.py:1-1

三、Command Runner 的执行流程

CommandRunner 是命令的“中枢调度器”。当用户在 Python 端写下 obb.equity.price.historical(symbol="AAPL") 时,路由器(Router)会拦截该属性访问,把调用转交给 CommandRunner.run。执行链路如下:

  1. 参数解析与校验:使用 Pydantic 模型对入参做类型与约束校验。
  2. Provider 选择:根据入参中的 provider 字段、用户偏好以及 Provider 优先级,在 ProviderInterface 注册表中挑选可用 Provider。
  3. 数据获取与转换:调用对应 Provider 的 fetcher,把异构字段统一映射到 OpenBB 标准模型(Standard Model)。
  4. 结果包装:将原始数据装入 OBBject,并附带回执信息(resultsproviderwarningschart 等)。
  5. 副作用处理:写入日志,触发可能的 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-1openbb_platform/core/openbb_core/app/provider_interface.py:1-1

四、OBBject:统一结果容器

OBBject 是所有命令的返回值基类,承担四项职责:

  • 数据载荷:通过 results 属性暴露 list[Data](Pydantic BaseModel 子类),既可被 .to_df() 转为 Pandas DataFrame,也能直接被 FastAPI 序列化为 JSON。
  • Provider 元信息:记录 providerwarningsextra,便于审计与排错。
  • 扩展挂载点:诸如 chart(来自 openbb-charting)、llm(来自 LLM 助手扩展)会作为可空字段懒加载。
  • 向后兼容:所有公开方法(to_dictto_numpyto_polars)由 openbb_core.app.utils 提供转换工具,保证跨版本稳定。

下表汇总 OBBject 主要属性:

属性 / 方法类型说明
resultslist[Data]标准模型列表,平台所有 Provider 均收敛到该结构
providerstr实际被选中的 Provider 名称
warningslist[str]取数过程中由 Provider 返回的非致命提示
extradictProvider 私有附加字段,未纳入标准模型
to_df()pandas.DataFrame便捷转 DataFrame;存在 is_multiindex 列时自动重建索引
chartOptional[Chart]openbb-charting 安装且启用时挂载

社区中关于 “MCP server 工具调用缺少审计回执” 的需求(Issue #7455)与 “为 Agent 增加市场状态核验层” 的讨论(Issue #7458),都依赖于对 OBBject.providerwarningsextra 的稳定访问——OBBject 因此被视作 Agent 工具调用审计的事实契约。

资料来源:openbb_platform/core/openbb_core/app/model/obbject.py:1-1openbb_platform/core/openbb_core/app/model/results/__init__.py:1-1openbb_platform/core/openbb_core/app/utils.py:1-1

五、常见失败模式与排查

现象根因(基于源码)处置建议
AttributeError: 'NoneType' object has no attribute 'X'对应 Provider 未安装扩展或 provider 字段未传且默认 Provider 不可用运行 obb.user.preferencesobb.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-1openbb_platform/core/openbb_core/app/model/__init__.py:1-1openbb_platform/core/openbb_core/app/model/abstract/__init__.py:1-1

Provider Framework & Registry

OpenBB 平台的核心设计理念之一是"一次编写、处处可用"——即上层 Router(路由层)只需定义一次数据接口契约,底层可以接入多个数据提供方(Provider),由框架负责在运行时挑选合适的 Provider 并执行数据拉取、清洗、转换的全部流程。Provider Framework & Registry 正是承担这一职责的子系统。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 Fetcher 抽象基类

继续阅读本节完整说明和来源证据。

章节 Provider 元数据与 Registry

继续阅读本节完整说明和来源证据。

章节 QueryExecutor 的选择策略

继续阅读本节完整说明和来源证据。

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.pyopenbb_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.pyopenbb_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.pyopenbb_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,而是综合以下因素进行决策:

  1. 用户显式指定:调用方通过 provider="fmp" 这样的参数显式选择。
  2. Provider 优先级:在 Provider 元数据中声明的优先级字段。
  3. 凭据可用性:若所选 Provider 需要 API Key 但当前未配置,则会自动降级到下一个可用 Provider。
  4. 参数兼容性:通过 transform_query 的输出判断该 Provider 是否真的支持当前查询条件。

这种"优雅降级"机制确保了即使在某些 Provider 不可用或配置缺失时,系统仍能尽量为用户返回有效数据。

资料来源:openbb_platform/core/openbb_core/provider/query_executor.py

扩展 Provider 的最佳实践

要新增一个 Provider 扩展,开发者需要:

  1. 创建独立的 Python 包,并声明入口点:

``toml # pyproject.toml [project.entry-points."openbb_provider"] my_provider = "openbb_my_provider:provider" ``

  1. 实现 Provider 子类并定义 fetchers 字典,将每个标准查询映射到对应的 Fetcher 子类。
  1. 在每个 Fetcher 中实现 transform_query / extract_data / transform_data 三个方法。
  1. user_settings.json 或环境变量中声明所需的凭据。

该模式与社区近期讨论高度相关——例如 Issue #7455 提出的"MCP 服务器工具调用的签名审计回执"功能,便可通过在 Fetcher.extract_data 之外增加一层审计装饰器来无缝实现,无需侵入核心框架。

资料来源:openbb_platform/core/openbb_core/provider/abstract/provider.pyopenbb_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.pyopenbb_platform/core/openbb_core/provider/registry_map.py

See Also

资料来源:openbb_platform/core/openbb_core/provider/abstract/provider.pyopenbb_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 的核心设计理念是「统一接口、多源数据」,将来自不同数据供应商的异构金融数据,通过标准化的 DataQueryParams 模型进行规范化封装,从而对外暴露一致的 API 形态。Data Providers Catalogue(数据提供商目录)即指位于 openbb_platform/providers/ 下的所有可插拔扩展包,它们共同构成了平台可调用的全部数据来源。

每个提供商都作为一个独立的 PyPI 包发布,通过 pip install 方式按需安装。openbb-core 在启动时通过 RouterLoader 动态发现已安装的提供商,并将其命令挂载到统一的命令空间中。资料来源:openbb_platform/core/README.md:11-20

平台自身默认捆绑了一组常用提供商(如 openbb-yfinanceopenbb-fmpopenbb-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_signaturebuild_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-govcongress_gov_api_key
openbb-famafrench学术因子模型(Fama-French)pip install openbb-famafrench
openbb-imfIMF 国际宏观经济数据流pip install openbb-imf
openbb-eia美国能源信息署数据pip install openbb-eiaeia_api_key
openbb-technical纯本地技术分析指标pip install openbb-technical

资料来源:openbb_platform/providers/congress_gov/README.md:18-30openbb_platform/providers/imf/README.md:9-16openbb_platform/providers/eia/README.md:1-6openbb_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-coreUserService 统一管理,并在命令执行前完成注入,避免在业务代码中硬编码密钥。

命令空间组织

CLI 端通过 menu_text.pyconstants.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

安装完成后,重新导入 obbRouterLoader 会自动扫描新扩展。资料来源:openbb_platform/README.md:23-26

与 MCP / Agent 集成

新近的 openbb-mcp-server 扩展将所有已注册的提供商命令暴露为 MCP 工具。提供商在这里被自动打上分类标签(equitycryptoeconomynews 等),供 LLM Agent 动态发现与调用。资料来源:openbb_platform/extensions/mcp_server/README.md:36-46。这与社区中关于 AI Agent 配额限制(issue #7526)及 MCP 调用审计签名(issue #7455)的讨论直接相关——提供商的工具注册粒度直接影响 Agent 的可用工具集与调用频次。

常见失败模式

  1. 凭证缺失UserService 在未检测到密钥时通常会抛出 OpenBBError,需先完成上述三种凭证注入之一。资料来源:openbb_platform/core/openbb_core/api/router/commands.py:11-14
  2. 提供商未安装:调用未安装提供商的命令会触发导入错误或 ProviderNotFoundError,可通过 pip list | grep openbb- 检查。
  3. Python 版本不兼容:自 v4.5.0 起,平台对 Python 版本的最低要求已提升,旧版本环境需先升级解释器。

See Also

资料来源:openbb_platform/providers/congress_gov/README.md:18-30openbb_platform/providers/imf/README.md:9-16openbb_platform/providers/eia/README.md:1-6openbb_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 APIRouterself._api_router),并通过 include_router() 方法支持 嵌套 形成树状结构(如 /equity/price/historical)。资料来源:openbb_platform/core/openbb_core/app/router.py:21-45

扩展作者使用 @router.command 装饰器把一个返回 OBBject 的函数注册为命令,装饰器还接受 modelopenapi_extrawidget_configmcp_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 路由参数,同时自动跳过 kwargsccCommandContext)等内部参数。资料来源:openbb_platform/core/openbb_core/api/router/commands.py:23-58

3. 工具/命令扩展示例

OpenBB 平台通过若干核心扩展覆盖主要金融领域,每个扩展就是一个 Router:

  • equity:股票价格、基本面、估值、估计。
  • crypto:加密货币数据。
  • economy:经济指标(GDP、CPI、利率等)。
  • newsfixedincomederivativesetfcurrencycommodityindexregulators:其它领域命令。

资料来源:openbb_platform/extensions/mcp_server/README.md:182-200(Root Tools 段落中枚举的 category 列表)。MCP Server 在启动时按 URL 路径切分 prefix 推断出 category/subcategory/tool 名称,例如 /equity/price/historicalequity_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_dataflowslist_indicators_by_dataflowpresentation_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_keyCONGRESS_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_typeexclude_argsprompts 等自定义选项;非激活工具在 available_tools 中仍会简短描述以保持可发现性。资料来源:openbb_platform/extensions/mcp_server/README.md:1-30, 192-210

相关社区议题(#7455、#7458)讨论了为 MCP 工具调用增加 签名审计凭证(Signed audit receipts)市场状态校验层,这是当前 Agent 工具链的演进方向。资料来源:Issue #7455Issue #7458

See Also

资料来源:openbb_platform/README.md:17-30 中的安装说明表格列出了官方支持的扩展与对应 Provider。

失败模式与踩坑日记

保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。

high 来源证据:Data source: Historical chart pattern similarity via Chart Library API

可能增加新用户试用和生产接入成本。

high 来源证据:Add market state verification layer for agent toolkit

可能影响授权、密钥配置或安全边界。

high 来源证据:[FR] Signed audit receipts for MCP server tool calls (regulatory compliance)

可能影响授权、密钥配置或安全边界。

high 涉及密钥、隐私或敏感领域

金融、交易、隐私和密钥场景必须比普通工具更保守。

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 发现、验证与编译记录