feat(verifier): read llm config off globalThis.generator

This commit is contained in:
pj committed 2026-07-13 07:05:11 +05:30
1 parent aa67d7ddcf
commit dcf7c4a02a
3 files changed
+13 -11

No files matched your search

+1 -1
View File
@@ -31,7 +31,7 @@ var llmInputCorpus = []string{
const llmFixtureSpec = `
import { llm, always } from "@sanderling/spec";
globalThis.properties = { ok: always(() => true) };
globalThis.actions = llm({ model: "test/model" });
globalThis.generator = llm({ model: "test/model" });
`
const llmTreeJSON = `{
+9 -7
View File
@@ -8,8 +8,10 @@ import (
"github.com/priyanshujain/sanderling/internal/hierarchy"
)
// LLMConfig is the spec-declared configuration for the LLM action backend,
// read off globalThis.actions when the spec assigned `actions = llm({...})`.
// LLMConfig is the spec-declared configuration for the LLM action generator,
// read off globalThis.generator when the spec assigned `generator = llm({...})`.
// It is orthogonal to globalThis.actions (the weighted tree the LLM picks from);
// only the picker differs.
type LLMConfig struct {
Model string
// Instructions is optional spec-level guidance appended to the prompt to
@@ -17,15 +19,15 @@ type LLMConfig struct {
Instructions string
}
// LLMConfig reports the LLM action backend config when the spec selected it
// (globalThis.actions.kind === "llm"). The second return is false for every
// LLMConfig reports the LLM action-generator config when the spec declared one
// (globalThis.generator.kind === "llm"). The second return is false for every
// other spec, so the runner falls back to the seeded picker.
func (v *Verifier) LLMConfig() (LLMConfig, bool) {
actions := v.runtime.GlobalObject().Get("actions")
if actions == nil || goja.IsUndefined(actions) || goja.IsNull(actions) {
generator := v.runtime.GlobalObject().Get("generator")
if generator == nil || goja.IsUndefined(generator) || goja.IsNull(generator) {
return LLMConfig{}, false
}
object := actions.ToObject(v.runtime)
object := generator.ToObject(v.runtime)
if object == nil {
return LLMConfig{}, false
}
+3 -3
View File
@@ -88,7 +88,7 @@ func TestAllCandidatesNilTree(t *testing.T) {
}
func TestLLMConfigDetectsMarker(t *testing.T) {
v := newLoadedVerifier(t, `globalThis.actions = { kind: "llm", config: { model: "vendor/model" } };`)
v := newLoadedVerifier(t, `globalThis.generator = { kind: "llm", config: { model: "vendor/model" } };`)
config, ok := v.LLMConfig()
if !ok {
t.Fatal("LLMConfig not detected for llm marker")
@@ -102,7 +102,7 @@ func TestLLMConfigDetectsMarker(t *testing.T) {
}
func TestLLMConfigReadsInstructions(t *testing.T) {
v := newLoadedVerifier(t, `globalThis.actions = { kind: "llm", config: { model: "m", instructions: "find bugs" } };`)
v := newLoadedVerifier(t, `globalThis.generator = { kind: "llm", config: { model: "m", instructions: "find bugs" } };`)
config, ok := v.LLMConfig()
if !ok {
t.Fatal("LLMConfig not detected")
@@ -115,7 +115,7 @@ func TestLLMConfigReadsInstructions(t *testing.T) {
func TestLLMConfigAbsentForSeededSpec(t *testing.T) {
v := newLoadedVerifier(t, `globalThis.actions = { kind: "builtin", verb: "taps" };`)
if _, ok := v.LLMConfig(); ok {
t.Error("LLMConfig should be false for a non-llm actions root")
t.Error("LLMConfig should be false when no generator is declared")
}
}