@opencode/ai 0.0.0-reserved → 2.0.0

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 (288) hide show
  1. package/README.md +879 -2
  2. package/dist/cache-policy.d.ts +2 -0
  3. package/dist/cache-policy.js +129 -0
  4. package/dist/image-client.d.ts +19 -0
  5. package/dist/image-client.js +28 -0
  6. package/dist/image.d.ts +110 -0
  7. package/dist/image.js +103 -0
  8. package/dist/index.d.ts +18 -0
  9. package/dist/index.js +12 -0
  10. package/dist/llm.d.ts +252 -0
  11. package/dist/llm.js +74 -0
  12. package/dist/protocols/alibaba-chat.d.ts +225 -0
  13. package/dist/protocols/alibaba-chat.js +75 -0
  14. package/dist/protocols/alibaba-messages.d.ts +350 -0
  15. package/dist/protocols/alibaba-messages.js +40 -0
  16. package/dist/protocols/alibaba-responses.d.ts +255 -0
  17. package/dist/protocols/alibaba-responses.js +80 -0
  18. package/dist/protocols/anthropic-messages.d.ts +980 -0
  19. package/dist/protocols/anthropic-messages.js +1460 -0
  20. package/dist/protocols/bedrock-converse.d.ts +499 -0
  21. package/dist/protocols/bedrock-converse.js +643 -0
  22. package/dist/protocols/bedrock-event-stream.d.ts +9 -0
  23. package/dist/protocols/bedrock-event-stream.js +97 -0
  24. package/dist/protocols/gemini.d.ts +285 -0
  25. package/dist/protocols/gemini.js +671 -0
  26. package/dist/protocols/google-images.d.ts +30 -0
  27. package/dist/protocols/google-images.js +181 -0
  28. package/dist/protocols/index.d.ts +12 -0
  29. package/dist/protocols/index.js +12 -0
  30. package/dist/protocols/meta-images.d.ts +26 -0
  31. package/dist/protocols/meta-images.js +89 -0
  32. package/dist/protocols/meta-messages.d.ts +356 -0
  33. package/dist/protocols/meta-messages.js +41 -0
  34. package/dist/protocols/meta-responses.d.ts +473 -0
  35. package/dist/protocols/meta-responses.js +173 -0
  36. package/dist/protocols/mistral-chat.d.ts +540 -0
  37. package/dist/protocols/mistral-chat.js +624 -0
  38. package/dist/protocols/open-responses-channel.d.ts +25 -0
  39. package/dist/protocols/open-responses-channel.js +141 -0
  40. package/dist/protocols/open-responses-continuation.d.ts +16 -0
  41. package/dist/protocols/open-responses-continuation.js +170 -0
  42. package/dist/protocols/open-responses.d.ts +1715 -0
  43. package/dist/protocols/open-responses.js +1228 -0
  44. package/dist/protocols/openai-chat.d.ts +860 -0
  45. package/dist/protocols/openai-chat.js +966 -0
  46. package/dist/protocols/openai-compatible-chat.d.ts +109 -0
  47. package/dist/protocols/openai-compatible-chat.js +19 -0
  48. package/dist/protocols/openai-compatible-responses.d.ts +172 -0
  49. package/dist/protocols/openai-compatible-responses.js +18 -0
  50. package/dist/protocols/openai-images.d.ts +32 -0
  51. package/dist/protocols/openai-images.js +183 -0
  52. package/dist/protocols/openai-responses.d.ts +1389 -0
  53. package/dist/protocols/openai-responses.js +260 -0
  54. package/dist/protocols/shared.d.ts +193 -0
  55. package/dist/protocols/shared.js +290 -0
  56. package/dist/protocols/utils/bedrock-auth.d.ts +60 -0
  57. package/dist/protocols/utils/bedrock-auth.js +85 -0
  58. package/dist/protocols/utils/bedrock-cache.d.ts +19 -0
  59. package/dist/protocols/utils/bedrock-cache.js +49 -0
  60. package/dist/protocols/utils/bedrock-media.d.ts +55 -0
  61. package/dist/protocols/utils/bedrock-media.js +73 -0
  62. package/dist/protocols/utils/cache.d.ts +6 -0
  63. package/dist/protocols/utils/cache.js +5 -0
  64. package/dist/protocols/utils/gemini-tool-schema.d.ts +2 -0
  65. package/dist/protocols/utils/gemini-tool-schema.js +103 -0
  66. package/dist/protocols/utils/image-input.d.ts +21 -0
  67. package/dist/protocols/utils/image-input.js +20 -0
  68. package/dist/protocols/utils/lifecycle.d.ts +24 -0
  69. package/dist/protocols/utils/lifecycle.js +72 -0
  70. package/dist/protocols/utils/meta-image.d.ts +2 -0
  71. package/dist/protocols/utils/meta-image.js +13 -0
  72. package/dist/protocols/utils/open-responses-options.d.ts +56 -0
  73. package/dist/protocols/utils/open-responses-options.js +61 -0
  74. package/dist/protocols/utils/openai-image.d.ts +5 -0
  75. package/dist/protocols/utils/openai-image.js +18 -0
  76. package/dist/protocols/utils/openai-options.d.ts +16 -0
  77. package/dist/protocols/utils/openai-options.js +14 -0
  78. package/dist/protocols/utils/partial-json-options.d.ts +62 -0
  79. package/dist/protocols/utils/partial-json-options.js +52 -0
  80. package/dist/protocols/utils/partial-json.d.ts +8 -0
  81. package/dist/protocols/utils/partial-json.js +279 -0
  82. package/dist/protocols/utils/responses-checkpoint.d.ts +4 -0
  83. package/dist/protocols/utils/responses-checkpoint.js +107 -0
  84. package/dist/protocols/utils/responses-compaction.d.ts +4 -0
  85. package/dist/protocols/utils/responses-compaction.js +129 -0
  86. package/dist/protocols/utils/responses-hosted-tools.d.ts +26 -0
  87. package/dist/protocols/utils/responses-hosted-tools.js +32 -0
  88. package/dist/protocols/utils/tool-schema.d.ts +8 -0
  89. package/dist/protocols/utils/tool-schema.js +54 -0
  90. package/dist/protocols/utils/tool-stream.d.ts +710 -0
  91. package/dist/protocols/utils/tool-stream.js +155 -0
  92. package/dist/protocols/xai-images.d.ts +26 -0
  93. package/dist/protocols/xai-images.js +106 -0
  94. package/dist/protocols/xai-responses.d.ts +250 -0
  95. package/dist/protocols/xai-responses.js +81 -0
  96. package/dist/protocols/zai-chat.d.ts +202 -0
  97. package/dist/protocols/zai-chat.js +49 -0
  98. package/dist/protocols/zai-images.d.ts +22 -0
  99. package/dist/protocols/zai-images.js +79 -0
  100. package/dist/protocols/zai-messages.d.ts +344 -0
  101. package/dist/protocols/zai-messages.js +27 -0
  102. package/dist/protocols.d.ts +1 -0
  103. package/dist/protocols.js +1 -0
  104. package/dist/provider-error.d.ts +15 -0
  105. package/dist/provider-error.js +125 -0
  106. package/dist/provider-package.d.ts +15 -0
  107. package/dist/provider-package.js +1 -0
  108. package/dist/provider.d.ts +23 -0
  109. package/dist/provider.js +2 -0
  110. package/dist/providers/alibaba/chat.d.ts +1 -0
  111. package/dist/providers/alibaba/chat.js +1 -0
  112. package/dist/providers/alibaba/messages.d.ts +3 -0
  113. package/dist/providers/alibaba/messages.js +1 -0
  114. package/dist/providers/alibaba/responses.d.ts +3 -0
  115. package/dist/providers/alibaba/responses.js +1 -0
  116. package/dist/providers/alibaba.d.ts +711 -0
  117. package/dist/providers/alibaba.js +94 -0
  118. package/dist/providers/amazon-bedrock/mantle/chat.d.ts +2 -0
  119. package/dist/providers/amazon-bedrock/mantle/chat.js +1 -0
  120. package/dist/providers/amazon-bedrock/mantle/responses.d.ts +2 -0
  121. package/dist/providers/amazon-bedrock/mantle/responses.js +1 -0
  122. package/dist/providers/amazon-bedrock/mantle.d.ts +2 -0
  123. package/dist/providers/amazon-bedrock/mantle.js +1 -0
  124. package/dist/providers/amazon-bedrock-mantle.d.ts +313 -0
  125. package/dist/providers/amazon-bedrock-mantle.js +79 -0
  126. package/dist/providers/amazon-bedrock.d.ts +173 -0
  127. package/dist/providers/amazon-bedrock.js +41 -0
  128. package/dist/providers/anthropic-compatible.d.ts +309 -0
  129. package/dist/providers/anthropic-compatible.js +50 -0
  130. package/dist/providers/anthropic.d.ts +307 -0
  131. package/dist/providers/anthropic.js +42 -0
  132. package/dist/providers/azure/chat.d.ts +2 -0
  133. package/dist/providers/azure/chat.js +1 -0
  134. package/dist/providers/azure/responses.d.ts +2 -0
  135. package/dist/providers/azure/responses.js +1 -0
  136. package/dist/providers/azure.d.ts +598 -0
  137. package/dist/providers/azure.js +115 -0
  138. package/dist/providers/baseten.d.ts +228 -0
  139. package/dist/providers/baseten.js +38 -0
  140. package/dist/providers/cerebras.d.ts +227 -0
  141. package/dist/providers/cerebras.js +40 -0
  142. package/dist/providers/cloudflare-ai-gateway.d.ts +237 -0
  143. package/dist/providers/cloudflare-ai-gateway.js +65 -0
  144. package/dist/providers/cloudflare-workers-ai.d.ts +231 -0
  145. package/dist/providers/cloudflare-workers-ai.js +51 -0
  146. package/dist/providers/deepinfra.d.ts +227 -0
  147. package/dist/providers/deepinfra.js +43 -0
  148. package/dist/providers/deepseek.d.ts +228 -0
  149. package/dist/providers/deepseek.js +41 -0
  150. package/dist/providers/fireworks.d.ts +228 -0
  151. package/dist/providers/fireworks.js +38 -0
  152. package/dist/providers/google-vertex/chat.d.ts +2 -0
  153. package/dist/providers/google-vertex/chat.js +1 -0
  154. package/dist/providers/google-vertex/gemini.d.ts +2 -0
  155. package/dist/providers/google-vertex/gemini.js +1 -0
  156. package/dist/providers/google-vertex/messages.d.ts +2 -0
  157. package/dist/providers/google-vertex/messages.js +1 -0
  158. package/dist/providers/google-vertex/responses.d.ts +2 -0
  159. package/dist/providers/google-vertex/responses.js +1 -0
  160. package/dist/providers/google-vertex-chat.d.ts +132 -0
  161. package/dist/providers/google-vertex-chat.js +55 -0
  162. package/dist/providers/google-vertex-messages.d.ts +306 -0
  163. package/dist/providers/google-vertex-messages.js +75 -0
  164. package/dist/providers/google-vertex-responses.d.ts +197 -0
  165. package/dist/providers/google-vertex-responses.js +56 -0
  166. package/dist/providers/google-vertex-shared.d.ts +22 -0
  167. package/dist/providers/google-vertex-shared.js +72 -0
  168. package/dist/providers/google-vertex.d.ts +119 -0
  169. package/dist/providers/google-vertex.js +98 -0
  170. package/dist/providers/google.d.ts +114 -0
  171. package/dist/providers/google.js +42 -0
  172. package/dist/providers/groq.d.ts +314 -0
  173. package/dist/providers/groq.js +81 -0
  174. package/dist/providers/index.d.ts +31 -0
  175. package/dist/providers/index.js +31 -0
  176. package/dist/providers/meta/chat.d.ts +2 -0
  177. package/dist/providers/meta/chat.js +1 -0
  178. package/dist/providers/meta/messages.d.ts +2 -0
  179. package/dist/providers/meta/messages.js +1 -0
  180. package/dist/providers/meta/responses.d.ts +2 -0
  181. package/dist/providers/meta/responses.js +1 -0
  182. package/dist/providers/meta.d.ts +636 -0
  183. package/dist/providers/meta.js +113 -0
  184. package/dist/providers/minimax/chat.d.ts +4 -0
  185. package/dist/providers/minimax/chat.js +8 -0
  186. package/dist/providers/minimax/messages.d.ts +1 -0
  187. package/dist/providers/minimax/messages.js +1 -0
  188. package/dist/providers/minimax/responses.d.ts +4 -0
  189. package/dist/providers/minimax/responses.js +8 -0
  190. package/dist/providers/minimax.d.ts +598 -0
  191. package/dist/providers/minimax.js +89 -0
  192. package/dist/providers/mistral.d.ts +207 -0
  193. package/dist/providers/mistral.js +28 -0
  194. package/dist/providers/moonshot/chat.d.ts +1 -0
  195. package/dist/providers/moonshot/chat.js +1 -0
  196. package/dist/providers/moonshot/messages.d.ts +4 -0
  197. package/dist/providers/moonshot/messages.js +8 -0
  198. package/dist/providers/moonshot/responses.d.ts +4 -0
  199. package/dist/providers/moonshot/responses.js +8 -0
  200. package/dist/providers/moonshot.d.ts +596 -0
  201. package/dist/providers/moonshot.js +90 -0
  202. package/dist/providers/open-responses-options.d.ts +6 -0
  203. package/dist/providers/open-responses-options.js +1 -0
  204. package/dist/providers/openai/chat.d.ts +2 -0
  205. package/dist/providers/openai/chat.js +1 -0
  206. package/dist/providers/openai/responses.d.ts +2 -0
  207. package/dist/providers/openai/responses.js +1 -0
  208. package/dist/providers/openai-compatible/responses.d.ts +1 -0
  209. package/dist/providers/openai-compatible/responses.js +1 -0
  210. package/dist/providers/openai-compatible-responses.d.ts +195 -0
  211. package/dist/providers/openai-compatible-responses.js +32 -0
  212. package/dist/providers/openai-compatible.d.ts +130 -0
  213. package/dist/providers/openai-compatible.js +33 -0
  214. package/dist/providers/openai-options.d.ts +26 -0
  215. package/dist/providers/openai-options.js +41 -0
  216. package/dist/providers/openai.d.ts +404 -0
  217. package/dist/providers/openai.js +82 -0
  218. package/dist/providers/openrouter.d.ts +563 -0
  219. package/dist/providers/openrouter.js +114 -0
  220. package/dist/providers/togetherai.d.ts +227 -0
  221. package/dist/providers/togetherai.js +40 -0
  222. package/dist/providers/xai.d.ts +163 -0
  223. package/dist/providers/xai.js +88 -0
  224. package/dist/providers/zai/chat.d.ts +1 -0
  225. package/dist/providers/zai/chat.js +1 -0
  226. package/dist/providers/zai-coding-plan/chat.d.ts +1 -0
  227. package/dist/providers/zai-coding-plan/chat.js +1 -0
  228. package/dist/providers/zai-coding-plan/messages.d.ts +4 -0
  229. package/dist/providers/zai-coding-plan/messages.js +8 -0
  230. package/dist/providers/zai-coding-plan/responses.d.ts +4 -0
  231. package/dist/providers/zai-coding-plan/responses.js +8 -0
  232. package/dist/providers/zai-coding-plan.d.ts +577 -0
  233. package/dist/providers/zai-coding-plan.js +63 -0
  234. package/dist/providers/zai.d.ts +149 -0
  235. package/dist/providers/zai.js +53 -0
  236. package/dist/providers.d.ts +1 -0
  237. package/dist/providers.js +1 -0
  238. package/dist/route/auth-options.d.ts +34 -0
  239. package/dist/route/auth-options.js +14 -0
  240. package/dist/route/auth.d.ts +51 -0
  241. package/dist/route/auth.js +87 -0
  242. package/dist/route/client.d.ts +430 -0
  243. package/dist/route/client.js +307 -0
  244. package/dist/route/endpoint.d.ts +28 -0
  245. package/dist/route/endpoint.js +21 -0
  246. package/dist/route/executor.d.ts +27 -0
  247. package/dist/route/executor.js +183 -0
  248. package/dist/route/framing.d.ts +29 -0
  249. package/dist/route/framing.js +14 -0
  250. package/dist/route/index.d.ts +16 -0
  251. package/dist/route/index.js +9 -0
  252. package/dist/route/protocol.d.ts +76 -0
  253. package/dist/route/protocol.js +16 -0
  254. package/dist/route/transport/http.d.ts +34 -0
  255. package/dist/route/transport/http.js +68 -0
  256. package/dist/route/transport/index.d.ts +41 -0
  257. package/dist/route/transport/index.js +4 -0
  258. package/dist/route/transport/websocket-channel.d.ts +57 -0
  259. package/dist/route/transport/websocket-channel.js +1 -0
  260. package/dist/route/transport/websocket.d.ts +56 -0
  261. package/dist/route/transport/websocket.js +370 -0
  262. package/dist/route.d.ts +1 -0
  263. package/dist/route.js +1 -0
  264. package/dist/schema/errors.d.ts +170 -0
  265. package/dist/schema/errors.js +131 -0
  266. package/dist/schema/events.d.ts +8123 -0
  267. package/dist/schema/events.js +550 -0
  268. package/dist/schema/ids.d.ts +17 -0
  269. package/dist/schema/ids.js +10 -0
  270. package/dist/schema/index.d.ts +5 -0
  271. package/dist/schema/index.js +5 -0
  272. package/dist/schema/messages.d.ts +646 -0
  273. package/dist/schema/messages.js +301 -0
  274. package/dist/schema/options.d.ts +159 -0
  275. package/dist/schema/options.js +189 -0
  276. package/dist/testing.d.ts +1693 -0
  277. package/dist/testing.js +129 -0
  278. package/dist/tool-history.d.ts +2 -0
  279. package/dist/tool-history.js +84 -0
  280. package/dist/tool-runtime.d.ts +15 -0
  281. package/dist/tool-runtime.js +62 -0
  282. package/dist/tool.d.ts +136 -0
  283. package/dist/tool.js +66 -0
  284. package/dist/utils/record.d.ts +2 -0
  285. package/dist/utils/record.js +2 -0
  286. package/dist/utils/sanitize.d.ts +1 -0
  287. package/dist/utils/sanitize.js +12 -0
  288. package/package.json +43 -10
@@ -0,0 +1,103 @@
1
+ import { isRecord } from "../../utils/record.js";
2
+ // Gemini accepts a JSON Schema-like dialect for tool parameters, but rejects a
3
+ // handful of common JSON Schema shapes. Keep this projection isolated so the
4
+ // Gemini protocol file still reads like the other protocol modules.
5
+ const SCHEMA_INTENT_KEYS = [
6
+ "type",
7
+ "properties",
8
+ "items",
9
+ "prefixItems",
10
+ "enum",
11
+ "const",
12
+ "$ref",
13
+ "additionalProperties",
14
+ "patternProperties",
15
+ "required",
16
+ "not",
17
+ "if",
18
+ "then",
19
+ "else",
20
+ ];
21
+ const hasCombiner = (schema) => isRecord(schema) && (Array.isArray(schema.anyOf) || Array.isArray(schema.oneOf) || Array.isArray(schema.allOf));
22
+ const hasSchemaIntent = (schema) => isRecord(schema) && (hasCombiner(schema) || SCHEMA_INTENT_KEYS.some((key) => key in schema));
23
+ const sanitizeNode = (schema) => {
24
+ if (!isRecord(schema))
25
+ return Array.isArray(schema) ? schema.map(sanitizeNode) : schema;
26
+ const result = Object.fromEntries(Object.entries(schema).map(([key, value]) => [
27
+ key,
28
+ key === "enum" && Array.isArray(value) ? value.map(String) : sanitizeNode(value),
29
+ ]));
30
+ if (Array.isArray(result.enum) && (result.type === "integer" || result.type === "number"))
31
+ result.type = "string";
32
+ const properties = result.properties;
33
+ if (result.type === "object" && isRecord(properties) && Array.isArray(result.required)) {
34
+ result.required = result.required.filter((field) => typeof field === "string" && field in properties);
35
+ }
36
+ if (result.type === "array" && !hasCombiner(result)) {
37
+ result.items = result.items ?? {};
38
+ if (isRecord(result.items) && !hasSchemaIntent(result.items))
39
+ result.items = { ...result.items, type: "string" };
40
+ }
41
+ if (typeof result.type === "string" && result.type !== "object" && !hasCombiner(result)) {
42
+ delete result.properties;
43
+ delete result.required;
44
+ }
45
+ return result;
46
+ };
47
+ const emptyObjectSchema = (schema) => schema.type === "object" &&
48
+ (!isRecord(schema.properties) || Object.keys(schema.properties).length === 0) &&
49
+ !schema.additionalProperties;
50
+ const projectNode = (schema, nested = false) => {
51
+ if (!isRecord(schema))
52
+ return undefined;
53
+ if (!nested && emptyObjectSchema(schema))
54
+ return undefined;
55
+ const types = Array.isArray(schema.type) ? schema.type.filter((type) => type !== "null") : undefined;
56
+ const anyOf = Array.isArray(schema.anyOf) ? schema.anyOf : undefined;
57
+ const hasNullAnyOf = anyOf?.some((item) => isRecord(item) && item.type === "null") ?? false;
58
+ const anyOfTypes = hasNullAnyOf ? anyOf?.filter((item) => !isRecord(item) || item.type !== "null") : anyOf;
59
+ const flattenedAnyOf = hasNullAnyOf && anyOfTypes?.length === 1 ? projectNode(anyOfTypes[0], true) : undefined;
60
+ const result = Object.fromEntries([
61
+ ["description", schema.description],
62
+ ["required", schema.required],
63
+ ["format", schema.format],
64
+ ["type", types ? (types.length === 0 ? "null" : undefined) : schema.type],
65
+ [
66
+ "nullable",
67
+ (Array.isArray(schema.type) && schema.type.includes("null") && types && types.length > 0) || hasNullAnyOf
68
+ ? true
69
+ : undefined,
70
+ ],
71
+ ["enum", schema.const !== undefined ? [schema.const] : schema.enum],
72
+ [
73
+ "properties",
74
+ isRecord(schema.properties)
75
+ ? Object.fromEntries(Object.entries(schema.properties).map(([key, value]) => [key, projectNode(value, true)]))
76
+ : undefined,
77
+ ],
78
+ [
79
+ "items",
80
+ Array.isArray(schema.items)
81
+ ? schema.items.map((item) => projectNode(item, true))
82
+ : schema.items === undefined
83
+ ? undefined
84
+ : projectNode(schema.items, true),
85
+ ],
86
+ ["allOf", Array.isArray(schema.allOf) ? schema.allOf.map((item) => projectNode(item, true)) : undefined],
87
+ [
88
+ "anyOf",
89
+ anyOfTypes
90
+ ? hasNullAnyOf && anyOfTypes.length === 1
91
+ ? undefined
92
+ : anyOfTypes.map((item) => projectNode(item, true))
93
+ : types && types.length > 0
94
+ ? types.map((type) => ({ type }))
95
+ : undefined,
96
+ ],
97
+ ["oneOf", Array.isArray(schema.oneOf) ? schema.oneOf.map((item) => projectNode(item, true)) : undefined],
98
+ ["minLength", schema.minLength],
99
+ ].filter((entry) => entry[1] !== undefined));
100
+ return flattenedAnyOf ? { ...result, ...flattenedAnyOf } : result;
101
+ };
102
+ export const convert = (schema) => projectNode(sanitizeNode(schema));
103
+ export * as GeminiToolSchema from "./gemini-tool-schema.js";
@@ -0,0 +1,21 @@
1
+ import { Effect } from "effect";
2
+ import type { ImageInput } from "../../image.js";
3
+ import { AIError } from "../../schema/index.js";
4
+ export declare const dataUrl: (input: Extract<ImageInput, {
5
+ readonly type: "bytes";
6
+ }>) => string;
7
+ export declare const decodeDataUrl: (url: string) => Effect.Effect<{
8
+ readonly mediaType: string;
9
+ readonly data: Uint8Array;
10
+ } | undefined, AIError>;
11
+ export declare const invalidImageInput: (message: string, cause?: unknown) => AIError;
12
+ export declare const ImageInputs: {
13
+ readonly dataUrl: (input: Extract<ImageInput, {
14
+ readonly type: "bytes";
15
+ }>) => string;
16
+ readonly decodeDataUrl: (url: string) => Effect.Effect<{
17
+ readonly mediaType: string;
18
+ readonly data: Uint8Array;
19
+ } | undefined, AIError>;
20
+ readonly invalid: (message: string, cause?: unknown) => AIError;
21
+ };
@@ -0,0 +1,20 @@
1
+ import { Effect, Encoding } from "effect";
2
+ import { InvalidRequestError, AIError } from "../../schema/index.js";
3
+ const invalid = (message, cause) => new AIError({
4
+ reason: new InvalidRequestError({ message, cause }),
5
+ });
6
+ export const dataUrl = (input) => `data:${input.mediaType};base64,${Encoding.encodeBase64(input.data)}`;
7
+ export const decodeDataUrl = (url) => {
8
+ if (!url.startsWith("data:"))
9
+ return Effect.undefined;
10
+ const match = /^data:([^;,]+);base64,(.*)$/s.exec(url);
11
+ if (!match)
12
+ return Effect.fail(invalid("Image data URLs must contain a MIME type and base64 data"));
13
+ return Effect.fromResult(Encoding.decodeBase64(match[2])).pipe(Effect.mapError((cause) => invalid("Image data URL contains invalid base64 data", cause)), Effect.map((data) => ({ mediaType: match[1], data })));
14
+ };
15
+ export const invalidImageInput = invalid;
16
+ export const ImageInputs = {
17
+ dataUrl,
18
+ decodeDataUrl,
19
+ invalid: invalidImageInput,
20
+ };
@@ -0,0 +1,24 @@
1
+ import { LLMEvent, type FinishReasonDetails, type ProviderMetadata, type Usage } from "../../schema/index.js";
2
+ export interface State {
3
+ readonly stepStarted: boolean;
4
+ readonly text: ReadonlySet<string>;
5
+ readonly reasoning: ReadonlySet<string>;
6
+ }
7
+ export declare const initial: () => State;
8
+ export declare const stepStart: (state: State, events: LLMEvent[]) => State;
9
+ export declare const textStart: (state: State, events: LLMEvent[], id: string, providerMetadata?: ProviderMetadata) => State;
10
+ export declare const textDelta: (state: State, events: LLMEvent[], id: string, text: string, providerMetadata?: ProviderMetadata) => State;
11
+ export declare const reasoningStart: (state: State, events: LLMEvent[], id: string, providerMetadata?: ProviderMetadata) => State;
12
+ export declare const reasoningDelta: (state: State, events: LLMEvent[], id: string, text: string, providerMetadata?: ProviderMetadata) => State;
13
+ export declare const reasoningEnd: (state: State, events: LLMEvent[], id: string, providerMetadata?: ProviderMetadata,
14
+ /** Authoritative complete value; replaces accumulated deltas when present. */
15
+ text?: string) => State;
16
+ export declare const textEnd: (state: State, events: LLMEvent[], id: string, providerMetadata?: ProviderMetadata,
17
+ /** Authoritative complete value; replaces accumulated deltas when present. */
18
+ text?: string) => State;
19
+ export declare const finish: (state: State, events: LLMEvent[], input: {
20
+ readonly reason: FinishReasonDetails;
21
+ readonly usage?: Usage;
22
+ readonly providerMetadata?: ProviderMetadata;
23
+ }) => State;
24
+ export * as Lifecycle from "./lifecycle.js";
@@ -0,0 +1,72 @@
1
+ import { LLMEvent } from "../../schema/index.js";
2
+ export const initial = () => ({ stepStarted: false, text: new Set(), reasoning: new Set() });
3
+ export const stepStart = (state, events) => {
4
+ if (state.stepStarted)
5
+ return state;
6
+ events.push(LLMEvent.stepStart({ index: 0 }));
7
+ return { ...state, stepStarted: true };
8
+ };
9
+ export const textStart = (state, events, id, providerMetadata) => {
10
+ if (state.text.has(id))
11
+ return state;
12
+ const stepped = stepStart(state, events);
13
+ events.push(LLMEvent.textStart({ id, providerMetadata }));
14
+ return { ...stepped, text: new Set([...stepped.text, id]) };
15
+ };
16
+ export const textDelta = (state, events, id, text, providerMetadata) => {
17
+ const started = textStart(state, events, id);
18
+ events.push(LLMEvent.textDelta({ id, text, providerMetadata }));
19
+ return started;
20
+ };
21
+ export const reasoningStart = (state, events, id, providerMetadata) => {
22
+ if (state.reasoning.has(id))
23
+ return state;
24
+ const stepped = stepStart(state, events);
25
+ events.push(LLMEvent.reasoningStart({ id, providerMetadata }));
26
+ return { ...stepped, reasoning: new Set([...stepped.reasoning, id]) };
27
+ };
28
+ export const reasoningDelta = (state, events, id, text, providerMetadata) => {
29
+ const started = reasoningStart(state, events, id, providerMetadata);
30
+ events.push(LLMEvent.reasoningDelta({ id, text, providerMetadata }));
31
+ return started;
32
+ };
33
+ export const reasoningEnd = (state, events, id, providerMetadata,
34
+ /** Authoritative complete value; replaces accumulated deltas when present. */
35
+ text) => {
36
+ if (!state.reasoning.has(id))
37
+ return state;
38
+ const stepped = stepStart(state, events);
39
+ events.push(LLMEvent.reasoningEnd({ id, text, providerMetadata }));
40
+ const reasoning = new Set(stepped.reasoning);
41
+ reasoning.delete(id);
42
+ return { ...stepped, reasoning };
43
+ };
44
+ export const textEnd = (state, events, id, providerMetadata,
45
+ /** Authoritative complete value; replaces accumulated deltas when present. */
46
+ text) => {
47
+ if (!state.text.has(id))
48
+ return state;
49
+ const stepped = stepStart(state, events);
50
+ events.push(LLMEvent.textEnd({ id, text, providerMetadata }));
51
+ const open = new Set(stepped.text);
52
+ open.delete(id);
53
+ return { ...stepped, text: open };
54
+ };
55
+ const closeOpenBlocks = (state, events) => {
56
+ for (const id of state.reasoning)
57
+ events.push(LLMEvent.reasoningEnd({ id }));
58
+ for (const id of state.text)
59
+ events.push(LLMEvent.textEnd({ id }));
60
+ return { ...state, text: new Set(), reasoning: new Set() };
61
+ };
62
+ export const finish = (state, events, input) => {
63
+ const stepped = closeOpenBlocks(stepStart(state, events), events);
64
+ events.push(LLMEvent.stepFinish({
65
+ index: 0,
66
+ reason: input.reason,
67
+ usage: input.usage,
68
+ providerMetadata: input.providerMetadata,
69
+ }), LLMEvent.finish(input));
70
+ return { ...stepped, stepStarted: false };
71
+ };
72
+ export * as Lifecycle from "./lifecycle.js";
@@ -0,0 +1,2 @@
1
+ export declare const mediaType: (data: Uint8Array, format?: string) => string;
2
+ export * as MetaImage from "./meta-image.js";
@@ -0,0 +1,13 @@
1
+ // Responses image items can omit output_format, including when PNG/JPEG was requested.
2
+ export const mediaType = (data, format) => {
3
+ if (format !== undefined)
4
+ return `image/${format}`;
5
+ if (data[0] === 137 && data[1] === 80 && data[2] === 78 && data[3] === 71)
6
+ return "image/png";
7
+ if (data[0] === 255 && data[1] === 216 && data[2] === 255)
8
+ return "image/jpeg";
9
+ if (new TextDecoder().decode(data.slice(0, 4)) === "RIFF" && new TextDecoder().decode(data.slice(8, 12)) === "WEBP")
10
+ return "image/webp";
11
+ return "application/octet-stream";
12
+ };
13
+ export * as MetaImage from "./meta-image.js";
@@ -0,0 +1,56 @@
1
+ import { Schema } from "effect";
2
+ import type { LLMRequest } from "../../schema/index.js";
3
+ export declare const ReasoningEfforts: readonly ["none", "minimal", "low", "medium", "high", "xhigh", "max"];
4
+ export type ReasoningEffort = (typeof ReasoningEfforts)[number] | (string & {});
5
+ export declare const ReasoningEffort: Schema.declare<ReasoningEffort, ReasoningEffort>;
6
+ export declare const TextVerbosities: readonly ["low", "medium", "high"];
7
+ export type TextVerbosity = (typeof TextVerbosities)[number] | (string & {});
8
+ export declare const TextVerbosity: Schema.declare<TextVerbosity, TextVerbosity>;
9
+ export declare const ResponseIncludables: readonly ["file_search_call.results", "web_search_call.results", "web_search_call.action.sources", "message.input_image.image_url", "computer_call_output.output.image_url", "code_interpreter_call.outputs", "reasoning.encrypted_content", "message.output_text.logprobs"];
10
+ export type ResponseIncludable = (typeof ResponseIncludables)[number] | (string & {});
11
+ export declare const ServiceTiers: readonly ["auto", "default", "flex", "priority"];
12
+ export type ServiceTier = (typeof ServiceTiers)[number] | (string & {});
13
+ export declare const ServiceTier: Schema.declare<ServiceTier, ServiceTier>;
14
+ export declare const Truncations: readonly ["auto", "disabled"];
15
+ export type Truncation = (typeof Truncations)[number];
16
+ export declare const TextVerbositySchema: Schema.declare<TextVerbosity, TextVerbosity>;
17
+ export declare const ResponseIncludableSchema: Schema.declare<ResponseIncludable, ResponseIncludable>;
18
+ export declare const ServiceTierSchema: Schema.declare<ServiceTier, ServiceTier>;
19
+ export declare const TruncationSchema: Schema.Literals<readonly ["auto", "disabled"]>;
20
+ export declare const AllowedTools: Schema.Struct<{
21
+ readonly toolNames: Schema.$Array<Schema.String>;
22
+ readonly mode: Schema.optional<Schema.Literals<readonly ["auto", "none", "required"]>>;
23
+ }>;
24
+ export type AllowedTools = typeof AllowedTools.Type;
25
+ export declare const StreamOptions: Schema.Struct<{
26
+ readonly includeObfuscation: Schema.optional<Schema.Boolean>;
27
+ }>;
28
+ export declare const Options: Schema.Struct<{
29
+ readonly store: Schema.optional<Schema.Boolean>;
30
+ readonly metadata: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
31
+ readonly safetyIdentifier: Schema.optional<Schema.String>;
32
+ readonly streamOptions: Schema.optional<Schema.Struct<{
33
+ readonly includeObfuscation: Schema.optional<Schema.Boolean>;
34
+ }>>;
35
+ readonly topLogprobs: Schema.optional<Schema.Int>;
36
+ readonly reasoningEffort: Schema.optional<Schema.declare<ReasoningEffort, ReasoningEffort>>;
37
+ readonly reasoningSummary: Schema.optional<Schema.Literals<readonly ["auto", "concise", "detailed"]>>;
38
+ readonly include: Schema.optional<Schema.$Array<Schema.declare<ResponseIncludable, ResponseIncludable>>>;
39
+ readonly textVerbosity: Schema.optional<Schema.declare<TextVerbosity, TextVerbosity>>;
40
+ readonly serviceTier: Schema.optional<Schema.declare<ServiceTier, ServiceTier>>;
41
+ readonly truncation: Schema.optional<Schema.Literals<readonly ["auto", "disabled"]>>;
42
+ readonly allowedTools: Schema.optional<Schema.Struct<{
43
+ readonly toolNames: Schema.$Array<Schema.String>;
44
+ readonly mode: Schema.optional<Schema.Literals<readonly ["auto", "none", "required"]>>;
45
+ }>>;
46
+ readonly maxToolCalls: Schema.optional<Schema.Int>;
47
+ readonly parallelToolCalls: Schema.optional<Schema.Boolean>;
48
+ }>;
49
+ export type Options = typeof Options.Type;
50
+ export type Resolved = Omit<Options, "allowedTools"> & {
51
+ readonly allowedTools?: AllowedTools & {
52
+ readonly mode: NonNullable<AllowedTools["mode"]>;
53
+ };
54
+ };
55
+ export declare const resolve: (request: LLMRequest) => Resolved;
56
+ export * as OpenResponsesOptions from "./open-responses-options.js";
@@ -0,0 +1,61 @@
1
+ import { Option, Schema } from "effect";
2
+ export const ReasoningEfforts = ["none", "minimal", "low", "medium", "high", "xhigh", "max"];
3
+ export const ReasoningEffort = Schema.declare((value) => typeof value === "string", { title: "ReasoningEffort" });
4
+ export const TextVerbosities = ["low", "medium", "high"];
5
+ export const TextVerbosity = Schema.declare((value) => typeof value === "string", { title: "TextVerbosity" });
6
+ export const ResponseIncludables = [
7
+ "file_search_call.results",
8
+ "web_search_call.results",
9
+ "web_search_call.action.sources",
10
+ "message.input_image.image_url",
11
+ "computer_call_output.output.image_url",
12
+ "code_interpreter_call.outputs",
13
+ "reasoning.encrypted_content",
14
+ "message.output_text.logprobs",
15
+ ];
16
+ export const ServiceTiers = ["auto", "default", "flex", "priority"];
17
+ export const ServiceTier = Schema.declare((value) => typeof value === "string", {
18
+ title: "ServiceTier",
19
+ });
20
+ export const Truncations = ["auto", "disabled"];
21
+ export const TextVerbositySchema = TextVerbosity;
22
+ export const ResponseIncludableSchema = Schema.declare((value) => typeof value === "string", { title: "ResponseIncludable" });
23
+ export const ServiceTierSchema = ServiceTier;
24
+ export const TruncationSchema = Schema.Literals(Truncations);
25
+ export const AllowedTools = Schema.Struct({
26
+ toolNames: Schema.Array(Schema.String),
27
+ mode: Schema.optional(Schema.Literals(["auto", "none", "required"])),
28
+ });
29
+ export const StreamOptions = Schema.Struct({
30
+ includeObfuscation: Schema.optional(Schema.Boolean),
31
+ });
32
+ export const Options = Schema.Struct({
33
+ store: Schema.optional(Schema.Boolean),
34
+ metadata: Schema.optional(Schema.Record(Schema.String, Schema.String)),
35
+ safetyIdentifier: Schema.optional(Schema.String),
36
+ streamOptions: Schema.optional(StreamOptions),
37
+ topLogprobs: Schema.optional(Schema.Int.check(Schema.isBetween({ minimum: 0, maximum: 20 }))),
38
+ reasoningEffort: Schema.optional(ReasoningEffort),
39
+ reasoningSummary: Schema.optional(Schema.Literals(["auto", "concise", "detailed"])),
40
+ include: Schema.optional(Schema.Array(ResponseIncludableSchema)),
41
+ textVerbosity: Schema.optional(TextVerbositySchema),
42
+ serviceTier: Schema.optional(ServiceTierSchema),
43
+ truncation: Schema.optional(TruncationSchema),
44
+ allowedTools: Schema.optional(AllowedTools),
45
+ maxToolCalls: Schema.optional(Schema.Int),
46
+ parallelToolCalls: Schema.optional(Schema.Boolean),
47
+ });
48
+ const decodeOptions = Schema.decodeUnknownOption(Options);
49
+ export const resolve = (request) => {
50
+ const input = Option.getOrUndefined(decodeOptions(request.providerOptions));
51
+ if (!input)
52
+ return {};
53
+ return {
54
+ ...input,
55
+ include: input.include?.length ? input.include : undefined,
56
+ allowedTools: input.allowedTools && input.allowedTools.toolNames.length > 0
57
+ ? { ...input.allowedTools, mode: input.allowedTools.mode ?? "auto" }
58
+ : undefined,
59
+ };
60
+ };
61
+ export * as OpenResponsesOptions from "./open-responses-options.js";
@@ -0,0 +1,5 @@
1
+ import { Schema } from "effect";
2
+ export declare const Size: Schema.String;
3
+ export declare const OpenAIImage: {
4
+ readonly Size: Schema.String;
5
+ };
@@ -0,0 +1,18 @@
1
+ import { Schema } from "effect";
2
+ const dimensions = (value) => {
3
+ const match = /^(\d+)x(\d+)$/.exec(value);
4
+ if (!match)
5
+ return undefined;
6
+ return { width: Number(match[1]), height: Number(match[2]) };
7
+ };
8
+ export const Size = Schema.String.check(Schema.makeFilter((value) => {
9
+ if (value === "auto")
10
+ return undefined;
11
+ const parsed = dimensions(value);
12
+ if (!parsed)
13
+ return "image size must be `auto` or `{width}x{height}`";
14
+ return parsed.width > 0 && parsed.height > 0 ? undefined : "image dimensions must be positive integers";
15
+ }));
16
+ export const OpenAIImage = {
17
+ Size,
18
+ };
@@ -0,0 +1,16 @@
1
+ import { OpenResponsesOptions } from "./open-responses-options.js";
2
+ export declare const OpenAIReasoningEfforts: readonly ["none", "minimal", "low", "medium", "high", "xhigh", "max"];
3
+ export type OpenAIReasoningEffort = OpenResponsesOptions.ReasoningEffort;
4
+ export declare const OpenAITextVerbosities: readonly ["low", "medium", "high"];
5
+ export type OpenAITextVerbosity = OpenResponsesOptions.TextVerbosity;
6
+ export declare const OpenAIResponseIncludables: readonly ["file_search_call.results", "web_search_call.results", "web_search_call.action.sources", "message.input_image.image_url", "computer_call_output.output.image_url", "code_interpreter_call.outputs", "reasoning.encrypted_content", "message.output_text.logprobs"];
7
+ export type OpenAIResponseIncludable = OpenResponsesOptions.ResponseIncludable;
8
+ export declare const OpenAIServiceTiers: readonly ["auto", "default", "flex", "priority", "scale"];
9
+ export type OpenAIServiceTier = (typeof OpenAIServiceTiers)[number] | (string & {});
10
+ export declare const OpenAIReasoningEffort: import("effect/Schema").declare<OpenResponsesOptions.ReasoningEffort, OpenResponsesOptions.ReasoningEffort>;
11
+ export declare const OpenAITextVerbosity: import("effect/Schema").declare<OpenResponsesOptions.TextVerbosity, OpenResponsesOptions.TextVerbosity>;
12
+ export declare const OpenAIResponseIncludable: import("effect/Schema").declare<OpenResponsesOptions.ResponseIncludable, OpenResponsesOptions.ResponseIncludable>;
13
+ export declare const OpenAIServiceTier: import("effect/Schema").declare<OpenResponsesOptions.ServiceTier, OpenResponsesOptions.ServiceTier>;
14
+ export declare const isReasoningEffort: (effort: unknown) => effort is OpenAIReasoningEffort;
15
+ export declare const resolve: (request: import("../../index.js").LLMRequest) => OpenResponsesOptions.Resolved;
16
+ export * as OpenAIOptions from "./openai-options.js";
@@ -0,0 +1,14 @@
1
+ import { OpenResponsesOptions } from "./open-responses-options.js";
2
+ export const OpenAIReasoningEfforts = OpenResponsesOptions.ReasoningEfforts;
3
+ export const OpenAITextVerbosities = OpenResponsesOptions.TextVerbosities;
4
+ // Mirrors OpenAI's `ResponseIncludable` union from the official SDK. Keep this
5
+ // in lockstep with `openai-node/src/resources/responses/responses.ts`.
6
+ export const OpenAIResponseIncludables = OpenResponsesOptions.ResponseIncludables;
7
+ export const OpenAIServiceTiers = [...OpenResponsesOptions.ServiceTiers, "scale"];
8
+ export const OpenAIReasoningEffort = OpenResponsesOptions.ReasoningEffort;
9
+ export const OpenAITextVerbosity = OpenResponsesOptions.TextVerbosity;
10
+ export const OpenAIResponseIncludable = OpenResponsesOptions.ResponseIncludableSchema;
11
+ export const OpenAIServiceTier = OpenResponsesOptions.ServiceTierSchema;
12
+ export const isReasoningEffort = (effort) => typeof effort === "string";
13
+ export const resolve = OpenResponsesOptions.resolve;
14
+ export * as OpenAIOptions from "./openai-options.js";
@@ -0,0 +1,62 @@
1
+ /**
2
+ * allow partial strings like `"hello \u12` to be parsed as `"hello `
3
+ */
4
+ export declare const STR = 1;
5
+ /**
6
+ * allow partial numbers like `123.` to be parsed as `123`
7
+ */
8
+ export declare const NUM = 2;
9
+ /**
10
+ * allow partial arrays like `[1, 2,` to be parsed as `[1, 2]`
11
+ */
12
+ export declare const ARR = 4;
13
+ /**
14
+ * allow partial objects like `{"a": 1, "b":` to be parsed as `{"a": 1}`
15
+ */
16
+ export declare const OBJ = 8;
17
+ /**
18
+ * allow `nu` to be parsed as `null`
19
+ */
20
+ export declare const NULL = 16;
21
+ /**
22
+ * allow `tr` to be parsed as `true`, and `fa` to be parsed as `false`
23
+ */
24
+ export declare const BOOL = 32;
25
+ /**
26
+ * allow `Na` to be parsed as `NaN`
27
+ */
28
+ export declare const NAN = 64;
29
+ /**
30
+ * allow `Inf` to be parsed as `Infinity`
31
+ */
32
+ export declare const INFINITY = 128;
33
+ /**
34
+ * allow `-Inf` to be parsed as `-Infinity`
35
+ */
36
+ export declare const _INFINITY = 256;
37
+ export declare const INF: number;
38
+ export declare const SPECIAL: number;
39
+ export declare const ATOM: number;
40
+ export declare const COLLECTION: number;
41
+ export declare const ALL: number;
42
+ /**
43
+ * Control what types you allow to be partially parsed.
44
+ * The default is to allow all types to be partially parsed, which in most cases is the best option.
45
+ */
46
+ export declare const Allow: {
47
+ STR: number;
48
+ NUM: number;
49
+ ARR: number;
50
+ OBJ: number;
51
+ NULL: number;
52
+ BOOL: number;
53
+ NAN: number;
54
+ INFINITY: number;
55
+ _INFINITY: number;
56
+ INF: number;
57
+ SPECIAL: number;
58
+ ATOM: number;
59
+ COLLECTION: number;
60
+ ALL: number;
61
+ };
62
+ export default Allow;
@@ -0,0 +1,52 @@
1
+ /*
2
+ * Adapted from partial-json by the Promplate Dev Team:
3
+ * https://github.com/promplate/partial-json-parser-js/blob/main/src/options.ts
4
+ * Licensed under the MIT License; see partial-json.ts for the complete notice.
5
+ */
6
+ /**
7
+ * allow partial strings like `"hello \u12` to be parsed as `"hello `
8
+ */
9
+ export const STR = 0b000000001;
10
+ /**
11
+ * allow partial numbers like `123.` to be parsed as `123`
12
+ */
13
+ export const NUM = 0b000000010;
14
+ /**
15
+ * allow partial arrays like `[1, 2,` to be parsed as `[1, 2]`
16
+ */
17
+ export const ARR = 0b000000100;
18
+ /**
19
+ * allow partial objects like `{"a": 1, "b":` to be parsed as `{"a": 1}`
20
+ */
21
+ export const OBJ = 0b000001000;
22
+ /**
23
+ * allow `nu` to be parsed as `null`
24
+ */
25
+ export const NULL = 0b000010000;
26
+ /**
27
+ * allow `tr` to be parsed as `true`, and `fa` to be parsed as `false`
28
+ */
29
+ export const BOOL = 0b000100000;
30
+ /**
31
+ * allow `Na` to be parsed as `NaN`
32
+ */
33
+ export const NAN = 0b001000000;
34
+ /**
35
+ * allow `Inf` to be parsed as `Infinity`
36
+ */
37
+ export const INFINITY = 0b010000000;
38
+ /**
39
+ * allow `-Inf` to be parsed as `-Infinity`
40
+ */
41
+ export const _INFINITY = 0b100000000;
42
+ export const INF = INFINITY | _INFINITY;
43
+ export const SPECIAL = NULL | BOOL | INF | NAN;
44
+ export const ATOM = STR | NUM | SPECIAL;
45
+ export const COLLECTION = ARR | OBJ;
46
+ export const ALL = ATOM | COLLECTION;
47
+ /**
48
+ * Control what types you allow to be partially parsed.
49
+ * The default is to allow all types to be partially parsed, which in most cases is the best option.
50
+ */
51
+ export const Allow = { STR, NUM, ARR, OBJ, NULL, BOOL, NAN, INFINITY, _INFINITY, INF, SPECIAL, ATOM, COLLECTION, ALL };
52
+ export default Allow;
@@ -0,0 +1,8 @@
1
+ export * from "./partial-json-options.js";
2
+ export declare class PartialJSON extends Error {
3
+ }
4
+ export declare class MalformedJSON extends Error {
5
+ }
6
+ /** Parse complete or incomplete JSON, restricted by the supplied partial-value flags. */
7
+ export declare function parseJSON(jsonString: string, allowPartial?: number): unknown;
8
+ export declare const parse: typeof parseJSON;