summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--packages/opencode/src/agent/agent.ts10
-rw-r--r--packages/opencode/src/config/config.ts1
-rw-r--r--packages/opencode/src/session/index.ts25
-rw-r--r--packages/plugin/src/index.ts2
4 files changed, 25 insertions, 13 deletions
diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts
index 6fee2fdd5..ede8fbf7e 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 2ba82904f..96a662b29 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 583f3df7f..3d6bf98c6 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 d0d484a00..7ea82d2aa 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<string, any> },
) => Promise<void>
"permission.ask"?: (input: Permission, output: { status: "ask" | "deny" | "allow" }) => Promise<void>
"tool.execute.before"?: (