@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
@@ -0,0 +1,127 @@
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 { TranscriptionClient, Service } from "./transcription-client.js";
8
+ export class TranscriptionModel extends MediaModel {
9
+ static fromRoute(route, input) {
10
+ return new TranscriptionModel({
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 TranscriptionModelSchema = Schema.declare((value) => value instanceof TranscriptionModel, { expected: "Transcription.Model" });
19
+ // ---------------------------------------------------------------------------
20
+ // Request
21
+ // ---------------------------------------------------------------------------
22
+ export const TranscriptionTimestamps = Schema.Literals(["none", "segment", "word"]);
23
+ export class TranscriptionRequest extends Schema.Class("Transcription.Request")({
24
+ model: TranscriptionModelSchema,
25
+ audio: Media.AssetSchema,
26
+ language: Schema.optional(Schema.String),
27
+ prompt: Schema.optional(Schema.String),
28
+ /** Routes that cannot produce the requested granularity fail typed; routes may return more than asked. */
29
+ timestamps: Schema.optional(TranscriptionTimestamps),
30
+ diarize: Schema.optional(Schema.Boolean),
31
+ speakers: Schema.optional(Schema.Int),
32
+ providerOptions: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),
33
+ http: Schema.optional(HttpOptions),
34
+ }) {
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // Response and events
38
+ // ---------------------------------------------------------------------------
39
+ /** Speaker labels are provider-native (`A`, `0`, `spk:0`, or a known speaker name). */
40
+ export const TranscriptionSegment = Schema.Struct({
41
+ text: Schema.String,
42
+ startSeconds: Schema.Number,
43
+ endSeconds: Schema.Number,
44
+ speaker: Schema.optional(Schema.String),
45
+ }).annotate({ identifier: "Transcription.Segment" });
46
+ export const TranscriptionWord = Schema.Struct({
47
+ text: Schema.String,
48
+ startSeconds: Schema.Number,
49
+ endSeconds: Schema.Number,
50
+ speaker: Schema.optional(Schema.String),
51
+ confidence: Schema.optional(Schema.Number),
52
+ }).annotate({ identifier: "Transcription.Word" });
53
+ const transcriptFields = {
54
+ text: Schema.String,
55
+ segments: Schema.optional(Schema.Array(TranscriptionSegment)),
56
+ words: Schema.optional(Schema.Array(TranscriptionWord)),
57
+ /** Provider-native language as detected or echoed (`en`, `english`, `en_us`), lowercased but not normalized. */
58
+ language: Schema.optional(Schema.String),
59
+ durationSeconds: Schema.optional(Schema.Number),
60
+ usage: Schema.optional(MediaUsage),
61
+ notices: Schema.optional(Schema.Array(Media.Notice)),
62
+ providerMetadata: Schema.optional(ProviderMetadata),
63
+ };
64
+ export class TranscriptionResponse extends Schema.Class("Transcription.Response")(transcriptFields) {
65
+ }
66
+ export const TranscriptionTextDeltaEvent = Schema.Struct({
67
+ type: Schema.tag("text-delta"),
68
+ delta: Schema.String,
69
+ }).annotate({ identifier: "Transcription.Event.TextDelta" });
70
+ export const TranscriptionSegmentEvent = Schema.Struct({
71
+ type: Schema.tag("segment"),
72
+ segment: TranscriptionSegment,
73
+ }).annotate({ identifier: "Transcription.Event.Segment" });
74
+ export const TranscriptionFinishEvent = Schema.Struct({
75
+ type: Schema.tag("finish"),
76
+ ...transcriptFields,
77
+ }).annotate({ identifier: "Transcription.Event.Finish" });
78
+ const transcriptionEventTagged = Schema.Union([
79
+ QueuedEvent,
80
+ ProgressEvent,
81
+ TranscriptionTextDeltaEvent,
82
+ TranscriptionSegmentEvent,
83
+ TranscriptionFinishEvent,
84
+ ]).pipe(Schema.toTaggedUnion("type"));
85
+ export const TranscriptionEvent = Object.assign(transcriptionEventTagged, {
86
+ is: {
87
+ generationQueued: transcriptionEventTagged.guards["generation-queued"],
88
+ generationProgress: transcriptionEventTagged.guards["generation-progress"],
89
+ textDelta: transcriptionEventTagged.guards["text-delta"],
90
+ segment: transcriptionEventTagged.guards.segment,
91
+ finish: transcriptionEventTagged.guards.finish,
92
+ },
93
+ });
94
+ const collectResponse = (events) => {
95
+ const finish = events.find(TranscriptionEvent.is.finish);
96
+ // Every transcription protocol's `finish` emits the terminal event or fails, so a completed stream always has one.
97
+ if (finish === undefined)
98
+ return Effect.die(new Error("The transcription stream completed without a finish event"));
99
+ const { type: _type, ...transcript } = finish;
100
+ return Effect.succeed(new TranscriptionResponse(transcript));
101
+ };
102
+ export function request(input) {
103
+ if (input instanceof TranscriptionRequest)
104
+ return input;
105
+ return new TranscriptionRequest({
106
+ ...input,
107
+ http: HttpOptions.make(input.http),
108
+ });
109
+ }
110
+ const requestEffect = (input) => tryRequest(() => request(input));
111
+ export function generate(input, options) {
112
+ return requestEffect(input).pipe(Effect.flatMap((request) => TranscriptionClient.generate(request, options)));
113
+ }
114
+ export function stream(input, options) {
115
+ return Stream.unwrap(requestEffect(input).pipe(Effect.map((request) => TranscriptionClient.stream(request, options))));
116
+ }
117
+ export function start(input) {
118
+ return requestEffect(input).pipe(Effect.flatMap((request) => TranscriptionClient.start(request)));
119
+ }
120
+ export const resume = (model, token) => TranscriptionClient.resume(model, token);
121
+ export const Transcription = {
122
+ request,
123
+ generate,
124
+ stream,
125
+ start,
126
+ resume,
127
+ };
@@ -0,0 +1 @@
1
+ export declare const concatBytes: (chunks: ReadonlyArray<Uint8Array>) => Uint8Array<ArrayBufferLike>;
@@ -0,0 +1,10 @@
1
+ export const concatBytes = (chunks) => {
2
+ if (chunks.length === 1)
3
+ return chunks[0];
4
+ const bytes = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.length, 0));
5
+ chunks.reduce((offset, chunk) => {
6
+ bytes.set(chunk, offset);
7
+ return offset + chunk.length;
8
+ }, 0);
9
+ return bytes;
10
+ };
@@ -0,0 +1,4 @@
1
+ import { Schema } from "effect";
2
+ export declare const Json: Schema.fromJsonString<Schema.Unknown>;
3
+ export declare const decodeJson: (input: unknown, options?: import("effect/SchemaAST").ParseOptions) => unknown;
4
+ export declare const encodeJson: (input: unknown, options?: import("effect/SchemaAST").ParseOptions) => string;
@@ -0,0 +1,4 @@
1
+ import { Schema } from "effect";
2
+ export const Json = Schema.fromJsonString(Schema.Unknown);
3
+ export const decodeJson = Schema.decodeUnknownSync(Json);
4
+ export const encodeJson = Schema.encodeSync(Json);
@@ -3,4 +3,6 @@
3
3
  * `undefined` so callers can fall back to a provider-declared type or `application/octet-stream`.
4
4
  */
5
5
  export declare const detectMediaType: (bytes: Uint8Array) => string | undefined;
6
- export declare const extensionMediaType: (path: string) => string | undefined;
6
+ /** Media type of a file's contents: sniffed magic bytes, then the path's extension. */
7
+ export declare const fileMediaType: (bytes: Uint8Array, path: string) => string | undefined;
8
+ export declare const mediaTypeExtension: (mediaType: string) => string | undefined;
@@ -24,10 +24,15 @@ export const detectMediaType = (bytes) => {
24
24
  return "video/mp4";
25
25
  if (startsWith(bytes, [0x1a, 0x45, 0xdf, 0xa3]))
26
26
  return "video/webm";
27
- if (startsWith(bytes, [0x49, 0x44, 0x33]) || startsWith(bytes, [0xff, 0xfb]) || startsWith(bytes, [0xff, 0xf3]))
27
+ if (startsWith(bytes, [0x49, 0x44, 0x33]))
28
28
  return "audio/mpeg";
29
+ // An 11-bit frame sync; layer bits `00` mark AAC ADTS, any other layer is MPEG audio.
30
+ if (bytes.length >= 2 && bytes[0] === 0xff && (bytes[1] & 0xe0) === 0xe0)
31
+ return (bytes[1] & 0x06) === 0 ? "audio/aac" : "audio/mpeg";
29
32
  if (startsWith(bytes, [0x4f, 0x67, 0x67, 0x53]))
30
33
  return "audio/ogg";
34
+ if (startsWith(bytes, [0x66, 0x4c, 0x61, 0x43]))
35
+ return "audio/flac";
31
36
  return undefined;
32
37
  };
33
38
  const EXTENSIONS = {
@@ -40,10 +45,28 @@ const EXTENSIONS = {
40
45
  mp4: "video/mp4",
41
46
  webm: "video/webm",
42
47
  mp3: "audio/mpeg",
48
+ m4a: "audio/mp4",
43
49
  wav: "audio/wav",
44
50
  ogg: "audio/ogg",
51
+ flac: "audio/flac",
52
+ aac: "audio/aac",
45
53
  txt: "text/plain",
46
54
  md: "text/markdown",
47
55
  csv: "text/csv",
48
56
  };
49
- export const extensionMediaType = (path) => EXTENSIONS[path.slice(path.lastIndexOf(".") + 1).toLowerCase()];
57
+ const extensionMediaType = (path) => EXTENSIONS[path.slice(path.lastIndexOf(".") + 1).toLowerCase()];
58
+ /** Media type of a file's contents: sniffed magic bytes, then the path's extension. */
59
+ export const fileMediaType = (bytes, path) => detectMediaType(bytes) ?? extensionMediaType(path);
60
+ const EXTENSION_ALIASES = {
61
+ "audio/mp3": "mp3",
62
+ "audio/m4a": "m4a",
63
+ "audio/x-m4a": "m4a",
64
+ "audio/webm": "webm",
65
+ "audio/wave": "wav",
66
+ "audio/x-wav": "wav",
67
+ "audio/x-flac": "flac",
68
+ };
69
+ export const mediaTypeExtension = (mediaType) => {
70
+ const type = mediaType.split(";", 1)[0].trim().toLowerCase();
71
+ return EXTENSION_ALIASES[type] ?? Object.entries(EXTENSIONS).find(([, known]) => known === type)?.[0];
72
+ };
@@ -0,0 +1,59 @@
1
+ import { Context } from "effect";
2
+ import { MediaClient } from "./media-client.js";
3
+ import { type VideoEvent, type VideoRequestFor, type VideoResponse } from "./video.js";
4
+ export type Interface = MediaClient.Interface<VideoRequestFor, VideoEvent, VideoResponse>;
5
+ declare const VideoClientService_base: Context.ServiceClass<VideoClientService, "@opencode/VideoClient", Interface>;
6
+ export declare class VideoClientService extends VideoClientService_base {
7
+ }
8
+ export declare const Service: typeof VideoClientService;
9
+ export type Service = VideoClientService;
10
+ export declare const VideoClient: {
11
+ readonly layer: import("effect/Layer").Layer<VideoClientService, never, import("./route/executor-service.js").RequestExecutorService>;
12
+ readonly generate: (request: VideoRequestFor, options?: import("./generation.js").AwaitOptions) => import("effect/Effect").Effect<VideoResponse, import("./index.js").AIError, VideoClientService>;
13
+ readonly stream: (request: VideoRequestFor, options?: import("./generation.js").AwaitOptions) => import("effect/Stream").Stream<import("./generation.js").Observation | {
14
+ readonly type: "video";
15
+ readonly index: number;
16
+ readonly video: import("./media.js").Asset;
17
+ } | {
18
+ readonly type: "finish";
19
+ readonly providerMetadata?: {
20
+ readonly [x: string]: {
21
+ readonly [x: string]: unknown;
22
+ };
23
+ } | undefined;
24
+ readonly usage?: {
25
+ readonly type: "tokens";
26
+ readonly input?: number | undefined;
27
+ readonly output?: number | undefined;
28
+ readonly total?: number | undefined;
29
+ readonly details?: {
30
+ readonly [x: string]: unknown;
31
+ } | undefined;
32
+ } | {
33
+ readonly type: "seconds";
34
+ readonly seconds: number;
35
+ } | {
36
+ readonly type: "characters";
37
+ readonly characters: number;
38
+ } | {
39
+ readonly type: "credits";
40
+ readonly credits: number;
41
+ } | {
42
+ readonly type: "compute";
43
+ readonly seconds: number;
44
+ } | undefined;
45
+ readonly notices?: readonly {
46
+ readonly type: "other" | "moderated" | "filtered";
47
+ readonly message: string;
48
+ readonly providerMetadata?: {
49
+ readonly [x: string]: {
50
+ readonly [x: string]: unknown;
51
+ };
52
+ } | undefined;
53
+ }[] | undefined;
54
+ }, import("./index.js").AIError, VideoClientService>;
55
+ readonly start: (request: VideoRequestFor) => import("effect/Effect").Effect<import("./generation.js").Generation<VideoResponse>, import("./index.js").AIError, VideoClientService>;
56
+ readonly resume: (model: import("./video.js").VideoModel<import("./media-model.js").MediaModel.Options>, token: unknown) => import("effect/Effect").Effect<import("./generation.js").Generation<VideoResponse>, import("./index.js").AIError, VideoClientService>;
57
+ readonly Service: typeof VideoClientService;
58
+ };
59
+ export {};
@@ -0,0 +1,20 @@
1
+ import { Context } from "effect";
2
+ import { MediaClient } from "./media-client.js";
3
+ import { VideoOutputEvent, VideoFinishEvent, } from "./video.js";
4
+ export class VideoClientService extends Context.Service()("@opencode/VideoClient") {
5
+ }
6
+ export const Service = VideoClientService;
7
+ export const VideoClient = {
8
+ Service,
9
+ ...MediaClient.make(Service, {
10
+ modality: "video",
11
+ responseEvents: (response) => [
12
+ ...response.videos.map((video, index) => VideoOutputEvent.make({ index, video })),
13
+ VideoFinishEvent.make({
14
+ usage: response.usage,
15
+ notices: response.notices,
16
+ providerMetadata: response.providerMetadata,
17
+ }),
18
+ ],
19
+ }),
20
+ };