Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 16 additions & 5 deletions crates/openfang-kernel/src/kernel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1503,17 +1503,23 @@ impl OpenFangKernel {

let tools = self.available_tools(agent_id);
let tools = entry.mode.filter_tools(tools);
let driver = self.resolve_driver(&entry.manifest)?;

let (tx, rx) = tokio::sync::mpsc::channel::<StreamEvent>(64);
let mut manifest = entry.manifest.clone();

// Kimi K2.5/K2 models require temperature=1.0 (API rejects other values)
if manifest.model.model.contains("kimi-k2") {
manifest.model.temperature = 1.0;
}

let driver = self.resolve_driver(&manifest)?;

// Look up model's actual context window from the catalog
let ctx_window = self.model_catalog.read().ok().and_then(|cat| {
cat.find_model(&entry.manifest.model.model)
cat.find_model(&manifest.model.model)
.map(|m| m.context_window as usize)
});

let (tx, rx) = tokio::sync::mpsc::channel::<StreamEvent>(64);
let mut manifest = entry.manifest.clone();

// Lazy backfill: create workspace for existing agents spawned before workspaces
if manifest.workspace.is_none() {
let workspace_dir = self.config.effective_workspaces_dir().join(&manifest.name);
Expand Down Expand Up @@ -2146,6 +2152,11 @@ impl OpenFangKernel {
}
}

// Kimi K2.5/K2 models require temperature=1.0 (API rejects other values)
if manifest.model.model.contains("kimi-k2") {
manifest.model.temperature = 1.0;
}

let driver = self.resolve_driver(&manifest)?;

// Look up model's actual context window from the catalog
Expand Down
3 changes: 3 additions & 0 deletions crates/openfang-kernel/src/metering.rs
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,9 @@ fn estimate_cost_rates(model: &str) -> (f64, f64) {
}

// ── Moonshot / Kimi ─────────────────────────────────────────
if model.contains("kimi-k2") {
return (0.60, 3.00);
}
if model.contains("moonshot") || model.contains("kimi") {
return (0.80, 0.80);
}
Expand Down
38 changes: 34 additions & 4 deletions crates/openfang-runtime/src/model_catalog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -758,7 +758,9 @@ fn builtin_aliases() -> HashMap<String, String> {
("qwen", "qwen-plus"),
("glm", "glm-5-20250605"),
("ernie", "ernie-4.5-8k"),
("kimi", "moonshot-v1-128k"),
("kimi", "kimi-k2.5"),
("kimi-k2.5-0126", "kimi-k2.5"),
("kimi-k2-thinking", "kimi-k2"),
("minimax", "MiniMax-M2.5"),
("minimax-m2.5", "MiniMax-M2.5"),
("minimax-m2.1", "MiniMax-M2.1"),
Expand Down Expand Up @@ -2831,21 +2833,49 @@ fn builtin_models() -> Vec<ModelCatalogEntry> {
aliases: vec!["codegeex".into()],
},
// ══════════════════════════════════════════════════════════════
// Moonshot / Kimi (3)
// Moonshot / Kimi (5)
// ══════════════════════════════════════════════════════════════
ModelCatalogEntry {
id: "kimi-k2.5".into(),
display_name: "Kimi K2.5".into(),
provider: "moonshot".into(),
tier: ModelTier::Smart,
context_window: 262_144,
max_output_tokens: 16_384,
input_cost_per_m: 0.60,
output_cost_per_m: 3.00,
supports_tools: true,
supports_vision: true,
supports_streaming: true,
aliases: vec!["kimi".into(), "kimi-k2.5-0126".into()],
},
ModelCatalogEntry {
id: "kimi-k2".into(),
display_name: "Kimi K2".into(),
provider: "moonshot".into(),
tier: ModelTier::Smart,
context_window: 262_144,
max_output_tokens: 16_384,
input_cost_per_m: 0.60,
output_cost_per_m: 3.00,
supports_tools: true,
supports_vision: false,
supports_streaming: true,
aliases: vec!["kimi-k2-thinking".into()],
},
ModelCatalogEntry {
id: "moonshot-v1-128k".into(),
display_name: "Moonshot V1 128K".into(),
provider: "moonshot".into(),
tier: ModelTier::Smart,
tier: ModelTier::Balanced,
context_window: 131_072,
max_output_tokens: 8_192,
input_cost_per_m: 0.80,
output_cost_per_m: 0.80,
supports_tools: true,
supports_vision: false,
supports_streaming: true,
aliases: vec!["kimi".into()],
aliases: vec![],
},
ModelCatalogEntry {
id: "moonshot-v1-32k".into(),
Expand Down
4 changes: 3 additions & 1 deletion crates/openfang-types/src/model_catalog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,12 @@ pub const QWEN_BASE_URL: &str = "https://dashscope.aliyuncs.com/compatible-mode/
pub const MINIMAX_BASE_URL: &str = "https://api.minimax.io/v1";
pub const ZHIPU_BASE_URL: &str = "https://open.bigmodel.cn/api/paas/v4";
pub const ZHIPU_CODING_BASE_URL: &str = "https://open.bigmodel.cn/api/coding/paas/v4";
pub const MOONSHOT_BASE_URL: &str = "https://api.moonshot.ai/v1";

/// Z.AI domain aliases (same API, different domain).
pub const ZAI_BASE_URL: &str = "https://api.z.ai/api/paas/v4";
pub const ZAI_CODING_BASE_URL: &str = "https://api.z.ai/api/coding/paas/v4";
pub const MOONSHOT_BASE_URL: &str = "https://api.moonshot.cn/v1";

pub const QIANFAN_BASE_URL: &str = "https://qianfan.baidubce.com/v2";
pub const VOLCENGINE_BASE_URL: &str = "https://ark.cn-beijing.volces.com/api/v3";
pub const VOLCENGINE_CODING_BASE_URL: &str = "https://ark.cn-beijing.volces.com/api/coding/v3";
Expand Down