fix(llm): send the provider model id on the wire, not the alias
Nightly Build / build (push) Successful in 7m49s
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:
@@ -284,7 +284,7 @@ impl Compaction {
|
||||
let request = ModelRequest {
|
||||
messages: vec![json!({ "role": "user", "content": body })],
|
||||
tools: Vec::new(),
|
||||
model: handle.id.clone(),
|
||||
model: handle.wire_model().to_string(),
|
||||
max_tokens: None,
|
||||
temperature: self.temperature,
|
||||
request_id: uuid_like(),
|
||||
|
||||
@@ -149,7 +149,7 @@ pub(crate) async fn run(
|
||||
let req = ModelRequest {
|
||||
messages: messages.clone(),
|
||||
tools: defs.clone(),
|
||||
model: handle.id.clone(),
|
||||
model: handle.wire_model().to_string(),
|
||||
max_tokens: None,
|
||||
temperature: None,
|
||||
request_id: mint_request_id(),
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,9 +118,10 @@ impl Model for FakeModel {
|
||||
/// `requests()` afterwards).
|
||||
pub fn handle(fake: &std::sync::Arc<FakeModel>, id: &str) -> crate::model::ModelHandle {
|
||||
crate::model::ModelHandle {
|
||||
id: id.to_string(),
|
||||
model: fake.clone(),
|
||||
info: crate::model::ModelInfo::default(),
|
||||
id: id.to_string(),
|
||||
model: fake.clone(),
|
||||
info: crate::model::ModelInfo::default(),
|
||||
wire_id: None,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user