Skip to content
Merged
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
17 changes: 3 additions & 14 deletions crates/goose-cli/src/session/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -648,18 +648,8 @@ pub async fn build_session(session_config: SessionBuilderConfig) -> CliSession {
process::exit(1);
}
};
let provider_for_display = Arc::clone(&new_provider);

if let Some(lead_worker) = new_provider.as_lead_worker() {
let (lead_model, worker_model) = lead_worker.get_model_info();
tracing::info!(
"🤖 Lead/Worker Mode Enabled: Lead model (first 3 turns): {}, Worker model (turn 4+): {}, Auto-fallback on failures: Enabled",
lead_model,
worker_model
);
} else {
tracing::info!("🤖 Using model: {}", resolved.model_name);
}
let provider_for_debug = Arc::clone(&new_provider);
tracing::info!("🤖 Using model: {}", resolved.model_name);

agent
.update_provider(new_provider, &session_id)
Expand Down Expand Up @@ -692,7 +682,7 @@ pub async fn build_session(session_config: SessionBuilderConfig) -> CliSession {
let agent_ptr = resolve_and_load_extensions(
agent,
extensions_for_provider,
Arc::clone(&provider_for_display),
Arc::clone(&provider_for_debug),
session_config.interactive,
&session_id,
)
Expand Down Expand Up @@ -732,7 +722,6 @@ pub async fn build_session(session_config: SessionBuilderConfig) -> CliSession {
&resolved.provider_name,
&resolved.model_name,
&Some(session_id),
Some(&provider_for_display),
);
}
session
Expand Down
11 changes: 0 additions & 11 deletions crates/goose-cli/src/session/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,6 @@ enum StreamEvent {
#[serde(flatten)]
data: NotificationData,
},
ModelChange {
model: String,
mode: String,
},
Error {
error: String,
},
Expand Down Expand Up @@ -1070,13 +1066,6 @@ impl CliSession {
Some(Ok(AgentEvent::HistoryReplaced(updated_conversation))) => {
self.messages = updated_conversation;
}
Some(Ok(AgentEvent::ModelChange { model, mode })) => {
if is_stream_json_mode {
emit_stream_event(&StreamEvent::ModelChange { model: model.clone(), mode: mode.clone() });
} else if self.debug {
eprintln!("Model changed to {} in {} mode", model, mode);
}
}
Some(Err(e)) => {
handle_agent_error(&e, is_stream_json_mode);
cancel_token_clone.cancel();
Expand Down
14 changes: 2 additions & 12 deletions crates/goose-cli/src/session/output.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use std::cell::RefCell;
use std::collections::HashMap;
use std::io::{Error, IsTerminal, Write};
use std::path::Path;
use std::sync::{Arc, LazyLock};
use std::sync::LazyLock;
use std::time::Duration;

use super::streaming_buffer::MarkdownBuffer;
Expand Down Expand Up @@ -1251,7 +1251,6 @@ pub fn display_session_info(
provider: &str,
model: &str,
session_id: &Option<String>,
provider_instance: Option<&Arc<dyn goose::providers::base::Provider>>,
) {
set_terminal_title();

Expand All @@ -1263,16 +1262,7 @@ pub fn display_session_info(
"new session"
};

let model_display = if let Some(provider_inst) = provider_instance {
if let Some(lead_worker) = provider_inst.as_lead_worker() {
let (lead_model, worker_model) = lead_worker.get_model_info();
format!("{} → {}", lead_model, worker_model)
} else {
model.to_string()
}
} else {
model.to_string()
};
let model_display = model.to_string();

let cwd_display = std::env::current_dir()
.ok()
Expand Down
7 changes: 0 additions & 7 deletions crates/goose-server/src/routes/reply.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,10 +137,6 @@ pub enum MessageEvent {
reason: String,
token_state: TokenState,
},
ModelChange {
model: String,
mode: String,
},
Notification {
Comment thread
DOsinga marked this conversation as resolved.
request_id: String,
#[schema(value_type = Object)]
Expand Down Expand Up @@ -364,9 +360,6 @@ pub async fn reply(
stream_event(MessageEvent::UpdateConversation {conversation: new_messages}, &tx, &cancel_token).await;

}
Ok(Some(Ok(AgentEvent::ModelChange { model, mode }))) => {
stream_event(MessageEvent::ModelChange { model, mode }, &tx, &cancel_token).await;
}
Ok(Some(Ok(AgentEvent::McpNotification((request_id, n))))) => {
stream_event(MessageEvent::Notification{
request_id: request_id.clone(),
Expand Down
7 changes: 0 additions & 7 deletions crates/goose-server/src/routes/session_events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -462,13 +462,6 @@ pub async fn session_reply(
)
.await;
}
Ok(Some(Ok(AgentEvent::ModelChange { model, mode }))) => {
publish(
Some(task_request_id.clone()),
MessageEvent::ModelChange { model, mode },
)
.await;
}
Ok(Some(Ok(AgentEvent::McpNotification((notification_request_id, n))))) => {
publish(
Some(task_request_id.clone()),
Expand Down
22 changes: 0 additions & 22 deletions crates/goose/src/agents/agent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,6 @@ pub struct Agent {
pub enum AgentEvent {
Message(Message),
McpNotification((String, ServerNotification)),
ModelChange { model: String, mode: String },
HistoryReplaced(Conversation),
Comment on lines 158 to 161
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Remove stale ModelChange consumers after deleting AgentEvent variant

After AgentEvent::ModelChange is removed from the enum, all downstream matches need to be updated as well; crates/goose-server/src/routes/session_events.rs still matches AgentEvent::ModelChange (around line 465) and publishes MessageEvent::ModelChange (around line 468), while MessageEvent no longer defines that variant in routes/reply.rs. This leaves the server event-stream path inconsistent and causes goose-server to fail to compile when that module is built.

Useful? React with 👍 / 👎.

}

Expand Down Expand Up @@ -1230,27 +1229,6 @@ impl Agent {
Ok((response, usage)) => {
compaction_attempts = 0;

// Emit model change event if provider is lead-worker
let provider = self.provider().await?;
if let Some(lead_worker) = provider.as_lead_worker() {
if let Some(ref usage) = usage {
let active_model = usage.model.clone();
let (lead_model, worker_model) = lead_worker.get_model_info();
let mode = if active_model == lead_model {
"lead"
} else if active_model == worker_model {
"worker"
} else {
"unknown"
};

yield AgentEvent::ModelChange {
model: active_model,
mode: mode.to_string(),
};
}
}

if let Some(ref usage) = usage {
self.update_session_metrics(&session_config.id, session_config.schedule_id.clone(), usage, false).await?;
}
Expand Down
2 changes: 0 additions & 2 deletions crates/goose/src/agents/reply_parts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -208,8 +208,6 @@ impl Agent {
Ok((tools, toolshim_tools, system_prompt))
}

// Don't add gen_ai.request.model here — provider.get_model_config()
// returns the wrong model for LeadWorkerProvider.
#[tracing::instrument(
skip(provider, session_id, system_prompt, messages, tools, toolshim_tools),
fields(session.id = %session_id)
Expand Down
2 changes: 1 addition & 1 deletion crates/goose/src/agents/subagent_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ fn get_agent_messages(params: SubagentRunParams) -> AgentMessagesFuture {
}
conversation.push(msg);
}
Ok(AgentEvent::McpNotification(_)) | Ok(AgentEvent::ModelChange { .. }) => {}
Ok(AgentEvent::McpNotification(_)) => {}
Ok(AgentEvent::HistoryReplaced(updated_conversation)) => {
conversation = updated_conversation;
}
Expand Down
11 changes: 0 additions & 11 deletions crates/goose/src/gateway/handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -445,17 +445,6 @@ impl GatewayHandler {
"gateway stream: mcp notification #{event_count}"
);
}
Ok(AgentEvent::ModelChange {
ref model,
ref mode,
}) => {
tracing::debug!(
session_id,
model,
mode,
"gateway stream: model change #{event_count}"
);
}
Ok(AgentEvent::HistoryReplaced(_)) => {
tracing::debug!(
session_id,
Expand Down
24 changes: 0 additions & 24 deletions crates/goose/src/posthog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -421,30 +421,6 @@ async fn send_session_event(installation: &InstallationData) -> Result<(), Strin
insert(&mut props, "setting_max_turns", max_turns);
}

if let Ok(lead_model) = config.get_param::<String>("GOOSE_LEAD_MODEL") {
insert(&mut props, "setting_lead_model", lead_model);
}
if let Ok(lead_provider) = config.get_param::<String>("GOOSE_LEAD_PROVIDER") {
insert(&mut props, "setting_lead_provider", lead_provider);
}
if let Ok(lead_turns) = config.get_param::<i64>("GOOSE_LEAD_TURNS") {
insert(&mut props, "setting_lead_turns", lead_turns);
}
if let Ok(lead_failure_threshold) = config.get_param::<i64>("GOOSE_LEAD_FAILURE_THRESHOLD") {
insert(
&mut props,
"setting_lead_failure_threshold",
lead_failure_threshold,
);
}
if let Ok(lead_fallback_turns) = config.get_param::<i64>("GOOSE_LEAD_FALLBACK_TURNS") {
insert(
&mut props,
"setting_lead_fallback_turns",
lead_fallback_turns,
);
}

let extensions = get_enabled_extensions();
insert(&mut props, "extensions_count", extensions.len() as u64);
let extension_names: Vec<String> = extensions.iter().map(|e| e.name()).collect();
Expand Down
29 changes: 0 additions & 29 deletions crates/goose/src/providers/base.rs
Original file line number Diff line number Diff line change
Expand Up @@ -450,18 +450,6 @@ pub enum PermissionRouting {
Noop,
}

/// Trait for LeadWorkerProvider-specific functionality
pub trait LeadWorkerProviderTrait {
/// Get information about the lead and worker models for logging
fn get_model_info(&self) -> (String, String);

/// Get the currently active model name
fn get_active_model(&self) -> String;

/// Get (lead_turns, failure_threshold, fallback_turns)
fn get_settings(&self) -> (usize, usize, usize);
}

/// Base trait for AI providers (OpenAI, Anthropic, etc)
#[async_trait]
pub trait Provider: Send + Sync {
Expand Down Expand Up @@ -645,23 +633,6 @@ pub trait Provider: Send + Sync {
))
}

/// Check if this provider is a LeadWorkerProvider
/// This is used for logging model information at startup
fn as_lead_worker(&self) -> Option<&dyn LeadWorkerProviderTrait> {
None
}

/// Get the currently active model name
/// For regular providers, this returns the configured model
/// For LeadWorkerProvider, this returns the currently active model (lead or worker)
fn get_active_model_name(&self) -> String {
if let Some(lead_worker) = self.as_lead_worker() {
lead_worker.get_active_model()
} else {
self.get_model_config().model_name
}
}

/// Returns the first 3 user messages as strings for session naming
fn get_initial_user_messages(&self, messages: &Conversation) -> Vec<String> {
messages
Expand Down
Loading
Loading