You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
2.1 KiB
53 lines
2.1 KiB
/**
|
|
* Wire contract between a browser client and our realtime WS relay.
|
|
*
|
|
* This vocabulary is intentionally our own, not a passthrough of any specific
|
|
* provider's event schema (e.g. OpenAI Realtime's `input_audio_buffer.append`,
|
|
* `response.create`, etc). Provider adapters under `$lib/server/core/providers`
|
|
* translate to/from this shape, which is what keeps the client and the
|
|
* session orchestrator provider-agnostic.
|
|
*/
|
|
|
|
export const REALTIME_WS_PATH = '/api/realtime/ws';
|
|
|
|
/**
|
|
* Client-controllable subset of session config. Deliberately small: things
|
|
* like `instructions`, `tools`, and `model` are server-owned (see
|
|
* `$lib/server/core/session`) since this relay is shared infrastructure that
|
|
* other people's browsers connect to.
|
|
*/
|
|
export interface SessionStartConfig {
|
|
voice?: string;
|
|
}
|
|
|
|
export type ClientEvent =
|
|
| { type: 'session.start'; config?: SessionStartConfig }
|
|
| { type: 'input_audio.chunk'; audio: string } // base64-encoded PCM16
|
|
| { type: 'input_audio.commit' }
|
|
| { type: 'input_text.send'; text: string }
|
|
| { type: 'response.cancel' }
|
|
| { type: 'tool.result'; callId: string; output: string }
|
|
// Resumes the model after all outstanding tool calls in a turn are
|
|
// resolved. Sent only by RealtimeSession itself (see session.ts) — never
|
|
// by the browser directly, since a turn can contain multiple parallel
|
|
// tool calls and only the last one resolving should trigger this.
|
|
| { type: 'response.trigger' }
|
|
| { type: 'session.end' };
|
|
|
|
export type RealtimeErrorCode =
|
|
| 'auth_expired'
|
|
| 'invalid_client_event'
|
|
| 'upstream_unavailable'
|
|
| 'upstream_error'
|
|
| 'internal_error';
|
|
|
|
export type ServerEvent =
|
|
| { type: 'session.ready'; sessionId: string }
|
|
| { type: 'output_audio.chunk'; audio: string } // base64-encoded PCM16
|
|
| { type: 'output_audio.done' }
|
|
| { type: 'transcript.delta'; role: 'user' | 'assistant'; text: string }
|
|
| { type: 'transcript.done'; role: 'user' | 'assistant' }
|
|
| { type: 'response.done' }
|
|
| { type: 'tool.call'; callId: string; name: string; arguments: string }
|
|
| { type: 'error'; code: RealtimeErrorCode; message: string }
|
|
| { type: 'session.closed'; reason: string };
|
|
|