关于 electronics-rfq-agent
electronics-rfq-agent 是面向电子元器件分销商的 Python 库和命令行工具,可从 RFQ 文档生成带价格的报价草案。它通过 MCP 连接多种 ERP,并提供报价审核与审计能力。
主要功能
- 01解析 PDF、Excel 和 Word RFQ
- 02查询 ERP 目录、价格与库存
- 03生成带利润率的报价草案
- 04审计报价行的匹配状态
- 05支持模拟 ERP 后端
适用场景
- 01将客户 RFQ 转成报价草案
- 02检查报价中未匹配或替代的零件
- 03在接入真实 ERP 前测试流程
MCP 相关
提供 MCP stdio 服务,向 MCP 客户端开放 quote_rfq、lookup_part 和 audit_quote 工具;也通过 MCP 连接支持的 ERP。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
3收录的工具列表 · 更新于 3 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| mock | boolean | 否 | |
| margin | number | 否 | |
| rfq_path | string | 是 |
详细介绍
Electronics RFQ Agent
销售工程师花费 2-4 小时将 RFQ 文档转换为报价。现在只需几秒钟。
Electronics RFQ Agent 是一个 Python 库和 CLI,可读取 RFQ 文档(PDF、Excel、Word),对照 ERP 产品目录查找每个行项目,并输出报价草案。它通过 MCP 服务连接 SAP、Epicor、Oracle 和 Microsoft Dynamics,因此可与 Claude、GPT-4 或任何支持 MCP 的 Agent 框架配合使用。

目录
安装
pip install electronics-rfq-agent-cli
# or
uv add electronics-rfq-agent-cli
如需从源代码安装:
git clone https://github.com/RudrenduPaul/electronics-rfq-agent
cd electronics-rfq-agent
pip install -e .
# or, with uv:
uv sync
解析 RFQ 文档(PDF、Excel、Word)需要调用 Anthropic API,因此在运行任何处理真实文档的操作前,请设置 ANTHROPIC_API_KEY:
export ANTHROPIC_API_KEY="sk-ant-..."
使用现有报价文件运行 erfa audit,或通过 --help 了解 CLI,无需此密钥。只有文档解析会调用 Claude。
此项目解决的问题
我们曾与电子产品分销商合作,他们的 3-5 名销售工程师每天大部分时间都在录入报价。我们找到的工具要么绑定到某个特定 ERP,要么需要耗时 6 个月的集成项目。我们希望打造一种能与分销商现有系统配合使用、可自托管(报价数据很敏感)且真正可扩展的工具。
MCP 架构意味着新增 ERP 只需编写一个文件。解析器支持分销商实际会发送的文档格式:手填 PDF、多工作表 Excel 文件,以及偶尔出现的扫描表格。
快速开始
无需 ERP 系统即可试用;模拟后端内置 200 种逼真的电子元器件。需要设置 ANTHROPIC_API_KEY,因为解析 RFQ 文档仍会实际调用 Claude:
from electronics_rfq_agent import QuoteAgent
from electronics_rfq_agent.mcp.mock import MockERP
agent = QuoteAgent(erp=MockERP())
quote = agent.run_sync("path/to/rfq.xlsx")
for line in quote.lines:
print(f"{line.rfq_line.part_number}: {line.status} @ {line.unit_price}")
print(quote.summary())
MockERP 会自动应用基于数量的阶梯定价:数量 >= 1000 可享 20% 折扣,数量 >= 100 可享 10% 折扣,数量 >= 10 可享 5% 折扣。数量低于 10 时按标价计算。这模拟了真实场景中的批量定价,因此基准测试和集成测试能反映真实的成本曲线。
连接到真实 ERP:
from electronics_rfq_agent import QuoteAgent
from electronics_rfq_agent.mcp import EpicorMCP
agent = QuoteAgent(
erp=EpicorMCP(base_url="https://your-epicor.company.com", api_key="..."),
max_concurrent=10, # parallel ERP lookups (default: 10)
)
quote = agent.run_sync("rfq_2026_0619.xlsx")
print(quote.summary())
命令
erfa 提供两个子命令。以下所有标志均直接摘自 erfa --help。
| 命令 | 参数 | 标志 | 功能 |
|---|---|---|---|
erfa quote | rfq(路径,必需) | --mock、--margin <float>(默认值为 0.15)、--output/-o <path> | 解析 RFQ 文件并输出报价草稿。需要 ANTHROPIC_API_KEY;解析始终通过 Claude 进行,--mock 仅替换 ERP 后端。 |
erfa audit | quote_file(路径,必需) | 无 | 为使用 erfa quote --output 保存的报价 JSON 文件输出完整审计报告(已找到/已替换/未找到、填充率)。仅读取本地文件,无需 API 密钥。 |
erfa mcp | 无 | 无 | 启动一个 MCP stdio 服务,将 quote_rfq、lookup_part 和 audit_quote 暴露为类型化工具,以便任何兼容 MCP 的 Agent(Claude、GPT-4、Gemini)都能直接调用,无需通过命令行调用 CLI。将 MCP 客户端配置中的命令设为 erfa mcp。 |
# Generate a quote from an RFQ file against the mock ERP
export ANTHROPIC_API_KEY="sk-ant-..."
erfa quote rfq.xlsx --mock
# Save the quote as JSON for later inspection
erfa quote rfq.xlsx --mock --output quote.json
# Audit what happened: what was found, substituted, or missing and why
erfa audit quote.json
审计输出示例(erfa audit docs/example-quote.json 的实际输出;该输出是通过针对 tests/fixtures/sample_rfq.txt 中的示例 RFQ 运行模拟 ERP 的定价逻辑生成的):
Audit Report - Quote df9fd083
RFQ Source : tests/fixtures/sample_rfq.txt
Lines : 5
Total : USD 64.04
FOUND (4)
------------------------------------------------------------
L 1 RES-0402-10K-1PCT qty=1000 unit=0.0064 ext=6.40
L 2 CAP-100NF-50V-X7R-0402 qty=500 unit=0.0104 ext=5.20
L 3 IC-LM358-SOIC8 qty=50 unit=0.7101 ext=35.50
L 4 XTAL-16MHZ-SMD qty=25 unit=0.6774 ext=16.94
NOT FOUND (1)
------------------------------------------------------------
L 5 MOSFET-NMOS-20V-3A-SOT23 Part 'MOSFET-NMOS-20V-3A-SOT23' not found in ERP catalog
Fill rate: 80% (4 found / 0 substituted / 1 not found)
零价零件: 如果 ERP 目录中存在某个零件,但其单价为 $0.00,Agent 会按 $0 报价,而不是跳过该行,并将标记零价的消息写入
line.notes,以便你在向客户报价前发现这一情况。发送报价前,请检查所有已找到或已替换行的line.notes。
API 参考
完整参考文档见 docs/api.md:其中涵盖每个 QuoteAgent 参数、共享的 ERP 连接器接口、Quote/QuoteLineItem 的每个字段,以及异常层级。以下导出内容是实际通过 from electronics_rfq_agent import ... 提供的,摘录自 src/electronics_rfq_agent/__init__.py,并非猜测:
| 导出项 | 说明 |
|---|---|
QuoteAgent | 协调整个解析、ERP 查询和报价组装流程。提供 run()(异步)和 run_sync()。 |
EpicorMCP、SAPMCP、OracleMCP、DynamicsMCP | ERP 连接器,每个受支持的系统对应一个。它们都实现相同的 search_parts/get_part/get_price/check_inventory 接口。 |
MockERP(来自 electronics_rfq_agent.mcp.mock) | 包含 200 个逼真零件的内存后端。无需凭据,无需联网。 |
Quote、QuoteLineItem、RFQLineItem、ERPPartResult、ERPConfig | 分别用于报价、每个报价行、解析后的 RFQ 行、原始 ERP 数据和连接器配置的 Pydantic v2 模型。 |
ERPConnectionError、RFQParseError | QuoteAgent 可能引发的两种异常:连接/身份验证失败和无法解析的文档。每行的 ERP 错误不会引发异常,而是写入 line.notes。 |
TelemetryCollector、TelemetryEvent | 可选的本地遥测(在 QuoteAgent 上设置 telemetry=True),仅统计次数和耗时,不包含 RFQ 内容。 |
与其他方案的区别
| Electronics RFQ Agent | 手动流程 | SAP Joule | 通用 AI(ChatGPT) | |
|---|---|---|---|---|
| 多 ERP 支持 | SAP + Epicor + Oracle + Dynamics | 不适用 | 以 SAP 为中心(Joule Studio 可通过 SAP Integration Suite 访问非 SAP 数据源) | 无 ERP 访问权限 |
| 报价耗时(50 行) | 约 15 秒 | 2–4 小时 | 未公开文档说明 | 不适用 |
| 可自托管 | 是 | 不适用 | 否(SAP BTP 云服务) | 否 |
| 数据保留在本地 | 是 | 是 | 否 | 否 |
| 开源 | MIT | 不适用 | 否 | 否 |
| 开发用模拟后端 | 是 | 不适用 | 未公开文档说明 | 不适用 |
| 兼容 MCP | 是 | 不适用 | 未公开文档说明 | 否 |
ERP 支持
| ERP | 状态 | 连接方式 | 文档 |
|---|---|---|---|
| Epicor Kinetic | 支持 | REST API | 设置 |
| SAP ECC / S/4HANA | Beta(手动安装) | PyRFC(BAPI) | 设置 |
| Oracle Cloud SCM | 支持 | REST API | 设置 |
| Microsoft Dynamics 365 | 支持 | Graph API | 设置 |
| Mock backend | 内置 | 内存中 | 无需配置 |
**SAP 说明:**pyrfc 需要 SAP NetWeaver RFC Library,该库不在 PyPI 上,必须从 SAP 支持门户手动下载(需要 S-user)。分步说明请参阅 docs/erp-setup/sap.md。
基准测试
使用内存中的 mock backend 测量(200 个真实场景零件,无需 ERP 系统)。你也可以自行运行:
git clone https://github.com/RudrenduPaul/electronics-rfq-agent
cd electronics-rfq-agent
uv run python benchmarks/run.py
ERP 查询延迟(mock backend 上的 100 次单独查询):
| P50 | P99 | 平均值 |
|---|---|---|
| 0.00025ms | 0.0023ms | 0.00032ms |
按 RFQ 大小统计的报价组装时间(解析器使用模拟版本,未调用 Anthropic API):
| RFQ 大小 | 组装时间 |
|---|---|
| 10 行 | 0.004s |
| 25 行 | 0.001s |
| 50 行 | 0.001s |
这些数据仅涵盖 ERP 查询和报价组装。RFQ 解析器使用模拟版本,未调用 Anthropic API。在生产环境中,AI 文档解析每份文档需要 5-15s,真实 ERP 查询每行需要 100-500ms(并行度最高为 max_concurrent=10),因此 50 行 RFQ 的实际总耗时约为 15s。人工处理的基准耗时:2-4 小时。
集成矩阵
Electronics RFQ Agent 可与任何支持 MCP 的 Agent 框架配合使用:
| 框架 | 安装 | 示例 |
|---|---|---|
| Claude(内置) | pip install electronics-rfq-agent-cli | 01-basic-quote |
| LangGraph | pip install 'electronics-rfq-agent-cli[langgraph]' | 04-langgraph-agent |
| OpenAI Agents SDK | pip install electronics-rfq-agent-cli[agents] | 05-openai-agents |
| CrewAI | pip install electronics-rfq-agent-cli[crewai] | 不适用 |
在 Docker 中试用
git clone https://github.com/RudrenduPaul/electronics-rfq-agent
cd electronics-rfq-agent
cp .env.example .env # add your ERP credentials and Anthropic API key
docker compose up -d
你的报价数据绝不会离开你的环境。
安全
- **漏洞扫描:**Trivy 会在每次 CI 运行时进行扫描(HIGH/CRITICAL 严重级别,发现未修复问题时构建失败),扫描结果会上传到 GitHub Security 选项卡。
- **发布签名:**发布工作流会使用 Sigstore 为构建的 wheels 和 sdists 签名,并在标记版本后为每个 GitHub Release 附加 CycloneDX SBOM。
- **依赖锁定:**Dependabot 会使 GitHub Actions 和 Python 依赖保持最新(每周更新补丁版本,每月更新 Actions)。
- 漏洞披露:SECURITY.md。请通过电子邮件或 GitHub Security Advisories 私下报告漏洞;我们将在 48 小时内确认收到,并在 90 天内负责任地披露。
常见问题
Electronics RFQ Agent 实际上能做什么? 它接收客户的 RFQ 文档(PDF、Excel 或 Word),使用 Claude 提取每个行项目,通过 MCP 连接器在你的 ERP 目录中查询每个零件,并返回一份已计入利润率的报价草稿。销售工程师只需审核并发送,无需从头制作报价。
它已可用于生产环境了吗? 目前处于 Beta 阶段(v0.2.x)。核心库、Epicor、Oracle 和 Dynamics 连接器均通过 CI 检查(lint、严格模式的 mypy、带 80% 覆盖率门槛的 pytest、Trivy 扫描),覆盖 Python 3.10-3.12。SAP 支持明确标记为 Beta,并且需要手动安装步骤(SAP NetWeaver RFC Library 不在 PyPI 上)。
我需要 ERP 系统才能试用吗?
不需要。MockERP 附带 200 种逼真的电子元器件,并会根据数量应用阶梯定价,因此你无需任何 ERP 凭据即可运行完整的解析、查询和报价流程。但你仍然需要 ANTHROPIC_API_KEY,因为文档解析会实际调用 Claude。只有 erfa audit(读取已保存的报价文件)完全不需要密钥。
这与让 ChatGPT 读取 RFQ 有什么不同? 通用聊天模型可以读取文档,甚至猜测价格,但它无法连接到你的实际 ERP 目录、库存或合同价格,因此给出的数字是凭空编造的。Electronics RFQ Agent 会根据你的真实目录数据查询每个行项目,并且只会按照实际成本价加上你配置的利润率,为实际有库存的产品报价。
这与 SAP Joule 有什么不同? Joule 是 SAP 专有的 AI 助手套件,内置于 SAP 云平台(SAP BTP),并以 SAP 数据为中心。Electronics RFQ Agent 采用 MIT 许可证,可自托管,并通过同一个 MCP 接口支持 SAP、Epicor、Oracle 和 Dynamics。你的报价数据无需离开自己的环境,也不会受限于某一家 ERP 供应商。
如何通过 Agent 而非 CLI 调用它?
运行 erfa mcp,即可启动一个 MCP stdio 服务,将 quote_rfq、lookup_part 和 audit_quote 作为类型化工具公开。将任何兼容 MCP 的客户端(Claude、GPT-4、Gemini 或自定义 Agent 框架)的启动命令设为 erfa mcp,它就能直接通过结构化 JSON 输入和输出调用这些工具,无需解析 CLI 输出。
它能解析哪些文档格式?
PDF(包括通过 Claude 视觉能力处理的扫描表格)、Excel(.xlsx/.xls,会搜索每个工作表以查找行项目标题行)和 Word(.docx,会读取所有表格)。纯文本 RFQ 也可以处理。
ERP 目录中没有某个行项目时会怎样?
该项目会标记为 not_found,并附上说明原因的备注(而不是被悄悄丢弃或猜测处理),且不会计入报价总额。对已保存的报价 JSON 运行 erfa audit,即可查看哪些项目已找到、已替换或缺失,以及具体原因。
我可以将它用于商业用途吗? 可以。它采用 MIT 许可证,因此你可以使用、修改并用于商业发布,无需支付版税,也不必将你的修改开源。只需通过许可证文件注明出处。
我的 RFQ 和定价数据会发送到 Anthropic 以外的地方吗? 只有 RFQ 文档内容会发送到 Anthropic API 进行解析。ERP 查询会通过你配置的连接器,直接从你的机器发送到 ERP 系统:没有中间服务,除非你选择自行保存报价 JSON,否则任何数据都不会存储在你自己的环境之外。
它已发布到 PyPI 吗?
是的,包名为 electronics-rfq-agent-cli(pip install electronics-rfq-agent-cli)。发布流水线(构建、Sigstore 签名、SBOM、可信发布方上传)位于 .github/workflows/release.yml,并会在每次推送 v* 标签时运行。Python 导入路径(electronics_rfq_agent)和 erfa CLI 命令保持不变;只有面向软件包仓库的包名带有 -cli 后缀,符合该维护者对 CLI 工具的命名惯例。
贡献
- 提交 PR 前,请阅读 CONTRIBUTING.md
- GitHub 上已为适合新手的问题添加标签
- ERP 适配器位于
electronics_rfq_agent/mcp/;每个文件都是独立的,无需修改核心代码 - 所有 PR 的测试覆盖率都必须达到 80%
GitHub 讨论区:提问、分享想法 Discord:即将推出
完整文档:入门指南 · API 参考 · ERP 设置:Epicor · SAP · Oracle · Dynamics 365 · 变更日志
MIT。欢迎贡献。
许可证
MIT。请参阅 LICENSE。
引用本项目
如果你在研究中使用 Electronics RFQ Agent,请引用:
@software{paul2026electronicsrfq,
author = {Paul, Rudrendu and Nandy, Sourav},
title = {Electronics RFQ Agent: AI Quoting Agent for Electronics Distributors},
year = {2026},
url = {https://github.com/RudrenduPaul/electronics-rfq-agent},
license = {MIT}
}
由 Rudrendu Paul 和 Sourav Nandy 构建
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。