2026-01-10 21:44:20 +00:00
|
|
|
import type { OhMyOpenCodeConfig } from "../config"
|
2026-04-15 10:46:41 +09:00
|
|
|
import { stripInvisibleAgentCharacters } from "./agent-display-names"
|
2026-01-28 10:26:31 +03:00
|
|
|
import { AGENT_MODEL_REQUIREMENTS, CATEGORY_MODEL_REQUIREMENTS } from "./model-requirements"
|
2026-01-10 21:44:20 +00:00
|
|
|
|
|
|
|
|
export function resolveAgentVariant(
|
|
|
|
|
config: OhMyOpenCodeConfig,
|
|
|
|
|
agentName?: string
|
|
|
|
|
): string | undefined {
|
|
|
|
|
if (!agentName) {
|
|
|
|
|
return undefined
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 10:46:41 +09:00
|
|
|
const stripped = stripInvisibleAgentCharacters(agentName)
|
2026-01-10 21:44:20 +00:00
|
|
|
const agentOverrides = config.agents as
|
|
|
|
|
| Record<string, { variant?: string; category?: string }>
|
|
|
|
|
| undefined
|
2026-01-31 15:46:14 +09:00
|
|
|
const agentOverride = agentOverrides
|
2026-04-15 10:46:41 +09:00
|
|
|
? agentOverrides[stripped]
|
|
|
|
|
?? Object.entries(agentOverrides).find(([key]) => key.toLowerCase() === stripped.toLowerCase())?.[1]
|
2026-01-31 15:46:14 +09:00
|
|
|
: undefined
|
2026-01-10 21:44:20 +00:00
|
|
|
if (!agentOverride) {
|
|
|
|
|
return undefined
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (agentOverride.variant) {
|
|
|
|
|
return agentOverride.variant
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const categoryName = agentOverride.category
|
|
|
|
|
if (!categoryName) {
|
|
|
|
|
return undefined
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return config.categories?.[categoryName]?.variant
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-28 10:26:31 +03:00
|
|
|
export function resolveVariantForModel(
|
|
|
|
|
config: OhMyOpenCodeConfig,
|
|
|
|
|
agentName: string,
|
|
|
|
|
currentModel: { providerID: string; modelID: string },
|
|
|
|
|
): string | undefined {
|
2026-04-15 10:46:41 +09:00
|
|
|
const stripped = stripInvisibleAgentCharacters(agentName)
|
2026-01-28 10:26:31 +03:00
|
|
|
const agentOverrides = config.agents as
|
2026-02-02 21:07:10 +09:00
|
|
|
| Record<string, { variant?: string; category?: string }>
|
2026-01-28 10:26:31 +03:00
|
|
|
| undefined
|
2026-01-31 15:46:14 +09:00
|
|
|
const agentOverride = agentOverrides
|
2026-04-15 10:46:41 +09:00
|
|
|
? agentOverrides[stripped]
|
|
|
|
|
?? Object.entries(agentOverrides).find(([key]) => key.toLowerCase() === stripped.toLowerCase())?.[1]
|
2026-01-31 15:46:14 +09:00
|
|
|
: undefined
|
2026-02-02 21:07:10 +09:00
|
|
|
if (agentOverride?.variant) {
|
|
|
|
|
return agentOverride.variant
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 10:46:41 +09:00
|
|
|
const agentRequirement = AGENT_MODEL_REQUIREMENTS[stripped]
|
2026-02-02 21:07:10 +09:00
|
|
|
if (agentRequirement) {
|
|
|
|
|
return findVariantInChain(agentRequirement.fallbackChain, currentModel)
|
|
|
|
|
}
|
2026-01-28 10:26:31 +03:00
|
|
|
const categoryName = agentOverride?.category
|
|
|
|
|
if (categoryName) {
|
|
|
|
|
const categoryRequirement = CATEGORY_MODEL_REQUIREMENTS[categoryName]
|
|
|
|
|
if (categoryRequirement) {
|
2026-02-02 21:07:10 +09:00
|
|
|
return findVariantInChain(categoryRequirement.fallbackChain, currentModel)
|
2026-01-28 10:26:31 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return undefined
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function findVariantInChain(
|
|
|
|
|
fallbackChain: { providers: string[]; model: string; variant?: string }[],
|
2026-02-02 21:07:10 +09:00
|
|
|
currentModel: { providerID: string; modelID: string },
|
2026-01-28 10:26:31 +03:00
|
|
|
): string | undefined {
|
|
|
|
|
for (const entry of fallbackChain) {
|
2026-02-02 21:07:10 +09:00
|
|
|
if (
|
|
|
|
|
entry.providers.includes(currentModel.providerID)
|
|
|
|
|
&& entry.model === currentModel.modelID
|
|
|
|
|
) {
|
2026-01-28 10:26:31 +03:00
|
|
|
return entry.variant
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-02-19 04:41:00 +02:00
|
|
|
|
|
|
|
|
// Some providers expose identical model IDs (e.g. OpenAI models via different providers).
|
|
|
|
|
// If we didn't find an exact provider+model match, fall back to model-only matching.
|
|
|
|
|
for (const entry of fallbackChain) {
|
|
|
|
|
if (entry.model === currentModel.modelID) {
|
|
|
|
|
return entry.variant
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-01-28 10:26:31 +03:00
|
|
|
return undefined
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-10 21:44:20 +00:00
|
|
|
export function applyAgentVariant(
|
|
|
|
|
config: OhMyOpenCodeConfig,
|
|
|
|
|
agentName: string | undefined,
|
|
|
|
|
message: { variant?: string }
|
|
|
|
|
): void {
|
|
|
|
|
const variant = resolveAgentVariant(config, agentName)
|
|
|
|
|
if (variant !== undefined && message.variant === undefined) {
|
|
|
|
|
message.variant = variant
|
|
|
|
|
}
|
|
|
|
|
}
|