tinfoil/voxtral-tts declared mode: audio_speech and no cost at all, so speech never consumed member allowance — voice mode was the one unmetered capability on the gateway. The OWUI-era precedent was to bill TTS like anything else (co-op/support#35 thread), so this sets the field.
Value:input_cost_per_character: 0.000016 — $16 per 1M characters.
Two independent supports:
LiteLLM's own bundled price map prices the same weights at input_cost_per_character: 1.6e-05 (mistral/voxtral-mini-tts-2603), sourced to Mistral's model card.
input_cost_per_character is the field the bundled map uses for speech on the OpenAI adapter, which is what this entry uses (openai/voxtral-tts + Tinfoil's in-TEE api_base), so the cost calculator will read it.
Caveat worth a decision, not a blocker: Tinfoil's catalog lists this model $0/$0, and the config comment always said "verify on invoice — may be beta-free". If it is beta-free, members consuming allowance for it means the co-op meters a resource it isn't paying for. Billing at the published rate was chosen so (a) voice mode cannot be used to sidestep the member budget, and (b) nothing changes the day the beta ends. The number is trivial to change if the invoice says otherwise.
Verification plan (not yet done — needs a gateway restart): after deploy, one /v1/audio/speech call from a member key, then confirm the spend delta equals characters x 1.6e-05 in /spend/logs (or the key's spend). A restart is a member-facing blip, so it will be batched.
Related: co-op/litellm#3 (Bo's model-info proposal) — this is the same class of gap, but a cost field rather than a discovery field.
`tinfoil/voxtral-tts` declared `mode: audio_speech` and no cost at all, so speech never consumed member allowance — voice mode was the one unmetered capability on the gateway. The OWUI-era precedent was to bill TTS like anything else (co-op/support#35 thread), so this sets the field.
**Value:** `input_cost_per_character: 0.000016` — $16 per 1M characters.
Two independent supports:
- LiteLLM's own bundled price map prices **the same weights** at `input_cost_per_character: 1.6e-05` (`mistral/voxtral-mini-tts-2603`), sourced to Mistral's model card.
- `input_cost_per_character` is the field the bundled map uses for speech on the OpenAI adapter, which is what this entry uses (`openai/voxtral-tts` + Tinfoil's in-TEE `api_base`), so the cost calculator will read it.
**Caveat worth a decision, not a blocker:** Tinfoil's catalog lists this model `$0/$0`, and the config comment always said "verify on invoice — may be beta-free". If it is beta-free, members consuming allowance for it means the co-op meters a resource it isn't paying for. Billing at the published rate was chosen so (a) voice mode cannot be used to sidestep the member budget, and (b) nothing changes the day the beta ends. The number is trivial to change if the invoice says otherwise.
**Verification plan (not yet done — needs a gateway restart):** after deploy, one `/v1/audio/speech` call from a member key, then confirm the spend delta equals `characters x 1.6e-05` in `/spend/logs` (or the key's spend). A restart is a member-facing blip, so it will be batched.
Related: co-op/litellm#3 (Bo's model-info proposal) — this is the same class of gap, but a cost field rather than a discovery field.
Tinfoil's catalog lists voxtral-tts at $0/$0, so the entry declared no cost at
all and speech usage never consumed member allowance — voice mode was free
against the member budget while every other capability was metered. The OWUI
precedent was to bill TTS like anything else, so set the field.
input_cost_per_character: 0.000016 = $16/1M characters, from LiteLLM's bundled
map for the same weights (mistral/voxtral-mini-tts-*, sourced to Mistral's model
card) and the field OpenAI's TTS entries use on this adapter.
Revisit if the Tinfoil invoice shows a different number, and note the policy
question: Tinfoil may be serving this model beta-free, so members would be
consuming allowance for a resource the co-op is not paying for.
Closing this: the basis was wrong, and the correction matters more than the number.
Two things I got wrong:
Tinfoil does charge for this model — just not per character. Reading the Tinfoil proxy's own model list inside the gateway (http://127.0.0.1:3301/v1/models) shows voxtral-tts at inputTokenPricePer1M: 0, outputTokenPricePer1M: 0, requestPrice: 0.002. The config comment ("listed $0/$0 — may be beta-free") read the token prices and missed requestPrice. So speech is $0.002 per request, not free.
The market rate is the wrong basis anyway. The co-op bills at cost, not at a model's published rate. $16/1M characters was Mistral's list price, which is not what we pay.
Worth recording while digging: whisper-large-v3-turbo is also mispriced. Tinfoil publishes it at $0/token + $0.01/request, while our config bills input_cost_per_token: 0.00000005 ($0.05/1M tokens) — an older catalog entry. Typical dictation under-bills by roughly an order of magnitude or more.
And the mechanism is the real problem: LiteLLM bills per request only on the search / rerank / MCP paths (input_cost_per_query — see litellm/types/utils.py, litellm/search/cost_calculator.py). The audio paths are priced by characters, seconds or tokens, so "cost per request" is not expressible through the model cost map for TTS or STT. That's the open question, carried to a new issue rather than guessed at here.
Closing this: the basis was wrong, and the correction matters more than the number.
Two things I got wrong:
1. **Tinfoil does charge for this model — just not per character.** Reading the Tinfoil proxy's own model list inside the gateway (`http://127.0.0.1:3301/v1/models`) shows `voxtral-tts` at `inputTokenPricePer1M: 0, outputTokenPricePer1M: 0, requestPrice: 0.002`. The config comment ("listed $0/$0 — may be beta-free") read the token prices and missed `requestPrice`. So speech is **$0.002 per request**, not free.
2. **The market rate is the wrong basis anyway.** The co-op bills at cost, not at a model's published rate. $16/1M characters was Mistral's list price, which is not what we pay.
Worth recording while digging: **`whisper-large-v3-turbo` is also mispriced.** Tinfoil publishes it at `$0/token + $0.01/request`, while our config bills `input_cost_per_token: 0.00000005` ($0.05/1M tokens) — an older catalog entry. Typical dictation under-bills by roughly an order of magnitude or more.
**And the mechanism is the real problem:** LiteLLM bills per request only on the search / rerank / MCP paths (`input_cost_per_query` — see `litellm/types/utils.py`, `litellm/search/cost_calculator.py`). The audio paths are priced by characters, seconds or tokens, so "cost per request" is **not expressible through the model cost map** for TTS or STT. That's the open question, carried to a new issue rather than guessed at here.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
tinfoil/voxtral-ttsdeclaredmode: audio_speechand no cost at all, so speech never consumed member allowance — voice mode was the one unmetered capability on the gateway. The OWUI-era precedent was to bill TTS like anything else (co-op/support#35 thread), so this sets the field.Value:
input_cost_per_character: 0.000016— $16 per 1M characters.Two independent supports:
input_cost_per_character: 1.6e-05(mistral/voxtral-mini-tts-2603), sourced to Mistral's model card.input_cost_per_characteris the field the bundled map uses for speech on the OpenAI adapter, which is what this entry uses (openai/voxtral-tts+ Tinfoil's in-TEEapi_base), so the cost calculator will read it.Caveat worth a decision, not a blocker: Tinfoil's catalog lists this model
$0/$0, and the config comment always said "verify on invoice — may be beta-free". If it is beta-free, members consuming allowance for it means the co-op meters a resource it isn't paying for. Billing at the published rate was chosen so (a) voice mode cannot be used to sidestep the member budget, and (b) nothing changes the day the beta ends. The number is trivial to change if the invoice says otherwise.Verification plan (not yet done — needs a gateway restart): after deploy, one
/v1/audio/speechcall from a member key, then confirm the spend delta equalscharacters x 1.6e-05in/spend/logs(or the key's spend). A restart is a member-facing blip, so it will be batched.Related: co-op/litellm#3 (Bo's model-info proposal) — this is the same class of gap, but a cost field rather than a discovery field.
Closing this: the basis was wrong, and the correction matters more than the number.
Two things I got wrong:
http://127.0.0.1:3301/v1/models) showsvoxtral-ttsatinputTokenPricePer1M: 0, outputTokenPricePer1M: 0, requestPrice: 0.002. The config comment ("listed $0/$0 — may be beta-free") read the token prices and missedrequestPrice. So speech is $0.002 per request, not free.Worth recording while digging:
whisper-large-v3-turbois also mispriced. Tinfoil publishes it at$0/token + $0.01/request, while our config billsinput_cost_per_token: 0.00000005($0.05/1M tokens) — an older catalog entry. Typical dictation under-bills by roughly an order of magnitude or more.And the mechanism is the real problem: LiteLLM bills per request only on the search / rerank / MCP paths (
input_cost_per_query— seelitellm/types/utils.py,litellm/search/cost_calculator.py). The audio paths are priced by characters, seconds or tokens, so "cost per request" is not expressible through the model cost map for TTS or STT. That's the open question, carried to a new issue rather than guessed at here.Pull request closed