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.

Sumário
- Instalação
- O problema que isso resolve
- Início rápido
- Comandos
- Referência da API
- Como difere das alternativas
- Suporte a ERP
- Benchmarks
- Matriz de integração
- Experimente no Docker
- Segurança
- FAQ
- Contribuição
- Licença
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.
| Comando | Argumentos | Flags | O que faz |
|---|---|---|---|
erfa quote | rfq (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 audit | quote_file (caminho, obrigatório) | nenhuma | Imprime 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 mcp | nenhum | nenhuma | Inicia 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.notescom uma mensagem sinalizando o preço zero para você perceber antes de cotar o cliente. Verifiqueline.notespara 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ção | O que é |
|---|---|
QuoteAgent | Orquestra análise + consulta ERP + montagem da cotação. run() (assíncrono) e run_sync(). |
EpicorMCP, SAPMCP, OracleMCP, DynamicsMCP | Conectores 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, ERPConfig | Modelos Pydantic v2 para a cotação, cada linha, a linha de RFQ analisada, dados brutos do ERP e configuração do conector. |
ERPConnectionError, RFQParseError | As 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, TelemetryEvent | Telemetria local opcional (telemetry=True em QuoteAgent), apenas contagens e tempos, sem conteúdo de RFQ. |
Como difere das alternativas
| Electronics RFQ Agent | Processo manual | SAP Joule | IA genérica (ChatGPT) | |
|---|---|---|---|---|
| Suporte multi-ERP | SAP + Epicor + Oracle + Dynamics | N/A | Centrado 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) | ~15s | 2-4 horas | Não documentado publicamente | N/A |
| Auto-hospedável | Sim | N/A | Não (serviço em nuvem SAP BTP) | Não |
| Dados permanecem locais | Sim | Sim | Não | Não |
| Código aberto | MIT | N/A | Não | Não |
| Backend simulado para dev | Sim | N/A | Não documentado publicamente | N/A |
| Compatível com MCP | Sim | N/A | Não documentado publicamente | Não |
Suporte a ERP
| ERP | Status | Conexão | Docs |
|---|---|---|---|
| Epicor Kinetic | Suportado | API REST | Configuração |
| SAP ECC / S/4HANA | Beta (instalação manual) | PyRFC (BAPI) | Configuração |
| Oracle Cloud SCM | Suportado | API REST | Configuração |
| Microsoft Dynamics 365 | Suportado | Graph API | Configuração |
| Backend simulado | Integrado | Em memória | Sem 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):
| P50 | P99 | Média |
|---|---|---|
| 0,00025ms | 0,0023ms | 0,00032ms |
Tempo de montagem de cotação por tamanho de RFQ (parser simulado, sem chamada à API Anthropic):
| Tamanho do RFQ | Tempo de montagem |
|---|---|
| 10 linhas | 0,004s |
| 25 linhas | 0,001s |
| 50 linhas | 0,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:
| Framework | Instalação | Exemplo |
|---|---|---|
| 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 |
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