Catálogo canônico de serviços¶
Fonte e escopo¶
src/core/domain/services.py contém ServiceName, REQUIRED_FIELDS, conditional_required_fields() e missing_required_fields(). São 15 nomes canônicos, usados pelo JSON do agente e pelos payloads comerciais. ServiceName é uma classe de constantes string, não um enum Python. Maiúsculas/minúsculas e underscores fazem parte do contrato.
Todos são qualificados pelo agente Qualificação. A tabela identifica a frente de uso indicada pelos prompts/KB; o catálogo Python não impõe uma matriz de serviço × segmento. segment vem da Triagem (AGRO, HUMANO, PESQUISA, ANIMAL), de modo que “geral” abaixo não é um valor do enum.
Serviços e campos completos¶
| Nome canônico | Frente/segmento no contexto | Campos sempre obrigatórios | Campos condicionais | Regra relevante de prompt/conhecimento |
|---|---|---|---|---|
qPCR |
Geral, Agro, Pesquisa; Animal conforme contexto | microrganismo_alvo, tipo_amostra, quantidade_amostras, quantidade_alvos, urgencia |
Nenhum no catálogo | Verificar alvo em TARGETS_QPCR; kits externos encaminhados; processo Clicksign quando aplicável |
Identificacao_Molecular |
Geral, Agro/Pesquisa | nivel_analise, amostra_isolada, quantidade_amostras, urgencia |
Nenhum | Prompt pede amostra isolada; false é valor presente para o validator, não aprovação técnica |
Microbioma |
Geral, Agro/Pesquisa conforme origem | tipo_analise, alvos, formato_entrega, tipo_amostra, quantidade_amostras |
Nenhum | Serviço de bancada; análise avulsa de dados brutos deve ir ao especialista; quantitativo pode exigir aceite formal |
Genoma_Completo |
Geral, Agro/Pesquisa | tipo_organismo, amostra_tipo |
Nenhum | Tipos de organismo/entrega e limites em GENOME_SIZES |
Sanger |
Geral/Pesquisa | tipo_amostra, fitas, primer, quantidade_amostras |
Nenhum | Distinguir fita e primer; disponibilidade em PRIMERS_SANGER |
Metagenoma_Shotgun |
Geral, Agro/Pesquisa | tipo_amostra |
Nenhum | Diferenciar objetivo e entrega de Microbioma |
Viroma |
Geral, Agro/Pesquisa | tipo_virus, tipo_amostra |
Nenhum | Conhecimento específico sobre material e escopo |
RNAseq |
Geral/Pesquisa | tipo_amostra, condicoes_fisiologicas, quantidade_amostras |
Nenhum | Condições comparadas integram qualificação |
Expressao_Genica |
Geral/Pesquisa | genes_alvo, quantidade_alvos, condicoes_fisiologicas, primers_validados |
Nenhum | Situação dos primers precisa ser levantada |
Padronizacao_qPCR |
Geral, Agro/Pesquisa | genoma_disponivel |
Nenhum | CUSTOM_DEVELOPMENT explica padronização e escopo sob medida |
Sintese_Primers |
Geral/Pesquisa | sequencia_primer, tamanho_fragmento |
Nenhum | Contexto de desenvolvimento/primers; não inventar sequência |
Genotipagem |
Geral, Agro/Pesquisa | modalidade |
literatura_previa se modalidade=pcr_eletroforese |
Modalidade corrida_fragmentos é distinta; desenvolvimento de novos marcadores vai a especialista |
Microbioma_Intestinal |
GoYou / HUMANO | tipo_profissional |
instagram_profissional, clientes_por_semana se nutricionista |
GOGENETIC_YOU, limites clínicos e privacidade |
Microbioma_Vaginal |
GoYou / HUMANO | tipo_profissional |
Mesmos dois campos se nutricionista | GOGENETIC_YOU; sem diagnóstico/prescrição |
Painel_Nutrigenetico |
GoYou / HUMANO | tipo_profissional |
Mesmos dois campos se nutricionista | GOGENETIC_YOU; sem recomendação individual de dieta/tratamento |
Nomes de plataformas, packages e linhas comerciais não são automaticamente serviços canônicos. GoSolos, Desenvolvimento Customizado, Kit qPCR e Microbioma Quantitativo podem aparecer no conhecimento, mas não são entradas adicionais de REQUIRED_FIELDS; é necessário mapear a necessidade ou encaminhá-la conforme o prompt.
Validação programática¶
missing_required_fields(
"Genotipagem",
{"modalidade": "pcr_eletroforese"},
)
# frozenset({"literatura_previa"})
Com literatura_previa=False, o campo está presente; o código não exige True. Para serviço GoYou, a comparação com tipo_profissional="nutricionista" é literal. Variações de caixa/acentuação não são normalizadas por essa função. Valores ausentes, None, strings vazias/brancas e coleções vazias falham; 0 e False contam como presentes.
missing_required_fields() retorna conjunto vazio para serviço desconhecido porque o chamador o trata antes por is_known_service(). Não use essa função isoladamente como prova de que um serviço é válido. No dispatcher, serviço desconhecido gera handoff; campo faltante mantém QUALIFYING; completo leva a Coleta.
Exemplo de contrato completo e limite¶
{"s":2,"servico":"Genotipagem","qualification_data":{"modalidade":"pcr_eletroforese","literatura_previa":false}}Registrei a modalidade e a situação da literatura prévia.
O exemplo satisfaz presença de campos. A aptidão técnica do projeto ainda depende de regras de agente/especialista. O catálogo não faz validação de alvo biológico, enum de modalidade, quantidade positiva, sequência de nucleotídeos ou compatibilidade científica entre campos.
Testes e evolução¶
tests/unit/domain/test_services.py verifica nomes, ausência de campos, condicionais e booleanos. tests/unit/application/test_action_mapping.py verifica bloqueio de avanço incompleto. O prompt gera a lista de campos automaticamente por _service_table(), mas condicionais e orientações técnicas adicionais também exigem atualização do texto quando mudam.
Para novo serviço: acrescente nome/campos, defina condicionais, revise KB e prompt, crie um teste com um campo faltante e outro completo, teste encadeamento e registre fixture fictícia. Altere também o comportamento comercial quando propriedades/reporting dependem do serviço. Veja tutorial de adição, Qualificação e Context Packages.