dsh-plugin-effort-declare 0.1.4 → 0.1.5

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.
Files changed (38) hide show
  1. package/CONTRIBUTING.en.md +2 -1
  2. package/CONTRIBUTING.md +1 -0
  3. package/INSTALL.en.md +2 -2
  4. package/INSTALL.md +2 -2
  5. package/README.en.md +4 -2
  6. package/README.md +3 -1
  7. package/lib/client.js +30 -32
  8. package/lib/client.js.map +1 -1
  9. package/lib/types/client/EffortDeclareSection.d.ts +3 -2
  10. package/lib/types/client/EffortDeclareSection.d.ts.map +1 -1
  11. package/lib/types/client/index.d.ts +23 -2
  12. package/lib/types/client/index.d.ts.map +1 -1
  13. package/lib/types/client/load-drafts.d.ts +3 -3
  14. package/lib/types/client/load-drafts.d.ts.map +1 -1
  15. package/lib/types/client/remotes.d.ts +40 -0
  16. package/lib/types/client/remotes.d.ts.map +1 -0
  17. package/lib/types/core/catalog.d.ts +3 -3
  18. package/lib/types/core/catalog.d.ts.map +1 -1
  19. package/lib/types/core/drafts.d.ts +1 -1
  20. package/lib/types/core/drafts.d.ts.map +1 -1
  21. package/lib/types/core/filter.d.ts +1 -1
  22. package/lib/types/core/filter.d.ts.map +1 -1
  23. package/lib/types/core/path-ops.d.ts +1 -1
  24. package/lib/types/core/path-ops.d.ts.map +1 -1
  25. package/package.json +9 -12
  26. package/src/client/EffortDeclareSection.tsx +18 -20
  27. package/src/client/README.en.md +5 -4
  28. package/src/client/README.md +5 -4
  29. package/src/client/index.ts +35 -6
  30. package/src/client/load-drafts.ts +10 -10
  31. package/src/client/locales.ts +2 -2
  32. package/src/client/remotes.ts +39 -0
  33. package/src/core/README.en.md +2 -2
  34. package/src/core/README.md +2 -2
  35. package/src/core/catalog.ts +3 -2
  36. package/src/core/drafts.ts +1 -1
  37. package/src/core/filter.ts +1 -1
  38. package/src/core/path-ops.ts +1 -1
@@ -45,7 +45,8 @@ pnpm build
45
45
 
46
46
  - Host and client must use separate `tsconfig` files (their Context merges cannot share one TypeScript program)
47
47
  - The client bundle must not inline `@deepseek-ai/*` except platform modules in the shell’s frozen table. Collaborate through Cordis services; do not value-import the official Models page
48
- - Source: [src/README.md](./src/README.md); domain logic: [src/core/README.md](./src/core/README.md); settings UI: [src/client/README.md](./src/client/README.md); tests: [tests/README.md](./tests/README.md)
48
+ - Client calls go through `ctx.remote.llm` / `ctx.remote.settings` (`listConfigurableProviders`, `settings.mutate`). Do not use `connection.api`. `@deepseek-ai/dsh-client-runtime` is not published for 0.1.2-alpha.2; do not add it back as a peer or a `dsh.client.inject` entry
49
+ - Source: [src/README.en.md](./src/README.en.md); domain logic: [src/core/README.en.md](./src/core/README.en.md); settings UI: [src/client/README.en.md](./src/client/README.en.md); tests: [tests/README.en.md](./tests/README.en.md)
49
50
 
50
51
  Before sending a change, say whether it is a bug fix, a feature, or an alignment with a newer DSH / pi-ai schema. Update zh and en docs together. The root README and [INSTALL.en.md](./INSTALL.en.md) are for users; this file and the READMEs under `src/` and `tests/` are for people changing code.
51
52
 
package/CONTRIBUTING.md CHANGED
@@ -45,6 +45,7 @@ pnpm build
45
45
 
46
46
  - Host 与 client 必须分 `tsconfig`(两边 Context merge 不能共一个 TypeScript Program)
47
47
  - 客户端 bundle 禁止把 `@deepseek-ai/*` 打进包内(shell 冻结模块表里的平台模块除外)。跨插件协作走 Cordis 服务,不要 value-import 官方模型页
48
+ - 客户端经 `ctx.remote.llm` / `ctx.remote.settings` 调用(`listConfigurableProviders`、`settings.mutate`)。不要再用 `connection.api`。`@deepseek-ai/dsh-client-runtime` 在 0.1.2-alpha.2 未发布,不要加回 peer 或 `dsh.client.inject`
48
49
  - 源码:[src/README.md](./src/README.md);领域逻辑:[src/core/README.md](./src/core/README.md);设置页:[src/client/README.md](./src/client/README.md);测试:[tests/README.md](./tests/README.md)
49
50
 
50
51
  提交前请说明改动是缺陷修复、功能增强,还是对齐新的 DSH / pi-ai schema。中英文档一并更新。根 README 与 [INSTALL.md](./INSTALL.md) 面向使用者;本文件与 `src/`、`tests/` 下的 README 面向改代码的人。
package/INSTALL.en.md CHANGED
@@ -7,7 +7,7 @@
7
7
  </samp>
8
8
  </p>
9
9
 
10
- Back to the [README](./README.en.md). Requires DeepSeek Harness **0.1.0-rc.8** or later. Do not use `npm install`; use `dsh plugin` below.
10
+ Back to the [README](./README.en.md). Requires DeepSeek Harness **0.1.2-alpha.2**. Earlier client APIs, including 0.1.0-rc.8, are not supported. Do not use `npm install`; use `dsh plugin` below.
11
11
 
12
12
  ## Third-party distributions: set DSH_HOME first
13
13
 
@@ -83,7 +83,7 @@ dsh plugin --profile web add file:/absolute/path/to/dsh-plugin-effort-declare
83
83
 
84
84
  ## After install
85
85
 
86
- Restart DSH. Open **Settings → Reasoning efforts**, declare reasoning levels per model, and check **Accepts image input** for vision models. The footer is the installed version (for example `0.1.4 © 2026 Stardust`). Bumping `package.json` version only appears after you rebuild and reinstall. Add a custom provider on the Models page first; otherwise this page has nothing to edit.
86
+ Restart DSH. Open **Settings → Reasoning efforts**, declare reasoning levels per model, and check **Accepts image input** for vision models. The footer is the installed version (for example `0.1.5 © 2026 Stardust`). Bumping `package.json` version only appears after you rebuild and reinstall. Add a custom provider on the Models page first; otherwise this page has nothing to edit.
87
87
 
88
88
  ## Uninstall
89
89
 
package/INSTALL.md CHANGED
@@ -7,7 +7,7 @@
7
7
  </samp>
8
8
  </p>
9
9
 
10
- 回到 [README](./README.md)。需要 DeepSeek Harness **0.1.0-rc.8** 或更高版本。不要使用 `npm install`,必须使用下面的 `dsh plugin` 命令。
10
+ 回到 [README](./README.md)。需要 DeepSeek Harness **0.1.2-alpha.2**;更早的客户端 API(含 0.1.0-rc.8)不再支持。不要使用 `npm install`,必须使用下面的 `dsh plugin` 命令。
11
11
 
12
12
  ## 第三方发行版:先设置 DSH_HOME
13
13
 
@@ -83,7 +83,7 @@ dsh plugin --profile web add file:/绝对路径/dsh-plugin-effort-declare
83
83
 
84
84
  ## 安装之后
85
85
 
86
- 重启 DSH。打开 **设置 → 推理档位**,按模型声明推理档位;视觉模型再勾选 **支持图片输入**。页脚为当前安装版本(例如 `0.1.4 © 2026 Stardust`)。修改 `package.json` 的 version 后须重新打包并安装才会更新页脚。请先在「模型」页添加第三方提供方,本页才会出现可编辑条目。
86
+ 重启 DSH。打开 **设置 → 推理档位**,按模型声明推理档位;视觉模型再勾选 **支持图片输入**。页脚为当前安装版本(例如 `0.1.5 © 2026 Stardust`)。修改 `package.json` 的 version 后须重新打包并安装才会更新页脚。请先在「模型」页添加第三方提供方,本页才会出现可编辑条目。
87
87
 
88
88
  ## 卸载
89
89
 
package/README.en.md CHANGED
@@ -13,11 +13,13 @@
13
13
  <a href="https://github.com/zimodzh/dsh-plugin-effort-declare" target="_blank" rel="noopener noreferrer"><img alt="repo size" src="https://img.shields.io/github/repo-size/zimodzh/dsh-plugin-effort-declare"></a>
14
14
  <a href="./LICENSE" target="_blank" rel="noopener noreferrer"><img alt="license" src="https://img.shields.io/github/license/zimodzh/dsh-plugin-effort-declare"></a>
15
15
  <a href="https://github.com/deepseek-ai/deepseek-harness" target="_blank" rel="noopener noreferrer"><img alt="Agent" src="https://img.shields.io/badge/Agent-Deepseek%20Harness-000000"></a>
16
+ <a href="https://www.dsh.so/artifact/dsh-plugin-effort-declare/" target="_blank" rel="noopener noreferrer"><img alt="dsh.so risk" src="https://www.dsh.so/badge/dsh-plugin-effort-declare.svg"></a>
17
+ <a href="https://www.dsh.so/artifact/dsh-plugin-effort-declare/" target="_blank" rel="noopener noreferrer"><img alt="dsh.so install" src="https://www.dsh.so/badge/install/dsh-plugin-effort-declare.svg"></a>
16
18
  </p>
17
19
 
18
- A settings plugin for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH). It declares reasoning levels and image input for hand-added OpenAI-compatible models. After a declaration, the composer shows the Effort row and accepts image attachments; undeclared models are treated as text-only.
20
+ A settings plugin for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH). It declares reasoning levels and image input for hand-added OpenAI-compatible models. After a declaration, the conversation input shows the Effort row and accepts image attachments; undeclared models are treated as text-only.
19
21
 
20
- > A community-maintained third-party DSH plugin. It is not an official DeepSeek project and is not endorsed by DeepSeek. Requires **DeepSeek Harness 0.1.0-rc.8** or later. Earlier versions have not been tested.
22
+ > A community-maintained third-party DSH plugin. It is not an official DeepSeek project and is not endorsed by DeepSeek. Requires **DeepSeek Harness 0.1.2-alpha.2**. Earlier client APIs are no longer supported, including 0.1.0-rc.8 which this plugin previously targeted.
21
23
 
22
24
  ## Purpose
23
25
 
package/README.md CHANGED
@@ -13,11 +13,13 @@
13
13
  <a href="https://github.com/zimodzh/dsh-plugin-effort-declare" target="_blank" rel="noopener noreferrer"><img alt="repo size" src="https://img.shields.io/github/repo-size/zimodzh/dsh-plugin-effort-declare"></a>
14
14
  <a href="./LICENSE" target="_blank" rel="noopener noreferrer"><img alt="license" src="https://img.shields.io/github/license/zimodzh/dsh-plugin-effort-declare"></a>
15
15
  <a href="https://github.com/deepseek-ai/deepseek-harness" target="_blank" rel="noopener noreferrer"><img alt="Agent" src="https://img.shields.io/badge/Agent-Deepseek%20Harness-000000"></a>
16
+ <a href="https://www.dsh.so/artifact/dsh-plugin-effort-declare/" target="_blank" rel="noopener noreferrer"><img alt="dsh.so risk" src="https://www.dsh.so/badge/dsh-plugin-effort-declare.svg"></a>
17
+ <a href="https://www.dsh.so/artifact/dsh-plugin-effort-declare/" target="_blank" rel="noopener noreferrer"><img alt="dsh.so install" src="https://www.dsh.so/badge/install/dsh-plugin-effort-declare.svg"></a>
16
18
  </p>
17
19
 
18
20
  这是 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(DSH)的设置插件:为手工添加的 OpenAI 兼容模型声明推理档位与图片输入。声明之后,对话输入框才会出现 Effort 行,并允许附加图片;未声明则按纯文本模型处理。
19
21
 
20
- > 社区维护的第三方 DSH 插件,并非 DeepSeek 官方项目,亦未经官方背书。要求 **DeepSeek Harness 0.1.0-rc.8** 或更高版本;更早版本未经测试。
22
+ > 社区维护的第三方 DSH 插件,并非 DeepSeek 官方项目,亦未经官方背书。要求 **DeepSeek Harness 0.1.2-alpha.2**;更早的客户端 API(含此前对接的 0.1.0-rc.8)不再支持。
21
23
 
22
24
  ## 作用
23
25
 
package/lib/client.js CHANGED
@@ -11,7 +11,7 @@ window.__ModuleLoader__.load({
11
11
  * Canonical thinking levels and openai-completions thinkingFormat names.
12
12
  *
13
13
  * Levels match `@deepseek-ai/dsh-llm-pi-ai` catalog.ts `THINKING_LEVELS`.
14
- * Formats match `SUPPORTED_THINKING_FORMATS` in the same file (rc.8).
14
+ * Formats match `SUPPORTED_THINKING_FORMATS` in the same file (0.1.2-alpha.2).
15
15
  * Tests pin these lists against a checked-in schema fixture
16
16
  * (`tests/fixtures/pi-ai-thinking-format-union.ts`) and the local level
17
17
  * whitelist. The settings page never offers the handwritten thinkingFormat
@@ -616,7 +616,7 @@ window.__ModuleLoader__.load({
616
616
  * package.json at DSH startup — host apply is empty and the settings page
617
617
  * runs in the browser.
618
618
  */
619
- const PLUGIN_FOOTER_TEXT = formatAttribution("0.1.4", COPYRIGHT_FROM, 2026);
619
+ const PLUGIN_FOOTER_TEXT = formatAttribution("0.1.5", COPYRIGHT_FROM, 2026);
620
620
  //#endregion
621
621
  //#region src/client/load-drafts.ts
622
622
  function schemaDefaultString(node) {
@@ -689,7 +689,7 @@ window.__ModuleLoader__.load({
689
689
  return current !== void 0 && current !== previous;
690
690
  }, signal) ? "changed" : "aborted";
691
691
  }
692
- async function assembleDrafts(api, describe, schema) {
692
+ async function assembleDrafts(llm, describe, schema) {
693
693
  const mirrored = describe.getSnapshot();
694
694
  if (mirrored.view === void 0) return {
695
695
  writable: false,
@@ -697,12 +697,12 @@ window.__ModuleLoader__.load({
697
697
  drafts: [],
698
698
  error: mirrored.error ?? void 0
699
699
  };
700
- const providersResponse = await api.llm.providers({});
701
- if (!providersResponse.result.ok) return {
700
+ const providersResponse = await llm.listConfigurableProviders();
701
+ if (!providersResponse.ok) return {
702
702
  writable: mirrored.view.writable,
703
703
  formats: [],
704
704
  drafts: [],
705
- error: providersResponse.result.error.message
705
+ error: providersResponse.error.message
706
706
  };
707
707
  const pi = new Map(mirrored.view.namespaces.map((view) => [view.ns, view])).get(LLM_PI_AI_NS);
708
708
  let formats = [];
@@ -723,7 +723,7 @@ window.__ModuleLoader__.load({
723
723
  ]));
724
724
  } catch {}
725
725
  const drafts = [];
726
- for (const entry of providersResponse.result.value.providers) {
726
+ for (const entry of providersResponse.value) {
727
727
  const settingsPath = entry.settingsPath !== void 0 && entry.settingsPath.length > 0 ? [...entry.settingsPath] : ["providers", entry.provider];
728
728
  if (!classifyRoute(entry, profileAt(pi?.value, settingsPath, entry.provider), schemaDefaultApi).editable) continue;
729
729
  drafts.push(routeDraftFromUserProfile({
@@ -744,9 +744,9 @@ window.__ModuleLoader__.load({
744
744
  * `ensure`: first paint / idle recovery (official ensure only reads from idle).
745
745
  * `snapshot`: refresh after the mirror revision already moved — do not ensure.
746
746
  */
747
- async function loadDrafts(api, describe, schema, mode = "ensure") {
747
+ async function loadDrafts(llm, describe, schema, mode = "ensure") {
748
748
  if (mode === "ensure") await describe.ensure();
749
- return assembleDrafts(api, describe, schema);
749
+ return assembleDrafts(llm, describe, schema);
750
750
  }
751
751
  //#endregion
752
752
  //#region src/client/schema-ops.ts
@@ -1160,7 +1160,8 @@ window.__ModuleLoader__.load({
1160
1160
  }
1161
1161
  function EffortDeclareSection(props) {
1162
1162
  const t = props.t;
1163
- const api = props.api;
1163
+ const llm = props.llm;
1164
+ const settings = props.settings;
1164
1165
  const describe = props.describe;
1165
1166
  const schema = props.schema;
1166
1167
  const [status, setStatus] = (0, react.useState)("loading");
@@ -1219,17 +1220,17 @@ window.__ModuleLoader__.load({
1219
1220
  setStatus("ready");
1220
1221
  };
1221
1222
  const loadSnapshotThenSettle = async (generation, preserveDirty) => {
1222
- if (api === void 0 || describe === void 0 || schema === void 0) return;
1223
+ if (llm === void 0 || typeof llm.listConfigurableProviders !== "function" || describe === void 0 || schema === void 0) return;
1223
1224
  if (!generationIsCurrent(generationRef, generation)) return;
1224
1225
  try {
1225
- const result = await loadDrafts(api, describe, schema, "snapshot");
1226
+ const result = await loadDrafts(llm, describe, schema, "snapshot");
1226
1227
  settleReload(generation, preserveDirty, result);
1227
1228
  } catch (failure) {
1228
1229
  failGeneration(generation, failure);
1229
1230
  }
1230
1231
  };
1231
1232
  const reload = (0, react.useCallback)((preserveDirty, mode = "ensure") => {
1232
- if (api === void 0 || describe === void 0 || schema === void 0) {
1233
+ if (llm === void 0 || typeof llm.listConfigurableProviders !== "function" || describe === void 0 || schema === void 0) {
1233
1234
  setStatus("error");
1234
1235
  setError(t("loadError"));
1235
1236
  return;
@@ -1237,19 +1238,19 @@ window.__ModuleLoader__.load({
1237
1238
  const { generation } = beginGeneration();
1238
1239
  if (draftsRef.current.length === 0) setStatus("loading");
1239
1240
  setError("");
1240
- loadDrafts(api, describe, schema, mode).then((result) => {
1241
+ loadDrafts(llm, describe, schema, mode).then((result) => {
1241
1242
  settleReload(generation, preserveDirty, result);
1242
1243
  }, (failure) => {
1243
1244
  failGeneration(generation, failure);
1244
1245
  });
1245
1246
  }, [
1246
- api,
1247
+ llm,
1247
1248
  describe,
1248
1249
  schema,
1249
1250
  t
1250
1251
  ]);
1251
1252
  const refreshAtRevision = (0, react.useCallback)((revision, preserveDirty) => {
1252
- if (api === void 0 || describe === void 0 || schema === void 0) return;
1253
+ if (llm === void 0 || typeof llm.listConfigurableProviders !== "function" || describe === void 0 || schema === void 0) return;
1253
1254
  const { generation, signal } = beginGeneration();
1254
1255
  if (draftsRef.current.length === 0) setStatus("loading");
1255
1256
  setError("");
@@ -1260,7 +1261,7 @@ window.__ModuleLoader__.load({
1260
1261
  failGeneration(generation, failure);
1261
1262
  });
1262
1263
  }, [
1263
- api,
1264
+ llm,
1264
1265
  describe,
1265
1266
  schema,
1266
1267
  t
@@ -1314,7 +1315,7 @@ window.__ModuleLoader__.load({
1314
1315
  });
1315
1316
  };
1316
1317
  const save = async (draft) => {
1317
- if (api === void 0 || describe === void 0 || schema === void 0) return;
1318
+ if (settings === void 0 || typeof settings.mutate !== "function" || describe === void 0 || schema === void 0) return;
1318
1319
  if (status === "loading" || busyRouteRef.current !== null) {
1319
1320
  patchNotice(draft.provider, {
1320
1321
  kind: "error",
@@ -1365,16 +1366,12 @@ window.__ModuleLoader__.load({
1365
1366
  }
1366
1367
  }
1367
1368
  }
1368
- const response = await api.settings.mutate({
1369
- ns: LLM_PI_AI_NS,
1370
- ops,
1371
- expectedRevision: draft.revision
1372
- });
1373
- if (!response.result.ok) {
1374
- const conflict = response.result.error.code === "settings-conflict";
1369
+ const response = await settings.mutate(LLM_PI_AI_NS, ops, draft.revision);
1370
+ if (!response.ok) {
1371
+ const conflict = response.error.code === "settings/conflict";
1375
1372
  patchNotice(draft.provider, {
1376
1373
  kind: conflict ? "conflict" : "error",
1377
- text: conflict ? t("conflict") : response.result.error.message
1374
+ text: conflict ? t("conflict") : response.error.message
1378
1375
  });
1379
1376
  if (conflict) {
1380
1377
  const { generation, signal } = beginGeneration();
@@ -1387,7 +1384,7 @@ window.__ModuleLoader__.load({
1387
1384
  }
1388
1385
  return;
1389
1386
  }
1390
- const view = response.result.value;
1387
+ const view = response.value;
1391
1388
  echoedRevisionRef.current = view.revision;
1392
1389
  describe.acceptView(view);
1393
1390
  applyDrafts(applySaveSuccess(draftsRef.current, draft.provider, {
@@ -1494,7 +1491,7 @@ window.__ModuleLoader__.load({
1494
1491
  title: "推理档位声明",
1495
1492
  intro: "声明手工模型可提供的推理档位,以及是否接受图片输入。未声明则不显示 Effort 行,图片附件也会被拒绝。档位仍在输入框菜单中选择;密钥、目录与当前选中项不在本页修改。",
1496
1493
  empty: "没有可编辑的手工 openai-completions 路由。",
1497
- emptyHint: "请先到「模型」页添加提供方(llm-pi-ai 手工路由)。官方 DeepSeek 与 catalog 路由不在本页编辑。需要 DSH ≥ 0.1.0-rc.8(providers.declared)。",
1494
+ emptyHint: "请先到「模型」页添加提供方(llm-pi-ai 手工路由)。官方 DeepSeek 与 catalog 路由不在本页编辑。需要 DSH ≥ 0.1.2-alpha.2。",
1498
1495
  loadError: "无法加载提供方或设置。",
1499
1496
  loading: "正在加载…",
1500
1497
  readOnly: "当前设置为只读,无法保存。",
@@ -1540,7 +1537,7 @@ window.__ModuleLoader__.load({
1540
1537
  title: "Reasoning effort declarations",
1541
1538
  intro: "Declare reasoning levels and image input for hand-added models. Undeclared models omit the Effort row and refuse image attachments. Effort is still chosen in the composer menu; keys, catalogs, and the current selection are not modified here.",
1542
1539
  empty: "No editable hand-declared openai-completions routes.",
1543
- emptyHint: "Add a provider on the Models page first (an llm-pi-ai hand-declared route). Official DeepSeek and catalog routes are not edited here. Requires DSH ≥ 0.1.0-rc.8 (providers.declared).",
1540
+ emptyHint: "Add a provider on the Models page first (an llm-pi-ai hand-declared route). Official DeepSeek and catalog routes are not edited here. Requires DSH ≥ 0.1.2-alpha.2.",
1544
1541
  loadError: "Could not load providers or settings.",
1545
1542
  loading: "Loading…",
1546
1543
  readOnly: "Settings are read-only; saving is disabled.",
@@ -1586,8 +1583,9 @@ window.__ModuleLoader__.load({
1586
1583
  const inject = [
1587
1584
  "slots",
1588
1585
  "locale",
1589
- "connection",
1590
1586
  "remote",
1587
+ "remote.llm",
1588
+ "remote.settings",
1591
1589
  "settingsScope",
1592
1590
  "settingsSchema"
1593
1591
  ];
@@ -1613,7 +1611,6 @@ window.__ModuleLoader__.load({
1613
1611
  en
1614
1612
  }), `${PLUGIN_ID}: dictionaries`);
1615
1613
  ctx.effect(() => mountPluginCss(), `${PLUGIN_ID}: css`);
1616
- const connection = ctx.get("connection");
1617
1614
  const settingsSchema = ctx.settingsSchema;
1618
1615
  const schema = bindSchema({
1619
1616
  rehydrate: (serialized) => settingsSchema.rehydrate(serialized),
@@ -1664,7 +1661,8 @@ window.__ModuleLoader__.load({
1664
1661
  label: () => t("nav"),
1665
1662
  locale: NS,
1666
1663
  inject: () => ({
1667
- api: connection.api,
1664
+ llm: ctx.remote.llm,
1665
+ settings: ctx.remote.settings,
1668
1666
  describe,
1669
1667
  schema,
1670
1668
  subscribeInvalidate