cerebras-cli 1.0.1 → 1.0.3

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 (313) hide show
  1. package/cerebras-cli-1.0.0.tgz +0 -0
  2. package/package.json +7 -88
  3. package/AGENTS.md +0 -27
  4. package/Dockerfile +0 -10
  5. package/bunfig.toml +0 -4
  6. package/parsers-config.ts +0 -239
  7. package/script/build.ts +0 -151
  8. package/script/postinstall.mjs +0 -122
  9. package/script/publish.ts +0 -256
  10. package/script/schema.ts +0 -47
  11. package/src/acp/README.md +0 -164
  12. package/src/acp/agent.ts +0 -812
  13. package/src/acp/session.ts +0 -70
  14. package/src/acp/types.ts +0 -22
  15. package/src/agent/agent.ts +0 -310
  16. package/src/agent/generate.txt +0 -75
  17. package/src/auth/index.ts +0 -70
  18. package/src/bun/index.ts +0 -152
  19. package/src/bus/global.ts +0 -10
  20. package/src/bus/index.ts +0 -142
  21. package/src/cli/bootstrap.ts +0 -17
  22. package/src/cli/cmd/acp.ts +0 -88
  23. package/src/cli/cmd/agent.ts +0 -165
  24. package/src/cli/cmd/auth.ts +0 -369
  25. package/src/cli/cmd/cmd.ts +0 -7
  26. package/src/cli/cmd/debug/config.ts +0 -15
  27. package/src/cli/cmd/debug/file.ts +0 -91
  28. package/src/cli/cmd/debug/index.ts +0 -41
  29. package/src/cli/cmd/debug/lsp.ts +0 -47
  30. package/src/cli/cmd/debug/ripgrep.ts +0 -83
  31. package/src/cli/cmd/debug/scrap.ts +0 -15
  32. package/src/cli/cmd/debug/snapshot.ts +0 -48
  33. package/src/cli/cmd/export.ts +0 -88
  34. package/src/cli/cmd/generate.ts +0 -38
  35. package/src/cli/cmd/github.ts +0 -1200
  36. package/src/cli/cmd/import.ts +0 -98
  37. package/src/cli/cmd/mcp.ts +0 -400
  38. package/src/cli/cmd/models.ts +0 -77
  39. package/src/cli/cmd/pr.ts +0 -112
  40. package/src/cli/cmd/run.ts +0 -342
  41. package/src/cli/cmd/serve.ts +0 -31
  42. package/src/cli/cmd/session.ts +0 -106
  43. package/src/cli/cmd/stats.ts +0 -298
  44. package/src/cli/cmd/tui/app.tsx +0 -732
  45. package/src/cli/cmd/tui/attach.ts +0 -25
  46. package/src/cli/cmd/tui/component/border.tsx +0 -21
  47. package/src/cli/cmd/tui/component/dialog-agent.tsx +0 -31
  48. package/src/cli/cmd/tui/component/dialog-command.tsx +0 -124
  49. package/src/cli/cmd/tui/component/dialog-feedback.tsx +0 -160
  50. package/src/cli/cmd/tui/component/dialog-mcp.tsx +0 -86
  51. package/src/cli/cmd/tui/component/dialog-model.tsx +0 -223
  52. package/src/cli/cmd/tui/component/dialog-notification.tsx +0 -78
  53. package/src/cli/cmd/tui/component/dialog-provider.tsx +0 -222
  54. package/src/cli/cmd/tui/component/dialog-session-list.tsx +0 -97
  55. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +0 -31
  56. package/src/cli/cmd/tui/component/dialog-status.tsx +0 -114
  57. package/src/cli/cmd/tui/component/dialog-tag.tsx +0 -44
  58. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +0 -50
  59. package/src/cli/cmd/tui/component/logo.tsx +0 -37
  60. package/src/cli/cmd/tui/component/notification-banner.tsx +0 -58
  61. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +0 -530
  62. package/src/cli/cmd/tui/component/prompt/history.tsx +0 -107
  63. package/src/cli/cmd/tui/component/prompt/index.tsx +0 -931
  64. package/src/cli/cmd/tui/context/args.tsx +0 -14
  65. package/src/cli/cmd/tui/context/directory.ts +0 -12
  66. package/src/cli/cmd/tui/context/exit.tsx +0 -23
  67. package/src/cli/cmd/tui/context/helper.tsx +0 -25
  68. package/src/cli/cmd/tui/context/keybind.tsx +0 -111
  69. package/src/cli/cmd/tui/context/kv.tsx +0 -49
  70. package/src/cli/cmd/tui/context/local.tsx +0 -339
  71. package/src/cli/cmd/tui/context/prompt.tsx +0 -18
  72. package/src/cli/cmd/tui/context/route.tsx +0 -45
  73. package/src/cli/cmd/tui/context/sdk.tsx +0 -75
  74. package/src/cli/cmd/tui/context/sync.tsx +0 -374
  75. package/src/cli/cmd/tui/context/theme/aura.json +0 -69
  76. package/src/cli/cmd/tui/context/theme/ayu.json +0 -80
  77. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +0 -233
  78. package/src/cli/cmd/tui/context/theme/catppuccin.json +0 -112
  79. package/src/cli/cmd/tui/context/theme/cobalt2.json +0 -228
  80. package/src/cli/cmd/tui/context/theme/dracula.json +0 -219
  81. package/src/cli/cmd/tui/context/theme/everforest.json +0 -241
  82. package/src/cli/cmd/tui/context/theme/flexoki.json +0 -237
  83. package/src/cli/cmd/tui/context/theme/github.json +0 -233
  84. package/src/cli/cmd/tui/context/theme/gruvbox.json +0 -95
  85. package/src/cli/cmd/tui/context/theme/kanagawa.json +0 -77
  86. package/src/cli/cmd/tui/context/theme/material.json +0 -235
  87. package/src/cli/cmd/tui/context/theme/matrix.json +0 -77
  88. package/src/cli/cmd/tui/context/theme/mercury.json +0 -252
  89. package/src/cli/cmd/tui/context/theme/monokai.json +0 -221
  90. package/src/cli/cmd/tui/context/theme/nightowl.json +0 -221
  91. package/src/cli/cmd/tui/context/theme/nord.json +0 -223
  92. package/src/cli/cmd/tui/context/theme/one-dark.json +0 -84
  93. package/src/cli/cmd/tui/context/theme/orng.json +0 -245
  94. package/src/cli/cmd/tui/context/theme/palenight.json +0 -222
  95. package/src/cli/cmd/tui/context/theme/rosepine.json +0 -234
  96. package/src/cli/cmd/tui/context/theme/solarized.json +0 -223
  97. package/src/cli/cmd/tui/context/theme/synthwave84.json +0 -226
  98. package/src/cli/cmd/tui/context/theme/tokyonight.json +0 -243
  99. package/src/cli/cmd/tui/context/theme/vercel.json +0 -245
  100. package/src/cli/cmd/tui/context/theme/vesper.json +0 -218
  101. package/src/cli/cmd/tui/context/theme/zenburn.json +0 -223
  102. package/src/cli/cmd/tui/context/theme.tsx +0 -1077
  103. package/src/cli/cmd/tui/event.ts +0 -39
  104. package/src/cli/cmd/tui/routes/home.tsx +0 -104
  105. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +0 -93
  106. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +0 -37
  107. package/src/cli/cmd/tui/routes/session/footer.tsx +0 -76
  108. package/src/cli/cmd/tui/routes/session/header.tsx +0 -183
  109. package/src/cli/cmd/tui/routes/session/index.tsx +0 -1703
  110. package/src/cli/cmd/tui/routes/session/sidebar.tsx +0 -586
  111. package/src/cli/cmd/tui/spawn.ts +0 -60
  112. package/src/cli/cmd/tui/thread.ts +0 -120
  113. package/src/cli/cmd/tui/ui/dialog-alert.tsx +0 -55
  114. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +0 -81
  115. package/src/cli/cmd/tui/ui/dialog-help.tsx +0 -36
  116. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +0 -75
  117. package/src/cli/cmd/tui/ui/dialog-select.tsx +0 -317
  118. package/src/cli/cmd/tui/ui/dialog.tsx +0 -170
  119. package/src/cli/cmd/tui/ui/spinner.ts +0 -368
  120. package/src/cli/cmd/tui/ui/toast.tsx +0 -100
  121. package/src/cli/cmd/tui/util/clipboard.ts +0 -127
  122. package/src/cli/cmd/tui/util/editor.ts +0 -32
  123. package/src/cli/cmd/tui/util/terminal.ts +0 -114
  124. package/src/cli/cmd/tui/worker.ts +0 -63
  125. package/src/cli/cmd/uninstall.ts +0 -344
  126. package/src/cli/cmd/upgrade.ts +0 -67
  127. package/src/cli/cmd/web.ts +0 -84
  128. package/src/cli/error.ts +0 -55
  129. package/src/cli/ui.ts +0 -84
  130. package/src/cli/upgrade.ts +0 -25
  131. package/src/command/index.ts +0 -79
  132. package/src/command/template/initialize.txt +0 -10
  133. package/src/command/template/review.txt +0 -73
  134. package/src/config/config.ts +0 -886
  135. package/src/config/markdown.ts +0 -41
  136. package/src/env/index.ts +0 -26
  137. package/src/file/fzf.ts +0 -124
  138. package/src/file/ignore.ts +0 -83
  139. package/src/file/index.ts +0 -326
  140. package/src/file/ripgrep.ts +0 -391
  141. package/src/file/time.ts +0 -38
  142. package/src/file/watcher.ts +0 -89
  143. package/src/flag/flag.ts +0 -28
  144. package/src/format/formatter.ts +0 -277
  145. package/src/format/index.ts +0 -137
  146. package/src/global/index.ts +0 -52
  147. package/src/id/id.ts +0 -73
  148. package/src/ide/index.ts +0 -75
  149. package/src/index.ts +0 -158
  150. package/src/installation/index.ts +0 -194
  151. package/src/lsp/client.ts +0 -215
  152. package/src/lsp/index.ts +0 -370
  153. package/src/lsp/language.ts +0 -111
  154. package/src/lsp/server.ts +0 -1327
  155. package/src/mcp/auth.ts +0 -82
  156. package/src/mcp/index.ts +0 -576
  157. package/src/mcp/oauth-callback.ts +0 -203
  158. package/src/mcp/oauth-provider.ts +0 -132
  159. package/src/notification/index.ts +0 -101
  160. package/src/patch/index.ts +0 -622
  161. package/src/permission/index.ts +0 -198
  162. package/src/plugin/index.ts +0 -95
  163. package/src/project/bootstrap.ts +0 -31
  164. package/src/project/instance.ts +0 -68
  165. package/src/project/project.ts +0 -133
  166. package/src/project/state.ts +0 -65
  167. package/src/project/vcs.ts +0 -77
  168. package/src/provider/auth.ts +0 -143
  169. package/src/provider/models-macro.ts +0 -11
  170. package/src/provider/models.ts +0 -93
  171. package/src/provider/provider.ts +0 -996
  172. package/src/provider/sdk/openai-compatible/src/README.md +0 -5
  173. package/src/provider/sdk/openai-compatible/src/index.ts +0 -2
  174. package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +0 -100
  175. package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +0 -303
  176. package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +0 -27
  177. package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +0 -18
  178. package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +0 -22
  179. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +0 -207
  180. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +0 -1713
  181. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +0 -177
  182. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +0 -1
  183. package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +0 -88
  184. package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +0 -128
  185. package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +0 -115
  186. package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +0 -65
  187. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +0 -104
  188. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +0 -103
  189. package/src/provider/transform.ts +0 -406
  190. package/src/pty/index.ts +0 -226
  191. package/src/ratelimit/index.ts +0 -185
  192. package/src/server/error.ts +0 -36
  193. package/src/server/project.ts +0 -50
  194. package/src/server/server.ts +0 -2463
  195. package/src/server/tui.ts +0 -71
  196. package/src/session/compaction.ts +0 -257
  197. package/src/session/index.ts +0 -470
  198. package/src/session/message-v2.ts +0 -641
  199. package/src/session/message.ts +0 -189
  200. package/src/session/processor.ts +0 -443
  201. package/src/session/prompt/anthropic-20250930.txt +0 -166
  202. package/src/session/prompt/anthropic.txt +0 -105
  203. package/src/session/prompt/anthropic_spoof.txt +0 -1
  204. package/src/session/prompt/beast.txt +0 -147
  205. package/src/session/prompt/build-switch.txt +0 -5
  206. package/src/session/prompt/codex.txt +0 -318
  207. package/src/session/prompt/compaction.txt +0 -12
  208. package/src/session/prompt/copilot-gpt-5.txt +0 -143
  209. package/src/session/prompt/gemini.txt +0 -155
  210. package/src/session/prompt/max-steps.txt +0 -16
  211. package/src/session/prompt/plan-reminder-anthropic.txt +0 -67
  212. package/src/session/prompt/plan.txt +0 -26
  213. package/src/session/prompt/polaris.txt +0 -107
  214. package/src/session/prompt/qwen.txt +0 -109
  215. package/src/session/prompt/summarize.txt +0 -4
  216. package/src/session/prompt/title.txt +0 -36
  217. package/src/session/prompt.ts +0 -1541
  218. package/src/session/retry.ts +0 -82
  219. package/src/session/revert.ts +0 -108
  220. package/src/session/status.ts +0 -75
  221. package/src/session/summary.ts +0 -203
  222. package/src/session/system.ts +0 -148
  223. package/src/session/todo.ts +0 -36
  224. package/src/share/share-next.ts +0 -195
  225. package/src/share/share.ts +0 -87
  226. package/src/snapshot/index.ts +0 -197
  227. package/src/storage/storage.ts +0 -226
  228. package/src/telemetry/index.ts +0 -232
  229. package/src/tool/bash.ts +0 -365
  230. package/src/tool/bash.txt +0 -128
  231. package/src/tool/batch.ts +0 -173
  232. package/src/tool/batch.txt +0 -28
  233. package/src/tool/codesearch.ts +0 -138
  234. package/src/tool/codesearch.txt +0 -12
  235. package/src/tool/edit.ts +0 -674
  236. package/src/tool/edit.txt +0 -10
  237. package/src/tool/glob.ts +0 -65
  238. package/src/tool/glob.txt +0 -6
  239. package/src/tool/grep.ts +0 -120
  240. package/src/tool/grep.txt +0 -8
  241. package/src/tool/invalid.ts +0 -17
  242. package/src/tool/ls.ts +0 -110
  243. package/src/tool/ls.txt +0 -1
  244. package/src/tool/lsp-diagnostics.ts +0 -26
  245. package/src/tool/lsp-diagnostics.txt +0 -1
  246. package/src/tool/lsp-hover.ts +0 -31
  247. package/src/tool/lsp-hover.txt +0 -1
  248. package/src/tool/multiedit.ts +0 -46
  249. package/src/tool/multiedit.txt +0 -41
  250. package/src/tool/patch.ts +0 -233
  251. package/src/tool/patch.txt +0 -1
  252. package/src/tool/read.ts +0 -217
  253. package/src/tool/read.txt +0 -12
  254. package/src/tool/registry.ts +0 -148
  255. package/src/tool/task.ts +0 -135
  256. package/src/tool/task.txt +0 -60
  257. package/src/tool/todo.ts +0 -39
  258. package/src/tool/todoread.txt +0 -14
  259. package/src/tool/todowrite.txt +0 -167
  260. package/src/tool/tool.ts +0 -66
  261. package/src/tool/webfetch.ts +0 -187
  262. package/src/tool/webfetch.txt +0 -14
  263. package/src/tool/websearch.ts +0 -150
  264. package/src/tool/websearch.txt +0 -11
  265. package/src/tool/write.ts +0 -99
  266. package/src/tool/write.txt +0 -8
  267. package/src/types/shims.d.ts +0 -3
  268. package/src/util/color.ts +0 -19
  269. package/src/util/context.ts +0 -25
  270. package/src/util/defer.ts +0 -12
  271. package/src/util/eventloop.ts +0 -20
  272. package/src/util/filesystem.ts +0 -69
  273. package/src/util/fn.ts +0 -11
  274. package/src/util/iife.ts +0 -3
  275. package/src/util/keybind.ts +0 -79
  276. package/src/util/lazy.ts +0 -11
  277. package/src/util/locale.ts +0 -81
  278. package/src/util/lock.ts +0 -98
  279. package/src/util/log.ts +0 -177
  280. package/src/util/queue.ts +0 -32
  281. package/src/util/rpc.ts +0 -42
  282. package/src/util/scrap.ts +0 -10
  283. package/src/util/signal.ts +0 -12
  284. package/src/util/timeout.ts +0 -14
  285. package/src/util/token.ts +0 -7
  286. package/src/util/wildcard.ts +0 -54
  287. package/sst-env.d.ts +0 -9
  288. package/test/bun.test.ts +0 -53
  289. package/test/config/agent-color.test.ts +0 -66
  290. package/test/config/config.test.ts +0 -503
  291. package/test/config/markdown.test.ts +0 -89
  292. package/test/file/ignore.test.ts +0 -10
  293. package/test/fixture/fixture.ts +0 -28
  294. package/test/fixture/lsp/fake-lsp-server.js +0 -77
  295. package/test/ide/ide.test.ts +0 -82
  296. package/test/keybind.test.ts +0 -317
  297. package/test/lsp/client.test.ts +0 -95
  298. package/test/patch/patch.test.ts +0 -348
  299. package/test/preload.ts +0 -38
  300. package/test/project/project.test.ts +0 -42
  301. package/test/provider/provider.test.ts +0 -1809
  302. package/test/provider/transform.test.ts +0 -305
  303. package/test/session/retry.test.ts +0 -61
  304. package/test/session/session.test.ts +0 -71
  305. package/test/snapshot/snapshot.test.ts +0 -939
  306. package/test/tool/__snapshots__/tool.test.ts.snap +0 -9
  307. package/test/tool/bash.test.ts +0 -55
  308. package/test/tool/patch.test.ts +0 -259
  309. package/test/util/iife.test.ts +0 -36
  310. package/test/util/lazy.test.ts +0 -50
  311. package/test/util/timeout.test.ts +0 -21
  312. package/test/util/wildcard.test.ts +0 -55
  313. package/tsconfig.json +0 -17
@@ -1,103 +0,0 @@
1
- import { createProviderDefinedToolFactory } from "@ai-sdk/provider-utils"
2
- import { z } from "zod/v4"
3
-
4
- export const webSearchArgsSchema = z.object({
5
- filters: z
6
- .object({
7
- allowedDomains: z.array(z.string()).optional(),
8
- })
9
- .optional(),
10
-
11
- searchContextSize: z.enum(["low", "medium", "high"]).optional(),
12
-
13
- userLocation: z
14
- .object({
15
- type: z.literal("approximate"),
16
- country: z.string().optional(),
17
- city: z.string().optional(),
18
- region: z.string().optional(),
19
- timezone: z.string().optional(),
20
- })
21
- .optional(),
22
- })
23
-
24
- export const webSearchToolFactory = createProviderDefinedToolFactory<
25
- {
26
- // Web search doesn't take input parameters - it's controlled by the prompt
27
- },
28
- {
29
- /**
30
- * Filters for the search.
31
- */
32
- filters?: {
33
- /**
34
- * Allowed domains for the search.
35
- * If not provided, all domains are allowed.
36
- * Subdomains of the provided domains are allowed as well.
37
- */
38
- allowedDomains?: string[]
39
- }
40
-
41
- /**
42
- * Search context size to use for the web search.
43
- * - high: Most comprehensive context, highest cost, slower response
44
- * - medium: Balanced context, cost, and latency (default)
45
- * - low: Least context, lowest cost, fastest response
46
- */
47
- searchContextSize?: "low" | "medium" | "high"
48
-
49
- /**
50
- * User location information to provide geographically relevant search results.
51
- */
52
- userLocation?: {
53
- /**
54
- * Type of location (always 'approximate')
55
- */
56
- type: "approximate"
57
- /**
58
- * Two-letter ISO country code (e.g., 'US', 'GB')
59
- */
60
- country?: string
61
- /**
62
- * City name (free text, e.g., 'Minneapolis')
63
- */
64
- city?: string
65
- /**
66
- * Region name (free text, e.g., 'Minnesota')
67
- */
68
- region?: string
69
- /**
70
- * IANA timezone (e.g., 'America/Chicago')
71
- */
72
- timezone?: string
73
- }
74
- }
75
- >({
76
- id: "openai.web_search",
77
- name: "web_search",
78
- inputSchema: z.object({
79
- action: z
80
- .discriminatedUnion("type", [
81
- z.object({
82
- type: z.literal("search"),
83
- query: z.string().nullish(),
84
- }),
85
- z.object({
86
- type: z.literal("open_page"),
87
- url: z.string(),
88
- }),
89
- z.object({
90
- type: z.literal("find"),
91
- url: z.string(),
92
- pattern: z.string(),
93
- }),
94
- ])
95
- .nullish(),
96
- }),
97
- })
98
-
99
- export const webSearch = (
100
- args: Parameters<typeof webSearchToolFactory>[0] = {}, // default
101
- ) => {
102
- return webSearchToolFactory(args)
103
- }
@@ -1,406 +0,0 @@
1
- import type { APICallError, ModelMessage } from "ai"
2
- import { unique } from "remeda"
3
- import type { JSONSchema } from "zod/v4/core"
4
- import type { Provider } from "./provider"
5
- import type { ModelsDev } from "./models"
6
-
7
- type Modality = NonNullable<ModelsDev.Model["modalities"]>["input"][number]
8
-
9
- function mimeToModality(mime: string): Modality | undefined {
10
- if (mime.startsWith("image/")) return "image"
11
- if (mime.startsWith("audio/")) return "audio"
12
- if (mime.startsWith("video/")) return "video"
13
- if (mime === "application/pdf") return "pdf"
14
- return undefined
15
- }
16
-
17
- export namespace ProviderTransform {
18
- function normalizeMessages(msgs: ModelMessage[], model: Provider.Model): ModelMessage[] {
19
- if (model.api.id.includes("claude")) {
20
- return msgs.map((msg) => {
21
- if ((msg.role === "assistant" || msg.role === "tool") && Array.isArray(msg.content)) {
22
- msg.content = msg.content.map((part) => {
23
- if ((part.type === "tool-call" || part.type === "tool-result") && "toolCallId" in part) {
24
- return {
25
- ...part,
26
- toolCallId: part.toolCallId.replace(/[^a-zA-Z0-9_-]/g, "_"),
27
- }
28
- }
29
- return part
30
- })
31
- }
32
- return msg
33
- })
34
- }
35
- if (model.providerID === "mistral" || model.api.id.toLowerCase().includes("mistral")) {
36
- const result: ModelMessage[] = []
37
- for (let i = 0; i < msgs.length; i++) {
38
- const msg = msgs[i]
39
- const nextMsg = msgs[i + 1]
40
-
41
- if ((msg.role === "assistant" || msg.role === "tool") && Array.isArray(msg.content)) {
42
- msg.content = msg.content.map((part) => {
43
- if ((part.type === "tool-call" || part.type === "tool-result") && "toolCallId" in part) {
44
- // Mistral requires alphanumeric tool call IDs with exactly 9 characters
45
- const normalizedId = part.toolCallId
46
- .replace(/[^a-zA-Z0-9]/g, "") // Remove non-alphanumeric characters
47
- .substring(0, 9) // Take first 9 characters
48
- .padEnd(9, "0") // Pad with zeros if less than 9 characters
49
-
50
- return {
51
- ...part,
52
- toolCallId: normalizedId,
53
- }
54
- }
55
- return part
56
- })
57
- }
58
-
59
- result.push(msg)
60
-
61
- // Fix message sequence: tool messages cannot be followed by user messages
62
- if (msg.role === "tool" && nextMsg?.role === "user") {
63
- result.push({
64
- role: "assistant",
65
- content: [
66
- {
67
- type: "text",
68
- text: "Done.",
69
- },
70
- ],
71
- })
72
- }
73
- }
74
- return result
75
- }
76
-
77
- // DeepSeek: Handle reasoning_content for tool call continuations
78
- // - With tool calls: Include reasoning_content in providerOptions so model can continue reasoning
79
- // - Without tool calls: Strip reasoning (new turn doesn't need previous reasoning)
80
- // See: https://api-docs.deepseek.com/guides/thinking_mode
81
- if (model.providerID === "deepseek" || model.api.id.toLowerCase().includes("deepseek")) {
82
- return msgs.map((msg) => {
83
- if (msg.role === "assistant" && Array.isArray(msg.content)) {
84
- const reasoningParts = msg.content.filter((part: any) => part.type === "reasoning")
85
- const hasToolCalls = msg.content.some((part: any) => part.type === "tool-call")
86
- const reasoningText = reasoningParts.map((part: any) => part.text).join("")
87
-
88
- // Filter out reasoning parts from content
89
- const filteredContent = msg.content.filter((part: any) => part.type !== "reasoning")
90
-
91
- // If this message has tool calls and reasoning, include reasoning_content
92
- // so DeepSeek can continue reasoning after tool execution
93
- if (hasToolCalls && reasoningText) {
94
- return {
95
- ...msg,
96
- content: filteredContent,
97
- providerOptions: {
98
- ...msg.providerOptions,
99
- openaiCompatible: {
100
- ...(msg.providerOptions as any)?.openaiCompatible,
101
- reasoning_content: reasoningText,
102
- },
103
- },
104
- }
105
- }
106
-
107
- // For final answers (no tool calls), just strip reasoning
108
- return {
109
- ...msg,
110
- content: filteredContent,
111
- }
112
- }
113
- return msg
114
- })
115
- }
116
-
117
- return msgs
118
- }
119
-
120
- function applyCaching(msgs: ModelMessage[], providerID: string): ModelMessage[] {
121
- const system = msgs.filter((msg) => msg.role === "system").slice(0, 2)
122
- const final = msgs.filter((msg) => msg.role !== "system").slice(-2)
123
-
124
- const providerOptions = {
125
- anthropic: {
126
- cacheControl: { type: "ephemeral" },
127
- },
128
- openrouter: {
129
- cache_control: { type: "ephemeral" },
130
- },
131
- bedrock: {
132
- cachePoint: { type: "ephemeral" },
133
- },
134
- openaiCompatible: {
135
- cache_control: { type: "ephemeral" },
136
- },
137
- }
138
-
139
- for (const msg of unique([...system, ...final])) {
140
- const shouldUseContentOptions = providerID !== "anthropic" && Array.isArray(msg.content) && msg.content.length > 0
141
-
142
- if (shouldUseContentOptions) {
143
- const lastContent = msg.content[msg.content.length - 1]
144
- if (lastContent && typeof lastContent === "object") {
145
- lastContent.providerOptions = {
146
- ...lastContent.providerOptions,
147
- ...providerOptions,
148
- }
149
- continue
150
- }
151
- }
152
-
153
- msg.providerOptions = {
154
- ...msg.providerOptions,
155
- ...providerOptions,
156
- }
157
- }
158
-
159
- return msgs
160
- }
161
-
162
- function unsupportedParts(msgs: ModelMessage[], model: Provider.Model): ModelMessage[] {
163
- return msgs.map((msg) => {
164
- if (msg.role !== "user" || !Array.isArray(msg.content)) return msg
165
-
166
- const filtered = msg.content.map((part) => {
167
- if (part.type !== "file" && part.type !== "image") return part
168
-
169
- const mime = part.type === "image" ? part.image.toString().split(";")[0].replace("data:", "") : part.mediaType
170
- const filename = part.type === "file" ? part.filename : undefined
171
- const modality = mimeToModality(mime)
172
- if (!modality) return part
173
- if (model.capabilities.input[modality]) return part
174
-
175
- const name = filename ? `"${filename}"` : modality
176
- return {
177
- type: "text" as const,
178
- text: `ERROR: Cannot read ${name} (this model does not support ${modality} input). Inform the user.`,
179
- }
180
- })
181
-
182
- return { ...msg, content: filtered }
183
- })
184
- }
185
-
186
- export function message(msgs: ModelMessage[], model: Provider.Model) {
187
- msgs = unsupportedParts(msgs, model)
188
- msgs = normalizeMessages(msgs, model)
189
- if (model.providerID === "anthropic" || model.api.id.includes("anthropic") || model.api.id.includes("claude")) {
190
- msgs = applyCaching(msgs, model.providerID)
191
- }
192
-
193
- return msgs
194
- }
195
-
196
- export function temperature(model: Provider.Model) {
197
- if (model.api.id.toLowerCase().includes("qwen")) return 0.55
198
- if (model.api.id.toLowerCase().includes("claude")) return undefined
199
- if (model.api.id.toLowerCase().includes("gemini-3-pro")) return 1.0
200
- return 0
201
- }
202
-
203
- export function topP(model: Provider.Model) {
204
- if (model.api.id.toLowerCase().includes("qwen")) return 1
205
- return undefined
206
- }
207
-
208
- export function options(
209
- model: Provider.Model,
210
- sessionID: string,
211
- providerOptions?: Record<string, any>,
212
- ): Record<string, any> {
213
- const result: Record<string, any> = {}
214
-
215
- // switch to providerID later, for now use this
216
- if (model.api.npm === "@openrouter/ai-sdk-provider") {
217
- result["usage"] = {
218
- include: true,
219
- }
220
- }
221
-
222
- if (model.providerID === "openai" || providerOptions?.setCacheKey) {
223
- result["promptCacheKey"] = sessionID
224
- }
225
-
226
- if (
227
- model.providerID === "google" ||
228
- (model.providerID.startsWith("opencode") && model.api.id.includes("gemini-3"))
229
- ) {
230
- result["thinkingConfig"] = {
231
- includeThoughts: true,
232
- }
233
- }
234
-
235
- if (model.api.id.includes("gpt-5") && !model.api.id.includes("gpt-5-chat")) {
236
- if (model.providerID.includes("codex")) {
237
- result["store"] = false
238
- }
239
-
240
- if (!model.api.id.includes("codex") && !model.api.id.includes("gpt-5-pro")) {
241
- result["reasoningEffort"] = "medium"
242
- }
243
-
244
- if (model.api.id.endsWith("gpt-5.1") && model.providerID !== "azure") {
245
- result["textVerbosity"] = "low"
246
- }
247
-
248
- if (model.providerID.startsWith("opencode")) {
249
- result["promptCacheKey"] = sessionID
250
- result["include"] = ["reasoning.encrypted_content"]
251
- result["reasoningSummary"] = "auto"
252
- }
253
- }
254
- return result
255
- }
256
-
257
- export function smallOptions(model: Provider.Model) {
258
- const options: Record<string, any> = {}
259
-
260
- if (model.providerID === "openai" || model.api.id.includes("gpt-5")) {
261
- if (model.api.id.includes("5.1")) {
262
- options["reasoningEffort"] = "low"
263
- } else {
264
- options["reasoningEffort"] = "minimal"
265
- }
266
- }
267
- if (model.providerID === "google") {
268
- options["thinkingConfig"] = {
269
- thinkingBudget: 0,
270
- }
271
- }
272
-
273
- return options
274
- }
275
-
276
- export function providerOptions(npm: string | undefined, providerID: string, options: { [x: string]: any }) {
277
- switch (npm) {
278
- case "@ai-sdk/openai":
279
- case "@ai-sdk/azure":
280
- return {
281
- ["openai" as string]: options,
282
- }
283
- case "@ai-sdk/amazon-bedrock":
284
- return {
285
- ["bedrock" as string]: options,
286
- }
287
- case "@ai-sdk/anthropic":
288
- return {
289
- ["anthropic" as string]: options,
290
- }
291
- case "@ai-sdk/google":
292
- return {
293
- ["google" as string]: options,
294
- }
295
- case "@ai-sdk/gateway":
296
- return {
297
- ["gateway" as string]: options,
298
- }
299
- case "@openrouter/ai-sdk-provider":
300
- return {
301
- ["openrouter" as string]: options,
302
- }
303
- default:
304
- return {
305
- [providerID]: options,
306
- }
307
- }
308
- }
309
-
310
- export function maxOutputTokens(
311
- npm: string,
312
- options: Record<string, any>,
313
- modelLimit: number,
314
- globalLimit: number,
315
- ): number {
316
- const modelCap = modelLimit || globalLimit
317
- const standardLimit = Math.min(modelCap, globalLimit)
318
-
319
- if (npm === "@ai-sdk/anthropic") {
320
- const thinking = options?.["thinking"]
321
- const budgetTokens = typeof thinking?.["budgetTokens"] === "number" ? thinking["budgetTokens"] : 0
322
- const enabled = thinking?.["type"] === "enabled"
323
- if (enabled && budgetTokens > 0) {
324
- // Return text tokens so that text + thinking <= model cap, preferring 32k text when possible.
325
- if (budgetTokens + standardLimit <= modelCap) {
326
- return standardLimit
327
- }
328
- return modelCap - budgetTokens
329
- }
330
- }
331
-
332
- return standardLimit
333
- }
334
-
335
- export function schema(model: Provider.Model, schema: JSONSchema.BaseSchema) {
336
- /*
337
- if (["openai", "azure"].includes(providerID)) {
338
- if (schema.type === "object" && schema.properties) {
339
- for (const [key, value] of Object.entries(schema.properties)) {
340
- if (schema.required?.includes(key)) continue
341
- schema.properties[key] = {
342
- anyOf: [
343
- value as JSONSchema.JSONSchema,
344
- {
345
- type: "null",
346
- },
347
- ],
348
- }
349
- }
350
- }
351
- }
352
- */
353
-
354
- // Convert integer enums to string enums for Google/Gemini
355
- if (model.providerID === "google" || model.api.id.includes("gemini")) {
356
- const sanitizeGemini = (obj: any): any => {
357
- if (obj === null || typeof obj !== "object") {
358
- return obj
359
- }
360
-
361
- if (Array.isArray(obj)) {
362
- return obj.map(sanitizeGemini)
363
- }
364
-
365
- const result: any = {}
366
- for (const [key, value] of Object.entries(obj)) {
367
- if (key === "enum" && Array.isArray(value)) {
368
- // Convert all enum values to strings
369
- result[key] = value.map((v) => String(v))
370
- // If we have integer type with enum, change type to string
371
- if (result.type === "integer" || result.type === "number") {
372
- result.type = "string"
373
- }
374
- } else if (typeof value === "object" && value !== null) {
375
- result[key] = sanitizeGemini(value)
376
- } else {
377
- result[key] = value
378
- }
379
- }
380
-
381
- // Filter required array to only include fields that exist in properties
382
- if (result.type === "object" && result.properties && Array.isArray(result.required)) {
383
- result.required = result.required.filter((field: any) => field in result.properties)
384
- }
385
-
386
- return result
387
- }
388
-
389
- schema = sanitizeGemini(schema)
390
- }
391
-
392
- return schema
393
- }
394
-
395
- export function error(providerID: string, error: APICallError) {
396
- let message = error.message
397
- if (providerID === "github-copilot" && message.includes("The requested model is not supported")) {
398
- return (
399
- message +
400
- "\n\nMake sure the model is enabled in your copilot settings: https://github.com/settings/copilot/features"
401
- )
402
- }
403
-
404
- return message
405
- }
406
- }