Monorepo para uma proposta de biblioteca de prompts em .NET baseada em Git como source of truth, NuGet como unidade de distribuição e boundaries explícitos entre catálogo, runtime e transporte de provider.
O repositório implementa dois pacotes principais:
DevComputaria.PromptKit: runtime agnóstico de domínio e de provider.DevComputaria.Prompts: catálogo packed com prompts versionados e embedded resources.
O desenho arquitetural segue os ADRs ADR-001, ADR-002 e ADR-003.
Esta biblioteca existe para resolver um problema comum em integrações com LLM: o prompt costuma ficar espalhado no código de domínio, acoplado ao client HTTP do provider, sem versionamento claro, sem rollback previsível e sem contrato explícito de saída.
A proposta deste repositório é separar responsabilidades:
- o texto do prompt vive versionado no Git;
- o catálogo é empacotado e distribuído via NuGet;
- o runtime resolve, compõe, valida e renderiza prompts;
- o transporte para o provider fica fora deste repo, em uma biblioteca vizinha como
Dev.AI.
Na prática, isso permite:
- evoluir prompts sem republicar bibliotecas de domínio desnecessariamente;
- pinar versões explícitas de prompt em produção;
- reproduzir comportamento por
prompt.id,prompt.versioneprompt.sha256; - reduzir drift entre times e consumidores.
O modelo adotado usa quatro papéis distintos:
| Papel | Responsabilidade |
|---|---|
DevComputaria.Prompts |
empacotar YAML, aliases e referências de schema |
DevComputaria.PromptKit |
abstrações, renderização, composição, validação e hash |
Dev.AI |
transporte para provider LLM |
| libs de domínio | caso de uso, DTOs e orquestração de negócio |
- Git é a fonte da verdade para prompts, schemas e evals.
- Production não lê prompt do disco nem busca conteúdo remoto em runtime.
- PromptKit não conhece provider e não faz HTTP.
- Domínio não carrega string solta de prompt como contrato principal.
- Alias não substitui pin explícito em caminho crítico de produção.
Biblioteca de runtime responsável por:
- contratos públicos como
PromptId,PromptSpec,PromptArgs,RenderedPrompteRenderedMessage; - interfaces como
IPromptCatalog,IPromptRenderer,IPromptComposereIPromptSanitizer; - composição de fragmentos compartilhados;
- validação de variáveis;
- renderização segura;
- geração de hash determinístico;
- integração futura com DI e observabilidade.
Restrições explícitas:
- sem SDK de provider;
- sem HTTP;
- sem regra de negócio;
- sem acoplamento direto à árvore física de
prompts/.
Biblioteca de catálogo responsável por:
- empacotar
prompts/**/*.yamlcomoEmbeddedResource; - carregar
catalog.yaml; - resolver aliases e versões;
- hidratar
PromptSpecpara o runtime; - expor registro pronto para consumo via DI.
Restrições explícitas:
- sem lógica de domínio;
- sem provider;
- sem execução de evals em runtime.
O fluxo de uso pretendido é:
- a lib de domínio define um
PromptIdpinado; - o runtime resolve e renderiza o prompt;
- o resultado vira um
RenderedPromptcom mensagens e metadados; - uma biblioteca externa de transporte envia isso ao provider.
Exemplo conceitual:
private static readonly PromptId AnalyzeDocument =
new("image-analysis.analyze-document", "1.0.0");
var rendered = await promptRenderer.RenderAsync(
AnalyzeDocument,
new PromptArgs(new Dictionary<string, object?>
{
["document_type"] = "identity-card",
["country"] = "BR",
["ocr_text"] = ocrText
}));O objeto renderizado é o contrato que segue adiante para o client do provider. O domínio continua limpo; o runtime continua neutro. Todo mundo feliz, inclusive o futuro rollback.
O repositório adota duas camadas de versão:
Cada prompt possui identidade canônica:
- path:
prompts/{domain}/{slug}/{semver}.yaml - id:
{domain}.{slug}
Exemplo:
- arquivo:
prompts/image-analysis/analyze-document/1.0.0.yaml - id lógico:
image-analysis.analyze-document
Regras de evolução:
- PATCH: ajustes textuais sem quebra de contrato;
- MINOR: adição compatível, como variável opcional ou include novo;
- MAJOR: quebra de contrato, como variável obrigatória nova ou schema de saída incompatível.
O pacote DevComputaria.Prompts versiona o lote publicado.
- PATCH/MINOR: crescimento compatível do catálogo;
- MAJOR: remoção de versão pinável, quebra de loader ou quebra contratual do pacote.
Regras importantes:
- artefato publicado é imutável;
- mudança de prompt publicado gera arquivo novo, nunca edição no lugar;
- produção deve pinar pacote + prompt + referências relevantes.
DevComputaria.Prompting/
├── Directory.Build.props
├── Directory.Packages.props
├── global.json
├── nuget.config
├── version.json
├── DevComputaria.Prompting.sln
├── DevComputaria.Prompting.slnx
├── README.md
├── CHANGELOG.md
├── LICENSE
│
├── schemas/
│ ├── prompt.schema.json
│ ├── catalog.schema.json
│ └── output/
│ └── image-analysis-document-v1.json
│
├── prompts/
│ ├── catalog.yaml
│ ├── _shared/
│ │ └── json-only.yaml
│ └── image-analysis/
│ └── analyze-document/
│ └── 1.0.0.yaml
│
├── evals/
│ └── image-analysis.analyze-document/
│ └── 1.0.0.cases.json
│
├── src/
│ ├── DevComputaria.PromptKit/
│ └── DevComputaria.Prompts/
│
├── tests/
│ ├── DevComputaria.PromptKit.Tests/
│ ├── DevComputaria.Prompts.Tests/
│ └── DevComputaria.Prompts.Contract.Tests/
│
├── samples/
│ └── Consumer.ImageAnalysis/
│
├── tools/
│ ├── DevComputaria.Prompts.Cli/
│ └── DevComputaria.Prompts.SourceGen/
│
├── docs/
│ ├── ADR/
│ ├── PRD/
│ ├── plan/
│ └── task/
│
└── .github/
└── workflows/
├── validate-prompts.yml
├── pack-promptkit.yml
└── pack-prompts.yml
DevComputaria.Prompting.slnDevComputaria.Prompting.slnx
O modelo foi desenhado para tratar prompt como contrato versionado, não como string incidental.
Isso implica:
- testes de runtime em
DevComputaria.PromptKit.Tests; - testes de empacotamento em
DevComputaria.Prompts.Tests; - testes de contrato em
DevComputaria.Prompts.Contract.Tests; - validação de consistência de
catalog.yaml; - observabilidade via
prompt.id,prompt.versioneprompt.sha256.
Os testes de contrato são parte da governança de publish: se o contrato quebra, o pacote não deveria seguir adiante.
docs/ADR/ADR-001-devcomputaria-prompt-catalog.mddocs/ADR/ADR-002-catalog-versioning-rules.mddocs/ADR/ADR-003-repository-layout-and-packaging-boundaries.md
docs/PRD/PRD-DevComputaria.Prompting.mddocs/plan/DESIGN-prompt-catalog.mddocs/plan/PLAN-src-tests.mddocs/CONVENTIONS-prompt-catalog.mddocs/INDEX.md
CHANGELOG.md
DevComputaria.Prompting é uma proposta de biblioteca para transformar prompts em artefatos versionados, auditáveis e distribuíveis, com separação clara entre:
- catálogo;
- runtime;
- transporte;
- domínio.
O objetivo não é só “guardar prompts”, mas oferecer um contrato operacional robusto para uso real em produção .NET.