llm: drop model/agent scope matching; add instance-wide compaction model picker
Nightly Build / build (push) Successful in 6m50s
Nightly Build / build (push) Successful in 6m50s
Remove the scope system end-to-end (llm_models.scope column, agent meta scope field, scope-based tier in model selection, UI checkboxes/pills): it was only a soft ranking hint, had drifted (6 UI scopes vs 3 used by agents, 'general' not even selectable) and duplicated what strength already decides. Strength stays the single AUTO-selection axis. Compaction: the summary model is now pickable from the Settings page via a new PropertyType::LlmModel config property (registry key compaction_model), instance-wide and live (no restart). Fallback chain: explicit pick -> compaction.strength from config.yml -> priority order; a deleted configured model degrades to AUTO. ContextCompactor reads the key at compact time through GlobalConfigManager.
This commit is contained in:
@@ -57,7 +57,6 @@ impl ChatSessionHandler {
|
||||
let explicit_client = args["client"].as_str().or(target_meta.client.as_deref());
|
||||
let (resolved_client, _) = self.llm_manager.resolve(
|
||||
explicit_client,
|
||||
target_meta.scope.as_deref(),
|
||||
target_meta.strength,
|
||||
).await.map_err(|e| anyhow::anyhow!("dispatch_sub_agent: {e}"))?;
|
||||
|
||||
@@ -241,7 +240,7 @@ impl ChatSessionHandler {
|
||||
let meta = crate::agents::load_task_meta(&frame.agent_id)
|
||||
.map_err(|e| anyhow::anyhow!("resume: cannot load sub-agent `{}`: {e}", frame.agent_id))?;
|
||||
let (client, _) = self.llm_manager.resolve(
|
||||
meta.client.as_deref(), meta.scope.as_deref(), meta.strength,
|
||||
meta.client.as_deref(), meta.strength,
|
||||
).await?;
|
||||
self.build_sub_agent_config(root_config, &frame.agent_id, client.to_string(), frame.id, frame.depth).await
|
||||
}
|
||||
|
||||
@@ -50,7 +50,6 @@ impl ChatSessionHandler {
|
||||
let meta = crate::agents::load_meta(&self.agent_id).ok();
|
||||
let (key, _) = self.llm_manager.resolve(
|
||||
client_name.as_deref(),
|
||||
meta.as_ref().and_then(|m| m.scope.as_deref()),
|
||||
meta.as_ref().and_then(|m| m.strength),
|
||||
).await?;
|
||||
|
||||
|
||||
@@ -45,7 +45,6 @@ impl ChatSessionHandler {
|
||||
stack_id: i64,
|
||||
config: &AgentRunConfig,
|
||||
active_grants: &HashSet<String>,
|
||||
req_scope: Option<&str>,
|
||||
req_strength: Option<LlmStrength>,
|
||||
cur_name: &mut String,
|
||||
cur_llm: &mut Arc<LlmEntry>,
|
||||
@@ -155,7 +154,7 @@ impl ChatSessionHandler {
|
||||
}
|
||||
|
||||
let excluded: Vec<&str> = tried_this_round.iter().map(String::as_str).collect();
|
||||
match self.llm_manager.select_excluding(&excluded, req_scope, req_strength).await {
|
||||
match self.llm_manager.select_excluding(&excluded, req_strength).await {
|
||||
Ok((next_name, next_llm)) => {
|
||||
warn!(session_id = self.session_id, from = %cur_name, to = %next_name, "LLM fallback");
|
||||
em.model_fallback(cur_name.clone(), next_name.clone(), first_line(&e.to_string())).await;
|
||||
|
||||
@@ -65,9 +65,8 @@ impl ChatSessionHandler {
|
||||
let mut cur_llm = self.llm_manager.get(&cur_name).await
|
||||
.ok_or_else(|| anyhow::anyhow!("LLM client '{}' not found", cur_name))?;
|
||||
|
||||
// Scope/strength needed for fallback re-selection.
|
||||
// Strength needed for fallback re-selection.
|
||||
let meta = crate::agents::load_meta(&config.agent_id).ok();
|
||||
let req_scope = meta.as_ref().and_then(|m| m.scope.as_deref()).map(str::to_string);
|
||||
let req_strength = meta.as_ref().and_then(|m| m.strength);
|
||||
|
||||
// Accumulates tool calls across all rounds for the event bus.
|
||||
@@ -132,7 +131,7 @@ impl ChatSessionHandler {
|
||||
// retriable errors. `cur_name`/`cur_llm`/`messages` are updated in place.
|
||||
let turn_result = match self.call_llm_round(
|
||||
stack_id, config, &active_grants_snapshot,
|
||||
req_scope.as_deref(), req_strength,
|
||||
req_strength,
|
||||
&mut cur_name, &mut cur_llm, &mut messages, token, &em,
|
||||
).await {
|
||||
RoundLlm::Turn(t) => t,
|
||||
|
||||
Reference in New Issue
Block a user