@sentropic/llm-mesh 0.30.0 → 0.31.0

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.
@@ -1,4 +1,5 @@
1
1
  export * from './contracts.js';
2
2
  export * from './capabilities.js';
3
3
  export * from './catalog.js';
4
+ export * from './openai-transcription.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/speech/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/speech/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from './contracts.js';
2
2
  export * from './capabilities.js';
3
3
  export * from './catalog.js';
4
+ export * from './openai-transcription.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/speech/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/speech/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC"}
@@ -0,0 +1,173 @@
1
+ import type { SpeechBinding, SpeechEngineIdentity, SpeechEvent, SpeechInputFrame, SpeechSession, SpeechSessionReceipt, SpeechSessionRequest } from './contracts.js';
2
+ import type { SpeechCapabilities } from './capabilities.js';
3
+ export declare const OPENAI_TRANSCRIPTION_PROVIDER_ID = "openai";
4
+ export declare const OPENAI_TRANSCRIPTION_ADAPTER_ID = "openai-transcription";
5
+ export declare const OPENAI_TRANSCRIPTION_ADAPTER_REVISION = "1";
6
+ export declare const OPENAI_TRANSCRIPTION_PLACEMENT: "cloud-relay";
7
+ export declare const OPENAI_TRANSCRIPTION_WS_URL = "wss://api.openai.com/v1/realtime?intent=transcription";
8
+ export declare const openAiTranscriptionModels: readonly ["gpt-live-transcribe", "gpt-realtime-whisper"];
9
+ export type OpenAiTranscriptionModelId = (typeof openAiTranscriptionModels)[number];
10
+ export declare const openAiTranscriptionDelays: readonly ["minimal", "low", "medium", "high", "xhigh"];
11
+ export type OpenAiTranscriptionDelay = (typeof openAiTranscriptionDelays)[number];
12
+ /** Independent per-profile configuration. No shared mutable state between profiles. */
13
+ export interface OpenAiTranscriptionProfileConfig {
14
+ readonly modelId: OpenAiTranscriptionModelId;
15
+ /** Served model snapshot pinned at admission; never an unreviewed `latest` alias. */
16
+ readonly modelRevision: string;
17
+ /** Latency/accuracy tradeoff; per-profile, never inherited. */
18
+ readonly delay: OpenAiTranscriptionDelay;
19
+ readonly language?: string;
20
+ readonly prompt?: string;
21
+ /** Client-owned turn detection only. Any other value refuses at open. */
22
+ readonly turnDetection?: 'client';
23
+ readonly accountRef?: string;
24
+ readonly region?: string;
25
+ }
26
+ export declare const openAiTranscriptionIdentity: (config: OpenAiTranscriptionProfileConfig) => SpeechEngineIdentity;
27
+ /** Per-profile capabilities. TTS is unsupported: synthesis is selected separately (local or L13). */
28
+ export declare const openAiTranscriptionCapabilities: (config: OpenAiTranscriptionProfileConfig) => SpeechCapabilities;
29
+ /** Exact `session.update` body. `turn_detection` is always null (server VAD unsupported). */
30
+ export declare const buildTranscriptionSessionUpdate: (config: OpenAiTranscriptionProfileConfig) => Record<string, unknown>;
31
+ export declare class OpenAiTranscriptionError extends Error {
32
+ readonly code: 'unknown-model' | 'invalid-config' | 'admission' | 'ceiling' | 'closed' | 'aborted' | 'transport' | 'invalid-format' | 'unsupported-command';
33
+ constructor(code: OpenAiTranscriptionError['code'], message: string);
34
+ }
35
+ /**
36
+ * Admission outcome consumed as data (gateway `admitSpeech` runs at
37
+ * composition, L16/API — mesh never imports the gateway). The session
38
+ * refuses to open without it and never exceeds its ceilings.
39
+ */
40
+ export interface OpenAiTranscriptionAdmission {
41
+ readonly operationId: string;
42
+ readonly holdRef: string;
43
+ readonly pricingRevision: string;
44
+ readonly ceiling: {
45
+ readonly connectedSeconds: number;
46
+ readonly admittedAudioSeconds: number;
47
+ };
48
+ readonly maxDurationMs: number;
49
+ }
50
+ export interface OpenAiTranscriptionUsageTotals {
51
+ readonly connectedSeconds: number;
52
+ readonly admittedAudioSeconds: number;
53
+ }
54
+ /**
55
+ * Usage sink shaped for the gateway `recordSpeechUsage` / `settleSpeech`
56
+ * calls the composition layer performs. The adapter only measures seconds;
57
+ * pricing stays pinned at admission.
58
+ */
59
+ export interface OpenAiTranscriptionUsageSink {
60
+ /**
61
+ * Maps to the L8 `recordSpeechUsage` call: operational evidence on the hold,
62
+ * never a charge. The adapter sends `cumulative` totals under a stable
63
+ * eventId so restarts and retries cannot double-count measured seconds.
64
+ */
65
+ record(update: {
66
+ readonly eventId: string;
67
+ readonly revision: number;
68
+ readonly mode: 'cumulative' | 'incremental';
69
+ readonly usage: Partial<OpenAiTranscriptionUsageTotals>;
70
+ }): void | Promise<void>;
71
+ /**
72
+ * Maps to the L8 `settleSpeech` call. Usage stays absent unless provider-
73
+ * reported (with a monotonic providerRevision): locally measured seconds
74
+ * are estimates, and a usage covering every priced dimension without a
75
+ * providerRevision is rejected by `settleSpeech` as invalid.
76
+ */
77
+ settle(request: {
78
+ readonly operationId: string;
79
+ readonly outcome: 'completed' | 'cancelled' | 'failed';
80
+ readonly usage?: OpenAiTranscriptionUsageTotals;
81
+ readonly providerRevision?: number;
82
+ }): void | Promise<void>;
83
+ }
84
+ /** Injectable provider socket. Tests use recorded scripts; never a live call. */
85
+ export interface OpenAiTranscriptionSocket {
86
+ send(message: string): void;
87
+ messages(): AsyncIterable<string>;
88
+ close(): Promise<void>;
89
+ }
90
+ export interface OpenAiTranscriptionConnect {
91
+ (url: string, headers: {
92
+ readonly authorization: string;
93
+ readonly originator: string;
94
+ }): Promise<OpenAiTranscriptionSocket> | OpenAiTranscriptionSocket;
95
+ }
96
+ export interface OpenAiTranscriptionOpenOptions {
97
+ readonly request: SpeechSessionRequest;
98
+ readonly admission: OpenAiTranscriptionAdmission;
99
+ /** Bearer material, used once for the socket handshake and never logged. */
100
+ readonly bearerToken: string;
101
+ readonly connect: OpenAiTranscriptionConnect;
102
+ readonly usage: OpenAiTranscriptionUsageSink;
103
+ readonly originator?: string;
104
+ readonly nowMs?: () => number;
105
+ /** Injectable expiry scheduler (tests advance it manually); defaults to setTimeout. */
106
+ readonly schedule?: (delayMs: number, fn: () => void) => () => void;
107
+ readonly signal?: AbortSignal;
108
+ }
109
+ export declare class TranscriptionSession implements SpeechSession {
110
+ readonly receipt: SpeechSessionReceipt;
111
+ readonly events: AsyncIterable<SpeechEvent>;
112
+ private readonly socket;
113
+ private readonly binding;
114
+ private readonly admission;
115
+ private readonly usage;
116
+ private readonly nowMs?;
117
+ private readonly openedAtMs;
118
+ private readonly items;
119
+ private readonly queue;
120
+ private readonly waiters;
121
+ private sequence;
122
+ private eventId;
123
+ private audioSeconds;
124
+ private settled;
125
+ private outcome;
126
+ private readonly pump;
127
+ private readonly signal?;
128
+ private readonly effectiveMaxMs;
129
+ private abortHandler?;
130
+ private expiryCancel?;
131
+ private inPump;
132
+ private turnAudioStartMs?;
133
+ /** End of the last frame written in the open turn (capture + frame duration). */
134
+ private turnAudioEndMs?;
135
+ private openTurnUtteranceId?;
136
+ private readonly turns;
137
+ private readonly bindings;
138
+ /** Finalized items: late deltas/commits drop silently, a second final errors. */
139
+ private readonly finalizedIds;
140
+ /** Cleared items: every late provider frame drops silently. */
141
+ private readonly clearedIds;
142
+ private committedAudioSeconds;
143
+ private usageRevision;
144
+ constructor(receipt: SpeechSessionReceipt, socket: OpenAiTranscriptionSocket, binding: SpeechBinding, admission: OpenAiTranscriptionAdmission, usage: OpenAiTranscriptionUsageSink, nowMs: (() => number) | undefined, signal: AbortSignal | undefined, schedule: ((delayMs: number, fn: () => void) => () => void) | undefined, maxDurationMs: number);
145
+ private nextId;
146
+ private emit;
147
+ private clock;
148
+ private stream;
149
+ write(frame: SpeechInputFrame): Promise<void>;
150
+ command(command: Parameters<SpeechSession['command']>[0]): Promise<void>;
151
+ close(): Promise<void>;
152
+ private pushError;
153
+ /**
154
+ * Resolve the client turn for a provider item. Committed binds are
155
+ * authoritative; before the `committed` frame arrives the oldest
156
+ * unconfirmed turn is used (peeked, never consumed), falling back to the
157
+ * turn currently being recorded. Sequential client turns make all three agree.
158
+ */
159
+ private attribute;
160
+ private newItem;
161
+ private onCommitted;
162
+ private onDelta;
163
+ private onCompleted;
164
+ private onFrame;
165
+ private run;
166
+ }
167
+ /**
168
+ * Open an admitted transcription session. The bearer token travels only into
169
+ * the socket handshake; failures never echo it. The `session.update` is sent
170
+ * before any audio; an aborted signal refuses without connecting.
171
+ */
172
+ export declare const openTranscriptionSession: (config: OpenAiTranscriptionProfileConfig, options: OpenAiTranscriptionOpenOptions) => Promise<TranscriptionSession>;
173
+ //# sourceMappingURL=openai-transcription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-transcription.d.ts","sourceRoot":"","sources":["../../src/speech/openai-transcription.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,659 @@
1
+ import { isValidSpeechAudioFrame } from './contracts.js';
2
+ export const OPENAI_TRANSCRIPTION_PROVIDER_ID = 'openai';
3
+ export const OPENAI_TRANSCRIPTION_ADAPTER_ID = 'openai-transcription';
4
+ export const OPENAI_TRANSCRIPTION_ADAPTER_REVISION = '1';
5
+ export const OPENAI_TRANSCRIPTION_PLACEMENT = 'cloud-relay';
6
+ export const OPENAI_TRANSCRIPTION_WS_URL = 'wss://api.openai.com/v1/realtime?intent=transcription';
7
+ export const openAiTranscriptionModels = ['gpt-live-transcribe', 'gpt-realtime-whisper'];
8
+ export const openAiTranscriptionDelays = ['minimal', 'low', 'medium', 'high', 'xhigh'];
9
+ const TRANSCRIPTION_FORMAT = { codec: 'pcm16-le', sampleRateHz: 24000, channels: 1 };
10
+ export const openAiTranscriptionIdentity = (config) => ({
11
+ providerId: OPENAI_TRANSCRIPTION_PROVIDER_ID,
12
+ modelId: config.modelId,
13
+ modelRevision: config.modelRevision,
14
+ adapterId: OPENAI_TRANSCRIPTION_ADAPTER_ID,
15
+ adapterRevision: OPENAI_TRANSCRIPTION_ADAPTER_REVISION,
16
+ placement: OPENAI_TRANSCRIPTION_PLACEMENT,
17
+ });
18
+ const isNonEmptyString = (value) => typeof value === 'string' && value.length > 0;
19
+ /** Per-profile capabilities. TTS is unsupported: synthesis is selected separately (local or L13). */
20
+ export const openAiTranscriptionCapabilities = (config) => {
21
+ if (!openAiTranscriptionModels.includes(config.modelId)) {
22
+ throw new OpenAiTranscriptionError('unknown-model', `unknown OpenAI transcription model: ${String(config.modelId)}`);
23
+ }
24
+ if (!isNonEmptyString(config.modelRevision)) {
25
+ throw new OpenAiTranscriptionError('invalid-config', 'modelRevision must be a pinned non-empty revision');
26
+ }
27
+ if (!openAiTranscriptionDelays.includes(config.delay)) {
28
+ throw new OpenAiTranscriptionError('invalid-config', `delay must be one of ${openAiTranscriptionDelays.join(', ')}`);
29
+ }
30
+ if (config.turnDetection !== undefined && config.turnDetection !== 'client') {
31
+ throw new OpenAiTranscriptionError('invalid-config', 'only client turn detection is supported for this profile');
32
+ }
33
+ return {
34
+ binding: openAiTranscriptionIdentity(config),
35
+ ...(config.language ? { languages: [config.language] } : {}),
36
+ ...(config.region ? { regions: [config.region] } : {}),
37
+ features: {
38
+ streamingStt: 'supported',
39
+ partialTranscript: 'supported',
40
+ nativeDuplex: 'unsupported',
41
+ tts: 'unsupported',
42
+ serverVad: 'unsupported',
43
+ clientVad: 'supported',
44
+ manualCommit: 'supported',
45
+ playoutTruncate: 'unsupported',
46
+ toolCancellation: 'unsupported',
47
+ resume: 'unknown',
48
+ },
49
+ inputFormats: [TRANSCRIPTION_FORMAT],
50
+ outputFormats: [],
51
+ usageUnits: ['audio-seconds', 'session-seconds'],
52
+ };
53
+ };
54
+ /** Exact `session.update` body. `turn_detection` is always null (server VAD unsupported). */
55
+ export const buildTranscriptionSessionUpdate = (config) => {
56
+ // Reuse the capability gate so the wire can never carry an unvalidated profile.
57
+ openAiTranscriptionCapabilities(config);
58
+ return {
59
+ type: 'session.update',
60
+ session: {
61
+ type: 'transcription',
62
+ audio: {
63
+ input: {
64
+ format: { type: 'audio/pcm', rate: TRANSCRIPTION_FORMAT.sampleRateHz },
65
+ transcription: {
66
+ model: config.modelId,
67
+ delay: config.delay,
68
+ ...(config.language ? { language: config.language } : {}),
69
+ ...(config.prompt ? { prompt: config.prompt } : {}),
70
+ },
71
+ turn_detection: null,
72
+ },
73
+ },
74
+ },
75
+ };
76
+ };
77
+ export class OpenAiTranscriptionError extends Error {
78
+ code;
79
+ constructor(code, message) {
80
+ super(message);
81
+ this.name = 'OpenAiTranscriptionError';
82
+ this.code = code;
83
+ }
84
+ }
85
+ /** Portable base64 for PCM payloads (no node:buffer; mesh stays runtime-agnostic). */
86
+ const base64Of = (payload) => {
87
+ const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
88
+ let out = '';
89
+ for (let i = 0; i < payload.length; i += 3) {
90
+ const a = payload[i] ?? 0;
91
+ const b = payload[i + 1] ?? 0;
92
+ const c = payload[i + 2] ?? 0;
93
+ const triple = (a << 16) | (b << 8) | c;
94
+ out += alphabet[(triple >> 18) & 63] + alphabet[(triple >> 12) & 63]
95
+ + (i + 1 < payload.length ? alphabet[(triple >> 6) & 63] : '=')
96
+ + (i + 2 < payload.length ? alphabet[triple & 63] : '=');
97
+ }
98
+ return out;
99
+ };
100
+ const assertAdmission = (admission) => {
101
+ if (!admission || !isNonEmptyString(admission.operationId) || !isNonEmptyString(admission.holdRef)
102
+ || !isNonEmptyString(admission.pricingRevision)
103
+ || !(admission.ceiling?.connectedSeconds > 0) || !(admission.ceiling?.admittedAudioSeconds > 0)
104
+ || !(admission.maxDurationMs > 0)) {
105
+ throw new OpenAiTranscriptionError('admission', 'a valid admission (operation, hold, ceilings) is required');
106
+ }
107
+ };
108
+ const monotonicNow = (nowMs) => {
109
+ const now = (nowMs ?? Date.now)();
110
+ if (!Number.isFinite(now) || now < 0)
111
+ throw new OpenAiTranscriptionError('invalid-config', 'clock must be finite');
112
+ return now;
113
+ };
114
+ const errorEvent = (base, eventId, sequence, reason, retryable) => ({
115
+ schemaVersion: 1,
116
+ speechSessionId: base.speechSessionId,
117
+ connectionEpoch: base.connectionEpoch,
118
+ eventId,
119
+ sequence,
120
+ clock: base.clock,
121
+ type: 'error',
122
+ reason,
123
+ retryable,
124
+ });
125
+ export class TranscriptionSession {
126
+ receipt;
127
+ events;
128
+ socket;
129
+ binding;
130
+ admission;
131
+ usage;
132
+ nowMs;
133
+ openedAtMs;
134
+ items = new Map();
135
+ queue = [];
136
+ waiters = [];
137
+ sequence = 0;
138
+ eventId = 0;
139
+ audioSeconds = 0;
140
+ settled = false;
141
+ outcome = 'completed';
142
+ pump;
143
+ signal;
144
+ effectiveMaxMs;
145
+ abortHandler;
146
+ expiryCancel;
147
+ inPump = false;
148
+ turnAudioStartMs;
149
+ /** End of the last frame written in the open turn (capture + frame duration). */
150
+ turnAudioEndMs;
151
+ openTurnUtteranceId;
152
+ turns = [];
153
+ bindings = new Map();
154
+ /** Finalized items: late deltas/commits drop silently, a second final errors. */
155
+ finalizedIds = new Set();
156
+ /** Cleared items: every late provider frame drops silently. */
157
+ clearedIds = new Set();
158
+ committedAudioSeconds = 0;
159
+ usageRevision = 0;
160
+ constructor(receipt, socket, binding, admission, usage, nowMs, signal, schedule, maxDurationMs) {
161
+ this.receipt = receipt;
162
+ this.socket = socket;
163
+ this.binding = binding;
164
+ this.admission = admission;
165
+ this.usage = usage;
166
+ this.nowMs = nowMs;
167
+ this.signal = signal;
168
+ this.openedAtMs = monotonicNow(nowMs);
169
+ this.effectiveMaxMs = Math.min(admission.maxDurationMs, maxDurationMs);
170
+ this.events = this.stream();
171
+ this.pump = this.run(signal);
172
+ const arm = schedule ?? ((delayMs, fn) => {
173
+ const timer = setTimeout(fn, delayMs);
174
+ return () => clearTimeout(timer);
175
+ });
176
+ this.expiryCancel = arm(this.effectiveMaxMs, () => {
177
+ this.pushError('ceiling', false);
178
+ this.outcome = 'cancelled';
179
+ void this.close();
180
+ });
181
+ if (signal) {
182
+ if (signal.aborted) {
183
+ this.outcome = 'cancelled';
184
+ void this.close();
185
+ }
186
+ else {
187
+ this.abortHandler = () => {
188
+ this.outcome = 'cancelled';
189
+ void this.close();
190
+ };
191
+ signal.addEventListener('abort', this.abortHandler, { once: true });
192
+ }
193
+ }
194
+ }
195
+ nextId() {
196
+ this.eventId += 1;
197
+ return `evt-${this.eventId}`;
198
+ }
199
+ emit(event) {
200
+ this.queue.push(event);
201
+ const waiter = this.waiters.shift();
202
+ if (waiter)
203
+ waiter();
204
+ }
205
+ clock() {
206
+ return { id: 'openai-transcription', monotonicMs: monotonicNow(this.nowMs) };
207
+ }
208
+ async *stream() {
209
+ let index = 0;
210
+ for (;;) {
211
+ while (index >= this.queue.length) {
212
+ if (this.settled)
213
+ return;
214
+ await new Promise((resolve) => this.waiters.push(resolve));
215
+ }
216
+ const event = this.queue[index++];
217
+ // Bound the queue for long sessions: consumed events are dropped.
218
+ if (index > 1024) {
219
+ this.queue.splice(0, index);
220
+ index = 0;
221
+ }
222
+ yield event;
223
+ }
224
+ }
225
+ async write(frame) {
226
+ if (this.settled)
227
+ throw new OpenAiTranscriptionError('closed', 'session is closed');
228
+ if (!isValidSpeechAudioFrame(frame) || frame.type !== 'audio.input') {
229
+ throw new OpenAiTranscriptionError('invalid-format', 'audio.input frame failed validation');
230
+ }
231
+ if (frame.format.codec !== TRANSCRIPTION_FORMAT.codec
232
+ || frame.format.sampleRateHz !== TRANSCRIPTION_FORMAT.sampleRateHz
233
+ || frame.format.channels !== TRANSCRIPTION_FORMAT.channels) {
234
+ throw new OpenAiTranscriptionError('invalid-format', 'only pcm16-le 24kHz mono is admitted');
235
+ }
236
+ if (monotonicNow(this.nowMs) - this.openedAtMs >= this.effectiveMaxMs) {
237
+ throw new OpenAiTranscriptionError('ceiling', 'session duration bound reached');
238
+ }
239
+ const seconds = frame.sampleCount / frame.format.sampleRateHz;
240
+ if (!(seconds > 0) || this.audioSeconds + seconds > this.admission.ceiling.admittedAudioSeconds) {
241
+ throw new OpenAiTranscriptionError('ceiling', 'admitted audio ceiling reached');
242
+ }
243
+ this.audioSeconds += seconds;
244
+ this.openTurnUtteranceId = frame.utteranceId;
245
+ // Capture-domain turn window for the final's audioInterval: the window
246
+ // belongs to the open turn only, never to a session-wide maximum (a later
247
+ // turn must not stretch an earlier turn's interval). Dispatch ordering
248
+ // stays with L2.
249
+ if (Number.isFinite(frame.capturedAtMs) && frame.capturedAtMs >= 0) {
250
+ this.turnAudioStartMs ??= frame.capturedAtMs;
251
+ this.turnAudioEndMs = frame.capturedAtMs + (frame.sampleCount / frame.format.sampleRateHz) * 1000;
252
+ }
253
+ // The payload is encoded and released here; the adapter retains only counters.
254
+ const audio = base64Of(frame.payload);
255
+ this.socket.send(JSON.stringify({ type: 'input_audio_buffer.append', audio }));
256
+ }
257
+ async command(command) {
258
+ if (this.settled && command.type !== 'session.close') {
259
+ throw new OpenAiTranscriptionError('closed', 'session is closed');
260
+ }
261
+ switch (command.type) {
262
+ case 'input.commit': {
263
+ if (monotonicNow(this.nowMs) - this.openedAtMs >= this.effectiveMaxMs) {
264
+ throw new OpenAiTranscriptionError('ceiling', 'session duration bound reached');
265
+ }
266
+ this.socket.send(JSON.stringify({ type: 'input_audio_buffer.commit' }));
267
+ this.turns.push({
268
+ utteranceId: command.utteranceId,
269
+ startMs: this.turnAudioStartMs ?? 0,
270
+ endMs: this.turnAudioEndMs ?? this.turnAudioStartMs ?? 0,
271
+ });
272
+ this.turnAudioStartMs = undefined;
273
+ this.turnAudioEndMs = undefined;
274
+ this.openTurnUtteranceId = undefined;
275
+ // Cumulative operational totals (L8 sums incremental events per eventId,
276
+ // so a per-turn total would double-count); the composition settles from these.
277
+ this.committedAudioSeconds = this.audioSeconds;
278
+ await this.usage.record({
279
+ eventId: `${this.admission.operationId}:audio`,
280
+ revision: this.usageRevision++,
281
+ mode: 'cumulative',
282
+ usage: {
283
+ admittedAudioSeconds: this.committedAudioSeconds,
284
+ connectedSeconds: Math.max(0, (monotonicNow(this.nowMs) - this.openedAtMs) / 1000),
285
+ },
286
+ });
287
+ return;
288
+ }
289
+ case 'input.clear':
290
+ // Clear the uncommitted provider buffer, then drop every local trace
291
+ // of the client utterance so late provider frames cannot resurrect it.
292
+ this.socket.send(JSON.stringify({ type: 'input_audio_buffer.clear' }));
293
+ for (let index = this.turns.length - 1; index >= 0; index--) {
294
+ const turn = this.turns[index];
295
+ if (turn && turn.utteranceId === command.utteranceId && !turn.cleared) {
296
+ this.turns[index] = { ...turn, cleared: true };
297
+ }
298
+ }
299
+ for (const [itemId, turn] of this.bindings) {
300
+ if (turn.utteranceId === command.utteranceId) {
301
+ this.clearedIds.add(itemId);
302
+ this.bindings.delete(itemId);
303
+ }
304
+ }
305
+ for (const [itemId, item] of this.items) {
306
+ if (item.utteranceId === command.utteranceId) {
307
+ this.clearedIds.add(itemId);
308
+ this.items.delete(itemId);
309
+ }
310
+ }
311
+ if (this.openTurnUtteranceId === command.utteranceId)
312
+ this.openTurnUtteranceId = undefined;
313
+ return;
314
+ case 'session.mute':
315
+ // Mute is enforced by capture (no audio written); the cloud adapter holds no gate.
316
+ return;
317
+ case 'session.close':
318
+ await this.close();
319
+ return;
320
+ default:
321
+ throw new OpenAiTranscriptionError('unsupported-command', `not applicable to STT-only transcription: ${command.type}`);
322
+ }
323
+ }
324
+ async close() {
325
+ if (this.settled)
326
+ return;
327
+ this.settled = true;
328
+ this.expiryCancel?.();
329
+ this.expiryCancel = undefined;
330
+ if (this.signal && this.abortHandler)
331
+ this.signal.removeEventListener('abort', this.abortHandler);
332
+ try {
333
+ await this.socket.close();
334
+ }
335
+ finally {
336
+ // No usage attached: locally measured seconds are operational estimates,
337
+ // not provider-attested finals. The composition settles from the recorded
338
+ // cumulative totals (or provider-reported usage with a revision), so an
339
+ // L8 `settleSpeech` missing-dimension estimate stays valid.
340
+ await this.usage.settle({
341
+ operationId: this.admission.operationId,
342
+ outcome: this.outcome,
343
+ });
344
+ while (this.waiters.length > 0)
345
+ this.waiters.shift()?.();
346
+ if (!this.inPump)
347
+ await this.pump.catch(() => undefined);
348
+ }
349
+ }
350
+ pushError(reason, retryable) {
351
+ this.sequence += 1;
352
+ this.emit(errorEvent({ speechSessionId: this.receipt.speechSessionId, connectionEpoch: this.receipt.connectionEpoch, clock: this.clock() }, this.nextId(), this.sequence, reason, retryable));
353
+ }
354
+ /**
355
+ * Resolve the client turn for a provider item. Committed binds are
356
+ * authoritative; before the `committed` frame arrives the oldest
357
+ * unconfirmed turn is used (peeked, never consumed), falling back to the
358
+ * turn currently being recorded. Sequential client turns make all three agree.
359
+ */
360
+ attribute(itemId) {
361
+ const bound = this.bindings.get(itemId);
362
+ if (bound)
363
+ return bound;
364
+ if (this.turns.length > 0)
365
+ return this.turns[0];
366
+ if (this.openTurnUtteranceId !== undefined) {
367
+ return {
368
+ utteranceId: this.openTurnUtteranceId,
369
+ startMs: this.turnAudioStartMs ?? 0,
370
+ endMs: this.turnAudioEndMs ?? this.turnAudioStartMs ?? 0,
371
+ };
372
+ }
373
+ return undefined;
374
+ }
375
+ newItem(itemId, turn) {
376
+ const item = {
377
+ text: '',
378
+ revision: 0,
379
+ utteranceId: turn.utteranceId,
380
+ audioStartMs: turn.startMs,
381
+ audioEndMs: turn.endMs,
382
+ finalized: false,
383
+ speechSessionId: this.receipt.speechSessionId,
384
+ connectionEpoch: this.receipt.connectionEpoch,
385
+ binding: this.binding,
386
+ };
387
+ this.items.set(itemId, item);
388
+ return item;
389
+ }
390
+ onCommitted(itemId) {
391
+ if (this.finalizedIds.has(itemId) || this.clearedIds.has(itemId))
392
+ return;
393
+ const turn = this.turns.shift();
394
+ if (!turn) {
395
+ this.pushError('invalid-format', true);
396
+ return;
397
+ }
398
+ // A clear landed after the commit but before this bind: consume the
399
+ // tombstone and drop the late item instead of binding the next turn.
400
+ if (turn.cleared) {
401
+ this.clearedIds.add(itemId);
402
+ return;
403
+ }
404
+ this.bindings.set(itemId, turn);
405
+ // The bind is authoritative: align a live hypothesis created by early deltas.
406
+ const item = this.items.get(itemId);
407
+ if (item && !item.finalized) {
408
+ item.utteranceId = turn.utteranceId;
409
+ item.audioStartMs = turn.startMs;
410
+ item.audioEndMs = turn.endMs;
411
+ }
412
+ }
413
+ onDelta(itemId, contentIndex, delta) {
414
+ if (contentIndex !== 0) {
415
+ this.pushError('invalid-format', true);
416
+ return;
417
+ }
418
+ if (this.finalizedIds.has(itemId) || this.clearedIds.has(itemId))
419
+ return;
420
+ let item = this.items.get(itemId);
421
+ if (!item) {
422
+ const turn = this.attribute(itemId);
423
+ if (!turn) {
424
+ this.pushError('invalid-format', true);
425
+ return;
426
+ }
427
+ item = this.newItem(itemId, turn);
428
+ }
429
+ if (item.finalized)
430
+ return;
431
+ const start = item.text.length;
432
+ item.text += delta;
433
+ item.revision += 1;
434
+ this.sequence += 1;
435
+ const partial = {
436
+ schemaVersion: 1,
437
+ speechSessionId: item.speechSessionId,
438
+ connectionEpoch: item.connectionEpoch,
439
+ eventId: this.nextId(),
440
+ sequence: this.sequence,
441
+ clock: this.clock(),
442
+ type: 'transcript.partial',
443
+ binding: this.binding,
444
+ utteranceId: item.utteranceId,
445
+ revision: item.revision,
446
+ replaces: { start, end: start },
447
+ text: delta,
448
+ };
449
+ this.emit(partial);
450
+ }
451
+ onCompleted(itemId, transcript, languages) {
452
+ if (this.clearedIds.has(itemId))
453
+ return;
454
+ if (this.finalizedIds.has(itemId)) {
455
+ this.pushError('invalid-format', true);
456
+ return;
457
+ }
458
+ let item = this.items.get(itemId);
459
+ if (!item) {
460
+ // A completion without prior deltas (empty turn, unsent deltas for the
461
+ // model/delay) still finalizes the bound turn; otherwise it is orphaned.
462
+ const bound = this.bindings.get(itemId);
463
+ const turn = bound ?? this.attribute(itemId);
464
+ if (!turn) {
465
+ this.pushError('invalid-format', true);
466
+ return;
467
+ }
468
+ item = this.newItem(itemId, turn);
469
+ }
470
+ if (item.finalized) {
471
+ this.pushError('invalid-format', true);
472
+ return;
473
+ }
474
+ item.finalized = true;
475
+ this.finalizedIds.add(itemId);
476
+ item.revision += 1;
477
+ // The window stays the bound turn's: every path into onCompleted (live
478
+ // hypothesis, bind alignment, completed-only creation) already carries it.
479
+ this.sequence += 1;
480
+ let language = this.binding.language;
481
+ if (!language && Array.isArray(languages)) {
482
+ const first = languages[0];
483
+ if (first && typeof first.code === 'string' && first.code)
484
+ language = first.code;
485
+ }
486
+ const final = {
487
+ schemaVersion: 1,
488
+ speechSessionId: item.speechSessionId,
489
+ connectionEpoch: item.connectionEpoch,
490
+ eventId: this.nextId(),
491
+ sequence: this.sequence,
492
+ clock: this.clock(),
493
+ type: 'transcript.final',
494
+ binding: this.binding,
495
+ utteranceId: item.utteranceId,
496
+ revision: item.revision,
497
+ text: transcript,
498
+ language: language ?? 'und',
499
+ audioInterval: { startMs: item.audioStartMs, endMs: item.audioEndMs },
500
+ };
501
+ // Partials are ephemeral: the hypothesis buffer is released with the final.
502
+ this.items.delete(itemId);
503
+ this.emit(final);
504
+ }
505
+ onFrame(raw) {
506
+ if (this.settled)
507
+ return;
508
+ let frame;
509
+ try {
510
+ frame = JSON.parse(raw);
511
+ }
512
+ catch {
513
+ this.pushError('invalid-format', true);
514
+ return;
515
+ }
516
+ if (!frame || typeof frame !== 'object') {
517
+ this.pushError('invalid-format', true);
518
+ return;
519
+ }
520
+ const type = frame.type;
521
+ if (type === 'conversation.item.input_audio_transcription.delta') {
522
+ const record = frame;
523
+ if (!isNonEmptyString(record.item_id) || typeof record.delta !== 'string'
524
+ || typeof record.content_index !== 'number') {
525
+ this.pushError('invalid-format', true);
526
+ return;
527
+ }
528
+ this.onDelta(record.item_id, record.content_index, record.delta);
529
+ return;
530
+ }
531
+ if (type === 'conversation.item.input_audio_transcription.completed') {
532
+ const record = frame;
533
+ if (!isNonEmptyString(record.item_id) || typeof record.transcript !== 'string') {
534
+ this.pushError('invalid-format', true);
535
+ return;
536
+ }
537
+ this.onCompleted(record.item_id, record.transcript, record.languages);
538
+ return;
539
+ }
540
+ if (type === 'input_audio_buffer.committed') {
541
+ const record = frame;
542
+ if (!isNonEmptyString(record.item_id)) {
543
+ this.pushError('invalid-format', true);
544
+ return;
545
+ }
546
+ this.onCommitted(record.item_id);
547
+ return;
548
+ }
549
+ if (type === 'error') {
550
+ this.pushError('provider-error', false);
551
+ return;
552
+ }
553
+ // Unknown provider event types are tolerated (forward compatibility); the stream continues.
554
+ }
555
+ async run(signal) {
556
+ this.inPump = true;
557
+ try {
558
+ for await (const raw of this.socket.messages()) {
559
+ if (this.settled)
560
+ break;
561
+ if (signal?.aborted) {
562
+ this.outcome = 'cancelled';
563
+ break;
564
+ }
565
+ this.onFrame(raw);
566
+ }
567
+ }
568
+ catch {
569
+ if (!this.settled) {
570
+ this.outcome = 'failed';
571
+ this.pushError('transport', false);
572
+ }
573
+ }
574
+ finally {
575
+ this.inPump = false;
576
+ if (!this.settled)
577
+ await this.close();
578
+ }
579
+ }
580
+ }
581
+ /**
582
+ * Redact the bearer material from any message before it reaches an error.
583
+ * A provider that echoes the Authorization header must never leak it through
584
+ * session events or thrown errors.
585
+ */
586
+ const redactBearer = (message, token) => {
587
+ if (!token)
588
+ return message;
589
+ return message.split(`Bearer ${token}`).join('Bearer [REDACTED]').split(token).join('[REDACTED]');
590
+ };
591
+ /**
592
+ * Open an admitted transcription session. The bearer token travels only into
593
+ * the socket handshake; failures never echo it. The `session.update` is sent
594
+ * before any audio; an aborted signal refuses without connecting.
595
+ */
596
+ export const openTranscriptionSession = async (config, options) => {
597
+ const capabilities = openAiTranscriptionCapabilities(config);
598
+ const binding = {
599
+ ...openAiTranscriptionIdentity(config),
600
+ ...(config.language ? { language: config.language } : {}),
601
+ ...(config.accountRef ? { accountRef: config.accountRef } : {}),
602
+ ...(config.region ? { region: config.region } : {}),
603
+ };
604
+ assertAdmission(options.admission);
605
+ if (!isNonEmptyString(options.bearerToken)) {
606
+ throw new OpenAiTranscriptionError('invalid-config', 'bearer token is required');
607
+ }
608
+ const { request } = options;
609
+ // TTS bindings are refused here (fail-closed): a later duplex composition
610
+ // may split them onto a synthesis adapter, but this module never synthesizes.
611
+ if (request.pipeline !== 'chained' || request.bindings.stt === undefined
612
+ || request.bindings.stt.providerId !== binding.providerId
613
+ || request.bindings.stt.modelId !== binding.modelId
614
+ || request.bindings.tts !== undefined) {
615
+ throw new OpenAiTranscriptionError('invalid-config', 'STT-only chained binding for this profile is required');
616
+ }
617
+ for (const format of [...(request.inputFormats ?? []), ...(request.outputFormats ?? [])]) {
618
+ if (format.codec !== TRANSCRIPTION_FORMAT.codec || format.sampleRateHz !== TRANSCRIPTION_FORMAT.sampleRateHz
619
+ || format.channels !== TRANSCRIPTION_FORMAT.channels) {
620
+ throw new OpenAiTranscriptionError('invalid-config', 'only pcm16-le 24kHz mono is supported');
621
+ }
622
+ }
623
+ if (options.signal?.aborted) {
624
+ throw new OpenAiTranscriptionError('aborted', 'open aborted before connect');
625
+ }
626
+ const receipt = {
627
+ protocolVersion: 1,
628
+ speechSessionId: `speech-${options.admission.operationId}`,
629
+ connectionEpoch: request.target.controllerEpoch,
630
+ configuration: request.configuration,
631
+ target: request.target,
632
+ pipeline: 'chained',
633
+ micMode: request.micMode,
634
+ stages: { stt: capabilities },
635
+ inputFormat: TRANSCRIPTION_FORMAT,
636
+ };
637
+ let socket;
638
+ try {
639
+ socket = await options.connect(OPENAI_TRANSCRIPTION_WS_URL, {
640
+ authorization: `Bearer ${options.bearerToken}`,
641
+ originator: options.originator ?? 'sentropic-llm-mesh',
642
+ });
643
+ }
644
+ catch (error) {
645
+ const detail = error instanceof Error ? error.message : 'unknown';
646
+ throw new OpenAiTranscriptionError('transport', `provider connect failed: ${redactBearer(detail, options.bearerToken)}`);
647
+ }
648
+ const session = new TranscriptionSession(receipt, socket, binding, options.admission, options.usage, options.nowMs, options.signal, options.schedule, request.maxDurationMs);
649
+ try {
650
+ socket.send(JSON.stringify(buildTranscriptionSessionUpdate(config)));
651
+ }
652
+ catch (error) {
653
+ await session.close();
654
+ const detail = error instanceof Error ? error.message : 'unknown';
655
+ throw new OpenAiTranscriptionError('transport', `session update failed: ${redactBearer(detail, options.bearerToken)}`);
656
+ }
657
+ return session;
658
+ };
659
+ //# sourceMappingURL=openai-transcription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-transcription.js","sourceRoot":"","sources":["../../src/speech/openai-transcription.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentropic/llm-mesh",
3
- "version": "0.30.0",
3
+ "version": "0.31.0",
4
4
  "description": "Provider-agnostic LLM access runtime SDK for Sentropic.",
5
5
  "type": "module",
6
6
  "license": "MIT",