@opencode/ai 2.0.15 → 2.0.17

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 (224) hide show
  1. package/README.md +441 -99
  2. package/dist/ai-client.d.ts +8 -0
  3. package/dist/ai-client.js +12 -0
  4. package/dist/experimental/evaluation-client.d.ts +3 -3
  5. package/dist/experimental/evaluation-client.js +1 -1
  6. package/dist/experimental/evaluation.js +1 -1
  7. package/dist/generation.d.ts +39 -29
  8. package/dist/generation.js +62 -36
  9. package/dist/image-client.d.ts +59 -17
  10. package/dist/image-client.js +16 -24
  11. package/dist/image.d.ts +394 -55
  12. package/dist/image.js +48 -57
  13. package/dist/index.d.ts +15 -2
  14. package/dist/index.js +10 -0
  15. package/dist/llm.d.ts +7 -5
  16. package/dist/llm.js +10 -4
  17. package/dist/media-client.d.ts +30 -0
  18. package/dist/media-client.js +51 -0
  19. package/dist/media-model.d.ts +43 -0
  20. package/dist/media-model.js +47 -0
  21. package/dist/media.d.ts +10 -9
  22. package/dist/media.js +11 -12
  23. package/dist/promise.d.ts +473 -15
  24. package/dist/promise.js +71 -13
  25. package/dist/protocols/alibaba-chat.d.ts +12 -0
  26. package/dist/protocols/alibaba-chat.js +4 -1
  27. package/dist/protocols/alibaba-messages.d.ts +1 -1
  28. package/dist/protocols/alibaba-messages.js +6 -4
  29. package/dist/protocols/alibaba-responses.d.ts +2 -2
  30. package/dist/protocols/anthropic-messages.d.ts +34 -34
  31. package/dist/protocols/anthropic-messages.js +14 -9
  32. package/dist/protocols/assemblyai-transcription.d.ts +41 -0
  33. package/dist/protocols/assemblyai-transcription.js +136 -0
  34. package/dist/protocols/bedrock-converse.d.ts +7 -0
  35. package/dist/protocols/bedrock-converse.js +39 -19
  36. package/dist/protocols/bfl-images.d.ts +38 -0
  37. package/dist/protocols/bfl-images.js +153 -0
  38. package/dist/protocols/cartesia-speech.d.ts +143 -0
  39. package/dist/protocols/cartesia-speech.js +120 -0
  40. package/dist/protocols/deepgram-speech.d.ts +135 -0
  41. package/dist/protocols/deepgram-speech.js +91 -0
  42. package/dist/protocols/deepgram-transcription.d.ts +26 -0
  43. package/dist/protocols/deepgram-transcription.js +125 -0
  44. package/dist/protocols/elevenlabs-speech.d.ts +138 -0
  45. package/dist/protocols/elevenlabs-speech.js +111 -0
  46. package/dist/protocols/fal-images.d.ts +25 -0
  47. package/dist/protocols/fal-images.js +104 -0
  48. package/dist/protocols/fal-video.d.ts +29 -0
  49. package/dist/protocols/fal-video.js +73 -0
  50. package/dist/protocols/gemini.d.ts +22 -22
  51. package/dist/protocols/gemini.js +19 -36
  52. package/dist/protocols/google-images.d.ts +3 -3
  53. package/dist/protocols/google-images.js +12 -34
  54. package/dist/protocols/google-speech.d.ts +146 -0
  55. package/dist/protocols/google-speech.js +88 -0
  56. package/dist/protocols/google-transcription.d.ts +174 -0
  57. package/dist/protocols/google-transcription.js +126 -0
  58. package/dist/protocols/google-video.d.ts +26 -0
  59. package/dist/protocols/google-video.js +142 -0
  60. package/dist/protocols/meta-images.d.ts +3 -4
  61. package/dist/protocols/meta-images.js +13 -29
  62. package/dist/protocols/meta-messages.d.ts +5 -5
  63. package/dist/protocols/meta-responses.d.ts +4 -4
  64. package/dist/protocols/meta-responses.js +6 -4
  65. package/dist/protocols/open-responses.d.ts +10 -9
  66. package/dist/protocols/open-responses.js +4 -9
  67. package/dist/protocols/openai-chat.d.ts +84 -0
  68. package/dist/protocols/openai-chat.js +28 -17
  69. package/dist/protocols/openai-compatible-chat.d.ts +12 -0
  70. package/dist/protocols/openai-compatible-responses.d.ts +2 -2
  71. package/dist/protocols/openai-images.d.ts +130 -7
  72. package/dist/protocols/openai-images.js +143 -91
  73. package/dist/protocols/openai-responses.d.ts +20 -20
  74. package/dist/protocols/openai-responses.js +31 -31
  75. package/dist/protocols/openai-speech.d.ts +136 -0
  76. package/dist/protocols/openai-speech.js +97 -0
  77. package/dist/protocols/openai-transcription.d.ts +211 -0
  78. package/dist/protocols/openai-transcription.js +202 -0
  79. package/dist/protocols/replicate-images.d.ts +28 -0
  80. package/dist/protocols/replicate-images.js +127 -0
  81. package/dist/protocols/runway-video.d.ts +38 -0
  82. package/dist/protocols/runway-video.js +140 -0
  83. package/dist/protocols/shared.d.ts +21 -17
  84. package/dist/protocols/shared.js +27 -36
  85. package/dist/protocols/stability-images.d.ts +39 -0
  86. package/dist/protocols/stability-images.js +136 -0
  87. package/dist/protocols/utils/fal-queue.d.ts +26 -0
  88. package/dist/protocols/utils/fal-queue.js +67 -0
  89. package/dist/protocols/utils/gemini-generate-content.d.ts +65 -0
  90. package/dist/protocols/utils/gemini-generate-content.js +65 -0
  91. package/dist/protocols/utils/gemini-json-schema.d.ts +3 -0
  92. package/dist/protocols/utils/gemini-json-schema.js +76 -0
  93. package/dist/protocols/utils/media-input.d.ts +23 -1
  94. package/dist/protocols/utils/media-input.js +40 -0
  95. package/dist/protocols/utils/responses-checkpoint.js +3 -7
  96. package/dist/protocols/utils/responses-compaction.d.ts +3 -1
  97. package/dist/protocols/utils/responses-compaction.js +16 -3
  98. package/dist/protocols/utils/speech-stream.d.ts +49 -0
  99. package/dist/protocols/utils/speech-stream.js +64 -0
  100. package/dist/protocols/utils/tool-schema.d.ts +2 -2
  101. package/dist/protocols/utils/tool-schema.js +62 -19
  102. package/dist/protocols/xai-images.d.ts +4 -4
  103. package/dist/protocols/xai-images.js +14 -40
  104. package/dist/protocols/xai-responses.d.ts +2 -2
  105. package/dist/protocols/xai-responses.js +1 -1
  106. package/dist/protocols/xai-video.d.ts +34 -0
  107. package/dist/protocols/xai-video.js +141 -0
  108. package/dist/protocols/zai-chat.d.ts +13 -1
  109. package/dist/protocols/zai-images.d.ts +2 -2
  110. package/dist/protocols/zai-images.js +11 -14
  111. package/dist/protocols/zai-messages.d.ts +1 -1
  112. package/dist/provider-error.js +10 -1
  113. package/dist/providers/alibaba.d.ts +15 -3
  114. package/dist/providers/amazon-bedrock-mantle.d.ts +14 -2
  115. package/dist/providers/amazon-bedrock.d.ts +2 -0
  116. package/dist/providers/amazon-bedrock.js +1 -0
  117. package/dist/providers/anthropic-compatible.d.ts +5 -5
  118. package/dist/providers/anthropic.d.ts +5 -5
  119. package/dist/providers/assemblyai.d.ts +25 -0
  120. package/dist/providers/assemblyai.js +24 -0
  121. package/dist/providers/azure.d.ts +20 -8
  122. package/dist/providers/azure.js +2 -2
  123. package/dist/providers/baseten.d.ts +24 -0
  124. package/dist/providers/black-forest-labs.d.ts +25 -0
  125. package/dist/providers/black-forest-labs.js +23 -0
  126. package/dist/providers/cartesia.d.ts +24 -0
  127. package/dist/providers/cartesia.js +17 -0
  128. package/dist/providers/cerebras.d.ts +24 -0
  129. package/dist/providers/cloudflare-ai-gateway.d.ts +42 -18
  130. package/dist/providers/cloudflare-workers-ai.d.ts +24 -0
  131. package/dist/providers/deepgram.d.ts +29 -0
  132. package/dist/providers/deepgram.js +25 -0
  133. package/dist/providers/deepinfra.d.ts +24 -0
  134. package/dist/providers/deepseek.d.ts +24 -0
  135. package/dist/providers/elevenlabs.d.ts +24 -0
  136. package/dist/providers/elevenlabs.js +23 -0
  137. package/dist/providers/fal.d.ts +29 -0
  138. package/dist/providers/fal.js +26 -0
  139. package/dist/providers/fireworks.d.ts +24 -0
  140. package/dist/providers/google-vertex-chat.d.ts +12 -0
  141. package/dist/providers/google-vertex-messages.d.ts +5 -5
  142. package/dist/providers/google-vertex-responses.d.ts +2 -2
  143. package/dist/providers/google-vertex.d.ts +6 -6
  144. package/dist/providers/google.d.ts +21 -6
  145. package/dist/providers/google.js +13 -9
  146. package/dist/providers/groq.d.ts +24 -0
  147. package/dist/providers/index.d.ts +9 -0
  148. package/dist/providers/index.js +9 -0
  149. package/dist/providers/meta.d.ts +22 -10
  150. package/dist/providers/meta.js +4 -8
  151. package/dist/providers/minimax.d.ts +19 -7
  152. package/dist/providers/moonshot.d.ts +19 -7
  153. package/dist/providers/moonshot.js +3 -3
  154. package/dist/providers/openai-compatible-responses.d.ts +2 -2
  155. package/dist/providers/openai-compatible.d.ts +12 -0
  156. package/dist/providers/openai-options.d.ts +3 -9
  157. package/dist/providers/openai-options.js +4 -7
  158. package/dist/providers/openai.d.ts +33 -12
  159. package/dist/providers/openai.js +17 -9
  160. package/dist/providers/opencode-zen.js +1 -1
  161. package/dist/providers/openrouter.d.ts +54 -7
  162. package/dist/providers/openrouter.js +10 -5
  163. package/dist/providers/replicate.d.ts +25 -0
  164. package/dist/providers/replicate.js +17 -0
  165. package/dist/providers/runway.d.ts +24 -0
  166. package/dist/providers/runway.js +17 -0
  167. package/dist/providers/stability.d.ts +28 -0
  168. package/dist/providers/stability.js +18 -0
  169. package/dist/providers/togetherai.d.ts +24 -0
  170. package/dist/providers/typesafe-ai.js +1 -1
  171. package/dist/providers/vercel-ai-gateway.js +1 -1
  172. package/dist/providers/xai.d.ts +17 -0
  173. package/dist/providers/xai.js +7 -9
  174. package/dist/providers/zai-coding-plan.d.ts +16 -4
  175. package/dist/providers/zai.d.ts +13 -1
  176. package/dist/providers/zai.js +4 -8
  177. package/dist/route/auth.d.ts +5 -2
  178. package/dist/route/auth.js +20 -13
  179. package/dist/route/client.d.ts +9 -7
  180. package/dist/route/client.js +6 -8
  181. package/dist/route/endpoint.d.ts +1 -0
  182. package/dist/route/endpoint.js +2 -2
  183. package/dist/route/executor-service.d.ts +4 -2
  184. package/dist/route/executor-service.js +2 -1
  185. package/dist/route/executor.d.ts +3 -1
  186. package/dist/route/executor.js +7 -0
  187. package/dist/route/framing.d.ts +15 -2
  188. package/dist/route/framing.js +53 -4
  189. package/dist/route/index.d.ts +1 -1
  190. package/dist/route/media-protocol.d.ts +145 -18
  191. package/dist/route/media-protocol.js +96 -28
  192. package/dist/route/media.d.ts +54 -9
  193. package/dist/route/media.js +194 -38
  194. package/dist/route/protocol.d.ts +3 -1
  195. package/dist/schema/events.d.ts +0 -6
  196. package/dist/schema/messages.d.ts +0 -3
  197. package/dist/schema/options.d.ts +10 -6
  198. package/dist/schema/options.js +10 -5
  199. package/dist/speech-client.d.ts +66 -0
  200. package/dist/speech-client.js +21 -0
  201. package/dist/speech.d.ts +1307 -0
  202. package/dist/speech.js +124 -0
  203. package/dist/testing.d.ts +2 -2
  204. package/dist/transcription-client.d.ts +82 -0
  205. package/dist/transcription-client.js +13 -0
  206. package/dist/transcription.d.ts +1492 -0
  207. package/dist/transcription.js +127 -0
  208. package/dist/utils/bytes.d.ts +1 -0
  209. package/dist/utils/bytes.js +10 -0
  210. package/dist/utils/json.d.ts +4 -0
  211. package/dist/utils/json.js +4 -0
  212. package/dist/utils/media-type.d.ts +3 -1
  213. package/dist/utils/media-type.js +25 -2
  214. package/dist/video-client.d.ts +59 -0
  215. package/dist/video-client.js +20 -0
  216. package/dist/video.d.ts +1351 -0
  217. package/dist/video.js +118 -0
  218. package/package.json +3 -3
  219. package/dist/protocols/utils/gemini-tool-schema.d.ts +0 -2
  220. package/dist/protocols/utils/gemini-tool-schema.js +0 -103
  221. package/dist/protocols/utils/meta-image.d.ts +0 -2
  222. package/dist/protocols/utils/meta-image.js +0 -13
  223. package/dist/protocols/utils/openai-image.d.ts +0 -5
  224. package/dist/protocols/utils/openai-image.js +0 -18
package/dist/video.js ADDED
@@ -0,0 +1,118 @@
1
+ import { Effect, Schema, Stream } from "effect";
2
+ import { Generation, ProgressEvent, QueuedEvent } from "./generation.js";
3
+ import { Media } from "./media.js";
4
+ import { MediaModel, composeRoute, tryRequest } from "./media-model.js";
5
+ import { MediaRoute } from "./route/media.js";
6
+ import { AIError, HttpOptions, MediaUsage, ProviderMetadata } from "./schema/index.js";
7
+ import { VideoClient, Service } from "./video-client.js";
8
+ export class VideoModel extends MediaModel {
9
+ static fromRoute(route, input) {
10
+ return new VideoModel({
11
+ id: input.id,
12
+ provider: route.protocol.provider,
13
+ http: input.http,
14
+ route: composeRoute(route, input, collectResponse),
15
+ });
16
+ }
17
+ }
18
+ export const VideoModelSchema = Schema.declare((value) => value instanceof VideoModel, {
19
+ expected: "Video.Model",
20
+ });
21
+ export const VideoAspectRatio = Media.AspectRatio;
22
+ /** Pinned frames. Routes that accept only a first frame fail typed when `last` is present. */
23
+ export const VideoFrames = Schema.Struct({
24
+ first: Schema.optional(Media.AssetSchema),
25
+ last: Schema.optional(Media.AssetSchema),
26
+ }).annotate({ identifier: "Video.Frames" });
27
+ export class VideoRequest extends Schema.Class("Video.Request")({
28
+ model: VideoModelSchema,
29
+ prompt: Schema.String,
30
+ frames: Schema.optional(VideoFrames),
31
+ /** Style or subject references that guide the output without pinning a frame. */
32
+ references: Schema.optional(Schema.Array(Media.AssetSchema)),
33
+ /** Source video for edit or extension routes. */
34
+ video: Schema.optional(Media.AssetSchema),
35
+ durationSeconds: Schema.optional(Schema.Number),
36
+ aspectRatio: Schema.optional(VideoAspectRatio),
37
+ resolution: Schema.optional(Schema.String),
38
+ /** Whether to generate an audio track; routes whose audio is always on fail typed on `false`. */
39
+ audio: Schema.optional(Schema.Boolean),
40
+ n: Schema.optional(Schema.Int),
41
+ seed: Schema.optional(Schema.Number),
42
+ negativePrompt: Schema.optional(Schema.String),
43
+ providerOptions: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),
44
+ http: Schema.optional(HttpOptions),
45
+ }) {
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // Response and events
49
+ // ---------------------------------------------------------------------------
50
+ export class VideoResponse extends Schema.Class("Video.Response")({
51
+ videos: Schema.Array(Media.AssetSchema),
52
+ usage: Schema.optional(MediaUsage),
53
+ notices: Schema.optional(Schema.Array(Media.Notice)),
54
+ providerMetadata: Schema.optional(ProviderMetadata),
55
+ }) {
56
+ get video() {
57
+ return this.videos[0];
58
+ }
59
+ }
60
+ export const VideoOutputEvent = Schema.Struct({
61
+ type: Schema.tag("video"),
62
+ index: Schema.Number,
63
+ video: Media.AssetSchema,
64
+ }).annotate({ identifier: "Video.Event.Video" });
65
+ export const VideoFinishEvent = Schema.Struct({
66
+ type: Schema.tag("finish"),
67
+ usage: Schema.optional(MediaUsage),
68
+ notices: Schema.optional(Schema.Array(Media.Notice)),
69
+ providerMetadata: Schema.optional(ProviderMetadata),
70
+ }).annotate({ identifier: "Video.Event.Finish" });
71
+ const videoEventTagged = Schema.Union([QueuedEvent, ProgressEvent, VideoOutputEvent, VideoFinishEvent]).pipe(Schema.toTaggedUnion("type"));
72
+ export const VideoEvent = Object.assign(videoEventTagged, {
73
+ is: {
74
+ generationQueued: videoEventTagged.guards["generation-queued"],
75
+ generationProgress: videoEventTagged.guards["generation-progress"],
76
+ video: videoEventTagged.guards.video,
77
+ finish: videoEventTagged.guards.finish,
78
+ },
79
+ });
80
+ const collectResponse = (events) => {
81
+ const finish = events.find(VideoEvent.is.finish);
82
+ // A streaming video protocol's `finish` emits the terminal event or fails, so a completed stream always has one.
83
+ if (finish === undefined)
84
+ return Effect.die(new Error("The video stream completed without a finish event"));
85
+ return Effect.succeed(new VideoResponse({
86
+ videos: events.filter(VideoEvent.is.video).map((event) => event.video),
87
+ usage: finish.usage,
88
+ notices: finish.notices,
89
+ providerMetadata: finish.providerMetadata,
90
+ }));
91
+ };
92
+ export function request(input) {
93
+ if (input instanceof VideoRequest)
94
+ return input;
95
+ return new VideoRequest({
96
+ ...input,
97
+ http: HttpOptions.make(input.http),
98
+ });
99
+ }
100
+ const requestEffect = (input) => tryRequest(() => request(input));
101
+ export function start(input) {
102
+ return requestEffect(input).pipe(Effect.flatMap((request) => VideoClient.start(request)));
103
+ }
104
+ export function generate(input, options) {
105
+ return requestEffect(input).pipe(Effect.flatMap((request) => VideoClient.generate(request, options)));
106
+ }
107
+ /** Rebuild a generation handle from a persisted `Generation.token`, refreshing its status once. */
108
+ export const resume = (model, token) => VideoClient.resume(model, token);
109
+ export function stream(input, options) {
110
+ return Stream.unwrap(requestEffect(input).pipe(Effect.map((request) => VideoClient.stream(request, options))));
111
+ }
112
+ export const Video = {
113
+ request,
114
+ start,
115
+ generate,
116
+ resume,
117
+ stream,
118
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
- "version": "2.0.15",
3
+ "version": "2.0.17",
4
4
  "name": "@opencode/ai",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -34,7 +34,7 @@
34
34
  "devDependencies": {
35
35
  "@clack/prompts": "1.0.0-alpha.1",
36
36
  "@effect/platform-node": "4.0.0-rc.112",
37
- "@opencode/http-recorder": "2.0.15",
37
+ "@opencode/http-recorder": "2.0.17",
38
38
  "@tsconfig/bun": "1.0.9",
39
39
  "@types/bun": "1.4.0",
40
40
  "@typescript/native-preview": "7.0.0-dev.20251207.1",
@@ -44,7 +44,7 @@
44
44
  "@aws-sdk/credential-providers": "3.1057.0",
45
45
  "@smithy/eventstream-codec": "4.2.14",
46
46
  "@smithy/util-utf8": "4.2.2",
47
- "@opencode/schema": "2.0.15",
47
+ "@opencode/schema": "2.0.17",
48
48
  "aws4fetch": "1.0.20",
49
49
  "effect": "4.0.0-rc.112",
50
50
  "google-auth-library": "10.5.0"
@@ -1,2 +0,0 @@
1
- export declare const convert: (schema: unknown) => Record<string, unknown> | undefined;
2
- export * as GeminiToolSchema from "./gemini-tool-schema.js";
@@ -1,103 +0,0 @@
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";
@@ -1,2 +0,0 @@
1
- export declare const mediaType: (data: Uint8Array, format?: string) => string;
2
- export * as MetaImage from "./meta-image.js";
@@ -1,13 +0,0 @@
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";
@@ -1,5 +0,0 @@
1
- import { Schema } from "effect";
2
- export declare const Size: Schema.String;
3
- export declare const OpenAIImage: {
4
- readonly Size: Schema.String;
5
- };
@@ -1,18 +0,0 @@
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
- };