llmrouter: Anthropic-Messages-Pfad (/messages, count_tokens) für Claude Code

Weiterleitung an OpenRouters Messages-Endpunkt (x-api-key, anthropic-version,
anthropic-beta), Effort als reasoning.effort, Usage in Anthropic-Form gelesen
(auch im Stream aus message_start/message_delta). Nur openrouter-Ziele; lokale
llama-server sprechen kein Messages-Format. Verifiziert: claude -p über
http://llm.lan:4010 mit alt/anthropic/claude-sonnet-5 -> glm-5.3-flash.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-09-05 16:23:26 +02:00
committed by andreas
co-authored by Claude Fable 5.1
parent 9d0bd7e1a3
commit 0d971b81dc
2 changed files with 30 additions and 8 deletions
+8 -4
View File
@@ -63,11 +63,15 @@ export class Log {
/** Zieht Tokens und Kosten aus einer OpenAI-/OpenRouter-Usage. */
export function usageLesen(u: unknown): Pick<Eintrag, "prompt_tokens" | "completion_tokens" | "cached_tokens" | "cost"> {
const usage = (u ?? {}) as { prompt_tokens?: number; completion_tokens?: number; cost?: number; prompt_tokens_details?: { cached_tokens?: number } };
// OpenAI-Form (prompt_tokens/completion_tokens) und Anthropic-Form (input_tokens/output_tokens)
const usage = (u ?? {}) as {
prompt_tokens?: number; completion_tokens?: number; cost?: number; prompt_tokens_details?: { cached_tokens?: number };
input_tokens?: number; output_tokens?: number; cache_read_input_tokens?: number;
};
return {
prompt_tokens: usage.prompt_tokens ?? null,
completion_tokens: usage.completion_tokens ?? null,
cached_tokens: usage.prompt_tokens_details?.cached_tokens ?? null,
prompt_tokens: usage.prompt_tokens ?? usage.input_tokens ?? null,
completion_tokens: usage.completion_tokens ?? usage.output_tokens ?? null,
cached_tokens: usage.prompt_tokens_details?.cached_tokens ?? usage.cache_read_input_tokens ?? null,
cost: typeof usage.cost === "number" ? usage.cost : null,
};
}