cerebras-cli 1.0.1 → 1.0.4

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 (314) hide show
  1. package/README.md +3 -5
  2. package/cerebras-cli-1.0.0.tgz +0 -0
  3. package/package.json +7 -88
  4. package/AGENTS.md +0 -27
  5. package/Dockerfile +0 -10
  6. package/bunfig.toml +0 -4
  7. package/parsers-config.ts +0 -239
  8. package/script/build.ts +0 -151
  9. package/script/postinstall.mjs +0 -122
  10. package/script/publish.ts +0 -256
  11. package/script/schema.ts +0 -47
  12. package/src/acp/README.md +0 -164
  13. package/src/acp/agent.ts +0 -812
  14. package/src/acp/session.ts +0 -70
  15. package/src/acp/types.ts +0 -22
  16. package/src/agent/agent.ts +0 -310
  17. package/src/agent/generate.txt +0 -75
  18. package/src/auth/index.ts +0 -70
  19. package/src/bun/index.ts +0 -152
  20. package/src/bus/global.ts +0 -10
  21. package/src/bus/index.ts +0 -142
  22. package/src/cli/bootstrap.ts +0 -17
  23. package/src/cli/cmd/acp.ts +0 -88
  24. package/src/cli/cmd/agent.ts +0 -165
  25. package/src/cli/cmd/auth.ts +0 -369
  26. package/src/cli/cmd/cmd.ts +0 -7
  27. package/src/cli/cmd/debug/config.ts +0 -15
  28. package/src/cli/cmd/debug/file.ts +0 -91
  29. package/src/cli/cmd/debug/index.ts +0 -41
  30. package/src/cli/cmd/debug/lsp.ts +0 -47
  31. package/src/cli/cmd/debug/ripgrep.ts +0 -83
  32. package/src/cli/cmd/debug/scrap.ts +0 -15
  33. package/src/cli/cmd/debug/snapshot.ts +0 -48
  34. package/src/cli/cmd/export.ts +0 -88
  35. package/src/cli/cmd/generate.ts +0 -38
  36. package/src/cli/cmd/github.ts +0 -1200
  37. package/src/cli/cmd/import.ts +0 -98
  38. package/src/cli/cmd/mcp.ts +0 -400
  39. package/src/cli/cmd/models.ts +0 -77
  40. package/src/cli/cmd/pr.ts +0 -112
  41. package/src/cli/cmd/run.ts +0 -342
  42. package/src/cli/cmd/serve.ts +0 -31
  43. package/src/cli/cmd/session.ts +0 -106
  44. package/src/cli/cmd/stats.ts +0 -298
  45. package/src/cli/cmd/tui/app.tsx +0 -732
  46. package/src/cli/cmd/tui/attach.ts +0 -25
  47. package/src/cli/cmd/tui/component/border.tsx +0 -21
  48. package/src/cli/cmd/tui/component/dialog-agent.tsx +0 -31
  49. package/src/cli/cmd/tui/component/dialog-command.tsx +0 -124
  50. package/src/cli/cmd/tui/component/dialog-feedback.tsx +0 -160
  51. package/src/cli/cmd/tui/component/dialog-mcp.tsx +0 -86
  52. package/src/cli/cmd/tui/component/dialog-model.tsx +0 -223
  53. package/src/cli/cmd/tui/component/dialog-notification.tsx +0 -78
  54. package/src/cli/cmd/tui/component/dialog-provider.tsx +0 -222
  55. package/src/cli/cmd/tui/component/dialog-session-list.tsx +0 -97
  56. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +0 -31
  57. package/src/cli/cmd/tui/component/dialog-status.tsx +0 -114
  58. package/src/cli/cmd/tui/component/dialog-tag.tsx +0 -44
  59. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +0 -50
  60. package/src/cli/cmd/tui/component/logo.tsx +0 -37
  61. package/src/cli/cmd/tui/component/notification-banner.tsx +0 -58
  62. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +0 -530
  63. package/src/cli/cmd/tui/component/prompt/history.tsx +0 -107
  64. package/src/cli/cmd/tui/component/prompt/index.tsx +0 -931
  65. package/src/cli/cmd/tui/context/args.tsx +0 -14
  66. package/src/cli/cmd/tui/context/directory.ts +0 -12
  67. package/src/cli/cmd/tui/context/exit.tsx +0 -23
  68. package/src/cli/cmd/tui/context/helper.tsx +0 -25
  69. package/src/cli/cmd/tui/context/keybind.tsx +0 -111
  70. package/src/cli/cmd/tui/context/kv.tsx +0 -49
  71. package/src/cli/cmd/tui/context/local.tsx +0 -339
  72. package/src/cli/cmd/tui/context/prompt.tsx +0 -18
  73. package/src/cli/cmd/tui/context/route.tsx +0 -45
  74. package/src/cli/cmd/tui/context/sdk.tsx +0 -75
  75. package/src/cli/cmd/tui/context/sync.tsx +0 -374
  76. package/src/cli/cmd/tui/context/theme/aura.json +0 -69
  77. package/src/cli/cmd/tui/context/theme/ayu.json +0 -80
  78. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +0 -233
  79. package/src/cli/cmd/tui/context/theme/catppuccin.json +0 -112
  80. package/src/cli/cmd/tui/context/theme/cobalt2.json +0 -228
  81. package/src/cli/cmd/tui/context/theme/dracula.json +0 -219
  82. package/src/cli/cmd/tui/context/theme/everforest.json +0 -241
  83. package/src/cli/cmd/tui/context/theme/flexoki.json +0 -237
  84. package/src/cli/cmd/tui/context/theme/github.json +0 -233
  85. package/src/cli/cmd/tui/context/theme/gruvbox.json +0 -95
  86. package/src/cli/cmd/tui/context/theme/kanagawa.json +0 -77
  87. package/src/cli/cmd/tui/context/theme/material.json +0 -235
  88. package/src/cli/cmd/tui/context/theme/matrix.json +0 -77
  89. package/src/cli/cmd/tui/context/theme/mercury.json +0 -252
  90. package/src/cli/cmd/tui/context/theme/monokai.json +0 -221
  91. package/src/cli/cmd/tui/context/theme/nightowl.json +0 -221
  92. package/src/cli/cmd/tui/context/theme/nord.json +0 -223
  93. package/src/cli/cmd/tui/context/theme/one-dark.json +0 -84
  94. package/src/cli/cmd/tui/context/theme/orng.json +0 -245
  95. package/src/cli/cmd/tui/context/theme/palenight.json +0 -222
  96. package/src/cli/cmd/tui/context/theme/rosepine.json +0 -234
  97. package/src/cli/cmd/tui/context/theme/solarized.json +0 -223
  98. package/src/cli/cmd/tui/context/theme/synthwave84.json +0 -226
  99. package/src/cli/cmd/tui/context/theme/tokyonight.json +0 -243
  100. package/src/cli/cmd/tui/context/theme/vercel.json +0 -245
  101. package/src/cli/cmd/tui/context/theme/vesper.json +0 -218
  102. package/src/cli/cmd/tui/context/theme/zenburn.json +0 -223
  103. package/src/cli/cmd/tui/context/theme.tsx +0 -1077
  104. package/src/cli/cmd/tui/event.ts +0 -39
  105. package/src/cli/cmd/tui/routes/home.tsx +0 -104
  106. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +0 -93
  107. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +0 -37
  108. package/src/cli/cmd/tui/routes/session/footer.tsx +0 -76
  109. package/src/cli/cmd/tui/routes/session/header.tsx +0 -183
  110. package/src/cli/cmd/tui/routes/session/index.tsx +0 -1703
  111. package/src/cli/cmd/tui/routes/session/sidebar.tsx +0 -586
  112. package/src/cli/cmd/tui/spawn.ts +0 -60
  113. package/src/cli/cmd/tui/thread.ts +0 -120
  114. package/src/cli/cmd/tui/ui/dialog-alert.tsx +0 -55
  115. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +0 -81
  116. package/src/cli/cmd/tui/ui/dialog-help.tsx +0 -36
  117. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +0 -75
  118. package/src/cli/cmd/tui/ui/dialog-select.tsx +0 -317
  119. package/src/cli/cmd/tui/ui/dialog.tsx +0 -170
  120. package/src/cli/cmd/tui/ui/spinner.ts +0 -368
  121. package/src/cli/cmd/tui/ui/toast.tsx +0 -100
  122. package/src/cli/cmd/tui/util/clipboard.ts +0 -127
  123. package/src/cli/cmd/tui/util/editor.ts +0 -32
  124. package/src/cli/cmd/tui/util/terminal.ts +0 -114
  125. package/src/cli/cmd/tui/worker.ts +0 -63
  126. package/src/cli/cmd/uninstall.ts +0 -344
  127. package/src/cli/cmd/upgrade.ts +0 -67
  128. package/src/cli/cmd/web.ts +0 -84
  129. package/src/cli/error.ts +0 -55
  130. package/src/cli/ui.ts +0 -84
  131. package/src/cli/upgrade.ts +0 -25
  132. package/src/command/index.ts +0 -79
  133. package/src/command/template/initialize.txt +0 -10
  134. package/src/command/template/review.txt +0 -73
  135. package/src/config/config.ts +0 -886
  136. package/src/config/markdown.ts +0 -41
  137. package/src/env/index.ts +0 -26
  138. package/src/file/fzf.ts +0 -124
  139. package/src/file/ignore.ts +0 -83
  140. package/src/file/index.ts +0 -326
  141. package/src/file/ripgrep.ts +0 -391
  142. package/src/file/time.ts +0 -38
  143. package/src/file/watcher.ts +0 -89
  144. package/src/flag/flag.ts +0 -28
  145. package/src/format/formatter.ts +0 -277
  146. package/src/format/index.ts +0 -137
  147. package/src/global/index.ts +0 -52
  148. package/src/id/id.ts +0 -73
  149. package/src/ide/index.ts +0 -75
  150. package/src/index.ts +0 -158
  151. package/src/installation/index.ts +0 -194
  152. package/src/lsp/client.ts +0 -215
  153. package/src/lsp/index.ts +0 -370
  154. package/src/lsp/language.ts +0 -111
  155. package/src/lsp/server.ts +0 -1327
  156. package/src/mcp/auth.ts +0 -82
  157. package/src/mcp/index.ts +0 -576
  158. package/src/mcp/oauth-callback.ts +0 -203
  159. package/src/mcp/oauth-provider.ts +0 -132
  160. package/src/notification/index.ts +0 -101
  161. package/src/patch/index.ts +0 -622
  162. package/src/permission/index.ts +0 -198
  163. package/src/plugin/index.ts +0 -95
  164. package/src/project/bootstrap.ts +0 -31
  165. package/src/project/instance.ts +0 -68
  166. package/src/project/project.ts +0 -133
  167. package/src/project/state.ts +0 -65
  168. package/src/project/vcs.ts +0 -77
  169. package/src/provider/auth.ts +0 -143
  170. package/src/provider/models-macro.ts +0 -11
  171. package/src/provider/models.ts +0 -93
  172. package/src/provider/provider.ts +0 -996
  173. package/src/provider/sdk/openai-compatible/src/README.md +0 -5
  174. package/src/provider/sdk/openai-compatible/src/index.ts +0 -2
  175. package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +0 -100
  176. package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +0 -303
  177. package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +0 -27
  178. package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +0 -18
  179. package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +0 -22
  180. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +0 -207
  181. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +0 -1713
  182. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +0 -177
  183. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +0 -1
  184. package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +0 -88
  185. package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +0 -128
  186. package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +0 -115
  187. package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +0 -65
  188. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +0 -104
  189. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +0 -103
  190. package/src/provider/transform.ts +0 -406
  191. package/src/pty/index.ts +0 -226
  192. package/src/ratelimit/index.ts +0 -185
  193. package/src/server/error.ts +0 -36
  194. package/src/server/project.ts +0 -50
  195. package/src/server/server.ts +0 -2463
  196. package/src/server/tui.ts +0 -71
  197. package/src/session/compaction.ts +0 -257
  198. package/src/session/index.ts +0 -470
  199. package/src/session/message-v2.ts +0 -641
  200. package/src/session/message.ts +0 -189
  201. package/src/session/processor.ts +0 -443
  202. package/src/session/prompt/anthropic-20250930.txt +0 -166
  203. package/src/session/prompt/anthropic.txt +0 -105
  204. package/src/session/prompt/anthropic_spoof.txt +0 -1
  205. package/src/session/prompt/beast.txt +0 -147
  206. package/src/session/prompt/build-switch.txt +0 -5
  207. package/src/session/prompt/codex.txt +0 -318
  208. package/src/session/prompt/compaction.txt +0 -12
  209. package/src/session/prompt/copilot-gpt-5.txt +0 -143
  210. package/src/session/prompt/gemini.txt +0 -155
  211. package/src/session/prompt/max-steps.txt +0 -16
  212. package/src/session/prompt/plan-reminder-anthropic.txt +0 -67
  213. package/src/session/prompt/plan.txt +0 -26
  214. package/src/session/prompt/polaris.txt +0 -107
  215. package/src/session/prompt/qwen.txt +0 -109
  216. package/src/session/prompt/summarize.txt +0 -4
  217. package/src/session/prompt/title.txt +0 -36
  218. package/src/session/prompt.ts +0 -1541
  219. package/src/session/retry.ts +0 -82
  220. package/src/session/revert.ts +0 -108
  221. package/src/session/status.ts +0 -75
  222. package/src/session/summary.ts +0 -203
  223. package/src/session/system.ts +0 -148
  224. package/src/session/todo.ts +0 -36
  225. package/src/share/share-next.ts +0 -195
  226. package/src/share/share.ts +0 -87
  227. package/src/snapshot/index.ts +0 -197
  228. package/src/storage/storage.ts +0 -226
  229. package/src/telemetry/index.ts +0 -232
  230. package/src/tool/bash.ts +0 -365
  231. package/src/tool/bash.txt +0 -128
  232. package/src/tool/batch.ts +0 -173
  233. package/src/tool/batch.txt +0 -28
  234. package/src/tool/codesearch.ts +0 -138
  235. package/src/tool/codesearch.txt +0 -12
  236. package/src/tool/edit.ts +0 -674
  237. package/src/tool/edit.txt +0 -10
  238. package/src/tool/glob.ts +0 -65
  239. package/src/tool/glob.txt +0 -6
  240. package/src/tool/grep.ts +0 -120
  241. package/src/tool/grep.txt +0 -8
  242. package/src/tool/invalid.ts +0 -17
  243. package/src/tool/ls.ts +0 -110
  244. package/src/tool/ls.txt +0 -1
  245. package/src/tool/lsp-diagnostics.ts +0 -26
  246. package/src/tool/lsp-diagnostics.txt +0 -1
  247. package/src/tool/lsp-hover.ts +0 -31
  248. package/src/tool/lsp-hover.txt +0 -1
  249. package/src/tool/multiedit.ts +0 -46
  250. package/src/tool/multiedit.txt +0 -41
  251. package/src/tool/patch.ts +0 -233
  252. package/src/tool/patch.txt +0 -1
  253. package/src/tool/read.ts +0 -217
  254. package/src/tool/read.txt +0 -12
  255. package/src/tool/registry.ts +0 -148
  256. package/src/tool/task.ts +0 -135
  257. package/src/tool/task.txt +0 -60
  258. package/src/tool/todo.ts +0 -39
  259. package/src/tool/todoread.txt +0 -14
  260. package/src/tool/todowrite.txt +0 -167
  261. package/src/tool/tool.ts +0 -66
  262. package/src/tool/webfetch.ts +0 -187
  263. package/src/tool/webfetch.txt +0 -14
  264. package/src/tool/websearch.ts +0 -150
  265. package/src/tool/websearch.txt +0 -11
  266. package/src/tool/write.ts +0 -99
  267. package/src/tool/write.txt +0 -8
  268. package/src/types/shims.d.ts +0 -3
  269. package/src/util/color.ts +0 -19
  270. package/src/util/context.ts +0 -25
  271. package/src/util/defer.ts +0 -12
  272. package/src/util/eventloop.ts +0 -20
  273. package/src/util/filesystem.ts +0 -69
  274. package/src/util/fn.ts +0 -11
  275. package/src/util/iife.ts +0 -3
  276. package/src/util/keybind.ts +0 -79
  277. package/src/util/lazy.ts +0 -11
  278. package/src/util/locale.ts +0 -81
  279. package/src/util/lock.ts +0 -98
  280. package/src/util/log.ts +0 -177
  281. package/src/util/queue.ts +0 -32
  282. package/src/util/rpc.ts +0 -42
  283. package/src/util/scrap.ts +0 -10
  284. package/src/util/signal.ts +0 -12
  285. package/src/util/timeout.ts +0 -14
  286. package/src/util/token.ts +0 -7
  287. package/src/util/wildcard.ts +0 -54
  288. package/sst-env.d.ts +0 -9
  289. package/test/bun.test.ts +0 -53
  290. package/test/config/agent-color.test.ts +0 -66
  291. package/test/config/config.test.ts +0 -503
  292. package/test/config/markdown.test.ts +0 -89
  293. package/test/file/ignore.test.ts +0 -10
  294. package/test/fixture/fixture.ts +0 -28
  295. package/test/fixture/lsp/fake-lsp-server.js +0 -77
  296. package/test/ide/ide.test.ts +0 -82
  297. package/test/keybind.test.ts +0 -317
  298. package/test/lsp/client.test.ts +0 -95
  299. package/test/patch/patch.test.ts +0 -348
  300. package/test/preload.ts +0 -38
  301. package/test/project/project.test.ts +0 -42
  302. package/test/provider/provider.test.ts +0 -1809
  303. package/test/provider/transform.test.ts +0 -305
  304. package/test/session/retry.test.ts +0 -61
  305. package/test/session/session.test.ts +0 -71
  306. package/test/snapshot/snapshot.test.ts +0 -939
  307. package/test/tool/__snapshots__/tool.test.ts.snap +0 -9
  308. package/test/tool/bash.test.ts +0 -55
  309. package/test/tool/patch.test.ts +0 -259
  310. package/test/util/iife.test.ts +0 -36
  311. package/test/util/lazy.test.ts +0 -50
  312. package/test/util/timeout.test.ts +0 -21
  313. package/test/util/wildcard.test.ts +0 -55
  314. 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
- }