diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts index e30d05e9350..fd07ebc85b7 100644 --- a/packages/opencode/src/agent/agent.ts +++ b/packages/opencode/src/agent/agent.ts @@ -322,11 +322,11 @@ export namespace Agent { }), } satisfies Parameters[0] + // TODO: clean this up so provider specific logic doesnt bleed over if (defaultModel.providerID === "openai" && (await Auth.get(defaultModel.providerID))?.type === "oauth") { const result = streamObject({ ...params, providerOptions: ProviderTransform.providerOptions(model, { - instructions: SystemPrompt.instructions(), store: false, }), onError: () => {}, diff --git a/packages/opencode/src/session/llm.ts b/packages/opencode/src/session/llm.ts index daf70180e52..48a36741c9c 100644 --- a/packages/opencode/src/session/llm.ts +++ b/packages/opencode/src/session/llm.ts @@ -63,14 +63,14 @@ export namespace LLM { Provider.getProvider(input.model.providerID), Auth.get(input.model.providerID), ]) - const isCodex = provider.id === "openai" && auth?.type === "oauth" + // TODO: move this to a proper hook + const isOpenaiOauth = provider.id === "openai" && auth?.type === "oauth" - const system = [] + const system: string[] = [] system.push( [ // use agent prompt otherwise provider prompt - // For Codex sessions, skip SystemPrompt.provider() since it's sent via options.instructions - ...(input.agent.prompt ? [input.agent.prompt] : isCodex ? [] : SystemPrompt.provider(input.model)), + ...(input.agent.prompt ? [input.agent.prompt] : SystemPrompt.provider(input.model)), // any custom prompt passed into this call ...input.system, // any custom prompt from last user message @@ -108,10 +108,22 @@ export namespace LLM { mergeDeep(input.agent.options), mergeDeep(variant), ) - if (isCodex) { - options.instructions = SystemPrompt.instructions() + if (isOpenaiOauth) { + options.instructions = system.join("\n") } + const messages = isOpenaiOauth + ? input.messages + : [ + ...system.map( + (x): ModelMessage => ({ + role: "system", + content: x, + }), + ), + ...input.messages, + ] + const params = await Plugin.trigger( "chat.params", { @@ -146,7 +158,9 @@ export namespace LLM { ) const maxOutputTokens = - isCodex || provider.id.includes("github-copilot") ? undefined : ProviderTransform.maxOutputTokens(input.model) + isOpenaiOauth || provider.id.includes("github-copilot") + ? undefined + : ProviderTransform.maxOutputTokens(input.model) const tools = await resolveTools(input) @@ -217,15 +231,7 @@ export namespace LLM { ...headers, }, maxRetries: input.retries ?? 0, - messages: [ - ...system.map( - (x): ModelMessage => ({ - role: "system", - content: x, - }), - ), - ...input.messages, - ], + messages, model: wrapLanguageModel({ model: language, middleware: [ diff --git a/packages/opencode/src/session/prompt/codex_header.txt b/packages/opencode/src/session/prompt/codex.txt similarity index 100% rename from packages/opencode/src/session/prompt/codex_header.txt rename to packages/opencode/src/session/prompt/codex.txt diff --git a/packages/opencode/src/session/system.ts b/packages/opencode/src/session/system.ts index 63230e6426c..80c89618e33 100644 --- a/packages/opencode/src/session/system.ts +++ b/packages/opencode/src/session/system.ts @@ -7,7 +7,7 @@ import PROMPT_DEFAULT from "./prompt/default.txt" import PROMPT_BEAST from "./prompt/beast.txt" import PROMPT_GEMINI from "./prompt/gemini.txt" -import PROMPT_CODEX from "./prompt/codex_header.txt" +import PROMPT_CODEX from "./prompt/codex.txt" import PROMPT_TRINITY from "./prompt/trinity.txt" import type { Provider } from "@/provider/provider" import type { Agent } from "@/agent/agent" @@ -15,14 +15,10 @@ import { PermissionNext } from "@/permission" import { Skill } from "@/skill" export namespace SystemPrompt { - export function instructions() { - return PROMPT_CODEX.trim() - } - export function provider(model: Provider.Model) { - if (model.api.id.includes("gpt-5")) return [PROMPT_CODEX] - if (model.api.id.includes("gpt-") || model.api.id.includes("o1") || model.api.id.includes("o3")) + if (model.api.id.includes("gpt-4") || model.api.id.includes("o1") || model.api.id.includes("o3")) return [PROMPT_BEAST] + if (model.api.id.includes("gpt")) return [PROMPT_CODEX] if (model.api.id.includes("gemini-")) return [PROMPT_GEMINI] if (model.api.id.includes("claude")) return [PROMPT_ANTHROPIC] if (model.api.id.toLowerCase().includes("trinity")) return [PROMPT_TRINITY]