Something went wrong. Try again.
opencode v2 mirror
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394export * as OptimizePlugin from "./optimize.js"
import { define } from "@opencode/plugin/effect/plugin"import type { SessionHooks } from "@opencode/plugin/effect/session"import { Model } from "@opencode/schema/model"import { Effect } from "effect"import { SessionSystemPrompt } from "../session/system-prompt.js"
import PROMPT_GPT from "./system-prompt/gpt.txt"import PROMPT_ASTRA from "./system-prompt/gpt-astra.txt"import PROMPT_KIMI from "./system-prompt/kimi.txt"import PROMPT_META from "./system-prompt/meta.txt"import PROMPT_TRINITY from "./system-prompt/trinity.txt"import PROMPT_ANTHROPIC from "./system-prompt/anthropic.txt"
export const OpenAIPlugin = make("opencode.prompt.openai", (model) => { const id = model.id.toLowerCase() if (!id.includes("gpt")) return undefined return id.includes("gpt-6") ? PROMPT_ASTRA : PROMPT_GPT})
export const AnthropicPlugin = make( "opencode.prompt.anthropic", (model) => { const id = model.id.toLowerCase() if (!id.includes("claude")) return undefined return PROMPT_ANTHROPIC }, "append",)
// Both OpenAIToolsPlugin and AnthropicToolsPlugin are disabled intentionally until we can figure out a good ux for displaying// heavy grep/glob usage done via shell or other mechanisms
export const OpenAIToolsPlugin = make("opencode.optimize.openai.tools", (model, tools) => { const ids = [model.id, model.modelID, model.family].join(" ").toLowerCase() if (!ids.includes("gpt")) return undefined delete tools.grep delete tools.glob return undefined})
export const AnthropicToolsPlugin = make("opencode.optimize.anthropic.tools", (model, tools) => { const ids = [model.id, model.modelID, model.family].join(" ").toLowerCase() if (!ids.includes("claude")) return undefined delete tools.grep delete tools.glob return undefined})
export const KimiPlugin = make("opencode.prompt.kimi", (model) => model.id.toLowerCase().includes("kimi") ? PROMPT_KIMI : undefined,)export const ArceePlugin = make("opencode.prompt.arcee", (model) => model.id.toLowerCase().includes("trinity") ? PROMPT_TRINITY : undefined,)export const MetaPlugin = make("opencode.prompt.meta", (model) => { if (!model.id.toLowerCase().includes("muse")) return undefined return PROMPT_META.replaceAll("{{MODEL_NAME}}", model.name)})
export const Plugins = [OpenAIPlugin, AnthropicPlugin, KimiPlugin, ArceePlugin, MetaPlugin] as const
function make( id: string, optimize: (model: Model.Info, tools: SessionHooks["context"]["tools"]) => string | undefined, mode: "override" | "append" = "override",) { return define({ id, effect: Effect.fn(`OptimizePlugin.${id}`)(function* (ctx) { const hook = (event: SessionHooks["context"]) => Effect.gen(function* () { const model = (yield* ctx.model.list()).data.find( (model) => model.providerID === event.model.providerID && model.id === event.model.id, ) ?? Model.Info.default(event.model.providerID, event.model.id) // Curate tools before rendering their guidance, including for agents with a custom system prompt. const template = optimize(model, event.tools) if (!template) return if ((yield* ctx.agent.get({ agentID: event.agent })).data.system) return const system = event.system[0] if (!system) return const rendered = SessionSystemPrompt.render(template, Object.keys(event.tools)) const text = mode === "append" ? `${system.text}\n\n${rendered}` : rendered event.system[0] = { ...system, text } }).pipe(Effect.catch(() => Effect.void)) yield* ctx.session.hook("context", hook) yield* ctx.session.hook("compaction", hook) yield* ctx.session.hook("generate", hook) }), })}