Add Crusoe provider (#3769)

* Add Crusoe provider

* Remove pricing; add Nemotron-3-Ultra-550B

* Address review: declare reasoning_options, theme-adaptive logo

- Add reasoning_options = [] to the 12 reasoning-model TOMLs: Crusoe's
  OpenAI-compatible endpoint documents no caller-side reasoning controls
  (docs.crusoecloud.com defers to the generic OpenAI API reference), so
  an empty declaration is correct per the validate schema.
- logo.svg: drop fixed width/height, use fill="currentColor" so the
  wordmark adapts to light/dark themes.

bun validate passes locally.

* Move reasoning_options rationale comments above first key

* Restore trailing newlines in reasoning-model TOMLs

* fix(crusoe): set reasoning config from live endpoint probe

Probed api.inference.crusoecloud.com on 2026-08-13 with reasoning_effort
low/medium/high/none/max plus tool-call interleaving checks per model.

- gpt-oss-120b: effort low/medium/high (reasoning length scales; none/max
  return 400), interleaved with tool calls
- GLM-5.2, Kimi-K2.6, Nemotron-3-Nano-Omni-Reasoning: toggle (effort
  "none" disables reasoning; low/medium/high inert), interleaved
- GLM-5.1: reasoning always on, no working caller-side control
- Reasoning arrives in the message field named "reasoning", so the
  boolean interleaved form is used
- Drop reasoning_options = [] from non-reasoning models
- Remove six models whose IDs drifted from the live /v1/models catalog
  or whose reasoning deployment is unverified; follow-up will re-add

* fix(crusoe): gemma-4-31b-it reasoning toggle

Base model has reasoning = true so reasoning_options is required by the
schema. Probe shows reasoning_effort acts as an enable/disable toggle on
this deployment (off by default, "none" disables, other values enable).

* feat(crusoe): add per-model pricing

Source: https://www.crusoe.ai/cloud/pricing (accessed 2026-08-13).
Input, output, and cached-read rates per million tokens for all eight
models. Nemotron Omni carries a separate audio input rate (0.50) via
cost.input_audio; its text/image/video input rate is 0.30.
This commit is contained in:
Emmanuel Acheampong
2026-08-13 15:58:39 -07:00
committed by GitHub
parent 6d17729e40
commit 9b01dfab0e
11 changed files with 157 additions and 0 deletions
+23
View File
@@ -0,0 +1,23 @@
name = "DeepSeek V3 0324"
description = "March 2025 checkpoint of DeepSeek-V3 with improved reasoning and coding"
family = "deepseek"
release_date = "2025-03-24"
last_updated = "2025-03-24"
attachment = false
reasoning = false
temperature = true
tool_call = true
open_weights = true
[limit]
context = 163_840
output = 163_840
[modalities]
input = ["text"]
output = ["text"]
[[weights]]
label = "Model weights"
url = "https://huggingface.co/deepseek-ai/DeepSeek-V3-0324"
format = "safetensors"
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 17 KiB

@@ -0,0 +1,7 @@
base_model = "deepseek/deepseek-v3-0324"
# Pricing: https://www.crusoe.ai/cloud/pricing (accessed 2026-08-13)
[cost]
input = 0.50
output = 1.50
cache_read = 0.25
@@ -0,0 +1,15 @@
# Probed live endpoint 2026-08-13 (POST /v1/chat/completions, temperature 0):
# reasoning is off by default (no reasoning field on a plain request);
# setting reasoning_effort to any of low/medium/high enables it (constant
# length, values inert relative to each other) and "none" disables it,
# so this behaves as a toggle. Reasoning text arrives in the message field
# named "reasoning" (not "reasoning_content"). A tool-call request returned
# tool_calls without reasoning text, so no interleaved claim is made.
base_model = "google/gemma-4-31b-it"
reasoning_options = [{ type = "toggle" }]
# Pricing: https://www.crusoe.ai/cloud/pricing (accessed 2026-08-13)
[cost]
input = 0.14
output = 0.40
cache_read = 0.14
@@ -0,0 +1,7 @@
base_model = "meta/llama-3.3-70b-instruct"
# Pricing: https://www.crusoe.ai/cloud/pricing (accessed 2026-08-13)
[cost]
input = 0.25
output = 0.75
cache_read = 0.13
@@ -0,0 +1,15 @@
# Probed live endpoint 2026-08-13 (POST /v1/chat/completions, temperature 0):
# reasoning is on by default; reasoning_effort "none" disables it (0 chars);
# low/medium/high are accepted but do not materially change reasoning
# length, so this is encoded as a toggle (matches deepinfra's Kimi-K2.6
# entry). Reasoning text arrives interleaved with tool_calls, in the
# message field named "reasoning" (not "reasoning_content").
base_model = "moonshotai/kimi-k2.6"
reasoning_options = [{ type = "toggle" }]
interleaved = true
# Pricing: https://www.crusoe.ai/cloud/pricing (accessed 2026-08-13)
[cost]
input = 0.70
output = 3.50
cache_read = 0.35
@@ -0,0 +1,17 @@
# Probed live endpoint 2026-08-13 (POST /v1/chat/completions, temperature 0):
# reasoning is on by default; reasoning_effort "none" disables it (0 chars);
# low/medium/high are accepted but inert; "max" returns HTTP 400. Encoded
# as a toggle. Reasoning text arrives interleaved with tool_calls, in the
# message field named "reasoning" (not "reasoning_content").
base_model = "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning"
reasoning_options = [{ type = "toggle" }]
interleaved = true
# Pricing: https://www.crusoe.ai/cloud/pricing (accessed 2026-08-13).
# Text/image/video input is 0.30; audio input is billed at 0.50
# (cached-audio pricing exists on the page but has no schema field).
[cost]
input = 0.30
output = 1.83
cache_read = 0.30
input_audio = 0.50
@@ -0,0 +1,14 @@
# Probed live endpoint 2026-08-13 (POST /v1/chat/completions, temperature 0):
# reasoning_effort low/medium/high accepted and scale reasoning length
# (26/58/174 chars on the same prompt); "none" and "max" return HTTP 400.
# Reasoning text arrives interleaved with tool_calls, in the message field
# named "reasoning" (not "reasoning_content"), hence the boolean form below.
base_model = "openai/gpt-oss-120b"
reasoning_options = [{ type = "effort", values = ["low", "medium", "high"] }]
interleaved = true
# Pricing: https://www.crusoe.ai/cloud/pricing (accessed 2026-08-13)
[cost]
input = 0.05
output = 0.20
cache_read = 0.05
+15
View File
@@ -0,0 +1,15 @@
# Probed live endpoint 2026-08-13 (POST /v1/chat/completions, temperature 0):
# reasoning is always on. reasoning_effort low/medium/high/none/max are all
# accepted but inert (identical reasoning length on every value; "none"
# does not disable). No working caller-side control was found, so no
# options are advertised. Reasoning text arrives interleaved with
# tool_calls, in the message field named "reasoning".
base_model = "zhipuai/glm-5.1"
reasoning_options = []
interleaved = true
# Pricing: https://www.crusoe.ai/cloud/pricing (accessed 2026-08-13)
[cost]
input = 1.20
output = 4.40
cache_read = 0.25
+16
View File
@@ -0,0 +1,16 @@
# Probed live endpoint 2026-08-13 (POST /v1/chat/completions, temperature 0):
# reasoning is on by default; reasoning_effort "none" disables it
# (0 reasoning tokens); low/medium/high are accepted but do not scale
# reasoning length, so this is encoded as a toggle (matches the zai lab
# GLM entries). usage.completion_tokens_details.reasoning_tokens is
# reported. Reasoning text arrives interleaved with tool_calls, in the
# message field named "reasoning" (not "reasoning_content").
base_model = "zhipuai/glm-5.2"
reasoning_options = [{ type = "toggle" }]
interleaved = true
# Pricing: https://www.crusoe.ai/cloud/pricing (accessed 2026-08-13)
[cost]
input = 1.40
output = 4.40
cache_read = 0.26
+5
View File
@@ -0,0 +1,5 @@
name = "Crusoe"
env = ["CRUSOE_API_KEY"]
npm = "@ai-sdk/openai-compatible"
api = "https://api.inference.crusoecloud.com/v1"
doc = "https://docs.crusoecloud.com/managed-inference/overview"