fix(llm): send the provider model id on the wire, not the alias
Nightly Build / build (push) Successful in 7m49s

LlmManager keys its model registry by llm_models.name (the user-facing
alias), and the kernel sent ModelHandle.id as the request's model field —
so the alias, not llm_models.model_id, went on the wire. A model worked
only while the alias was left equal to the model id; renaming it made
every provider reject the call (DeepInfra 404 model_not_found, DeepSeek
400 invalid_request_error).

ModelHandle gains an optional wire_id: the model identifier to put on the
wire when the selector's id is a bookkeeping key. The kernel and the
compaction summary call both send handle.wire_model(); SkaldSelector sets
wire_id from LlmEntry.model (llm_models.model_id). Everything else keeps
keying on the alias: the chat's model pin, health reporting, fallback
exclusion and request logging are untouched.
This commit is contained in:
2026-08-07 14:55:58 +01:00
parent 07d96a4881
commit ea31fad188
5 changed files with 31 additions and 9 deletions
+16 -3
View File
@@ -262,6 +262,18 @@ pub struct ModelHandle {
pub id: ModelId,
pub model: Arc<dyn Model>,
pub info: ModelInfo,
/// Wire model name when it differs from `id`: a selector whose `id` is a
/// bookkeeping key (Skald: the user-facing alias keying its model
/// registry) sets this to the provider's API model id. `None` ⇒ `id`
/// goes on the wire.
pub wire_id: Option<ModelId>,
}
impl ModelHandle {
/// The model identifier to put on the wire.
pub fn wire_model(&self) -> &str {
self.wire_id.as_deref().unwrap_or(&self.id)
}
}
// ── ModelHint ────────────────────────────────────────────────────────────────
@@ -347,9 +359,10 @@ pub trait NamedModel: Model + 'static {
Self: Sized,
{
ModelHandle {
id: self.default_model().to_string(),
model: Arc::new(self),
info: ModelInfo::default(),
id: self.default_model().to_string(),
model: Arc::new(self),
info: ModelInfo::default(),
wire_id: None,
}
}
}