ai
Version:
AI SDK by Vercel - build apps like ChatGPT, Claude, Gemini, and more with a single interface for any model using the Vercel AI Gateway or go direct to OpenAI, Anthropic, Google, or any other model provider.
66 lines (62 loc) • 1.84 kB
text/typescript
import type { RealtimeServerEvent } from '../types/realtime-model';
export type RealtimeSessionState = {
delegationMode?: 'client' | 'provider';
sessionId?: string;
transcripts: Extract<RealtimeServerEvent, { type: 'transcript-fragment' }>[];
delegations: Extract<RealtimeServerEvent, { type: 'delegation-created' }>[];
usage?: { seconds: number };
finalization: 'pending' | 'confirmed' | 'unconfirmed';
terminationReason?: string;
isInputMuted: boolean;
};
export function createSessionState(): RealtimeSessionState {
return {
transcripts: [],
delegations: [],
isInputMuted: false,
finalization: 'pending',
};
}
export function reduceSessionState(
state: RealtimeSessionState,
event: RealtimeServerEvent,
limit: number,
muted?: boolean,
): RealtimeSessionState {
switch (event.type) {
case 'session-started':
return {
...state,
sessionId: event.sessionId,
delegationMode: event.delegationMode,
};
case 'session-usage':
return { ...state, usage: event.usage };
case 'session-closed':
return {
...state,
sessionId: event.sessionId ?? state.sessionId,
usage: event.usage,
terminationReason: event.reason,
finalization: 'confirmed',
};
case 'transcript-fragment':
return {
...state,
transcripts: [...state.transcripts, event].slice(-limit),
};
case 'delegation-created':
return state.delegations.some(
item => item.delegationId === event.delegationId,
)
? state
: {
...state,
delegations: [...state.delegations, event].slice(-limit),
};
case 'command-acknowledged':
return muted == null ? state : { ...state, isInputMuted: muted };
default:
return state;
}
}