Comprime tokens de prompts usando reescrita generativa com um modelo Ollama local (default: qwen3:8b) para reduzir custo e latencia ao enviar ao Claude. Aceita texto direto, arquivo .txt ou PDF como entrada: extrai o PDF para markdown (via pymupdf4llm), salva o .md ao lado do PDF e comprime o markdown. Use esta skill sempre que o usuario pedir para comprimir/reduzir/economizar tokens E mencionar Ollama, qwen, qwen3, llm local, modelo local, rodar localmente, "sem BERT", ou quiser compressao via LLM generativo em vez de classificador. Tambem use quando o usuario quiser pre-processar contexto localmente (incluindo PDFs) antes de enviar ao Claude usando Ollama. Triggers: "comprimir com ollama", "comprimir localmente", "ollama compress", "qwen3", "qwen", "reescrever com ollama", "resumir com llm local", "compressao generativa", "pdf com ollama", "ler pdf com ollama", "inicializar token-reduce-ollama", "init token-reduce-ollama".
Comprime texto reescrevendo generativamente com um modelo Ollama local. Diferente do LLMLingua-2 (que classifica token a token com BERT/XLM-RoBERTa), aqui um LLM generativo reescreve o texto de forma mais concisa preservando o significado.
Default: qwen3:8b (5 GB, 40K de contexto, PT-BR forte).
sandeco-token-reduce| Aspecto | LLMLingua-2 (BERT) | Ollama (LLM generativo) |
|---|---|---|
| Como funciona | Classifica/mantem tokens exatos | Reescreve o texto |
| Palavras preservadas | Sim (palavras do original) | Nao (pode parafrasear) |
| Fluidez | Menor (texto cortado) | Maior (texto natural) |
| Taxa exata | Sim (controle fino via rate) | Aproximada (LLM nem sempre obedece) |
| Velocidade | Muito rapida (CPU/GPU) | Depende do hardware e do modelo |
| Dependencia | pip: llmlingua |
| Binario Ollama + pip: ollama |
sandeco-token-reduce-ollama/
├── SKILL.md ← este arquivo
├── scripts/
│ ├── setup.py ← inicializacao (cria .venv, instala libs, puxa modelo Ollama)
│ └── compress.py ← compressao via Ollama (requer init)
└── .venv/ ← criado pelo setup.py (NAO distribuir)
Esta skill assume que o usuario ja tem o Ollama instalado (https://ollama.com/download) e
rodando (ollama serve). Esta e a unica instalacao manual exigida — o resto (venv, pacotes
Python, download do modelo) e automatico na primeira chamada.
Se o daemon do Ollama nao estiver ativo no momento da compressao, o compress.py aborta com
uma mensagem clara explicando como subir o Ollama.
A skill se configura sozinha na primeira chamada de compressao. Voce nao precisa rodar
setup.py manualmente — basta invocar compress.py com o Python do sistema:
python "<skill-dir>/scripts/compress.py" --text "..." --rate 0.4
O que acontece na primeira execucao:
compress.py detecta que o .venv nao existesetup.py automaticamente (cria venv, instala pacotes, puxa o modelo)Nas chamadas seguintes, o passo 1-3 e pulado (venv ja existe).
Voce pode rodar setup.py diretamente com python "<skill-dir>/scripts/setup.py" — util se
o aluno quer pre-baixar o modelo antes da primeira compressao (ex: rodando em casa com rede boa
antes de ir para a aula). O setup e idempotente.
Sempre invoque compress.py com o Python do sistema (nao com o do venv). O proprio script
faz o re-exec para o venv quando necessario:
python "<skill-dir>/scripts/compress.py" [opcoes]
Isso simplifica para alunos e compartilhamento: nao precisam saber onde esta o Python do venv.
python "<skill-dir>/scripts/compress.py" --text "texto longo aqui" --rate 0.4
python "<skill-dir>/scripts/compress.py" --file caminho/para/arquivo.txt --rate 0.4
python "<skill-dir>/scripts/compress.py" --file documento.pdf --rate 0.4
Quando o arquivo termina em .pdf, o script:
pymupdf4llm (headers, listas, tabelas, links)documento.md ao lado do PDF (sempre — e o artefato intermediario)Se voce so quer o markdown sem comprimir muito, use --rate 0.9.
python "<skill-dir>/scripts/compress.py" --file entrada.txt --rate 0.4 --output comprimido.txt
python "<skill-dir>/scripts/compress.py" --file entrada.txt --rate 0.4 --ask "Resuma este texto"
python "<skill-dir>/scripts/compress.py" --file entrada.txt --rate 0.4 --ollama-model qwen3:14b
python "<skill-dir>/scripts/compress.py" --file entrada.txt --rate 0.4 --json
| Parametro | Padrao | Descricao |
|---|---|---|
--text | — | Texto passado diretamente (mutuamente exclusivo com --file) |
--file | — | Caminho para arquivo de texto |
--rate | 0.4 | Fracao alvo de tokens (aproximada em compressao generativa) |
--output | — | Salva texto comprimido neste arquivo |
--json | false | Saida em JSON estruturado |
--ollama-model | qwen3:8b | Modelo Ollama a usar |
--ollama-host | http://localhost:11434 | URL do daemon Ollama |
--ask | — | Pergunta a enviar ao Claude com o contexto comprimido |
--model | claude-sonnet-4-6 | Modelo Claude (so usado com --ask) |
--max-tokens | 4096 | Max tokens na resposta do Claude |
0.5 — Compressao leve, maxima fidelidade0.4 — Equilibrio padrao (recomendado)0.33 — Compressao moderada0.2 — Compressao agressiva (LLM pode nao atingir 20% — dependendo do texto, tende a
parar em ~30% porque reescrever tao curto vira resumo extremo)Quando o usuario nao especificar, use 0.4.
Importante: compressao generativa via LLM e APROXIMADA. O modelo tenta atingir a taxa, mas varia por texto. Sempre mostre a taxa efetiva atingida nas metricas.
{
"compression": {
"compressed_prompt": "texto comprimido...",
"origin_tokens": 312,
"compressed_tokens": 124,
"ratio": 2.52,
"saving": 188,
"rate_requested": 0.4,
"model": "qwen3:8b"
},
"pdf": {
"source_pdf": "/caminho/para/doc.pdf",
"pages": 12,
"markdown_path": "/caminho/para/doc.md",
"markdown_chars": 24580
},
"claude": {
"answer": "resposta do Claude...",
"model": "claude-sonnet-4-6",
"input_tokens": 150,
"output_tokens": 200
}
}
O campo pdf so aparece quando a entrada e um arquivo .pdf.
O campo claude so aparece quando --ask e usado.
qwen3:8b (trocavel via --ollama-model)tiktoken com encoding cl100k_base (estimativa razoavel para comparacao)/no_think no prompt e
remove blocos <think>...</think> residuais na saida0.2) para saida deterministicaANTHROPIC_API_KEY precisa estar definida no ambiente para usar --askAntes de enviar ao Ollama, o texto passa por:
tables_to_keyvalue() — converte tabelas markdown em pares chave: valor (LLMs reescrevem
tabelas melhor em formato linear; tabelas com |---| normalmente sao destruidas)normalize_identifiers() — remove hifens de IDs (RF-01 → RF01) para o LLM tratar como um
token unico e nao separarstrip_markdown() — remove decoracao **bold**, headers ##, code fences, checkboxes e
separadores --- (o LLM generativo ja produz texto natural, nao precisa desse ruido)O system prompt obriga o modelo a:
não, nunca, sem, nenhum, nem) — trocar uma negacao muda
o significadoRF-01, G05, 1000ms, URLs, IDs)sandeco-token-reduce