/** * Prompt Cache — Cache-Aware Prompt Compression (CAPC). * * Módulo PURO (zero I/O, zero deps): decide como um system prompt se divide * entre prefixo ESTÁTICO (idêntico entre chamadas → cacheável pelo provider) * e sufixo DINÂMICO (volátil por sessão/run). * * Convenção do framework: o delimitador explícito `` * marca a fronteira — tudo ABAIXO do primeiro marcador é volátil. Autores de * prompts grandes (skills, agentes) colocam regras/identidade/persona acima do * marcador e contexto de sessão abaixo. Sem marcador, tudo é estático. * * Por que isso importa: * - Anthropic cobra ~10x menos por token lido do cache, mas só cacheia * blocos marcados com cache_control E com no mínimo MIN_CACHEABLE_TOKENS * (1024 tokens hoje). Abaixo disso o header seria ignorado — por isso * enviamos string simples (wire idêntico ao anterior) quando não vale. * - OpenAI/OpenRouter/Ollama/LM Studio fazem prefix caching automático: * basta o INÍCIO do payload ser byte-idêntico entre chamadas — por isso a * ordem system→messages é estável e o delimitador nunca vai pro fio. */ /** Delimitador canônico: tudo abaixo da primeira ocorrência é dinâmico/volátil. */ export declare const DYNAMIC_MARKER = ""; /** * Piso real do Anthropic prompt caching: blocos com menos tokens que isso não * são elegíveis a cache (o provider ignora cache_control abaixo de 1024). * https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching */ export declare const MIN_CACHEABLE_TOKENS = 1024; /** Resultado da separação estático × dinâmico de um system prompt. */ export interface StaticDynamicSplit { /** Prefixo estável — idêntico entre chamadas (candidato a cache). */ staticText: string; /** Sufixo volátil — muda por sessão/run (fica FORA do bloco cacheado). */ dynamicText: string; /** true se o delimitador estava presente no texto de entrada. */ hasMarker: boolean; } /** * Separa o system prompt no primeiro delimitador ``. * Fidelidade preservada: os slices NÃO fazem trim — concatenar staticText + * dynamicText reproduz a entrada original exatamente sem o marcador. * Sem marcador (ou entrada vazia/undefined), tudo é estático. * Múltiplos marcadores: apenas o primeiro corta (o restante já é dinâmico). */ export declare function splitStaticDynamic(system?: string): StaticDynamicSplit; /** * Reconstrói o system prompt para wire formats SEM suporte a blocos * (OpenAI-compatible): conteúdo original com o delimitador removido. O prefixo * continua byte-estável entre chamadas — condição para o prefix caching * automático desses providers. */ export declare function joinWithoutMarker(system?: string): string; /** * Estimativa grosseira de tokens (~4 chars/token) — mesma heurística usada * pelo LLMClient quando o provider não reporta usage. Movida pra cá para ser * a única fonte da verdade compartilhada entre client e decisões de cache. */ export declare function estimateTokens(...texts: string[]): number; /** Estimativa de tokens do PREFIXO ESTÁTICO — insumo da decisão de cache. */ export declare function estimateStaticTokens(text: string): number; /** * O prefixo estático deste system prompt atinge o piso de cacheabilidade? * Encapsula split + estimativa + threshold numa decisão só (usada pelos * adapters antes de aplicar cache_control no fio). */ export declare function isPromptCacheEligible(system?: string): boolean; //# sourceMappingURL=prompt-cache.d.ts.map