Electronics RFQ Agent
Agente de cotización con IA para distribuidores de electrónica: RFQ de entrada, cotización de salida mediante herramientas MCP.
Documentación
Electronics RFQ Agent
Tus ingenieros de ventas pasan de 2 a 4 horas convirtiendo documentos RFQ en cotizaciones. Esto lo hace en segundos.
Electronics RFQ Agent es una biblioteca de Python y una CLI que lee documentos RFQ (PDF, Excel, Word), busca cada línea de artículo en tu catálogo ERP y genera un borrador de cotización. Se conecta a SAP, Epicor, Oracle y Microsoft Dynamics a través de servidores MCP, por lo que funciona con Claude, GPT-4 o cualquier framework de agentes que hable MCP.

Tabla de contenidos
- Instalación
- El problema que resuelve
- Inicio rápido
- Comandos
- Referencia de API
- Cómo se diferencia de las alternativas
- Soporte ERP
- Benchmarks
- Matriz de integración
- Pruébalo en Docker
- Seguridad
- Preguntas frecuentes
- Contribuciones
- Licencia
Instalación
pip install electronics-rfq-agent-cli
# or
uv add electronics-rfq-agent-cli
Para instalar desde el código fuente en su lugar:
git clone https://github.com/RudrenduPaul/electronics-rfq-agent
cd electronics-rfq-agent
pip install -e .
# or, with uv:
uv sync
El análisis de documentos RFQ (PDF, Excel, Word) llama a la API de Anthropic, así que configura ANTHROPIC_API_KEY antes de ejecutar cualquier cosa que toque un documento real:
export ANTHROPIC_API_KEY="sk-ant-..."
No necesitas esta clave para ejecutar erfa audit contra un archivo de cotización existente, ni para explorar la CLI con --help. Solo el análisis de documentos llama a Claude.
El problema que resuelve
Trabajamos con distribuidores de electrónica que tenían de 3 a 5 ingenieros de ventas dedicando la mayor parte de su día a la entrada de cotizaciones. Cada herramienta que encontramos estaba ligada a un ERP específico o requería un proyecto de integración de 6 meses. Queríamos algo que funcionara con lo que los distribuidores ya tenían, que pudiera alojarse en sus propios servidores (los datos de cotización son sensibles) y que fuera realmente extensible.
La arquitectura MCP significa que añadir un nuevo ERP es escribir un solo archivo. El analizador maneja los formatos de documento que los distribuidores realmente envían: PDFs rellenados a mano, archivos Excel de varias hojas y la ocasional tabla escaneada.
Inicio rápido
No se requiere ningún sistema ERP para probarlo; el backend simulado incluye 200 piezas electrónicas realistas. Sí necesitas configurar ANTHROPIC_API_KEY, ya que el análisis del documento RFQ sigue siendo una llamada real a 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 aplica automáticamente niveles de precios basados en cantidad: cantidad >= 1000 obtiene 20% de descuento, cantidad >= 100 obtiene 10% de descuento, cantidad >= 10 obtiene 5% de descuento. El precio de lista se aplica por debajo de cantidad 10. Esto refleja los precios por volumen del mundo real para que los benchmarks y las pruebas de integración reflejen curvas de costos realistas.
Conéctate a un ERP real:
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())
Comandos
erfa incluye dos subcomandos. Cada bandera a continuación está extraída directamente de erfa --help.
| Comando | Argumentos | Banderas | Qué hace |
|---|---|---|---|
erfa quote | rfq (ruta, obligatorio) | --mock, --margin <float> (por defecto 0.15), --output/-o <path> | Analiza un archivo RFQ e imprime un borrador de cotización. Necesita ANTHROPIC_API_KEY; el análisis siempre pasa por Claude, --mock solo cambia el backend ERP. |
erfa audit | quote_file (ruta, obligatorio) | ninguna | Imprime un informe de auditoría completo (encontrado / sustituido / no encontrado, tasa de cobertura) para un archivo JSON de cotización guardado con erfa quote --output. Lee solo un archivo local, no se necesita clave de API. |
erfa mcp | ninguna | ninguna | Lanza un servidor MCP stdio que expone quote_rfq, lookup_part y audit_quote como herramientas tipadas, para que cualquier agente compatible con MCP (Claude, GPT-4, Gemini) pueda llamarlas directamente sin recurrir a la CLI. Apunta la configuración de tu cliente MCP a erfa mcp como comando. |
# 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
Ejemplo de salida de auditoría (salida real de erfa audit docs/example-quote.json, generada ejecutando la lógica de precios del ERP simulado contra el RFQ de muestra en tests/fixtures/sample_rfq.txt):
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)
Piezas con precio cero: Si una pieza existe en el catálogo ERP pero tiene un precio unitario de $0.00, el agente cotiza $0 en lugar de omitir la línea, y establece
line.notesa un mensaje que señala el precio cero para que lo detectes antes de cotizar al cliente. Revisaline.notespara cualquier línea encontrada o sustituida antes de enviar una cotización.
Referencia de API
La referencia completa está en docs/api.md: cada parámetro de QuoteAgent, la interfaz compartida del conector ERP, Quote/QuoteLineItem campo por campo, y la jerarquía de excepciones. Las exportaciones a continuación son lo que from electronics_rfq_agent import ... realmente te proporciona, extraído de src/electronics_rfq_agent/__init__.py, no adivinado:
| Exportación | Qué es |
|---|---|
QuoteAgent | Orquesta el análisis + búsqueda ERP + ensamblaje de cotización. run() (async) y run_sync(). |
EpicorMCP, SAPMCP, OracleMCP, DynamicsMCP | Conectores ERP, uno por sistema compatible. Todos implementan la misma interfaz search_parts / get_part / get_price / check_inventory. |
MockERP (de electronics_rfq_agent.mcp.mock) | Backend en memoria con 200 piezas realistas. Sin credenciales, sin red. |
Quote, QuoteLineItem, RFQLineItem, ERPPartResult, ERPConfig | Modelos Pydantic v2 para la cotización, cada línea, la línea RFQ analizada, datos ERP crudos y configuración del conector. |
ERPConnectionError, RFQParseError | Las dos excepciones que QuoteAgent puede lanzar: fallos de conexión/autenticación y documentos no analizables. Los fallos ERP por línea no se lanzan; van a line.notes en su lugar. |
TelemetryCollector, TelemetryEvent | Telemetría local opcional (telemetry=True en QuoteAgent), solo conteos y tiempos, sin contenido RFQ. |
Cómo se diferencia de las alternativas
| Electronics RFQ Agent | Proceso manual | SAP Joule | IA genérica (ChatGPT) | |
|---|---|---|---|---|
| Soporte multi-ERP | SAP + Epicor + Oracle + Dynamics | N/A | Centrado en SAP (Joule Studio puede alcanzar fuentes no SAP vía SAP Integration Suite) | Sin acceso ERP |
| Tiempo de cotización (50 líneas) | ~15s | 2-4 horas | No documentado públicamente | N/A |
| Autoalojable | Sí | N/A | No (servicio en la nube SAP BTP) | No |
| Los datos permanecen locales | Sí | Sí | No | No |
| Código abierto | MIT | N/A | No | No |
| Backend simulado para desarrollo | Sí | N/A | No documentado públicamente | N/A |
| Compatible con MCP | Sí | N/A | No documentado públicamente | No |
Soporte ERP
| ERP | Estado | Conexión | Documentación |
|---|---|---|---|
| Epicor Kinetic | Compatible | API REST | Configuración |
| SAP ECC / S/4HANA | Beta (instalación manual) | PyRFC (BAPI) | Configuración |
| Oracle Cloud SCM | Compatible | API REST | Configuración |
| Microsoft Dynamics 365 | Compatible | API Graph | Configuración |
| Backend simulado | Integrado | En memoria | Sin configuración necesaria |
Nota sobre SAP: pyrfc requiere la librería SAP NetWeaver RFC, que no está en PyPI y debe descargarse manualmente desde el portal de soporte de SAP (se requiere usuario S). Consulta docs/erp-setup/sap.md para instrucciones paso a paso.
Benchmarks
Medidos con el backend simulado en memoria (200 piezas realistas, sin necesidad de sistema ERP). Ejecútalo tú mismo:
git clone https://github.com/RudrenduPaul/electronics-rfq-agent
cd electronics-rfq-agent
uv run python benchmarks/run.py
Latencia de búsqueda ERP (100 búsquedas individuales, backend simulado):
| P50 | P99 | Media |
|---|---|---|
| 0.00025ms | 0.0023ms | 0.00032ms |
Tiempo de ensamblaje de cotización por tamaño de RFQ (analizador simulado, sin llamada a la API de Anthropic):
| Tamaño de RFQ | Tiempo de ensamblaje |
|---|---|
| 10 líneas | 0.004s |
| 25 líneas | 0.001s |
| 50 líneas | 0.001s |
Estos números cubren solo la búsqueda ERP y el ensamblaje de cotización. El analizador RFQ está simulado y no se realiza ninguna llamada a la API de Anthropic. En producción, el análisis de documentos con IA añade 5-15s por documento y las búsquedas ERP reales añaden 100-500ms por línea (paralelizadas hasta max_concurrent=10), dando un total realista de ~15s para un RFQ de 50 líneas. Línea base manual: 2-4 horas.
Matriz de integración
Electronics RFQ Agent funciona con cualquier framework de agentes que soporte MCP:
| Framework | Instalación | Ejemplo |
|---|---|---|
| Claude (integrado) | 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] | n/a |
Pruébalo en 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
Tus datos de cotización nunca salen de tu entorno.
Seguridad
- Escaneo de vulnerabilidades: Trivy escanea cada ejecución de CI (severidad ALTA/CRÍTICA, la compilación falla en hallazgos sin corregir), los resultados se suben a la pestaña de Seguridad de GitHub.
- Firma de versiones: el flujo de trabajo de versiones firma las ruedas y sdists compiladas con Sigstore y adjunta un SBOM CycloneDX a cada versión de GitHub una vez que se etiqueta una versión.
- Fijación de dependencias: Dependabot mantiene las acciones de GitHub y las dependencias de Python actualizadas (parches semanales, actualizaciones mensuales de Actions).
- Divulgación: SECURITY.md. Reporta vulnerabilidades de forma privada por correo electrónico o avisos de seguridad de GitHub; acuse de recibo en 48 horas, divulgación responsable en 90 días.
Preguntas frecuentes
¿Qué hace realmente Electronics RFQ Agent? Toma un documento RFQ (PDF, Excel o Word) de un cliente, extrae cada línea de artículo con Claude, busca cada pieza en tu catálogo ERP a través de un conector MCP, y devuelve un borrador de cotización con precio y margen aplicado. Un ingeniero de ventas lo revisa y lo envía en lugar de construirlo desde cero.
¿Está listo para producción? Está en Beta (v0.2.x). La biblioteca principal, los conectores de Epicor, Oracle y Dynamics están cubiertos por CI (lint, mypy estricto, pytest con un umbral de cobertura del 80%, escaneo Trivy) en Python 3.10-3.12. El soporte de SAP está explícitamente marcado como Beta y requiere un paso de instalación manual (la librería SAP NetWeaver RFC no está en PyPI).
¿Necesito un sistema ERP para probarlo?
No. MockERP incluye 200 piezas electrónicas realistas y aplica niveles de precios basados en cantidad, para que puedas ejecutar el flujo completo de análisis-búsqueda-cotización sin credenciales ERP. Sí necesitas ANTHROPIC_API_KEY, ya que el análisis de documentos es una llamada real a Claude. Solo erfa audit (leer un archivo de cotización ya guardado) funciona sin clave alguna.
¿En qué se diferencia de pedirle a ChatGPT que lea el RFQ? Un modelo de chat genérico puede leer un documento e incluso adivinar precios, pero no tiene conexión con tu catálogo ERP real, inventario o precios de contrato, así que está inventando números. Electronics RFQ Agent busca cada línea de artículo contra tus datos de catálogo reales y solo cotiza lo que realmente está en stock al precio de costo real más tu margen configurado.
¿En qué se diferencia de SAP Joule? Joule es el conjunto de asistentes de IA propietario de SAP, integrado en la plataforma en la nube de SAP (SAP BTP) y centrado en datos de SAP. Electronics RFQ Agent tiene licencia MIT, es autoalojable y funciona con SAP, Epicor, Oracle y Dynamics a través de la misma interfaz MCP. Tus datos de cotización nunca tienen que salir de tu entorno, y no estás atado a un solo proveedor ERP.
¿Cómo llamo a esto desde un agente en lugar de la CLI?
Ejecuta erfa mcp para lanzar un servidor MCP stdio que expone quote_rfq, lookup_part y audit_quote como herramientas tipadas. Apunta cualquier cliente compatible con MCP (Claude, GPT-4, Gemini o un framework de agentes personalizado) a erfa mcp como comando de lanzamiento, y podrá llamar a esas herramientas directamente con JSON estructurado de entrada y salida, sin necesidad de analizar la salida de la CLI.
¿Qué formatos de documento analiza?
PDF (incluidas tablas escaneadas, mediante la capacidad de visión de Claude), Excel (.xlsx/.xls, busca en cada hoja de cálculo la fila de encabezado de línea de artículo) y Word (.docx, lee todas las tablas). Los RFQ de texto plano también funcionan.
¿Qué pasa con una línea de artículo que no está en el catálogo ERP?
Se marca como not_found con una nota explicando por qué (en lugar de omitirse silenciosamente o adivinarse), y se excluye del total de la cotización. Ejecuta erfa audit en el JSON de cotización guardado para ver exactamente qué líneas se encontraron, sustituyeron o faltaron, y por qué.
¿Puedo usarlo comercialmente?
Sí. Tiene licencia MIT, por lo que puedes usarlo, modificarlo y distribuirlo comercialmente sin regalías ni obligación de abrir tu código. Solo se requiere la atribución mediante el archivo de licencia.
¿Mi RFQ y los datos de precios se envían a algún lugar además de Anthropic? Solo el contenido del documento RFQ se envía a la API de Anthropic para su análisis. Las consultas al ERP van directamente desde tu máquina a tu sistema ERP a través del conector que configures: no hay un servicio intermediario, y nada se almacena fuera de tu propio entorno a menos que elijas persistir el JSON de cotización tú mismo.
¿Está publicado en PyPI?
Sí, como electronics-rfq-agent-cli (pip install electronics-rfq-agent-cli). El pipeline de publicación (compilación, firma Sigstore, SBOM, carga de editor confiable) vive en .github/workflows/release.yml y se ejecuta en cada push de etiqueta v*. La ruta de importación de Python (electronics_rfq_agent) y el comando CLI erfa no cambian; solo el nombre del paquete orientado al registro lleva el sufijo -cli, siguiendo la convención de nombres de este mantenedor para herramientas CLI.
Contribuciones
- Lee CONTRIBUTING.md antes de abrir un PR
- Los primeros problemas buenos están etiquetados en GitHub
- Los adaptadores de ERP viven en
electronics_rfq_agent/mcp/; cada uno es un archivo autocontenido sin cambios en el núcleo - Todos los PR requieren un 80% de cobertura de pruebas
Discusiones de GitHub: Haz preguntas, comparte ideas Discord: próximamente
Documentación completa: Primeros pasos · Referencia de API · Configuración de ERP: Epicor · SAP · Oracle · Dynamics 365 · Registro de cambios
MIT. Las contribuciones son bienvenidas.
Licencia
MIT. Ver LICENCIA.
Cita este trabajo
Si usas Electronics RFQ Agent en investigación, por favor cita:
@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}
}
Construido por Rudrendu Paul y Sourav Nandy