Skip to content

Dica de dataframeit[all] só para provider cujo pacote está no extra - #304

Open
bdcdo wants to merge 2 commits into
mainfrom
fix/dica-extra-all-por-provider
Open

bdcdo wants to merge 2 commits into
mainfrom
fix/dica-extra-all-por-provider

Conversation

@bdcdo

@bdcdo bdcdo commented Oct 29, 2026

Copy link
Copy Markdown
Owner

Quando falta o pacote LangChain de um provider, validate_provider_dependencies sugeria pip install langchain-<provider> e, como alternativa, pip install dataframeit[all], para todo provider. O extra all só traz langchain-google-genai, langchain-openai, langchain-anthropic e langchain-groq; para mistralai, cohere, bedrock, google_vertexai e qualquer outro provider LangChain, instalar dataframeit[all] não resolve, e a mesma mensagem volta.

O que muda:

  • _all_extra_packages() lê importlib.metadata.requires("dataframeit"), filtra os requisitos com o marcador extra == "all" e devolve os nomes normalizados (PEP 503). A dica de dataframeit[all] só sai quando o pacote de instalação do provider está nesse conjunto. azure_openai, que usa langchain-openai, continua com a dica.
  • Sem os metadados (PackageNotFoundError, como ao rodar o fonte sem instalar), o conjunto é vazio e a dica não sai: sem saber o que o extra traz, sugeri-lo poderia mandar instalar algo que não resolve.
  • As mensagens de langchain e langchain-core ausentes ficam como estão: os dois são dependências obrigatórias, e dataframeit[all] os instala.

Testes novos em tests/test_erros_de_provider.py: a dica para openai e azure_openai (com) e para mistralai, cohere e bedrock (sem); o fallback sem metadados; e a comparação do conjunto lido dos metadados com project.optional-dependencies.all do pyproject.toml, parseado com packaging, para que os dois não divirjam.

A FAQ (docs/guides/faq.md e docs/en/guides/faq.md) passa a dizer que a mensagem sugere o all só quando o pacote está nele, e só o langchain-<provider> para os providers sem extra próprio.

Closes #279

A mensagem de pacote ausente sugeria dataframeit[all] para todo provider
do LangChain, mas o extra só traz os providers com extra próprio. Para
mistralai, cohere, bedrock e google_vertexai a sugestão não resolvia.
A lista de pacotes do extra sai dos metadados do pacote instalado, e um
teste a compara com o pyproject.toml; sem metadados, a dica não sai (#279).
@bdcdo

bdcdo commented Oct 29, 2026

Copy link
Copy Markdown
Owner Author

Bloco de evidência

Caso concreto na base (origin/main, ec332656)

Caso mínimo da issue, ampliado com bedrock e google_vertexai, num ambiente com dataframeit[all] (uv run --extra dev --extra all python caso.py):

extra all: ['claude-agent-sdk>=0.1.48', 'langchain-anthropic>=0.3.21', 'langchain-exa>=1.0.0', 'langchain-google-genai>=2.1.11', 'langchain-groq>=1.0.0', 'langchain-openai>=0.3.34', 'langchain-tavily>=0.2.12', 'openpyxl>=3.1', 'polars>=1.10', 'pyarrow>=10.0.1']
mistralai: langchain_mistralai instalado? False
  sugestões: ['pip install langchain-mistralai', 'pip install dataframeit[all]']
cohere: langchain_cohere instalado? False
  sugestões: ['pip install langchain-cohere', 'pip install dataframeit[all]']
bedrock: langchain_aws instalado? False
  sugestões: ['pip install langchain-aws', 'pip install dataframeit[all]']
google_vertexai: langchain_google_vertexai instalado? False
  sugestões: ['pip install langchain-google-vertexai', 'pip install dataframeit[all]']

O mesmo caso no ramo (3294a5d7)

mistralai: langchain_mistralai instalado? False
  sugestões: ['pip install langchain-mistralai']
cohere: langchain_cohere instalado? False
  sugestões: ['pip install langchain-cohere']
bedrock: langchain_aws instalado? False
  sugestões: ['pip install langchain-aws']
google_vertexai: langchain_google_vertexai instalado? False
  sugestões: ['pip install langchain-google-vertexai']

Casos cobertos

Caso Esperado Base Ramo
openai sem langchain_openai langchain-openai e dataframeit[all] passa passa
azure_openai sem langchain_openai langchain-openai e dataframeit[all] passa passa
google_genai sem o pacote (teste existente em test_codex.py) langchain-google-genai e dataframeit[all] passa passa
mistralai sem o pacote só langchain-mistralai reprova passa
cohere sem o pacote só langchain-cohere reprova passa
bedrock sem o pacote só langchain-aws reprova passa
metadados ausentes (PackageNotFoundError), openai só langchain-openai reprova passa
conjunto lido dos metadados == optional-dependencies.all do pyproject.toml (via packaging) iguais reprova (função não existe) passa
langchain / langchain-core ausentes (testes existentes) mantêm dataframeit[all] passa passa

Mutação: trocar o filtro if match and _EXTRA_ALL_MARKER.search(marker): por if match: (o parser passa a contar as dependências obrigatórias e os outros extras) reprova o teste de comparação com o pyproject.toml (1 failed, 6 passed); o arquivo foi restaurado e a suíte do módulo voltou a 28 passed.

Suíte

Comando: uv run --extra dev --extra all --extra search-all --extra polars --extra excel --extra codex pytest -q -p no:cacheprovider --cov=dataframeit --cov-branch --cov-report=term-missing

passados pulados falhas cobertura
base ec332656 2192 0 0 99,96% (codex.py 723-724)
ramo 3294a5d7 2199 0 0 99,96% (codex.py 723-724)

As duas linhas descobertas são o except ImportError do import opcional do openai_codex, que não roda com o extra codex instalado, e aparecem igual na base; errors.py fica em 100% de linhas e ramos. Só com --extra dev (job unit), tests/test_erros_de_provider.py e tests/test_codex.py dão 270 passed. ruff format --check, ruff check, ty check, vulture e deptry src saem com 0 no ramo.

O teste de comparação usa packaging, que chega ao ambiente de teste pelo pytest; o src/ não o importa, e o parser do requisito em errors.py é próprio, para não depender de pacote não declarado.

Risco: baixo, só muda o texto de uma mensagem de erro; desfazer com o revert do squash.

SHA revisado: 3294a5d

@bdcdo

bdcdo commented Oct 29, 2026

Copy link
Copy Markdown
Owner Author

Passada do simplificador de diff

O simplificador de diff passou sobre 3294a5d7 e não fez corte: as normalizações de nome e as guardas or [] e match and ficam, porque protegem nome de provider fora da forma canônica e satisfazem o ty. Suíte na passada: 2199 passados, 0 falhas, cobertura 99,96% com as mesmas codex.py 723-724 da base; ruff format --check, ruff check, ty check e deptry src com 0. O head não mudou.

SHA revisado: 3294a5d

…r-provider

# Conflicts:
#	CHANGELOG.md
#	tests/test_erros_de_provider.py

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Mensagem de dependência ausente sugere dataframeit[all] para Mistral, Cohere e outros providers que não estão no extra

1 participant