Deferred follow-ups from the relaykit-tools review cycle, verified by
live end-to-end billing tests:
- billing: normalize Gemini modality keys consistently between stream
merge and settlement (case/whitespace variants no longer drop
independent audio/image pricing) and sum duplicate modality entries
on both paths
- billing: sync legacy flat Claude cache-creation fields from the
CacheCreation sub-object (including zeroing) and fall back to flat
fields only when the snapshot never carried a sub-object, closing a
stale 1h-cache overcharge path in cascaded deployments
- relay: move Chat-to-Claude and Chat-to-Gemini stream conversion state
from gin.Context onto RelayInfo and reset it with SendResponseCount in
InitChannelMeta, so channel retries start clean while per-request
state (stream error collection, conversion diagnostics, channel
chain, billing accumulators) survives
- relay: Claude channel now serves Gemini-format clients (request via
registry conversion, response and stream composed through the Chat
pivot), removing the last unimplemented conversion direction
- relaykit: recognize legacy pseudo tool names (googleSearch,
codeExecution, urlContext) in the toolconv decode stage and drop the
string-matching bypass in the Chat-to-Gemini converter; native Gemini
tool output is restored and non-Gemini targets follow standard loss
diagnostics
- relaykit: attach upstream Gemini usage (with billing_usage sidecar)
to intermediate stream chunks so converted Claude streams report
upstream truth from message_start, and preserve the sidecar through
Claude stream usage merges; billing settlement unchanged
- billing: clamp negative Total-Prompt completion derivation, OR the
Estimated flag across cross-dialect snapshot replacement, and fill
canonical OpenAI prompt details via field-wise merge
* feat(relaykit): preserve hosted tools across conversions
- add protocol-neutral hosted-tool DTOs, conversion metadata, and loss policies
- bridge citations, grounding metadata, and hosted-tool stream lifecycles
- document the public conversion behavior and channel policy controls
* refactor(relaykit): normalize reasoning and thinking intent
- centralize provider-neutral reasoning intent, effort, and budget mappings
- parse model suffixes at the host entry boundary while preserving provider-owned tails
- keep adaptive Claude thinking and explicit zero-token compatibility consistent
* fix(billing): preserve authoritative usage across relay hops
- carry native BillingUsage sidecars through direct and streamed protocol bridges
- merge partial and terminal usage monotonically with safe fallback settlement
- retain cache metadata, penultimate usage, and per-call Gemini tool surcharges
* feat(relay): bridge Responses with Claude and Gemini protocols
- add direct request, response, and stream converters across supported relay formats
- expose Claude count_tokens and Chat-to-Responses compatibility endpoints
- carry conversion diagnostics through the host while retaining the curated public goldens
* fix(relay): wire relaykit conversions into host channels
- connect handlers, adaptors, and channel settings to the standalone conversion layer
- keep model mapping, pricing identity, retries, and provider-specific suffix behavior aligned
- ignore local audit artifacts and retain focused public regression coverage