Skip to content

Commit f993a3f

Browse files
committed
perf: remove redundant update_provider ACP method
The custom _goose/session/provider/update method duplicated the SACP 11 set_config_option path for config_id="provider". Having both meant: 1. Two separate wire entry points for the same operation. 2. The set_config_option handler called build_config_update twice per request — once inside update_provider (which built and discarded the Vec<SessionConfigOption>) and once in the handler tail. On providers that refresh their model list over HTTP (e.g. Databricks) each call costs ~1s, for ~2s of wasted work per provider switch. Nothing in this codebase calls the custom method; goose2 uses set_config_option exclusively. Changes: - Remove UpdateProviderRequest/UpdateProviderResponse from goose-sdk. - Remove on_update_provider from goose-acp server. - Change internal update_provider helper to return () and stop calling build_config_update at the end — the set_config_option handler's single trailing build_config_update is now the only one. - Rewrite test_provider_switching_updates_session_state to exercise the set_config_option path three times instead of the removed custom method. - Regenerate acp-schema.json, acp-meta.json, and ui/sdk/src/generated. Verified: - cargo test -p goose-acp (35 passed) - cargo clippy --all-targets -- -D warnings - ui/goose2 pnpm typecheck Signed-off-by: Bradley Axen <baxen@squareup.com>
1 parent b1cadc5 commit f993a3f

9 files changed

Lines changed: 12 additions & 241 deletions

File tree

crates/goose-acp/acp-meta.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,6 @@
4040
"requestType": "GetSessionExtensionsRequest",
4141
"responseType": "GetSessionExtensionsResponse"
4242
},
43-
{
44-
"method": "_goose/session/provider/update",
45-
"requestType": "UpdateProviderRequest",
46-
"responseType": "UpdateProviderResponse"
47-
},
4843
{
4944
"method": "_goose/providers/list",
5045
"requestType": "ListProvidersRequest",

crates/goose-acp/acp-schema.json

Lines changed: 0 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -195,61 +195,6 @@
195195
"x-side": "agent",
196196
"x-method": "_goose/session/extensions"
197197
},
198-
"UpdateProviderRequest": {
199-
"type": "object",
200-
"properties": {
201-
"sessionId": {
202-
"type": "string"
203-
},
204-
"provider": {
205-
"type": "string"
206-
},
207-
"model": {
208-
"type": [
209-
"string",
210-
"null"
211-
]
212-
},
213-
"contextLimit": {
214-
"type": [
215-
"integer",
216-
"null"
217-
],
218-
"format": "uint",
219-
"minimum": 0
220-
},
221-
"requestParams": {
222-
"type": [
223-
"object",
224-
"null"
225-
],
226-
"additionalProperties": {}
227-
}
228-
},
229-
"required": [
230-
"sessionId",
231-
"provider"
232-
],
233-
"description": "Atomically update the provider for a live session.",
234-
"x-side": "agent",
235-
"x-method": "_goose/session/provider/update"
236-
},
237-
"UpdateProviderResponse": {
238-
"type": "object",
239-
"properties": {
240-
"configOptions": {
241-
"type": "array",
242-
"items": {},
243-
"description": "Refreshed session config options after the provider/model change."
244-
}
245-
},
246-
"required": [
247-
"configOptions"
248-
],
249-
"description": "Provider update response.",
250-
"x-side": "agent",
251-
"x-method": "_goose/session/provider/update"
252-
},
253198
"ListProvidersRequest": {
254199
"type": "object",
255200
"description": "List providers available through goose, including the config-default sentinel.",
@@ -746,15 +691,6 @@
746691
"description": "Params for _goose/session/extensions",
747692
"title": "GetSessionExtensionsRequest"
748693
},
749-
{
750-
"allOf": [
751-
{
752-
"$ref": "#/$defs/UpdateProviderRequest"
753-
}
754-
],
755-
"description": "Params for _goose/session/provider/update",
756-
"title": "UpdateProviderRequest"
757-
},
758694
{
759695
"allOf": [
760696
{
@@ -942,14 +878,6 @@
942878
],
943879
"title": "GetSessionExtensionsResponse"
944880
},
945-
{
946-
"allOf": [
947-
{
948-
"$ref": "#/$defs/UpdateProviderResponse"
949-
}
950-
],
951-
"title": "UpdateProviderResponse"
952-
},
953881
{
954882
"allOf": [
955883
{

crates/goose-acp/src/server.rs

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2084,7 +2084,7 @@ impl GooseAcpAgent {
20842084
model_name: Option<&str>,
20852085
context_limit: Option<usize>,
20862086
request_params: Option<std::collections::HashMap<String, serde_json::Value>>,
2087-
) -> Result<Vec<SessionConfigOption>, sacp::Error> {
2087+
) -> Result<(), sacp::Error> {
20882088
let sid = sid_short(thread_id);
20892089
let t_total = std::time::Instant::now();
20902090
debug!(target: "perf", sid = %sid, provider = %provider_name, "perf: update_provider start");
@@ -2236,12 +2236,6 @@ impl GooseAcpAgent {
22362236
"perf: update_provider persist_session"
22372237
);
22382238

2239-
let t_step = std::time::Instant::now();
2240-
let (_, config_options) = self
2241-
.build_config_update(&SessionId::new(thread_id.to_string()))
2242-
.await?;
2243-
debug!(target: "perf", sid = %sid, ms = t_step.elapsed().as_millis() as u64, "perf: update_provider build_config_update");
2244-
22452239
debug!(
22462240
target: "perf",
22472241
sid = %sid,
@@ -2251,7 +2245,7 @@ impl GooseAcpAgent {
22512245
changing = is_changing_provider,
22522246
"perf: update_provider done"
22532247
);
2254-
Ok(config_options)
2248+
Ok(())
22552249
}
22562250

22572251
async fn on_list_sessions(&self) -> Result<ListSessionsResponse, sacp::Error> {
@@ -2530,28 +2524,6 @@ impl GooseAcpAgent {
25302524
})
25312525
}
25322526

2533-
#[custom_method(UpdateProviderRequest)]
2534-
async fn on_update_provider(
2535-
&self,
2536-
req: UpdateProviderRequest,
2537-
) -> Result<UpdateProviderResponse, sacp::Error> {
2538-
let config_options = self
2539-
.update_provider(
2540-
&req.session_id,
2541-
&req.provider,
2542-
req.model.as_deref(),
2543-
req.context_limit,
2544-
req.request_params,
2545-
)
2546-
.await?;
2547-
let config_options = config_options
2548-
.into_iter()
2549-
.map(|option| serde_json::to_value(&option))
2550-
.collect::<Result<Vec<_>, _>>()
2551-
.map_err(|e| sacp::Error::internal_error().data(e.to_string()))?;
2552-
Ok(UpdateProviderResponse { config_options })
2553-
}
2554-
25552527
#[custom_method(ListProvidersRequest)]
25562528
async fn on_list_providers(
25572529
&self,

crates/goose-acp/tests/custom_requests_test.rs

Lines changed: 7 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -208,48 +208,15 @@ fn test_provider_switching_updates_session_state() {
208208

209209
conn.set_config_option(&session_id, "provider", "anthropic")
210210
.await
211-
.expect("provider config option should succeed");
211+
.expect("provider switch to anthropic should succeed");
212212

213-
let response = send_custom(
214-
conn.cx(),
215-
"_goose/session/provider/update",
216-
serde_json::json!({
217-
"sessionId": session_id,
218-
"provider": "openai",
219-
"model": "o4-mini",
220-
}),
221-
)
222-
.await
223-
.expect("provider update should succeed");
224-
let config_options = response
225-
.get("configOptions")
226-
.and_then(|value| value.as_array())
227-
.expect("missing config options");
228-
assert!(
229-
!config_options.is_empty(),
230-
"expected refreshed config options"
231-
);
213+
conn.set_config_option(&session_id, "provider", "openai")
214+
.await
215+
.expect("provider switch to openai should succeed");
232216

233-
let response = send_custom(
234-
conn.cx(),
235-
"_goose/session/provider/update",
236-
serde_json::json!({
237-
"sessionId": session_id,
238-
"provider": "goose",
239-
}),
240-
)
241-
.await
242-
.expect("provider reset to goose should succeed");
243-
let config_options = response
244-
.get("configOptions")
245-
.and_then(|value| value.as_array())
246-
.expect("missing config options after reset");
247-
assert!(
248-
config_options
249-
.iter()
250-
.any(|option| option.get("id") == Some(&serde_json::json!("provider"))),
251-
"missing provider config option after reset"
252-
);
217+
conn.set_config_option(&session_id, "provider", "goose")
218+
.await
219+
.expect("provider reset to goose should succeed");
253220
});
254221
}
255222

crates/goose-sdk/src/custom_requests.rs

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use sacp::{JsonRpcRequest, JsonRpcResponse};
22
use schemars::JsonSchema;
33
use serde::{Deserialize, Serialize};
4-
use std::collections::HashMap;
54

65
/// Schema descriptor for a single custom method, produced by the
76
/// `#[custom_methods]` macro's generated `custom_method_schemas()` function.
@@ -116,26 +115,6 @@ pub struct GetSessionExtensionsResponse {
116115
pub extensions: Vec<serde_json::Value>,
117116
}
118117

119-
/// Atomically update the provider for a live session.
120-
#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcRequest)]
121-
#[request(method = "_goose/session/provider/update", response = UpdateProviderResponse)]
122-
#[serde(rename_all = "camelCase")]
123-
pub struct UpdateProviderRequest {
124-
pub session_id: String,
125-
pub provider: String,
126-
pub model: Option<String>,
127-
pub context_limit: Option<usize>,
128-
pub request_params: Option<HashMap<String, serde_json::Value>>,
129-
}
130-
131-
/// Provider update response.
132-
#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcResponse)]
133-
#[serde(rename_all = "camelCase")]
134-
pub struct UpdateProviderResponse {
135-
/// Refreshed session config options after the provider/model change.
136-
pub config_options: Vec<serde_json::Value>,
137-
}
138-
139118
/// Read a single non-secret config value.
140119
#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcRequest)]
141120
#[request(method = "_goose/config/read", response = ReadConfigResponse)]

ui/sdk/src/generated/client.gen.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ import type {
3737
RemoveExtensionRequest,
3838
RemoveSecretRequest,
3939
UnarchiveSessionRequest,
40-
UpdateProviderRequest,
41-
UpdateProviderResponse,
4240
UpdateWorkingDirRequest,
4341
UpsertConfigRequest,
4442
UpsertSecretRequest,
@@ -55,7 +53,6 @@ import {
5553
zListProvidersResponse,
5654
zReadConfigResponse,
5755
zReadResourceResponse,
58-
zUpdateProviderResponse,
5956
} from './zod.gen.js';
6057

6158
export class GooseExtClient {
@@ -105,16 +102,6 @@ export class GooseExtClient {
105102
) as GetSessionExtensionsResponse;
106103
}
107104

108-
async GooseSessionProviderUpdate(
109-
params: UpdateProviderRequest,
110-
): Promise<UpdateProviderResponse> {
111-
const raw = await this.conn.extMethod(
112-
"_goose/session/provider/update",
113-
params,
114-
);
115-
return zUpdateProviderResponse.parse(raw) as UpdateProviderResponse;
116-
}
117-
118105
async GooseProvidersList(
119106
params: ListProvidersRequest,
120107
): Promise<ListProvidersResponse> {

ui/sdk/src/generated/index.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// This file is auto-generated by @hey-api/openapi-ts
22

3-
export type { AddExtensionRequest, ArchiveSessionRequest, CheckSecretRequest, CheckSecretResponse, DeleteSessionRequest, EmptyResponse, ExportSessionRequest, ExportSessionResponse, ExtRequest, ExtResponse, GetExtensionsRequest, GetExtensionsResponse, GetProviderDetailsRequest, GetProviderDetailsResponse, GetProviderModelsRequest, GetProviderModelsResponse, GetSessionExtensionsRequest, GetSessionExtensionsResponse, GetToolsRequest, GetToolsResponse, ImportSessionRequest, ImportSessionResponse, ListProvidersRequest, ListProvidersResponse, ModelEntry, ProviderConfigKey, ProviderDetailEntry, ProviderListEntry, ReadConfigRequest, ReadConfigResponse, ReadResourceRequest, ReadResourceResponse, RemoveConfigRequest, RemoveExtensionRequest, RemoveSecretRequest, UnarchiveSessionRequest, UpdateProviderRequest, UpdateProviderResponse, UpdateWorkingDirRequest, UpsertConfigRequest, UpsertSecretRequest } from './types.gen.js';
3+
export type { AddExtensionRequest, ArchiveSessionRequest, CheckSecretRequest, CheckSecretResponse, DeleteSessionRequest, EmptyResponse, ExportSessionRequest, ExportSessionResponse, ExtRequest, ExtResponse, GetExtensionsRequest, GetExtensionsResponse, GetProviderDetailsRequest, GetProviderDetailsResponse, GetProviderModelsRequest, GetProviderModelsResponse, GetSessionExtensionsRequest, GetSessionExtensionsResponse, GetToolsRequest, GetToolsResponse, ImportSessionRequest, ImportSessionResponse, ListProvidersRequest, ListProvidersResponse, ModelEntry, ProviderConfigKey, ProviderDetailEntry, ProviderListEntry, ReadConfigRequest, ReadConfigResponse, ReadResourceRequest, ReadResourceResponse, RemoveConfigRequest, RemoveExtensionRequest, RemoveSecretRequest, UnarchiveSessionRequest, UpdateWorkingDirRequest, UpsertConfigRequest, UpsertSecretRequest } from './types.gen.js';
44

55
export const GOOSE_EXT_METHODS = [
66
{
@@ -43,11 +43,6 @@ export const GOOSE_EXT_METHODS = [
4343
requestType: "GetSessionExtensionsRequest",
4444
responseType: "GetSessionExtensionsResponse",
4545
},
46-
{
47-
method: "_goose/session/provider/update",
48-
requestType: "UpdateProviderRequest",
49-
responseType: "UpdateProviderResponse",
50-
},
5146
{
5247
method: "_goose/providers/list",
5348
requestType: "ListProvidersRequest",

ui/sdk/src/generated/types.gen.ts

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -104,29 +104,6 @@ export type GetSessionExtensionsResponse = {
104104
extensions: Array<unknown>;
105105
};
106106

107-
/**
108-
* Atomically update the provider for a live session.
109-
*/
110-
export type UpdateProviderRequest = {
111-
sessionId: string;
112-
provider: string;
113-
model?: string | null;
114-
contextLimit?: number | null;
115-
requestParams?: {
116-
[key: string]: unknown;
117-
} | null;
118-
};
119-
120-
/**
121-
* Provider update response.
122-
*/
123-
export type UpdateProviderResponse = {
124-
/**
125-
* Refreshed session config options after the provider/model change.
126-
*/
127-
configOptions: Array<unknown>;
128-
};
129-
130107
/**
131108
* List providers available through goose, including the config-default sentinel.
132109
*/
@@ -307,14 +284,14 @@ export type UnarchiveSessionRequest = {
307284
export type ExtRequest = {
308285
id: string;
309286
method: string;
310-
params?: AddExtensionRequest | RemoveExtensionRequest | GetToolsRequest | ReadResourceRequest | UpdateWorkingDirRequest | DeleteSessionRequest | GetExtensionsRequest | GetSessionExtensionsRequest | UpdateProviderRequest | ListProvidersRequest | GetProviderDetailsRequest | GetProviderModelsRequest | ReadConfigRequest | UpsertConfigRequest | RemoveConfigRequest | CheckSecretRequest | UpsertSecretRequest | RemoveSecretRequest | ExportSessionRequest | ImportSessionRequest | ArchiveSessionRequest | UnarchiveSessionRequest | {
287+
params?: AddExtensionRequest | RemoveExtensionRequest | GetToolsRequest | ReadResourceRequest | UpdateWorkingDirRequest | DeleteSessionRequest | GetExtensionsRequest | GetSessionExtensionsRequest | ListProvidersRequest | GetProviderDetailsRequest | GetProviderModelsRequest | ReadConfigRequest | UpsertConfigRequest | RemoveConfigRequest | CheckSecretRequest | UpsertSecretRequest | RemoveSecretRequest | ExportSessionRequest | ImportSessionRequest | ArchiveSessionRequest | UnarchiveSessionRequest | {
311288
[key: string]: unknown;
312289
} | null;
313290
};
314291

315292
export type ExtResponse = {
316293
id: string;
317-
result?: EmptyResponse | GetToolsResponse | ReadResourceResponse | GetExtensionsResponse | GetSessionExtensionsResponse | UpdateProviderResponse | ListProvidersResponse | GetProviderDetailsResponse | GetProviderModelsResponse | ReadConfigResponse | CheckSecretResponse | ExportSessionResponse | ImportSessionResponse | unknown;
294+
result?: EmptyResponse | GetToolsResponse | ReadResourceResponse | GetExtensionsResponse | GetSessionExtensionsResponse | ListProvidersResponse | GetProviderDetailsResponse | GetProviderModelsResponse | ReadConfigResponse | CheckSecretResponse | ExportSessionResponse | ImportSessionResponse | unknown;
318295
} | {
319296
error: {
320297
code: number;

0 commit comments

Comments
 (0)