Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/app/src/components/prompt-input/submit.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@
add: (value: {
directory?: string
sessionID?: string
message: { agent: string; model: { providerID: string; modelID: string }; variant?: string }
message: { agent: string; model: { providerID: string; modelID: string; variant?: string } }
}) => {
optimistic.push(value)
optimisticSeeded.push(
Expand Down Expand Up @@ -307,7 +307,7 @@
await submit.handleSubmit(event)

expect(optimistic).toHaveLength(1)
expect(optimistic[0]).toMatchObject({

Check failure on line 310 in packages/app/src/components/prompt-input/submit.test.ts

View workflow job for this annotation

GitHub Actions / unit (linux)

error: expect(received).toMatchObject(expected)

{ + "directory": "/repo/main", "message": { "agent": "agent", + "id": "msg_d681e3fe9001X2eRt3YR5js9n7", "model": { "modelID": "model", "providerID": "provider", + "variant": "high", }, - "variant": "high", + "role": "user", + "sessionID": "session-1", + "time": { + "created": 1775568306153, + }, }, + "parts": [ + { + "id": "prt_d681e3fe9002VsFNK3AugPEmDD", + "ignored": undefined, + "messageID": "msg_d681e3fe9001X2eRt3YR5js9n7", + "metadata": undefined, + "sessionID": "session-1", + "synthetic": undefined, + "text": "ls", + "time": undefined, + "type": "text", + }, + ], + "sessionID": "session-1", } - Expected - 1 + Received + 22 at <anonymous> (/home/runner/_work/opencode/opencode/packages/app/src/components/prompt-input/submit.test.ts:310:27)
message: {
agent: "agent",
model: { providerID: "provider", modelID: "model" },
Expand Down
3 changes: 1 addition & 2 deletions packages/app/src/components/prompt-input/submit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,7 @@ export async function sendFollowupDraft(input: FollowupSendInput) {
role: "user",
time: { created: Date.now() },
agent: input.draft.agent,
model: input.draft.model,
variant: input.draft.variant,
model: { ...input.draft.model, variant: input.draft.variant },
}

const add = () =>
Expand Down
4 changes: 2 additions & 2 deletions packages/app/src/context/local.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
handoff.set(handoffKey(dir, session), next)
setStore("draft", undefined)
},
restore(msg: { sessionID: string; agent: string; model: ModelKey; variant?: string }) {
restore(msg: { sessionID: string; agent: string; model: ModelKey & { variant?: string } }) {
const session = id()
if (!session) return
if (msg.sessionID !== session) return
Expand All @@ -383,7 +383,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
setSaved("session", session, {
agent: msg.agent,
model: msg.model,
variant: msg.variant ?? null,
variant: msg.model.variant ?? null,
})
},
},
Expand Down
3 changes: 1 addition & 2 deletions packages/app/src/context/sync.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -416,8 +416,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
role: "user",
time: { created: Date.now() },
agent: input.agent,
model: input.model,
variant: input.variant,
model: { ...input.model, variant: input.variant },
}
const [, setStore] = target()
setOptimistic(sdk.directory, input.sessionID, { message, parts: input.parts })
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@ import { describe, expect, test } from "bun:test"
import type { UserMessage } from "@opencode-ai/sdk/v2"
import { resetSessionModel, syncSessionModel } from "./session-model-helpers"

const message = (input?: Partial<Pick<UserMessage, "agent" | "model" | "variant">>) =>
const message = (input?: { agent?: string; model?: UserMessage["model"] }) =>
({
id: "msg",
sessionID: "session",
role: "user",
time: { created: 1 },
agent: input?.agent ?? "build",
model: input?.model ?? { providerID: "anthropic", modelID: "claude-sonnet-4" },
variant: input?.variant,
}) as UserMessage

describe("syncSessionModel", () => {
Expand All @@ -26,10 +25,12 @@ describe("syncSessionModel", () => {
reset() {},
},
},
message({ variant: "high" }),
message({ model: { providerID: "anthropic", modelID: "claude-sonnet-4", variant: "high" } }),
)

expect(calls).toEqual([message({ variant: "high" })])
expect(calls).toEqual([
message({ model: { providerID: "anthropic", modelID: "claude-sonnet-4", variant: "high" } }),
])
})
})

Expand Down
8 changes: 6 additions & 2 deletions packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -209,8 +209,12 @@ export function Prompt(props: PromptProps) {
const isPrimaryAgent = local.agent.list().some((x) => x.name === msg.agent)
if (msg.agent && isPrimaryAgent) {
local.agent.set(msg.agent)
if (msg.model) local.model.set(msg.model)
if (msg.variant) local.model.variant.set(msg.variant)
if (msg.model) {
local.model.set(msg.model)
local.model.variant.set(
"variant" in msg.model && typeof msg.model.variant === "string" ? msg.model.variant : undefined,
)
}
}
}
})
Expand Down
3 changes: 1 addition & 2 deletions packages/opencode/src/session/compaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ When constructing the summary, try to stick to this template:
sessionID: input.sessionID,
mode: "compaction",
agent: "compaction",
variant: userMessage.variant,
variant: userMessage.model.variant,
summary: true,
path: {
cwd: ctx.directory,
Expand Down Expand Up @@ -295,7 +295,6 @@ When constructing the summary, try to stick to this template:
format: original.format,
tools: original.tools,
system: original.system,
variant: original.variant,
})
for (const part of replay.parts) {
if (part.type === "compaction") continue
Expand Down
4 changes: 3 additions & 1 deletion packages/opencode/src/session/llm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,9 @@ export namespace LLM {
}

const variant =
!input.small && input.model.variants && input.user.variant ? input.model.variants[input.user.variant] : {}
!input.small && input.model.variants && input.user.model.variant
? input.model.variants[input.user.model.variant]
: {}
const base = input.small
? ProviderTransform.smallOptions(input.model)
: ProviderTransform.options({
Expand Down
2 changes: 1 addition & 1 deletion packages/opencode/src/session/message-v2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -371,10 +371,10 @@ export namespace MessageV2 {
model: z.object({
providerID: ProviderID.zod,
modelID: ModelID.zod,
variant: z.string().optional(),
}),
system: z.string().optional(),
tools: z.record(z.string(), z.boolean()).optional(),
variant: z.string().optional(),
}).meta({
ref: "UserMessage",
})
Expand Down
13 changes: 8 additions & 5 deletions packages/opencode/src/session/prompt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -569,7 +569,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the
sessionID,
mode: task.agent,
agent: task.agent,
variant: lastUser.variant,
variant: lastUser.model.variant,
path: { cwd: ctx.directory, root: ctx.worktree },
cost: 0,
tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } },
Expand Down Expand Up @@ -967,17 +967,20 @@ NOTE: At any point in time through this workflow you should feel free to ask the
: undefined
const variant = input.variant ?? (ag.variant && full?.variants?.[ag.variant] ? ag.variant : undefined)

const info: MessageV2.Info = {
const info: MessageV2.User = {
id: input.messageID ?? MessageID.ascending(),
role: "user",
sessionID: input.sessionID,
time: { created: Date.now() },
tools: input.tools,
agent: ag.name,
model,
model: {
providerID: model.providerID,
modelID: model.modelID,
variant,
},
system: input.system,
format: input.format,
variant,
}

yield* Effect.addFinalizer(() =>
Expand Down Expand Up @@ -1436,7 +1439,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the
role: "assistant",
mode: agent.name,
agent: agent.name,
variant: lastUser.variant,
variant: lastUser.model.variant,
path: { cwd: ctx.directory, root: ctx.worktree },
cost: 0,
tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } },
Expand Down
6 changes: 2 additions & 4 deletions packages/opencode/test/session/llm.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -342,8 +342,7 @@ describe("session.llm.stream", () => {
role: "user",
time: { created: Date.now() },
agent: agent.name,
model: { providerID: ProviderID.make(providerID), modelID: resolved.id },
variant: "high",
model: { providerID: ProviderID.make(providerID), modelID: resolved.id, variant: "high" },
} satisfies MessageV2.User

const stream = await LLM.stream({
Expand Down Expand Up @@ -716,8 +715,7 @@ describe("session.llm.stream", () => {
role: "user",
time: { created: Date.now() },
agent: agent.name,
model: { providerID: ProviderID.make("openai"), modelID: resolved.id },
variant: "high",
model: { providerID: ProviderID.make("openai"), modelID: resolved.id, variant: "high" },
} satisfies MessageV2.User

const stream = await LLM.stream({
Expand Down
6 changes: 3 additions & 3 deletions packages/opencode/test/session/prompt.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,7 @@ describe("session.prompt agent variant", () => {
parts: [{ type: "text", text: "hello" }],
})
if (other.info.role !== "user") throw new Error("expected user message")
expect(other.info.variant).toBeUndefined()
expect(other.info.model.variant).toBeUndefined()

const match = await SessionPrompt.prompt({
sessionID: session.id,
Expand All @@ -420,7 +420,7 @@ describe("session.prompt agent variant", () => {
})
if (match.info.role !== "user") throw new Error("expected user message")
expect(match.info.model).toEqual({ providerID: ProviderID.make("openai"), modelID: ModelID.make("gpt-5.2") })
expect(match.info.variant).toBe("xhigh")
expect(match.info.model.variant).toBe("xhigh")

const override = await SessionPrompt.prompt({
sessionID: session.id,
Expand All @@ -430,7 +430,7 @@ describe("session.prompt agent variant", () => {
parts: [{ type: "text", text: "hello third" }],
})
if (override.info.role !== "user") throw new Error("expected user message")
expect(override.info.variant).toBe("high")
expect(override.info.model.variant).toBe("high")

await Session.remove(session.id)
},
Expand Down
2 changes: 1 addition & 1 deletion packages/sdk/js/src/v2/gen/types.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -548,12 +548,12 @@ export type UserMessage = {
model: {
providerID: string
modelID: string
variant?: string
}
system?: string
tools?: {
[key: string]: boolean
}
variant?: string
}

export type AssistantMessage = {
Expand Down
Loading