Merge pull request #772 from fabro-sh/brynary/venice-model-catalog

Update Venice model catalog
This commit is contained in:
Bryan Helmkamp 2026-08-21 11:35:22 -04:00 committed by GitHub
commit 57026cd4da
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 344 additions and 111 deletions

View file

@ -59,13 +59,18 @@ Fabro performs this selection once when creating a run and persists the chosen p
| `gemini-3.1-flash-lite` | gemini | `gemini-flash-lite`, `gemini-3.1-flash-lite-preview` | 1M | $0.25 / $1.50 | 200 tok/s |
| `kimi-k2.5` | moonshot | | 262K | $0.60 / $3.00 | 50 tok/s |
| `kimi-k3` | moonshot | `kimi` | 1M | $3.00 / $15.00 | n/a |
| `kimi-k3-fast` | venice | `kimi-fast` | 1M | $4.50 / $22.50 | n/a |
| `deepseek-v4-flash` | deepseek | `deepseek`, `deepseek-v4`, `deepseek-flash` | 1,048,576 | $0.14 / $0.28 | n/a |
| `deepseek-v4-pro` | deepseek | | 1,048,576 | $0.435 / $0.87 | n/a |
| `grok-4.6` | venice | `grok`, `grok46`, `grok-46` | 500K | $2.27 / $6.80 | n/a |
| `laguna-s-2.1` | poolside | `laguna`, `laguna-s` | 1M | $0.10 / $0.20 | n/a |
| `laguna-xs-2.1` | poolside | `laguna-xs` | 262K | $0.10 / $0.20 | n/a |
| `glm-5.2` | zai | `glm`, `glm5`, `glm52`, `glm5.2` | 1M | $1.40 / $4.40 | n/a |
| `glm-5.3` | venice | `glm`, `glm5`, `glm53`, `glm5.3`, `glm-5-3` | 1M | $1.75 / $5.50 | n/a |
| `minimax-m2.5` | minimax | `minimax` | 197K | $0.30 / $1.20 | 45 tok/s |
| `mercury-2` | inception | `mercury` | 131K | $0.25 / $0.75 | 1000 tok/s |
| `qwen3.8-max` | venice | `qwen`, `qwen-max`, `qwen3.8`, `qwen-3.8`, `qwen38`, `qwen-3.8-max`, `qwen38-max` | 1M | $2.50 / $7.50 | n/a |
| `qwen3.8-27b` | venice | `qwen-27b`, `qwen-3.8-27b`, `qwen38-27b` | 262K | $0.45 / $3.20 | n/a |
Each provider requires its own API key. Server-backed workflows read provider credentials from the server vault (for example `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`, `DEEPSEEK_API_KEY`, or `POOLSIDE_API_KEY` set with `fabro secret set` or `fabro provider login`). Standalone SDK/CLI flows can opt into env-backed credential sources explicitly. See the [Quick Start](/getting-started/quick-start) for setup.
@ -169,6 +174,10 @@ Provider `billing_policy` defaults from `adapter` and controls usage-cost estima
Provider fields in configuration, APIs, and model routing are provider ID strings. Built-in names like `anthropic`, `openai`, and `gemini` still work, but custom IDs like `proxy` work anywhere a provider ID is accepted.
</Note>
### Venice
Fabro ships a built-in [Venice](/integrations/venice) provider with a curated catalog of Venice-hosted Kimi, Grok, GLM, DeepSeek, and Qwen models. Store its API key with `fabro provider login --provider venice`. Pin `provider = "venice"` when a shared model slug must use Venice instead of a higher-priority direct provider.
### Poolside
Fabro ships a built-in [Poolside](/integrations/poolside) provider for Laguna S 2.1 and Laguna XS 2.1 over Poolside's OpenAI-compatible API. Store a direct API key with `fabro provider login --provider poolside`. The same model slugs are also available through the opt-in OpenRouter provider; its vendor-namespaced strings remain provider-only `api_id` values.
@ -232,6 +241,7 @@ When no model or provider is specified, Fabro chooses the default offering on th
| `moonshot` | `kimi-k3` |
| `poolside` | `laguna-s-2.1` |
| `zai` | `glm-5.2` |
| `venice` | `deepseek-v4-flash` |
| `minimax` | `minimax-m2.5` |
| `inception` | `mercury-2` |

View file

@ -97,6 +97,7 @@
"integrations/litellm",
"integrations/bedrock",
"integrations/deepseek",
"integrations/venice",
"integrations/poolside",
"integrations/openrouter",
"integrations/modal",

View file

@ -0,0 +1,125 @@
---
title: "Venice"
description: "Run Kimi, Grok, GLM, DeepSeek, and Qwen models through Venice"
---
[Venice](https://venice.ai/) provides an OpenAI-compatible API for hosted text models. Fabro enables the `venice` provider in its built-in catalog and maps stable Fabro model slugs to Venice's API model IDs.
## Prerequisites
- A Venice account
- An inference API key from [venice.ai/settings/api](https://venice.ai/settings/api)
- A running Fabro server
## Configure credentials
Store the API key in the target Fabro server vault:
```bash
fabro provider login --provider venice
# For a non-default remote server:
fabro provider login --server https://your-fabro.example --provider venice
# Or set the vault token directly:
fabro secret set VENICE_API_KEY
fabro secret --server https://your-fabro.example set VENICE_API_KEY
```
Standalone SDK usage outside a Fabro server can use an env-backed credential source explicitly:
```bash
export VENICE_API_KEY=<api-key>
```
Fabro sends bearer-authenticated Chat Completions requests to `https://api.venice.ai/api/v1`.
## Included models
| Fabro model slug | Venice API ID | Context | Max output | Role and aliases |
|---|---|---:|---:|---|
| `kimi-k3` | `kimi-k3` | 1,000,000 | 131,072 | Alias `kimi` |
| `kimi-k3-fast` | `kimi-k3-fast-api` | 1,000,000 | 131,072 | Alias `kimi-fast` |
| `grok-4.6` | `grok-4-6` | 500,000 | 32,000 | Aliases `grok`, `grok46`, `grok-46` |
| `glm-5.3` | `z-ai-glm-5-3` | 1,000,000 | 131,072 | Aliases `glm`, `glm5`, `glm53`, `glm5.3`, `glm-5-3` |
| `deepseek-v4-flash` | `deepseek-v4-flash-0731` | 1,000,000 | 32,768 | Provider default; aliases `deepseek`, `deepseek-v4`, `deepseek-flash` |
| `deepseek-v4-pro` | `deepseek-v4-pro-0813` | 1,000,000 | 32,768 | Alias `deepseek-pro` |
| `qwen3.8-max` | `qwen-3-8-max` | 1,000,000 | 131,072 | Aliases `qwen`, `qwen-max`, `qwen3.8`, `qwen-3.8`, `qwen38`, `qwen-3.8-max`, `qwen38-max` |
| `qwen3.8-27b` | `qwen-3-8-27b` | 262,144 | 131,072 | Aliases `qwen-27b`, `qwen-3.8-27b`, `qwen38-27b` |
Venice API IDs are also valid provider-scoped selectors. Fabro persists the stable Fabro slug and the selected provider when it creates a run.
## Select Venice explicitly
Some Venice models use the same stable slugs as direct providers. An unqualified selector chooses the highest-priority ready provider. For example, `deepseek` can select the direct DeepSeek provider when both API keys are configured.
Pin Venice when the run must use Venice:
```bash
fabro model list --provider venice
fabro model test --provider venice --model deepseek-v4-flash --deep
fabro run workflow.fabro --provider venice --model deepseek-v4-flash
```
In a workflow stylesheet:
```dot title="workflow.fabro"
digraph Example {
graph [
model_stylesheet="
* { provider: venice; model: deepseek-v4-flash; }
.complex { provider: venice; model: qwen; }
.fast { provider: venice; model: kimi-fast; }
"
]
start [shape=Mdiamond, label="Start"]
work [label="Implement", class="complex"]
check [label="Check", class="fast"]
exit [shape=Msquare, label="Exit"]
start -> work -> check -> exit
}
```
The generic Qwen aliases `qwen` and `qwen3.8` select Qwen 3.8 Max. Use a size-specific alias such as `qwen-27b` to select Qwen 3.8 27B.
## Capabilities and reasoning
All included models support tool calling and reasoning. Kimi K3, Kimi K3 Fast, Grok 4.6, Qwen 3.8 Max, and Qwen 3.8 27B also accept image input.
Fabro exposes native reasoning-effort controls only when Venice supports them:
| Model | Reasoning effort values |
|---|---|
| `grok-4.6` | `low`, `medium`, `high`, `xhigh` |
| `glm-5.3` | `low`, `high`, `max` |
| `deepseek-v4-flash` | `low`, `high`, `max` |
| `qwen3.8-27b` | `low`, `medium`, `xhigh` |
The other models reason by default but do not expose a Venice reasoning-effort control. Fabro omits sampling parameters for Kimi and DeepSeek because those routes do not use them with their configured reasoning behavior.
## Pricing and prompt caching
The built-in catalog uses Venice's published prices per million tokens:
| Model | Uncached input | Cache hit | Output |
|---|---:|---:|---:|
| `kimi-k3` | $3.75 | $0.375 | $18.75 |
| `kimi-k3-fast` | $4.50 | $0.45 | $22.50 |
| `grok-4.6` | $2.27 | $0.57 | $6.80 |
| `glm-5.3` | $1.75 | $0.325 | $5.50 |
| `deepseek-v4-flash` | $0.175 | $0.035 | $0.35 |
| `deepseek-v4-pro` | $1.65 | $0.165 | $4.95 |
| `qwen3.8-max` | $2.50 | $0.3125 | $7.50 |
| `qwen3.8-27b` | $0.45 | n/a | $3.20 |
Fabro reports cached input separately when Venice returns cache usage for the selected model. Prices and model availability can change upstream; use `fabro model list --provider venice` to inspect the catalog shipped with your Fabro version and the [Venice model catalog](https://docs.venice.ai/models/overview) for the current upstream service.
## Troubleshooting
**"No credential was found for provider 'venice'"** — Store `VENICE_API_KEY` in the server vault with `fabro provider login --provider venice`. Pass `--server` when configuring a remote Fabro server.
**A shared model used another provider** — Pin Venice with `--provider venice` or `provider: venice` in the workflow stylesheet. Unqualified selectors use provider priority.
**A Venice API model ID is rejected without a provider** — Use the stable Fabro slug for portable selection, or qualify the API ID with the provider, such as `venice:qwen-3-8-max`.

View file

@ -269,91 +269,19 @@ mod tests {
.unwrap_or_else(|error| panic!("built-in model '{selector}' should resolve: {error}"))
}
/// One row of the route-equivalence table: model id plus the
/// `(deployment_id, transport, codec, billing_policy, agent_profile)`
/// tuple it must resolve to.
type RouteRow = (
&'static str,
&'static str,
AdapterKind,
CodecKind,
BillingPolicy,
AgentProfileKind,
);
/// The compat mapping as an executable table: every built-in catalog
/// model resolves to exactly this tuple. Adding or rerouting a built-in
/// model means updating this table deliberately.
#[test]
fn builtin_catalog_route_equivalence_table() {
use AdapterKind as T;
use AgentProfileKind as P;
use BillingPolicy as B;
use CodecKind as C;
#[rustfmt::skip]
let expected: &[RouteRow] = &[
// model id deployment_id transport codec billing profile
("claude-fable-5", "claude-fable-5", T::Anthropic, C::AnthropicMessages, B::Anthropic, P::Claude5),
("claude-haiku-4-5", "claude-haiku-4-5", T::Anthropic, C::AnthropicMessages, B::Anthropic, P::Anthropic),
("claude-opus-4-6", "claude-opus-4-6", T::Anthropic, C::AnthropicMessages, B::Anthropic, P::Anthropic),
("claude-opus-4-7", "claude-opus-4-7", T::Anthropic, C::AnthropicMessages, B::Anthropic, P::Anthropic),
("claude-opus-4-8", "claude-opus-4-8", T::Anthropic, C::AnthropicMessages, B::Anthropic, P::Anthropic),
("claude-opus-5", "claude-opus-5", T::Anthropic, C::AnthropicMessages, B::Anthropic, P::Claude5),
("claude-sonnet-4-5", "claude-sonnet-4-5", T::Anthropic, C::AnthropicMessages, B::Anthropic, P::Anthropic),
("claude-sonnet-4-6", "claude-sonnet-4-6", T::Anthropic, C::AnthropicMessages, B::Anthropic, P::Anthropic),
("claude-sonnet-5", "claude-sonnet-5", T::Anthropic, C::AnthropicMessages, B::Anthropic, P::Claude5),
("deepseek-v4-flash", "deepseek-v4-flash", T::OpenAiCompatible, C::OpenAiCompatible, B::OpenAi, P::OpenAi),
("deepseek-v4-pro", "deepseek-v4-pro", T::OpenAiCompatible, C::OpenAiCompatible, B::OpenAi, P::OpenAi),
("gemini-3-flash-preview", "gemini-3-flash-preview", T::Gemini, C::GeminiGenerate, B::Gemini, P::Gemini),
("gemini-3.1-flash-lite", "gemini-3.1-flash-lite", T::Gemini, C::GeminiGenerate, B::Gemini, P::Gemini),
("gemini-3.1-pro-preview", "gemini-3.1-pro-preview", T::Gemini, C::GeminiGenerate, B::Gemini, P::Gemini),
("gemini-3.1-pro-preview-customtools", "gemini-3.1-pro-preview-customtools", T::Gemini, C::GeminiGenerate, B::Gemini, P::Gemini),
("gemini-3.5-flash", "gemini-3.5-flash", T::Gemini, C::GeminiGenerate, B::Gemini, P::Gemini),
("glm-4.7", "glm-4.7", T::OpenAiCompatible, C::OpenAiCompatible, B::OpenAi, P::OpenAi),
("glm-5.2", "glm-5.2", T::OpenAiCompatible, C::OpenAiCompatible, B::OpenAi, P::OpenAi),
("gpt-5.4", "gpt-5.4", T::OpenAi, C::OpenAiResponses, B::OpenAi, P::OpenAi),
("gpt-5.4-mini", "gpt-5.4-mini", T::OpenAi, C::OpenAiResponses, B::OpenAi, P::OpenAi),
("gpt-5.4-pro", "gpt-5.4-pro", T::OpenAi, C::OpenAiResponses, B::OpenAi, P::OpenAi),
("gpt-5.5", "gpt-5.5", T::OpenAi, C::OpenAiResponses, B::OpenAi, P::OpenAi),
("gpt-5.5-pro", "gpt-5.5-pro", T::OpenAi, C::OpenAiResponses, B::OpenAi, P::OpenAi),
("gpt-5.6-luna", "gpt-5.6-luna", T::OpenAi, C::OpenAiResponses, B::OpenAi, P::Gpt56),
("gpt-5.6-sol", "gpt-5.6-sol", T::OpenAi, C::OpenAiResponses, B::OpenAi, P::Gpt56),
("gpt-5.6-terra", "gpt-5.6-terra", T::OpenAi, C::OpenAiResponses, B::OpenAi, P::Gpt56),
("kimi-k2.5", "kimi-k2.5", T::OpenAiCompatible, C::OpenAiCompatible, B::OpenAi, P::Kimi),
("kimi-k3", "kimi-k3", T::OpenAiCompatible, C::OpenAiCompatible, B::OpenAi, P::Kimi),
("laguna-s-2.1", "poolside/laguna-s-2.1", T::OpenAiCompatible, C::OpenAiCompatible, B::OpenAi, P::OpenAi),
("laguna-xs-2.1", "poolside/laguna-xs-2.1", T::OpenAiCompatible, C::OpenAiCompatible, B::OpenAi, P::OpenAi),
("mercury-2", "mercury-2", T::OpenAiCompatible, C::OpenAiCompatible, B::OpenAi, P::OpenAi),
("minimax-m2.5", "minimax-m2.5", T::OpenAiCompatible, C::OpenAiCompatible, B::OpenAi, P::OpenAi),
("venice-uncensored-1-2", "venice-uncensored-1-2", T::OpenAiCompatible, C::OpenAiCompatible, B::OpenAi, P::OpenAi),
("venice-uncensored-role-play", "venice-uncensored-role-play", T::OpenAiCompatible, C::OpenAiCompatible, B::OpenAi, P::OpenAi),
];
fn every_builtin_catalog_offering_resolves() {
let catalog = Catalog::builtin();
let mut model_ids: Vec<&str> = catalog
.list(None)
.iter()
.map(|model| model.id.as_str())
.collect();
model_ids.sort_unstable();
let mut expected_ids: Vec<&str> = expected.iter().map(|row| row.0).collect();
expected_ids.sort_unstable();
assert_eq!(
model_ids, expected_ids,
"route-equivalence table must cover every built-in model row"
);
for (model_id, deployment_id, transport, codec, billing_policy, agent_profile) in expected {
let model = select_from_all(catalog, model_id);
let route = resolve_route(catalog, model)
.unwrap_or_else(|| panic!("built-in model '{model_id}' should resolve"));
assert_eq!(route.deployment_id, *deployment_id, "{model_id}");
assert_eq!(route.transport, *transport, "{model_id}");
assert_eq!(route.codec, *codec, "{model_id}");
assert_eq!(route.billing_policy, *billing_policy, "{model_id}");
assert_eq!(route.agent_profile, *agent_profile, "{model_id}");
for model in catalog.list(None) {
let route = resolve_route(catalog, model).unwrap_or_else(|| {
panic!(
"built-in offering '{}/{}' should resolve",
model.provider, model.id
)
});
assert_eq!(route.provider, model.provider);
assert!(!route.deployment_id.is_empty());
}
}

View file

@ -2037,17 +2037,20 @@ reasoning = false
client
}
/// Live-dispatch counterpart of the adapter_registry route-equivalence
/// table: for every built-in model, `resolve_provider` lands on the same
/// provider the resolved route names.
/// For every built-in model selector, live dispatch and catalog selection
/// choose the same provider from the same ready-provider set.
#[tokio::test]
async fn dispatch_agrees_with_resolve_route_for_every_builtin_model() {
let catalog = catalog_with("");
let client = client_with_all_catalog_providers(&catalog).await;
let ready_providers = catalog.all_provider_ids();
for model in catalog.list(None) {
let route = adapter_registry::resolve_route(&catalog, model)
.expect("built-in model should resolve to a route");
let selected = catalog
.select(model.id.as_str(), None, &ready_providers)
.expect("built-in model should be selectable");
let route = adapter_registry::resolve_route(&catalog, selected)
.expect("selected built-in model should resolve to a route");
let mut request = test_request();
request.model = model.id.to_string();

View file

@ -1,46 +1,212 @@
# Model IDs, capabilities, contexts, and prices are from Venice's published
# model catalog, verified 2026-08-21:
# https://github.com/veniceai/api-docs/blob/59a300b1d036c0c0acc0e5f75c0ab0dd07c40c1c/data/static-models.json
[providers.venice]
display_name = "Venice"
adapter = "openai_compatible"
base_url = "https://api.venice.ai/api/v1"
priority = 35
aliases = ["venice-ai"]
billing_policy = "openai"
[providers.venice.auth]
credentials = ["env:VENICE_API_KEY", "vault:VENICE_API_KEY"]
[providers.venice.models."venice-uncensored-1-2"]
display_name = "Venice Uncensored 1.2"
family = "venice-uncensored"
[providers.venice.models."kimi-k3"]
display_name = "Kimi K3"
family = "kimi-k3"
agent_profile = "kimi"
aliases = ["kimi"]
[providers.venice.models."kimi-k3".limits]
context_window = 1000000
max_output = 131072
[providers.venice.models."kimi-k3".features]
tools = true
vision = true
reasoning = true
reasoning_by_default = true
prompt_cache = true
sampling_params = false
[providers.venice.models."kimi-k3".costs]
input_cost_per_mtok = 3.75
output_cost_per_mtok = 18.75
cache_input_cost_per_mtok = 0.375
[providers.venice.models."kimi-k3-fast"]
api_id = "kimi-k3-fast-api"
display_name = "Kimi K3 Fast"
family = "kimi-k3"
agent_profile = "kimi"
aliases = ["kimi-fast"]
[providers.venice.models."kimi-k3-fast".limits]
context_window = 1000000
max_output = 131072
[providers.venice.models."kimi-k3-fast".features]
tools = true
vision = true
reasoning = true
reasoning_by_default = true
prompt_cache = true
sampling_params = false
[providers.venice.models."kimi-k3-fast".costs]
input_cost_per_mtok = 4.5
output_cost_per_mtok = 22.5
cache_input_cost_per_mtok = 0.45
[providers.venice.models."grok-4.6"]
api_id = "grok-4-6"
display_name = "Grok 4.6"
family = "grok-4"
aliases = ["grok", "grok46", "grok-46"]
[providers.venice.models."grok-4.6".limits]
context_window = 500000
max_output = 32000
[providers.venice.models."grok-4.6".features]
tools = true
vision = true
reasoning = true
reasoning_effort = "levels"
reasoning_by_default = true
prompt_cache = true
[providers.venice.models."grok-4.6".controls]
reasoning_effort = ["low", "medium", "high", "xhigh"]
[providers.venice.models."grok-4.6".costs]
input_cost_per_mtok = 2.27
output_cost_per_mtok = 6.8
cache_input_cost_per_mtok = 0.57
[providers.venice.models."glm-5.3"]
api_id = "z-ai-glm-5-3"
display_name = "GLM 5.3"
family = "glm-5"
aliases = ["glm", "glm5", "glm53", "glm5.3", "glm-5-3"]
[providers.venice.models."glm-5.3".limits]
context_window = 1000000
max_output = 131072
[providers.venice.models."glm-5.3".features]
tools = true
vision = false
reasoning = true
reasoning_effort = "levels"
reasoning_by_default = true
prompt_cache = true
[providers.venice.models."glm-5.3".controls]
reasoning_effort = ["low", "high", "max"]
[providers.venice.models."glm-5.3".costs]
input_cost_per_mtok = 1.75
output_cost_per_mtok = 5.5
cache_input_cost_per_mtok = 0.325
[providers.venice.models."deepseek-v4-flash"]
api_id = "deepseek-v4-flash-0731"
display_name = "DeepSeek V4 Flash"
family = "deepseek-v4"
agent_profile = "openai"
default = true
aliases = ["venice-uncensored", "vu"]
aliases = ["deepseek-v4", "deepseek", "deepseek-flash"]
[providers.venice.models."venice-uncensored-1-2".limits]
context_window = 128000
max_output = 8192
[providers.venice.models."deepseek-v4-flash".limits]
context_window = 1000000
max_output = 32768
[providers.venice.models."venice-uncensored-1-2".features]
[providers.venice.models."deepseek-v4-flash".features]
tools = true
vision = false
reasoning = true
reasoning_effort = "levels"
reasoning_by_default = true
prompt_cache = true
sampling_params = false
[providers.venice.models."deepseek-v4-flash".controls]
reasoning_effort = ["low", "high", "max"]
[providers.venice.models."deepseek-v4-flash".costs]
input_cost_per_mtok = 0.175
output_cost_per_mtok = 0.35
cache_input_cost_per_mtok = 0.035
[providers.venice.models."deepseek-v4-pro"]
api_id = "deepseek-v4-pro-0813"
display_name = "DeepSeek V4 Pro"
family = "deepseek-v4"
agent_profile = "openai"
aliases = ["deepseek-pro"]
[providers.venice.models."deepseek-v4-pro".limits]
context_window = 1000000
max_output = 32768
[providers.venice.models."deepseek-v4-pro".features]
tools = true
vision = false
reasoning = true
reasoning_by_default = true
prompt_cache = true
sampling_params = false
[providers.venice.models."deepseek-v4-pro".costs]
input_cost_per_mtok = 1.65
output_cost_per_mtok = 4.95
cache_input_cost_per_mtok = 0.165
[providers.venice.models."qwen3.8-max"]
api_id = "qwen-3-8-max"
display_name = "Qwen 3.8 Max"
family = "qwen3"
aliases = ["qwen", "qwen-max", "qwen3.8", "qwen-3.8", "qwen38", "qwen-3.8-max", "qwen38-max"]
[providers.venice.models."qwen3.8-max".limits]
context_window = 1000000
max_output = 131072
[providers.venice.models."qwen3.8-max".features]
tools = true
vision = true
reasoning = false
reasoning = true
reasoning_by_default = true
prompt_cache = true
[providers.venice.models."venice-uncensored-1-2".costs]
input_cost_per_mtok = 0.2
output_cost_per_mtok = 0.9
[providers.venice.models."qwen3.8-max".costs]
input_cost_per_mtok = 2.5
output_cost_per_mtok = 7.5
cache_input_cost_per_mtok = 0.3125
[providers.venice.models."venice-uncensored-role-play"]
display_name = "Venice Uncensored Role Play"
family = "venice-uncensored"
aliases = ["venice-roleplay", "vrp"]
[providers.venice.models."qwen3.8-27b"]
api_id = "qwen-3-8-27b"
display_name = "Qwen 3.8 27B"
family = "qwen3.8"
aliases = ["qwen-27b", "qwen-3.8-27b", "qwen38-27b"]
[providers.venice.models."venice-uncensored-role-play".limits]
context_window = 128000
max_output = 4096
[providers.venice.models."qwen3.8-27b".limits]
context_window = 262144
max_output = 131072
[providers.venice.models."venice-uncensored-role-play".features]
[providers.venice.models."qwen3.8-27b".features]
tools = true
vision = true
reasoning = false
reasoning = true
reasoning_effort = "levels"
reasoning_by_default = true
[providers.venice.models."venice-uncensored-role-play".costs]
input_cost_per_mtok = 0.5
output_cost_per_mtok = 2.0
[providers.venice.models."qwen3.8-27b".controls]
reasoning_effort = ["low", "medium", "xhigh"]
[providers.venice.models."qwen3.8-27b".costs]
input_cost_per_mtok = 0.45
output_cost_per_mtok = 3.2