Skip to content

chore: update remote config (GPT-6.1 Terra, Kimi K3.1 Pro, Minimax M3.1 Flash, Mercury 3, thinking levels) - #1959

Merged
tawnymanticore merged 172 commits into
remote_configfrom
main
Nov 2, 2026
Merged

tawnymanticore merged 172 commits into
remote_configfrom
main

Conversation

@tawnymanticore

@tawnymanticore tawnymanticore commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

Description
Publishes the model list on main to the remote config: seven new models (GPT-6.1 Terra, GPT-6.1 Terra Pro, Kimi K3.1 Pro, Minimax M3.1 Flash, Mercury 3, Ternary Bonsai 2 9B, Ultramarine 1 Flash), two DeepSeek V4.1 Flash provider backfills, corrected Cloudflare and OpenRouter thinking levels, new Fireworks thinking levels, and five deprecated provider entries.

Author Review (required)

  • I have done a code review

Architecture Review (select 1)

  • Small change, no architecture review needed

Review Style Requested (select 1)

  • Mixed: AI for some areas, human sign-off on others

Agentic Code Review (must check all before requesting CR)

  • I have addressed all AI feedback (“deep cr”, CodeRabbit, etc)

What to Review

  • Key decisions to review
    • Remote config publish
  • Paths to review
    • libs/core/kiln_ai/adapters/ml_model_list.py

UI Review (select all that apply)

  • No UI

Agentic PR Summary

TLDR: Merging this PR publishes the model list on main to every Kiln client. It carries seven new models (#1969, #1979, #1982, #1985), a Fireworks provider (#1970), two provider backfills (#1952), thinking-level fixes (#1960, #1962, #1963) and five deprecated provider entries (#1978, #1983, #1986). Targets remote_config. The together 3.0 test failure is fixed on main by #1977.

Kiln clients read the model list from the published remote config. The CI build makes that config from the remote_config branch, not from main.

Changes to the published config

No model is removed. The embedding and reranker lists do not change.

Checks

Before you merge


Updates (2026-10-22)

Updates (2026-10-26)

Updates (2026-10-27)

Updates (2026-10-28)

Updates (2026-10-29)

Updates (2026-10-30)

Updates (2026-11-02)


Generated by Claude Code

``<source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/RetriggerDark.svg?v=2"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/Retrigger.svg?v=2"><img alt="Retrigger" src="https://greptile-static-assets.s3.amazonaws.com/badges/Retrigger.svg?v=2" align="right">``Confidence Score: 4/5

The new deprecations look safe, but the previously reported nested world-tool failure still blocks merging.

Findings

  1. &lt;img alt="P1" src="https://greptile-static-assets.s3.amazonaws.com/badges/p1.svg?v=9" align="top"&gt; Nested world calls fail ▶

Reviews (14) · Last reviewed commit: "Merge pull request #1986 from Kiln-AI/mo..." · Reviewed by Greptile

sfierro and others added 30 commits June 16, 2026 00:27
Adds the ability to rename a spec eval's output score name, which is shown
on the Compare Run Configurations page.

Backend:
- update_eval accepts output_score_names (positional, same length as the
  eval's output_scores). rename_eval_output_scores validates the new names
  and unique json_keys, then re-keys EvalRun.scores across every EvalConfig
  and run. Eval + affected run files are saved atomically with rollback if
  any save fails.
- update_spec regenerates the auto-generated score instruction when the spec
  name changes (mirrors the existing eval-name propagation), without
  clobbering user-customized instructions.

Frontend:
- EditDialog fields support an optional custom_setter; such fields are
  excluded from the main PATCH body and persisted via the callback, and the
  main PATCH is skipped when no plain fields remain.
- The spec page Edit dialog gains a Score Name field per output score, which
  PATCHes the eval endpoint. Regenerated the OpenAPI client.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Multiple fields can share a custom_setter (all eval score-name fields
persist via a single endpoint call). EditDialog now invokes each distinct
setter once per save cycle, avoiding redundant eval PATCHes / run
migrations when an eval has multiple output scores.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Per review: mutating the on-disk score name and re-keying every EvalRun
pollutes git history (each run is a tracked file) and is destructive.
Replace it with a cosmetic display name that never touches stored data.

- EvalOutputScore gains an optional `display_name` (max 32). `json_key()`
  still derives from `name`, so stored eval runs are never affected.
- update_eval: `output_score_names` -> `output_score_display_names`. The new
  `set_output_score_display_names` just sets display names and saves the
  single eval file (no run migration, no rollback machinery). Empty entries
  clear the display name.
- Frontend: new `score_display_name(score)` helper (display_name || name)
  applied at all display sites (compare table, eval configs, run result,
  eval goals). json_key lookups stay on `name`.
- Spec-page Edit field relabeled "Score Display Name" and clarified as
  cosmetic; PATCHes output_score_display_names.
- Tests updated: display-name behavior incl. run files unchanged byte-for-
  byte, clear, length validation; removed migration/rollback tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The display-name mechanism is an implementation detail; users just see it
as editing the score name. Field still persists via the display name under
the hood (no stored data changes).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The LLM judge's conversation (system prompt, rendered judge prompt and the
judge's reply) was discarded after scoring, so there was no way to see what
a judge prompt template rendered. V2EvalResult and EvalRun gain a
judge_trace field, the LLM judge fills it from its own run, and the eval
runner persists it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The LLM judge result cell opens the saved judge trace from a "Judge trace"
link. Runs saved before judge_trace existed keep the "View reasoning" link
over intermediate_outputs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…iption

The default V2 LLM-judge prompt baked the task's instruction into a
<task_description> block, which goes stale as soon as a run config's prompt
differs. It now opens with a short intro and shows the full trace
(<trace>{{ trace | format_trace }}</trace>) for both single- and multi-turn
tasks; the trace already carries the system message actually used.

Eval steps are worded by the task's turn mode, since "the model's output" is
ambiguous over a whole trace: single-turn steps say "the model's response";
multi-turn per-response criteria say "any of the model's responses", and
desired behaviour is judged "across the conversation".

Judge templates can also bind {{ system_prompt }}, the first system message
in the trace, for hand-written final_message templates.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The default judge now reads only the formatted trace, so a message whose
content is a list of parts (seeded or multimodal) must keep its text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
OpenAI's Responses API (used for OpenAI models on OpenRouter, and by
LiteLLM for Responses-only OpenAI models) treats a function tool as
strict unless the request says otherwise. Strict mode makes every
property required, so models invented values for optional tool
arguments.

LiteLlmAdapter.litellm_tools() now returns copies of each user tool
definition (MCP, Kiln task, built-in, skill and unmanaged tools) with
"strict": false added when the tool does not set strict itself. The
tool's own definition is not mutated. ToolFunction gains an optional
strict key. The task_response structured-output tool and the
json_schema response_format are unchanged.

LiteLLM drops the key for Anthropic, Gemini/Vertex and Fireworks, and
Bedrock Converse only forwards strict when true; other providers
receive it as-is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YFynGt6LHLUAJbdyxfWoMb
Bumps [mcp](https://github.com/modelcontextprotocol/python-sdk) from 1.10.1 to 1.30.0.
- [Release notes](https://github.com/modelcontextprotocol/python-sdk/releases)
- [Changelog](https://github.com/modelcontextprotocol/python-sdk/blob/main/RELEASE.md)
- [Commits](modelcontextprotocol/python-sdk@v1.10.1...v1.30.0)

---
updated-dependencies:
- dependency-name: mcp
  dependency-version: 1.30.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Many tags on an eval made the right column grow to fit them on one line,
which squeezed the issue description. The column now uses the same width
as the eval run page and the Run page, and the tags wrap inside it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The eval results list no longer carries each run's judge_trace. It gets a
has_judge_trace flag, and a new GET .../eval_config/{eval_config_id}/
eval_run/{eval_run_id}/judge_trace endpoint returns one run's trace. The
results page fetches it only when "Judge trace" is clicked, and the dialog
opens extra-wide with every message collapsed, plus loading and error
states. The test-judge endpoints now return judge_trace, and the Test
Judge pane shows it through the same JudgeTraceLink component.

EvalRun and V2EvalResult materialize list-valued message content in
judge_trace, so multi-part judge prompts survive saving and copying. The
EvalRun docs say why judge_trace may sit next to scored_run_id, and both
field descriptions now match.

Adds datamodel, G-Eval, API and web tests for the above.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The GET .../eval_config/{eval_config_id}/eval_run/{eval_run_id}/judge_trace
endpoint is read-only and declares ALLOW_AGENT, like the neighbouring
results endpoint. Its checked-in annotation lets the API bindings check
pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
KIL-850 feat: save and show the judge trace on eval runs
KIL-848 Fix: keep the eval page right column at the side-column width
Drops the spec-rename score-instruction regeneration (out of scope for the
display-name approach) in favor of main's eval sync logic.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…field

- eval_scores returns score_display_names ({json_key: display name}) per eval,
  so the task-level Compare page labels (table and charts) show the display
  name instead of a prettified JSON key.
- Spec page score field: custom required-validator and clearer description.
- EditDialog passes an optional per-field validator through to FormElement.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…anges

The dev server watched every *.py file under .venv, because uvicorn's
default ".*" exclude matches file names only. A uv sync that reinstalls a
package rewrites thousands of files and set off a long run of restarts.

dev_server.py now passes the repo's .venv and .worktrees folders to
uvicorn.run as reload_excludes. A new reload_excludes() in
app/desktop/dev_reload.py builds that list. It lives in its own module
because importing dev_server.py sets the dev env vars, which tests can't
afford.

The paths are absolute because uvicorn 0.32 skips a folder only when it's
given as an absolute path. Only folders that exist are listed: for an
absolute exclude that doesn't exist, uvicorn calls Path.cwd().glob(path)
and fails to start with "Non-relative patterns are unsupported". A
.worktrees folder created after startup is ignored only after a restart.

The generated studio_server api_client stays watched: the server imports
it, so a change there should reload.

Tests cover the folder list for each mix of existing folders, the
uvicorn.run options, and the real uvicorn.Config plus FileFilter: a missing
.worktrees doesn't crash, a .py file under .venv is ignored, and an app
file is still watched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YTPsBVoSnWwfpGnkzqkid8
- Run result page: V2 result renderers label scores by display name.
- Escape labels in the compare chart tooltips (display names are free text).
- Display-name rules live on the model: strip, blank or equal-to-name clears,
  unique across scores; Eval.set_output_score_display_names validates before
  assigning and respects readonly.
- PATCH output_score_display_names is now a {json_key: name | null} map with
  partial updates; eval_scores score_display_names is required.
- Spec page field is optional with the score name as placeholder, keeps the
  built-in max-length check, and only sends changed names.
- EditDialog custom setters receive all their field values and run before
  the main PATCH.
- Rating sidebar and agent overview carry the display name.
- Tests for model rules, rejected requests saving nothing, setter ordering,
  and the new formatters.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Drop the separate dev_reload.py module and the startup-table note in the
conventions skill. The tests now check the excludes dev_server.py passes to
uvicorn.run, and that uvicorn accepts them and skips those folders.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YTPsBVoSnWwfpGnkzqkid8
Users only see score names once they compare run configs, so the rename
control lives there: a pencil after each score name opens a small dialog
(pre-filled, required) that PATCHes the eval's display names. Labels update
in place without refetching.

Drops the spec-page Edit dialog field and the EditDialog custom_setter
mechanism it needed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The trace intro is picked by turn mode and kept short: the formatted trace
labels its own blocks. kiln_requirements and rag steps no longer say "the
model's output"; multiturn issue examples are compared per response; the
jailbreak steps drop "ever"; the safety line says "tag" when there is one.

The tool-call step inlines the template's tool-use guidelines instead of
pointing at tags the prompt never contained.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Single-turn CSV imports and runs from before traces were recorded have no
trace, so the trace-based default judge skipped every one of them, which
broke calibration on imported golden sets. The LLM judge now builds a
minimal user/assistant trace for its template when a run has none. Only the
judge sees it: step-count, tool-call and code checks still skip.

The two-message builder moves out of the MCP adapter into
utils/open_ai_types.single_turn_trace so both share it.

The trace formatter keeps a placeholder for image, audio and file parts,
and unwraps Kiln tool output from list content as it does from strings.
system_prompt_from_trace moves onto EvalTraceFormatter, and the UI says
{{ system_prompt }} is the evaluated model's prompt, not the judge's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Rename dialog ignores a load from an earlier opening that finishes last.
- Rating options merged across evals take the first display name set.
- Tests: create_evaluator rejects duplicate display names with 422.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix: send strict false on user tool definitions
leonardmq and others added 2 commits October 27, 2026 22:46
Main added drive-only eval jobs: TraceIndex.create, which always
generates, and a seed that keeps the newest trace of each key. This
branch shares the trace index between runners through
TraceIndexRegistry.

- trace_index.py: a seed keeps the newest trace of each key, then merges
  it into the shared view. A shared entry the seed read gives way to a
  newer trace, as in a new index. An entry filed after the read, by a job
  that generated it, stays while its file exists. create and
  get_or_create record through the shared paths lock.
- eval_runner.py: main's _trace helper picks create or get_or_create; it
  gets the index through this branch's awaited _trace_index. The
  constructor takes both judge and trace_index_registry.
- jobs/workers/eval.py: the runner gets both judge and the registry.
- test_trace_index.py: a joining index now takes a newer trace from disk,
  and keeps a trace filed after its read.
chiang-daniel and others added 17 commits October 27, 2026 09:26
…_ui/undici-7.30.1

chore(deps): bump undici from 7.30.0 to 7.30.1 in /app/web_ui
docs: fix CONTRIBUTING links after the move to .github
perf: speed up eval job requests on large tasks
Ternary Bonsai 2 9B on OpenRouter and Ultramarine 1 Flash on Fireworks AI,
each as the first model of a new family. No suggested flags.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DZFkYMnP485oCL4ejxqmcU
chore: add Minimax M3.1 Flash and Mercury 3 to model list
…0-27

chore: mark Arcee Trinity Large (Thinking) on OpenRouter deprecated in model list
…e-spec-names

fix: stop two evals with the same name from sharing datasets
…1-flash-fireworks-2026-10-23

chore: add Fireworks provider to Minimax M3.1 Flash
…-2026-10-26

Picks up the Playwright runner fix (ubuntu-24.04).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CpSFojqCaPsVqdj8f77kdp
Picks up the Playwright runner fix (ubuntu-24.04).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CpSFojqCaPsVqdj8f77kdp
Keeps Mercury 3 from main and adds Ternary Bonsai 2 9B and Ultramarine 1
Flash after it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DZFkYMnP485oCL4ejxqmcU
…ra-2026-10-27

chore: add GPT-6.1 Terra and GPT-6.1 Terra Pro to model list
chore: add Kimi K3.1 Pro to model list (openrouter)
…-flash-together-2026-10-26

chore: mark DeepSeek V4 Flash 0731 on Together AI deprecated
@tawnymanticore tawnymanticore changed the title chore: update remote config (DeepSeek V4.1 Flash backfills) chore: update remote config (GPT-6.1 Terra, Kimi K3.1 Pro, Minimax M3.1 Flash, Mercury 3, thinking levels) Oct 28, 2026
tawnymanticore and others added 3 commits October 28, 2026 18:35
chore: add Ternary Bonsai 2 9B and Ultramarine 1 Flash to model list
…ated

OpenRouter no longer serves openai/o4-mini, openai/o4-mini-high or
qwen/qwen3-next-80b-a3b-thinking; the plaintext smoke test returns 404
not-found for all three.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DZFkYLn5RfNhKdvTbtxgPy
…0-29

chore: mark o4 Mini and Qwen 3 Next 80B Thinking on OpenRouter deprecated
@tawnymanticore
tawnymanticore merged commit f90b000 into remote_config Nov 2, 2026
29 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants