Skip to content

Commit 231b47c

Browse files
authored
Add unstable model selection to the TS SDK (#126)
* Remove unneeded casts Signed-off-by: Ben Brandt <benjamin.j.brandt@gmail.com> * Add unstable model selection to TS SDK Signed-off-by: Ben Brandt <benjamin.j.brandt@gmail.com> * Add missing method on client connection * prep release --------- Signed-off-by: Ben Brandt <benjamin.j.brandt@gmail.com>
1 parent c399208 commit 231b47c

11 files changed

Lines changed: 79 additions & 57 deletions

File tree

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
# Changelog
22

3+
## 0.4.5 (2025-10-02)
4+
5+
### Protocol
6+
7+
- No changes
8+
9+
### Typescript
10+
11+
- **Unstable** initial support for model selection.
12+
313
## 0.4.4 (2025-09-30)
414

515
### Protocol

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "agent-client-protocol"
33
authors = ["Zed <hi@zed.dev>"]
4-
version = "0.4.4"
4+
version = "0.4.5"
55
edition = "2024"
66
license = "Apache-2.0"
77
description = "A protocol for standardizing communication between code editors and AI coding agents"

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@zed-industries/agent-client-protocol",
3-
"version": "0.4.4",
3+
"version": "0.4.5",
44
"publishConfig": {
55
"access": "public"
66
},

rust/agent.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,7 @@ pub struct AgentMethodNames {
820820
pub session_cancel: &'static str,
821821
/// Method for selecting a model for a given session.
822822
#[cfg(feature = "unstable")]
823-
pub model_select: &'static str,
823+
pub session_set_model: &'static str,
824824
}
825825

826826
/// Constant containing all agent method names.
@@ -833,7 +833,7 @@ pub const AGENT_METHOD_NAMES: AgentMethodNames = AgentMethodNames {
833833
session_prompt: SESSION_PROMPT_METHOD_NAME,
834834
session_cancel: SESSION_CANCEL_METHOD_NAME,
835835
#[cfg(feature = "unstable")]
836-
model_select: SESSION_SET_MODEL_METHOD_NAME,
836+
session_set_model: SESSION_SET_MODEL_METHOD_NAME,
837837
};
838838

839839
/// Method name for the initialize request.

schema/meta.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
"agentMethods": {
33
"authenticate": "authenticate",
44
"initialize": "initialize",
5-
"model_select": "session/set_model",
65
"session_cancel": "session/cancel",
76
"session_load": "session/load",
87
"session_new": "session/new",
98
"session_prompt": "session/prompt",
10-
"session_set_mode": "session/set_mode"
9+
"session_set_mode": "session/set_mode",
10+
"session_set_model": "session/set_model"
1111
},
1212
"clientMethods": {
1313
"fs_read_text_file": "fs/read_text_file",

typescript/acp.ts

Lines changed: 57 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -49,43 +49,45 @@ export class AgentSideConnection {
4949
switch (method) {
5050
case schema.AGENT_METHODS.initialize: {
5151
const validatedParams = schema.initializeRequestSchema.parse(params);
52-
return agent.initialize(validatedParams as schema.InitializeRequest);
52+
return agent.initialize(validatedParams);
5353
}
5454
case schema.AGENT_METHODS.session_new: {
5555
const validatedParams = schema.newSessionRequestSchema.parse(params);
56-
return agent.newSession(validatedParams as schema.NewSessionRequest);
56+
return agent.newSession(validatedParams);
5757
}
5858
case schema.AGENT_METHODS.session_load: {
5959
if (!agent.loadSession) {
6060
throw RequestError.methodNotFound(method);
6161
}
6262
const validatedParams = schema.loadSessionRequestSchema.parse(params);
63-
return agent.loadSession(
64-
validatedParams as schema.LoadSessionRequest,
65-
);
63+
return agent.loadSession(validatedParams);
6664
}
6765
case schema.AGENT_METHODS.session_set_mode: {
6866
if (!agent.setSessionMode) {
6967
throw RequestError.methodNotFound(method);
7068
}
7169
const validatedParams =
7270
schema.setSessionModeRequestSchema.parse(params);
73-
const result = await agent.setSessionMode(
74-
validatedParams as schema.SetSessionModeRequest,
75-
);
71+
const result = await agent.setSessionMode(validatedParams);
7672
return result ?? {};
7773
}
7874
case schema.AGENT_METHODS.authenticate: {
7975
const validatedParams =
8076
schema.authenticateRequestSchema.parse(params);
81-
const result = await agent.authenticate(
82-
validatedParams as schema.AuthenticateRequest,
83-
);
77+
const result = await agent.authenticate(validatedParams);
8478
return result ?? {};
8579
}
8680
case schema.AGENT_METHODS.session_prompt: {
8781
const validatedParams = schema.promptRequestSchema.parse(params);
88-
return agent.prompt(validatedParams as schema.PromptRequest);
82+
return agent.prompt(validatedParams);
83+
}
84+
case schema.AGENT_METHODS.session_set_model: {
85+
if (!agent.setSessionModel) {
86+
throw RequestError.methodNotFound(method);
87+
}
88+
const validatedParams =
89+
schema.setSessionModelRequestSchema.parse(params);
90+
return agent.setSessionModel(validatedParams);
8991
}
9092
default:
9193
if (method.startsWith("_")) {
@@ -108,7 +110,7 @@ export class AgentSideConnection {
108110
switch (method) {
109111
case schema.AGENT_METHODS.session_cancel: {
110112
const validatedParams = schema.cancelNotificationSchema.parse(params);
111-
return agent.cancel(validatedParams as schema.CancelNotification);
113+
return agent.cancel(validatedParams);
112114
}
113115
default:
114116
if (method.startsWith("_")) {
@@ -223,10 +225,10 @@ export class AgentSideConnection {
223225
async createTerminal(
224226
params: schema.CreateTerminalRequest,
225227
): Promise<TerminalHandle> {
226-
const response = (await this.#connection.sendRequest(
227-
schema.CLIENT_METHODS.terminal_create,
228-
params,
229-
)) as schema.CreateTerminalResponse;
228+
const response = await this.#connection.sendRequest<
229+
schema.CreateTerminalRequest,
230+
schema.CreateTerminalResponse
231+
>(schema.CLIENT_METHODS.terminal_create, params);
230232

231233
return new TerminalHandle(
232234
response.terminalId,
@@ -399,59 +401,43 @@ export class ClientSideConnection implements Agent {
399401
case schema.CLIENT_METHODS.fs_write_text_file: {
400402
const validatedParams =
401403
schema.writeTextFileRequestSchema.parse(params);
402-
return client.writeTextFile?.(
403-
validatedParams as schema.WriteTextFileRequest,
404-
);
404+
return client.writeTextFile?.(validatedParams);
405405
}
406406
case schema.CLIENT_METHODS.fs_read_text_file: {
407407
const validatedParams =
408408
schema.readTextFileRequestSchema.parse(params);
409-
return client.readTextFile?.(
410-
validatedParams as schema.ReadTextFileRequest,
411-
);
409+
return client.readTextFile?.(validatedParams);
412410
}
413411
case schema.CLIENT_METHODS.session_request_permission: {
414412
const validatedParams =
415413
schema.requestPermissionRequestSchema.parse(params);
416-
return client.requestPermission(
417-
validatedParams as schema.RequestPermissionRequest,
418-
);
414+
return client.requestPermission(validatedParams);
419415
}
420416
case schema.CLIENT_METHODS.terminal_create: {
421417
const validatedParams =
422418
schema.createTerminalRequestSchema.parse(params);
423-
return client.createTerminal?.(
424-
validatedParams as schema.CreateTerminalRequest,
425-
);
419+
return client.createTerminal?.(validatedParams);
426420
}
427421
case schema.CLIENT_METHODS.terminal_output: {
428422
const validatedParams =
429423
schema.terminalOutputRequestSchema.parse(params);
430-
return client.terminalOutput?.(
431-
validatedParams as schema.TerminalOutputRequest,
432-
);
424+
return client.terminalOutput?.(validatedParams);
433425
}
434426
case schema.CLIENT_METHODS.terminal_release: {
435427
const validatedParams =
436428
schema.releaseTerminalRequestSchema.parse(params);
437-
const result = await client.releaseTerminal?.(
438-
validatedParams as schema.ReleaseTerminalRequest,
439-
);
429+
const result = await client.releaseTerminal?.(validatedParams);
440430
return result ?? {};
441431
}
442432
case schema.CLIENT_METHODS.terminal_wait_for_exit: {
443433
const validatedParams =
444434
schema.waitForTerminalExitRequestSchema.parse(params);
445-
return client.waitForTerminalExit?.(
446-
validatedParams as schema.WaitForTerminalExitRequest,
447-
);
435+
return client.waitForTerminalExit?.(validatedParams);
448436
}
449437
case schema.CLIENT_METHODS.terminal_kill: {
450438
const validatedParams =
451439
schema.killTerminalCommandRequestSchema.parse(params);
452-
const result = await client.killTerminal?.(
453-
validatedParams as schema.KillTerminalCommandRequest,
454-
);
440+
const result = await client.killTerminal?.(validatedParams);
455441
return result ?? {};
456442
}
457443
default:
@@ -478,9 +464,7 @@ export class ClientSideConnection implements Agent {
478464
case schema.CLIENT_METHODS.session_update: {
479465
const validatedParams =
480466
schema.sessionNotificationSchema.parse(params);
481-
return client.sessionUpdate(
482-
validatedParams as schema.SessionNotification,
483-
);
467+
return client.sessionUpdate(validatedParams);
484468
}
485469
default:
486470
// Handle extension notifications (any method starting with '_')
@@ -598,6 +582,24 @@ export class ClientSideConnection implements Agent {
598582
);
599583
}
600584

585+
/**
586+
* **UNSTABLE**
587+
*
588+
* This capability is not part of the spec yet, and may be removed or changed at any point.
589+
*
590+
* Select a model for a given session.
591+
*/
592+
async setSessionModel(
593+
params: schema.SetSessionModelRequest,
594+
): Promise<schema.SetSessionModelResponse> {
595+
return (
596+
(await this.#connection.sendRequest(
597+
schema.AGENT_METHODS.session_set_mode,
598+
params,
599+
)) ?? {}
600+
);
601+
}
602+
601603
/**
602604
* Authenticates the client using the specified authentication method.
603605
*
@@ -771,7 +773,7 @@ class Connection {
771773
}
772774
} else if ("id" in message) {
773775
// It's a response
774-
this.#handleResponse(message as AnyResponse);
776+
this.#handleResponse(message);
775777
} else {
776778
console.error("Invalid message", { message });
777779
}
@@ -1215,6 +1217,16 @@ export interface Agent {
12151217
setSessionMode?(
12161218
params: schema.SetSessionModeRequest,
12171219
): Promise<schema.SetSessionModeResponse | void>;
1220+
/**
1221+
* **UNSTABLE**
1222+
*
1223+
* This capability is not part of the spec yet, and may be removed or changed at any point.
1224+
*
1225+
* Select a model for a given session.
1226+
*/
1227+
setSessionModel?(
1228+
params: schema.SetSessionModelRequest,
1229+
): Promise<schema.SetSessionModelResponse | void>;
12181230
/**
12191231
* Authenticates the client using the specified authentication method.
12201232
*

typescript/examples/agent.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ class ExampleAgent implements acp.Agent {
267267
}
268268
}
269269

270-
const input = Writable.toWeb(process.stdout) as WritableStream;
270+
const input = Writable.toWeb(process.stdout);
271271
const output = Readable.toWeb(process.stdin) as ReadableStream<Uint8Array>;
272272

273273
const stream = acp.ndJsonStream(input, output);

typescript/examples/client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ async function main() {
106106
});
107107

108108
// Create streams to communicate with the agent
109-
const input = Writable.toWeb(agentProcess.stdin!) as WritableStream;
109+
const input = Writable.toWeb(agentProcess.stdin!);
110110
const output = Readable.toWeb(
111111
agentProcess.stdout!,
112112
) as ReadableStream<Uint8Array>;

0 commit comments

Comments
 (0)