Electronics RFQ Agent

Agente de cotação por IA para distribuidores de eletrônicos — RFQ entra, cotação sai via ferramentas MCP

Documentação

Electronics RFQ Agent

Seus engenheiros de vendas gastam de 2 a 4 horas transformando documentos de RFQ em cotações. Isso faz em segundos.

Electronics RFQ Agent é uma biblioteca Python e CLI que lê documentos de RFQ (PDF, Excel, Word), consulta cada item de linha no catálogo do seu ERP e gera um rascunho de cotação. Ele se conecta a SAP, Epicor, Oracle e Microsoft Dynamics por meio de servidores MCP, funcionando com Claude, GPT-4 ou qualquer framework de agente que fale 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

Sumário

Instalação

pip install electronics-rfq-agent-cli
# or
uv add electronics-rfq-agent-cli

Para instalar a partir do código-fonte:

git clone https://github.com/RudrenduPaul/electronics-rfq-agent
cd electronics-rfq-agent
pip install -e .
# or, with uv:
uv sync

A análise de documentos de RFQ (PDF, Excel, Word) chama a API da Anthropic, então defina ANTHROPIC_API_KEY antes de executar qualquer coisa que toque em um documento real:

export ANTHROPIC_API_KEY="sk-ant-..."

Você não precisa dessa chave para executar erfa audit em um arquivo de cotação existente, nem para explorar a CLI com --help. Somente a análise de documentos chama o Claude.

O problema que isso resolve

Trabalhávamos com distribuidores de eletrônicos que tinham de 3 a 5 engenheiros de vendas gastando a maior parte do dia na entrada de cotações. Toda ferramenta que encontrávamos estava amarrada a um ERP específico ou exigia um projeto de integração de 6 meses. Queríamos algo que funcionasse com o que os distribuidores já tinham, pudesse ser auto-hospedado (dados de cotação são sensíveis) e fosse realmente extensível.

A arquitetura MCP significa que adicionar um novo ERP é escrever um único arquivo. O parser lida com os formatos de documento que os distribuidores realmente enviam: PDFs preenchidos à mão, planilhas Excel com várias abas e, ocasionalmente, tabelas escaneadas.

Início rápido

Nenhum sistema ERP é necessário para testar; o backend simulado vem com 200 peças eletrônicas realistas. Você precisa definir ANTHROPIC_API_KEY, já que a análise do documento de RFQ ainda é uma chamada real ao 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())

O MockERP aplica faixas de preço baseadas em quantidade automaticamente: qtd >= 1000 ganha 20% de desconto, qtd >= 100 ganha 10%, qtd >= 10 ganha 5%. O preço de tabela se aplica abaixo de qtd 10. Isso reflete o preço por volume do mundo real, para que benchmarks e testes de integração reflitam curvas de custo realistas.

Conecte-se a um 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 traz dois subcomandos. Cada flag abaixo é extraída diretamente de erfa --help.

ComandoArgumentosFlagsO que faz
erfa quoterfq (caminho, obrigatório)--mock, --margin <float> (padrão 0.15), --output/-o <path>Analisa um arquivo de RFQ e imprime um rascunho de cotação. Precisa de ANTHROPIC_API_KEY; a análise sempre passa pelo Claude, --mock apenas troca o backend do ERP.
erfa auditquote_file (caminho, obrigatório)nenhumaImprime um relatório de auditoria completo (encontrado / substituído / não encontrado, taxa de preenchimento) para um arquivo JSON de cotação salvo com erfa quote --output. Lê apenas um arquivo local, sem necessidade de chave de API.
erfa mcpnenhumnenhumaInicia um servidor MCP stdio expondo quote_rfq, lookup_part e audit_quote como ferramentas tipadas, para que qualquer agente compatível com MCP (Claude, GPT-4, Gemini) possa chamá-las diretamente sem usar a CLI. Aponte a configuração do seu cliente MCP para 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

Exemplo de saída de auditoria (saída real de erfa audit docs/example-quote.json, gerada executando a lógica de preços do ERP simulado contra o RFQ de exemplo em 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)

Peças com preço zero: Se uma peça existe no catálogo do ERP, mas tem preço unitário de $0,00, o agente cotiza $0 em vez de pular a linha, e define line.notes com uma mensagem sinalizando o preço zero para você perceber antes de cotar o cliente. Verifique line.notes para qualquer linha encontrada ou substituída antes de enviar uma cotação.

Referência da API

A referência completa está em docs/api.md: cada parâmetro de QuoteAgent, a interface compartilhada do conector ERP, Quote/QuoteLineItem campo por campo e a hierarquia de exceções. As exportações abaixo são o que from electronics_rfq_agent import ... realmente oferece, extraídas de src/electronics_rfq_agent/__init__.py, não adivinhadas:

ExportaçãoO que é
QuoteAgentOrquestra análise + consulta ERP + montagem da cotação. run() (assíncrono) e run_sync().
EpicorMCP, SAPMCP, OracleMCP, DynamicsMCPConectores ERP, um por sistema suportado. Todos implementam a mesma interface search_parts / get_part / get_price / check_inventory.
MockERP (de electronics_rfq_agent.mcp.mock)Backend em memória com 200 peças realistas. Sem credenciais, sem rede.
Quote, QuoteLineItem, RFQLineItem, ERPPartResult, ERPConfigModelos Pydantic v2 para a cotação, cada linha, a linha de RFQ analisada, dados brutos do ERP e configuração do conector.
ERPConnectionError, RFQParseErrorAs duas exceções que QuoteAgent pode levantar: falhas de conexão/autenticação e documentos não analisáveis. Falhas de ERP por linha não levantam exceção; elas vão para line.notes.
TelemetryCollector, TelemetryEventTelemetria local opcional (telemetry=True em QuoteAgent), apenas contagens e tempos, sem conteúdo de RFQ.

Como difere das alternativas

Electronics RFQ AgentProcesso manualSAP JouleIA genérica (ChatGPT)
Suporte multi-ERPSAP + Epicor + Oracle + DynamicsN/ACentrado em SAP (Joule Studio pode alcançar fontes não-SAP via SAP Integration Suite)Sem acesso a ERP
Tempo de cotação (50 linhas)~15s2-4 horasNão documentado publicamenteN/A
Auto-hospedávelSimN/ANão (serviço em nuvem SAP BTP)Não
Dados permanecem locaisSimSimNãoNão
Código abertoMITN/ANãoNão
Backend simulado para devSimN/ANão documentado publicamenteN/A
Compatível com MCPSimN/ANão documentado publicamenteNão

Suporte a ERP

ERPStatusConexãoDocs
Epicor KineticSuportadoAPI RESTConfiguração
SAP ECC / S/4HANABeta (instalação manual)PyRFC (BAPI)Configuração
Oracle Cloud SCMSuportadoAPI RESTConfiguração
Microsoft Dynamics 365SuportadoGraph APIConfiguração
Backend simuladoIntegradoEm memóriaSem configuração necessária

Nota sobre SAP: pyrfc requer a SAP NetWeaver RFC Library, que não está no PyPI e deve ser baixada manualmente do portal de suporte da SAP (requer usuário S). Veja docs/erp-setup/sap.md para instruções passo a passo.

Benchmarks

Medidos usando o backend simulado em memória (200 peças realistas, sem necessidade de sistema ERP). Execute você mesmo:

git clone https://github.com/RudrenduPaul/electronics-rfq-agent
cd electronics-rfq-agent
uv run python benchmarks/run.py

Latência de consulta ERP (100 consultas individuais, backend simulado):

P50P99Média
0,00025ms0,0023ms0,00032ms

Tempo de montagem de cotação por tamanho de RFQ (parser simulado, sem chamada à API Anthropic):

Tamanho do RFQTempo de montagem
10 linhas0,004s
25 linhas0,001s
50 linhas0,001s

Esses números cobrem apenas consulta ERP e montagem de cotação. O parser de RFQ é simulado e nenhuma chamada à API Anthropic é feita. Em produção, a análise de documentos por IA adiciona 5-15s por documento e consultas reais ao ERP adicionam 100-500ms por linha (paralelizadas em até max_concurrent=10), dando um total realista de ~15s para um RFQ de 50 linhas. Linha de base manual: 2-4 horas.

Matriz de integração

Electronics RFQ Agent funciona com qualquer framework de agente que suporte MCP:

FrameworkInstalaçãoExemplo
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

Experimente no 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

Seus dados de cotação nunca saem do seu ambiente.

Segurança

  • Varredura de vulnerabilidades: Trivy varre cada execução de CI (severidade HIGH/CRITICAL, build falha em achados não corrigidos), resultados enviados à aba de Segurança do GitHub.
  • Assinatura de releases: o workflow de release assina wheels e sdists construídos com Sigstore e anexa um SBOM CycloneDX a cada Release do GitHub quando uma versão é marcada.
  • Fixação de dependências: Dependabot mantém GitHub Actions e dependências Python atualizadas (atualizações semanais de patch, atualizações mensais de Actions).
  • Divulgação: SECURITY.md. Reporte vulnerabilidades privadamente por e-mail ou GitHub Security Advisories; reconhecimento em 48 horas, divulgação responsável em 90 dias.

FAQ

O que Electronics RFQ Agent realmente faz? Ele pega um documento de RFQ (PDF, Excel ou Word) de um cliente, extrai cada item de linha com Claude, consulta cada peça no catálogo do seu ERP por meio de um conector MCP e retorna um rascunho de cotação com preço e margem aplicada. Um engenheiro de vendas revisa e envia em vez de construir do zero.

Está pronto para produção? Está em Beta (v0.2.x). A biblioteca principal, os conectores Epicor, Oracle e Dynamics são cobertos por CI (lint, mypy strict, pytest com gate de cobertura de 80%, varredura Trivy) em Python 3.10-3.12. O suporte a SAP é explicitamente marcado como Beta e requer instalação manual (a SAP NetWeaver RFC Library não está no PyPI).

Preciso de um sistema ERP para testar? Não. MockERP vem com 200 peças eletrônicas realistas e aplica faixas de preço baseadas em quantidade, então você pode executar o fluxo completo de análise-consulta-cotação sem credenciais de ERP. Você ainda precisa de ANTHROPIC_API_KEY, já que a análise de documentos é uma chamada real ao Claude. Apenas erfa audit (ler um arquivo de cotação já salvo) funciona sem chave alguma.

Como isso é diferente de pedir ao ChatGPT para ler o RFQ? Um modelo de chat genérico pode ler um documento e até chutar preços, mas não tem conexão com seu catálogo ERP real, inventário ou preços contratuais, então está inventando números. Electronics RFQ Agent consulta cada item de linha contra seus dados reais de catálogo e só cotiza o que está realmente em estoque ao preço de custo real mais sua margem configurada.

Como isso é diferente do SAP Joule? Joule é o conjunto de assistentes de IA proprietário da SAP, integrado à plataforma em nuvem da SAP (SAP BTP) e centrado em dados SAP. Electronics RFQ Agent é licenciado sob MIT, auto-hospedado e funciona com SAP, Epicor, Oracle e Dynamics pela mesma interface MCP. Seus dados de cotação nunca precisam sair do seu ambiente, e você não fica preso a um único fornecedor de ERP.

Como chamo isso de um agente em vez da CLI? Execute erfa mcp para iniciar um servidor MCP stdio expondo quote_rfq, lookup_part e audit_quote como ferramentas tipadas. Aponte qualquer cliente compatível com MCP (Claude, GPT-4, Gemini ou um framework de agente personalizado) para erfa mcp como comando de inicialização, e ele pode chamar essas ferramentas diretamente com JSON estruturado de entrada e saída, sem precisar analisar saída de CLI.

Quais formatos de documento ele analisa? PDF (incluindo tabelas escaneadas, via capacidade de visão do Claude), Excel (.xlsx/.xls, procura em todas as planilhas pela linha de cabeçalho dos itens) e Word (.docx, lê todas as tabelas). RFQs em texto puro também funcionam.

O que acontece com um item de linha que não está no catálogo do ERP? Ele é marcado como not_found com uma nota explicando o motivo (em vez de ser silenciosamente descartado ou chutado), e é excluído do total da cotação. Execute erfa audit no JSON da cotação salva para ver exatamente quais linhas foram encontradas, substituídas ou ausentes, e por quê. Posso usar isso comercialmente? Sim. É licenciado sob MIT, então você pode usá-lo, modificá-lo e distribuí-lo comercialmente sem royalties e sem obrigação de abrir o código das suas alterações. A atribuição por meio do arquivo de licença é tudo o que é necessário.

Meus dados de RFQ e preços são enviados para algum lugar além da Anthropic? Apenas o conteúdo do documento de RFQ vai para a API da Anthropic para análise. As consultas ao ERP vão diretamente da sua máquina para o seu sistema ERP por meio do conector que você configura: não há serviço intermediário, e nada é armazenado fora do seu ambiente, a menos que você opte por persistir o JSON da cotação por conta própria.

Isso é publicado no PyPI? Sim, como electronics-rfq-agent-cli (pip install electronics-rfq-agent-cli). O pipeline de publicação (build, assinatura Sigstore, SBOM, upload via editor confiável) fica em .github/workflows/release.yml e é executado a cada push de tag v*. O caminho de importação em Python (electronics_rfq_agent) e o comando CLI erfa permanecem inalterados; apenas o nome do pacote voltado para o registro carrega o sufixo -cli, seguindo a convenção de nomenclatura deste mantenedor para ferramentas de CLI.

Contribuindo

  • Leia CONTRIBUTING.md antes de abrir um PR
  • Boas primeiras issues estão marcadas no GitHub
  • Os adaptadores de ERP ficam em electronics_rfq_agent/mcp/; cada um é um arquivo autocontido, sem alterações no núcleo
  • Todos os PRs exigem 80% de cobertura de testes

Discussões no GitHub: Faça perguntas, compartilhe ideias Discord: em breve

Documentação completa: Começando · Referência da API · Configuração de ERP: Epicor · SAP · Oracle · Dynamics 365 · Changelog

MIT. Contribuições são bem-vindas.

Licença

MIT. Veja LICENSE.

Cite este trabalho

Se você usar o Electronics RFQ Agent em pesquisas, por favor cite:

@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}
}

Construído por Rudrendu Paul e Sourav Nandy