dsh-openrouter-plus 0.1.0 → 0.1.1

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/CHANGELOG.md CHANGED
@@ -9,6 +9,16 @@ the config keys can still change.
9
9
 
10
10
  Nothing yet.
11
11
 
12
+ ## [0.1.1] — 2026-10-27
13
+
14
+ ### Changed
15
+
16
+ - The UI says **preset** everywhere. The recent-requests column header read `Tier`, the provider
17
+ row hint and the empty state said "service tier", and the Chinese strings said 服务等级; the
18
+ rename to presets had missed all five.
19
+ - README gains screenshots of the provider switch, both halves of the settings page, and the
20
+ composer chip — the four states worth seeing before installing.
21
+
12
22
  ## [0.1.0] — 2026-10-26
13
23
 
14
24
  First release: a loopback relay that applies an OpenRouter **routing preset** to a request at
package/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # dsh-openrouter-plus
2
2
 
3
+ [![npm](https://img.shields.io/npm/v/dsh-openrouter-plus.svg)](https://www.npmjs.com/package/dsh-openrouter-plus)
4
+ [![license](https://img.shields.io/npm/l/dsh-openrouter-plus.svg)](LICENSE)
5
+
3
6
  **Service-tier routing for OpenRouter — as a DeepSeek Harness plugin, with no patched packages.**
4
7
 
5
8
  OpenRouter lets you steer where a request is served from: `flex` endpoints bill half price on a
@@ -39,7 +42,7 @@ switching never mints a provider, a route or a model list.
39
42
  (`/auto/v1`, `/fast/v1`, `/scale/v1`); the settings page lists one mount per preset so it never
40
43
  offers the same choice twice.
41
44
  - **Its own settings page** (Settings → OpenRouter Plus) showing relay state, one pinned base URL
42
- per preset with a copy button, live request/token counters per tier, the weighted cost
45
+ per preset with a copy button, live request/token counters per preset, the measured effective
43
46
  multiplier, and recent requests.
44
47
  - **A preset chip in the composer** — next to the model selector, a compact chip shows the preset
45
48
  this Session will actually apply and switches it in one click. The switch is **per session**: it
@@ -59,6 +62,24 @@ switching never mints a provider, a route or a model list.
59
62
  header verbatim, binds only to loopback, and the only profile changes it makes are reversible by
60
63
  construction.
61
64
 
65
+ ## Screenshots
66
+
67
+ The switch lives on the provider you already use, in Settings → Models. Ticking it moves that
68
+ row's traffic onto the relay and changes nothing else:
69
+
70
+ ![Route through OpenRouter Plus ticked on a provider row](docs/images/models-route.jpg)
71
+
72
+ The settings page — relay state, one pinned base URL per preset, the counters, and what each
73
+ preset actually sends:
74
+
75
+ ![OpenRouter Plus settings: relay state, pinned base URLs, spend impact](docs/images/settings-overview.jpg)
76
+
77
+ ![OpenRouter Plus settings: preset catalogue, provider routes, recent requests](docs/images/settings-presets.jpg)
78
+
79
+ The composer chip, which switches the preset for one Session without touching any provider row:
80
+
81
+ ![Composer chip showing a per-session preset next to the model selector](docs/images/composer-chip.jpg)
82
+
62
83
  ## Install
63
84
 
64
85
  `--profile` is not optional — `dsh plugin` manages the plugins of one named profile, so pass the
@@ -66,8 +87,8 @@ one you actually boot (`web` for `dsh web`, `default` for a bare `dsh`). Without
66
87
  with `required option '--profile <name>' not specified`.
67
88
 
68
89
  ```bash
69
- dsh plugin --profile web add github:GnaneshKunal/dsh-openrouter-plus # latest main
70
- dsh plugin --profile web add github:GnaneshKunal/dsh-openrouter-plus#v0.1.0 # a tag, once tagged
90
+ dsh plugin --profile web add dsh-openrouter-plus # from npm
91
+ dsh plugin --profile web add github:GnaneshKunal/dsh-openrouter-plus#v0.1.0 # or a pinned tag
71
92
  ```
72
93
 
73
94
  From a clone, which is what development uses:
@@ -99,8 +120,8 @@ The job refuses a tag that disagrees with `package.json`, runs the suite, publis
99
120
  opens the GitHub Release with the matching `CHANGELOG.md` section as its notes. It fails rather
100
121
  than skipping when npm already has that version: a release is a new version, never a re-upload.
101
122
 
102
- npm needs the package to exist before it can trust a publisher, so the first version goes up by
103
- hand, once, from a logged-in machine:
123
+ npm needs the package to exist before it can trust a publisher, so `0.1.0` went up by hand, once,
124
+ from a logged-in machine:
104
125
 
105
126
  ```bash
106
127
  npm login
@@ -109,7 +130,7 @@ npm trust github dsh-openrouter-plus --file release.yml \
109
130
  --repo GnaneshKunal/dsh-openrouter-plus --env release --allow-publish
110
131
  ```
111
132
 
112
- After that the tag does everything: the workflow run's OIDC identity is accepted, npm attaches a
133
+ Every version after it is a tag, and nothing else. The tag does everything: the workflow run's OIDC identity is accepted, npm attaches a
113
134
  provenance attestation linking the tarball to the commit and run that built it, and no
114
135
  `NPM_TOKEN` exists in the repository. `npm trust list dsh-openrouter-plus` shows the grant.
115
136
 
package/client.js CHANGED
@@ -171,7 +171,7 @@ window.__ModuleLoader__.load({
171
171
 
172
172
  'providers.caption': 'Provider routes',
173
173
  'providers.explain':
174
- 'Tick \u201cRoute through OpenRouter Plus\u201d on a provider in Settings \u2192 Models, then pick the service tier in the composer. The provider keeps its models and key; only its base URL moves onto this relay.',
174
+ 'Tick \u201cRoute through OpenRouter Plus\u201d on a provider in Settings \u2192 Models, then pick a preset in the composer. The provider keeps its models and key; only its base URL moves onto this relay.',
175
175
  'providers.loading': 'Loading provider routes…',
176
176
  'providers.retry': 'Reload',
177
177
  'providers.unavailable': 'Route editing is unavailable: {reason}',
@@ -182,7 +182,7 @@ window.__ModuleLoader__.load({
182
182
  'providers.defaultTierHint': 'A session inherits this until it picks its own preset in the composer.',
183
183
  'providers.defaultTierAria': 'Preset for new sessions',
184
184
  'providers.presetCaption': 'What each preset sends',
185
- 'providers.noticeDefaultTier': 'Saved the service tier for new sessions.',
185
+ 'providers.noticeDefaultTier': 'Saved the preset for new sessions.',
186
186
  'providers.routeMeta': '{source} · {tier} · {count} models',
187
187
  'providers.routeBase': 'Base URL: {url}',
188
188
  'providers.remove': 'Remove',
@@ -208,7 +208,7 @@ window.__ModuleLoader__.load({
208
208
  'strip.applying': 'Routing\u2026',
209
209
  'strip.detaching': 'Restoring\u2026',
210
210
  'strip.tierHint': 'Presets only apply to endpoints that accept OpenAI-style routing fields (OpenRouter itself, and some compatible gateways).',
211
- 'strip.routedHint': 'Requests from this provider go through the relay. The service tier is chosen per session from the composer chip.',
211
+ 'strip.routedHint': 'Requests from this provider go through the relay. The preset is chosen per session from the composer chip.',
212
212
  'strip.stalled': 'The relay did not confirm the change; reopen this page to retry.',
213
213
 
214
214
  'preset.none': 'No pin',
@@ -237,7 +237,7 @@ window.__ModuleLoader__.load({
237
237
 
238
238
  'recent.caption': 'Recent requests',
239
239
  'recent.hint': 'Newest relayed requests first.',
240
- 'recent.column.tier': 'Tier',
240
+ 'recent.column.tier': 'Preset',
241
241
  'recent.column.model': 'Model',
242
242
  'recent.column.status': 'Status',
243
243
  'recent.column.ms': 'Duration',
@@ -305,7 +305,7 @@ window.__ModuleLoader__.load({
305
305
  'savings.note': '倍率为相对 token 价格。中继不知道各模型的实际价格,因此不显示金额。',
306
306
 
307
307
  'providers.caption': '提供商路由',
308
- 'providers.explain': '在设置 → 模型里勾选“经 OpenRouter Plus 转发”,再到编辑器中选择服务等级。提供商会保留自己的模型与密钥,只有基址切换到本中继。',
308
+ 'providers.explain': '在设置 → 模型里勾选“经 OpenRouter Plus 转发”,再到编辑器中选择预设。提供商会保留自己的模型与密钥,只有基址切换到本中继。',
309
309
  'providers.loading': '正在加载提供商路由…',
310
310
  'providers.retry': '重新加载',
311
311
  'providers.unavailable': '无法编辑路由:{reason}',
@@ -316,7 +316,7 @@ window.__ModuleLoader__.load({
316
316
  'providers.defaultTierHint': '会话会继承该设置,直到在输入框中选定自己的预设。',
317
317
  'providers.defaultTierAria': '新会话的预设',
318
318
  'providers.presetCaption': '各预设实际发送什么',
319
- 'providers.noticeDefaultTier': '已保存新会话的服务等级。',
319
+ 'providers.noticeDefaultTier': '已保存新会话的预设。',
320
320
  'providers.routeMeta': '{source} · {tier} · {count} 个模型',
321
321
  'providers.routeBase': '基址:{url}',
322
322
  'providers.remove': '移除',
@@ -338,11 +338,11 @@ window.__ModuleLoader__.load({
338
338
  'strip.groupAria': '{name} 的 OpenRouter Plus 转发',
339
339
  'strip.route': '通过 OpenRouter Plus 转发',
340
340
  'strip.routed': '已通过 OpenRouter Plus 转发',
341
- 'strip.tierAria': '{name} 的服务等级',
341
+ 'strip.tierAria': '{name} 的预设',
342
342
  'strip.applying': '正在转发\u2026',
343
343
  'strip.detaching': '正在恢复\u2026',
344
344
  'strip.tierHint': '预设只对接受 OpenAI 风格路由字段的端点生效(如 OpenRouter 本身及部分兼容网关)。',
345
- 'strip.routedHint': '该提供商已通过中继转发。服务等级在输入框的等级按钮里按会话选择。',
345
+ 'strip.routedHint': '该提供商已通过中继转发。预设在输入框的预设按钮里按会话选择。',
346
346
  'strip.stalled': '中继未确认本次修改;请重新打开此页面后重试。',
347
347
 
348
348
  'preset.none': '不固定',
@@ -371,7 +371,7 @@ window.__ModuleLoader__.load({
371
371
 
372
372
  'recent.caption': '最近请求',
373
373
  'recent.hint': '按时间倒序显示最近的中继请求。',
374
- 'recent.column.tier': '等级',
374
+ 'recent.column.tier': '预设',
375
375
  'recent.column.model': '模型',
376
376
  'recent.column.status': '状态',
377
377
  'recent.column.ms': '耗时',
Binary file
Binary file
Binary file
package/index.js CHANGED
@@ -96,7 +96,7 @@ const LEGACY_TIER_PRESET = Object.freeze({
96
96
  scale: 'none',
97
97
  })
98
98
 
99
- const VERSION = '0.1.0'
99
+ const VERSION = '0.1.1'
100
100
 
101
101
  /** Largest control-POST body we will read; these are tiny JSON documents. */
102
102
  const MAX_CONTROL_BODY = 64 * 1024
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-openrouter-plus",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "description": "OpenRouter routing presets for DeepSeek Harness \u2014 a loopback relay that applies a preset (service_tier, provider.sort or the :floor model variant) to each Session at request time, a live status API, and an OpenRouter Plus settings page that points one provider row at the relay and stores a default preset.",
6
6
  "keywords": [