docs: both api keys, example model gpt-5.4-nano

This commit is contained in:
pj committed 2026-06-12 10:52:14 +05:30
1 parent 3ca0e9a5b9
commit ede495d935
3 files changed
+24 -19

No files matched your search

+10 -8
View File
@@ -81,19 +81,21 @@ Traces land in `./sanderling/runs/<timestamp>/`.
## Run with the LLM action backend
`sanderling/spec-llm.ts` reuses the same properties and login setup but swaps the
seeded fuzzer for `llm({ model })`: an OpenRouter vision model chooses which of
the already-enumerated candidates to act on each step, from the screenshot.
seeded fuzzer for `llm({ model })`: a vision model chooses which of the
already-enumerated candidates to act on each step, from the screenshot.
```sh
export OPENROUTER_API_KEY=sk-or-...
export OPENROUTER_API_KEY=sk-or-... # or OPENAI_API_KEY=sk-... for OpenAI direct
sanderling test --spec sanderling/spec-llm.ts --bundle-id app.folio --duration 2m
```
The model must support image input **and** strict `json_schema` structured
outputs (e.g. `openai/gpt-4o`); edit the `model` string in `spec-llm.ts` to pick
another. Each step is one multimodal call, so keep the duration / step budget
modest. The trace records the model's reasoning and `source: "llm"` on each
chosen action, so the replay UI shows why each pick was made.
OpenRouter wins when both keys are set. With a plain OpenAI key, drop the vendor
prefix from the model id in `spec-llm.ts` (`gpt-5.4-nano`, not
`openai/gpt-5.4-nano`). The model must support image input **and** strict
`json_schema` structured outputs. Each step is one multimodal call, so keep the
duration / step budget modest. The trace records the model's reasoning and
`source: "llm"` on each chosen action, so the replay UI shows why each pick was
made.
## Run a sanderling test (iOS)