dsh-plugin-dev-kb 1.8.0 → 1.8.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.
Files changed (229) hide show
  1. package/CHANGELOG.md +186 -178
  2. package/README.en.md +172 -172
  3. package/README.md +183 -183
  4. package/kb/INDEX.md +236 -234
  5. package/kb/README.md +88 -88
  6. package/kb/extra/AGENTS.md +77 -77
  7. package/kb/extra/deepseek-llm-api-wire-extensions.md +162 -162
  8. package/kb/extra/deepseek-llm-api-wire-extensions.zh.md +162 -162
  9. package/kb/extra/defensive-patterns/package-surface.md +233 -232
  10. package/kb/extra/defensive-patterns/package-surface.zh.md +233 -232
  11. package/kb/extra/defensive-patterns/remote-and-api.md +117 -117
  12. package/kb/extra/defensive-patterns/remote-and-api.zh.md +117 -117
  13. package/kb/extra/development.md +221 -221
  14. package/kb/extra/development.zh.md +228 -228
  15. package/kb/extra/event-producer-consumer.md +133 -123
  16. package/kb/extra/event-producer-consumer.zh.md +135 -125
  17. package/kb/extra/module-graph.md +1961 -1888
  18. package/kb/extra/module-graph.zh.md +1963 -1890
  19. package/kb/extra/persistence-changes/2026-11-05-timeline-priority-notice.md +60 -0
  20. package/kb/extra/persistence-changes/2026-11-05-timeline-priority-notice.zh.md +60 -0
  21. package/kb/extra/persistence-changes/README.md +92 -92
  22. package/kb/extra/persistence-changes/README.zh.md +92 -92
  23. package/kb/extra/persistence-changes/historical-formats/README.md +75 -75
  24. package/kb/extra/persistence-changes/historical-formats/README.zh.md +75 -75
  25. package/kb/extra/persistence-changes/releases/README.md +103 -103
  26. package/kb/extra/persistence-changes/releases/README.zh.md +103 -103
  27. package/kb/extra/rescope.md +55 -55
  28. package/kb/extra/rescope.zh.md +55 -55
  29. package/kb/extra/subsystems/boot.md +631 -621
  30. package/kb/extra/subsystems/boot.zh.md +631 -621
  31. package/kb/extra/subsystems/computer-use.md +179 -137
  32. package/kb/extra/subsystems/computer-use.zh.md +179 -137
  33. package/kb/extra/subsystems/extensions.md +387 -384
  34. package/kb/extra/subsystems/extensions.zh.md +387 -384
  35. package/kb/extra/subsystems/feedback.md +418 -400
  36. package/kb/extra/subsystems/feedback.zh.md +418 -400
  37. package/kb/extra/subsystems/forge.md +2169 -1226
  38. package/kb/extra/subsystems/forge.zh.md +2171 -1226
  39. package/kb/extra/subsystems/liveshare.md +167 -158
  40. package/kb/extra/subsystems/liveshare.zh.md +167 -158
  41. package/kb/extra/subsystems/mcp.md +237 -234
  42. package/kb/extra/subsystems/mcp.zh.md +237 -234
  43. package/kb/extra/subsystems/office-kit.md +122 -0
  44. package/kb/extra/subsystems/office-kit.zh.md +122 -0
  45. package/kb/extra/subsystems/working-directory.md +95 -64
  46. package/kb/extra/subsystems/working-directory.zh.md +95 -64
  47. package/kb/extra/subsystems/worktrees.md +187 -127
  48. package/kb/extra/subsystems/worktrees.zh.md +187 -127
  49. package/kb/extra/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.md +21 -21
  50. package/kb/extra/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.zh.md +21 -21
  51. package/kb/extra/upgrade-guide/v0.2.1-rc.4/sandbox-unsupported-policy-error/guide.md +18 -0
  52. package/kb/extra/upgrade-guide/v0.2.1-rc.4/sandbox-unsupported-policy-error/guide.zh.md +18 -0
  53. package/kb/extra/upgrade-guide/v0.2.2-alpha.2/llm-error-builtin-codes/guide.md +18 -0
  54. package/kb/extra/upgrade-guide/v0.2.2-alpha.2/llm-error-builtin-codes/guide.zh.md +18 -0
  55. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-kit-package/guide.md +34 -0
  56. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-kit-package/guide.zh.md +34 -0
  57. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.md +49 -0
  58. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.zh.md +49 -0
  59. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-skill-resources/guide.md +36 -0
  60. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-skill-resources/guide.zh.md +36 -0
  61. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-notification-fields/guide.md +26 -0
  62. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-notification-fields/guide.zh.md +26 -0
  63. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-remote-provider/guide.md +22 -0
  64. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-remote-provider/guide.zh.md +22 -0
  65. package/kb/extra/upgrade-guide/v0.2.2-rc.1/archive-worktrees/guide.md +21 -0
  66. package/kb/extra/upgrade-guide/v0.2.2-rc.1/archive-worktrees/guide.zh.md +21 -0
  67. package/kb/extra/upgrade-guide/v0.2.2-rc.1/attachment-error-codes/guide.md +23 -0
  68. package/kb/extra/upgrade-guide/v0.2.2-rc.1/attachment-error-codes/guide.zh.md +23 -0
  69. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-ax-read-limits/guide.md +20 -0
  70. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-ax-read-limits/guide.zh.md +20 -0
  71. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-hover-ax-only/guide.md +18 -0
  72. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-hover-ax-only/guide.zh.md +18 -0
  73. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-native-platform/guide.md +23 -0
  74. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-native-platform/guide.zh.md +23 -0
  75. package/kb/extra/upgrade-guide/v0.2.2-rc.1/dsh-doc-skill/guide.md +35 -0
  76. package/kb/extra/upgrade-guide/v0.2.2-rc.1/dsh-doc-skill/guide.zh.md +35 -0
  77. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-change-request-overview/guide.md +26 -0
  78. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-change-request-overview/guide.zh.md +26 -0
  79. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-pinned-diff/guide.md +26 -0
  80. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-pinned-diff/guide.zh.md +26 -0
  81. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-review-reads/guide.md +19 -0
  82. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-review-reads/guide.zh.md +19 -0
  83. package/kb/extra/upgrade-guide/v0.2.2-rc.1/package-export-cleanup/guide.md +26 -0
  84. package/kb/extra/upgrade-guide/v0.2.2-rc.1/package-export-cleanup/guide.zh.md +26 -0
  85. package/kb/extra/upgrade-guide/v0.2.2-rc.1/plugin-update-method/guide.md +22 -0
  86. package/kb/extra/upgrade-guide/v0.2.2-rc.1/plugin-update-method/guide.zh.md +22 -0
  87. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-bootstrap-protocol/guide.md +25 -0
  88. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-bootstrap-protocol/guide.zh.md +25 -0
  89. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-inspect-output/guide.md +48 -0
  90. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-inspect-output/guide.zh.md +48 -0
  91. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-scoped-repl-default/guide.md +45 -0
  92. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-scoped-repl-default/guide.zh.md +45 -0
  93. package/kb/extra/upgrade-guide/v0.2.2-rc.1/runtime-context-reminders/guide.md +19 -0
  94. package/kb/extra/upgrade-guide/v0.2.2-rc.1/runtime-context-reminders/guide.zh.md +19 -0
  95. package/kb/extra/upgrade-guide/v0.2.2-rc.1/session-append-overloads/guide.md +17 -0
  96. package/kb/extra/upgrade-guide/v0.2.2-rc.1/session-append-overloads/guide.zh.md +17 -0
  97. package/kb/extra/upgrade-guide/v0.2.2-rc.1/subagent-interrupt-default/guide.md +27 -0
  98. package/kb/extra/upgrade-guide/v0.2.2-rc.1/subagent-interrupt-default/guide.zh.md +27 -0
  99. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-backend-cleanup-error/guide.md +20 -0
  100. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-backend-cleanup-error/guide.zh.md +20 -0
  101. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-bundle-sidebar-backend/guide.md +19 -0
  102. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-bundle-sidebar-backend/guide.zh.md +19 -0
  103. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-fetch-transport-error-codes/guide.md +18 -0
  104. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-fetch-transport-error-codes/guide.zh.md +18 -0
  105. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-search-billing/guide.md +41 -0
  106. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-search-billing/guide.zh.md +41 -0
  107. package/kb/extra/upgrade-guide/v0.2.2-rc.1/window-drag-regions/guide.md +21 -0
  108. package/kb/extra/upgrade-guide/v0.2.2-rc.1/window-drag-regions/guide.zh.md +21 -0
  109. package/kb/extra/upgrade-guide/v0.2.2-rc.2/client-module-metadata/guide.md +29 -0
  110. package/kb/extra/upgrade-guide/v0.2.2-rc.2/client-module-metadata/guide.zh.md +29 -0
  111. package/kb/extra/upgrade-guide/v0.2.2-rc.2/connection-page-peer/guide.md +25 -0
  112. package/kb/extra/upgrade-guide/v0.2.2-rc.2/connection-page-peer/guide.zh.md +25 -0
  113. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cordis-root-and-intercept-metadata/guide.md +31 -0
  114. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cordis-root-and-intercept-metadata/guide.zh.md +31 -0
  115. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-agents-without-preset/guide.md +24 -0
  116. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-agents-without-preset/guide.zh.md +24 -0
  117. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-macos-provider/guide.md +24 -0
  118. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-macos-provider/guide.zh.md +24 -0
  119. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-partial-observations/guide.md +19 -0
  120. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-partial-observations/guide.zh.md +19 -0
  121. package/kb/extra/upgrade-guide/v0.2.2-rc.2/deepseek-files-timeout/guide.md +15 -0
  122. package/kb/extra/upgrade-guide/v0.2.2-rc.2/deepseek-files-timeout/guide.zh.md +15 -0
  123. package/kb/extra/upgrade-guide/v0.2.2-rc.2/experimental-tool-error-codes/guide.md +28 -0
  124. package/kb/extra/upgrade-guide/v0.2.2-rc.2/experimental-tool-error-codes/guide.zh.md +28 -0
  125. package/kb/extra/upgrade-guide/v0.2.2-rc.2/package-export-cleanup/guide.md +36 -0
  126. package/kb/extra/upgrade-guide/v0.2.2-rc.2/package-export-cleanup/guide.zh.md +36 -0
  127. package/kb/extra/upgrade-guide/v0.2.2-rc.2/python-ptc-removal/guide.md +22 -0
  128. package/kb/extra/upgrade-guide/v0.2.2-rc.2/python-ptc-removal/guide.zh.md +22 -0
  129. package/kb/extra/upgrade-guide/v0.2.2-rc.2/session-status-package/guide.md +31 -0
  130. package/kb/extra/upgrade-guide/v0.2.2-rc.2/session-status-package/guide.zh.md +31 -0
  131. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shared-search-filter/guide.md +18 -0
  132. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shared-search-filter/guide.zh.md +18 -0
  133. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shell-fs-tool-error-codes/guide.md +30 -0
  134. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shell-fs-tool-error-codes/guide.zh.md +30 -0
  135. package/kb/extra/web-styling.md +57 -57
  136. package/kb/extra/web-styling.zh.md +57 -57
  137. package/kb/meta/search-index.json +4508 -3980
  138. package/kb/meta/source.json +18 -18
  139. package/kb/site/develop/practice/llm-adapter.md +192 -192
  140. package/kb/site/en/develop/practice/llm-adapter.md +192 -192
  141. package/kb/site/en/guide/desktop-uninstall-cleanup.md +63 -0
  142. package/kb/site/en/guide/plugin-market.md +153 -151
  143. package/kb/site/en/guide/providers.md +234 -234
  144. package/kb/site/en/guide/quickstart.md +35 -34
  145. package/kb/site/en/reference/capability-seams.md +789 -767
  146. package/kb/site/en/reference/config-catalog.md +5432 -5128
  147. package/kb/site/en/reference/cookbook/adding-a-package.md +175 -175
  148. package/kb/site/en/reference/cookbook/adding-a-tool.md +105 -104
  149. package/kb/site/en/reference/cookbook/extension-cookbook.md +178 -135
  150. package/kb/site/en/reference/cordis-api/context.md +373 -369
  151. package/kb/site/en/reference/cordis-api/fiber.md +457 -433
  152. package/kb/site/en/reference/cordis-api/inherited.md +44 -44
  153. package/kb/site/en/reference/cordis-api/service.md +118 -107
  154. package/kb/site/en/reference/experimental-persistence-catalog.md +36 -23
  155. package/kb/site/en/reference/index.md +174 -174
  156. package/kb/site/en/reference/persistence-catalog.md +9453 -9432
  157. package/kb/site/en/reference/subsystems/compaction.md +288 -288
  158. package/kb/site/en/reference/subsystems/core.md +1172 -1171
  159. package/kb/site/en/reference/subsystems/credentials.md +526 -497
  160. package/kb/site/en/reference/subsystems/filesystem.md +708 -708
  161. package/kb/site/en/reference/subsystems/index.md +82 -82
  162. package/kb/site/en/reference/subsystems/llm-streaming.md +1290 -1288
  163. package/kb/site/en/reference/subsystems/lsp.md +230 -206
  164. package/kb/site/en/reference/subsystems/persistence.md +451 -432
  165. package/kb/site/en/reference/subsystems/plan.md +91 -91
  166. package/kb/site/en/reference/subsystems/ptc-runtime.md +295 -261
  167. package/kb/site/en/reference/subsystems/sandbox.md +250 -232
  168. package/kb/site/en/reference/subsystems/session-query.md +525 -515
  169. package/kb/site/en/reference/subsystems/session-reference.md +231 -229
  170. package/kb/site/en/reference/subsystems/session.md +1478 -1431
  171. package/kb/site/en/reference/subsystems/sidebar-right.md +165 -165
  172. package/kb/site/en/reference/subsystems/skills.md +356 -356
  173. package/kb/site/en/reference/subsystems/slots.md +235 -231
  174. package/kb/site/en/reference/subsystems/terminal.md +188 -188
  175. package/kb/site/en/reference/subsystems/tools.md +902 -891
  176. package/kb/site/en/reference/subsystems/user-questions.md +330 -327
  177. package/kb/site/en/reference/subsystems/web-client.md +161 -104
  178. package/kb/site/en/reference/subsystems/web-server.md +434 -351
  179. package/kb/site/en/reference/subsystems/web.md +268 -268
  180. package/kb/site/en/reference/subsystems/workflow.md +287 -282
  181. package/kb/site/en/reference/subsystems/workspace.md +743 -651
  182. package/kb/site/en/reference/tool-catalog.md +2867 -2704
  183. package/kb/site/guide/desktop-uninstall-cleanup.md +63 -0
  184. package/kb/site/guide/plugin-market.md +153 -151
  185. package/kb/site/guide/providers.md +234 -234
  186. package/kb/site/guide/quickstart.md +35 -34
  187. package/kb/site/reference/capability-seams.md +789 -767
  188. package/kb/site/reference/config-catalog.md +5432 -5128
  189. package/kb/site/reference/cookbook/adding-a-package.md +175 -175
  190. package/kb/site/reference/cookbook/adding-a-tool.md +107 -106
  191. package/kb/site/reference/cookbook/extension-cookbook.md +182 -139
  192. package/kb/site/reference/cordis-api/context.md +373 -369
  193. package/kb/site/reference/cordis-api/fiber.md +459 -435
  194. package/kb/site/reference/cordis-api/inherited.md +44 -44
  195. package/kb/site/reference/cordis-api/service.md +118 -107
  196. package/kb/site/reference/experimental-persistence-catalog.md +36 -23
  197. package/kb/site/reference/index.md +178 -178
  198. package/kb/site/reference/persistence-catalog.md +9453 -9432
  199. package/kb/site/reference/subsystems/compaction.md +288 -288
  200. package/kb/site/reference/subsystems/core.md +1184 -1183
  201. package/kb/site/reference/subsystems/credentials.md +526 -497
  202. package/kb/site/reference/subsystems/filesystem.md +708 -708
  203. package/kb/site/reference/subsystems/index.md +82 -82
  204. package/kb/site/reference/subsystems/llm-streaming.md +1296 -1294
  205. package/kb/site/reference/subsystems/lsp.md +230 -206
  206. package/kb/site/reference/subsystems/persistence.md +451 -432
  207. package/kb/site/reference/subsystems/plan.md +91 -91
  208. package/kb/site/reference/subsystems/ptc-runtime.md +295 -261
  209. package/kb/site/reference/subsystems/sandbox.md +250 -232
  210. package/kb/site/reference/subsystems/session-query.md +525 -515
  211. package/kb/site/reference/subsystems/session-reference.md +231 -229
  212. package/kb/site/reference/subsystems/session.md +1482 -1435
  213. package/kb/site/reference/subsystems/sidebar-right.md +165 -165
  214. package/kb/site/reference/subsystems/skills.md +356 -356
  215. package/kb/site/reference/subsystems/slots.md +239 -235
  216. package/kb/site/reference/subsystems/terminal.md +188 -188
  217. package/kb/site/reference/subsystems/tools.md +902 -891
  218. package/kb/site/reference/subsystems/user-questions.md +330 -327
  219. package/kb/site/reference/subsystems/web-client.md +161 -104
  220. package/kb/site/reference/subsystems/web-server.md +434 -351
  221. package/kb/site/reference/subsystems/web.md +268 -268
  222. package/kb/site/reference/subsystems/workflow.md +287 -282
  223. package/kb/site/reference/subsystems/workspace.md +743 -651
  224. package/kb/site/reference/tool-catalog.md +2872 -2709
  225. package/lib/index.js +359 -359
  226. package/package.json +68 -68
  227. package/skills/dsh-plugin-dev-kb.md +71 -70
  228. package/kb/extra/subsystems/office-to-pdf.md +0 -87
  229. package/kb/extra/subsystems/office-to-pdf.zh.md +0 -87
@@ -1,18 +1,18 @@
1
- {
2
- "knowledgeBase": "DeepSeek Harness 官方文档知识库",
3
- "source": "官方文档站点 https://deepseek-harness.github.io/deepseek-harness/(VitePress),由仓库 docs/ 原始 Markdown 投影重建",
4
- "repository": "https://github.com/deepseek-ai/deepseek-harness",
5
- "branch": "master",
6
- "commit": "fcc0ad462172522aaf5c93a7b2e01f6b9f0b0159",
7
- "fetchedAt": "2026-11-07",
8
- "siteBase": "https://deepseek-harness.github.io/deepseek-harness",
9
- "publishedMarkdownPages": 192,
10
- "siteFiles": 196,
11
- "images": 4,
12
- "extraFiles": 468,
13
- "note": "内容同步(2026-11-07):site/ 与 extra/ 刷新至上游 master @ fcc0ad4(refresh-kb.mjs 自动执行),extra 共 468 篇。",
14
- "schemaVersion": 1,
15
- "label": "kb sync",
16
- "message": "2026-11-07 @ fcc0ad4",
17
- "color": "blue"
18
- }
1
+ {
2
+ "knowledgeBase": "DeepSeek Harness 官方文档知识库",
3
+ "source": "官方文档站点 https://deepseek-harness.github.io/deepseek-harness/(VitePress),由仓库 docs/ 原始 Markdown 投影重建",
4
+ "repository": "https://github.com/deepseek-ai/deepseek-harness",
5
+ "branch": "master",
6
+ "commit": "39163dd30f703a79079e2d2446545cff3c453738",
7
+ "fetchedAt": "2026-11-14",
8
+ "siteBase": "https://deepseek-harness.github.io/deepseek-harness",
9
+ "publishedMarkdownPages": 194,
10
+ "siteFiles": 198,
11
+ "images": 4,
12
+ "extraFiles": 554,
13
+ "note": "内容同步(2026-11-14):site/ 与 extra/ 刷新至上游 master @ 39163dd(refresh-kb.mjs 自动执行),extra 共 554 篇。",
14
+ "schemaVersion": 1,
15
+ "label": "kb sync",
16
+ "message": "2026-11-14 @ 39163dd",
17
+ "color": "blue"
18
+ }
@@ -1,192 +1,192 @@
1
- ---
2
- editSource: "docs/user/develop/practice/llm-adapter.zh.md"
3
- rawMarkdownPath: "develop/practice/llm-adapter.md"
4
- ---
5
-
6
- # LLM 适配器
7
-
8
- 本文介绍如何为 Harness 接入新的模型提供方。
9
-
10
- ## 概述
11
-
12
- LLM 适配器是一个继承 `LlmAdapter` 并实现 `stream()` 方法的类,它会将 Harness 的提供方无关请求转换为具体提供方的 API 调用,并将响应转换回 Harness 分片。
13
-
14
- ## 最小实现
15
-
16
- ```ts
17
- import type { Context } from '@deepseek-ai/cordis'
18
- import Schema from '@deepseek-ai/schemastery'
19
- import { LlmAdapter, type GenerateOptions, type StreamChunk } from '@deepseek-ai/dsh-llm'
20
-
21
- class MyAdapter extends LlmAdapter {
22
- private apiKey: string
23
-
24
- constructor(apiKey: string) {
25
- super()
26
- this.apiKey = apiKey
27
- }
28
-
29
- async *stream(options: GenerateOptions): AsyncIterable<StreamChunk> {
30
- // 1. Convert options.messages to the provider format.
31
- // 2. Call the streaming API.
32
- // 3. Convert the response into StreamChunk values.
33
- }
34
- }
35
-
36
- export interface Config {
37
- apiKey: string
38
- providers: string[]
39
- }
40
-
41
- export const Config: Schema<Config> = Schema.object({
42
- apiKey: Schema.string().required(),
43
- providers: Schema.array(Schema.string()).required(),
44
- })
45
-
46
- export const name = 'my-llm-adapter'
47
- export const inject = ['llm']
48
-
49
- export function apply(ctx: Context, config: Config) {
50
- const adapter = new MyAdapter(config.apiKey)
51
- ctx.llm.registerAdapter(config.providers, adapter)
52
- }
53
- ```
54
-
55
- ## StreamChunk 协议
56
-
57
- `stream()` 必须按以下协议生成分片:
58
-
59
- ```ts
60
- import { brandString } from '@deepseek-ai/dsh-brand'
61
- import type { StreamChunk, ToolCallId } from '@deepseek-ai/dsh-llm'
62
-
63
- async function* exampleChunks(): AsyncIterable<StreamChunk> {
64
- // 1. Start each content block with block-start.
65
- yield { type: 'block-start', index: 0, blockType: 'text' }
66
-
67
- // 2. Stream text through text-delta.
68
- yield { type: 'text-delta', index: 0, text: 'Hello' }
69
- yield { type: 'text-delta', index: 0, text: ' world' }
70
-
71
- // 3. End each content block with block-end and the complete block.
72
- yield {
73
- type: 'block-end',
74
- index: 0,
75
- block: { type: 'text', text: 'Hello world' },
76
- }
77
-
78
- // 4. Tool-call block.
79
- yield { type: 'block-start', index: 1, blockType: 'tool-call' }
80
- yield {
81
- type: 'tool-call-delta',
82
- index: 1,
83
- id: brandString<ToolCallId>('call-123'),
84
- name: 'bash',
85
- argumentsDelta: '{"command":"ls"}',
86
- }
87
- yield {
88
- type: 'block-end',
89
- index: 1,
90
- block: {
91
- type: 'tool-call',
92
- id: brandString<ToolCallId>('call-123'),
93
- name: 'bash',
94
- arguments: '{"command":"ls"}',
95
- },
96
- }
97
-
98
- // 5. Token usage.
99
- yield { type: 'usage', usage: { inputTokens: 100, outputTokens: 50 } }
100
-
101
- // 6. Finish reason.
102
- yield { type: 'finish', reason: { kind: 'stop' } }
103
- // Alternatively, { kind: 'tool-calls' } requests tool execution.
104
- }
105
- ```
106
-
107
- ### 关键规则
108
-
109
- - 每个 `block-start` 都必须有与之对应的 `block-end`。
110
- - `index` 从 0 开始递增,用于标识内容块的顺序。
111
- - `tool-call-delta` 的 `argumentsDelta` 是原始 JSON 文本的增量,可以在一个分片中完整生成,也可以分多个分片生成。
112
- - `finish` 必须是最后一个分片。
113
- - `usage` 必须在 `finish` 之前生成。
114
-
115
- ## GenerateOptions
116
-
117
- `stream()` 接收仓库导出的 `GenerateOptions`。它包含模型、适配器拥有的推理强度 ID、对话历史、系统提示词、工具 schema、生成参数、停止序列和中止信号;完整字段以 `@deepseek-ai/dsh-llm` 导出的 TypeScript 类型为准。适配器必须将支持的字段映射到具体 API;如果无法支持某个字段,应抛出带稳定 code 的 `LlmError`,不得静默丢弃。
118
-
119
- 请覆写 `resolveModel(provider, model, signal?)`,在一次查询中返回确切的提供方/模型身份以及可选的 `context` 和 `reasoning` 元数据。推理元数据包含有序的不透明 ID、展示名称,以及可选的配置默认值;请保留适配器给出的权威可选列表,包括其上游能力 API 返回的 `off`,不要将这些值提升为核心枚举。异步查询必须响应该可选信号,使取消和资源释放过程完全停稳。服务会校验聚合结果,并在调用 `stream()` 前拒绝显式指定但不受支持的推理强度;省略 `reasoning` 表示该模型没有可选的推理强度能力。
120
-
121
- ## 注册适配器
122
-
123
- ```ts ignore-check
124
- ctx.llm.registerAdapter(['my-provider'], adapter)
125
- ```
126
-
127
- 第一个参数是该适配器处理的提供方路由列表。`GenerateOptions.provider` 选择已注册的适配器,`GenerateOptions.model` 则传入由适配器拥有、无需在生命周期启动时注册的模型 id。适配器能够向选择器公布模型选项时,请覆写 `listModels()`。
128
-
129
- ## 在 cordis.yml 中使用
130
-
131
- ```yaml
132
- - id: my-llm
133
- name: './src/my-llm-adapter.ts'
134
- config:
135
- apiKey: !!js process.env.MY_API_KEY
136
- providers:
137
- - my-provider
138
-
139
- - id: agent-loop
140
- name: '@deepseek-ai/dsh-agent-loop'
141
- config:
142
- agents:
143
- - id: main
144
- provider: my-provider
145
- model: my-model-v1
146
- ```
147
-
148
- ## 实战参考
149
-
150
- 仓库中包含以下两个完整实现:
151
-
152
- - `packages/llm/llm-deepseek/` — 使用 Messages API 的 DeepSeek 适配器
153
- - `packages/llm/llm-pi-ai/` — Pi AI 适配器(不同的 API 格式)
154
-
155
- 对比这两个已交付的适配器,可以看到同一套 harness 契约如何在不同提供方 SDK 之上实现。
156
-
157
- ## 错误处理
158
-
159
- 适配器应通过带稳定 code 的 `LlmError` 抛出传输和协议故障;agent loop(智能体循环)会保留该错误及其 code,用于诊断和策略处理。不要依赖普通 `Error` 被自动转换。每个提供方 HTTP 请求还必须合并 `attributionHeaders()`,并传递 `options.signal`。
160
-
161
- ```ts
162
- import {
163
- attributionHeaders,
164
- LlmAdapter,
165
- LlmError,
166
- type GenerateOptions,
167
- type StreamChunk,
168
- } from '@deepseek-ai/dsh-llm'
169
-
170
- class HttpAdapter extends LlmAdapter {
171
- constructor(private readonly endpoint: string) {
172
- super()
173
- }
174
-
175
- async *stream(options: GenerateOptions): AsyncIterable<StreamChunk> {
176
- const response = await fetch(this.endpoint, {
177
- method: 'POST',
178
- headers: {
179
- 'content-type': 'application/json',
180
- ...attributionHeaders(),
181
- },
182
- body: JSON.stringify({ model: options.model, messages: options.messages }),
183
- ...options.signal ? { signal: options.signal } : {},
184
- })
185
- if (!response.ok) {
186
- throw new LlmError(`Provider API error: ${response.status}`, 'PROVIDER_HTTP_ERROR')
187
- }
188
- // A real adapter parses the response and emits the complete chunk sequence.
189
- yield { type: 'finish', reason: { kind: 'stop' } }
190
- }
191
- }
192
- ```
1
+ ---
2
+ editSource: "docs/user/develop/practice/llm-adapter.zh.md"
3
+ rawMarkdownPath: "develop/practice/llm-adapter.md"
4
+ ---
5
+
6
+ # LLM 适配器
7
+
8
+ 本文介绍如何为 Harness 接入新的模型提供方。
9
+
10
+ ## 概述
11
+
12
+ LLM 适配器是一个继承 `LlmAdapter` 并实现 `stream()` 方法的类,它会将 Harness 的提供方无关请求转换为具体提供方的 API 调用,并将响应转换回 Harness 分片。
13
+
14
+ ## 最小实现
15
+
16
+ ```ts
17
+ import type { Context } from '@deepseek-ai/cordis'
18
+ import Schema from '@deepseek-ai/schemastery'
19
+ import { LlmAdapter, type GenerateOptions, type StreamChunk } from '@deepseek-ai/dsh-llm'
20
+
21
+ class MyAdapter extends LlmAdapter {
22
+ private apiKey: string
23
+
24
+ constructor(apiKey: string) {
25
+ super()
26
+ this.apiKey = apiKey
27
+ }
28
+
29
+ async *stream(options: GenerateOptions): AsyncIterable<StreamChunk> {
30
+ // 1. Convert options.messages to the provider format.
31
+ // 2. Call the streaming API.
32
+ // 3. Convert the response into StreamChunk values.
33
+ }
34
+ }
35
+
36
+ export interface Config {
37
+ apiKey: string
38
+ providers: string[]
39
+ }
40
+
41
+ export const Config: Schema<Config> = Schema.object({
42
+ apiKey: Schema.string().required(),
43
+ providers: Schema.array(Schema.string()).required(),
44
+ })
45
+
46
+ export const name = 'my-llm-adapter'
47
+ export const inject = ['llm']
48
+
49
+ export function apply(ctx: Context, config: Config) {
50
+ const adapter = new MyAdapter(config.apiKey)
51
+ ctx.llm.registerAdapter(config.providers, adapter)
52
+ }
53
+ ```
54
+
55
+ ## StreamChunk 协议
56
+
57
+ `stream()` 必须按以下协议生成分片:
58
+
59
+ ```ts
60
+ import { brandString } from '@deepseek-ai/dsh-brand'
61
+ import type { StreamChunk, ToolCallId } from '@deepseek-ai/dsh-llm'
62
+
63
+ async function* exampleChunks(): AsyncIterable<StreamChunk> {
64
+ // 1. Start each content block with block-start.
65
+ yield { type: 'block-start', index: 0, blockType: 'text' }
66
+
67
+ // 2. Stream text through text-delta.
68
+ yield { type: 'text-delta', index: 0, text: 'Hello' }
69
+ yield { type: 'text-delta', index: 0, text: ' world' }
70
+
71
+ // 3. End each content block with block-end and the complete block.
72
+ yield {
73
+ type: 'block-end',
74
+ index: 0,
75
+ block: { type: 'text', text: 'Hello world' },
76
+ }
77
+
78
+ // 4. Tool-call block.
79
+ yield { type: 'block-start', index: 1, blockType: 'tool-call' }
80
+ yield {
81
+ type: 'tool-call-delta',
82
+ index: 1,
83
+ id: brandString<ToolCallId>('call-123'),
84
+ name: 'bash',
85
+ argumentsDelta: '{"command":"ls"}',
86
+ }
87
+ yield {
88
+ type: 'block-end',
89
+ index: 1,
90
+ block: {
91
+ type: 'tool-call',
92
+ id: brandString<ToolCallId>('call-123'),
93
+ name: 'bash',
94
+ arguments: '{"command":"ls"}',
95
+ },
96
+ }
97
+
98
+ // 5. Token usage.
99
+ yield { type: 'usage', usage: { inputTokens: 100, outputTokens: 50 } }
100
+
101
+ // 6. Finish reason.
102
+ yield { type: 'finish', reason: { kind: 'stop' } }
103
+ // Alternatively, { kind: 'tool-calls' } requests tool execution.
104
+ }
105
+ ```
106
+
107
+ ### 关键规则
108
+
109
+ - 每个 `block-start` 都必须有与之对应的 `block-end`。
110
+ - `index` 从 0 开始递增,用于标识内容块的顺序。
111
+ - `tool-call-delta` 的 `argumentsDelta` 是原始 JSON 文本的增量,可以在一个分片中完整生成,也可以分多个分片生成。
112
+ - `finish` 必须是最后一个分片。
113
+ - `usage` 必须在 `finish` 之前生成。
114
+
115
+ ## GenerateOptions
116
+
117
+ `stream()` 接收仓库导出的 `GenerateOptions`。它包含模型、适配器拥有的推理强度 ID、对话历史、系统提示词、工具 schema、生成参数、停止序列和中止信号;完整字段以 `@deepseek-ai/dsh-llm` 导出的 TypeScript 类型为准。适配器必须将支持的字段映射到具体 API;如果无法支持某个字段,应抛出带稳定 code 的 `LlmError`,不得静默丢弃。
118
+
119
+ 请覆写 `resolveModel(provider, model, signal?)`,在一次查询中返回确切的提供方/模型身份以及可选的 `context` 和 `reasoning` 元数据。推理元数据包含有序的不透明 ID、展示名称,以及可选的配置默认值;请保留适配器给出的权威可选列表,包括其上游能力 API 返回的 `off`,不要将这些值提升为核心枚举。异步查询必须响应该可选信号,使取消和资源释放过程完全停稳。服务会校验聚合结果,并在调用 `stream()` 前拒绝显式指定但不受支持的推理强度;省略 `reasoning` 表示该模型没有可选的推理强度能力。
120
+
121
+ ## 注册适配器
122
+
123
+ ```ts ignore-check
124
+ ctx.llm.registerAdapter(['my-provider'], adapter)
125
+ ```
126
+
127
+ 第一个参数是该适配器处理的提供方路由列表。`GenerateOptions.provider` 选择已注册的适配器,`GenerateOptions.model` 则传入由适配器拥有、无需在生命周期启动时注册的模型 id。适配器能够向选择器公布模型选项时,请覆写 `listModels()`。
128
+
129
+ ## 在 cordis.yml 中使用
130
+
131
+ ```yaml
132
+ - id: my-llm
133
+ name: './src/my-llm-adapter.ts'
134
+ config:
135
+ apiKey: !!js process.env.MY_API_KEY
136
+ providers:
137
+ - my-provider
138
+
139
+ - id: agent-loop
140
+ name: '@deepseek-ai/dsh-agent-loop'
141
+ config:
142
+ agents:
143
+ - id: main
144
+ provider: my-provider
145
+ model: my-model-v1
146
+ ```
147
+
148
+ ## 实战参考
149
+
150
+ 仓库中包含以下两个完整实现:
151
+
152
+ - `packages/llm/llm-deepseek/` — 使用 Messages API 的 DeepSeek 适配器
153
+ - `packages/llm/llm-pi-ai/` — Pi AI 适配器(不同的 API 格式)
154
+
155
+ 对比这两个已交付的适配器,可以看到同一套 harness 契约如何在不同提供方 SDK 之上实现。
156
+
157
+ ## 错误处理
158
+
159
+ 适配器应通过带稳定 code 的 `LlmError` 抛出传输和协议故障。`new LlmError` 只接受 `LLM_FAILURE_CODES` 中的内置 code;适配器自己的 code 通过 `LlmError.fromFailure` 抛出。agent loop(智能体循环)会保留该错误及其 code,用于诊断和策略处理。不要依赖普通 `Error` 被自动转换。每个提供方 HTTP 请求还必须合并 `attributionHeaders()`,并传递 `options.signal`。
160
+
161
+ ```ts
162
+ import {
163
+ attributionHeaders,
164
+ LlmAdapter,
165
+ LlmError,
166
+ type GenerateOptions,
167
+ type StreamChunk,
168
+ } from '@deepseek-ai/dsh-llm'
169
+
170
+ class HttpAdapter extends LlmAdapter {
171
+ constructor(private readonly endpoint: string) {
172
+ super()
173
+ }
174
+
175
+ async *stream(options: GenerateOptions): AsyncIterable<StreamChunk> {
176
+ const response = await fetch(this.endpoint, {
177
+ method: 'POST',
178
+ headers: {
179
+ 'content-type': 'application/json',
180
+ ...attributionHeaders(),
181
+ },
182
+ body: JSON.stringify({ model: options.model, messages: options.messages }),
183
+ ...options.signal ? { signal: options.signal } : {},
184
+ })
185
+ if (!response.ok) {
186
+ throw LlmError.fromFailure({ message: `Provider API error: ${response.status}`, code: 'PROVIDER_HTTP_ERROR', status: response.status })
187
+ }
188
+ // A real adapter parses the response and emits the complete chunk sequence.
189
+ yield { type: 'finish', reason: { kind: 'stop' } }
190
+ }
191
+ }
192
+ ```