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.

CI PyPI version Python 3.10+ License: MIT OpenSSF Scorecard


Terminal recording showing erfa --help listing the quote and audit subcommands, then erfa audit printing a full fill-rate report for a five-line RFQ against the mock ERP backend

Tabla de contenidos

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.

ComandoArgumentosBanderasQué hace
erfa quoterfq (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 auditquote_file (ruta, obligatorio)ningunaImprime 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 mcpningunaningunaLanza 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.notes a un mensaje que señala el precio cero para que lo detectes antes de cotizar al cliente. Revisa line.notes para 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ónQué es
QuoteAgentOrquesta el análisis + búsqueda ERP + ensamblaje de cotización. run() (async) y run_sync().
EpicorMCP, SAPMCP, OracleMCP, DynamicsMCPConectores 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, ERPConfigModelos Pydantic v2 para la cotización, cada línea, la línea RFQ analizada, datos ERP crudos y configuración del conector.
ERPConnectionError, RFQParseErrorLas 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, TelemetryEventTelemetría local opcional (telemetry=True en QuoteAgent), solo conteos y tiempos, sin contenido RFQ.

Cómo se diferencia de las alternativas

Electronics RFQ AgentProceso manualSAP JouleIA genérica (ChatGPT)
Soporte multi-ERPSAP + Epicor + Oracle + DynamicsN/ACentrado en SAP (Joule Studio puede alcanzar fuentes no SAP vía SAP Integration Suite)Sin acceso ERP
Tiempo de cotización (50 líneas)~15s2-4 horasNo documentado públicamenteN/A
AutoalojableN/ANo (servicio en la nube SAP BTP)No
Los datos permanecen localesNoNo
Código abiertoMITN/ANoNo
Backend simulado para desarrolloN/ANo documentado públicamenteN/A
Compatible con MCPN/ANo documentado públicamenteNo

Soporte ERP

ERPEstadoConexiónDocumentación
Epicor KineticCompatibleAPI RESTConfiguración
SAP ECC / S/4HANABeta (instalación manual)PyRFC (BAPI)Configuración
Oracle Cloud SCMCompatibleAPI RESTConfiguración
Microsoft Dynamics 365CompatibleAPI GraphConfiguración
Backend simuladoIntegradoEn memoriaSin 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):

P50P99Media
0.00025ms0.0023ms0.00032ms

Tiempo de ensamblaje de cotización por tamaño de RFQ (analizador simulado, sin llamada a la API de Anthropic):

Tamaño de RFQTiempo de ensamblaje
10 líneas0.004s
25 líneas0.001s
50 líneas0.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:

FrameworkInstalaciónEjemplo
Claude (integrado)pip install electronics-rfq-agent-cli01-basic-quote
LangGraphpip install 'electronics-rfq-agent-cli[langgraph]'04-langgraph-agent
OpenAI Agents SDKpip install electronics-rfq-agent-cli[agents]05-openai-agents
CrewAIpip 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