@opencode/ai 0.0.0-dev-21801 → 0.0.0-dev-21803

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.
package/README.md CHANGED
@@ -2,9 +2,32 @@
2
2
 
3
3
  Schema-first APIs for text, images, video, speech, and transcription, built with Effect.
4
4
 
5
+ `@opencode/ai` is the Promise API: one managed runtime behind the LLM and media methods, plus asset helpers. `ai.file`
6
+ and `ai.write` load `node:fs/promises` on first use, so no Effect `FileSystem` is needed:
7
+
8
+ ```ts
9
+ import { AI } from "@opencode/ai"
10
+ import { OpenAI } from "@opencode/ai/providers"
11
+
12
+ const openai = OpenAI.configure({ apiKey: process.env.OPENAI_API_KEY })
13
+
14
+ const ai = AI.make()
15
+ const input = { model: openai.responses("gpt-4o-mini"), prompt: "Say hello." }
16
+ const response = await ai.llm.generate(input)
17
+ console.log(response.text)
18
+ const generated = await ai.image.generate({ model: openai.image("gpt-image-2"), prompt: "A lighthouse" })
19
+ await ai.write(generated.image, "./lighthouse.png") // also ai.file(path), ai.bytes(asset), ai.base64(asset), ai.materialize(asset)
20
+ for await (const event of ai.llm.stream(ai.llm.request(input))) {
21
+ // LLMEvent
22
+ }
23
+ await ai.dispose()
24
+ ```
25
+
26
+ The Effect API lives at `@opencode/ai/effect`. Its methods return `Effect` or `Stream`:
27
+
5
28
  ```ts
6
29
  import { Effect } from "effect"
7
- import { AIClient, LLM } from "@opencode/ai"
30
+ import { AIClient, LLM } from "@opencode/ai/effect"
8
31
  import { OpenAI } from "@opencode/ai/providers"
9
32
 
10
33
  const openai = OpenAI.configure({ apiKey: process.env.OPENAI_API_KEY })
@@ -64,7 +87,7 @@ provider's image route from the model and returns `Media.Asset`s with lazily dec
64
87
 
65
88
  ```ts
66
89
  import { NodeFileSystem } from "@effect/platform-node"
67
- import { Image, Media } from "@opencode/ai"
90
+ import { Image, Media } from "@opencode/ai/effect"
68
91
 
69
92
  const image = Effect.gen(function* () {
70
93
  const response = yield* Image.generate({
@@ -96,30 +119,13 @@ const logged = RequestExecutor.middleware((request, next) =>
96
119
  const everything = AIClient.layerWith(logged) // or AI.make({ layer: logged })
97
120
  ```
98
121
 
99
- Prefer promises? `@opencode/ai/promise` exposes the same LLM and media APIs over one managed runtime, plus asset
100
- helpers; `ai.file` and `ai.write` load `node:fs/promises` on first use, so no Effect `FileSystem` is needed:
101
-
102
- ```ts
103
- import { AI } from "@opencode/ai/promise"
104
-
105
- const ai = AI.make()
106
- const input = { model: openai.responses("gpt-4o-mini"), prompt: "Say hello." }
107
- const text = await ai.llm.generate(input)
108
- const generated = await ai.image.generate({ model: openai.image("gpt-image-2"), prompt: "A lighthouse" })
109
- await ai.write(generated.image, "./lighthouse.png") // also ai.file(path), ai.bytes(asset), ai.base64(asset), ai.materialize(asset)
110
- for await (const event of ai.llm.stream(ai.llm.request(input))) {
111
- // LLMEvent
112
- }
113
- await ai.dispose()
114
- ```
115
-
116
122
  ## Venice AI
117
123
 
118
124
  `Venice` provides native Chat Completions with streaming tools and reasoning. `model` and `chat`
119
125
  select the same API; credentials default to `VENICE_API_KEY`.
120
126
 
121
127
  ```ts
122
- import { LLM } from "@opencode/ai"
128
+ import { LLM } from "@opencode/ai/effect"
123
129
  import { Venice } from "@opencode/ai/providers"
124
130
  import { Effect } from "effect"
125
131
 
@@ -155,7 +161,7 @@ values, or a `score` on ordered levels, each with the probability of every optio
155
161
 
156
162
  ```ts
157
163
  import { Effect } from "effect"
158
- import { Decision, DecisionClient, Media } from "@opencode/ai"
164
+ import { Decision, DecisionClient, Media } from "@opencode/ai/effect"
159
165
  import { OpenAI } from "@opencode/ai/providers"
160
166
 
161
167
  const program = Decision.generate({
@@ -223,7 +229,7 @@ Chat Completions (`.model` or `.chat`), Anthropic-compatible Messages (`.message
223
229
  Responses (`.responses`). These routes use HTTP/SSE.
224
230
 
225
231
  ```ts
226
- import { LLM } from "@opencode/ai"
232
+ import { LLM } from "@opencode/ai/effect"
227
233
  import { Alibaba } from "@opencode/ai/providers"
228
234
 
229
235
  const alibaba = Alibaba.configure({
@@ -302,7 +308,7 @@ pass through. Results are URLs that Model Studio keeps for 24 hours. A complete
302
308
  the existing `.image(...)` selector provides image generation.
303
309
 
304
310
  ```ts
305
- import { LLM } from "@opencode/ai"
311
+ import { LLM } from "@opencode/ai/effect"
306
312
  import { ZAI, ZAICodingPlan } from "@opencode/ai/providers"
307
313
 
308
314
  const zai = ZAI.configure({ apiKey: process.env.ZAI_API_KEY })
@@ -368,7 +374,7 @@ Package entrypoints are `@opencode/ai/providers/zai`, `zai/chat`, `zai-coding-pl
368
374
  Moonshot defaults to Chat Completions, with Messages and Responses selectors for Kimi K3:
369
375
 
370
376
  ```ts
371
- import { LLM } from "@opencode/ai"
377
+ import { LLM } from "@opencode/ai/effect"
372
378
  import { Moonshot } from "@opencode/ai/providers"
373
379
 
374
380
  const moonshot = Moonshot.configure({ apiKey: process.env.MOONSHOT_API_KEY })
@@ -430,7 +436,7 @@ MiniMax defaults to its Messages API and reads `MINIMAX_API_KEY` when `apiKey` i
430
436
 
431
437
  ```ts
432
438
  import { Effect } from "effect"
433
- import { AIClient, LLM } from "@opencode/ai"
439
+ import { AIClient, LLM } from "@opencode/ai/effect"
434
440
  import { MiniMax } from "@opencode/ai/providers"
435
441
 
436
442
  const minimax = MiniMax.configure({ apiKey: process.env.MINIMAX_API_KEY })
@@ -507,7 +513,7 @@ citations or separate result blocks. Retain `response.message` for either API's
507
513
  Use `Image.generate` for one-off generation or editing:
508
514
 
509
515
  ```ts
510
- import { Image, Media } from "@opencode/ai"
516
+ import { Image, Media } from "@opencode/ai/effect"
511
517
 
512
518
  const generation = Image.generate({
513
519
  model: meta.image("muse-image-1.0"),
@@ -543,7 +549,7 @@ selected model. `aspect` is a ratio such as `"16:9"`; `resolution` is a size tie
543
549
  at that ratio, `"2K"` about 2048×2048). Exact sizes, seeds, masks, and output formats are provider options:
544
550
 
545
551
  ```ts
546
- import { Image, Media } from "@opencode/ai"
552
+ import { Image, Media } from "@opencode/ai/effect"
547
553
  import { OpenAI } from "@opencode/ai/providers"
548
554
 
549
555
  const openai = OpenAI.configure({ apiKey: process.env.OPENAI_API_KEY })
@@ -729,7 +735,7 @@ and emits `image-partial` events before each final `image`; `Image.generate` kee
729
735
 
730
736
  ```ts
731
737
  import { Stream } from "effect"
732
- import { ImageEvent } from "@opencode/ai"
738
+ import { ImageEvent } from "@opencode/ai/effect"
733
739
 
734
740
  const previews = Image.stream({
735
741
  model: openai.image("gpt-image-2"),
@@ -813,7 +819,7 @@ Common fields (`frames`, `references`, `video`, `durationSeconds`, `aspect`, `re
813
819
  under `providerOptions`, inferred from the selected model.
814
820
 
815
821
  ```ts
816
- import { Video } from "@opencode/ai"
822
+ import { Video } from "@opencode/ai/effect"
817
823
  import { Google, Runway } from "@opencode/ai/providers"
818
824
 
819
825
  const google = Google.configure({ apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY })
@@ -885,7 +891,7 @@ aborting rejects the Promise or throws from the `for await` loop with `signal.re
885
891
  unless `abort(reason)` passed one), while `break` stops a stream without throwing.
886
892
 
887
893
  ```ts
888
- import { ai } from "@opencode/ai/promise"
894
+ import { ai } from "@opencode/ai"
889
895
 
890
896
  const generation = await ai.video.start({ model, prompt })
891
897
  for await (const event of generation.events({ poll: { interval: 10_000 } })) console.log(event.type)
@@ -902,7 +908,7 @@ selectors on the `OpenAI`, `Google` (Gemini TTS), `ElevenLabs`, `Cartesia`, and
902
908
  before any network call; provider-native controls live under `providerOptions`, inferred from the selected model.
903
909
 
904
910
  ```ts
905
- import { Media, Speech, SpeechClient, SpeechEvent } from "@opencode/ai"
911
+ import { Media, Speech, SpeechClient, SpeechEvent } from "@opencode/ai/effect"
906
912
  import { ElevenLabs, OpenAI } from "@opencode/ai/providers"
907
913
 
908
914
  const openai = OpenAI.configure({ apiKey: process.env.OPENAI_API_KEY })
@@ -967,7 +973,7 @@ Provider notes:
967
973
  The promise client mirrors the Effect API; `ai.speech.stream` is an `AsyncIterable`.
968
974
 
969
975
  ```ts
970
- import { ai } from "@opencode/ai/promise"
976
+ import { ai } from "@opencode/ai"
971
977
 
972
978
  const response = await ai.speech.generate({ model, text: "Hello from OpenCode.", voice: "coral" })
973
979
  await ai.write(response.audio, "hello.mp3")
@@ -989,7 +995,7 @@ any network call; a route may return more than asked.
989
995
 
990
996
  ```ts
991
997
  import { Console, Effect, Stream } from "effect"
992
- import { Media, Transcription, TranscriptionEvent } from "@opencode/ai"
998
+ import { Media, Transcription, TranscriptionEvent } from "@opencode/ai/effect"
993
999
  import { AssemblyAI, Deepgram, OpenAI } from "@opencode/ai/providers"
994
1000
 
995
1001
  const openai = OpenAI.configure({ apiKey: process.env.OPENAI_API_KEY })
@@ -1050,6 +1056,8 @@ const transcript = await generation.await({ poll: { interval: 3_000 } })
1050
1056
 
1051
1057
  ## Public API
1052
1058
 
1059
+ Everything below is exported from `@opencode/ai/effect` unless noted.
1060
+
1053
1061
  - **`LLM.request({...})`** — build a provider-neutral `LLMRequest`. Accepts ergonomic inputs (`system: string`, `prompt: string`) that normalize into the canonical Schema classes.
1054
1062
  - **`LLM.generate` / `LLM.stream`** — run direct input or an `LLMRequest` through `LLMClient` for one-import use.
1055
1063
  - **`Message.user(...)` / `Message.assistant(...)` / `Message.tool(...)`** — message constructors from the canonical schema model.
@@ -1063,7 +1071,7 @@ const transcript = await generation.await({ poll: { interval: 3_000 } })
1063
1071
  - **`Speech.request` / `Speech.generate` / `Speech.stream`** — text-to-speech through a provider-neutral request; `SpeechClient` is its Effect service and layer.
1064
1072
  - **`Transcription.request` / `generate` / `stream` / `start` / `resume`** — speech-to-text over inline, streaming, and queued routes; `TranscriptionClient` is its Effect service and layer.
1065
1073
  - **`AIClient.layer` / `AIClient.layerWith(executor)`** — every modality client plus the request executor in one layer.
1066
- - **`@opencode/ai/promise`** — `AI.make({ layer? })` and a default `ai` client exposing `llm`, `image`, `video`, `speech`, and `transcription` as Promise / `AsyncIterable` APIs, plus `file`, `write`, `bytes`, `base64`, and `materialize` for assets.
1074
+ - **`@opencode/ai`** (Promise root) — `AI.make({ layer? })` and a default `ai` client exposing `llm`, `image`, `video`, `speech`, and `transcription` as Promise / `AsyncIterable` APIs, plus `file`, `write`, `bytes`, `base64`, and `materialize` for assets.
1067
1075
 
1068
1076
  ## Testing
1069
1077
 
@@ -1188,7 +1196,7 @@ Enable OpenAI compaction with typed provider options:
1188
1196
 
1189
1197
  ```ts
1190
1198
  import { Effect } from "effect"
1191
- import { LLM, LLMClient, LLMRequest, Message } from "@opencode/ai"
1199
+ import { LLM, LLMClient, LLMRequest, Message } from "@opencode/ai/effect"
1192
1200
  import { OpenAI } from "@opencode/ai/providers"
1193
1201
 
1194
1202
  const request = LLM.request({
@@ -1211,7 +1219,7 @@ const continued = Effect.gen(function* () {
1211
1219
  A compaction part has `provider` and exactly one representation: `encrypted` for Responses, or `text` for Anthropic. Responses also preserves the optional checkpoint `id`. These fields survive message serialization without becoming visible assistant text. Sending a checkpoint to another provider or an incompatible API fails rather than silently losing context.
1212
1220
 
1213
1221
  ```ts
1214
- import { CompactionPart, ProviderID } from "@opencode/ai"
1222
+ import { CompactionPart, ProviderID } from "@opencode/ai/effect"
1215
1223
 
1216
1224
  CompactionPart.make({ provider: ProviderID.make("openai"), id: "cmp_123", encrypted: "..." })
1217
1225
  CompactionPart.make({ provider: ProviderID.make("anthropic"), text: "Summary of the conversation..." })
@@ -1431,7 +1439,7 @@ Compose a route with `Route.make({ protocol, endpoint, auth, framing, ... })`. T
1431
1439
 
1432
1440
  ## Effect
1433
1441
 
1434
- This package is built on Effect. Public methods return `Effect` or `Stream`; provide `AIClient.layer` (or `AIClient.layerWith(executor)`) for every modality, then import the provider/protocol modules for the routes you use. The example at `example/tutorial.ts` is a runnable walkthrough.
1442
+ This package is built on Effect. Public methods in `@opencode/ai/effect` return `Effect` or `Stream`; provide `AIClient.layer` (or `AIClient.layerWith(executor)`) for every modality, then import the provider/protocol modules for the routes you use. The example at `example/tutorial.ts` is a runnable walkthrough.
1435
1443
 
1436
1444
  ## See also
1437
1445
 
@@ -0,0 +1,39 @@
1
+ export { AIClient } from "./ai-client.js";
2
+ export { LLMClient } from "./route/client.js";
3
+ export { ImageClient } from "./image-client.js";
4
+ export { Auth } from "./route/auth.js";
5
+ export { Provider } from "./provider.js";
6
+ export { ProviderPackage } from "./provider-package.js";
7
+ export { isContextOverflow, isContextOverflowFailure, isRetryable } from "./provider-error.js";
8
+ export type { RouteLanguageModelInput, RouteRoutedLanguageModelInput, Interface as LLMClientShape, LLMClientService, } from "./route/client.js";
9
+ export * from "./schema/index.js";
10
+ export { ImageAspectRatio, ImageEvent, ImageModel, ImageModelSchema, ImageRequest, ImageResponse } from "./image.js";
11
+ export type { ImageModelOptions, ImageOptions, ImageRequestFor, ImageRequestInput, ImageResolution, ImageRoute, } from "./image.js";
12
+ export { Image } from "./image.js";
13
+ export { VideoClient } from "./video-client.js";
14
+ export { VideoAspectRatio, VideoEvent, VideoFrames, VideoModel, VideoModelSchema, VideoRequest, VideoResponse, } from "./video.js";
15
+ export type { VideoModelOptions, VideoOptions, VideoRequestFor, VideoRequestInput, VideoResolution, VideoRoute, } from "./video.js";
16
+ export { Video } from "./video.js";
17
+ export { SpeechClient } from "./speech-client.js";
18
+ export { SpeechEvent, SpeechModel, SpeechModelSchema, SpeechRequest, SpeechResponse, SpeechTimestamp, SpeechVoice, } from "./speech.js";
19
+ export type { SpeechFormat, SpeechModelOptions, SpeechOptions, SpeechRequestFor, SpeechRequestInput, SpeechRoute, } from "./speech.js";
20
+ export { Speech } from "./speech.js";
21
+ export { TranscriptionClient } from "./transcription-client.js";
22
+ export { TranscriptionEvent, TranscriptionModel, TranscriptionModelSchema, TranscriptionRequest, TranscriptionResponse, TranscriptionSegment, TranscriptionTimestamps, TranscriptionWord, } from "./transcription.js";
23
+ export type { TranscriptionModelOptions, TranscriptionOptions, TranscriptionRequestFor, TranscriptionRequestInput, TranscriptionRoute, } from "./transcription.js";
24
+ export { Transcription } from "./transcription.js";
25
+ export { DecisionClient } from "./decision-client.js";
26
+ export { ChoiceAnswer, ChoiceQuestion, ChoiceValue, DecisionAnswer, DecisionJsonPart, DecisionMediaPart, DecisionModel, DecisionModelCompatibility, DecisionModelSchema, DecisionPart, DecisionQuestion, DecisionRequest, DecisionResponse, DecisionTextPart, ErrorAnswer, PredicateAnswer, PredicateQuestion, ScoreAnswer, ScoreQuestion, } from "./decision.js";
27
+ export type { AnswerFor, AnswersFor, DecisionInput, DecisionModelOptions, DecisionOptions, DecisionQuestions, DecisionRequestFor, DecisionRequestInput, DecisionResponseFor, DecisionModelRoute, } from "./decision.js";
28
+ export { Decision } from "./decision.js";
29
+ export { DecisionRoute } from "./route/decision.js";
30
+ export { Media } from "./media.js";
31
+ export { Generation } from "./generation.js";
32
+ export type { AwaitOptions as GenerationAwaitOptions, Event as GenerationEvent, Poll, Route as GenerationRoute, Snapshot as GenerationSnapshot, Status as GenerationStatus, } from "./generation.js";
33
+ export { Tool, ToolFailure, toDefinitions } from "./tool.js";
34
+ export { ToolRuntime } from "./tool-runtime.js";
35
+ export type { DispatchResult as ToolDispatchResult, ToolSettlement } from "./tool-runtime.js";
36
+ export type { AnyExecutableTool, AnyTool, ExecutableTool, ExecutableTools, Definition as ToolShape, ToolExecute, ToolExecuteContext, ToolModelOutputInput, Tools, ToolSchema, ToolToModelOutput, } from "./tool.js";
37
+ export * as LLM from "./llm.js";
38
+ export type { Definition as ProviderDefinition, LanguageModelFactory as ProviderLanguageModelFactory, LanguageModelOptions as ProviderLanguageModelOptions, } from "./provider.js";
39
+ export type { Definition as ProviderPackageDefinition, Settings as ProviderPackageSettings, } from "./provider-package.js";
package/dist/effect.js ADDED
@@ -0,0 +1,28 @@
1
+ export { AIClient } from "./ai-client.js";
2
+ export { LLMClient } from "./route/client.js";
3
+ export { ImageClient } from "./image-client.js";
4
+ export { Auth } from "./route/auth.js";
5
+ export { Provider } from "./provider.js";
6
+ export { ProviderPackage } from "./provider-package.js";
7
+ export { isContextOverflow, isContextOverflowFailure, isRetryable } from "./provider-error.js";
8
+ export * from "./schema/index.js";
9
+ export { ImageAspectRatio, ImageEvent, ImageModel, ImageModelSchema, ImageRequest, ImageResponse } from "./image.js";
10
+ export { Image } from "./image.js";
11
+ export { VideoClient } from "./video-client.js";
12
+ export { VideoAspectRatio, VideoEvent, VideoFrames, VideoModel, VideoModelSchema, VideoRequest, VideoResponse, } from "./video.js";
13
+ export { Video } from "./video.js";
14
+ export { SpeechClient } from "./speech-client.js";
15
+ export { SpeechEvent, SpeechModel, SpeechModelSchema, SpeechRequest, SpeechResponse, SpeechTimestamp, SpeechVoice, } from "./speech.js";
16
+ export { Speech } from "./speech.js";
17
+ export { TranscriptionClient } from "./transcription-client.js";
18
+ export { TranscriptionEvent, TranscriptionModel, TranscriptionModelSchema, TranscriptionRequest, TranscriptionResponse, TranscriptionSegment, TranscriptionTimestamps, TranscriptionWord, } from "./transcription.js";
19
+ export { Transcription } from "./transcription.js";
20
+ export { DecisionClient } from "./decision-client.js";
21
+ export { ChoiceAnswer, ChoiceQuestion, ChoiceValue, DecisionAnswer, DecisionJsonPart, DecisionMediaPart, DecisionModel, DecisionModelCompatibility, DecisionModelSchema, DecisionPart, DecisionQuestion, DecisionRequest, DecisionResponse, DecisionTextPart, ErrorAnswer, PredicateAnswer, PredicateQuestion, ScoreAnswer, ScoreQuestion, } from "./decision.js";
22
+ export { Decision } from "./decision.js";
23
+ export { DecisionRoute } from "./route/decision.js";
24
+ export { Media } from "./media.js";
25
+ export { Generation } from "./generation.js";
26
+ export { Tool, ToolFailure, toDefinitions } from "./tool.js";
27
+ export { ToolRuntime } from "./tool-runtime.js";
28
+ export * as LLM from "./llm.js";
@@ -1,11 +1,11 @@
1
1
  import { LLMRequest, type EffortPart, type Message } from "./schema/messages.js";
2
2
  export declare const effortUpdate: (message: Message) => EffortPart | undefined;
3
- export declare const stripEffortUpdates: (request: LLMRequest) => LLMRequest<import("./index.js").LanguageModel<{
3
+ export declare const stripEffortUpdates: (request: LLMRequest) => LLMRequest<import("./effect.js").LanguageModel<{
4
4
  readonly [x: string]: unknown;
5
5
  }, import("./route.js").CompactionOperations | undefined>>;
6
6
  export declare const applyEffortUpdates: (request: LLMRequest) => LLMRequest;
7
7
  export declare const resolveEffortUpdates: (request: LLMRequest, current: string | undefined) => {
8
- request: LLMRequest<import("./index.js").LanguageModel<{
8
+ request: LLMRequest<import("./effect.js").LanguageModel<{
9
9
  readonly [x: string]: unknown;
10
10
  }, import("./route.js").CompactionOperations | undefined>>;
11
11
  effort: string | undefined;
@@ -9,7 +9,7 @@ export declare const Service: typeof ImageClientService;
9
9
  export type Service = ImageClientService;
10
10
  export declare const ImageClient: {
11
11
  readonly layer: import("effect/Layer").Layer<ImageClientService, never, import("./route/executor-service.js").RequestExecutorService>;
12
- readonly generate: (request: ImageRequestFor, options?: import("./generation.js").AwaitOptions) => import("effect/Effect").Effect<ImageResponse, import("./index.js").AIError, ImageClientService>;
12
+ readonly generate: (request: ImageRequestFor, options?: import("./generation.js").AwaitOptions) => import("effect/Effect").Effect<ImageResponse, import("./effect.js").AIError, ImageClientService>;
13
13
  readonly stream: (request: ImageRequestFor, options?: import("./generation.js").AwaitOptions) => import("effect/Stream").Stream<{
14
14
  readonly type: "image-partial";
15
15
  readonly index: number;
@@ -55,11 +55,11 @@ export declare const ImageClient: {
55
55
  readonly [x: string]: unknown;
56
56
  };
57
57
  } | undefined;
58
- } | import("./generation.js").Observation, import("./index.js").AIError, ImageClientService>;
59
- readonly start: (request: ImageRequestFor) => import("effect/Effect").Effect<import("./generation.js").Generation<ImageResponse>, import("./index.js").AIError, ImageClientService>;
58
+ } | import("./generation.js").Observation, import("./effect.js").AIError, ImageClientService>;
59
+ readonly start: (request: ImageRequestFor) => import("effect/Effect").Effect<import("./generation.js").Generation<ImageResponse>, import("./effect.js").AIError, ImageClientService>;
60
60
  readonly resume: (model: import("./image.js").ImageModel<{
61
61
  readonly [x: string]: unknown;
62
- }>, token: unknown) => import("effect/Effect").Effect<import("./generation.js").Generation<ImageResponse>, import("./index.js").AIError, ImageClientService>;
62
+ }>, token: unknown) => import("effect/Effect").Effect<import("./generation.js").Generation<ImageResponse>, import("./effect.js").AIError, ImageClientService>;
63
63
  readonly Service: typeof ImageClientService;
64
64
  };
65
65
  export {};