@opencode/ai 2.1.2 → 2.1.4

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 (140) hide show
  1. package/dist/cache-policy.js +6 -5
  2. package/dist/experimental/evaluation.d.ts +7 -6
  3. package/dist/experimental/evaluation.js +3 -11
  4. package/dist/experimental/realtime.d.ts +59 -0
  5. package/dist/experimental/realtime.js +21 -13
  6. package/dist/experimental.d.ts +1 -1
  7. package/dist/generation.js +1 -1
  8. package/dist/image-client.d.ts +11 -9
  9. package/dist/image.d.ts +158 -150
  10. package/dist/image.js +2 -2
  11. package/dist/llm.d.ts +2 -4
  12. package/dist/llm.js +2 -2
  13. package/dist/media-model.d.ts +2 -2
  14. package/dist/media-model.js +1 -1
  15. package/dist/promise.d.ts +121 -121
  16. package/dist/promise.js +3 -5
  17. package/dist/protocols/alibaba-chat.d.ts +18 -18
  18. package/dist/protocols/alibaba-chat.js +3 -3
  19. package/dist/protocols/alibaba-messages.d.ts +12 -12
  20. package/dist/protocols/alibaba-messages.js +1 -1
  21. package/dist/protocols/alibaba-responses.d.ts +38 -38
  22. package/dist/protocols/anthropic-messages.d.ts +40 -44
  23. package/dist/protocols/anthropic-messages.js +13 -15
  24. package/dist/protocols/bedrock-converse.d.ts +36 -85
  25. package/dist/protocols/bedrock-converse.js +6 -6
  26. package/dist/protocols/bedrock-event-stream.d.ts +6 -1
  27. package/dist/protocols/bedrock-event-stream.js +9 -8
  28. package/dist/protocols/cartesia-speech.d.ts +32 -32
  29. package/dist/protocols/cohere-chat.d.ts +13 -10
  30. package/dist/protocols/cohere-chat.js +2 -2
  31. package/dist/protocols/deepgram-speech.d.ts +32 -32
  32. package/dist/protocols/elevenlabs-speech.d.ts +32 -32
  33. package/dist/protocols/gemini.d.ts +46 -36
  34. package/dist/protocols/gemini.js +12 -15
  35. package/dist/protocols/google-interactions.d.ts +14 -13
  36. package/dist/protocols/google-interactions.js +16 -11
  37. package/dist/protocols/google-speech.d.ts +32 -32
  38. package/dist/protocols/google-transcription.d.ts +32 -32
  39. package/dist/protocols/meta-messages.d.ts +23 -23
  40. package/dist/protocols/meta-responses.d.ts +84 -84
  41. package/dist/protocols/mistral-chat.d.ts +81 -78
  42. package/dist/protocols/mistral-chat.js +3 -5
  43. package/dist/protocols/open-responses-channel.js +47 -46
  44. package/dist/protocols/open-responses-continuation.d.ts +8 -2
  45. package/dist/protocols/open-responses-continuation.js +3 -1
  46. package/dist/protocols/open-responses.d.ts +419 -419
  47. package/dist/protocols/open-responses.js +11 -10
  48. package/dist/protocols/openai-chat.d.ts +68 -67
  49. package/dist/protocols/openai-chat.js +7 -8
  50. package/dist/protocols/openai-compatible-chat.d.ts +13 -14
  51. package/dist/protocols/openai-compatible-responses.d.ts +39 -40
  52. package/dist/protocols/openai-images.d.ts +32 -32
  53. package/dist/protocols/openai-responses.d.ts +253 -253
  54. package/dist/protocols/openai-responses.js +1 -1
  55. package/dist/protocols/openai-speech.d.ts +32 -32
  56. package/dist/protocols/openai-transcription.d.ts +32 -32
  57. package/dist/protocols/openai-transcription.js +12 -7
  58. package/dist/protocols/utils/open-responses-options.d.ts +8 -8
  59. package/dist/protocols/utils/open-responses-options.js +4 -6
  60. package/dist/protocols/utils/partial-json-options.d.ts +0 -1
  61. package/dist/protocols/utils/partial-json-options.js +0 -1
  62. package/dist/protocols/utils/partial-json.js +5 -4
  63. package/dist/protocols/utils/tool-schema.d.ts +0 -3
  64. package/dist/protocols/utils/tool-schema.js +0 -4
  65. package/dist/protocols/utils/tool-stream.d.ts +1 -1
  66. package/dist/protocols/venice-chat.d.ts +52 -53
  67. package/dist/protocols/venice-chat.js +6 -5
  68. package/dist/protocols/xai-images.js +3 -4
  69. package/dist/protocols/xai-responses.d.ts +81 -81
  70. package/dist/protocols/zai-chat.d.ts +33 -30
  71. package/dist/protocols/zai-chat.js +8 -3
  72. package/dist/protocols/zai-messages.d.ts +21 -19
  73. package/dist/protocols/zai-messages.js +3 -2
  74. package/dist/provider-error.js +8 -7
  75. package/dist/providers/alibaba.d.ts +74 -74
  76. package/dist/providers/amazon-bedrock-mantle.d.ts +202 -202
  77. package/dist/providers/amazon-bedrock.d.ts +16 -13
  78. package/dist/providers/anthropic-compatible.d.ts +13 -13
  79. package/dist/providers/anthropic.d.ts +13 -13
  80. package/dist/providers/azure.d.ts +112 -112
  81. package/dist/providers/baseten.d.ts +24 -24
  82. package/dist/providers/cerebras.d.ts +24 -24
  83. package/dist/providers/cloudflare-ai-gateway.d.ts +237 -234
  84. package/dist/providers/cloudflare-ai-gateway.js +3 -6
  85. package/dist/providers/cloudflare-workers-ai.d.ts +24 -24
  86. package/dist/providers/cohere.d.ts +78 -74
  87. package/dist/providers/deepinfra.d.ts +24 -24
  88. package/dist/providers/deepseek.d.ts +24 -24
  89. package/dist/providers/digitalocean.d.ts +36 -36
  90. package/dist/providers/fireworks.d.ts +24 -24
  91. package/dist/providers/google-vertex-chat.d.ts +12 -12
  92. package/dist/providers/google-vertex-interactions.d.ts +3 -3
  93. package/dist/providers/google-vertex-messages.d.ts +20 -20
  94. package/dist/providers/google-vertex-mistral.d.ts +14 -14
  95. package/dist/providers/google-vertex-responses.d.ts +38 -38
  96. package/dist/providers/google-vertex.d.ts +17 -17
  97. package/dist/providers/google-vertex.js +2 -2
  98. package/dist/providers/google.d.ts +79 -79
  99. package/dist/providers/groq.d.ts +24 -24
  100. package/dist/providers/meta.d.ts +189 -189
  101. package/dist/providers/minimax.d.ts +202 -202
  102. package/dist/providers/mistral.d.ts +28 -28
  103. package/dist/providers/moonshot.d.ts +202 -202
  104. package/dist/providers/open-responses-options.d.ts +0 -1
  105. package/dist/providers/open-responses-options.js +1 -1
  106. package/dist/providers/openai-compatible-responses.d.ts +38 -38
  107. package/dist/providers/openai-compatible.d.ts +12 -12
  108. package/dist/providers/openai-compatible.js +1 -1
  109. package/dist/providers/openai-options.d.ts +3 -4
  110. package/dist/providers/openai-options.js +0 -1
  111. package/dist/providers/openai.d.ts +103 -103
  112. package/dist/providers/openrouter.d.ts +171 -112
  113. package/dist/providers/openrouter.js +40 -33
  114. package/dist/providers/togetherai.d.ts +24 -24
  115. package/dist/providers/venice.d.ts +195 -20
  116. package/dist/providers/xai.d.ts +12 -12
  117. package/dist/providers/zai-coding-plan.d.ts +152 -72
  118. package/dist/providers/zai.d.ts +84 -19
  119. package/dist/route/auth-options.d.ts +0 -3
  120. package/dist/route/auth.d.ts +0 -2
  121. package/dist/route/auth.js +0 -2
  122. package/dist/route/client.d.ts +0 -218
  123. package/dist/route/client.js +3 -7
  124. package/dist/route/executor-service.js +1 -1
  125. package/dist/route/transport/http.js +5 -8
  126. package/dist/schema/errors.d.ts +1 -1
  127. package/dist/schema/errors.js +1 -1
  128. package/dist/schema/messages.js +4 -7
  129. package/dist/speech-client.d.ts +11 -9
  130. package/dist/speech.d.ts +158 -150
  131. package/dist/speech.js +2 -2
  132. package/dist/transcription-client.d.ts +11 -9
  133. package/dist/transcription.d.ts +158 -150
  134. package/dist/transcription.js +2 -2
  135. package/dist/video-client.d.ts +11 -9
  136. package/dist/video.d.ts +124 -116
  137. package/dist/video.js +2 -2
  138. package/package.json +7 -6
  139. package/dist/protocols/utils/openai-options.d.ts +0 -16
  140. package/dist/protocols/utils/openai-options.js +0 -15
@@ -20,58 +20,59 @@ const message = (body) => Effect.gen(function* () {
20
20
  const driver = (options, body) => {
21
21
  let responseID;
22
22
  let terminal = false;
23
+ const observeEvent = Effect.fnUntraced(function* (_create, frame, event) {
24
+ if (terminal)
25
+ return yield* ProviderShared.eventError(options.id, `${options.name} emitted ${event.type} after a terminal event`, frame);
26
+ if (event.type === "error") {
27
+ terminal = true;
28
+ return {
29
+ type: "provider-failure",
30
+ error: OpenResponses.providerFailure(event, `${options.name} stream error`, frame),
31
+ };
32
+ }
33
+ if (event.type === "response.failed") {
34
+ terminal = true;
35
+ if (responseID && event.response?.id && event.response.id !== responseID)
36
+ return yield* ProviderShared.eventError(options.id, `${options.name} response ID changed during execution`, frame);
37
+ return {
38
+ type: "provider-failure",
39
+ error: OpenResponses.providerFailure(event, `${options.name} response failed`, frame),
40
+ };
41
+ }
42
+ if (event.type === "response.created") {
43
+ const created = event.response?.id;
44
+ if (responseID)
45
+ return yield* ProviderShared.eventError(options.id, `${options.name} emitted duplicate response.created`, frame);
46
+ if (!created)
47
+ return yield* ProviderShared.eventError(options.id, `${options.name} response.created is missing response.id`, frame);
48
+ responseID = created;
49
+ return { type: "frame", frame };
50
+ }
51
+ // Keepalives and provider notifications carry no response state and may precede response.created.
52
+ if (!event.type.startsWith("response."))
53
+ return { type: "frame", frame };
54
+ if (!responseID)
55
+ return yield* ProviderShared.eventError(options.id, `${options.name} emitted ${event.type} before response.created`, frame);
56
+ if (event.response?.id && event.response.id !== responseID)
57
+ return yield* ProviderShared.eventError(options.id, `${options.name} response ID changed during execution`, frame);
58
+ if (event.type === "response.completed") {
59
+ terminal = true;
60
+ return { type: "completed", frame };
61
+ }
62
+ if (event.type === "response.incomplete") {
63
+ terminal = true;
64
+ return { type: "incomplete", frame };
65
+ }
66
+ return { type: "frame", frame };
67
+ });
23
68
  return {
24
69
  create: () => Effect.sync(() => {
25
70
  responseID = undefined;
26
71
  terminal = false;
27
72
  return { message: body, mode: "full" };
28
73
  }),
29
- observe: (_create, frame) => Effect.gen(function* () {
30
- const event = yield* OpenResponses.decodeChannelEvent(frame).pipe(Effect.mapError((cause) => ProviderShared.eventError(options.id, `Invalid ${options.name} WebSocket event`, frame, cause)));
31
- if (terminal)
32
- return yield* ProviderShared.eventError(options.id, `${options.name} emitted ${event.type} after a terminal event`, frame);
33
- if (event.type === "error") {
34
- terminal = true;
35
- return {
36
- type: "provider-failure",
37
- error: OpenResponses.providerFailure(event, `${options.name} stream error`, frame),
38
- };
39
- }
40
- if (event.type === "response.failed") {
41
- terminal = true;
42
- if (responseID && event.response?.id && event.response.id !== responseID)
43
- return yield* ProviderShared.eventError(options.id, `${options.name} response ID changed during execution`, frame);
44
- return {
45
- type: "provider-failure",
46
- error: OpenResponses.providerFailure(event, `${options.name} response failed`, frame),
47
- };
48
- }
49
- if (event.type === "response.created") {
50
- const created = event.response?.id;
51
- if (responseID)
52
- return yield* ProviderShared.eventError(options.id, `${options.name} emitted duplicate response.created`, frame);
53
- if (!created)
54
- return yield* ProviderShared.eventError(options.id, `${options.name} response.created is missing response.id`, frame);
55
- responseID = created;
56
- return { type: "frame", frame };
57
- }
58
- // Keepalives and provider notifications carry no response state and may precede response.created.
59
- if (!event.type.startsWith("response."))
60
- return { type: "frame", frame };
61
- if (!responseID)
62
- return yield* ProviderShared.eventError(options.id, `${options.name} emitted ${event.type} before response.created`, frame);
63
- if (event.response?.id && event.response.id !== responseID)
64
- return yield* ProviderShared.eventError(options.id, `${options.name} response ID changed during execution`, frame);
65
- if (event.type === "response.completed") {
66
- terminal = true;
67
- return { type: "completed", frame };
68
- }
69
- if (event.type === "response.incomplete") {
70
- terminal = true;
71
- return { type: "incomplete", frame };
72
- }
73
- return { type: "frame", frame };
74
- }),
74
+ observeEvent,
75
+ observe: (create, frame) => OpenResponses.decodeChannelEvent(frame).pipe(Effect.mapError((cause) => ProviderShared.eventError(options.id, `Invalid ${options.name} WebSocket event`, frame, cause)), Effect.flatMap((event) => observeEvent(create, frame, event))),
75
76
  };
76
77
  };
77
78
  export const transport = (options) => {
@@ -1,15 +1,21 @@
1
- import type { WebSocketChannelDriver } from "../route/transport/index.js";
1
+ import { AIError } from "../schema/index.js";
2
+ import type { ChannelCreate, ChannelObservation, WebSocketChannelDriver } from "../route/transport/index.js";
3
+ import { Effect } from "effect";
4
+ import { OpenResponses } from "./open-responses.js";
2
5
  /**
3
6
  * Fields to send next to `previous_response_id` on an incremental step, or undefined to send the step in full.
4
7
  * Whether omitted fields carry over from the continued response is provider behavior the route must know.
5
8
  */
6
9
  export type Shape = (request: Readonly<Record<string, unknown>>) => Readonly<Record<string, unknown>> | undefined;
10
+ export interface BaseDriver extends WebSocketChannelDriver {
11
+ readonly observeEvent?: (create: ChannelCreate, frame: string, event: OpenResponses.Event) => Effect.Effect<ChannelObservation, AIError>;
12
+ }
7
13
  export interface DriverInput {
8
14
  readonly id: string;
9
15
  readonly name: string;
10
16
  readonly request: Readonly<Record<string, unknown>>;
11
17
  readonly message: string;
12
- readonly base: WebSocketChannelDriver;
18
+ readonly base: BaseDriver;
13
19
  readonly continuation?: Shape;
14
20
  }
15
21
  export declare const driver: (input: DriverInput) => WebSocketChannelDriver;
@@ -121,7 +121,9 @@ export const driver = (input) => {
121
121
  }),
122
122
  observe: (create, frame) => Effect.gen(function* () {
123
123
  const event = yield* OpenResponses.decodeChannelEvent(frame).pipe(Effect.mapError((cause) => ProviderShared.eventError(input.id, `Invalid ${input.name} WebSocket event`, frame, cause)));
124
- const observation = yield* input.base.observe(create, frame);
124
+ const observation = yield* input.base.observeEvent
125
+ ? input.base.observeEvent(create, frame, event)
126
+ : input.base.observe(create, frame);
125
127
  if (event.type === "response.output_item.done" && event.item)
126
128
  output.push(event.item);
127
129
  if (observation.type === "provider-failure") {