Skip to content

feat: add prompt caching to generate_tests.py#106

Open
rviannaoliveira wants to merge 1 commit intomainfrom
feat/prompt-caching-generate-tests
Open

feat: add prompt caching to generate_tests.py#106
rviannaoliveira wants to merge 1 commit intomainfrom
feat/prompt-caching-generate-tests

Conversation

@rviannaoliveira
Copy link
Copy Markdown
Contributor

Summary

  • Move static system prompt (project context + test requirements) to a system block with cache_control: ephemeral
  • Only the per-file content (package, class name, source code) stays in the messages array
  • Removes the now-unused build_prompt function

How it works

1st call:  [system prompt ~300 tokens] ← paid normally, then CACHED
           [file content ~150 tokens]  ← paid normally

2nd–Nth:   [system prompt ~300 tokens] ← paid at ~10% (cache hit)
           [file content ~150 tokens]  ← paid normally

With 8 files: ~70% cheaper on the cached tokens compared to the previous single-prompt approach.

Notes

  • Cache TTL is 5 minutes — all files in a batch share the same cached block
  • No behavior change: same model, same requirements, same output format

🤖 Generated with Claude Code

Move static system prompt to a cached `system` block using
`cache_control: ephemeral`, so Claude caches project context
and requirements across all API calls in a batch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor Author

@rviannaoliveira rviannaoliveira left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review — feat: add prompt caching to generate_tests.py

Regras arquiteturais ✅

Mudança restrita a .github/scripts/generate_tests.py (CI tooling). Não toca módulos da lib, nenhuma regra de dependência entre plataformas se aplica.

Completude ✅

Não é um novo componente — sem necessidade de registrar builder, cobrir onAction ou adicionar model no craftd-core.

Implementação ✅

A separação está correta:

  • _SYSTEM_PROMPT é constante de módulo (estática, compartilhada entre chamadas) → candidata ao cache.
  • Conteúdo dinâmico por arquivo (package_name, class_name, source) permanece no messages → correto, não pode ser cacheado.
  • cache_control: {"type": "ephemeral"} no bloco system está na posição certa.
  • Remoção de build_prompt limpa o código sem perda de funcionalidade.
  • A assinatura de call_claude melhora: recebe os dados brutos em vez de uma string já montada, deixando a responsabilidade de formatação encapsulada na função.

Testes ✅

Script de automação de CI — sem expectativa de teste unitário para o próprio script.

Docs ✅

Sem mudança no comportamento público da lib. Nenhuma atualização de docs/how-to-use/ necessária.

Observação importante

O PR description menciona "~300 tokens" para o system prompt. O mínimo para ativar prompt caching com Haiku é 2 048 tokens (com Sonnet/Opus são 1 024). O prompt atual provavelmente não atinge esse limiar — o cache_control será aceito sem erro, mas o cache não será criado e não haverá economia real de custo.

Recomendo verificar o tamanho real (ex: client.beta.messages.count_tokens) e, se necessário, enriquecer o system prompt com mais contexto do projeto (convenções de nomenclatura, exemplos de testes existentes, etc.) até ultrapassar o mínimo de 2 048 tokens para que o caching seja efetivo.

Fora esse ponto, a implementação está correta, bem descrita e o diff é enxuto. LGTM com a ressalva acima.

@github-actions
Copy link
Copy Markdown
Contributor

🦙 MegaLinter status: ⚠️ WARNING

Descriptor Linter Files Fixed Errors Warnings Elapsed time
⚠️ KOTLIN detekt yes 189 no 5.01s
⚠️ MARKDOWN markdown-table-formatter 45 1 0 0.29s
⚠️ YAML prettier 18 1 4 0.85s

See detailed report in MegaLinter reports

You could have the same capabilities but better runtime performances if you use a MegaLinter flavor:

MegaLinter is graciously provided by OX Security

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.

1 participant