@opencode/ai 2.0.14 → 2.0.16

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