diff --git a/models/alibaba/qwen3-30b-a3b-instruct-2507.toml b/models/alibaba/qwen3-30b-a3b-instruct-2507.toml
new file mode 100644
index 00000000000..8c7cd79c1f8
--- /dev/null
+++ b/models/alibaba/qwen3-30b-a3b-instruct-2507.toml
@@ -0,0 +1,21 @@
+# https://huggingface.co/Qwen/Qwen3-30B-A3B-Instruct-2507 (accessed 2026-09-02)
+name = "Qwen3 30B-A3B Instruct 2507"
+description = "Qwen3 Mixture-of-Experts instruction model for multilingual chat, coding, and tool use"
+family = "qwen"
+release_date = "2025-07-29"
+last_updated = "2025-07-29"
+attachment = false
+reasoning = false
+temperature = true
+tool_call = true
+structured_output = true
+open_weights = true
+license = "apache-2.0"
+
+[limit]
+context = 262_144
+output = 16_384
+
+[modalities]
+input = ["text"]
+output = ["text"]
diff --git a/models/alibaba/qwen3-embedding-8b.toml b/models/alibaba/qwen3-embedding-8b.toml
new file mode 100644
index 00000000000..6d2f4839d91
--- /dev/null
+++ b/models/alibaba/qwen3-embedding-8b.toml
@@ -0,0 +1,20 @@
+# https://huggingface.co/Qwen/Qwen3-Embedding-8B (accessed 2026-09-02)
+name = "Qwen3 Embedding 8B"
+description = "Text embedding model for semantic search, retrieval, clustering, and reranking"
+family = "text-embedding"
+release_date = "2025-06-05"
+last_updated = "2025-06-05"
+attachment = false
+reasoning = false
+temperature = false
+tool_call = false
+open_weights = true
+license = "apache-2.0"
+
+[limit]
+context = 32_768
+output = 0
+
+[modalities]
+input = ["text"]
+output = ["text"]
diff --git a/models/google/gemma-3-27b-it.toml b/models/google/gemma-3-27b-it.toml
new file mode 100644
index 00000000000..314e549c5e6
--- /dev/null
+++ b/models/google/gemma-3-27b-it.toml
@@ -0,0 +1,24 @@
+# Gemma 3 has no native function calling: the served endpoint accepts a tools
+# array but the model answers in prose instead of emitting tool_calls.
+# https://ai.google.dev/gemma/docs/core/model_card_3 (accessed 2026-09-02)
+name = "Gemma 3 27B IT"
+description = "Open multimodal Gemma instruction model for efficient chat, vision, and self-hosted deployments"
+family = "gemma"
+release_date = "2025-03-12"
+last_updated = "2025-03-12"
+attachment = true
+reasoning = false
+temperature = true
+tool_call = false
+structured_output = true
+knowledge = "2024-08"
+open_weights = true
+license = "gemma"
+
+[limit]
+context = 131_072
+output = 8_192
+
+[modalities]
+input = ["text", "image"]
+output = ["text"]
diff --git a/models/nousresearch/hermes-4-405b.toml b/models/nousresearch/hermes-4-405b.toml
new file mode 100644
index 00000000000..9e98652cf51
--- /dev/null
+++ b/models/nousresearch/hermes-4-405b.toml
@@ -0,0 +1,21 @@
+# https://hermes4.nousresearch.com (accessed 2026-09-02)
+name = "Hermes 4 405B"
+description = "Hybrid reasoning model from Nous Research, built on Llama 3.1 405B for deliberate analysis, math, code, and tool use"
+family = "hermes"
+release_date = "2025-08-26"
+last_updated = "2025-08-26"
+attachment = false
+reasoning = true
+temperature = true
+tool_call = true
+structured_output = true
+open_weights = true
+license = "llama3.1"
+
+[limit]
+context = 131_072
+output = 131_072
+
+[modalities]
+input = ["text"]
+output = ["text"]
diff --git a/models/nousresearch/hermes-4-70b.toml b/models/nousresearch/hermes-4-70b.toml
new file mode 100644
index 00000000000..3c0c8b4781a
--- /dev/null
+++ b/models/nousresearch/hermes-4-70b.toml
@@ -0,0 +1,21 @@
+# https://hermes4.nousresearch.com (accessed 2026-09-02)
+name = "Hermes 4 70B"
+description = "Hybrid reasoning model from Nous Research, built on Llama 3.1 70B for deliberate analysis, math, code, and tool use"
+family = "hermes"
+release_date = "2025-08-26"
+last_updated = "2025-08-26"
+attachment = false
+reasoning = true
+temperature = true
+tool_call = true
+structured_output = true
+open_weights = true
+license = "llama3.1"
+
+[limit]
+context = 131_072
+output = 131_072
+
+[modalities]
+input = ["text"]
+output = ["text"]
diff --git a/models/nvidia/cosmos3-super-reasoner.toml b/models/nvidia/cosmos3-super-reasoner.toml
new file mode 100644
index 00000000000..fd966425449
--- /dev/null
+++ b/models/nvidia/cosmos3-super-reasoner.toml
@@ -0,0 +1,22 @@
+# Reasoning tower of NVIDIA Cosmos 3 Super, a 64B two-tower Mixture-of-Transformers
+# built on the Qwen3-VL 32B architecture.
+# https://developer.nvidia.com/blog/develop-physical-ai-reasoning-world-and-action-models-with-nvidia-cosmos-3/
+# (accessed 2026-09-02)
+name = "Cosmos3 Super Reasoner"
+description = "Physical-AI reasoning model for spatial understanding, multi-agent planning, and vision grounding"
+release_date = "2026-06"
+last_updated = "2026-06"
+attachment = true
+reasoning = true
+temperature = true
+tool_call = true
+structured_output = true
+open_weights = true
+
+[limit]
+context = 256_000
+output = 256_000
+
+[modalities]
+input = ["text", "image"]
+output = ["text"]
diff --git a/models/openbmb/minicpm-v-4_5.toml b/models/openbmb/minicpm-v-4_5.toml
new file mode 100644
index 00000000000..e6195a3fb26
--- /dev/null
+++ b/models/openbmb/minicpm-v-4_5.toml
@@ -0,0 +1,20 @@
+# 8.7B vision-language model with controllable hybrid fast/deep thinking.
+# https://huggingface.co/openbmb/MiniCPM-V-4_5 (accessed 2026-09-02)
+name = "MiniCPM-V 4.5"
+description = "Compact vision-language model for OCR, document parsing, and video understanding"
+release_date = "2025-08"
+last_updated = "2025-09"
+attachment = true
+reasoning = true
+temperature = true
+tool_call = false
+open_weights = true
+license = "apache-2.0"
+
+[limit]
+context = 32_768
+output = 32_768
+
+[modalities]
+input = ["text", "image", "video"]
+output = ["text"]
diff --git a/providers/lyceum/logo.svg b/providers/lyceum/logo.svg
new file mode 100644
index 00000000000..93ab5eddaef
--- /dev/null
+++ b/providers/lyceum/logo.svg
@@ -0,0 +1,28 @@
+
diff --git a/providers/lyceum/models/deepseek/deepseek-v4-flash-0731.toml b/providers/lyceum/models/deepseek/deepseek-v4-flash-0731.toml
new file mode 100644
index 00000000000..42a9dcabde2
--- /dev/null
+++ b/providers/lyceum/models/deepseek/deepseek-v4-flash-0731.toml
@@ -0,0 +1,14 @@
+# Effort: reasoning_effort = none|low|high|max; none disables thinking.
+# The unlisted values are accepted but collapse onto these, as on DeepSeek's own API.
+base_model = "deepseek/deepseek-v4-flash-0731"
+reasoning_options = [{ type = "effort", values = ["none", "low", "high", "max"] }]
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 0.25
+output = 0.3
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/deepseek/deepseek-v4-pro.toml b/providers/lyceum/models/deepseek/deepseek-v4-pro.toml
new file mode 100644
index 00000000000..3182906b129
--- /dev/null
+++ b/providers/lyceum/models/deepseek/deepseek-v4-pro.toml
@@ -0,0 +1,12 @@
+# Effort: reasoning_effort = none|high|max; none disables thinking.
+# low and medium map to high upstream, and minimal skips thinking like none.
+base_model = "deepseek/deepseek-v4-pro"
+reasoning_options = [{ type = "effort", values = ["none", "high", "max"] }]
+interleaved = true
+
+[cost]
+input = 1.75
+output = 3.5
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/google/gemma-3-27b-it.toml b/providers/lyceum/models/google/gemma-3-27b-it.toml
new file mode 100644
index 00000000000..05c6b0b10ae
--- /dev/null
+++ b/providers/lyceum/models/google/gemma-3-27b-it.toml
@@ -0,0 +1,5 @@
+base_model = "google/gemma-3-27b-it"
+
+[cost]
+input = 0.1
+output = 0.3
diff --git a/providers/lyceum/models/lyceum/complex.toml b/providers/lyceum/models/lyceum/complex.toml
new file mode 100644
index 00000000000..24c5a0c3144
--- /dev/null
+++ b/providers/lyceum/models/lyceum/complex.toml
@@ -0,0 +1,18 @@
+# Router alias resolved server-side to minimax/minimax-m3; controls and price are its own.
+# No caller control: reasoning_effort, enable_thinking, thinking, thinking.type,
+# reasoning.enabled and chat_template_kwargs.enable_thinking all leave the
+# reasoning on.
+base_model = "minimax/MiniMax-M3"
+name = "Lyceum Complex"
+description = "Routing alias that Lyceum resolves to minimax/minimax-m3"
+reasoning_options = []
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 0.4
+output = 2
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/lyceum/reasoning.toml b/providers/lyceum/models/lyceum/reasoning.toml
new file mode 100644
index 00000000000..62abc4d159f
--- /dev/null
+++ b/providers/lyceum/models/lyceum/reasoning.toml
@@ -0,0 +1,15 @@
+# Router alias resolved server-side to z-ai/glm-5.2; controls and price are its own.
+# Effort: reasoning_effort = none|high|max; none disables thinking.
+# low and medium map to high upstream, and minimal skips thinking like none.
+base_model = "zhipuai/glm-5.2"
+name = "Lyceum Reasoning"
+description = "Routing alias that Lyceum resolves to z-ai/glm-5.2"
+reasoning_options = [{ type = "effort", values = ["none", "high", "max"] }]
+interleaved = true
+
+[cost]
+input = 1.5
+output = 4.5
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/lyceum/simple.toml b/providers/lyceum/models/lyceum/simple.toml
new file mode 100644
index 00000000000..406bc6ee859
--- /dev/null
+++ b/providers/lyceum/models/lyceum/simple.toml
@@ -0,0 +1,13 @@
+# Router alias resolved server-side to qwen/qwen3.5-9b; controls and price are its own.
+# Toggle: reasoning_effort = none disables thinking, any other accepted value enables it.
+base_model = "alibaba/qwen3.5-9b"
+name = "Lyceum Simple"
+description = "Routing alias that Lyceum resolves to qwen/qwen3.5-9b"
+reasoning_options = [{ type = "toggle" }]
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 0.15
+output = 0.2
diff --git a/providers/lyceum/models/meta-llama/llama-3.3-70b-instruct.toml b/providers/lyceum/models/meta-llama/llama-3.3-70b-instruct.toml
new file mode 100644
index 00000000000..ec761624c33
--- /dev/null
+++ b/providers/lyceum/models/meta-llama/llama-3.3-70b-instruct.toml
@@ -0,0 +1,8 @@
+# The lab row carries attachment = true next to text-only modalities; this host
+# rejects an image_url content part outright, so the override is a real delta.
+base_model = "meta/llama-3.3-70b-instruct"
+attachment = false
+
+[cost]
+input = 0.13
+output = 0.4
diff --git a/providers/lyceum/models/minimax/minimax-m2.5.toml b/providers/lyceum/models/minimax/minimax-m2.5.toml
new file mode 100644
index 00000000000..98404bca440
--- /dev/null
+++ b/providers/lyceum/models/minimax/minimax-m2.5.toml
@@ -0,0 +1,16 @@
+# Always reasons. reasoning_effort = none is rejected, and no other wire control
+# turns it off: enable_thinking, thinking, thinking.type, reasoning.enabled and
+# chat_template_kwargs.enable_thinking all leave it on. reasoning.exclude = true
+# only hides the reasoning, which still burns the whole max_tokens budget.
+base_model = "minimax/MiniMax-M2.5"
+reasoning_options = []
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 0.3
+output = 1.2
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/minimax/minimax-m3.toml b/providers/lyceum/models/minimax/minimax-m3.toml
new file mode 100644
index 00000000000..67f7f2b9fe9
--- /dev/null
+++ b/providers/lyceum/models/minimax/minimax-m3.toml
@@ -0,0 +1,15 @@
+# No caller control: reasoning_effort, enable_thinking, thinking, thinking.type,
+# reasoning.enabled and chat_template_kwargs.enable_thinking all leave the
+# reasoning on.
+base_model = "minimax/MiniMax-M3"
+reasoning_options = []
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 0.4
+output = 2
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/moonshotai/kimi-k2.6.toml b/providers/lyceum/models/moonshotai/kimi-k2.6.toml
new file mode 100644
index 00000000000..2a49efbb1e1
--- /dev/null
+++ b/providers/lyceum/models/moonshotai/kimi-k2.6.toml
@@ -0,0 +1,13 @@
+# Toggle: reasoning_effort = none disables thinking, any other accepted value enables it.
+base_model = "moonshotai/kimi-k2.6"
+reasoning_options = [{ type = "toggle" }]
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 1
+output = 4
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/moonshotai/kimi-k2.7-code.toml b/providers/lyceum/models/moonshotai/kimi-k2.7-code.toml
new file mode 100644
index 00000000000..7cbc5d3535f
--- /dev/null
+++ b/providers/lyceum/models/moonshotai/kimi-k2.7-code.toml
@@ -0,0 +1,15 @@
+# No caller control: reasoning_effort, enable_thinking, thinking, thinking.type,
+# reasoning.enabled and chat_template_kwargs.enable_thinking all leave the
+# reasoning on.
+base_model = "moonshotai/kimi-k2.7-code"
+reasoning_options = []
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 1.25
+output = 4.5
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/moonshotai/kimi-k3.toml b/providers/lyceum/models/moonshotai/kimi-k3.toml
new file mode 100644
index 00000000000..5b48f3a3cf0
--- /dev/null
+++ b/providers/lyceum/models/moonshotai/kimi-k3.toml
@@ -0,0 +1,12 @@
+# Effort: reasoning_effort = none|low|high|max; none disables thinking.
+# medium is rejected upstream; the rest collapse onto these levels.
+base_model = "moonshotai/kimi-k3"
+reasoning_options = [{ type = "effort", values = ["none", "low", "high", "max"] }]
+interleaved = true
+
+[cost]
+input = 3
+output = 15
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/nousresearch/hermes-4-405b.toml b/providers/lyceum/models/nousresearch/hermes-4-405b.toml
new file mode 100644
index 00000000000..d6487a83328
--- /dev/null
+++ b/providers/lyceum/models/nousresearch/hermes-4-405b.toml
@@ -0,0 +1,11 @@
+# Hybrid reasoner driven by the system prompt, not a request field: it emits
+# blocks inside content, and reasoning_effort changes nothing.
+base_model = "nousresearch/hermes-4-405b"
+reasoning_options = []
+
+[cost]
+input = 1
+output = 3
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/nousresearch/hermes-4-70b.toml b/providers/lyceum/models/nousresearch/hermes-4-70b.toml
new file mode 100644
index 00000000000..d83de1a2ba1
--- /dev/null
+++ b/providers/lyceum/models/nousresearch/hermes-4-70b.toml
@@ -0,0 +1,11 @@
+# Hybrid reasoner driven by the system prompt, not a request field: it emits
+# blocks inside content, and reasoning_effort changes nothing.
+base_model = "nousresearch/hermes-4-70b"
+reasoning_options = []
+
+[cost]
+input = 0.13
+output = 0.4
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/nvidia/cosmos3-super-reasoner.toml b/providers/lyceum/models/nvidia/cosmos3-super-reasoner.toml
new file mode 100644
index 00000000000..37b6bf9bc70
--- /dev/null
+++ b/providers/lyceum/models/nvidia/cosmos3-super-reasoner.toml
@@ -0,0 +1,11 @@
+# Reasons into blocks inside content when the system prompt asks for it;
+# reasoning_effort is accepted but changes nothing.
+base_model = "nvidia/cosmos3-super-reasoner"
+reasoning_options = []
+
+[cost]
+input = 0.1
+output = 0.3
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/nvidia/llama-3_1-nemotron-ultra-253b-v1.toml b/providers/lyceum/models/nvidia/llama-3_1-nemotron-ultra-253b-v1.toml
new file mode 100644
index 00000000000..cb7f804c5eb
--- /dev/null
+++ b/providers/lyceum/models/nvidia/llama-3_1-nemotron-ultra-253b-v1.toml
@@ -0,0 +1,9 @@
+# Reasoning is switched by the "detailed thinking on" system prompt, not by a
+# request field: the block arrives inside content and reasoning_effort
+# changes nothing.
+base_model = "nvidia/llama-3.1-nemotron-ultra-253b"
+reasoning_options = []
+
+[cost]
+input = 0.6
+output = 1.8
diff --git a/providers/lyceum/models/nvidia/nemotron-3-nano-omni.toml b/providers/lyceum/models/nvidia/nemotron-3-nano-omni.toml
new file mode 100644
index 00000000000..28b1cb1d319
--- /dev/null
+++ b/providers/lyceum/models/nvidia/nemotron-3-nano-omni.toml
@@ -0,0 +1,9 @@
+# Effort: reasoning_effort = none|low|medium|high|max; none disables thinking.
+# This is the set the relay peers author for the same model.
+base_model = "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning"
+reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "high", "max"] }]
+interleaved = true
+
+[cost]
+input = 0.06
+output = 0.24
diff --git a/providers/lyceum/models/nvidia/nemotron-3-super-120b-a12b.toml b/providers/lyceum/models/nvidia/nemotron-3-super-120b-a12b.toml
new file mode 100644
index 00000000000..07adc5dbcbb
--- /dev/null
+++ b/providers/lyceum/models/nvidia/nemotron-3-super-120b-a12b.toml
@@ -0,0 +1,14 @@
+# Effort: reasoning_effort = low|medium|high. This host rejects none, so there is
+# no way to turn the reasoning off.
+base_model = "nvidia/nemotron-3-super-120b-a12b"
+reasoning_options = [{ type = "effort", values = ["low", "medium", "high"] }]
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 0.3
+output = 0.9
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/nvidia/nemotron-3-ultra-550b-a55b.toml b/providers/lyceum/models/nvidia/nemotron-3-ultra-550b-a55b.toml
new file mode 100644
index 00000000000..907db8e796f
--- /dev/null
+++ b/providers/lyceum/models/nvidia/nemotron-3-ultra-550b-a55b.toml
@@ -0,0 +1,14 @@
+# Effort: reasoning_effort = none|medium|high; none disables thinking.
+# This is the set the relay peers author for the same model.
+base_model = "nvidia/nemotron-3-ultra-550b-a55b"
+reasoning_options = [{ type = "effort", values = ["none", "medium", "high"] }]
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 1
+output = 3
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/nvidia/nvidia-nemotron-3-nano-30b-a3b.toml b/providers/lyceum/models/nvidia/nvidia-nemotron-3-nano-30b-a3b.toml
new file mode 100644
index 00000000000..4fe856e7866
--- /dev/null
+++ b/providers/lyceum/models/nvidia/nvidia-nemotron-3-nano-30b-a3b.toml
@@ -0,0 +1,14 @@
+# Toggle: chat_template_kwargs.enable_thinking = false. reasoning_effort is
+# accepted but ignored; the template switch is the only control, and it cuts the
+# completion from 278 to 131 tokens on a fixed prompt rather than just hiding the
+# reasoning.
+base_model = "nvidia/nemotron-3-nano-30b-a3b"
+reasoning_options = [{ type = "toggle" }]
+interleaved = true
+
+[cost]
+input = 0.06
+output = 0.24
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/openai/gpt-oss-120b.toml b/providers/lyceum/models/openai/gpt-oss-120b.toml
new file mode 100644
index 00000000000..d46e5346b8b
--- /dev/null
+++ b/providers/lyceum/models/openai/gpt-oss-120b.toml
@@ -0,0 +1,8 @@
+# Effort: reasoning_effort = low|medium|high; none and minimal are rejected.
+base_model = "openai/gpt-oss-120b"
+reasoning_options = [{ type = "effort", values = ["low", "medium", "high"] }]
+interleaved = true
+
+[cost]
+input = 0.15
+output = 0.6
diff --git a/providers/lyceum/models/openbmb/minicpm-v-4_5.toml b/providers/lyceum/models/openbmb/minicpm-v-4_5.toml
new file mode 100644
index 00000000000..36675384be4
--- /dev/null
+++ b/providers/lyceum/models/openbmb/minicpm-v-4_5.toml
@@ -0,0 +1,12 @@
+# Serving caps max_tokens at 24576 and rejects a tools array. The hybrid thinking
+# mode is not reachable here: reasoning_effort is rejected and no block or
+# reasoning field ever comes back.
+base_model = "openbmb/minicpm-v-4_5"
+reasoning = false
+
+[cost]
+input = 0.66
+output = 1.11
+
+[limit]
+output = 24_576
diff --git a/providers/lyceum/models/qwen/qwen2.5-vl-72b-instruct.toml b/providers/lyceum/models/qwen/qwen2.5-vl-72b-instruct.toml
new file mode 100644
index 00000000000..f71fa713820
--- /dev/null
+++ b/providers/lyceum/models/qwen/qwen2.5-vl-72b-instruct.toml
@@ -0,0 +1,7 @@
+# Vision confirmed end to end: it names the colour of a solid-colour test image.
+base_model = "alibaba/qwen2-5-vl-72b-instruct"
+attachment = true
+
+[cost]
+input = 0.25
+output = 0.75
diff --git a/providers/lyceum/models/qwen/qwen3-235b-a22b-instruct-2507.toml b/providers/lyceum/models/qwen/qwen3-235b-a22b-instruct-2507.toml
new file mode 100644
index 00000000000..0295ca49833
--- /dev/null
+++ b/providers/lyceum/models/qwen/qwen3-235b-a22b-instruct-2507.toml
@@ -0,0 +1,5 @@
+base_model = "alibaba/qwen3-235b-a22b-instruct-2507"
+
+[cost]
+input = 0.2
+output = 0.6
diff --git a/providers/lyceum/models/qwen/qwen3-30b-a3b-instruct-2507.toml b/providers/lyceum/models/qwen/qwen3-30b-a3b-instruct-2507.toml
new file mode 100644
index 00000000000..61795e3e78c
--- /dev/null
+++ b/providers/lyceum/models/qwen/qwen3-30b-a3b-instruct-2507.toml
@@ -0,0 +1,5 @@
+base_model = "alibaba/qwen3-30b-a3b-instruct-2507"
+
+[cost]
+input = 0.1
+output = 0.3
diff --git a/providers/lyceum/models/qwen/qwen3-32b.toml b/providers/lyceum/models/qwen/qwen3-32b.toml
new file mode 100644
index 00000000000..dd14b11c931
--- /dev/null
+++ b/providers/lyceum/models/qwen/qwen3-32b.toml
@@ -0,0 +1,8 @@
+# Reasoning is prompt-driven (Qwen's /think and /no_think convention): the
+# block arrives inside content and reasoning_effort changes nothing.
+base_model = "alibaba/qwen3-32b"
+reasoning_options = []
+
+[cost]
+input = 0.1
+output = 0.3
diff --git a/providers/lyceum/models/qwen/qwen3-embedding-8b.toml b/providers/lyceum/models/qwen/qwen3-embedding-8b.toml
new file mode 100644
index 00000000000..f310b15558c
--- /dev/null
+++ b/providers/lyceum/models/qwen/qwen3-embedding-8b.toml
@@ -0,0 +1,5 @@
+base_model = "alibaba/qwen3-embedding-8b"
+
+[cost]
+input = 0.01
+output = 0
diff --git a/providers/lyceum/models/qwen/qwen3-next-80b-a3b-thinking.toml b/providers/lyceum/models/qwen/qwen3-next-80b-a3b-thinking.toml
new file mode 100644
index 00000000000..da029f301bf
--- /dev/null
+++ b/providers/lyceum/models/qwen/qwen3-next-80b-a3b-thinking.toml
@@ -0,0 +1,10 @@
+# No caller control: reasoning_effort, enable_thinking, thinking, thinking.type,
+# reasoning.enabled and chat_template_kwargs.enable_thinking all leave the
+# reasoning on.
+base_model = "alibaba/qwen3-next-80b-a3b-thinking"
+reasoning_options = []
+interleaved = true
+
+[cost]
+input = 0.15
+output = 1.2
diff --git a/providers/lyceum/models/qwen/qwen3.5-397b-a17b.toml b/providers/lyceum/models/qwen/qwen3.5-397b-a17b.toml
new file mode 100644
index 00000000000..3f9868014b9
--- /dev/null
+++ b/providers/lyceum/models/qwen/qwen3.5-397b-a17b.toml
@@ -0,0 +1,14 @@
+# Toggle: reasoning_effort = none disables thinking, any other accepted value enables it.
+# Rejects an image_url content part, so this host serves it text-only.
+base_model = "alibaba/qwen3.5-397b-a17b"
+attachment = false
+reasoning_options = [{ type = "toggle" }]
+interleaved = true
+
+[cost]
+input = 0.6
+output = 3.6
+
+[modalities]
+input = ["text"]
+output = ["text"]
diff --git a/providers/lyceum/models/qwen/qwen3.5-9b.toml b/providers/lyceum/models/qwen/qwen3.5-9b.toml
new file mode 100644
index 00000000000..648711def3b
--- /dev/null
+++ b/providers/lyceum/models/qwen/qwen3.5-9b.toml
@@ -0,0 +1,10 @@
+# Toggle: reasoning_effort = none disables thinking, any other accepted value enables it.
+base_model = "alibaba/qwen3.5-9b"
+reasoning_options = [{ type = "toggle" }]
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 0.15
+output = 0.2
diff --git a/providers/lyceum/models/qwen/qwen3.8-2.4t-a95b.toml b/providers/lyceum/models/qwen/qwen3.8-2.4t-a95b.toml
new file mode 100644
index 00000000000..bb2e62b8e2c
--- /dev/null
+++ b/providers/lyceum/models/qwen/qwen3.8-2.4t-a95b.toml
@@ -0,0 +1,14 @@
+# Effort: reasoning_effort = low|medium|xhigh, matching Alibaba's own qwen3.8
+# entries. This host rejects none, so the reasoning cannot be turned off.
+base_model = "alibaba/qwen3.8-2.4t-a95b"
+reasoning_options = [{ type = "effort", values = ["low", "medium", "xhigh"] }]
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 2.5
+output = 6
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/qwen/qwen3.8-27b-instant.toml b/providers/lyceum/models/qwen/qwen3.8-27b-instant.toml
new file mode 100644
index 00000000000..3b52fe7734b
--- /dev/null
+++ b/providers/lyceum/models/qwen/qwen3.8-27b-instant.toml
@@ -0,0 +1,11 @@
+# Name-encoded alias for qwen/qwen3.8-27b: Lyceum sends the request with
+# chat_template_kwargs.enable_thinking = false, so this id never reasons.
+# Same weights and price as qwen/qwen3.8-27b; it exists for clients that cannot set
+# request parameters, such as GitHub Copilot and Cursor.
+base_model = "alibaba/qwen3.8-27b"
+name = "Qwen3.8 27B (Instant)"
+reasoning = false
+
+[cost]
+input = 0.4
+output = 2.4
diff --git a/providers/lyceum/models/qwen/qwen3.8-27b.toml b/providers/lyceum/models/qwen/qwen3.8-27b.toml
new file mode 100644
index 00000000000..32e0710bbb5
--- /dev/null
+++ b/providers/lyceum/models/qwen/qwen3.8-27b.toml
@@ -0,0 +1,11 @@
+# Effort: reasoning_effort = none|low|medium|xhigh; none disables thinking.
+# high and max are rejected upstream, matching Alibaba's own qwen3.8 entries.
+base_model = "alibaba/qwen3.8-27b"
+reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "xhigh"] }]
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 0.4
+output = 2.4
diff --git a/providers/lyceum/models/qwen/qwen3.8-flash-next-instant.toml b/providers/lyceum/models/qwen/qwen3.8-flash-next-instant.toml
new file mode 100644
index 00000000000..dc94414f73f
--- /dev/null
+++ b/providers/lyceum/models/qwen/qwen3.8-flash-next-instant.toml
@@ -0,0 +1,14 @@
+# Name-encoded alias for qwen/qwen3.8-flash-next: Lyceum sends the request with
+# chat_template_kwargs.enable_thinking = false, so this id never reasons.
+# Same weights and price as qwen/qwen3.8-flash-next; it exists for clients that cannot set
+# request parameters, such as GitHub Copilot and Cursor.
+base_model = "alibaba/qwen3.8-flash-next"
+name = "Qwen3.8 Flash Next (Instant)"
+reasoning = false
+
+[cost]
+input = 0.2
+output = 0.5
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/qwen/qwen3.8-flash-next.toml b/providers/lyceum/models/qwen/qwen3.8-flash-next.toml
new file mode 100644
index 00000000000..2c735215768
--- /dev/null
+++ b/providers/lyceum/models/qwen/qwen3.8-flash-next.toml
@@ -0,0 +1,14 @@
+# Effort: reasoning_effort = none|low|medium|xhigh; none disables thinking.
+# high and max are rejected upstream, matching Alibaba's own qwen3.8 entries.
+base_model = "alibaba/qwen3.8-flash-next"
+reasoning_options = [{ type = "effort", values = ["none", "low", "medium", "xhigh"] }]
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 0.2
+output = 0.5
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/z-ai/glm-5.1.toml b/providers/lyceum/models/z-ai/glm-5.1.toml
new file mode 100644
index 00000000000..31c6fe91fd6
--- /dev/null
+++ b/providers/lyceum/models/z-ai/glm-5.1.toml
@@ -0,0 +1,15 @@
+# Toggle: reasoning_effort = none disables thinking, any other accepted value enables it.
+# An image_url part is accepted but not actually read (it misnames a solid-colour
+# test image), so the lab's text-only modalities stand.
+base_model = "zhipuai/glm-5.1"
+reasoning_options = [{ type = "toggle" }]
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 1.4
+output = 4.4
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/z-ai/glm-5.2-instant.toml b/providers/lyceum/models/z-ai/glm-5.2-instant.toml
new file mode 100644
index 00000000000..cb1c1200c45
--- /dev/null
+++ b/providers/lyceum/models/z-ai/glm-5.2-instant.toml
@@ -0,0 +1,14 @@
+# Name-encoded alias for z-ai/glm-5.2: Lyceum sends the request with
+# chat_template_kwargs.enable_thinking = false, so this id never reasons.
+# Same weights and price as z-ai/glm-5.2; it exists for clients that cannot set
+# request parameters, such as GitHub Copilot and Cursor.
+base_model = "zhipuai/glm-5.2"
+name = "GLM-5.2 (Instant)"
+reasoning = false
+
+[cost]
+input = 1.5
+output = 4.5
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/z-ai/glm-5.2.toml b/providers/lyceum/models/z-ai/glm-5.2.toml
new file mode 100644
index 00000000000..c7e93f97694
--- /dev/null
+++ b/providers/lyceum/models/z-ai/glm-5.2.toml
@@ -0,0 +1,12 @@
+# Effort: reasoning_effort = none|high|max; none disables thinking.
+# low and medium map to high upstream, and minimal skips thinking like none.
+base_model = "zhipuai/glm-5.2"
+reasoning_options = [{ type = "effort", values = ["none", "high", "max"] }]
+interleaved = true
+
+[cost]
+input = 1.5
+output = 4.5
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/z-ai/glm-5.3-flash-instant.toml b/providers/lyceum/models/z-ai/glm-5.3-flash-instant.toml
new file mode 100644
index 00000000000..1b2224d80ad
--- /dev/null
+++ b/providers/lyceum/models/z-ai/glm-5.3-flash-instant.toml
@@ -0,0 +1,14 @@
+# Name-encoded alias for z-ai/glm-5.3-flash: Lyceum sends the request with
+# chat_template_kwargs.enable_thinking = false, so this id never reasons.
+# Same weights and price as z-ai/glm-5.3-flash; it exists for clients that cannot set
+# request parameters, such as GitHub Copilot and Cursor.
+base_model = "zhipuai/glm-5.3-flash"
+name = "GLM-5.3 Flash (Instant)"
+reasoning = false
+
+[cost]
+input = 0.2
+output = 0.5
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/z-ai/glm-5.3-flash.toml b/providers/lyceum/models/z-ai/glm-5.3-flash.toml
new file mode 100644
index 00000000000..e93acc97078
--- /dev/null
+++ b/providers/lyceum/models/z-ai/glm-5.3-flash.toml
@@ -0,0 +1,14 @@
+# Effort: reasoning_effort = none|low|high|max; none disables thinking.
+# The unlisted values are accepted but collapse onto these, as on Z.ai's own API.
+base_model = "zhipuai/glm-5.3-flash"
+reasoning_options = [{ type = "effort", values = ["none", "low", "high", "max"] }]
+
+[interleaved]
+field = "reasoning_content"
+
+[cost]
+input = 0.2
+output = 0.5
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/z-ai/glm-5.3-instant.toml b/providers/lyceum/models/z-ai/glm-5.3-instant.toml
new file mode 100644
index 00000000000..cf6b0b5ae61
--- /dev/null
+++ b/providers/lyceum/models/z-ai/glm-5.3-instant.toml
@@ -0,0 +1,14 @@
+# Name-encoded alias for z-ai/glm-5.3: Lyceum sends the request with
+# chat_template_kwargs.enable_thinking = false, so this id never reasons.
+# Same weights and price as z-ai/glm-5.3; it exists for clients that cannot set
+# request parameters, such as GitHub Copilot and Cursor.
+base_model = "zhipuai/glm-5.3"
+name = "GLM-5.3 (Instant)"
+reasoning = false
+
+[cost]
+input = 1.75
+output = 4.5
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/models/z-ai/glm-5.3.toml b/providers/lyceum/models/z-ai/glm-5.3.toml
new file mode 100644
index 00000000000..80a4d5e6aa0
--- /dev/null
+++ b/providers/lyceum/models/z-ai/glm-5.3.toml
@@ -0,0 +1,12 @@
+# Effort: reasoning_effort = none|low|high|max; none disables thinking.
+# The unlisted values are accepted but collapse onto these, as on Z.ai's own API.
+base_model = "zhipuai/glm-5.3"
+reasoning_options = [{ type = "effort", values = ["none", "low", "high", "max"] }]
+interleaved = true
+
+[cost]
+input = 1.75
+output = 4.5
+
+[limit]
+output = 65_536
diff --git a/providers/lyceum/provider.toml b/providers/lyceum/provider.toml
new file mode 100644
index 00000000000..abd148dec16
--- /dev/null
+++ b/providers/lyceum/provider.toml
@@ -0,0 +1,12 @@
+# OpenAI-compatible surface: POST https://api.lyceum.technology/openai/v1/chat/completions,
+# GET /openai/v1/models. An Anthropic Messages surface exists at
+# https://api.lyceum.technology/anthropic/v1/messages.
+# Reasoning control is `reasoning_effort`; the accepted values differ per model
+# and are recorded on each model file. `max_tokens` is capped at 65536 for every
+# model, so every entry resolves limit.output to at most that.
+# https://docs.lyceum.technology/docs/inference/serverless (accessed 2026-09-02)
+name = "Lyceum"
+env = ["LYCEUM_API_KEY"]
+npm = "@ai-sdk/openai-compatible"
+api = "https://api.lyceum.technology/openai/v1"
+doc = "https://docs.lyceum.technology/docs/inference/serverless"