Prompt optimization framework driven by empirical gabaritos.
Project description
Crucible
Crucible é um framework pragmático para otimização empírica de prompts. Ele executa um prompt contra um gabarito versionado, mede qualidade/custo/latência, usa um modelo de raciocínio para diagnosticar falhas, refina o prompt e mantém o melhor prompt encontrado durante a run.
O projeto é local-first: CLI e SDK são as interfaces principais, SQLite guarda o histórico consultável, relatórios são artefatos estáticos, e dashboard/API são interfaces locais opcionais sobre os mesmos dados.
O Que Ele Faz
- Valida prompts contra casos de teste ponderados.
- Otimiza prompts usando um
target_modele umreasoning_model. - Suporta Ollama, OpenAI-compatible APIs, Anthropic, Google, OpenRouter, vLLM, llama.cpp e provider fake para testes.
- Persiste runs em
.crucible/para auditoria, comparação e reprodutibilidade. - Gera relatórios HTML, JSON e PDF.
- Exporta verdicts em CSV/Parquet e o melhor prompt em texto.
- Registra Pareto frontier para otimização qualidade x custo x latência.
- Sugere novos casos de gabarito a partir de falhas, regressões e instabilidade.
- Oferece CLI, SDK Python, dashboard local e REST API.
- Permite assertions e importadores customizados via plugins.
- Inclui scaffold de extensão VSCode.
Quickstart
O fluxo normal não começa otimizando. Primeiro você valida se o prompt, o gabarito e os providers estão funcionando; depois estima custo; só então roda a otimização.
uv sync
uv run crucible init ./my-prompt
uv run crucible validate --prompt ./my-prompt/prompt.txt --gabarito ./my-prompt/gabarito.yaml --config ./my-prompt/config.yaml
uv run crucible estimate-cost --config ./my-prompt/config.yaml
uv run crucible optimize --config ./my-prompt/config.yaml
uv run crucible compare-models --config ./my-prompt/config.yaml
uv run crucible serve
Abra http://127.0.0.1:7777 para inspecionar o histórico local.
O template criado pelo init usa Ollama como modelo alvo e OpenAI como modelo de
raciocínio. Ajuste config.yaml antes de rodar se esses providers não estiverem
disponíveis.
Como Pensar No Fluxo
validate responde: "o prompt atual passa no meu gabarito?".
Ele executa apenas a versão atual do prompt, calcula score e mostra se o setup está correto. Use para depurar gabarito, provider, assertion e formato de saída.
optimize responde: "o Crucible consegue melhorar este prompt?".
Ele executa o prompt, encontra falhas, pede ao reasoning_model um diagnóstico,
gera uma nova versão do prompt e repete até bater threshold, budget ou outro critério
de parada. A run sempre preserva o melhor prompt encontrado, não necessariamente o
último.
compare-models responde: "qual target entrega melhor qualidade, custo e
custo-benefício neste gabarito?". Ele usa comparison_models no config.yaml e
executa uma iteração por modelo, sem refino.
Uso Mínimo Via SDK
from crucible import Gabarito, Optimizer, OptimizationConfig, Prompt
config = OptimizationConfig.model_validate({...})
prompt = Prompt.from_file("prompt.txt")
gabarito = Gabarito.from_yaml("gabarito.yaml")
optimizer = Optimizer(config)
estimate = optimizer.estimate_cost(prompt, gabarito)
run = await optimizer.optimize(prompt, gabarito)
report_path = await optimizer.report(run.id, format="html")
Estado Local
Crucible escreve estado local em .crucible/:
.crucible/crucible.sqlite: índice consultável de runs, iterações e verdicts..crucible/runs/: payloads completos, JSONL de iterações/verdicts e melhor prompt..crucible/reports/: relatórios gerados..crucible/cache/: cache de execuções.
Isso é intencional. Histórico de run é dado de produto, não arquivo temporário.
Use /tmp apenas para execuções descartáveis.
Comandos Comuns
uv run crucible estimate-cost --config ./my-prompt/config.yaml
uv run crucible validate --prompt prompt.txt --gabarito gabarito.yaml --config config.yaml
uv run crucible optimize --config config.yaml
uv run crucible list-runs
uv run crucible show-run --run latest
uv run crucible report --run latest --format html
uv run crucible export --run latest --format csv --output ./verdicts.csv
uv run crucible split-gabarito --gabarito gabarito.yaml --output-dir ./splits
uv run crucible serve
uv run crucible api --port 7788
Documentação
Comece por aqui:
- Índice da documentação
- Quickstart
- Tutorial end-to-end
- Conceitos
- Referência CLI
- Configuração
- Gabaritos e Assertions
- Scoring
- Providers
- SDK Python
- Dashboard
- REST API
- Docker
- Plugins
- Importadores e Exports
- Operação
- Release
- Arquitetura e Implementação
- Decisões Técnicas
- UX e Interfaces
- Desenvolvimento
- Contribuição
- Segurança
Exemplos:
- Projeto básico
- Triagem de suporte
- LLM-as-judge para risco
- Train/val/test
- Saída estruturada com JSON Schema com validação de contrato, payload esperado e comparação campo a campo.
Licença
Crucible é open source sob licença MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file crucible_prompt_ai-0.1.0.tar.gz.
File metadata
- Download URL: crucible_prompt_ai-0.1.0.tar.gz
- Upload date:
- Size: 55.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb260eacd30fa4b13bdc7efa481df79b4b7a3b48837d256820d58901148f3489
|
|
| MD5 |
e01488573b23051f61b822e50f559afd
|
|
| BLAKE2b-256 |
908e4d748c5602f330edd0cb19ddbc067d3c674a6ef881c1c9fd5da0629f454d
|
Provenance
The following attestation bundles were made for crucible_prompt_ai-0.1.0.tar.gz:
Publisher:
publish-python.yml on darcivieira/crucible
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
crucible_prompt_ai-0.1.0.tar.gz -
Subject digest:
bb260eacd30fa4b13bdc7efa481df79b4b7a3b48837d256820d58901148f3489 - Sigstore transparency entry: 1656927407
- Sigstore integration time:
-
Permalink:
darcivieira/crucible@5bfb353e33124daf2f89b60ff25677d2aa80d72c -
Branch / Tag:
refs/tags/0.3.2 - Owner: https://github.com/darcivieira
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-python.yml@5bfb353e33124daf2f89b60ff25677d2aa80d72c -
Trigger Event:
release
-
Statement type:
File details
Details for the file crucible_prompt_ai-0.1.0-py3-none-any.whl.
File metadata
- Download URL: crucible_prompt_ai-0.1.0-py3-none-any.whl
- Upload date:
- Size: 74.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e403cbbf5ecae060a3c5fdcd5d866ac316b70f38ea085687de33a2c8f91e62e6
|
|
| MD5 |
2cb6b2e6d8f60f75686d8ce2686e53bf
|
|
| BLAKE2b-256 |
aab1157af19a736f19632be19ea272a12288bca5a20a12d043065671928ee035
|
Provenance
The following attestation bundles were made for crucible_prompt_ai-0.1.0-py3-none-any.whl:
Publisher:
publish-python.yml on darcivieira/crucible
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
crucible_prompt_ai-0.1.0-py3-none-any.whl -
Subject digest:
e403cbbf5ecae060a3c5fdcd5d866ac316b70f38ea085687de33a2c8f91e62e6 - Sigstore transparency entry: 1656927472
- Sigstore integration time:
-
Permalink:
darcivieira/crucible@5bfb353e33124daf2f89b60ff25677d2aa80d72c -
Branch / Tag:
refs/tags/0.3.2 - Owner: https://github.com/darcivieira
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-python.yml@5bfb353e33124daf2f89b60ff25677d2aa80d72c -
Trigger Event:
release
-
Statement type: