diff --git a/packages/core/src/plugin/provider/openai.ts b/packages/core/src/plugin/provider/openai.ts index cbd101eacaf..166cfb78b73 100644 --- a/packages/core/src/plugin/provider/openai.ts +++ b/packages/core/src/plugin/provider/openai.ts @@ -225,7 +225,7 @@ export const OpenAIPlugin = define({ }) } }) - yield* ctx.session.hook("request", (evt) => + yield* ctx.session.hook("http", (evt) => Effect.sync(() => { if (!chatgpt || evt.model.providerID !== Provider.ID.openai) return const url = new URL(evt.url) diff --git a/packages/core/src/session/model-request.ts b/packages/core/src/session/model-request.ts index fab9e4c0e46..829371e25f7 100644 --- a/packages/core/src/session/model-request.ts +++ b/packages/core/src/session/model-request.ts @@ -222,7 +222,7 @@ export const layer = Layer.effect( const options: StreamOptions = { transform: (request) => hooks - .trigger("session", "request", { + .trigger("session", "http", { sessionID: session.id, agent: agent.id, model: resolved.ref, diff --git a/packages/core/test/plugin/provider-openai.test.ts b/packages/core/test/plugin/provider-openai.test.ts index 9a73f5af939..7ecaeb4cb08 100644 --- a/packages/core/test/plugin/provider-openai.test.ts +++ b/packages/core/test/plugin/provider-openai.test.ts @@ -100,7 +100,7 @@ describe("OpenAIPlugin", () => { }) yield* addPlugin() - const request = yield* (yield* PluginHooks.Service).trigger("session", "request", { + const request = yield* (yield* PluginHooks.Service).trigger("session", "http", { sessionID: Session.ID.make("ses_test"), agent: Agent.ID.make("build"), model: Model.Ref.make({ providerID: Provider.ID.openai, id: Model.ID.make("gpt-5.5") }), @@ -109,7 +109,7 @@ describe("OpenAIPlugin", () => { headers: {}, body: "{}", }) - const custom = yield* (yield* PluginHooks.Service).trigger("session", "request", { + const custom = yield* (yield* PluginHooks.Service).trigger("session", "http", { sessionID: Session.ID.make("ses_test"), agent: Agent.ID.make("build"), model: Model.Ref.make({ providerID: Provider.ID.make("custom-openai"), id: Model.ID.make("gpt-5.5") }), @@ -118,7 +118,7 @@ describe("OpenAIPlugin", () => { headers: {}, body: "{}", }) - const proxy = yield* (yield* PluginHooks.Service).trigger("session", "request", { + const proxy = yield* (yield* PluginHooks.Service).trigger("session", "http", { sessionID: Session.ID.make("ses_test"), agent: Agent.ID.make("build"), model: Model.Ref.make({ providerID: Provider.ID.openai, id: Model.ID.make("gpt-5.5") }), @@ -184,7 +184,7 @@ describe("OpenAIPlugin", () => { }) yield* addPlugin() - const request = yield* (yield* PluginHooks.Service).trigger("session", "request", { + const request = yield* (yield* PluginHooks.Service).trigger("session", "http", { sessionID: Session.ID.make("ses_test"), agent: Agent.ID.make("build"), model: Model.Ref.make({ providerID: Provider.ID.openai, id: Model.ID.make("gpt-5.5") }), diff --git a/packages/plugin/src/effect/session.ts b/packages/plugin/src/effect/session.ts index e4206b6df25..170e6317ea2 100644 --- a/packages/plugin/src/effect/session.ts +++ b/packages/plugin/src/effect/session.ts @@ -16,7 +16,7 @@ export interface SessionContext { tools: Record } -export interface SessionRequest extends HttpRequest { +export interface SessionHttp extends HttpRequest { readonly sessionID: Session.ID readonly agent: Agent.ID readonly model: Model.Ref @@ -24,7 +24,7 @@ export interface SessionRequest extends HttpRequest { export interface SessionHooks { readonly context: SessionContext - readonly request: SessionRequest + readonly http: SessionHttp } export type SessionDomain = Pick< diff --git a/packages/plugin/src/promise/session.ts b/packages/plugin/src/promise/session.ts index adc371b9510..7eaf9994ec8 100644 --- a/packages/plugin/src/promise/session.ts +++ b/packages/plugin/src/promise/session.ts @@ -16,7 +16,7 @@ export interface SessionContext { tools: Record } -export interface SessionRequest extends HttpRequest { +export interface SessionHttp extends HttpRequest { readonly sessionID: Session.ID readonly agent: Agent.ID readonly model: Model.Ref @@ -24,7 +24,7 @@ export interface SessionRequest extends HttpRequest { export interface SessionHooks { readonly context: SessionContext - readonly request: SessionRequest + readonly http: SessionHttp } export type SessionDomain = Pick< diff --git a/packages/www/content/docs/build/plugins.mdx b/packages/www/content/docs/build/plugins.mdx index fd9331c8805..eb545ddde57 100644 --- a/packages/www/content/docs/build/plugins.mdx +++ b/packages/www/content/docs/build/plugins.mdx @@ -246,7 +246,8 @@ mutable fields: | ------------------------------------------- | ------------------------------------------------------------------------------ | | `ctx.aisdk.hook("sdk", callback)` | `sdk`, after inspecting `model`, `package`, and `options` | | `ctx.aisdk.hook("language", callback)` | `language`, after inspecting `model`, `sdk`, and `options` | -| `ctx.session.hook("request", callback)` | `system`, `messages`, and the `tools` record immediately before model dispatch | +| `ctx.session.hook("context", callback)` | `system`, `messages`, and the `tools` record immediately before model dispatch | +| `ctx.session.hook("http", callback)` | `url`, `headers`, and `body` before the model request is sent | | `ctx.tool.hook("execute.before", callback)` | `input`, before the selected tool executes | | `ctx.tool.hook("execute.after", callback)` | Terminal `result` on success or `error` on failure | @@ -259,7 +260,7 @@ import { Plugin } from "@opencode-ai/plugin" export default Plugin.define({ id: "acme.guards", setup: async (ctx) => { - await ctx.session.hook("request", (event) => { + await ctx.session.hook("context", (event) => { delete event.tools.write })