@opencode/ai 0.0.0-dev-21426 → 0.0.0-dev-21430

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.
@@ -7,6 +7,7 @@ export type RealtimeTransportInput = {
7
7
  } | {
8
8
  readonly type: "websocket";
9
9
  };
10
+ export type RealtimeTransportType = RealtimeTransportInput["type"];
10
11
  export type RealtimeTransport = {
11
12
  readonly type: "webrtc";
12
13
  readonly sdp: string;
@@ -23,25 +24,83 @@ export interface RealtimeConnectInput {
23
24
  readonly session?: RealtimeSession;
24
25
  readonly transport: RealtimeTransportInput;
25
26
  }
27
+ export declare const engines: readonly [{
28
+ readonly family: "gpt-live";
29
+ readonly model: "gpt-live-1";
30
+ readonly id: "openai-live";
31
+ readonly provider: "openai";
32
+ readonly transports: readonly ["webrtc"];
33
+ }, {
34
+ readonly family: "gpt-realtime";
35
+ readonly model: "gpt-realtime-2.1";
36
+ readonly id: "openai-realtime";
37
+ readonly provider: "openai";
38
+ readonly transports: readonly ["webrtc", "websocket"];
39
+ }, {
40
+ readonly family: "grok-voice";
41
+ readonly model: "grok-voice-3.0";
42
+ readonly id: "xai-realtime";
43
+ readonly provider: "xai";
44
+ readonly transports: readonly ["websocket"];
45
+ }, {
46
+ readonly family: "gemini-3.8-live";
47
+ readonly model: "gemini-3.8-live";
48
+ readonly id: "gemini-live";
49
+ readonly provider: "google";
50
+ readonly transports: readonly ["websocket"];
51
+ }];
26
52
  export declare const engine: (model: string) => {
27
53
  readonly family: "gpt-live";
54
+ readonly model: "gpt-live-1";
28
55
  readonly id: "openai-live";
29
56
  readonly provider: "openai";
57
+ readonly transports: readonly ["webrtc"];
30
58
  } | {
31
59
  readonly family: "gpt-realtime";
60
+ readonly model: "gpt-realtime-2.1";
32
61
  readonly id: "openai-realtime";
33
62
  readonly provider: "openai";
63
+ readonly transports: readonly ["webrtc", "websocket"];
34
64
  } | {
35
65
  readonly family: "grok-voice";
66
+ readonly model: "grok-voice-3.0";
36
67
  readonly id: "xai-realtime";
37
68
  readonly provider: "xai";
69
+ readonly transports: readonly ["websocket"];
38
70
  } | {
39
71
  readonly family: "gemini-3.8-live";
72
+ readonly model: "gemini-3.8-live";
40
73
  readonly id: "gemini-live";
41
74
  readonly provider: "google";
75
+ readonly transports: readonly ["websocket"];
42
76
  } | undefined;
43
77
  export declare const connect: (input: RealtimeConnectInput) => Effect.Effect<RealtimeTransport, AIError, import("../route/executor-service.js").RequestExecutorService>;
44
78
  export declare const Realtime: {
79
+ readonly engines: readonly [{
80
+ readonly family: "gpt-live";
81
+ readonly model: "gpt-live-1";
82
+ readonly id: "openai-live";
83
+ readonly provider: "openai";
84
+ readonly transports: readonly ["webrtc"];
85
+ }, {
86
+ readonly family: "gpt-realtime";
87
+ readonly model: "gpt-realtime-2.1";
88
+ readonly id: "openai-realtime";
89
+ readonly provider: "openai";
90
+ readonly transports: readonly ["webrtc", "websocket"];
91
+ }, {
92
+ readonly family: "grok-voice";
93
+ readonly model: "grok-voice-3.0";
94
+ readonly id: "xai-realtime";
95
+ readonly provider: "xai";
96
+ readonly transports: readonly ["websocket"];
97
+ }, {
98
+ readonly family: "gemini-3.8-live";
99
+ readonly model: "gemini-3.8-live";
100
+ readonly id: "gemini-live";
101
+ readonly provider: "google";
102
+ readonly transports: readonly ["websocket"];
103
+ }];
45
104
  readonly engine: typeof engine;
46
105
  readonly connect: (input: RealtimeConnectInput) => Effect.Effect<RealtimeTransport, AIError, import("../route/executor-service.js").RequestExecutorService>;
47
106
  };
@@ -6,11 +6,23 @@ import { encodeJson } from "../utils/json.js";
6
6
  const OPENAI_BASE_URL = "https://api.openai.com/v1";
7
7
  const XAI_BASE_URL = "https://api.x.ai/v1";
8
8
  const GOOGLE_BASE_URL = "https://generativelanguage.googleapis.com/v1beta";
9
- const engines = [
10
- { family: "gpt-live", id: "openai-live", provider: "openai" },
11
- { family: "gpt-realtime", id: "openai-realtime", provider: "openai" },
12
- { family: "grok-voice", id: "xai-realtime", provider: "xai" },
13
- { family: "gemini-3.8-live", id: "gemini-live", provider: "google" },
9
+ export const engines = [
10
+ { family: "gpt-live", model: "gpt-live-1", id: "openai-live", provider: "openai", transports: ["webrtc"] },
11
+ {
12
+ family: "gpt-realtime",
13
+ model: "gpt-realtime-2.1",
14
+ id: "openai-realtime",
15
+ provider: "openai",
16
+ transports: ["webrtc", "websocket"],
17
+ },
18
+ { family: "grok-voice", model: "grok-voice-3.0", id: "xai-realtime", provider: "xai", transports: ["websocket"] },
19
+ {
20
+ family: "gemini-3.8-live",
21
+ model: "gemini-3.8-live",
22
+ id: "gemini-live",
23
+ provider: "google",
24
+ transports: ["websocket"],
25
+ },
14
26
  ];
15
27
  // Matches the bare family name (`gpt-realtime`) and its versions (`gpt-realtime-2.1`, `gpt-realtime-mini`).
16
28
  export const engine = (model) => engines.find((item) => model === item.family || model.startsWith(`${item.family}-`));
@@ -18,11 +30,11 @@ export const connect = Effect.fn("Realtime.connect")(function* (input) {
18
30
  const resolved = engine(input.model);
19
31
  if (!resolved)
20
32
  return yield* invalidRequest(`Unsupported voice model: ${input.model}`);
33
+ if (!resolved.transports.some((type) => type === input.transport.type))
34
+ return yield* invalidRequest(`${input.model} only supports ${resolved.transports.join(", ")} transport`);
21
35
  const session = { ...input.session, model: input.model };
22
36
  switch (resolved.id) {
23
37
  case "openai-live": {
24
- if (input.transport.type !== "webrtc")
25
- return yield* invalidRequest("OpenAI GPT-Live only supports WebRTC transport");
26
38
  const data = yield* post(resolved.id, `${OPENAI_BASE_URL}/live/sessions`, input.apiKey, { session, transport: input.transport }, LiveSessionResponse);
27
39
  return { type: "webrtc", sdp: data.transport.sdp };
28
40
  }
@@ -39,16 +51,11 @@ export const connect = Effect.fn("Realtime.connect")(function* (input) {
39
51
  const sdp = yield* post(resolved.id, `${OPENAI_BASE_URL}/realtime/calls${query}`, input.apiKey, form, Schema.String);
40
52
  return { type: "webrtc", sdp };
41
53
  }
42
- case "xai-realtime": {
43
- if (input.transport.type !== "websocket")
44
- return yield* invalidRequest("xAI Grok Voice only supports WebSocket transport");
54
+ case "xai-realtime":
45
55
  return yield* clientSecret(resolved.id, XAI_BASE_URL, input.model, input.apiKey, {
46
56
  expires_after: { seconds: 60 },
47
57
  });
48
- }
49
58
  case "gemini-live": {
50
- if (input.transport.type !== "websocket")
51
- return yield* invalidRequest("Google Gemini Live only supports WebSocket transport");
52
59
  const now = yield* Clock.currentTimeMillis;
53
60
  const expiresAt = now + 60_000;
54
61
  const data = yield* post(resolved.id, `${GOOGLE_BASE_URL}/auth_tokens`, input.apiKey, {
@@ -67,6 +74,7 @@ export const connect = Effect.fn("Realtime.connect")(function* (input) {
67
74
  }
68
75
  });
69
76
  export const Realtime = {
77
+ engines,
70
78
  engine,
71
79
  connect,
72
80
  };
@@ -2,4 +2,4 @@ export { EvaluationClient } from "./experimental/evaluation-client.js";
2
2
  export { BooleanAnswer, BooleanQuestion, ChoiceAnswer, ChoiceQuestion, Evaluation, EvaluationAnswer, EvaluationInput, EvaluationModel, EvaluationModelSchema, EvaluationQuestion, EvaluationRequest, EvaluationResponse, EvaluationRounding, ScoreAnswer, ScoreQuestion, } from "./experimental/evaluation.js";
3
3
  export type { AnswerFor, AnswersFor, EvaluationModelOptions, EvaluationOptions, EvaluationQuestions, EvaluationRequestFor, EvaluationRequestInput, EvaluationResponseFor, EvaluationRoute, } from "./experimental/evaluation.js";
4
4
  export { Realtime } from "./experimental/realtime.js";
5
- export type { RealtimeConnectInput, RealtimeSession, RealtimeTransport, RealtimeTransportInput, } from "./experimental/realtime.js";
5
+ export type { RealtimeConnectInput, RealtimeSession, RealtimeTransport, RealtimeTransportInput, RealtimeTransportType, } from "./experimental/realtime.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
- "version": "0.0.0-dev-21426",
3
+ "version": "0.0.0-dev-21430",
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.1",
37
- "@opencode/http-recorder": "0.0.0-dev-21426",
37
+ "@opencode/http-recorder": "0.0.0-dev-21430",
38
38
  "@tsconfig/bun": "1.0.9",
39
39
  "@types/bun": "1.4.0",
40
40
  "@typescript/native": "npm:typescript@7.0.2",
@@ -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": "0.0.0-dev-21426",
47
+ "@opencode/schema": "0.0.0-dev-21430",
48
48
  "aws4fetch": "1.0.20",
49
49
  "effect": "4.0.1",
50
50
  "google-auth-library": "10.5.0"