{"id":"conversation-prune","title":"Choose which old messages to drop to hit a token target without touching the cached prompt prefix","description":"Given a conversation, the index of the last message inside the provider's cached prefix, and a token target, returns which messages to drop: whole tool call plus tool result pairs (so no result is left without its call) and messages the caller marked droppable, oldest first or largest first, never inside the cached prefix, never the most recent keepRecent messages, never pinned ones. Everything up to the cache breakpoint stays byte-identical because it is never selected; the response carries a digest of that prefix so a later call can confirm it did not change. Does not summarize, edit or reorder messages, and does not know any provider's minimum cacheable size or TTL.","roi":"Shrinks a long agent transcript without busting the prompt cache. 500 messages per $0.005 call.","audience":"agent-infra","package":"context-evidence-kit","channels":["x402","mcp"],"endpoint":{"method":"POST","url":"https://agents.writerslogic.com/api/v1/conversation-prune","path":"/api/v1/conversation-prune","contentType":"application/json"},"price":{"amount":"0.005","currency":"USDC","network":"base","perCall":true,"failedCallsCharged":false},"inputSchema":{"type":"object","additionalProperties":false,"required":["messages","cacheBreakpoint","targetTokens"],"properties":{"messages":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","maxLength":100},"role":{"type":"string","maxLength":32,"minLength":1,"description":"user, assistant, tool, system, ..."},"kind":{"type":"string","enum":["text","tool_call","tool_result"],"description":"tool_call: assistant message holding a tool call; tool_result: its output. Pairs are matched by toolCallId. Default text."},"toolCallId":{"type":"string","maxLength":200,"description":"Pairs a tool_call with its tool_result."},"content":{"type":"string","maxLength":100000,"description":"Message text, used only to count tokens when tokens is absent."},"tokens":{"type":"integer","minimum":0,"maximum":100000000,"description":"Caller-supplied token count; always accepted."},"pinned":{"type":"boolean","description":"Never dropped."},"droppable":{"type":"boolean","description":"A text message that may be dropped (tool pairs are droppable by default)."}},"required":["role"]},"maxItems":500,"minItems":1,"description":"Up to 500; 400000 characters of content in total."},"cacheBreakpoint":{"type":"integer","minimum":-1,"maximum":499,"description":"Index of the last message inside the cached prefix; -1 when nothing is cached."},"targetTokens":{"type":"integer","minimum":0,"maximum":100000000,"description":"Total tokens to get at or under."},"keepRecent":{"type":"integer","minimum":0,"maximum":100,"description":"Most recent messages that are never dropped. Default 4."},"strategy":{"type":"string","enum":["oldest-first","largest-first"],"description":"Order in which droppable units are removed. Default oldest-first."},"tokenizer":{"type":"string","maxLength":64,"description":"o200k_base or cl100k_base. Any other name (including Claude models) returns status unsupported for items that need counting; caller token counts are always accepted."}}},"resultSchema":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"keep":{"type":"array","items":{"type":"integer"},"maxItems":500,"description":"Indices of messages to keep, ascending."},"dropped":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"index":{"type":"integer"},"id":{"type":"string"},"role":{"type":"string"},"kind":{"type":"string"},"tokens":{"type":"integer"},"reason":{"type":"string","enum":["stale-tool-pair","droppable"]},"pairedWith":{"type":"integer"}}},"maxItems":500},"tokensBefore":{"type":"integer"},"tokensAfter":{"type":"integer"},"targetMet":{"type":"boolean"},"prefix":{"type":"object","additionalProperties":false,"properties":{"messages":{"type":"integer"},"tokens":{"type":"integer"},"sha256":{"type":"string","description":"SHA-256 of the RFC 8785 canonical JSON of the prefix messages exactly as supplied."}}},"notes":{"type":"array","items":{"type":"string"},"maxItems":20},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"outputSchema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"keep":{"type":"array","items":{"type":"integer"},"maxItems":500,"description":"Indices of messages to keep, ascending."},"dropped":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"index":{"type":"integer"},"id":{"type":"string"},"role":{"type":"string"},"kind":{"type":"string"},"tokens":{"type":"integer"},"reason":{"type":"string","enum":["stale-tool-pair","droppable"]},"pairedWith":{"type":"integer"}}},"maxItems":500},"tokensBefore":{"type":"integer"},"tokensAfter":{"type":"integer"},"targetMet":{"type":"boolean"},"prefix":{"type":"object","additionalProperties":false,"properties":{"messages":{"type":"integer"},"tokens":{"type":"integer"},"sha256":{"type":"string","description":"SHA-256 of the RFC 8785 canonical JSON of the prefix messages exactly as supplied."}}},"notes":{"type":"array","items":{"type":"string"},"maxItems":20},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]},"example":{"messages":[{"role":"system","content":"You are a support agent.","tokens":400},{"role":"user","content":"Look up order 1042.","tokens":20},{"role":"assistant","kind":"tool_call","toolCallId":"t1","tokens":30},{"role":"user","kind":"tool_result","toolCallId":"t1","tokens":6000},{"role":"assistant","content":"Order 1042 shipped.","tokens":15},{"role":"user","content":"Thanks. Now order 1043.","tokens":20}],"cacheBreakpoint":1,"targetTokens":1000,"keepRecent":2},"openapiOperation":{"operationId":"conversation_prune","summary":"Choose which old messages to drop to hit a token target without touching the cached prompt prefix","description":"Given a conversation, the index of the last message inside the provider's cached prefix, and a token target, returns which messages to drop: whole tool call plus tool result pairs (so no result is left without its call) and messages the caller marked droppable, oldest first or largest first, never inside the cached prefix, never the most recent keepRecent messages, never pinned ones. Everything up to the cache breakpoint stays byte-identical because it is never selected; the response carries a digest of that prefix so a later call can confirm it did not change. Does not summarize, edit or reorder messages, and does not know any provider's minimum cacheable size or TTL.\n\nPrice: 0.005 USDC on Base (x402).","x-x402-price-usdc":"0.005","x-x402-amount":"5000","x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.005"}},"x-audience":"agent-infra","x-sample-url":"https://agents.writerslogic.com/api/v1/samples/conversation-prune","security":[{"x402":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["messages","cacheBreakpoint","targetTokens"],"properties":{"messages":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","maxLength":100},"role":{"type":"string","maxLength":32,"minLength":1,"description":"user, assistant, tool, system, ..."},"kind":{"type":"string","enum":["text","tool_call","tool_result"],"description":"tool_call: assistant message holding a tool call; tool_result: its output. Pairs are matched by toolCallId. Default text."},"toolCallId":{"type":"string","maxLength":200,"description":"Pairs a tool_call with its tool_result."},"content":{"type":"string","maxLength":100000,"description":"Message text, used only to count tokens when tokens is absent."},"tokens":{"type":"integer","minimum":0,"maximum":100000000,"description":"Caller-supplied token count; always accepted."},"pinned":{"type":"boolean","description":"Never dropped."},"droppable":{"type":"boolean","description":"A text message that may be dropped (tool pairs are droppable by default)."}},"required":["role"]},"maxItems":500,"minItems":1,"description":"Up to 500; 400000 characters of content in total."},"cacheBreakpoint":{"type":"integer","minimum":-1,"maximum":499,"description":"Index of the last message inside the cached prefix; -1 when nothing is cached."},"targetTokens":{"type":"integer","minimum":0,"maximum":100000000,"description":"Total tokens to get at or under."},"keepRecent":{"type":"integer","minimum":0,"maximum":100,"description":"Most recent messages that are never dropped. Default 4."},"strategy":{"type":"string","enum":["oldest-first","largest-first"],"description":"Order in which droppable units are removed. Default oldest-first."},"tokenizer":{"type":"string","maxLength":64,"description":"o200k_base or cl100k_base. Any other name (including Claude models) returns status unsupported for items that need counting; caller token counts are always accepted."}}},"example":{"messages":[{"role":"system","content":"You are a support agent.","tokens":400},{"role":"user","content":"Look up order 1042.","tokens":20},{"role":"assistant","kind":"tool_call","toolCallId":"t1","tokens":30},{"role":"user","kind":"tool_result","toolCallId":"t1","tokens":6000},{"role":"assistant","content":"Order 1042 shipped.","tokens":15},{"role":"user","content":"Thanks. Now order 1043.","tokens":20}],"cacheBreakpoint":1,"targetTokens":1000,"keepRecent":2}}}},"responses":{"200":{"description":"Paid result with provenance","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"keep":{"type":"array","items":{"type":"integer"},"maxItems":500,"description":"Indices of messages to keep, ascending."},"dropped":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"index":{"type":"integer"},"id":{"type":"string"},"role":{"type":"string"},"kind":{"type":"string"},"tokens":{"type":"integer"},"reason":{"type":"string","enum":["stale-tool-pair","droppable"]},"pairedWith":{"type":"integer"}}},"maxItems":500},"tokensBefore":{"type":"integer"},"tokensAfter":{"type":"integer"},"targetMet":{"type":"boolean"},"prefix":{"type":"object","additionalProperties":false,"properties":{"messages":{"type":"integer"},"tokens":{"type":"integer"},"sha256":{"type":"string","description":"SHA-256 of the RFC 8785 canonical JSON of the prefix messages exactly as supplied."}}},"notes":{"type":"array","items":{"type":"string"},"maxItems":20},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]}}}},"400":{"description":"Invalid request (no payment consumed)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Invalid X-API-KEY","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"402":{"description":"Payment required or invalid","content":{"application/json":{"schema":{"type":"object","description":"x402 v2 PaymentRequired (also base64 in the PAYMENT-REQUIRED header)","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"code":{"type":"string"},"resource":{"type":"object"},"accepts":{"type":"array","items":{"type":"object"}},"extensions":{"type":"object"}}}}}},"502":{"description":"Upstream failure; the payment is released or not settled","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}},"links":{"docs":"https://agents.writerslogic.com/docs/conversation-prune/","docsJson":"https://agents.writerslogic.com/docs/conversation-prune.json","sample":"https://agents.writerslogic.com/api/v1/samples/conversation-prune","openapi":"https://agents.writerslogic.com/openapi.json","catalog":"https://agents.writerslogic.com/api/v1/catalog","verifyProvenance":"https://agents.writerslogic.com/api/v1/verify-provenance","index":"https://agents.writerslogic.com/docs/index.json"}}