feat(prompts-core): resolve prompt variants by declaration order

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
YeonGyu-Kim
2026-05-24 17:23:41 +09:00
parent 5e156e50b2
commit ada4092ea1
9 changed files with 147 additions and 3 deletions
@@ -0,0 +1,15 @@
bun test v1.3.12 (700fc117)
packages/prompts-core/src/variant-resolver.test.ts:
S1 actual: default
S2 actual: gpt
S3 actual: gemini
S4 actual: planner
S5 actual: default
S6 actual: default
S7 actual: NoMatchingVariantError
7 pass
0 fail
7 expect() calls
Ran 7 tests across 1 file. [75.00ms]
@@ -0,0 +1,15 @@
bun test v1.3.12 (700fc117)
packages/prompts-core/src/variant-resolver.test.ts:
S1 actual: default
S2 actual: gpt
S3 actual: gemini
S4 actual: planner
S5 actual: default
S6 actual: default
S7 actual: NoMatchingVariantError
7 pass
0 fail
7 expect() calls
Ran 7 tests across 1 file. [75.00ms]
@@ -0,0 +1,15 @@
bun test v1.3.12 (700fc117)
packages/prompts-core/src/variant-resolver.test.ts:
S1 actual: default
S2 actual: gpt
S3 actual: gemini
S4 actual: planner
S5 actual: default
S6 actual: default
S7 actual: NoMatchingVariantError
7 pass
0 fail
7 expect() calls
Ran 7 tests across 1 file. [75.00ms]
@@ -0,0 +1,15 @@
bun test v1.3.12 (700fc117)
packages/prompts-core/src/variant-resolver.test.ts:
S1 actual: default
S2 actual: gpt
S3 actual: gemini
S4 actual: planner
S5 actual: default
S6 actual: default
S7 actual: NoMatchingVariantError
7 pass
0 fail
7 expect() calls
Ran 7 tests across 1 file. [75.00ms]
@@ -0,0 +1,15 @@
bun test v1.3.12 (700fc117)
packages/prompts-core/src/variant-resolver.test.ts:
S1 actual: default
S2 actual: gpt
S3 actual: gemini
S4 actual: planner
S5 actual: default
S6 actual: default
S7 actual: NoMatchingVariantError
7 pass
0 fail
7 expect() calls
Ran 7 tests across 1 file. [75.00ms]
@@ -0,0 +1,15 @@
bun test v1.3.12 (700fc117)
packages/prompts-core/src/variant-resolver.test.ts:
S1 actual: default
S2 actual: gpt
S3 actual: gemini
S4 actual: planner
S5 actual: default
S6 actual: default
S7 actual: NoMatchingVariantError
7 pass
0 fail
7 expect() calls
Ran 7 tests across 1 file. [75.00ms]
@@ -0,0 +1,15 @@
bun test v1.3.12 (700fc117)
packages/prompts-core/src/variant-resolver.test.ts:
S1 actual: default
S2 actual: gpt
S3 actual: gemini
S4 actual: planner
S5 actual: default
S6 actual: default
S7 actual: NoMatchingVariantError
7 pass
0 fail
7 expect() calls
Ran 7 tests across 1 file. [75.00ms]
@@ -0,0 +1,15 @@
bun test v1.3.12 (700fc117)
packages/prompts-core/src/variant-resolver.test.ts:
S1 actual: default
S2 actual: gpt
S3 actual: gemini
S4 actual: planner
S5 actual: default
S6 actual: default
S7 actual: NoMatchingVariantError
7 pass
0 fail
7 expect() calls
Ran 7 tests across 1 file. [75.00ms]
+27 -3
View File
@@ -1,5 +1,29 @@
import type { ResolveVariantInput } from "./types"
import {
NoMatchingVariantError,
type ResolveVariantInput,
type VariantDefinition,
type VariantFallback,
} from "./types"
export function resolveVariant(_input: ResolveVariantInput): string {
return "__red__"
function isVariantFallback(definition: VariantDefinition): definition is VariantFallback {
return "fallback" in definition && definition.fallback === true
}
export function resolveVariant(input: ResolveVariantInput): string {
const entries = Object.entries(input.variants)
const testInput = {
...(input.modelID === undefined ? {} : { modelID: input.modelID }),
...(input.agentName === undefined ? {} : { agentName: input.agentName }),
}
for (const [variantKey, definition] of entries) {
if (isVariantFallback(definition)) continue
if (definition.test(testInput)) return variantKey
}
const fallbackEntry = entries.find(([, definition]) => isVariantFallback(definition))
if (fallbackEntry !== undefined) return fallbackEntry[0]
const variantKeys = entries.map(([variantKey]) => variantKey).join(", ")
throw new NoMatchingVariantError(`No matching prompt variant found among: ${variantKeys}`)
}