diff --git a/docs/public/core-concepts/models.mdx b/docs/public/core-concepts/models.mdx index df78987d7..d471e18fd 100644 --- a/docs/public/core-concepts/models.mdx +++ b/docs/public/core-concepts/models.mdx @@ -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. +### 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` | diff --git a/docs/public/docs.json b/docs/public/docs.json index faf0d0f84..284e5e4cb 100644 --- a/docs/public/docs.json +++ b/docs/public/docs.json @@ -97,6 +97,7 @@ "integrations/litellm", "integrations/bedrock", "integrations/deepseek", + "integrations/venice", "integrations/poolside", "integrations/openrouter", "integrations/modal", diff --git a/docs/public/integrations/venice.mdx b/docs/public/integrations/venice.mdx new file mode 100644 index 000000000..f172ccb34 --- /dev/null +++ b/docs/public/integrations/venice.mdx @@ -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= +``` + +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`. diff --git a/lib/components/fabro-llm/src/adapter_registry.rs b/lib/components/fabro-llm/src/adapter_registry.rs index a306c846b..60ad8ec42 100644 --- a/lib/components/fabro-llm/src/adapter_registry.rs +++ b/lib/components/fabro-llm/src/adapter_registry.rs @@ -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()); } } diff --git a/lib/components/fabro-llm/src/client.rs b/lib/components/fabro-llm/src/client.rs index fc2802be1..59cfa421d 100644 --- a/lib/components/fabro-llm/src/client.rs +++ b/lib/components/fabro-llm/src/client.rs @@ -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(); diff --git a/lib/foundation/fabro-model/src/catalog/providers/venice.toml b/lib/foundation/fabro-model/src/catalog/providers/venice.toml index dc97c4ab4..9791591e0 100644 --- a/lib/foundation/fabro-model/src/catalog/providers/venice.toml +++ b/lib/foundation/fabro-model/src/catalog/providers/venice.toml @@ -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