From b1aaa8570eabbec4ad0aafd988ebdd0b33f26f26 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Tue, 25 Nov 2025 05:52:57 +0000 Subject: [PATCH] =?UTF-8?q?prompt=5Fasync:=20Allows=20to=20receive=20promp?= =?UTF-8?q?t=20and=20return=20immediately,=20start=20=E2=80=A6=20(#4664)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Aiden Cline Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> --- packages/opencode/src/server/server.ts | 29 +++++++++++++++ packages/sdk/js/src/gen/sdk.gen.ts | 17 +++++++++ packages/sdk/js/src/gen/types.gen.ts | 49 ++++++++++++++++++++++++++ 3 files changed, 95 insertions(+) diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index fec174454..51240ae2e 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -979,6 +979,35 @@ export namespace Server { }) }, ) + .post( + "/session/:id/prompt_async", + describeRoute({ + description: "Create and send a new message to a session, start if needed and return immediately", + operationId: "session.prompt_async", + responses: { + 204: { + description: "Prompt accepted", + }, + ...errors(400, 404), + }, + }), + validator( + "param", + z.object({ + id: z.string().meta({ description: "Session ID" }), + }), + ), + validator("json", SessionPrompt.PromptInput.omit({ sessionID: true })), + async (c) => { + c.status(204) + c.header("Content-Type", "application/json") + return stream(c, async (stream) => { + const sessionID = c.req.valid("param").id + const body = c.req.valid("json") + SessionPrompt.prompt({ ...body, sessionID }) + }) + }, + ) .post( "/session/:id/command", describeRoute({ diff --git a/packages/sdk/js/src/gen/sdk.gen.ts b/packages/sdk/js/src/gen/sdk.gen.ts index dc2247990..afc9696f1 100644 --- a/packages/sdk/js/src/gen/sdk.gen.ts +++ b/packages/sdk/js/src/gen/sdk.gen.ts @@ -75,6 +75,9 @@ import type { SessionMessageData, SessionMessageResponses, SessionMessageErrors, + SessionPromptAsyncData, + SessionPromptAsyncResponses, + SessionPromptAsyncErrors, SessionCommandData, SessionCommandResponses, SessionCommandErrors, @@ -513,6 +516,20 @@ class Session extends _HeyApiClient { }) } + /** + * Create and send a new message to a session, start if needed and return immediately + */ + public promptAsync(options: Options) { + return (options.client ?? this._client).post({ + url: "/session/{id}/prompt_async", + ...options, + headers: { + "Content-Type": "application/json", + ...options.headers, + }, + }) + } + /** * Send a new command to a session */ diff --git a/packages/sdk/js/src/gen/types.gen.ts b/packages/sdk/js/src/gen/types.gen.ts index 3ba41cc23..fdb6dcd64 100644 --- a/packages/sdk/js/src/gen/types.gen.ts +++ b/packages/sdk/js/src/gen/types.gen.ts @@ -2301,6 +2301,55 @@ export type SessionMessageResponses = { export type SessionMessageResponse = SessionMessageResponses[keyof SessionMessageResponses] +export type SessionPromptAsyncData = { + body?: { + messageID?: string + model?: { + providerID: string + modelID: string + } + agent?: string + noReply?: boolean + system?: string + tools?: { + [key: string]: boolean + } + parts: Array + } + path: { + /** + * Session ID + */ + id: string + } + query?: { + directory?: string + } + url: "/session/{id}/prompt_async" +} + +export type SessionPromptAsyncErrors = { + /** + * Bad request + */ + 400: BadRequestError + /** + * Not found + */ + 404: NotFoundError +} + +export type SessionPromptAsyncError = SessionPromptAsyncErrors[keyof SessionPromptAsyncErrors] + +export type SessionPromptAsyncResponses = { + /** + * Prompt accepted + */ + 204: void +} + +export type SessionPromptAsyncResponse = SessionPromptAsyncResponses[keyof SessionPromptAsyncResponses] + export type SessionCommandData = { body?: { messageID?: string