Skip to content

Looper v2.14.173

Choose a tag to compare

@github-actions github-actions released this 13 Nov 04:15
· 132 commits to main since this release
407f739

Looper v2.14.173

This is the patch release v2.14.173, a hotfix line in which each merged change ships at once. It documents one change: #1312 (model names may carry one bracketed parameter list).

Release Decision

Who should upgrade: Installations that want a model name with parameters, such as Cursor's grok-4.7[context=500k,reasoning_effort=high,fast=true], in the model catalog or an Agent Profile. Others need not upgrade for behavior, but see the narrowing below.

What this release solves: #1312 makes one shared rule decide what a model name is, and the rule accepts one trailing bracket list of key=value items. The complete name reaches the runtime as one command-line argument.

Breaking changes: No. Saved data keeps working, but new input is checked by a narrower rule (see Behavior changes). Names accepted before the release by the old rule but refused now are: brackets in the middle of a name, more than one bracket group, and surrounding whitespace. Saved rows are not rewritten or rejected. The bridge boundary is unchanged: upgrade to v2.13.165 first if the installation is older.

How to verify: Check the installed version.

looper --version   # looper 2.14.173

Contributors: Maintainer @foolzzz authored #1312; no community contribution was included in this release.

Upgrading

The bridge boundary is unchanged: an installation older than v2.13.165 must upgrade to v2.13.165 first (upgrade to v2.13.165 first) and be started once; see the Upgrading section of the v2.14.0 release for the steps and rollback. An installation on v2.14.0 to v2.14.172 upgrades directly. The first start replaces the checks on llm_models.name and llm_models.background_model with the new grammar (looper/db/connection.py, recorded as the migration model_name_parameters). The new checks are added NOT VALID, so rows that the old rule accepted stay; a check is validated at once when every row fits, and a fresh database has it validated from the start. New inserts and updates always enforce the new grammar.

Behavior changes

Read in the code of #1312:

  • One shared grammar (looper/agents/model_names.py, looper/agents/agent_settings.py). A name is a base id (a letter or digit first, then letters, digits, ., _, :, /, -), optionally followed by one bracket group: either a legacy token such as [1m], or comma-separated key=value items whose keys and values use letters, digits, ., _ and -. The limit is 200 characters. The settings validator and the SQL checks use the same pattern, which also requires the true end of input, so a trailing newline is refused.
  • Narrower than the old rule. The old rule allowed [ and ] anywhere after the first character and trimmed surrounding whitespace. model_name now takes the string exactly: a name with whitespace around it, a bracket inside the base id, or two bracket groups is refused. An empty string for a profile's model is now refused as "not a model name" (it was "an Agent Profile needs a model" before); an empty background_model still means none.
  • Parameter lists are identities. parse_model_name splits only a legacy context suffix; a name with a key=value list stays whole and is never split into a base and a suffix. opus[1m] keeps working as before. Cursor runs use temporary configuration directories, so saved Cursor modelParameters are not loaded; put the parameters in the name instead.
  • Database (looper/db/schema.sql, looper/db/connection.py). See Upgrading. schema_change_pending reports the migration as pending until it is recorded.
  • API and schemas (looper/agents/v1_domains/models.py, looper/agents/v1_domains/registry.py). The v1 model entries and the model result's name use the shared pattern and length limit.
  • Docs (docs/architecture/agent-system.md) describe the rule.
  • Model-visible changes: The Manager's model tools (looper/agents/ops/config.py) declare name (create), the name inside a model reference, and background_model with the shared pattern and a 200-character limit instead of a bare string; a name with a parameter list is now accepted there. Prompts are otherwise unchanged.

Optional Capability Activation & Use

No new optional capability activation is introduced in this release.

Validation

Reported by the pull request: #1312 reports the tests that cover the change (tests/test_agent_settings.py, tests/test_api_v1_models.py, tests/test_api_v1_models_db.py, tests/test_cursor_agent.py, tests/test_llm_model_schema_db.py, tests/test_model_listing.py, tests/test_model_names.py), automated reviews, and CI before the merge. It does not report a local full suite or the result of the reviews.

CI: CI runs after the release is drafted; its result is not recorded here.

Not tested for this draft: a local full suite, a real Cursor run with a parameter list and the built wheel. The release documentation gate checks the body only.

中文摘要

本版本是 patch release v2.14.173(热修线,每个合并的改动立即发布),说明一项改动:#1312(模型名可带一个方括号参数列表)。

升级决策

**谁需要升级:**希望在模型目录或 Agent Profile 中使用带参数的模型名(如 Cursor 的 grok-4.7[context=500k,reasoning_effort=high,fast=true])的安装。其他安装没有行为上的升级需求,但请留意下文的收窄。

解决了什么:#1312 由同一条规则判定什么是模型名,该规则接受末尾一个由 key=value 组成的方括号列表。完整名称作为一个命令行参数交给运行时。

**是否有破坏性变更:**无。已保存的数据照常可用,但新输入由更窄的规则检查(见行为变化)。旧规则接受、现在拒绝的是:名称中间的方括号、多于一组方括号、以及首尾空白。已保存的行不会被改写或拒绝。桥接边界不变:早于 v2.13.165 的安装须先升级到 v2.13.165。

**如何验证:**核对版本为 2.14.173。

**贡献者:**维护者 @foolzzz 提交 #1312;本版本无社区贡献。

looper --version   # looper 2.14.173

升级

桥接边界不变:早于 v2.13.165 的安装必须先升级到 v2.13.165 并启动一次(upgrade to v2.13.165 first 即先升级到 v2.13.165),步骤与回退见 v2.14.0 发布说明的升级一节。v2.14.0 至 v2.14.172 上的安装可直接升级。首次启动会把 llm_models.name 和 llm_models.background_model 的检查约束替换为新规则(looper/db/connection.py,迁移名 model_name_parameters)。新约束以 NOT VALID 添加,旧规则接受的已有行得以保留;所有行都符合时立即校验,全新数据库从一开始就是已校验的。之后的插入和更新始终执行新规则。

行为变化与入口

以下在 #1312 的代码中可见:

  • 统一的语法(looper/agents/model_names.py、looper/agents/agent_settings.py)。名称由基础 id(首字符为字母或数字,其后为字母、数字、.、_、:、/、-)加可选的一组方括号构成:要么是 [1m] 这样的旧式标记,要么是以逗号分隔的 key=value 项,键和值只用字母、数字、.、_、-。长度上限 200 字符。设置校验与 SQL 约束使用同一个模式,并要求真正的输入结尾,因此末尾换行会被拒绝。
  • **比旧规则更窄。**旧规则允许首字符之后任意位置出现 [ 和 ],并会去掉首尾空白。现在 model_name 原样接收字符串:首尾有空白、基础 id 内含方括号、或有两组方括号的名称会被拒绝。Profile 的模型为空字符串时,现在报「不是模型名」(原为「Agent Profile 需要模型」);空的 background_model 仍表示没有。
  • 参数列表即身份。parse_model_name 只拆分旧式上下文后缀;带 key=value 列表的名称保持完整,不会拆成基础名和后缀。opus[1m] 行为不变。Cursor 运行使用临时配置目录,因此不会加载已保存的 Cursor modelParameters;请把参数写进名称。
  • 数据库(looper/db/schema.sql、looper/db/connection.py)。见升级。迁移记录之前,schema_change_pending 报告其待执行。
  • API 与 schema(looper/agents/v1_domains/models.py、looper/agents/v1_domains/registry.py)。v1 的模型条目与模型结果中的 name 使用统一的模式和长度上限。
  • 文档(docs/architecture/agent-system.md)说明了该规则。
  • **面向模型的变化:**Manager 的模型工具(looper/agents/ops/config.py)的 name(创建)、模型引用中的 name 和 background_model 改为声明统一的模式和 200 字符上限,不再是裸字符串;带参数列表的名称现在被接受。提示词其余部分不变。

可选能力启用与使用

本版本未新增可选能力启用入口。

验证

PR 报告的:#1312 报告了覆盖该改动的测试(tests/test_agent_settings.py、tests/test_api_v1_models.py、tests/test_api_v1_models_db.py、tests/test_cursor_agent.py、tests/test_llm_model_schema_db.py、tests/test_model_listing.py、tests/test_model_names.py)、自动评审,以及合并前的 CI。未报告本地完整套件,也未报告评审结果。

**CI:**发布草稿后 CI 会运行,其结果未在此记录。

**本次草稿未测试:**本地完整套件、带参数列表的真实 Cursor 运行以及构建出的 wheel。发布文档 gate 只检查正文。