Skip to content

Commit cf6e714

Browse files
committed
feat(plan-agent): apply prometheus config to plan agent with fallback chain
- Add prometheus model fallback chain (claude-opus-4-5 → gpt-5.2 → gemini-3-pro) - Plan agent now inherits prometheus settings (model, prompt, permission, variant) - Plan agent mode remains 'subagent' while using prometheus config - Add name field to prometheus config to fix agent.name undefined error
1 parent 383f435 commit cf6e714

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

src/plugin-handlers/config-handler.ts

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ import { loadMcpConfigs } from "../features/claude-code-mcp-loader";
2525
import { loadAllPluginComponents } from "../features/claude-code-plugin-loader";
2626
import { createBuiltinMcps } from "../mcp";
2727
import type { OhMyOpenCodeConfig } from "../config";
28-
import { log } from "../shared";
28+
import { log, fetchAvailableModels, readConnectedProvidersCache } from "../shared";
2929
import { getOpenCodeConfigPaths } from "../shared/opencode-config-dir";
3030
import { migrateAgentConfig } from "../shared/permission-compat";
3131
import { AGENT_NAME_MAP } from "../shared/migration";
32+
import { resolveModelWithFallback } from "../shared/model-resolver";
33+
import { AGENT_MODEL_REQUIREMENTS } from "../shared/model-requirements";
3234
import { PROMETHEUS_SYSTEM_PROMPT, PROMETHEUS_PERMISSION } from "../agents/prometheus-prompt";
3335
import { DEFAULT_CATEGORIES } from "../tools/delegate-task/constants";
3436
import type { ModelCacheState } from "../plugin-state";
@@ -221,33 +223,42 @@ export function createConfigHandler(deps: ConfigHandlerDeps) {
221223
);
222224
const prometheusOverride =
223225
pluginConfig.agents?.["prometheus"] as
224-
| (Record<string, unknown> & { category?: string; model?: string })
226+
| (Record<string, unknown> & { category?: string; model?: string; variant?: string })
225227
| undefined;
226228
const defaultModel = config.model as string | undefined;
227229

228-
// Resolve full category config (model, temperature, top_p, tools, etc.)
229-
// Apply all category properties when category is specified, but explicit
230-
// overrides (model, temperature, etc.) will take precedence during merge
231230
const categoryConfig = prometheusOverride?.category
232231
? resolveCategoryConfig(
233232
prometheusOverride.category,
234233
pluginConfig.categories
235234
)
236235
: undefined;
237236

238-
// Model resolution: explicit override → category config → OpenCode default
239-
// No hardcoded fallback - OpenCode config.model is the terminal fallback
240-
const resolvedModel = prometheusOverride?.model ?? categoryConfig?.model ?? defaultModel;
241-
237+
const prometheusRequirement = AGENT_MODEL_REQUIREMENTS["prometheus"];
238+
const connectedProviders = readConnectedProvidersCache();
239+
const availableModels = ctx.client
240+
? await fetchAvailableModels(ctx.client, { connectedProviders: connectedProviders ?? undefined })
241+
: new Set<string>();
242+
243+
const modelResolution = resolveModelWithFallback({
244+
userModel: prometheusOverride?.model ?? categoryConfig?.model,
245+
fallbackChain: prometheusRequirement?.fallbackChain,
246+
availableModels,
247+
systemDefaultModel: defaultModel ?? "",
248+
});
249+
const resolvedModel = modelResolution?.model;
250+
const resolvedVariant = modelResolution?.variant;
251+
252+
const variantToUse = prometheusOverride?.variant ?? resolvedVariant;
242253
const prometheusBase = {
243-
// Only include model if one was resolved - let OpenCode apply its own default if none
254+
name: "prometheus",
244255
...(resolvedModel ? { model: resolvedModel } : {}),
256+
...(variantToUse ? { variant: variantToUse } : {}),
245257
mode: "primary" as const,
246258
prompt: PROMETHEUS_SYSTEM_PROMPT,
247259
permission: PROMETHEUS_PERMISSION,
248260
description: `${configAgent?.plan?.description ?? "Plan agent"} (Prometheus - OhMyOpenCode)`,
249261
color: (configAgent?.plan?.color as string) ?? "#FF6347",
250-
// Apply category properties (temperature, top_p, tools, etc.)
251262
...(categoryConfig?.temperature !== undefined
252263
? { temperature: categoryConfig.temperature }
253264
: {}),
@@ -295,8 +306,8 @@ export function createConfigHandler(deps: ConfigHandlerDeps) {
295306
? migrateAgentConfig(configAgent.build as Record<string, unknown>)
296307
: {};
297308

298-
const planDemoteConfig = replacePlan
299-
? { mode: "subagent" as const }
309+
const planDemoteConfig = replacePlan && agentConfig["prometheus"]
310+
? { ...agentConfig["prometheus"], name: "plan", mode: "subagent" as const }
300311
: undefined;
301312

302313
config.agent = {

0 commit comments

Comments
 (0)