Pular para conteúdo

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.