@dan-ai-studio/dshopencodego 0.1.30 → 0.1.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -86,6 +86,10 @@ Configuration lives in the profile's `cordis.patch.yml`:
86
86
  baseURL: https://opencode.ai/inference/go/v1 # default (OpenCode Go endpoint, 37 subscription models)
87
87
  # or https://opencode.ai/inference/v1 (Console main endpoint, 86 pay-as-you-go/free models)
88
88
  refreshMinutes: 60 # live catalog TTL
89
+ streamIdleTimeoutMs: 300000 # stream idle timeout: longest silence between events (ms)
90
+ maxRequestImageBytes: 6291456 # whole-request image payload cap (after base64, bytes)
91
+ requestImagePixelBudget: 1440000 # total-pixel budget for one image
92
+ requestImageMaxBytes: 400000 # encoded-byte target for one image (before base64)
89
93
  modelVisibility: # per-model switches (deprecated default off)
90
94
  glm-5: true
91
95
  modelLimits: # per-model capacity overrides
@@ -102,6 +106,18 @@ Configuration lives in the profile's `cordis.patch.yml`:
102
106
 
103
107
  The API key comes from the Harness credential store (reference name `OPENCODE_GO_API_KEY`), or from `export OPENCODE_GO_API_KEY=...`.
104
108
 
109
+ **Stream timeout**: `streamIdleTimeoutMs` bounds the **longest silence between two stream events**, not the total request duration — a long-thinking model that keeps producing events is never cut off. Default 5 minutes; the ceiling is `2147483647` (about 24.8 days). Exceeding it raises `TIMEOUT`, which is retryable.
110
+
111
+ **Images**: three fields, one layer each. An image outside a bound is refused explicitly rather than silently downscaled or dropped:
112
+
113
+ | Field | What it bounds | Default |
114
+ | --- | --- | --- |
115
+ | `requestImageMaxBytes` | one image, encoded bytes **before** base64 | 400 KB |
116
+ | `requestImagePixelBudget` | one image's total pixels (width × height) | 1.44M pixels |
117
+ | `maxRequestImageBytes` | the **whole request's** image payload, **after** base64 | 6 MiB |
118
+
119
+ A model that does not accept image input is rejected before the request is sent (`UNSUPPORTED_CONTENT`), so nothing is uploaded only to be refused by the gateway.
120
+
105
121
  **Output cap**: a caller's own `maxTokens` travels as given, still clamped by a `modelLimits` ceiling. When a caller names none, the host materializes the route's ceiling — the catalog's output capacity, or whatever `modelLimits` overrode it with.
106
122
 
107
123
  **Tool declarations**: every request carries the complete current tool list. The session-folded history the host offers (`toolHistory`) is deliberately **not** projected: projecting it requires the route to declare a `toolUpdate` mode, and models.dev states no such mode for this gateway's models (only that tools are callable). Claiming one would silently change what the model sees.
package/README.md CHANGED
@@ -86,6 +86,10 @@ DSH 桌面端是 Electron 壳 + 完整的 dsh Web 应用,本插件对它同样
86
86
  baseURL: https://opencode.ai/inference/go/v1 # 默认值(OpenCode Go 端点,37 个订阅模型)
87
87
  # 也可指定为 https://opencode.ai/inference/v1(Console 主端点,包含 86 个按量/免费模型)
88
88
  refreshMinutes: 60 # 目录缓存时长
89
+ streamIdleTimeoutMs: 300000 # 流空闲超时:两次流事件之间的最长静默(毫秒)
90
+ maxRequestImageBytes: 6291456 # 整个请求的图片载荷上限(base64 之后,字节)
91
+ requestImagePixelBudget: 1440000 # 单张图的总像素预算
92
+ requestImageMaxBytes: 400000 # 单张图编码前的字节目标(base64 之前)
89
93
  modelVisibility: # 逐模型开关(弃用模型默认关闭)
90
94
  glm-5: true
91
95
  modelLimits: # 逐模型容量覆盖
@@ -102,6 +106,18 @@ DSH 桌面端是 Electron 壳 + 完整的 dsh Web 应用,本插件对它同样
102
106
 
103
107
  API Key 通过 Harness 凭证库提供(引用名 `OPENCODE_GO_API_KEY`),也可以直接 `export OPENCODE_GO_API_KEY=...`。
104
108
 
109
+ **流超时**:`streamIdleTimeoutMs` 约束的是**两次流事件之间的最长静默**,不是请求总时长——长思考模型只要持续产出事件就不会被误判。默认 5 分钟,上限为 `2147483647`(约 24.8 天)。超时抛出 `TIMEOUT`(可重试类)。
110
+
111
+ **图片**:三个字段各管一层,超限的图片会被明确拒绝,而不是静默降质或丢弃:
112
+
113
+ | 字段 | 约束对象 | 默认 |
114
+ | --- | --- | --- |
115
+ | `requestImageMaxBytes` | 单张图,base64 **之前**的字节目标 | 400 KB |
116
+ | `requestImagePixelBudget` | 单张图的总像素(按宽×高限制分辨率) | 144 万像素 |
117
+ | `maxRequestImageBytes` | **整个请求**里图片载荷的总字节(base64 **之后**) | 6 MiB |
118
+
119
+ 模型自身不支持图片输入时,适配器会在发请求前就拒绝(`UNSUPPORTED_CONTENT`),不会把图发出去再等网关报错。
120
+
105
121
  **输出上限**:调用方给了 `maxTokens` 就用它(仍受 `modelLimits` 的逐模型上限约束);没给时由宿主按路由上限物化——该上限就是目录里的输出容量,或 `modelLimits` 覆盖后的值。
106
122
 
107
123
  **工具声明**:每个请求都发送当前完整的工具列表。宿主提供的会话折叠历史(`toolHistory`)**故意不投影**:投影需要路由声明 `toolUpdate` 模式,而 models.dev 对本网关模型只声明"可调用工具"、没有声明该模式;凭空声明会让模型看到的东西悄悄改变。
package/lib/client.js CHANGED
@@ -562,7 +562,7 @@ if (!document.querySelector("style[data-plugin-css=" + JSON.stringify(id) + "]")
562
562
  style.textContent = ".d7lz0W_root{color:var(--dsw-alias-label-primary);flex-direction:column;gap:1.25rem;display:flex}.d7lz0W_title{margin:0;font-size:1.05rem}.d7lz0W_hint{color:var(--dsw-alias-label-secondary);margin:0;font-size:.8rem}.d7lz0W_warn{color:var(--dsw-alias-state-warn-primary);margin:0;font-size:.8rem}.d7lz0W_ok{color:var(--dsw-alias-state-success-primary);font-size:.8rem}.d7lz0W_block{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:.6rem;flex-direction:column;gap:.5rem;padding:.85rem;display:flex}.d7lz0W_row{flex-wrap:wrap;align-items:center;gap:.5rem;display:flex}.d7lz0W_row>strong{margin-right:auto}.d7lz0W_input{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);min-width:10rem;color:var(--dsw-alias-label-primary);font:inherit;border-radius:.35rem;flex:14rem;padding:.35rem .5rem;font-size:.85rem}.d7lz0W_button{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border-radius:.35rem;padding:.35rem .7rem;font-size:.8rem}.d7lz0W_button:disabled{color:var(--dsw-alias-state-idle-primary);cursor:default}.d7lz0W_number{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:5rem;color:var(--dsw-alias-label-primary);font:inherit;border-radius:.35rem;padding:.25rem .4rem;font-size:.8rem}.d7lz0W_select{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:auto;max-width:100%;color:var(--dsw-alias-label-primary);font:inherit;border-radius:.35rem;padding:.25rem .4rem;font-size:.8rem}.d7lz0W_list{flex-direction:column;display:flex}.d7lz0W_item{border-top:1px solid var(--dsw-alias-border-l1);align-items:flex-start;gap:.5rem;padding:.45rem .15rem;display:flex}.d7lz0W_item input[type=checkbox]{accent-color:var(--dsw-alias-brand-primary);margin-top:.15rem}.d7lz0W_itemBody{flex-direction:column;gap:.15rem;min-width:0;display:flex}.d7lz0W_itemMain{flex-wrap:wrap;align-items:baseline;gap:.6rem;display:flex}.d7lz0W_itemMeta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:.75rem;font-size:.75rem;display:flex}.d7lz0W_itemModalities{color:var(--dsw-alias-label-secondary);font-size:.75rem}.d7lz0W_name{color:var(--dsw-alias-label-primary)}.d7lz0W_mono{color:var(--dsw-alias-label-secondary);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.d7lz0W_badge{color:var(--dsw-alias-brand-primary)}";
563
563
  document.head.appendChild(style);
564
564
  }
565
- var section_default = { "name": "d7lz0W_name", "itemBody": "d7lz0W_itemBody", "itemMeta": "d7lz0W_itemMeta", "number": "d7lz0W_number", "block": "d7lz0W_block", "title": "d7lz0W_title", "root": "d7lz0W_root", "input": "d7lz0W_input", "button": "d7lz0W_button", "select": "d7lz0W_select", "ok": "d7lz0W_ok", "row": "d7lz0W_row", "mono": "d7lz0W_mono", "itemModalities": "d7lz0W_itemModalities", "badge": "d7lz0W_badge", "item": "d7lz0W_item", "list": "d7lz0W_list", "itemMain": "d7lz0W_itemMain", "hint": "d7lz0W_hint", "warn": "d7lz0W_warn" };
565
+ var section_default = { "itemModalities": "d7lz0W_itemModalities", "ok": "d7lz0W_ok", "select": "d7lz0W_select", "itemMeta": "d7lz0W_itemMeta", "title": "d7lz0W_title", "hint": "d7lz0W_hint", "root": "d7lz0W_root", "mono": "d7lz0W_mono", "input": "d7lz0W_input", "name": "d7lz0W_name", "number": "d7lz0W_number", "block": "d7lz0W_block", "itemBody": "d7lz0W_itemBody", "itemMain": "d7lz0W_itemMain", "badge": "d7lz0W_badge", "button": "d7lz0W_button", "row": "d7lz0W_row", "item": "d7lz0W_item", "list": "d7lz0W_list", "warn": "d7lz0W_warn" };
566
566
 
567
567
  // src/client/Section.tsx
568
568
  var import_jsx_runtime = require("react/jsx-runtime");
@@ -1335,7 +1335,7 @@ if (!document.querySelector("style[data-plugin-css=" + JSON.stringify(id2) + "]"
1335
1335
  style.textContent = ".mMNkkW_root{align-items:center;display:inline-flex;position:relative}.mMNkkW_trigger{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;white-space:nowrap;border-radius:999px;padding:.35rem .6rem;font-size:.8rem;line-height:1}.mMNkkW_trigger:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l2)}.mMNkkW_panel{z-index:20;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-overlay);width:18rem;color:var(--dsw-alias-label-primary);border-radius:.6rem;flex-direction:column;gap:.6rem;padding:.75rem .85rem;display:flex;position:absolute;bottom:calc(100% + .5rem);right:0;box-shadow:0 8px 24px #0000002e}.mMNkkW_window{flex-direction:column;gap:.25rem;display:flex}.mMNkkW_row{justify-content:space-between;gap:.5rem;font-size:.85rem;display:flex}.mMNkkW_hint{color:var(--dsw-alias-label-secondary);margin:0;font-size:.75rem}.mMNkkW_progress{width:100%;height:.35rem;accent-color:var(--dsw-alias-brand-primary)}.mMNkkW_limited{color:var(--dsw-alias-state-warn-primary);font-size:.75rem}.mMNkkW_warning{border:1px solid var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-label-primary);border-radius:.4rem;padding:.4rem .5rem;font-size:.75rem}.mMNkkW_retry{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border-radius:.35rem;align-self:flex-start;padding:.25rem .5rem;font-size:.75rem}.mMNkkW_local{border-top:1px solid var(--dsw-alias-border-l1);flex-direction:column;gap:.2rem;padding-top:.5rem;display:flex}";
1336
1336
  document.head.appendChild(style);
1337
1337
  }
1338
- var pill_default = { "warning": "mMNkkW_warning", "hint": "mMNkkW_hint", "limited": "mMNkkW_limited", "panel": "mMNkkW_panel", "row": "mMNkkW_row", "root": "mMNkkW_root", "progress": "mMNkkW_progress", "local": "mMNkkW_local", "window": "mMNkkW_window", "trigger": "mMNkkW_trigger", "retry": "mMNkkW_retry" };
1338
+ var pill_default = { "warning": "mMNkkW_warning", "progress": "mMNkkW_progress", "trigger": "mMNkkW_trigger", "panel": "mMNkkW_panel", "window": "mMNkkW_window", "retry": "mMNkkW_retry", "root": "mMNkkW_root", "limited": "mMNkkW_limited", "hint": "mMNkkW_hint", "row": "mMNkkW_row", "local": "mMNkkW_local" };
1339
1339
 
1340
1340
  // src/client/UsagePill.tsx
1341
1341
  var import_jsx_runtime2 = require("react/jsx-runtime");
package/lib/index.js CHANGED
@@ -2083,7 +2083,7 @@ function createUpdateChecker(deps) {
2083
2083
  }
2084
2084
 
2085
2085
  // src/update/version.ts
2086
- var PLUGIN_VERSION = true ? "0.1.30" : "0.0.0-dev";
2086
+ var PLUGIN_VERSION = true ? "0.1.32" : "0.0.0-dev";
2087
2087
 
2088
2088
  // src/update/service.ts
2089
2089
  import { TypertRemoteService as TypertRemoteService2 } from "@deepseek-ai/dsh-typert-protocol";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dan-ai-studio/dshopencodego",
3
- "version": "0.1.30",
3
+ "version": "0.1.32",
4
4
  "description": "OpenCode Go provider for DeepSeek Harness: live gateway catalog, per-conversation session header, usage",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -112,27 +112,27 @@
112
112
  },
113
113
  "devDependencies": {
114
114
  "@deepseek-ai/cordis": "4.0.5-alpha.2",
115
- "@deepseek-ai/dsh-api-remotes": "0.2.1-alpha.3",
116
- "@deepseek-ai/dsh-attachment": "0.2.1-alpha.3",
117
- "@deepseek-ai/dsh-brand": "0.2.1-alpha.3",
118
- "@deepseek-ai/dsh-client-locale": "0.2.1-alpha.3",
119
- "@deepseek-ai/dsh-client-store": "0.2.1-alpha.3",
120
- "@deepseek-ai/dsh-client-ui-conversation": "0.2.1-alpha.3",
121
- "@deepseek-ai/dsh-client-ui-model-selection": "0.2.1-alpha.3",
122
- "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-alpha.3",
123
- "@deepseek-ai/dsh-client-ui-settings": "0.2.1-alpha.3",
124
- "@deepseek-ai/dsh-client-ui-slots": "0.2.1-alpha.3",
125
- "@deepseek-ai/dsh-credentials": "0.2.1-alpha.3",
126
- "@deepseek-ai/dsh-fs": "0.2.1-alpha.3",
127
- "@deepseek-ai/dsh-launch-environment": "0.2.1-alpha.3",
128
- "@deepseek-ai/dsh-llm": "0.2.1-alpha.3",
129
- "@deepseek-ai/dsh-sandbox": "0.2.1-alpha.3",
130
- "@deepseek-ai/dsh-scope": "0.2.1-alpha.3",
131
- "@deepseek-ai/dsh-session": "0.2.1-alpha.3",
132
- "@deepseek-ai/dsh-settings": "0.2.1-alpha.3",
133
- "@deepseek-ai/dsh-timeout": "0.2.1-alpha.3",
134
- "@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.3",
135
- "@deepseek-ai/dsh-typert-registry": "0.2.1-alpha.3",
115
+ "@deepseek-ai/dsh-api-remotes": "0.2.1-alpha.4",
116
+ "@deepseek-ai/dsh-attachment": "0.2.1-alpha.4",
117
+ "@deepseek-ai/dsh-brand": "0.2.1-alpha.4",
118
+ "@deepseek-ai/dsh-client-locale": "0.2.1-alpha.4",
119
+ "@deepseek-ai/dsh-client-store": "0.2.1-alpha.4",
120
+ "@deepseek-ai/dsh-client-ui-conversation": "0.2.1-alpha.4",
121
+ "@deepseek-ai/dsh-client-ui-model-selection": "0.2.1-alpha.4",
122
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-alpha.4",
123
+ "@deepseek-ai/dsh-client-ui-settings": "0.2.1-alpha.4",
124
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.1-alpha.4",
125
+ "@deepseek-ai/dsh-credentials": "0.2.1-alpha.4",
126
+ "@deepseek-ai/dsh-fs": "0.2.1-alpha.4",
127
+ "@deepseek-ai/dsh-launch-environment": "0.2.1-alpha.4",
128
+ "@deepseek-ai/dsh-llm": "0.2.1-alpha.4",
129
+ "@deepseek-ai/dsh-sandbox": "0.2.1-alpha.4",
130
+ "@deepseek-ai/dsh-scope": "0.2.1-alpha.4",
131
+ "@deepseek-ai/dsh-session": "0.2.1-alpha.4",
132
+ "@deepseek-ai/dsh-settings": "0.2.1-alpha.4",
133
+ "@deepseek-ai/dsh-timeout": "0.2.1-alpha.4",
134
+ "@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.4",
135
+ "@deepseek-ai/dsh-typert-registry": "0.2.1-alpha.4",
136
136
  "@testing-library/dom": "^10.4.1",
137
137
  "@testing-library/react": "^16.3.0",
138
138
  "@types/node": "^22.20.0",