Releases: Seller-1990/octopus
Releases · Seller-1990/octopus
Release list
v1.5.0
Full Changelog: v1.4.3...v1.5.0
v1.4.3
Octopus v1.4.3 Release Notes
English first, 中文见下方. — v1.4.2 → v1.4.3.
🐛 Fixes
- Model capability badges now populate: the models.dev fetch (capability + price index) previously forced a proxy — environments without
proxy_urlconfig (where direct connection works) failed with "proxy url is empty", leaving capability badges permanently empty. Now it uses the proxy only when configured, otherwise falls back to direct. (Also fixes NAS where direct times out but proxy reaches models.dev.) - Migration 027 no longer freezes multimodal correction: rows with only a reasoning-suffix name (e.g.
gemini-2.5-flash-thinking) were writtenvision_capable=false, blocking models.dev from later correcting the multimodal bit (migration only writestrue, neverfalse). make buildnow injects the backend version (was hard-coded default, causing frontend/backend version mismatch and a spurious "cache mismatch" banner).- One-click update over flaky proxies (from v1.4.2, kept): release download uses HTTP/1.1; version check keeps HTTP/2.
✨ Features
- Inline API key toggles on the card: enable/disable and tools-only switches directly on each key card (no need to open the edit dialog). Backend preserves the API secret and quota state on partial updates.
🧹 Housekeeping
- (records)
🐙 v1.4.3 发布说明(中文)
自 v1.4.2 起。English above.
🐛 修复
- 模型能力徽标现在能正常填充:models.dev 拉取(能力 + 价格索引)此前强制走代理——未配置
proxy_url的环境(直连可用)会报 "proxy url is empty" 失败,能力徽标永久为空。现改为:配置了代理才走代理,否则回退直连。(同时修复 NAS 直连超时但代理可达的场景。) - 迁移 027 不再冻结多模态纠错:仅名字含推理后缀的行(如
gemini-2.5-flash-thinking)此前被写入vision_capable=false,阻塞 models.dev 后续纠正多模态位(迁移只写true、从不写false)。 make build现在注入后端版本(此前停在硬编码默认值,导致前后端版本不一致与误报「缓存不一致」横幅)。- 一键更新经不稳定代理(自 v1.4.2 保留):release 下载用 HTTP/1.1;版本检查保留 HTTP/2。
✨ 新功能
- API Key 卡片内联开关:每个 Key 卡片直接可切换启用/禁用与仅 tools(无需进编辑弹窗)。后端在部分更新时保留密钥与配额状态。
🧹 维护
- (记录)
v1.4.2
Octopus v1.4.2 Release Notes
English first, 中文见下方. — v1.4.1 → v1.4.2, 2 commits.
🐛 Fixes
- One-click update now survives flaky proxies: the release-binary download (60MB+) previously negotiated HTTP/2; when routed through a proxy (e.g. clash on NAS), the multiplexed stream could be interrupted (
PROTOCOL_ERROR/SSL_ERROR_SYSCALL), making the one-click update hang for ~20 minutes and fail. The download now uses a dedicated HTTP/1.1 client (HTTP/2 disabled), honoring the system proxy (http/socks). Other API calls keep HTTP/2 unchanged.
🧹 Housekeeping
- Task-plan records for capability badges v2 and anyrouter research.
🐙 v1.4.2 发布说明(中文)
自 v1.4.1 起,2 个提交。English above.
🐛 修复
- 一键更新不再被不稳定代理打断:release 二进制下载(60MB+)此前协商 HTTP/2;经代理(如 NAS 上的 clash)路由时,多路复用流可能中断(
PROTOCOL_ERROR/SSL_ERROR_SYSCALL),导致一键更新挂起约 20 分钟并失败。现在下载改用专用 HTTP/1.1 客户端(禁用 HTTP/2),并沿用系统代理(http/socks)。其他 API 调用仍保持 HTTP/2 不变。
🧹 维护
- task_plan 记录能力徽标 v2 方案与 anyrouter 调研。
v1.4.1
Octopus v1.4.1 Release Notes
English first, 中文见下方. — v1.4.0 → v1.4.1, 4 commits.
🐛 Fixes
- Site sync UNIQUE constraint failure (2067):
rewriteManagedGroupItemsForAccountpreviously did a bareUPDATE channel_idper row; when the same(group_id, model_name)legitimately spans multiple split-route channels and rows were redirected to the same target channel that already held the tuple, the update collided with theidx_group_channel_modelunique index — causing sync to fail withUNIQUE constraint failedand failed accounts to re-collide on every retry. Now: delete stale rows before moving, check target occupancy by the exact index triple(group_id, target_channel_id, model_name), and wrap in a transaction covering residual state and same-batch collisions.
✨ Features
- Model capability badges: canonical models (and groups/discovered models) now carry a capability bitmap from models.dev — multimodal (image/video input), reasoning, voice (input/output), image generation, video generation. Shown as read-only badges on model catalog cards, discovery rows, and group card names. Tools capability stays instance-level (
supports_tools), not from models.dev. - Makefile build wrapper:
make build/make deployforce the order frontend build → syncstatic/out→ Go build, so binaries always embed the fresh frontend (prevents stale-UI after frontend changes).
🧹 Housekeeping
- Review reports archived to
docs/reviews/; removed obsolete one-off docs.
🐙 v1.4.1 发布说明(中文)
自 v1.4.0 起,4 个提交。English above.
🐛 修复
- 站点同步 UNIQUE 约束冲突(2067):
rewriteManagedGroupItemsForAccount原先对 group_items 逐条裸UPDATE channel_id;当同一(group_id, model_name)合法分布在多个拆分路由渠道、且条目被重定向到已持有该组合的目标渠道时,更新撞idx_group_channel_model唯一索引——导致同步报UNIQUE constraint failed,失败账号每次重试都复现。现已改为:先删过期条目再搬运、按索引三元组(group_id, target_channel_id, model_name)检查目标占用、并包进事务(覆盖残留态与同批互相撞)。
✨ 新功能
- 模型能力徽标:CanonicalModel(以及分组/发现模型)新增 models.dev 能力位图——多模态(图像/视频输入)、推理、语音(输入/输出)、生图、视频生成。以只读徽标展示在模型目录卡片、模型发现行、分组卡片名称后。工具调用能力保持实例级(
supports_tools),不来自 models.dev。 - Makefile 构建封装:
make build/make deploy强制按序执行前端构建 → 同步static/out→ Go 编译,保证二进制始终内嵌最新前端(防止前端改动后 UI 陈旧)。
🧹 维护
- 审查报告归档至
docs/reviews/;清理过时的一次性文档。
v1.4.0
Octopus v1.4.0 Release Notes
English first, 中文见下方. — v1.3.5 → v1.4.0, 12 commits.
✨ Features
- Two-state multiplier cap policy: the default multiplier cap now only blocks entries with a confirmed (known=true) group multiplier exceeding the cap; tentative/unknown multipliers pass through (previously a conservative default could over-block). Multiplier provenance (known/unknown) is tracked across all write paths and shown in the UI as a "tentative" badge.
- Channel×model tools capability detection:
- Five-state discrimination matrix (accepted / executed / required-unsupported / unsupported / pending) with per-protocol tool-call detection (OpenAI chat, Anthropic, Gemini, OpenAI Responses).
- Key-level "tools-only" routing: API keys can opt to only route through channels confirmed tools-capable; confirmed-unsupported channels are skipped.
- Evidence-hierarchy writes (manual probe > T9 real failures ≥2 > weak 2xx), admin force-unsupported / restore endpoints, async batch probe with task polling, and editor-level probe with local result write-back.
- Circuit breaker management UI: new "Circuit" page listing breaker state (channel/key/model, state, failures, trip count, cooldown) with single-item / per-channel / reset-all actions; snapshot now lazily prunes idle entries and exports structured state.
- models.dev vision capability prefill: multimodal (image/video input) marking on canonical models from models.dev
modalities.input, with model-name suffix fallback (5v/vision/-vl); shown as a read-only badge on model cards. - LLM price update timeout: 30s fallback when the update context has no deadline, so a hung models.dev fetch no longer permanently stalls subsequent price updates.
🐛 Fixes
- T9 feedback 5xx misjudgment: real-request failure feedback now only judges on 4xx (5xx gateway faults and 429/408 throttling excluded), so a 502 wrapping an upstream error no longer flips a healthy channel to tools-unsupported.
- NULL-source guard fix: old databases whose
supports_tools_sourceis NULL were silently excluded by SQL guards; now COALESCE-empty-safe across all write paths. - Evidence hierarchy corrections (post-review R1–R11): executed (manual probe) is overridable by ≥2 real failures (only admin
manual-forceis permanent); preset rebuild inherits all tools metadata; structured JSON parsing replaces string-scanning for tool-call detection. - Bootstrap credential hardening (F01): removed the fixed
admin/admin— first boot now requires an explicitOCTOPUS_BOOTSTRAP_PASSWORD(min 6 chars), otherwise startup refuses; default listen host is now127.0.0.1(bare-metal), with Docker compose pinning container0.0.0.0+ loopback port mapping; password is never written to logs or the default config file. - Sync projection failure state (F08): if managed-channel projection fails after a successful snapshot persist, the account status is corrected from
successtofailedand projection is marked stale (no more "sync succeeded" while routes stay stale). - Restore transient discard (F07): WebDAV/upload restore discards in-process pending relay-log/usage state before import (with parse-validation guard and an in-flight flush barrier), preventing post-snapshot events from being replayed into the restored database.
- Frontend: double-click no longer starts duplicate paid batch probes; batch polling failures surface a toast; tools-only filter is rendered independently of vendor-chip count; touch devices can reach row-level tools actions.
🧹 Docs & Housekeeping
- Review reports archived to
docs/reviews/; removed 10 one-off planning/handoff documents and orphan resources. - Multi-round adversarial review incorporated for the tools pipeline (4 P0, 12 P1, 9 P2 fixed across review rounds).
🐙 v1.4.0 发布说明(中文)
自 v1.3.5 起,12 个提交。English above.
✨ 新功能
- 两态倍率上限策略:默认倍率上限只拦截「已确认(known=true)且超限」的分组倍率;暂定/未知倍率放行(原先保守默认可能过度拦截)。倍率溯源(known/unknown)贯穿所有写路径,UI 以「暂定」徽标展示。
- 渠道×模型 tools 能力探测:
- 五态判别矩阵(accepted / executed / required-unsupported / unsupported / pending),按协议检测工具调用(OpenAI chat、Anthropic、Gemini、OpenAI Responses)。
- Key 级**「仅 tools」路由**:API Key 可只路由到已确认支持 tools 的渠道,确认不支持的渠道被跳过。
- 证据层级写库(手动探测 > T9 真实失败 ≥2 > 弱 2xx)、管理员强制标不支持 / 恢复端点、异步批量探测 + 任务轮询、编辑器内探测与本地结果回写。
- 熔断管理界面:新增「熔断」页面,展示熔断状态(渠道/key/模型、状态、连续失败、熔断次数、剩余冷却),支持单条 / 按渠道 / 全部重置;快照惰性清理闲置条目并导出结构化状态。
- models.dev 视觉能力预填:基于 models.dev
modalities.input给模型入口标注多模态(图像/视频输入),模型名后缀(5v/vision/-vl)兜底;模型卡片只读徽标展示。 - LLM 价格更新超时:更新上下文无 deadline 时 30s 兜底——models.dev 挂起不再永久阻塞后续价格更新。
🐛 修复
- T9 反馈 5xx 误判:真实请求失败反馈仅在 4xx 判定(排除 5xx 网关故障与 429/408 限流)——502 包裹上游错误不再把健康渠道误标为不支持 tools。
- NULL 来源守卫修复:旧库
supports_tools_source为 NULL 的行曾被 SQL 守卫静默排除,现所有写路径均 COALESCE 空值安全。 - 证据层级修正(审查 R1–R11):executed(手动探测)可被 ≥2 次真实失败覆盖(仅管理员
manual-force永久);preset 重建继承全部 tools 元数据;工具调用检测改为结构化 JSON 解析(替代字符串扫描)。 - Bootstrap 凭据加固(F01):取消固定
admin/admin——首启必须显式设置OCTOPUS_BOOTSTRAP_PASSWORD(最少 6 位),否则拒绝启动;默认监听改为127.0.0.1(裸机),Docker compose 固定容器内0.0.0.0+ 回环端口映射;密码绝不写入日志或默认配置文件。 - 同步投影失败状态(F08):快照持久化成功后托管渠道投影失败时,账号状态从
success纠正为failed并标记投影 stale(不再出现「同步成功」而路由仍旧值)。 - 恢复时丢弃瞬态(F07):WebDAV/上传恢复在导入前丢弃进程内 pending 的 relay-log/用量状态(带解析校验保护与在途 flush 栅栏),防止备份时点之后的事件回灌进恢复后的数据库。
- 前端:双击不再重复启动付费批量探测;批量轮询失败弹出提示;「仅 tools」筛选独立于厂商标签数量渲染;触屏设备可触达行级 tools 操作。
🧹 文档与清理
- 审查报告归档至
docs/reviews/;删除 10 份一次性计划/交接文档与孤儿资源。 - tools 管线经多轮对抗审查(各轮修复 4 P0、12 P1、9 P2)。
v1.3.5
v1.3.5
- feat(sync): TLS fingerprint bypass for Cloudflare-protected sites (bogdanfinn/tls-client Chrome_146)
- feat(sync): auto-sort groups by strategy after site sync (complete closed-loop)
- feat(web): group health summary on site-channel cards (groups/keys at a glance)
- fix(sync): anyrouter routes fingerprinted sites through DoFingerprintedRequest
- fix(op): TLSFingerprint correctly propagated in SiteUpdate
- fix(sitesync): ProxyURLForConfig error properly handled in fingerprinted path
- fix(sitesync): dead fingerprint branch removed from siteHTTPClient
- New: SortGroupsByStrategy reusable function for post-sync sorting
- New: GroupIDsByChannelIDs / GroupItemDelByChannel helpers
- New: ResolveSystemProxyURL exported for fingerprint proxy resolution
Full Changelog: v1.3.4...v1.3.5
v1.3.4
v1.3.4
- fix(model): persist SortStrategy per-group with full preset lifecycle support
- fix(relay): Failover priority respected after protocol rank in CatalogPlanGroup
- fix(catalog): routeCandidateKey lowercase normalization fixes multiplier lookup mismatch
- fix(web): log page auto-sets today on mount; historical view disables SSE correctly
- fix(web): site filter uses OR logic for sync_failed + checkin status combined filters
- fix(web): failure sub-categories expansion gated by actual batch data availability
- fix(cache): GroupCreate uses ordered Preload for correct priority cache
- fix(update): sync.Mutex + atomic.Bool prevents concurrent update races
- fix(update): abort on backup failure; deferred rollback restores binary on write error
- fix(update): reject empty downloaded binary; container Remove failure is hard error
- fix(cookie): normalizeCookieValue applied in SiteAccountUpdate path
- fix(ci): remove setState-in-effect lint error; Failover sort passes all test assertions
v1.3.3
v1.3.3
- fix(model): add SortStrategy field to Group/GroupPreset with full preset lifecycle support
- fix(relay): CatalogPlanGroup respects Failover priority after protocol rank
- fix(catalog): routeCandidateKey normalizes model name to lowercase — fixes multiplier lookup
- fix(web): log page initializes date range to today on every mount
- fix(web): site failure sub-categories only expand when batch data is available
v1.3.2
v1.3.2
- fix(relay): apply-defaults now enforces sort strategy + multiplier cap on group items
- fix(relay): group cache preloads items with ORDER BY priority ASC for correct routing order
- fix(web): log detail SSE stream no longer disabled by date range filter
- fix(web): site sync/checkin failure filters separated into independent dimensions with toggle UX
v1.3.1
Bug Fixes
- 修复容器内一键更新 ETXTBSY 错误:更新时先解除旧二进制文件链接,避免 Linux 内核拒绝写入正在运行的可执行文件
- 修复裸机更新覆写失败:使用 Rename 替代 Copy,并解析符号链接路径
- 增加 HTTP 状态码检查:防止网络异常时将错误页面写入为二进制文件
- 下载超时延长至 10 分钟:适配 NAS 等慢速网络环境
Changes
internal/update/core.go: Container path usesos.Removebefore write; bare-metal path usesos.Rename+filepath.EvalSymlinksinternal/update/update.go: HTTP response status validation, timeout 5min → 10min
Full Changelog: v1.3.0...v1.3.1