feat(pioneer): add 26 models (Kimi K3, Claude Opus 5, GPT-5.6) (#3814)

* fix(pioneer): filter API alias dupes, derive cost, honor base-model reasoning

Pioneer /v1/models returns each served model twice: once under its real
id and once under a duplicate "anthropic/pioneer/<id>" alias. Drop the
aliases so the sync no longer authors phantom "anthropic/pioneer/*" TOMLs.

Also derive cost from the API's per-1M-token prices for newly created
models (previously cost was only preserved from an existing file), and
trust the base model's authored reasoning flag instead of Pioneer's
boilerplate reasoning levels, which are identical for every model and
were wrongly marking non-reasoning models (e.g. Pixtral) as reasoning.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(pioneer): add frontier and open models via base_model inheritance

Add 26 Pioneer models, each inheriting provider-agnostic facts through
base_model rather than duplicating them inline.

New model metadata entries:
- anthropic/claude-opus-5 (released 2026-07-24)
- alibaba/qwen2.5-coder-0.5b, alibaba/qwen3-235b-a22b-instruct-2507
- deepseek/deepseek-v3, deepseek/deepseek-v3.1
- meta/llama-3.2-1b, meta/llama-3.2-3b
- mistral/codestral-22b-v0.1, mistral/magistral-small-2506,
  mistral/ministral-8b-instruct-2410

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(qwen): set tool_call=false for Qwen2.5-Coder-0.5B base model

The served id and weights are the base (pretrained) checkpoint, not the
Instruct variant. The Qwen model card states base models are not
recommended for conversation and documents no tool/function calling, so
tool_call=true was inaccurate. Matches the Llama base entries in this PR.

---------

Co-authored-by: Samrath <samrath@Samraths-MacBook-Pro-6.local>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Samrath
2026-08-06 01:49:10 +05:30
committed by GitHub
parent 22071a018b
commit 43ff4ad9b5
37 changed files with 670 additions and 9 deletions
+23
View File
@@ -0,0 +1,23 @@
name = "Qwen2.5-Coder-0.5B"
description = "Tiny open Qwen code model for lightweight completion and on-device coding"
family = "qwen"
release_date = "2024-11-12"
last_updated = "2024-11-12"
attachment = false
reasoning = false
temperature = true
tool_call = false
open_weights = true
license = "Apache 2.0"
[limit]
context = 32_768
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/Qwen/Qwen2.5-Coder-0.5B"
@@ -0,0 +1,23 @@
name = "Qwen3 235B-A22B Instruct 2507"
description = "Updated large open Qwen3 MoE instruct model for multilingual chat, coding, and tool use"
family = "qwen"
release_date = "2025-07-21"
last_updated = "2025-07-21"
attachment = false
reasoning = false
temperature = true
tool_call = true
open_weights = true
license = "Apache 2.0"
[limit]
context = 262_144
output = 16_384
[modalities]
input = ["text"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/Qwen/Qwen3-235B-A22B-Instruct-2507"
+23
View File
@@ -0,0 +1,23 @@
name = "DeepSeek-V3.1"
description = "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes"
family = "deepseek"
release_date = "2025-08-21"
last_updated = "2025-08-21"
attachment = false
reasoning = true
temperature = true
tool_call = true
open_weights = true
license = "MIT License"
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/deepseek-ai/DeepSeek-V3.1"
+23
View File
@@ -0,0 +1,23 @@
name = "DeepSeek-V3"
description = "Open DeepSeek MoE chat model for coding, math, and general reasoning"
family = "deepseek"
release_date = "2024-12-26"
last_updated = "2024-12-26"
attachment = false
reasoning = false
temperature = true
tool_call = true
open_weights = true
license = "DeepSeek Model License"
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/deepseek-ai/DeepSeek-V3"
+24
View File
@@ -0,0 +1,24 @@
name = "Llama-3.2-1B"
description = "Compact open Llama base model for lightweight and on-device use"
family = "llama"
release_date = "2024-09-25"
last_updated = "2024-09-25"
attachment = false
reasoning = false
temperature = true
tool_call = false
knowledge = "2023-12"
open_weights = true
license = "Llama 3.2 Community License"
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/meta-llama/Llama-3.2-1B"
+24
View File
@@ -0,0 +1,24 @@
name = "Llama-3.2-3B"
description = "Small open Llama base model for lightweight text generation and self-hosting"
family = "llama"
release_date = "2024-09-25"
last_updated = "2024-09-25"
attachment = false
reasoning = false
temperature = true
tool_call = false
knowledge = "2023-12"
open_weights = true
license = "Llama 3.2 Community License"
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/meta-llama/Llama-3.2-3B"
+23
View File
@@ -0,0 +1,23 @@
name = "Codestral-22B-v0.1"
description = "Open Mistral code model for fill-in-the-middle and 80+ programming languages"
family = "codestral"
release_date = "2024-05-29"
last_updated = "2024-05-29"
attachment = false
reasoning = false
temperature = true
tool_call = false
open_weights = true
license = "Mistral AI Non-Production License"
[limit]
context = 32_768
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/mistralai/Codestral-22B-v0.1"
+23
View File
@@ -0,0 +1,23 @@
name = "Magistral Small"
description = "Open Mistral reasoning model for transparent step-by-step problem solving"
family = "magistral"
release_date = "2025-06-10"
last_updated = "2025-06-10"
attachment = false
reasoning = true
temperature = true
tool_call = true
open_weights = true
license = "Apache 2.0"
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/mistralai/Magistral-Small-2506"
@@ -0,0 +1,23 @@
name = "Ministral 8B Instruct"
description = "Efficient open Mistral edge model for on-device chat and function calling"
family = "ministral"
release_date = "2024-10-16"
last_updated = "2024-10-16"
attachment = false
reasoning = false
temperature = true
tool_call = true
open_weights = true
license = "Mistral Research License"
[limit]
context = 131_072
output = 8_192
[modalities]
input = ["text"]
output = ["text"]
[[weights]]
label = "Hugging Face"
url = "https://huggingface.co/mistralai/Ministral-8B-Instruct-2410"
+93 -9
View File
@@ -1,19 +1,64 @@
import { readFileSync } from "node:fs";
import path from "node:path";
import { z } from "zod";
import { describeModel } from "../../describe.js";
import type { ExistingModel, SyncProvider, SyncedFullModel, SyncedModel } from "../index.js";
import { factorBaseModel } from "./openrouter.js";
const MODELS_DIR = path.join(import.meta.dirname, "..", "..", "..", "..", "..", "models");
const baseModelReasoningCache = new Map<string, boolean>();
/** Whether the base model's authored metadata declares it a reasoning model. */
function baseModelReasoning(modelID: string): boolean {
let value = baseModelReasoningCache.get(modelID);
if (value === undefined) {
const parsed = Bun.TOML.parse(
readFileSync(path.join(MODELS_DIR, `${modelID}.toml`), "utf8"),
) as Record<string, unknown>;
value = parsed.reasoning === true;
baseModelReasoningCache.set(modelID, value);
}
return value;
}
const API_ENDPOINT = "https://api.pioneer.ai/v1/models";
const BaseModels: Record<string, string> = {
"Qwen/Qwen2.5-Coder-0.5B": "alibaba/qwen2.5-coder-0.5b",
"Qwen/Qwen3-235B-A22B-Instruct-2507": "alibaba/qwen3-235b-a22b-instruct-2507",
"Qwen/Qwen3.5-9B": "alibaba/qwen3.5-9b",
"deepseek-ai/DeepSeek-V3": "deepseek/deepseek-v3",
"deepseek-ai/DeepSeek-V3.1": "deepseek/deepseek-v3.1",
"meta-llama/Llama-3.2-1B": "meta/llama-3.2-1b",
"meta-llama/Llama-3.2-3B": "meta/llama-3.2-3b",
"mistralai/Codestral-22B-v0.1": "mistral/codestral-22b-v0.1",
"mistralai/Magistral-Small-2506": "mistral/magistral-small-2506",
"mistralai/Ministral-8B-Instruct-2410": "mistral/ministral-8b-instruct-2410",
"claude-3-7-sonnet-latest": "anthropic/claude-3-7-sonnet-20250219",
"claude-fable-5": "anthropic/claude-fable-5",
"claude-opus-5": "anthropic/claude-opus-5",
"claude-sonnet-5": "anthropic/claude-sonnet-5",
"devstral-2": "mistral/devstral-2512",
"gemini-3.1-flash-lite": "google/gemini-3.1-flash-lite",
"gemini-3.5-flash-lite": "google/gemini-3.5-flash-lite",
"gemini-3.6-flash": "google/gemini-3.6-flash",
"google/gemma-4-E2B-it": "google/gemma-4-E2B-it",
"google/gemma-4-E4B-it": "google/gemma-4-E4B-it",
"gpt-5.6-luna": "openai/gpt-5.6-luna",
"gpt-5.6-sol": "openai/gpt-5.6-sol",
"gpt-5.6-terra": "openai/gpt-5.6-terra",
"grok-4.5": "xai/grok-4.5",
"meta/muse-spark-1.1": "meta/muse-spark-1.1",
"mistral-large-3": "mistral/mistral-large-2512",
"mistral-medium-3.5": "mistral/mistral-medium-2604",
"mistralai/Pixtral-12B-2409": "mistral/pixtral-12b",
"moonshotai/Kimi-K2.7-Code": "moonshotai/kimi-k2.7-code",
"moonshotai/Kimi-K3": "moonshotai/kimi-k3",
"openai/gpt-oss-120b": "openai/gpt-oss-120b",
"openai/gpt-oss-20b": "openai/gpt-oss-20b",
"poolside/laguna-s-2.1": "poolside/laguna-s-2.1",
"sakana/fugu-ultra": "sakana/fugu-ultra",
"zai-org/GLM-5.2": "zhipuai/glm-5.2",
};
@@ -63,6 +108,10 @@ const PioneerServedModel = z
max_input_tokens: z.number().int().nonnegative(),
max_tokens: z.number().int().nonnegative(),
deprecated: z.boolean().optional(),
input_price_per_million: z.number().nonnegative().optional(),
output_price_per_million: z.number().nonnegative().optional(),
cache_read_price_per_million: z.number().nonnegative().optional(),
cache_write_price_per_million: z.number().nonnegative().optional(),
capabilities: z
.object({
image_input: Capability.optional(),
@@ -106,10 +155,16 @@ export const pioneer = {
parseModels(raw) {
const parsed = PioneerResponse.parse(raw);
const metadata = new Map(parsed.models.map((model) => [model.slug, model]));
return parsed.data.map((model) => ({
...model,
metadata: metadata.get(model.id),
}));
// Pioneer /v1/models returns each served model twice: once under its real
// id (e.g. "gpt-4o") and once under a duplicate "anthropic/pioneer/<id>"
// alias. The aliased entries are not real catalog models; drop them so the
// sync does not author phantom "anthropic/pioneer/*" TOMLs.
return parsed.data
.filter((model) => !model.id.startsWith("anthropic/pioneer/"))
.map((model) => ({
...model,
metadata: metadata.get(model.id),
}));
},
translateModel(model, context) {
return {
@@ -162,6 +217,28 @@ function pioneerReasoningOptions(model: PioneerModel): SyncedFullModel["reasonin
return values.length > 0 ? [{ type: "effort", values }] : undefined;
}
function pioneerCost(
model: PioneerModel,
existing: ExistingModel | undefined,
): SyncedFullModel["cost"] {
// Preserve any hand-authored cost; otherwise derive from the API's
// per-1M-token prices (which are already in the catalog's per-1M unit).
if (existing?.cost !== undefined) return existing.cost;
if (model.input_price_per_million === undefined || model.output_price_per_million === undefined) {
return undefined;
}
return {
input: model.input_price_per_million,
output: model.output_price_per_million,
...(model.cache_read_price_per_million !== undefined
? { cache_read: model.cache_read_price_per_million }
: {}),
...(model.cache_write_price_per_million !== undefined
? { cache_write: model.cache_write_price_per_million }
: {}),
};
}
function buildPioneerModel(
model: PioneerModel,
existing: ExistingModel | undefined,
@@ -179,12 +256,19 @@ function buildPioneerModel(
input: existing?.limit?.input,
output: model.max_tokens,
};
// Pioneer reports identical boilerplate reasoning levels for every model,
// so it is not a reliable reasoning signal. Trust the base model's authored
// metadata: only mark reasoning / attach reasoning_options when the base
// model is genuinely a reasoning model.
const baseReasoning = baseModelReasoning(baseModel);
return factorBaseModel(baseModel, {
cost: existing?.cost,
reasoning: apiReasoningOptions !== undefined ? true : undefined,
reasoning_options: reasoningOptions,
cost: pioneerCost(model, existing),
reasoning: undefined,
reasoning_options: baseReasoning
? (apiReasoningOptions ?? existing?.reasoning_options)
: undefined,
status,
interleaved,
interleaved: baseReasoning ? interleaved : undefined,
limit,
}, limit, existing?.base_model_omit);
}
@@ -221,7 +305,7 @@ function buildPioneerModel(
open_weights: existing?.open_weights ?? false,
status,
interleaved,
cost: existing?.cost,
cost: pioneerCost(model, existing),
limit: {
context: model.max_input_tokens,
input: existing?.limit?.input,
+2
View File
@@ -89,8 +89,10 @@ export type ModelFamily =
| "kimi"
| "kimi-free"
| "kimi-k2"
| "kimi-k3"
| "kimi-thinking"
| "laguna"
| "laguna-s"
| "ling"
| "ling-flash-free"
| "liquid"
@@ -0,0 +1,10 @@
base_model = "alibaba/qwen2.5-coder-0.5b"
[cost]
input = 0.1
output = 0.1
cache_read = 0.1
cache_write = 0.1
[limit]
output = 32_768
@@ -0,0 +1,10 @@
base_model = "alibaba/qwen3-235b-a22b-instruct-2507"
[cost]
input = 1.2
output = 1.2
cache_read = 1.2
cache_write = 1.2
[limit]
output = 131_072
@@ -0,0 +1,18 @@
base_model = "anthropic/claude-3-7-sonnet-20250219"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[cost]
input = 3
output = 15
cache_read = 0.3
cache_write = 3.75
[limit]
context = 1_000_000
output = 128_000
@@ -0,0 +1,14 @@
base_model = "anthropic/claude-fable-5"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high", "xhigh"]
[cost]
input = 11
output = 55
cache_read = 1.1
cache_write = 13.75
@@ -0,0 +1,14 @@
base_model = "anthropic/claude-opus-5"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[cost]
input = 5
output = 25
cache_read = 0.5
cache_write = 6.25
@@ -0,0 +1,14 @@
base_model = "anthropic/claude-sonnet-5"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[cost]
input = 2
output = 10
cache_read = 0.2
cache_write = 2.5
@@ -0,0 +1,18 @@
base_model = "deepseek/deepseek-v3.1"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high", "xhigh"]
[cost]
input = 0.56
output = 1.68
cache_read = 0.56
cache_write = 0.56
[limit]
context = 163_840
output = 131_072
@@ -0,0 +1,10 @@
base_model = "deepseek/deepseek-v3"
[cost]
input = 0.27
output = 1.12
cache_read = 0.135
cache_write = 0.27
[limit]
context = 163_840
+11
View File
@@ -0,0 +1,11 @@
base_model = "mistral/devstral-2512"
[cost]
input = 0.4
output = 2
cache_read = 0.4
cache_write = 0.4
[limit]
context = 256_000
output = 131_072
@@ -0,0 +1,18 @@
base_model = "google/gemini-3.1-flash-lite"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[cost]
input = 0.25
output = 1.5
cache_read = 0.03
cache_write = 0.25
[limit]
context = 1_000_000
output = 64_000
@@ -0,0 +1,18 @@
base_model = "google/gemini-3.5-flash-lite"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[cost]
input = 0.3
output = 2.5
cache_read = 0.03
cache_write = 0.3
[limit]
context = 1_000_000
output = 65_000
@@ -0,0 +1,18 @@
base_model = "google/gemini-3.6-flash"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[cost]
input = 1.5
output = 7.5
cache_read = 0.15
cache_write = 1.5
[limit]
context = 1_000_000
output = 64_000
@@ -0,0 +1,14 @@
base_model = "openai/gpt-5.6-luna"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high", "xhigh"]
[cost]
input = 1
output = 6
cache_read = 0.1
cache_write = 1.25
+14
View File
@@ -0,0 +1,14 @@
base_model = "openai/gpt-5.6-sol"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high", "xhigh"]
[cost]
input = 5
output = 30
cache_read = 0.5
cache_write = 6.25
@@ -0,0 +1,14 @@
base_model = "openai/gpt-5.6-terra"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high", "xhigh"]
[cost]
input = 2.5
output = 15
cache_read = 0.25
cache_write = 3.125
+17
View File
@@ -0,0 +1,17 @@
base_model = "xai/grok-4.5"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[cost]
input = 2
output = 6
cache_read = 0.5
cache_write = 2
[limit]
output = 131_072
@@ -0,0 +1,10 @@
base_model = "meta/llama-3.2-1b"
[cost]
input = 0.1
output = 0.1
cache_read = 0.1
cache_write = 0.1
[limit]
output = 131_072
@@ -0,0 +1,10 @@
base_model = "meta/llama-3.2-3b"
[cost]
input = 0.1
output = 0.1
cache_read = 0.1
cache_write = 0.1
[limit]
output = 131_072
@@ -0,0 +1,18 @@
base_model = "meta/muse-spark-1.1"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[cost]
input = 1.25
output = 4.25
cache_read = 0.15
cache_write = 1.25
[limit]
context = 1_048_576
output = 131_072
@@ -0,0 +1,11 @@
base_model = "mistral/mistral-large-2512"
[cost]
input = 0.5
output = 1.5
cache_read = 0.5
cache_write = 0.5
[limit]
context = 256_000
output = 131_072
@@ -0,0 +1,11 @@
base_model = "mistral/codestral-22b-v0.1"
[cost]
input = 0.3
output = 0.9
cache_read = 0.3
cache_write = 0.3
[limit]
context = 128_000
output = 4_000
@@ -0,0 +1,18 @@
base_model = "mistral/magistral-small-2506"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[cost]
input = 0.5
output = 1.5
cache_read = 0.5
cache_write = 0.5
[limit]
context = 128_000
output = 64_000
@@ -0,0 +1,11 @@
base_model = "mistral/ministral-8b-instruct-2410"
[cost]
input = 0.15
output = 0.15
cache_read = 0.15
cache_write = 0.15
[limit]
context = 128_000
output = 4_000
@@ -0,0 +1,10 @@
base_model = "mistral/pixtral-12b"
[cost]
input = 0.15
output = 0.15
cache_read = 0.15
cache_write = 0.15
[limit]
output = 4_000
@@ -0,0 +1,17 @@
base_model = "moonshotai/kimi-k3"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[cost]
input = 3
output = 15
cache_read = 0.3
cache_write = 3
[limit]
context = 1_000_000
@@ -0,0 +1,18 @@
base_model = "poolside/laguna-s-2.1"
[interleaved]
field = "reasoning_content"
[[reasoning_options]]
type = "effort"
values = ["low", "medium", "high"]
[cost]
input = 0.1
output = 0.2
cache_read = 0.01
cache_write = 0.1
[limit]
context = 1_000_000
output = 131_072