diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts index 6fee2fdd..ede8fbf7 100644 --- a/packages/opencode/src/agent/agent.ts +++ b/packages/opencode/src/agent/agent.ts @@ -14,6 +14,7 @@ export namespace Agent { mode: z.union([z.literal("subagent"), z.literal("primary"), z.literal("all")]), topP: z.number().optional(), temperature: z.number().optional(), + options: z.record(z.any()), model: z .object({ modelID: z.string(), @@ -39,15 +40,18 @@ export namespace Agent { todoread: false, todowrite: false, }, + options: {}, mode: "subagent", }, build: { name: "build", tools: {}, + options: {}, mode: "primary", }, plan: { name: "plan", + options: {}, tools: { write: false, edit: false, @@ -66,6 +70,7 @@ export namespace Agent { item = result[key] = { name: key, mode: "all", + options: {}, tools: {}, } if (value.model) item.model = Provider.parseModel(value.model) @@ -79,6 +84,11 @@ export namespace Agent { if (value.temperature != undefined) item.temperature = value.temperature if (value.top_p != undefined) item.topP = value.top_p if (value.mode) item.mode = value.mode + if (value.options) + item.options = { + ...item.options, + ...value.options, + } } return result }) diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index 2ba82904..96a662b2 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -173,6 +173,7 @@ export namespace Config { tools: z.record(z.string(), z.boolean()).optional(), disable: z.boolean().optional(), description: z.string().optional().describe("Description of when to use the agent"), + options: z.record(z.string(), z.any()).optional().describe("Additional model options passed through to provider"), mode: z.union([z.literal("subagent"), z.literal("primary"), z.literal("all")]).optional(), }) .openapi({ diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index 583f3df7..3d6bf98c 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -852,20 +852,24 @@ export namespace Session { tools[key] = item } - const params = { - temperature: model.info.temperature - ? (agent.temperature ?? ProviderTransform.temperature(input.providerID, input.modelID)) - : undefined, - topP: agent.topP ?? ProviderTransform.topP(input.providerID, input.modelID), - } - await Plugin.trigger( + const params = await Plugin.trigger( "chat.params", { model: model.info, provider: await Provider.getProvider(input.providerID), message: userMsg, }, - params, + { + temperature: model.info.temperature + ? (agent.temperature ?? ProviderTransform.temperature(input.providerID, input.modelID)) + : undefined, + topP: agent.topP ?? ProviderTransform.topP(input.providerID, input.modelID), + options: { + ...ProviderTransform.options(input.providerID, input.modelID), + ...model.info.options, + ...agent.options, + }, + }, ) const stream = streamText({ onError(e) { @@ -946,10 +950,7 @@ export namespace Session { return false }, providerOptions: { - [input.providerID]: { - ...ProviderTransform.options(input.providerID, input.modelID), - ...model.info.options, - }, + [input.providerID]: params.options, }, temperature: params.temperature, topP: params.topP, diff --git a/packages/plugin/src/index.ts b/packages/plugin/src/index.ts index d0d484a0..7ea82d2a 100644 --- a/packages/plugin/src/index.ts +++ b/packages/plugin/src/index.ts @@ -19,7 +19,7 @@ export interface Hooks { */ "chat.params"?: ( input: { model: Model; provider: Provider; message: UserMessage }, - output: { temperature: number; topP: number }, + output: { temperature: number; topP: number; options: Record }, ) => Promise "permission.ask"?: (input: Permission, output: { status: "ask" | "deny" | "allow" }) => Promise "tool.execute.before"?: (