v1.9.4 - AI Providers, Model Catalog, Extension Bridge & QA¶
A v1.9.4 é uma release de confiabilidade e integração. Ela não cria um produto novo grande; fecha lacunas de configuração de IA, catálogo de modelos, OpenAI, uso real da IA em Editais/Concursos e ponte da extensão com o site.
Entregas¶
- Configurações de IA com presets Local seguro, IA básica, IA completa e Personalizado.
- Catálogo de modelos Gemini/OpenAI com builtin, cache local e refresh opcional.
- OpenAI como provider real no backend local.
- Gemini/OpenAI usando o modelo selecionado nos runtimes estruturados.
- Editais/Concursos usando Prompt Registry quando
use_ai=truee fallback local quando provider falha. - Extensão com ação Capturar edital / concurso e payload
kind=public_exam. - Local Companion com
/capture/public-exame/capture/context-summary. - Site importando captura como edital via
/public-exams?capture_id=.... - Contexto seguro do Perfil Universal para extensão, sem perfil completo, memória completa ou API key.
- Testes unitários/mockados e testes externos opt-in por variável de ambiente.
Arquivos centrais¶
modules/ai/model_catalog.py
modules/ai/providers/openai_provider.py
apps/api/services/ai_settings.py
apps/api/routes/settings.py
apps/api/services/extension.py
modules/local_api/app.py
browser-extension/popup.js
apps/web/src/routes/settings.tsx
apps/web/src/routes/sources.tsx
apps/web/src/routes/public-exams.tsx
Regras de segurança preservadas¶
- API key fica no backend local/env local.
- A extensão não lê chave do app.
- A extensão não captura cookies, tokens, sessão, headers ou storage de terceiros.
- Captura de edital vira rascunho revisável.
- Perfil Universal só recebe evidência confirmada manualmente.
- Editais não viram candidatura privada.
- Nenhum fluxo faz inscrição automática, pagamento ou envio de documento.
- O fluxo
/api/v1/sources/authenticated-browser/collectnão foi alterado.
Testes de provider real¶
Use apenas ambiente local:
$env:SOTUHIRE_TEST_GEMINI_API_KEY="..."
pytest -m external_ai
$env:SOTUHIRE_TEST_OPENAI_API_KEY="..."
pytest -m external_ai
No Linux/macOS:
SOTUHIRE_TEST_GEMINI_API_KEY=... pytest -m external_ai
SOTUHIRE_TEST_OPENAI_API_KEY=... pytest -m external_ai
Sem essas variáveis, os testes são pulados.