diff --git a/.gitignore b/.gitignore index fa9962f..3682cd8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ node_modules .marscode -# dist \ No newline at end of file +# dist + +HOW_*.md \ No newline at end of file diff --git a/dist/VideoAgent.d.ts b/dist/VideoAgent.d.ts new file mode 100644 index 0000000..387e111 --- /dev/null +++ b/dist/VideoAgent.d.ts @@ -0,0 +1,339 @@ +import { WebSocket } from "ws"; +import { EventEmitter } from "events"; +import { streamText, LanguageModel, type Tool, type ModelMessage, type TranscriptionModel, type SpeechModel } from "ai"; +import { type StreamingSpeechConfig, type HistoryConfig } from "./types"; +/** + * Trigger reasons for frame capture + */ +type FrameTriggerReason = "scene_change" | "user_request" | "timer" | "initial"; +/** + * Video frame data structure sent to/from the client + */ +interface VideoFrame { + type: "video_frame"; + sessionId: string; + sequence: number; + timestamp: number; + triggerReason: FrameTriggerReason; + previousFrameRef?: string; + image: { + data: string; + format: string; + width: number; + height: number; + }; +} +/** + * Audio data structure + */ +interface AudioData { + type: "audio"; + sessionId: string; + data: string; + format: string; + sampleRate?: number; + duration?: number; + timestamp: number; +} +/** + * Backend configuration for video processing + */ +interface VideoAgentConfig { + /** Maximum frames to keep in context buffer for conversation history */ + maxContextFrames: number; +} +/** + * Frame context for maintaining visual conversation history + */ +interface FrameContext { + sequence: number; + timestamp: number; + triggerReason: FrameTriggerReason; + frameHash: string; + description?: string; +} +export interface VideoAgentOptions { + model: LanguageModel; + transcriptionModel?: TranscriptionModel; + speechModel?: SpeechModel; + instructions?: string; + stopWhen?: NonNullable[0]["stopWhen"]>; + tools?: Record; + endpoint?: string; + voice?: string; + speechInstructions?: string; + outputFormat?: string; + /** Configuration for streaming speech generation */ + streamingSpeech?: Partial; + /** Configuration for conversation history memory limits */ + history?: Partial; + /** Maximum audio input size in bytes (default: 10 MB) */ + maxAudioInputSize?: number; + /** Maximum frame input size in bytes (default: 5 MB) */ + maxFrameInputSize?: number; + /** Maximum frames to keep in context buffer (default: 10) */ + maxContextFrames?: number; + /** Session ID for this video agent instance */ + sessionId?: string; +} +export declare class VideoAgent extends EventEmitter { + private socket?; + private tools; + private model; + private transcriptionModel?; + private speechModel?; + private instructions; + private stopWhen; + private endpoint?; + private isConnected; + private conversationHistory; + private voice; + private speechInstructions?; + private outputFormat; + private isProcessing; + private isDestroyed; + private sessionId; + private frameSequence; + private lastFrameTimestamp; + private lastFrameHash?; + private frameContextBuffer; + private currentFrameData?; + private videoConfig; + private inputQueue; + private processingQueue; + private currentStreamAbortController?; + private historyConfig; + private maxAudioInputSize; + private maxFrameInputSize; + private streamingSpeechConfig; + private currentSpeechAbortController?; + private speechChunkQueue; + private nextChunkId; + private isSpeaking; + private pendingTextBuffer; + private speechQueueDonePromise?; + private speechQueueDoneResolve?; + constructor(options: VideoAgentOptions); + /** + * Generate a unique session ID + */ + private generateSessionId; + /** + * Simple hash function for frame comparison + */ + private hashFrame; + /** + * Ensure the agent has not been destroyed. Throws if it has. + */ + private ensureNotDestroyed; + /** + * Get current video agent configuration + */ + getConfig(): VideoAgentConfig; + /** + * Update video agent configuration + */ + updateConfig(config: Partial): void; + private setupListeners; + /** + * Handle client ready signal + */ + private handleClientReady; + /** + * Handle incoming video frame + */ + private handleVideoFrame; + /** + * Add frame to context buffer + */ + private addFrameToContext; + /** + * Request client to capture and send a frame + */ + requestFrameCapture(reason: FrameTriggerReason): void; + /** + * Clean up all in-flight state when the connection drops. + */ + private cleanupOnDisconnect; + registerTools(tools: Record): void; + /** + * Transcribe audio data to text using the configured transcription model + */ + transcribeAudio(audioData: Buffer | Uint8Array): Promise; + /** + * Generate speech from text using the configured speech model + */ + generateSpeechFromText(text: string, abortSignal?: AbortSignal): Promise; + /** + * Interrupt ongoing speech generation and playback + */ + interruptSpeech(reason?: string): void; + /** + * Interrupt both the current LLM stream and ongoing speech + */ + interruptCurrentResponse(reason?: string): void; + /** + * Extract complete sentences from text buffer + */ + private extractSentences; + /** + * Trim conversation history to stay within configured limits + */ + private trimHistory; + /** + * Queue a text chunk for speech generation + */ + private queueSpeechChunk; + /** + * Generate audio for a single chunk + */ + private generateChunkAudio; + /** + * Process the speech queue and send audio chunks in order + */ + private processSpeechQueue; + /** + * Process text delta for streaming speech + */ + private processTextForStreamingSpeech; + /** + * Flush any remaining text in the buffer to speech + */ + private flushStreamingSpeech; + /** + * Process incoming audio data: transcribe and generate response + */ + private processAudioInput; + connect(url?: string): Promise; + /** + * Attach an existing WebSocket (server-side usage) + */ + handleSocket(socket: WebSocket): void; + /** + * Send text input for processing (bypasses transcription) + */ + sendText(text: string): Promise; + /** + * Send audio data to be transcribed and processed + */ + sendAudio(audioData: string): Promise; + /** + * Send raw audio buffer to be transcribed and processed + */ + sendAudioBuffer(audioBuffer: Buffer | Uint8Array): Promise; + /** + * Send a video frame with optional text query for vision analysis + */ + sendFrame(frameData: string, query?: string, options?: { + width?: number; + height?: number; + format?: string; + }): Promise; + /** + * Enqueue a text input for serial processing + */ + private enqueueTextInput; + /** + * Enqueue a multimodal input (text + frame) for serial processing + */ + private enqueueMultimodalInput; + /** + * Drain the input queue, processing one request at a time + */ + private drainInputQueue; + /** + * Build the message content array for multimodal input + */ + private buildMultimodalContent; + /** + * Process multimodal input (text + video frame) + */ + private processMultimodalInput; + /** + * Process user input with streaming text generation + */ + private processUserInput; + /** + * Handle individual stream chunks + */ + private handleStreamChunk; + /** + * Process the full stream result and return the response text + */ + private processStreamResult; + /** + * Send a message via WebSocket if connected + */ + private sendWebSocketMessage; + /** + * Start listening for voice/video input + */ + startListening(): void; + /** + * Stop listening for voice/video input + */ + stopListening(): void; + /** + * Clear conversation history + */ + clearHistory(): void; + /** + * Get current conversation history + */ + getHistory(): ModelMessage[]; + /** + * Set conversation history + */ + setHistory(history: ModelMessage[]): void; + /** + * Get frame context buffer + */ + getFrameContext(): FrameContext[]; + /** + * Get session ID + */ + getSessionId(): string; + /** + * Internal helper to close and clean up the current socket + */ + private disconnectSocket; + /** + * Disconnect from WebSocket and stop all in-flight work + */ + disconnect(): void; + /** + * Permanently destroy the agent, releasing all resources + */ + destroy(): void; + /** + * Check if agent is connected to WebSocket + */ + get connected(): boolean; + /** + * Check if agent is currently processing a request + */ + get processing(): boolean; + /** + * Check if agent is currently speaking + */ + get speaking(): boolean; + /** + * Get the number of pending speech chunks in the queue + */ + get pendingSpeechChunks(): number; + /** + * Check if agent has been permanently destroyed + */ + get destroyed(): boolean; + /** + * Get current frame sequence number + */ + get currentFrameSequence(): number; + /** + * Check if there is visual context available + */ + get hasVisualContext(): boolean; +} +export type { VideoFrame, AudioData, VideoAgentConfig, FrameContext, FrameTriggerReason, }; +export type { StreamingSpeechConfig, HistoryConfig } from "./types"; +//# sourceMappingURL=VideoAgent.d.ts.map \ No newline at end of file diff --git a/dist/VideoAgent.d.ts.map b/dist/VideoAgent.d.ts.map new file mode 100644 index 0000000..e9d3d49 --- /dev/null +++ b/dist/VideoAgent.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"VideoAgent.d.ts","sourceRoot":"","sources":["../src/VideoAgent.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/VideoAgent.js b/dist/VideoAgent.js new file mode 100644 index 0000000..69a9f65 --- /dev/null +++ b/dist/VideoAgent.js @@ -0,0 +1,1351 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.VideoAgent = void 0; +const ws_1 = require("ws"); +const events_1 = require("events"); +const ai_1 = require("ai"); +const types_1 = require("./types"); +/** Default maximum frame input size (5 MB) */ +const DEFAULT_MAX_FRAME_SIZE = 5 * 1024 * 1024; +/** Default video agent config */ +const DEFAULT_VIDEO_AGENT_CONFIG = { + maxContextFrames: 10, +}; +class VideoAgent extends events_1.EventEmitter { + socket; + tools = {}; + model; + transcriptionModel; + speechModel; + instructions; + stopWhen; + endpoint; + isConnected = false; + conversationHistory = []; + voice; + speechInstructions; + outputFormat; + isProcessing = false; + isDestroyed = false; + // Session management + sessionId; + frameSequence = 0; + lastFrameTimestamp = 0; + lastFrameHash; + // Frame context buffer for visual conversation history + frameContextBuffer = []; + currentFrameData; // Base64 encoded current frame + // Video agent configuration + videoConfig; + // Concurrency: queue incoming requests so they run serially + inputQueue = []; + processingQueue = false; + // Abort controller for the current LLM stream so we can cancel it on interrupt/disconnect + currentStreamAbortController; + // Memory management + historyConfig; + maxAudioInputSize; + maxFrameInputSize; + // Streaming speech state + streamingSpeechConfig; + currentSpeechAbortController; + speechChunkQueue = []; + nextChunkId = 0; + isSpeaking = false; + pendingTextBuffer = ""; + // Promise-based signal for speech queue completion + speechQueueDonePromise; + speechQueueDoneResolve; + constructor(options) { + super(); + this.model = options.model; + this.transcriptionModel = options.transcriptionModel; + this.speechModel = options.speechModel; + this.instructions = + options.instructions || + `You are a helpful multimodal AI assistant that can see through the user's camera and hear their voice. +When analyzing images, be concise but informative. Describe what you see when asked. +Keep responses conversational since they will be spoken aloud. +Use tools when needed to provide accurate information.`; + this.stopWhen = options.stopWhen || (0, ai_1.stepCountIs)(5); + this.endpoint = options.endpoint; + this.voice = options.voice || "alloy"; + this.speechInstructions = options.speechInstructions; + this.outputFormat = options.outputFormat || "mp3"; + this.maxAudioInputSize = options.maxAudioInputSize ?? types_1.DEFAULT_MAX_AUDIO_SIZE; + this.maxFrameInputSize = options.maxFrameInputSize ?? DEFAULT_MAX_FRAME_SIZE; + // Generate or use provided session ID + this.sessionId = options.sessionId || this.generateSessionId(); + // Initialize video config + this.videoConfig = { + ...DEFAULT_VIDEO_AGENT_CONFIG, + maxContextFrames: options.maxContextFrames ?? DEFAULT_VIDEO_AGENT_CONFIG.maxContextFrames, + }; + if (options.tools) { + this.tools = { ...options.tools }; + } + // Initialize streaming speech config with defaults + this.streamingSpeechConfig = { + ...types_1.DEFAULT_STREAMING_SPEECH_CONFIG, + ...options.streamingSpeech, + }; + // Initialize history config with defaults + this.historyConfig = { + ...types_1.DEFAULT_HISTORY_CONFIG, + ...options.history, + }; + } + /** + * Generate a unique session ID + */ + generateSessionId() { + const timestamp = Date.now().toString(36); + const randomPart = Math.random().toString(36).substring(2, 10); + return `vs_${timestamp}_${randomPart}`; + } + /** + * Simple hash function for frame comparison + */ + hashFrame(data) { + let hash = 0; + for (let i = 0; i < data.length; i++) { + const char = data.charCodeAt(i); + hash = ((hash << 5) - hash) + char; + hash = hash & hash; // Convert to 32bit integer + } + return `frame_${this.frameSequence}_${Math.abs(hash).toString(16)}`; + } + /** + * Ensure the agent has not been destroyed. Throws if it has. + */ + ensureNotDestroyed() { + if (this.isDestroyed) { + throw new Error("VideoAgent has been destroyed and cannot be used"); + } + } + /** + * Get current video agent configuration + */ + getConfig() { + return { ...this.videoConfig }; + } + /** + * Update video agent configuration + */ + updateConfig(config) { + this.videoConfig = { ...this.videoConfig, ...config }; + this.emit("config_changed", this.videoConfig); + } + setupListeners() { + if (!this.socket) + return; + this.socket.on("message", async (data) => { + try { + const message = JSON.parse(data.toString()); + console.log(`Received WebSocket message of type: ${message.type}`); + switch (message.type) { + // Handle transcribed text from the client/STT + case "transcript": + if (typeof message.text !== "string" || !message.text.trim()) { + this.emit("warning", "Received empty or invalid transcript message"); + return; + } + // Interrupt ongoing speech when user starts speaking (barge-in) + this.interruptCurrentResponse("user_speaking"); + // Force capture current frame when user speaks + this.requestFrameCapture("user_request"); + console.log(`Processing transcript: "${message.text}"`); + await this.enqueueTextInput(message.text); + break; + // Handle raw audio data that needs transcription + case "audio": + if (typeof message.data !== "string" || !message.data) { + this.emit("warning", "Received empty or invalid audio message"); + return; + } + // Interrupt ongoing speech when user starts speaking (barge-in) + this.interruptCurrentResponse("user_speaking"); + // Force capture current frame when user speaks + this.requestFrameCapture("user_request"); + console.log(`Received audio data (${message.data.length / 1000}KB) for processing, format: ${message.format || "unknown"}`); + await this.processAudioInput(message); + break; + // Handle video frame from client + case "video_frame": + await this.handleVideoFrame(message); + break; + // Handle explicit interrupt request from client + case "interrupt": + console.log(`Received interrupt request: ${message.reason || "client_request"}`); + this.interruptCurrentResponse(message.reason || "client_request"); + break; + // Handle client ready signal + case "client_ready": + this.handleClientReady(message); + break; + default: + console.log(`Unknown message type: ${message.type}`); + } + } + catch (err) { + console.error("Failed to process message:", err); + this.emit("error", err); + } + }); + this.socket.on("close", () => { + console.log("Disconnected"); + this.isConnected = false; + this.cleanupOnDisconnect(); + this.emit("disconnected"); + }); + this.socket.on("error", (error) => { + console.error("WebSocket error:", error); + this.emit("error", error); + }); + } + /** + * Handle client ready signal + */ + handleClientReady(message) { + console.log(`Client ready, capabilities: ${JSON.stringify(message.capabilities || {})}`); + // Send session info to client + this.sendWebSocketMessage({ + type: "session_init", + sessionId: this.sessionId, + }); + this.emit("client_ready", message.capabilities); + } + /** + * Handle incoming video frame + */ + async handleVideoFrame(frame) { + try { + // Validate frame + if (!frame.image?.data) { + this.emit("warning", "Received empty or invalid video frame"); + return; + } + // Check frame size + const frameSize = Buffer.from(frame.image.data, "base64").length; + if (frameSize > this.maxFrameInputSize) { + const sizeMB = (frameSize / (1024 * 1024)).toFixed(1); + const maxMB = (this.maxFrameInputSize / (1024 * 1024)).toFixed(1); + this.emit("error", new Error(`Frame too large (${sizeMB} MB). Maximum allowed: ${maxMB} MB`)); + return; + } + // Update frame tracking + const frameHash = this.hashFrame(frame.image.data); + this.lastFrameTimestamp = frame.timestamp; + this.lastFrameHash = frameHash; + this.currentFrameData = frame.image.data; + // Add to context buffer + this.addFrameToContext({ + sequence: frame.sequence, + timestamp: frame.timestamp, + triggerReason: frame.triggerReason, + frameHash, + }); + // Emit frame received event + this.emit("frame_received", { + sequence: frame.sequence, + timestamp: frame.timestamp, + triggerReason: frame.triggerReason, + size: frameSize, + dimensions: { width: frame.image.width, height: frame.image.height }, + }); + // Acknowledge frame receipt to client + this.sendWebSocketMessage({ + type: "frame_ack", + sequence: frame.sequence, + timestamp: Date.now(), + }); + console.log(`Received frame #${frame.sequence} (${frame.triggerReason}): ${(frameSize / 1024).toFixed(1)}KB, ${frame.image.width}x${frame.image.height}`); + } + catch (error) { + console.error("Failed to handle video frame:", error); + this.emit("error", error); + } + } + /** + * Add frame to context buffer + */ + addFrameToContext(context) { + this.frameContextBuffer.push(context); + // Trim buffer if needed + if (this.frameContextBuffer.length > this.videoConfig.maxContextFrames) { + this.frameContextBuffer.shift(); + } + } + /** + * Request client to capture and send a frame + */ + requestFrameCapture(reason) { + this.sendWebSocketMessage({ + type: "capture_frame", + reason, + timestamp: Date.now(), + }); + this.emit("frame_requested", { reason }); + } + /** + * Clean up all in-flight state when the connection drops. + */ + cleanupOnDisconnect() { + // Abort ongoing LLM stream + if (this.currentStreamAbortController) { + this.currentStreamAbortController.abort(); + this.currentStreamAbortController = undefined; + } + // Abort ongoing speech generation + if (this.currentSpeechAbortController) { + this.currentSpeechAbortController.abort(); + this.currentSpeechAbortController = undefined; + } + // Clear speech state + this.speechChunkQueue = []; + this.pendingTextBuffer = ""; + this.isSpeaking = false; + this.isProcessing = false; + // Clear frame state + this.currentFrameData = undefined; + // Resolve any pending speech-done waiters + if (this.speechQueueDoneResolve) { + this.speechQueueDoneResolve(); + this.speechQueueDoneResolve = undefined; + this.speechQueueDonePromise = undefined; + } + // Reject any queued inputs + for (const item of this.inputQueue) { + item.reject(new Error("Connection closed")); + } + this.inputQueue = []; + this.processingQueue = false; + } + registerTools(tools) { + this.tools = { ...this.tools, ...tools }; + } + /** + * Transcribe audio data to text using the configured transcription model + */ + async transcribeAudio(audioData) { + if (!this.transcriptionModel) { + throw new Error("Transcription model not configured"); + } + console.log(`Sending ${audioData.byteLength} bytes to Whisper for transcription`); + try { + const result = await (0, ai_1.experimental_transcribe)({ + model: this.transcriptionModel, + audio: audioData, + }); + console.log(`Whisper transcription result: "${result.text}", language: ${result.language || "unknown"}`); + this.emit("transcription", { + text: result.text, + language: result.language, + }); + // Also send transcription to client for immediate feedback + this.sendWebSocketMessage({ + type: "transcription_result", + text: result.text, + language: result.language, + }); + return result.text; + } + catch (error) { + console.error("Whisper transcription failed:", error); + throw error; + } + } + /** + * Generate speech from text using the configured speech model + */ + async generateSpeechFromText(text, abortSignal) { + if (!this.speechModel) { + throw new Error("Speech model not configured"); + } + const result = await (0, ai_1.experimental_generateSpeech)({ + model: this.speechModel, + text, + voice: this.voice, + instructions: this.speechInstructions, + outputFormat: this.outputFormat, + abortSignal, + }); + return result.audio.uint8Array; + } + /** + * Interrupt ongoing speech generation and playback + */ + interruptSpeech(reason = "interrupted") { + if (!this.isSpeaking && this.speechChunkQueue.length === 0) { + return; + } + if (this.currentSpeechAbortController) { + this.currentSpeechAbortController.abort(); + this.currentSpeechAbortController = undefined; + } + this.speechChunkQueue = []; + this.pendingTextBuffer = ""; + this.isSpeaking = false; + if (this.speechQueueDoneResolve) { + this.speechQueueDoneResolve(); + this.speechQueueDoneResolve = undefined; + this.speechQueueDonePromise = undefined; + } + this.sendWebSocketMessage({ + type: "speech_interrupted", + reason, + }); + this.emit("speech_interrupted", { reason }); + } + /** + * Interrupt both the current LLM stream and ongoing speech + */ + interruptCurrentResponse(reason = "interrupted") { + if (this.currentStreamAbortController) { + this.currentStreamAbortController.abort(); + this.currentStreamAbortController = undefined; + } + this.interruptSpeech(reason); + } + /** + * Extract complete sentences from text buffer + */ + extractSentences(text) { + const sentences = []; + let remaining = text; + const sentenceEndPattern = /[.!?]+(?:\s+|$)/g; + let lastIndex = 0; + let match; + while ((match = sentenceEndPattern.exec(text)) !== null) { + const sentence = text.slice(lastIndex, match.index + match[0].length).trim(); + if (sentence.length >= this.streamingSpeechConfig.minChunkSize) { + sentences.push(sentence); + lastIndex = match.index + match[0].length; + } + else if (sentences.length > 0) { + sentences[sentences.length - 1] += " " + sentence; + lastIndex = match.index + match[0].length; + } + } + remaining = text.slice(lastIndex); + if (remaining.length > this.streamingSpeechConfig.maxChunkSize) { + const clausePattern = /[,;:]\s+/g; + let clauseMatch; + let splitIndex = 0; + while ((clauseMatch = clausePattern.exec(remaining)) !== null) { + if (clauseMatch.index >= this.streamingSpeechConfig.minChunkSize) { + splitIndex = clauseMatch.index + clauseMatch[0].length; + break; + } + } + if (splitIndex > 0) { + sentences.push(remaining.slice(0, splitIndex).trim()); + remaining = remaining.slice(splitIndex); + } + } + return [sentences, remaining]; + } + /** + * Trim conversation history to stay within configured limits + */ + trimHistory() { + const { maxMessages, maxTotalChars } = this.historyConfig; + if (maxMessages > 0 && this.conversationHistory.length > maxMessages) { + const excess = this.conversationHistory.length - maxMessages; + const toRemove = excess % 2 === 0 ? excess : excess + 1; + this.conversationHistory.splice(0, toRemove); + this.emit("history_trimmed", { removedCount: toRemove, reason: "max_messages" }); + } + if (maxTotalChars > 0) { + let totalChars = this.conversationHistory.reduce((sum, msg) => { + const content = typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content); + return sum + content.length; + }, 0); + let removedCount = 0; + while (totalChars > maxTotalChars && this.conversationHistory.length > 2) { + const removed = this.conversationHistory.shift(); + if (removed) { + const content = typeof removed.content === "string" ? removed.content : JSON.stringify(removed.content); + totalChars -= content.length; + removedCount++; + } + } + if (removedCount > 0) { + this.emit("history_trimmed", { removedCount, reason: "max_total_chars" }); + } + } + } + /** + * Queue a text chunk for speech generation + */ + queueSpeechChunk(text) { + if (!this.speechModel || !text.trim()) + return; + if (this.nextChunkId >= Number.MAX_SAFE_INTEGER) { + this.nextChunkId = 0; + } + const chunk = { + id: this.nextChunkId++, + text: text.trim(), + }; + if (!this.speechQueueDonePromise) { + this.speechQueueDonePromise = new Promise((resolve) => { + this.speechQueueDoneResolve = resolve; + }); + } + if (this.streamingSpeechConfig.parallelGeneration) { + const activeRequests = this.speechChunkQueue.filter((c) => c.audioPromise).length; + if (activeRequests < this.streamingSpeechConfig.maxParallelRequests) { + chunk.audioPromise = this.generateChunkAudio(chunk); + } + } + this.speechChunkQueue.push(chunk); + this.emit("speech_chunk_queued", { id: chunk.id, text: chunk.text }); + if (!this.isSpeaking) { + this.processSpeechQueue(); + } + } + /** + * Generate audio for a single chunk + */ + async generateChunkAudio(chunk) { + if (!this.currentSpeechAbortController) { + this.currentSpeechAbortController = new AbortController(); + } + try { + console.log(`Generating audio for chunk ${chunk.id}: "${chunk.text.substring(0, 50)}${chunk.text.length > 50 ? "..." : ""}"`); + const audioData = await this.generateSpeechFromText(chunk.text, this.currentSpeechAbortController.signal); + console.log(`Generated audio for chunk ${chunk.id}: ${audioData.length} bytes`); + return audioData; + } + catch (error) { + if (error.name === "AbortError") { + console.log(`Audio generation aborted for chunk ${chunk.id}`); + return null; + } + console.error(`Failed to generate audio for chunk ${chunk.id}:`, error); + this.emit("error", error); + return null; + } + } + /** + * Process the speech queue and send audio chunks in order + */ + async processSpeechQueue() { + if (this.isSpeaking) + return; + this.isSpeaking = true; + console.log(`Starting speech queue processing with ${this.speechChunkQueue.length} chunks`); + this.emit("speech_start", { streaming: true }); + this.sendWebSocketMessage({ type: "speech_stream_start" }); + try { + while (this.speechChunkQueue.length > 0) { + const chunk = this.speechChunkQueue[0]; + console.log(`Processing speech chunk #${chunk.id} (${this.speechChunkQueue.length - 1} remaining)`); + if (!chunk.audioPromise) { + chunk.audioPromise = this.generateChunkAudio(chunk); + } + const audioData = await chunk.audioPromise; + if (!this.isSpeaking) { + console.log(`Speech interrupted during chunk #${chunk.id}`); + break; + } + this.speechChunkQueue.shift(); + if (audioData) { + const base64Audio = Buffer.from(audioData).toString("base64"); + console.log(`Sending audio chunk #${chunk.id} (${audioData.length} bytes, ${this.outputFormat})`); + this.sendWebSocketMessage({ + type: "audio_chunk", + chunkId: chunk.id, + data: base64Audio, + format: this.outputFormat, + text: chunk.text, + }); + this.emit("audio_chunk", { + chunkId: chunk.id, + data: base64Audio, + format: this.outputFormat, + text: chunk.text, + uint8Array: audioData, + }); + } + else { + console.log(`No audio data generated for chunk #${chunk.id}`); + } + if (this.streamingSpeechConfig.parallelGeneration) { + const activeRequests = this.speechChunkQueue.filter((c) => c.audioPromise).length; + const toStart = Math.min(this.streamingSpeechConfig.maxParallelRequests - activeRequests, this.speechChunkQueue.length); + if (toStart > 0) { + console.log(`Starting parallel generation for ${toStart} more chunks`); + for (let i = 0; i < toStart; i++) { + const nextChunk = this.speechChunkQueue.find((c) => !c.audioPromise); + if (nextChunk) { + nextChunk.audioPromise = this.generateChunkAudio(nextChunk); + } + } + } + } + } + } + catch (error) { + console.error("Error in speech queue processing:", error); + this.emit("error", error); + } + finally { + this.isSpeaking = false; + this.currentSpeechAbortController = undefined; + if (this.speechQueueDoneResolve) { + this.speechQueueDoneResolve(); + this.speechQueueDoneResolve = undefined; + this.speechQueueDonePromise = undefined; + } + console.log(`Speech queue processing complete`); + this.sendWebSocketMessage({ type: "speech_stream_end" }); + this.emit("speech_complete", { streaming: true }); + } + } + /** + * Process text delta for streaming speech + */ + processTextForStreamingSpeech(textDelta) { + if (!this.speechModel) + return; + this.pendingTextBuffer += textDelta; + const [sentences, remaining] = this.extractSentences(this.pendingTextBuffer); + this.pendingTextBuffer = remaining; + for (const sentence of sentences) { + this.queueSpeechChunk(sentence); + } + } + /** + * Flush any remaining text in the buffer to speech + */ + flushStreamingSpeech() { + if (!this.speechModel || !this.pendingTextBuffer.trim()) + return; + this.queueSpeechChunk(this.pendingTextBuffer); + this.pendingTextBuffer = ""; + } + /** + * Process incoming audio data: transcribe and generate response + */ + async processAudioInput(audioMessage) { + if (!this.transcriptionModel) { + this.emit("error", new Error("Transcription model not configured for audio input")); + return; + } + try { + const audioBuffer = Buffer.from(audioMessage.data, "base64"); + if (audioBuffer.length > this.maxAudioInputSize) { + const sizeMB = (audioBuffer.length / (1024 * 1024)).toFixed(1); + const maxMB = (this.maxAudioInputSize / (1024 * 1024)).toFixed(1); + this.emit("error", new Error(`Audio input too large (${sizeMB} MB). Maximum allowed: ${maxMB} MB`)); + return; + } + if (audioBuffer.length === 0) { + this.emit("warning", "Received empty audio data"); + return; + } + this.emit("audio_received", { + size: audioBuffer.length, + format: audioMessage.format, + sessionId: audioMessage.sessionId, + }); + console.log(`Processing audio input: ${audioBuffer.length} bytes, format: ${audioMessage.format || "unknown"}`); + const transcribedText = await this.transcribeAudio(audioBuffer); + console.log(`Transcribed text: "${transcribedText}"`); + if (transcribedText.trim()) { + await this.enqueueTextInput(transcribedText); + } + else { + this.emit("warning", "Transcription returned empty text"); + this.sendWebSocketMessage({ + type: "transcription_error", + error: "Whisper returned empty text", + }); + } + } + catch (error) { + console.error("Failed to process audio input:", error); + this.emit("error", error); + this.sendWebSocketMessage({ + type: "transcription_error", + error: `Transcription failed: ${error.message || String(error)}`, + }); + } + } + async connect(url) { + this.ensureNotDestroyed(); + if (this.socket) { + this.disconnectSocket(); + } + return new Promise((resolve, reject) => { + try { + const wsUrl = url || this.endpoint || "ws://localhost:8080"; + this.socket = new ws_1.WebSocket(wsUrl); + this.setupListeners(); + this.socket.once("open", () => { + this.isConnected = true; + this.emit("connected"); + resolve(); + }); + this.socket.once("error", (error) => { + reject(error); + }); + } + catch (error) { + reject(error); + } + }); + } + /** + * Attach an existing WebSocket (server-side usage) + */ + handleSocket(socket) { + this.ensureNotDestroyed(); + if (this.socket) { + this.disconnectSocket(); + } + this.socket = socket; + this.isConnected = true; + this.setupListeners(); + this.emit("connected"); + } + /** + * Send text input for processing (bypasses transcription) + */ + async sendText(text) { + this.ensureNotDestroyed(); + if (!text || !text.trim()) { + throw new Error("Text input cannot be empty"); + } + return this.enqueueTextInput(text); + } + /** + * Send audio data to be transcribed and processed + */ + async sendAudio(audioData) { + this.ensureNotDestroyed(); + await this.processAudioInput({ + type: "audio", + sessionId: this.sessionId, + data: audioData, + format: "unknown", + timestamp: Date.now(), + }); + } + /** + * Send raw audio buffer to be transcribed and processed + */ + async sendAudioBuffer(audioBuffer) { + this.ensureNotDestroyed(); + const base64Audio = Buffer.from(audioBuffer).toString("base64"); + await this.processAudioInput({ + type: "audio", + sessionId: this.sessionId, + data: base64Audio, + format: "unknown", + timestamp: Date.now(), + }); + } + /** + * Send a video frame with optional text query for vision analysis + */ + async sendFrame(frameData, query, options) { + this.ensureNotDestroyed(); + const frame = { + type: "video_frame", + sessionId: this.sessionId, + sequence: this.frameSequence++, + timestamp: Date.now(), + triggerReason: "user_request", + previousFrameRef: this.lastFrameHash, + image: { + data: frameData, + format: options?.format || "webp", + width: options?.width || 640, + height: options?.height || 480, + }, + }; + // Update local frame state + await this.handleVideoFrame(frame); + if (query) { + return this.enqueueMultimodalInput(query, frame); + } + return ""; + } + /** + * Enqueue a text input for serial processing + */ + enqueueTextInput(text) { + return new Promise((resolve, reject) => { + this.inputQueue.push({ text, resolve, reject }); + this.drainInputQueue(); + }); + } + /** + * Enqueue a multimodal input (text + frame) for serial processing + */ + enqueueMultimodalInput(text, frame) { + return new Promise((resolve, reject) => { + this.inputQueue.push({ text, frame, resolve, reject }); + this.drainInputQueue(); + }); + } + /** + * Drain the input queue, processing one request at a time + */ + async drainInputQueue() { + if (this.processingQueue) + return; + this.processingQueue = true; + try { + while (this.inputQueue.length > 0) { + const item = this.inputQueue.shift(); + try { + let result; + if (item.frame && item.text) { + result = await this.processMultimodalInput(item.text, item.frame); + } + else if (item.text) { + result = await this.processUserInput(item.text); + } + else { + result = ""; + } + item.resolve(result); + } + catch (error) { + item.reject(error); + } + } + } + finally { + this.processingQueue = false; + } + } + /** + * Build the message content array for multimodal input + */ + buildMultimodalContent(text, frameData) { + const content = []; + // Add frame context description if available + if (this.frameContextBuffer.length > 0) { + const contextSummary = `[Visual context: ${this.frameContextBuffer.length} frames captured, latest at ${new Date(this.lastFrameTimestamp).toISOString()}]`; + content.push({ type: "text", text: contextSummary }); + } + // Add current frame if available + const imageData = frameData || this.currentFrameData; + if (imageData) { + content.push({ + type: "image", + image: imageData, + }); + } + // Add user query + content.push({ type: "text", text }); + return content; + } + /** + * Process multimodal input (text + video frame) + */ + async processMultimodalInput(text, frame) { + this.isProcessing = true; + this.currentStreamAbortController = new AbortController(); + const streamAbortSignal = this.currentStreamAbortController.signal; + try { + this.emit("text", { role: "user", text, hasImage: true }); + // Build multimodal message content + const content = this.buildMultimodalContent(text, frame.image.data); + // Add to conversation history (simplified for history) + this.conversationHistory.push({ + role: "user", + content: [{ type: "text", text: `[Image attached] ${text}` }], + }); + this.trimHistory(); + // Use streamText with multimodal content + const result = (0, ai_1.streamText)({ + model: this.model, + system: this.instructions, + messages: [ + ...this.conversationHistory.slice(0, -1), // Previous history + { role: "user", content }, // Current multimodal message + ], + tools: this.tools, + stopWhen: this.stopWhen, + abortSignal: streamAbortSignal, + onChunk: ({ chunk }) => { + this.handleStreamChunk(chunk); + }, + onFinish: async (event) => { + for (const step of event.steps) { + for (const toolResult of step.toolResults) { + this.emit("tool_result", { + name: toolResult.toolName, + toolCallId: toolResult.toolCallId, + result: toolResult.output, + }); + } + } + }, + onError: ({ error }) => { + console.error("Stream error:", error); + this.emit("error", error); + }, + }); + return await this.processStreamResult(result); + } + catch (error) { + this.pendingTextBuffer = ""; + if (this.speechChunkQueue.length > 0 || this.isSpeaking) { + this.interruptSpeech("stream_error"); + } + throw error; + } + finally { + this.isProcessing = false; + this.currentStreamAbortController = undefined; + } + } + /** + * Process user input with streaming text generation + */ + async processUserInput(text) { + this.isProcessing = true; + this.currentStreamAbortController = new AbortController(); + const streamAbortSignal = this.currentStreamAbortController.signal; + try { + this.emit("text", { role: "user", text }); + // Check if we have current frame data - if so, include it + const hasVisualContext = !!this.currentFrameData; + let messages; + if (hasVisualContext) { + // Build multimodal message + const content = this.buildMultimodalContent(text); + // Store simplified version in history + this.conversationHistory.push({ + role: "user", + content: [{ type: "text", text: `[Visual context] ${text}` }], + }); + messages = [ + ...this.conversationHistory.slice(0, -1), + { role: "user", content }, + ]; + } + else { + // Text-only message + this.conversationHistory.push({ role: "user", content: text }); + messages = this.conversationHistory; + } + this.trimHistory(); + const result = (0, ai_1.streamText)({ + model: this.model, + system: this.instructions, + messages, + tools: this.tools, + stopWhen: this.stopWhen, + abortSignal: streamAbortSignal, + onChunk: ({ chunk }) => { + this.handleStreamChunk(chunk); + }, + onFinish: async (event) => { + for (const step of event.steps) { + for (const toolResult of step.toolResults) { + this.emit("tool_result", { + name: toolResult.toolName, + toolCallId: toolResult.toolCallId, + result: toolResult.output, + }); + } + } + }, + onError: ({ error }) => { + console.error("Stream error:", error); + this.emit("error", error); + }, + }); + return await this.processStreamResult(result); + } + catch (error) { + this.pendingTextBuffer = ""; + if (this.speechChunkQueue.length > 0 || this.isSpeaking) { + this.interruptSpeech("stream_error"); + } + throw error; + } + finally { + this.isProcessing = false; + this.currentStreamAbortController = undefined; + } + } + /** + * Handle individual stream chunks + */ + handleStreamChunk(chunk) { + switch (chunk.type) { + case "text-delta": + this.emit("chunk:text_delta", { id: chunk.id, text: chunk.text }); + break; + case "reasoning-delta": + this.emit("chunk:reasoning_delta", { id: chunk.id, text: chunk.text }); + break; + case "tool-call": + this.emit("chunk:tool_call", { + toolName: chunk.toolName, + toolCallId: chunk.toolCallId, + input: chunk.input, + }); + break; + case "tool-result": + this.emit("chunk:tool_result", { + toolName: chunk.toolName, + toolCallId: chunk.toolCallId, + result: chunk.output, + }); + break; + case "tool-input-start": + this.emit("chunk:tool_input_start", { + id: chunk.id, + toolName: chunk.toolName, + }); + break; + case "tool-input-delta": + this.emit("chunk:tool_input_delta", { + id: chunk.id, + delta: chunk.delta, + }); + break; + case "source": + this.emit("chunk:source", chunk); + break; + } + } + /** + * Process the full stream result and return the response text + */ + async processStreamResult(result) { + let fullText = ""; + let fullReasoning = ""; + const allToolCalls = []; + const allToolResults = []; + const allSources = []; + const allFiles = []; + for await (const part of result.fullStream) { + switch (part.type) { + case "start": + this.sendWebSocketMessage({ type: "stream_start" }); + break; + case "finish": + this.emit("text", { role: "assistant", text: fullText }); + this.sendWebSocketMessage({ + type: "stream_finish", + finishReason: part.finishReason, + usage: part.totalUsage, + }); + break; + case "error": + this.emit("error", part.error); + this.sendWebSocketMessage({ + type: "stream_error", + error: String(part.error), + }); + break; + case "abort": + this.emit("abort", { reason: part.reason }); + this.sendWebSocketMessage({ + type: "stream_abort", + reason: part.reason, + }); + break; + case "start-step": + this.sendWebSocketMessage({ + type: "step_start", + warnings: part.warnings, + }); + break; + case "finish-step": + this.sendWebSocketMessage({ + type: "step_finish", + finishReason: part.finishReason, + usage: part.usage, + }); + break; + case "text-start": + this.sendWebSocketMessage({ type: "text_start", id: part.id }); + break; + case "text-delta": + fullText += part.text; + this.processTextForStreamingSpeech(part.text); + this.sendWebSocketMessage({ + type: "text_delta", + id: part.id, + text: part.text, + }); + break; + case "text-end": + this.flushStreamingSpeech(); + this.sendWebSocketMessage({ type: "text_end", id: part.id }); + break; + case "reasoning-start": + this.sendWebSocketMessage({ type: "reasoning_start", id: part.id }); + break; + case "reasoning-delta": + fullReasoning += part.text; + this.sendWebSocketMessage({ + type: "reasoning_delta", + id: part.id, + text: part.text, + }); + break; + case "reasoning-end": + this.sendWebSocketMessage({ type: "reasoning_end", id: part.id }); + break; + case "tool-input-start": + this.sendWebSocketMessage({ + type: "tool_input_start", + id: part.id, + toolName: part.toolName, + }); + break; + case "tool-input-delta": + this.sendWebSocketMessage({ + type: "tool_input_delta", + id: part.id, + delta: part.delta, + }); + break; + case "tool-input-end": + this.sendWebSocketMessage({ type: "tool_input_end", id: part.id }); + break; + case "tool-call": + allToolCalls.push({ + toolName: part.toolName, + toolCallId: part.toolCallId, + input: part.input, + }); + this.sendWebSocketMessage({ + type: "tool_call", + toolName: part.toolName, + toolCallId: part.toolCallId, + input: part.input, + }); + break; + case "tool-result": + allToolResults.push({ + toolName: part.toolName, + toolCallId: part.toolCallId, + output: part.output, + }); + this.sendWebSocketMessage({ + type: "tool_result", + toolName: part.toolName, + toolCallId: part.toolCallId, + result: part.output, + }); + break; + case "tool-error": + this.sendWebSocketMessage({ + type: "tool_error", + toolName: part.toolName, + toolCallId: part.toolCallId, + error: String(part.error), + }); + break; + case "source": + allSources.push(part); + this.sendWebSocketMessage({ + type: "source", + source: part, + }); + break; + case "file": + allFiles.push(part.file); + this.sendWebSocketMessage({ + type: "file", + file: part.file, + }); + break; + } + } + // Add assistant response to conversation history + if (fullText) { + this.conversationHistory.push({ role: "assistant", content: fullText }); + this.trimHistory(); + } + // Ensure any remaining speech is flushed + this.flushStreamingSpeech(); + // Wait for all speech chunks to complete + if (this.speechQueueDonePromise) { + await this.speechQueueDonePromise; + } + // Send the complete response + this.sendWebSocketMessage({ + type: "response_complete", + sessionId: this.sessionId, + text: fullText, + reasoning: fullReasoning || undefined, + toolCalls: allToolCalls, + toolResults: allToolResults, + sources: allSources.length > 0 ? allSources : undefined, + files: allFiles.length > 0 ? allFiles : undefined, + frameContext: this.frameContextBuffer.length > 0 ? { + frameCount: this.frameContextBuffer.length, + lastFrameSequence: this.frameContextBuffer[this.frameContextBuffer.length - 1]?.sequence, + } : undefined, + }); + return fullText; + } + /** + * Send a message via WebSocket if connected + */ + sendWebSocketMessage(message) { + if (!this.socket || !this.isConnected) + return; + try { + if (this.socket.readyState === ws_1.WebSocket.OPEN) { + if (message.type === "audio_chunk" || message.type === "audio") { + const { data, ...rest } = message; + console.log(`Sending WebSocket message: ${message.type}`, data ? `(${(data.length / 1000).toFixed(1)}KB audio data)` : "", rest); + } + else { + console.log(`Sending WebSocket message: ${message.type}`); + } + this.socket.send(JSON.stringify(message)); + } + else { + console.warn(`Cannot send message, socket state: ${this.socket.readyState}`); + } + } + catch (error) { + console.error("Failed to send WebSocket message:", error); + this.emit("error", error); + } + } + /** + * Start listening for voice/video input + */ + startListening() { + console.log("Starting video agent..."); + this.emit("listening"); + } + /** + * Stop listening for voice/video input + */ + stopListening() { + console.log("Stopping video agent..."); + this.emit("stopped"); + } + /** + * Clear conversation history + */ + clearHistory() { + this.conversationHistory = []; + this.frameContextBuffer = []; + this.emit("history_cleared"); + } + /** + * Get current conversation history + */ + getHistory() { + return [...this.conversationHistory]; + } + /** + * Set conversation history + */ + setHistory(history) { + this.conversationHistory = [...history]; + } + /** + * Get frame context buffer + */ + getFrameContext() { + return [...this.frameContextBuffer]; + } + /** + * Get session ID + */ + getSessionId() { + return this.sessionId; + } + /** + * Internal helper to close and clean up the current socket + */ + disconnectSocket() { + if (!this.socket) + return; + this.cleanupOnDisconnect(); + try { + this.socket.removeAllListeners(); + if (this.socket.readyState === ws_1.WebSocket.OPEN || + this.socket.readyState === ws_1.WebSocket.CONNECTING) { + this.socket.close(); + } + } + catch { + // Ignore close errors + } + this.socket = undefined; + this.isConnected = false; + } + /** + * Disconnect from WebSocket and stop all in-flight work + */ + disconnect() { + this.disconnectSocket(); + } + /** + * Permanently destroy the agent, releasing all resources + */ + destroy() { + this.isDestroyed = true; + this.disconnectSocket(); + this.conversationHistory = []; + this.frameContextBuffer = []; + this.tools = {}; + this.removeAllListeners(); + } + /** + * Check if agent is connected to WebSocket + */ + get connected() { + return this.isConnected; + } + /** + * Check if agent is currently processing a request + */ + get processing() { + return this.isProcessing; + } + /** + * Check if agent is currently speaking + */ + get speaking() { + return this.isSpeaking; + } + /** + * Get the number of pending speech chunks in the queue + */ + get pendingSpeechChunks() { + return this.speechChunkQueue.length; + } + /** + * Check if agent has been permanently destroyed + */ + get destroyed() { + return this.isDestroyed; + } + /** + * Get current frame sequence number + */ + get currentFrameSequence() { + return this.frameSequence; + } + /** + * Check if there is visual context available + */ + get hasVisualContext() { + return !!this.currentFrameData; + } +} +exports.VideoAgent = VideoAgent; +//# sourceMappingURL=VideoAgent.js.map \ No newline at end of file diff --git a/dist/VideoAgent.js.map b/dist/VideoAgent.js.map new file mode 100644 index 0000000..cd6ec1f --- /dev/null +++ b/dist/VideoAgent.js.map @@ -0,0 +1 @@ +{"version":3,"file":"VideoAgent.js","sourceRoot":"","sources":["../src/VideoAgent.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/VoiceAgent.d.ts b/dist/VoiceAgent.d.ts index d019a51..b7ac216 100644 --- a/dist/VoiceAgent.d.ts +++ b/dist/VoiceAgent.d.ts @@ -1,28 +1,7 @@ import { WebSocket } from "ws"; import { EventEmitter } from "events"; import { streamText, LanguageModel, type Tool, type ModelMessage, type TranscriptionModel, type SpeechModel } from "ai"; -/** - * Configuration for streaming speech behavior - */ -interface StreamingSpeechConfig { - /** Minimum characters before generating speech for a chunk */ - minChunkSize: number; - /** Maximum characters per chunk (will split at sentence boundary before this) */ - maxChunkSize: number; - /** Whether to enable parallel TTS generation */ - parallelGeneration: boolean; - /** Maximum number of parallel TTS requests */ - maxParallelRequests: number; -} -/** - * Configuration for conversation history memory management - */ -interface HistoryConfig { - /** Maximum number of messages to keep in history. When exceeded, oldest messages are trimmed. Set to 0 for unlimited. */ - maxMessages: number; - /** Maximum total character count across all messages. When exceeded, oldest messages are trimmed. Set to 0 for unlimited. */ - maxTotalChars: number; -} +import { type StreamingSpeechConfig, type HistoryConfig } from "./types"; export interface VoiceAgentOptions { model: LanguageModel; transcriptionModel?: TranscriptionModel; @@ -238,5 +217,4 @@ export declare class VoiceAgent extends EventEmitter { */ get destroyed(): boolean; } -export {}; //# sourceMappingURL=VoiceAgent.d.ts.map \ No newline at end of file diff --git a/dist/VoiceAgent.d.ts.map b/dist/VoiceAgent.d.ts.map index ea1afca..b558a9b 100644 --- a/dist/VoiceAgent.d.ts.map +++ b/dist/VoiceAgent.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"VoiceAgent.d.ts","sourceRoot":"","sources":["../src/VoiceAgent.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"VoiceAgent.d.ts","sourceRoot":"","sources":["../src/VoiceAgent.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/VoiceAgent.js b/dist/VoiceAgent.js index faae4ab..8bf06b3 100644 --- a/dist/VoiceAgent.js +++ b/dist/VoiceAgent.js @@ -4,8 +4,7 @@ exports.VoiceAgent = void 0; const ws_1 = require("ws"); const events_1 = require("events"); const ai_1 = require("ai"); -/** Default maximum audio input size (10 MB) */ -const DEFAULT_MAX_AUDIO_SIZE = 10 * 1024 * 1024; +const types_1 = require("./types"); class VoiceAgent extends events_1.EventEmitter { socket; tools = {}; @@ -52,22 +51,18 @@ class VoiceAgent extends events_1.EventEmitter { this.voice = options.voice || "alloy"; this.speechInstructions = options.speechInstructions; this.outputFormat = options.outputFormat || "mp3"; - this.maxAudioInputSize = options.maxAudioInputSize ?? DEFAULT_MAX_AUDIO_SIZE; + this.maxAudioInputSize = options.maxAudioInputSize ?? types_1.DEFAULT_MAX_AUDIO_SIZE; if (options.tools) { this.tools = { ...options.tools }; } // Initialize streaming speech config with defaults this.streamingSpeechConfig = { - minChunkSize: 50, - maxChunkSize: 200, - parallelGeneration: true, - maxParallelRequests: 3, + ...types_1.DEFAULT_STREAMING_SPEECH_CONFIG, ...options.streamingSpeech, }; // Initialize history config with defaults this.historyConfig = { - maxMessages: 100, - maxTotalChars: 0, // unlimited by default + ...types_1.DEFAULT_HISTORY_CONFIG, ...options.history, }; } diff --git a/dist/VoiceAgent.js.map b/dist/VoiceAgent.js.map index e0ee349..50a5ae2 100644 --- a/dist/VoiceAgent.js.map +++ b/dist/VoiceAgent.js.map @@ -1 +1 @@ -{"version":3,"file":"VoiceAgent.js","sourceRoot":"","sources":["../src/VoiceAgent.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"VoiceAgent.js","sourceRoot":"","sources":["../src/VoiceAgent.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index db8f5d0..90c8d3b 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,2 +1,4 @@ export { VoiceAgent, type VoiceAgentOptions } from "./VoiceAgent"; +export { VideoAgent, type VideoAgentOptions, type VideoFrame, type AudioData, type VideoAgentConfig, type FrameContext, type FrameTriggerReason, } from "./VideoAgent"; +export { type SpeechChunk, type StreamingSpeechConfig, type HistoryConfig, type StopWhenCondition, DEFAULT_STREAMING_SPEECH_CONFIG, DEFAULT_HISTORY_CONFIG, DEFAULT_MAX_AUDIO_SIZE, } from "./types"; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/index.d.ts.map b/dist/index.d.ts.map index df12ae8..b9bc9e7 100644 --- a/dist/index.d.ts.map +++ b/dist/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EACH,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,kBAAkB,GAC1B,MAAM,cAAc,CAAC;AAGtB,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,+BAA+B,EAC/B,sBAAsB,EACtB,sBAAsB,GACzB,MAAM,SAAS,CAAC"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 96cd020..af8affb 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,6 +1,14 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.VoiceAgent = void 0; +exports.DEFAULT_MAX_AUDIO_SIZE = exports.DEFAULT_HISTORY_CONFIG = exports.DEFAULT_STREAMING_SPEECH_CONFIG = exports.VideoAgent = exports.VoiceAgent = void 0; +// Agents var VoiceAgent_1 = require("./VoiceAgent"); Object.defineProperty(exports, "VoiceAgent", { enumerable: true, get: function () { return VoiceAgent_1.VoiceAgent; } }); +var VideoAgent_1 = require("./VideoAgent"); +Object.defineProperty(exports, "VideoAgent", { enumerable: true, get: function () { return VideoAgent_1.VideoAgent; } }); +// Shared types +var types_1 = require("./types"); +Object.defineProperty(exports, "DEFAULT_STREAMING_SPEECH_CONFIG", { enumerable: true, get: function () { return types_1.DEFAULT_STREAMING_SPEECH_CONFIG; } }); +Object.defineProperty(exports, "DEFAULT_HISTORY_CONFIG", { enumerable: true, get: function () { return types_1.DEFAULT_HISTORY_CONFIG; } }); +Object.defineProperty(exports, "DEFAULT_MAX_AUDIO_SIZE", { enumerable: true, get: function () { return types_1.DEFAULT_MAX_AUDIO_SIZE; } }); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index 77a38eb..8c027fb 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,2CAAkE;AAAzD,wGAAA,UAAU,OAAA"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,SAAS;AACT,2CAAkE;AAAzD,wGAAA,UAAU,OAAA;AACnB,2CAQsB;AAPlB,wGAAA,UAAU,OAAA;AASd,eAAe;AACf,iCAQiB;AAHb,wHAAA,+BAA+B,OAAA;AAC/B,+GAAA,sBAAsB,OAAA;AACtB,+GAAA,sBAAsB,OAAA"} \ No newline at end of file diff --git a/dist/types.d.ts b/dist/types.d.ts new file mode 100644 index 0000000..68ada07 --- /dev/null +++ b/dist/types.d.ts @@ -0,0 +1,46 @@ +import type { streamText } from "ai"; +/** + * Represents a chunk of text to be converted to speech + */ +export interface SpeechChunk { + id: number; + text: string; + audioPromise?: Promise; +} +/** + * Configuration for streaming speech behavior + */ +export interface StreamingSpeechConfig { + /** Minimum characters before generating speech for a chunk */ + minChunkSize: number; + /** Maximum characters per chunk (will split at sentence boundary before this) */ + maxChunkSize: number; + /** Whether to enable parallel TTS generation */ + parallelGeneration: boolean; + /** Maximum number of parallel TTS requests */ + maxParallelRequests: number; +} +/** + * Configuration for conversation history memory management + */ +export interface HistoryConfig { + /** Maximum number of messages to keep in history. When exceeded, oldest messages are trimmed. Set to 0 for unlimited. */ + maxMessages: number; + /** Maximum total character count across all messages. When exceeded, oldest messages are trimmed. Set to 0 for unlimited. */ + maxTotalChars: number; +} +/** + * Default streaming speech configuration + */ +export declare const DEFAULT_STREAMING_SPEECH_CONFIG: StreamingSpeechConfig; +/** + * Default history configuration + */ +export declare const DEFAULT_HISTORY_CONFIG: HistoryConfig; +/** Default maximum audio input size (10 MB) */ +export declare const DEFAULT_MAX_AUDIO_SIZE: number; +/** + * Default stop condition type from streamText + */ +export type StopWhenCondition = NonNullable[0]["stopWhen"]>; +//# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/dist/types.d.ts.map b/dist/types.d.ts.map new file mode 100644 index 0000000..4ec39ea --- /dev/null +++ b/dist/types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAErC;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,kBAAkB,EAAE,OAAO,CAAC;IAC5B,8CAA8C;IAC9C,mBAAmB,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,yHAAyH;IACzH,WAAW,EAAE,MAAM,CAAC;IACpB,6HAA6H;IAC7H,aAAa,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,eAAO,MAAM,+BAA+B,EAAE,qBAK7C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,aAGpC,CAAC;AAEF,+CAA+C;AAC/C,eAAO,MAAM,sBAAsB,QAAmB,CAAC;AAEvD;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/types.js b/dist/types.js new file mode 100644 index 0000000..ffacf36 --- /dev/null +++ b/dist/types.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DEFAULT_MAX_AUDIO_SIZE = exports.DEFAULT_HISTORY_CONFIG = exports.DEFAULT_STREAMING_SPEECH_CONFIG = void 0; +/** + * Default streaming speech configuration + */ +exports.DEFAULT_STREAMING_SPEECH_CONFIG = { + minChunkSize: 50, + maxChunkSize: 200, + parallelGeneration: true, + maxParallelRequests: 3, +}; +/** + * Default history configuration + */ +exports.DEFAULT_HISTORY_CONFIG = { + maxMessages: 100, + maxTotalChars: 0, // unlimited by default +}; +/** Default maximum audio input size (10 MB) */ +exports.DEFAULT_MAX_AUDIO_SIZE = 10 * 1024 * 1024; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/types.js.map b/dist/types.js.map new file mode 100644 index 0000000..152553a --- /dev/null +++ b/dist/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAmCA;;GAEG;AACU,QAAA,+BAA+B,GAA0B;IAClE,YAAY,EAAE,EAAE;IAChB,YAAY,EAAE,GAAG;IACjB,kBAAkB,EAAE,IAAI;IACxB,mBAAmB,EAAE,CAAC;CACzB,CAAC;AAEF;;GAEG;AACU,QAAA,sBAAsB,GAAkB;IACjD,WAAW,EAAE,GAAG;IAChB,aAAa,EAAE,CAAC,EAAE,uBAAuB;CAC5C,CAAC;AAEF,+CAA+C;AAClC,QAAA,sBAAsB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC"} \ No newline at end of file diff --git a/example/voice-client.html b/example/voice-client.html index a5673b9..5f0c257 100644 --- a/example/voice-client.html +++ b/example/voice-client.html @@ -258,7 +258,7 @@
- +
@@ -1253,4 +1253,4 @@ - \ No newline at end of file + diff --git a/src/VideoAgent.ts b/src/VideoAgent.ts new file mode 100644 index 0000000..a8165fa --- /dev/null +++ b/src/VideoAgent.ts @@ -0,0 +1,1692 @@ +import { WebSocket } from "ws"; +import { EventEmitter } from "events"; +import { + streamText, + LanguageModel, + stepCountIs, + type Tool, + type ModelMessage, + experimental_transcribe as transcribe, + experimental_generateSpeech as generateSpeech, + type TranscriptionModel, + type SpeechModel, +} from "ai"; +import { + type SpeechChunk, + type StreamingSpeechConfig, + type HistoryConfig, + DEFAULT_STREAMING_SPEECH_CONFIG, + DEFAULT_HISTORY_CONFIG, + DEFAULT_MAX_AUDIO_SIZE, +} from "./types"; + +/** + * Trigger reasons for frame capture + */ +type FrameTriggerReason = "scene_change" | "user_request" | "timer" | "initial"; + +/** + * Video frame data structure sent to/from the client + */ +interface VideoFrame { + type: "video_frame"; + sessionId: string; + sequence: number; + timestamp: number; + triggerReason: FrameTriggerReason; + previousFrameRef?: string; + image: { + data: string; // base64 encoded + format: string; // e.g., "webp", "jpeg" + width: number; + height: number; + }; +} + +/** + * Audio data structure + */ +interface AudioData { + type: "audio"; + sessionId: string; + data: string; // base64 encoded + format: string; // e.g., "audio/webm;codecs=opus" + sampleRate?: number; + duration?: number; + timestamp: number; +} + +/** + * Backend configuration for video processing + */ +interface VideoAgentConfig { + /** Maximum frames to keep in context buffer for conversation history */ + maxContextFrames: number; +} + +/** + * Frame context for maintaining visual conversation history + */ +interface FrameContext { + sequence: number; + timestamp: number; + triggerReason: FrameTriggerReason; + frameHash: string; + description?: string; +} + +/** Default maximum frame input size (5 MB) */ +const DEFAULT_MAX_FRAME_SIZE = 5 * 1024 * 1024; + +/** Default video agent config */ +const DEFAULT_VIDEO_AGENT_CONFIG: VideoAgentConfig = { + maxContextFrames: 10, +}; + +export interface VideoAgentOptions { + model: LanguageModel; // AI SDK Model for chat (e.g., openai('gpt-4o')) + transcriptionModel?: TranscriptionModel; // AI SDK Transcription Model (e.g., openai.transcription('whisper-1')) + speechModel?: SpeechModel; // AI SDK Speech Model (e.g., openai.speech('gpt-4o-mini-tts')) + instructions?: string; + stopWhen?: NonNullable[0]["stopWhen"]>; + tools?: Record; + endpoint?: string; + voice?: string; // Voice for TTS (e.g., 'alloy', 'echo', 'shimmer') + speechInstructions?: string; // Instructions for TTS voice style + outputFormat?: string; // Audio output format (e.g., 'mp3', 'opus', 'wav') + /** Configuration for streaming speech generation */ + streamingSpeech?: Partial; + /** Configuration for conversation history memory limits */ + history?: Partial; + /** Maximum audio input size in bytes (default: 10 MB) */ + maxAudioInputSize?: number; + /** Maximum frame input size in bytes (default: 5 MB) */ + maxFrameInputSize?: number; + /** Maximum frames to keep in context buffer (default: 10) */ + maxContextFrames?: number; + /** Session ID for this video agent instance */ + sessionId?: string; +} + +export class VideoAgent extends EventEmitter { + private socket?: WebSocket; + private tools: Record = {}; + private model: LanguageModel; + private transcriptionModel?: TranscriptionModel; + private speechModel?: SpeechModel; + private instructions: string; + private stopWhen: NonNullable[0]["stopWhen"]>; + private endpoint?: string; + private isConnected = false; + private conversationHistory: ModelMessage[] = []; + private voice: string; + private speechInstructions?: string; + private outputFormat: string; + private isProcessing = false; + private isDestroyed = false; + + // Session management + private sessionId: string; + private frameSequence = 0; + private lastFrameTimestamp = 0; + private lastFrameHash?: string; + + // Frame context buffer for visual conversation history + private frameContextBuffer: FrameContext[] = []; + private currentFrameData?: string; // Base64 encoded current frame + + // Video agent configuration + private videoConfig: VideoAgentConfig; + + // Concurrency: queue incoming requests so they run serially + private inputQueue: Array<{ + text?: string; + frame?: VideoFrame; + audio?: AudioData; + resolve: (v: string) => void; + reject: (e: unknown) => void; + }> = []; + private processingQueue = false; + + // Abort controller for the current LLM stream so we can cancel it on interrupt/disconnect + private currentStreamAbortController?: AbortController; + + // Memory management + private historyConfig: HistoryConfig; + private maxAudioInputSize: number; + private maxFrameInputSize: number; + + // Streaming speech state + private streamingSpeechConfig: StreamingSpeechConfig; + private currentSpeechAbortController?: AbortController; + private speechChunkQueue: SpeechChunk[] = []; + private nextChunkId = 0; + private isSpeaking = false; + private pendingTextBuffer = ""; + + // Promise-based signal for speech queue completion + private speechQueueDonePromise?: Promise; + private speechQueueDoneResolve?: () => void; + + constructor(options: VideoAgentOptions) { + super(); + this.model = options.model; + this.transcriptionModel = options.transcriptionModel; + this.speechModel = options.speechModel; + this.instructions = + options.instructions || + `You are a helpful multimodal AI assistant that can see through the user's camera and hear their voice. +When analyzing images, be concise but informative. Describe what you see when asked. +Keep responses conversational since they will be spoken aloud. +Use tools when needed to provide accurate information.`; + this.stopWhen = options.stopWhen || stepCountIs(5); + this.endpoint = options.endpoint; + this.voice = options.voice || "alloy"; + this.speechInstructions = options.speechInstructions; + this.outputFormat = options.outputFormat || "mp3"; + this.maxAudioInputSize = options.maxAudioInputSize ?? DEFAULT_MAX_AUDIO_SIZE; + this.maxFrameInputSize = options.maxFrameInputSize ?? DEFAULT_MAX_FRAME_SIZE; + + // Generate or use provided session ID + this.sessionId = options.sessionId || this.generateSessionId(); + + // Initialize video config + this.videoConfig = { + ...DEFAULT_VIDEO_AGENT_CONFIG, + maxContextFrames: options.maxContextFrames ?? DEFAULT_VIDEO_AGENT_CONFIG.maxContextFrames, + }; + + if (options.tools) { + this.tools = { ...options.tools }; + } + + // Initialize streaming speech config with defaults + this.streamingSpeechConfig = { + ...DEFAULT_STREAMING_SPEECH_CONFIG, + ...options.streamingSpeech, + }; + + // Initialize history config with defaults + this.historyConfig = { + ...DEFAULT_HISTORY_CONFIG, + ...options.history, + }; + } + + /** + * Generate a unique session ID + */ + private generateSessionId(): string { + const timestamp = Date.now().toString(36); + const randomPart = Math.random().toString(36).substring(2, 10); + return `vs_${timestamp}_${randomPart}`; + } + + /** + * Simple hash function for frame comparison + */ + private hashFrame(data: string): string { + let hash = 0; + for (let i = 0; i < data.length; i++) { + const char = data.charCodeAt(i); + hash = ((hash << 5) - hash) + char; + hash = hash & hash; // Convert to 32bit integer + } + return `frame_${this.frameSequence}_${Math.abs(hash).toString(16)}`; + } + + /** + * Ensure the agent has not been destroyed. Throws if it has. + */ + private ensureNotDestroyed(): void { + if (this.isDestroyed) { + throw new Error("VideoAgent has been destroyed and cannot be used"); + } + } + + /** + * Get current video agent configuration + */ + public getConfig(): VideoAgentConfig { + return { ...this.videoConfig }; + } + + /** + * Update video agent configuration + */ + public updateConfig(config: Partial): void { + this.videoConfig = { ...this.videoConfig, ...config }; + this.emit("config_changed", this.videoConfig); + } + + private setupListeners() { + if (!this.socket) return; + + this.socket.on("message", async (data) => { + try { + const message = JSON.parse(data.toString()); + console.log(`Received WebSocket message of type: ${message.type}`); + + switch (message.type) { + // Handle transcribed text from the client/STT + case "transcript": + if (typeof message.text !== "string" || !message.text.trim()) { + this.emit("warning", "Received empty or invalid transcript message"); + return; + } + // Interrupt ongoing speech when user starts speaking (barge-in) + this.interruptCurrentResponse("user_speaking"); + // Force capture current frame when user speaks + this.requestFrameCapture("user_request"); + console.log(`Processing transcript: "${message.text}"`); + await this.enqueueTextInput(message.text); + break; + + // Handle raw audio data that needs transcription + case "audio": + if (typeof message.data !== "string" || !message.data) { + this.emit("warning", "Received empty or invalid audio message"); + return; + } + // Interrupt ongoing speech when user starts speaking (barge-in) + this.interruptCurrentResponse("user_speaking"); + // Force capture current frame when user speaks + this.requestFrameCapture("user_request"); + console.log( + `Received audio data (${message.data.length / 1000}KB) for processing, format: ${message.format || "unknown"}` + ); + await this.processAudioInput(message); + break; + + // Handle video frame from client + case "video_frame": + await this.handleVideoFrame(message); + break; + + // Handle explicit interrupt request from client + case "interrupt": + console.log(`Received interrupt request: ${message.reason || "client_request"}`); + this.interruptCurrentResponse(message.reason || "client_request"); + break; + + // Handle client ready signal + case "client_ready": + this.handleClientReady(message); + break; + + default: + console.log(`Unknown message type: ${message.type}`); + } + } catch (err) { + console.error("Failed to process message:", err); + this.emit("error", err); + } + }); + + this.socket.on("close", () => { + console.log("Disconnected"); + this.isConnected = false; + this.cleanupOnDisconnect(); + this.emit("disconnected"); + }); + + this.socket.on("error", (error) => { + console.error("WebSocket error:", error); + this.emit("error", error); + }); + } + + /** + * Handle client ready signal + */ + private handleClientReady(message: any): void { + console.log(`Client ready, capabilities: ${JSON.stringify(message.capabilities || {})}`); + + // Send session info to client + this.sendWebSocketMessage({ + type: "session_init", + sessionId: this.sessionId, + }); + + this.emit("client_ready", message.capabilities); + } + + /** + * Handle incoming video frame + */ + private async handleVideoFrame(frame: VideoFrame): Promise { + try { + // Validate frame + if (!frame.image?.data) { + this.emit("warning", "Received empty or invalid video frame"); + return; + } + + // Check frame size + const frameSize = Buffer.from(frame.image.data, "base64").length; + if (frameSize > this.maxFrameInputSize) { + const sizeMB = (frameSize / (1024 * 1024)).toFixed(1); + const maxMB = (this.maxFrameInputSize / (1024 * 1024)).toFixed(1); + this.emit( + "error", + new Error(`Frame too large (${sizeMB} MB). Maximum allowed: ${maxMB} MB`) + ); + return; + } + + // Update frame tracking + const frameHash = this.hashFrame(frame.image.data); + this.lastFrameTimestamp = frame.timestamp; + this.lastFrameHash = frameHash; + this.currentFrameData = frame.image.data; + + // Add to context buffer + this.addFrameToContext({ + sequence: frame.sequence, + timestamp: frame.timestamp, + triggerReason: frame.triggerReason, + frameHash, + }); + + // Emit frame received event + this.emit("frame_received", { + sequence: frame.sequence, + timestamp: frame.timestamp, + triggerReason: frame.triggerReason, + size: frameSize, + dimensions: { width: frame.image.width, height: frame.image.height }, + }); + + // Acknowledge frame receipt to client + this.sendWebSocketMessage({ + type: "frame_ack", + sequence: frame.sequence, + timestamp: Date.now(), + }); + + console.log( + `Received frame #${frame.sequence} (${frame.triggerReason}): ${(frameSize / 1024).toFixed(1)}KB, ${frame.image.width}x${frame.image.height}` + ); + } catch (error) { + console.error("Failed to handle video frame:", error); + this.emit("error", error); + } + } + + /** + * Add frame to context buffer + */ + private addFrameToContext(context: FrameContext): void { + this.frameContextBuffer.push(context); + + // Trim buffer if needed + if (this.frameContextBuffer.length > this.videoConfig.maxContextFrames) { + this.frameContextBuffer.shift(); + } + } + + /** + * Request client to capture and send a frame + */ + public requestFrameCapture(reason: FrameTriggerReason): void { + this.sendWebSocketMessage({ + type: "capture_frame", + reason, + timestamp: Date.now(), + }); + + this.emit("frame_requested", { reason }); + } + + /** + * Clean up all in-flight state when the connection drops. + */ + private cleanupOnDisconnect(): void { + // Abort ongoing LLM stream + if (this.currentStreamAbortController) { + this.currentStreamAbortController.abort(); + this.currentStreamAbortController = undefined; + } + // Abort ongoing speech generation + if (this.currentSpeechAbortController) { + this.currentSpeechAbortController.abort(); + this.currentSpeechAbortController = undefined; + } + // Clear speech state + this.speechChunkQueue = []; + this.pendingTextBuffer = ""; + this.isSpeaking = false; + this.isProcessing = false; + // Clear frame state + this.currentFrameData = undefined; + // Resolve any pending speech-done waiters + if (this.speechQueueDoneResolve) { + this.speechQueueDoneResolve(); + this.speechQueueDoneResolve = undefined; + this.speechQueueDonePromise = undefined; + } + // Reject any queued inputs + for (const item of this.inputQueue) { + item.reject(new Error("Connection closed")); + } + this.inputQueue = []; + this.processingQueue = false; + } + + public registerTools(tools: Record) { + this.tools = { ...this.tools, ...tools }; + } + + /** + * Transcribe audio data to text using the configured transcription model + */ + public async transcribeAudio(audioData: Buffer | Uint8Array): Promise { + if (!this.transcriptionModel) { + throw new Error("Transcription model not configured"); + } + + console.log(`Sending ${audioData.byteLength} bytes to Whisper for transcription`); + + try { + const result = await transcribe({ + model: this.transcriptionModel, + audio: audioData, + }); + + console.log( + `Whisper transcription result: "${result.text}", language: ${result.language || "unknown"}` + ); + + this.emit("transcription", { + text: result.text, + language: result.language, + }); + + // Also send transcription to client for immediate feedback + this.sendWebSocketMessage({ + type: "transcription_result", + text: result.text, + language: result.language, + }); + + return result.text; + } catch (error) { + console.error("Whisper transcription failed:", error); + throw error; + } + } + + /** + * Generate speech from text using the configured speech model + */ + public async generateSpeechFromText( + text: string, + abortSignal?: AbortSignal + ): Promise { + if (!this.speechModel) { + throw new Error("Speech model not configured"); + } + + const result = await generateSpeech({ + model: this.speechModel, + text, + voice: this.voice, + instructions: this.speechInstructions, + outputFormat: this.outputFormat, + abortSignal, + }); + + return result.audio.uint8Array; + } + + /** + * Interrupt ongoing speech generation and playback + */ + public interruptSpeech(reason: string = "interrupted"): void { + if (!this.isSpeaking && this.speechChunkQueue.length === 0) { + return; + } + + if (this.currentSpeechAbortController) { + this.currentSpeechAbortController.abort(); + this.currentSpeechAbortController = undefined; + } + + this.speechChunkQueue = []; + this.pendingTextBuffer = ""; + this.isSpeaking = false; + + if (this.speechQueueDoneResolve) { + this.speechQueueDoneResolve(); + this.speechQueueDoneResolve = undefined; + this.speechQueueDonePromise = undefined; + } + + this.sendWebSocketMessage({ + type: "speech_interrupted", + reason, + }); + + this.emit("speech_interrupted", { reason }); + } + + /** + * Interrupt both the current LLM stream and ongoing speech + */ + public interruptCurrentResponse(reason: string = "interrupted"): void { + if (this.currentStreamAbortController) { + this.currentStreamAbortController.abort(); + this.currentStreamAbortController = undefined; + } + this.interruptSpeech(reason); + } + + /** + * Extract complete sentences from text buffer + */ + private extractSentences(text: string): [string[], string] { + const sentences: string[] = []; + let remaining = text; + + const sentenceEndPattern = /[.!?]+(?:\s+|$)/g; + let lastIndex = 0; + let match; + + while ((match = sentenceEndPattern.exec(text)) !== null) { + const sentence = text.slice(lastIndex, match.index + match[0].length).trim(); + if (sentence.length >= this.streamingSpeechConfig.minChunkSize) { + sentences.push(sentence); + lastIndex = match.index + match[0].length; + } else if (sentences.length > 0) { + sentences[sentences.length - 1] += " " + sentence; + lastIndex = match.index + match[0].length; + } + } + + remaining = text.slice(lastIndex); + + if (remaining.length > this.streamingSpeechConfig.maxChunkSize) { + const clausePattern = /[,;:]\s+/g; + let clauseMatch; + let splitIndex = 0; + + while ((clauseMatch = clausePattern.exec(remaining)) !== null) { + if (clauseMatch.index >= this.streamingSpeechConfig.minChunkSize) { + splitIndex = clauseMatch.index + clauseMatch[0].length; + break; + } + } + + if (splitIndex > 0) { + sentences.push(remaining.slice(0, splitIndex).trim()); + remaining = remaining.slice(splitIndex); + } + } + + return [sentences, remaining]; + } + + /** + * Trim conversation history to stay within configured limits + */ + private trimHistory(): void { + const { maxMessages, maxTotalChars } = this.historyConfig; + + if (maxMessages > 0 && this.conversationHistory.length > maxMessages) { + const excess = this.conversationHistory.length - maxMessages; + const toRemove = excess % 2 === 0 ? excess : excess + 1; + this.conversationHistory.splice(0, toRemove); + this.emit("history_trimmed", { removedCount: toRemove, reason: "max_messages" }); + } + + if (maxTotalChars > 0) { + let totalChars = this.conversationHistory.reduce((sum, msg) => { + const content = typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content); + return sum + content.length; + }, 0); + + let removedCount = 0; + while (totalChars > maxTotalChars && this.conversationHistory.length > 2) { + const removed = this.conversationHistory.shift(); + if (removed) { + const content = + typeof removed.content === "string" ? removed.content : JSON.stringify(removed.content); + totalChars -= content.length; + removedCount++; + } + } + if (removedCount > 0) { + this.emit("history_trimmed", { removedCount, reason: "max_total_chars" }); + } + } + } + + /** + * Queue a text chunk for speech generation + */ + private queueSpeechChunk(text: string): void { + if (!this.speechModel || !text.trim()) return; + + if (this.nextChunkId >= Number.MAX_SAFE_INTEGER) { + this.nextChunkId = 0; + } + + const chunk: SpeechChunk = { + id: this.nextChunkId++, + text: text.trim(), + }; + + if (!this.speechQueueDonePromise) { + this.speechQueueDonePromise = new Promise((resolve) => { + this.speechQueueDoneResolve = resolve; + }); + } + + if (this.streamingSpeechConfig.parallelGeneration) { + const activeRequests = this.speechChunkQueue.filter((c) => c.audioPromise).length; + + if (activeRequests < this.streamingSpeechConfig.maxParallelRequests) { + chunk.audioPromise = this.generateChunkAudio(chunk); + } + } + + this.speechChunkQueue.push(chunk); + this.emit("speech_chunk_queued", { id: chunk.id, text: chunk.text }); + + if (!this.isSpeaking) { + this.processSpeechQueue(); + } + } + + /** + * Generate audio for a single chunk + */ + private async generateChunkAudio(chunk: SpeechChunk): Promise { + if (!this.currentSpeechAbortController) { + this.currentSpeechAbortController = new AbortController(); + } + + try { + console.log( + `Generating audio for chunk ${chunk.id}: "${chunk.text.substring(0, 50)}${chunk.text.length > 50 ? "..." : ""}"` + ); + const audioData = await this.generateSpeechFromText( + chunk.text, + this.currentSpeechAbortController.signal + ); + console.log(`Generated audio for chunk ${chunk.id}: ${audioData.length} bytes`); + return audioData; + } catch (error) { + if ((error as Error).name === "AbortError") { + console.log(`Audio generation aborted for chunk ${chunk.id}`); + return null; + } + console.error(`Failed to generate audio for chunk ${chunk.id}:`, error); + this.emit("error", error); + return null; + } + } + + /** + * Process the speech queue and send audio chunks in order + */ + private async processSpeechQueue(): Promise { + if (this.isSpeaking) return; + this.isSpeaking = true; + + console.log(`Starting speech queue processing with ${this.speechChunkQueue.length} chunks`); + this.emit("speech_start", { streaming: true }); + this.sendWebSocketMessage({ type: "speech_stream_start" }); + + try { + while (this.speechChunkQueue.length > 0) { + const chunk = this.speechChunkQueue[0]; + + console.log( + `Processing speech chunk #${chunk.id} (${this.speechChunkQueue.length - 1} remaining)` + ); + + if (!chunk.audioPromise) { + chunk.audioPromise = this.generateChunkAudio(chunk); + } + + const audioData = await chunk.audioPromise; + + if (!this.isSpeaking) { + console.log(`Speech interrupted during chunk #${chunk.id}`); + break; + } + + this.speechChunkQueue.shift(); + + if (audioData) { + const base64Audio = Buffer.from(audioData).toString("base64"); + console.log( + `Sending audio chunk #${chunk.id} (${audioData.length} bytes, ${this.outputFormat})` + ); + + this.sendWebSocketMessage({ + type: "audio_chunk", + chunkId: chunk.id, + data: base64Audio, + format: this.outputFormat, + text: chunk.text, + }); + + this.emit("audio_chunk", { + chunkId: chunk.id, + data: base64Audio, + format: this.outputFormat, + text: chunk.text, + uint8Array: audioData, + }); + } else { + console.log(`No audio data generated for chunk #${chunk.id}`); + } + + if (this.streamingSpeechConfig.parallelGeneration) { + const activeRequests = this.speechChunkQueue.filter((c) => c.audioPromise).length; + const toStart = Math.min( + this.streamingSpeechConfig.maxParallelRequests - activeRequests, + this.speechChunkQueue.length + ); + + if (toStart > 0) { + console.log(`Starting parallel generation for ${toStart} more chunks`); + for (let i = 0; i < toStart; i++) { + const nextChunk = this.speechChunkQueue.find((c) => !c.audioPromise); + if (nextChunk) { + nextChunk.audioPromise = this.generateChunkAudio(nextChunk); + } + } + } + } + } + } catch (error) { + console.error("Error in speech queue processing:", error); + this.emit("error", error); + } finally { + this.isSpeaking = false; + this.currentSpeechAbortController = undefined; + + if (this.speechQueueDoneResolve) { + this.speechQueueDoneResolve(); + this.speechQueueDoneResolve = undefined; + this.speechQueueDonePromise = undefined; + } + + console.log(`Speech queue processing complete`); + this.sendWebSocketMessage({ type: "speech_stream_end" }); + this.emit("speech_complete", { streaming: true }); + } + } + + /** + * Process text delta for streaming speech + */ + private processTextForStreamingSpeech(textDelta: string): void { + if (!this.speechModel) return; + + this.pendingTextBuffer += textDelta; + + const [sentences, remaining] = this.extractSentences(this.pendingTextBuffer); + this.pendingTextBuffer = remaining; + + for (const sentence of sentences) { + this.queueSpeechChunk(sentence); + } + } + + /** + * Flush any remaining text in the buffer to speech + */ + private flushStreamingSpeech(): void { + if (!this.speechModel || !this.pendingTextBuffer.trim()) return; + + this.queueSpeechChunk(this.pendingTextBuffer); + this.pendingTextBuffer = ""; + } + + /** + * Process incoming audio data: transcribe and generate response + */ + private async processAudioInput(audioMessage: AudioData): Promise { + if (!this.transcriptionModel) { + this.emit("error", new Error("Transcription model not configured for audio input")); + return; + } + + try { + const audioBuffer = Buffer.from(audioMessage.data, "base64"); + + if (audioBuffer.length > this.maxAudioInputSize) { + const sizeMB = (audioBuffer.length / (1024 * 1024)).toFixed(1); + const maxMB = (this.maxAudioInputSize / (1024 * 1024)).toFixed(1); + this.emit( + "error", + new Error(`Audio input too large (${sizeMB} MB). Maximum allowed: ${maxMB} MB`) + ); + return; + } + + if (audioBuffer.length === 0) { + this.emit("warning", "Received empty audio data"); + return; + } + + this.emit("audio_received", { + size: audioBuffer.length, + format: audioMessage.format, + sessionId: audioMessage.sessionId, + }); + + console.log( + `Processing audio input: ${audioBuffer.length} bytes, format: ${audioMessage.format || "unknown"}` + ); + + const transcribedText = await this.transcribeAudio(audioBuffer); + console.log(`Transcribed text: "${transcribedText}"`); + + if (transcribedText.trim()) { + await this.enqueueTextInput(transcribedText); + } else { + this.emit("warning", "Transcription returned empty text"); + this.sendWebSocketMessage({ + type: "transcription_error", + error: "Whisper returned empty text", + }); + } + } catch (error) { + console.error("Failed to process audio input:", error); + this.emit("error", error); + this.sendWebSocketMessage({ + type: "transcription_error", + error: `Transcription failed: ${(error as Error).message || String(error)}`, + }); + } + } + + public async connect(url?: string): Promise { + this.ensureNotDestroyed(); + + if (this.socket) { + this.disconnectSocket(); + } + + return new Promise((resolve, reject) => { + try { + const wsUrl = url || this.endpoint || "ws://localhost:8080"; + this.socket = new WebSocket(wsUrl); + this.setupListeners(); + + this.socket.once("open", () => { + this.isConnected = true; + this.emit("connected"); + resolve(); + }); + + this.socket.once("error", (error) => { + reject(error); + }); + } catch (error) { + reject(error); + } + }); + } + + /** + * Attach an existing WebSocket (server-side usage) + */ + public handleSocket(socket: WebSocket): void { + this.ensureNotDestroyed(); + + if (this.socket) { + this.disconnectSocket(); + } + + this.socket = socket; + this.isConnected = true; + this.setupListeners(); + this.emit("connected"); + } + + /** + * Send text input for processing (bypasses transcription) + */ + public async sendText(text: string): Promise { + this.ensureNotDestroyed(); + if (!text || !text.trim()) { + throw new Error("Text input cannot be empty"); + } + return this.enqueueTextInput(text); + } + + /** + * Send audio data to be transcribed and processed + */ + public async sendAudio(audioData: string): Promise { + this.ensureNotDestroyed(); + await this.processAudioInput({ + type: "audio", + sessionId: this.sessionId, + data: audioData, + format: "unknown", + timestamp: Date.now(), + }); + } + + /** + * Send raw audio buffer to be transcribed and processed + */ + public async sendAudioBuffer(audioBuffer: Buffer | Uint8Array): Promise { + this.ensureNotDestroyed(); + const base64Audio = Buffer.from(audioBuffer).toString("base64"); + await this.processAudioInput({ + type: "audio", + sessionId: this.sessionId, + data: base64Audio, + format: "unknown", + timestamp: Date.now(), + }); + } + + /** + * Send a video frame with optional text query for vision analysis + */ + public async sendFrame( + frameData: string, + query?: string, + options?: { width?: number; height?: number; format?: string } + ): Promise { + this.ensureNotDestroyed(); + + const frame: VideoFrame = { + type: "video_frame", + sessionId: this.sessionId, + sequence: this.frameSequence++, + timestamp: Date.now(), + triggerReason: "user_request", + previousFrameRef: this.lastFrameHash, + image: { + data: frameData, + format: options?.format || "webp", + width: options?.width || 640, + height: options?.height || 480, + }, + }; + + // Update local frame state + await this.handleVideoFrame(frame); + + if (query) { + return this.enqueueMultimodalInput(query, frame); + } + + return ""; + } + + /** + * Enqueue a text input for serial processing + */ + private enqueueTextInput(text: string): Promise { + return new Promise((resolve, reject) => { + this.inputQueue.push({ text, resolve, reject }); + this.drainInputQueue(); + }); + } + + /** + * Enqueue a multimodal input (text + frame) for serial processing + */ + private enqueueMultimodalInput(text: string, frame: VideoFrame): Promise { + return new Promise((resolve, reject) => { + this.inputQueue.push({ text, frame, resolve, reject }); + this.drainInputQueue(); + }); + } + + /** + * Drain the input queue, processing one request at a time + */ + private async drainInputQueue(): Promise { + if (this.processingQueue) return; + this.processingQueue = true; + + try { + while (this.inputQueue.length > 0) { + const item = this.inputQueue.shift()!; + try { + let result: string; + if (item.frame && item.text) { + result = await this.processMultimodalInput(item.text, item.frame); + } else if (item.text) { + result = await this.processUserInput(item.text); + } else { + result = ""; + } + item.resolve(result); + } catch (error) { + item.reject(error); + } + } + } finally { + this.processingQueue = false; + } + } + + /** + * Build the message content array for multimodal input + */ + private buildMultimodalContent( + text: string, + frameData?: string + ): Array<{ type: "text"; text: string } | { type: "image"; image: string }> { + const content: Array<{ type: "text"; text: string } | { type: "image"; image: string }> = []; + + // Add frame context description if available + if (this.frameContextBuffer.length > 0) { + const contextSummary = `[Visual context: ${this.frameContextBuffer.length} frames captured, latest at ${new Date(this.lastFrameTimestamp).toISOString()}]`; + content.push({ type: "text", text: contextSummary }); + } + + // Add current frame if available + const imageData = frameData || this.currentFrameData; + if (imageData) { + content.push({ + type: "image", + image: imageData, + }); + } + + // Add user query + content.push({ type: "text", text }); + + return content; + } + + /** + * Process multimodal input (text + video frame) + */ + private async processMultimodalInput(text: string, frame: VideoFrame): Promise { + this.isProcessing = true; + this.currentStreamAbortController = new AbortController(); + const streamAbortSignal = this.currentStreamAbortController.signal; + + try { + this.emit("text", { role: "user", text, hasImage: true }); + + // Build multimodal message content + const content = this.buildMultimodalContent(text, frame.image.data); + + // Add to conversation history (simplified for history) + this.conversationHistory.push({ + role: "user", + content: [{ type: "text", text: `[Image attached] ${text}` }], + }); + this.trimHistory(); + + // Use streamText with multimodal content + const result = streamText({ + model: this.model, + system: this.instructions, + messages: [ + ...this.conversationHistory.slice(0, -1), // Previous history + { role: "user", content }, // Current multimodal message + ], + tools: this.tools, + stopWhen: this.stopWhen, + abortSignal: streamAbortSignal, + onChunk: ({ chunk }) => { + this.handleStreamChunk(chunk); + }, + onFinish: async (event) => { + for (const step of event.steps) { + for (const toolResult of step.toolResults) { + this.emit("tool_result", { + name: toolResult.toolName, + toolCallId: toolResult.toolCallId, + result: toolResult.output, + }); + } + } + }, + onError: ({ error }) => { + console.error("Stream error:", error); + this.emit("error", error); + }, + }); + + return await this.processStreamResult(result); + } catch (error) { + this.pendingTextBuffer = ""; + if (this.speechChunkQueue.length > 0 || this.isSpeaking) { + this.interruptSpeech("stream_error"); + } + throw error; + } finally { + this.isProcessing = false; + this.currentStreamAbortController = undefined; + } + } + + /** + * Process user input with streaming text generation + */ + private async processUserInput(text: string): Promise { + this.isProcessing = true; + this.currentStreamAbortController = new AbortController(); + const streamAbortSignal = this.currentStreamAbortController.signal; + + try { + this.emit("text", { role: "user", text }); + + // Check if we have current frame data - if so, include it + const hasVisualContext = !!this.currentFrameData; + + let messages: ModelMessage[]; + + if (hasVisualContext) { + // Build multimodal message + const content = this.buildMultimodalContent(text); + + // Store simplified version in history + this.conversationHistory.push({ + role: "user", + content: [{ type: "text", text: `[Visual context] ${text}` }], + }); + + messages = [ + ...this.conversationHistory.slice(0, -1), + { role: "user", content }, + ]; + } else { + // Text-only message + this.conversationHistory.push({ role: "user", content: text }); + messages = this.conversationHistory; + } + + this.trimHistory(); + + const result = streamText({ + model: this.model, + system: this.instructions, + messages, + tools: this.tools, + stopWhen: this.stopWhen, + abortSignal: streamAbortSignal, + onChunk: ({ chunk }) => { + this.handleStreamChunk(chunk); + }, + onFinish: async (event) => { + for (const step of event.steps) { + for (const toolResult of step.toolResults) { + this.emit("tool_result", { + name: toolResult.toolName, + toolCallId: toolResult.toolCallId, + result: toolResult.output, + }); + } + } + }, + onError: ({ error }) => { + console.error("Stream error:", error); + this.emit("error", error); + }, + }); + + return await this.processStreamResult(result); + } catch (error) { + this.pendingTextBuffer = ""; + if (this.speechChunkQueue.length > 0 || this.isSpeaking) { + this.interruptSpeech("stream_error"); + } + throw error; + } finally { + this.isProcessing = false; + this.currentStreamAbortController = undefined; + } + } + + /** + * Handle individual stream chunks + */ + private handleStreamChunk(chunk: any): void { + switch (chunk.type) { + case "text-delta": + this.emit("chunk:text_delta", { id: chunk.id, text: chunk.text }); + break; + + case "reasoning-delta": + this.emit("chunk:reasoning_delta", { id: chunk.id, text: chunk.text }); + break; + + case "tool-call": + this.emit("chunk:tool_call", { + toolName: chunk.toolName, + toolCallId: chunk.toolCallId, + input: chunk.input, + }); + break; + + case "tool-result": + this.emit("chunk:tool_result", { + toolName: chunk.toolName, + toolCallId: chunk.toolCallId, + result: chunk.output, + }); + break; + + case "tool-input-start": + this.emit("chunk:tool_input_start", { + id: chunk.id, + toolName: chunk.toolName, + }); + break; + + case "tool-input-delta": + this.emit("chunk:tool_input_delta", { + id: chunk.id, + delta: chunk.delta, + }); + break; + + case "source": + this.emit("chunk:source", chunk); + break; + } + } + + /** + * Process the full stream result and return the response text + */ + private async processStreamResult(result: ReturnType): Promise { + let fullText = ""; + let fullReasoning = ""; + const allToolCalls: Array<{ + toolName: string; + toolCallId: string; + input: unknown; + }> = []; + const allToolResults: Array<{ + toolName: string; + toolCallId: string; + output: unknown; + }> = []; + const allSources: Array = []; + const allFiles: Array = []; + + for await (const part of result.fullStream) { + switch (part.type) { + case "start": + this.sendWebSocketMessage({ type: "stream_start" }); + break; + + case "finish": + this.emit("text", { role: "assistant", text: fullText }); + this.sendWebSocketMessage({ + type: "stream_finish", + finishReason: part.finishReason, + usage: part.totalUsage, + }); + break; + + case "error": + this.emit("error", part.error); + this.sendWebSocketMessage({ + type: "stream_error", + error: String(part.error), + }); + break; + + case "abort": + this.emit("abort", { reason: part.reason }); + this.sendWebSocketMessage({ + type: "stream_abort", + reason: part.reason, + }); + break; + + case "start-step": + this.sendWebSocketMessage({ + type: "step_start", + warnings: part.warnings, + }); + break; + + case "finish-step": + this.sendWebSocketMessage({ + type: "step_finish", + finishReason: part.finishReason, + usage: part.usage, + }); + break; + + case "text-start": + this.sendWebSocketMessage({ type: "text_start", id: part.id }); + break; + + case "text-delta": + fullText += part.text; + this.processTextForStreamingSpeech(part.text); + this.sendWebSocketMessage({ + type: "text_delta", + id: part.id, + text: part.text, + }); + break; + + case "text-end": + this.flushStreamingSpeech(); + this.sendWebSocketMessage({ type: "text_end", id: part.id }); + break; + + case "reasoning-start": + this.sendWebSocketMessage({ type: "reasoning_start", id: part.id }); + break; + + case "reasoning-delta": + fullReasoning += part.text; + this.sendWebSocketMessage({ + type: "reasoning_delta", + id: part.id, + text: part.text, + }); + break; + + case "reasoning-end": + this.sendWebSocketMessage({ type: "reasoning_end", id: part.id }); + break; + + case "tool-input-start": + this.sendWebSocketMessage({ + type: "tool_input_start", + id: part.id, + toolName: part.toolName, + }); + break; + + case "tool-input-delta": + this.sendWebSocketMessage({ + type: "tool_input_delta", + id: part.id, + delta: part.delta, + }); + break; + + case "tool-input-end": + this.sendWebSocketMessage({ type: "tool_input_end", id: part.id }); + break; + + case "tool-call": + allToolCalls.push({ + toolName: part.toolName, + toolCallId: part.toolCallId, + input: part.input, + }); + this.sendWebSocketMessage({ + type: "tool_call", + toolName: part.toolName, + toolCallId: part.toolCallId, + input: part.input, + }); + break; + + case "tool-result": + allToolResults.push({ + toolName: part.toolName, + toolCallId: part.toolCallId, + output: part.output, + }); + this.sendWebSocketMessage({ + type: "tool_result", + toolName: part.toolName, + toolCallId: part.toolCallId, + result: part.output, + }); + break; + + case "tool-error": + this.sendWebSocketMessage({ + type: "tool_error", + toolName: part.toolName, + toolCallId: part.toolCallId, + error: String(part.error), + }); + break; + + case "source": + allSources.push(part); + this.sendWebSocketMessage({ + type: "source", + source: part, + }); + break; + + case "file": + allFiles.push(part.file); + this.sendWebSocketMessage({ + type: "file", + file: part.file, + }); + break; + } + } + + // Add assistant response to conversation history + if (fullText) { + this.conversationHistory.push({ role: "assistant", content: fullText }); + this.trimHistory(); + } + + // Ensure any remaining speech is flushed + this.flushStreamingSpeech(); + + // Wait for all speech chunks to complete + if (this.speechQueueDonePromise) { + await this.speechQueueDonePromise; + } + + // Send the complete response + this.sendWebSocketMessage({ + type: "response_complete", + sessionId: this.sessionId, + text: fullText, + reasoning: fullReasoning || undefined, + toolCalls: allToolCalls, + toolResults: allToolResults, + sources: allSources.length > 0 ? allSources : undefined, + files: allFiles.length > 0 ? allFiles : undefined, + frameContext: this.frameContextBuffer.length > 0 ? { + frameCount: this.frameContextBuffer.length, + lastFrameSequence: this.frameContextBuffer[this.frameContextBuffer.length - 1]?.sequence, + } : undefined, + }); + + return fullText; + } + + /** + * Send a message via WebSocket if connected + */ + private sendWebSocketMessage(message: Record): void { + if (!this.socket || !this.isConnected) return; + + try { + if (this.socket.readyState === WebSocket.OPEN) { + if (message.type === "audio_chunk" || message.type === "audio") { + const { data, ...rest } = message as any; + console.log( + `Sending WebSocket message: ${message.type}`, + data ? `(${(data.length / 1000).toFixed(1)}KB audio data)` : "", + rest + ); + } else { + console.log(`Sending WebSocket message: ${message.type}`); + } + + this.socket.send(JSON.stringify(message)); + } else { + console.warn(`Cannot send message, socket state: ${this.socket.readyState}`); + } + } catch (error) { + console.error("Failed to send WebSocket message:", error); + this.emit("error", error); + } + } + + /** + * Start listening for voice/video input + */ + startListening() { + console.log("Starting video agent..."); + this.emit("listening"); + } + + /** + * Stop listening for voice/video input + */ + stopListening() { + console.log("Stopping video agent..."); + this.emit("stopped"); + } + + /** + * Clear conversation history + */ + clearHistory() { + this.conversationHistory = []; + this.frameContextBuffer = []; + this.emit("history_cleared"); + } + + /** + * Get current conversation history + */ + getHistory(): ModelMessage[] { + return [...this.conversationHistory]; + } + + /** + * Set conversation history + */ + setHistory(history: ModelMessage[]) { + this.conversationHistory = [...history]; + } + + /** + * Get frame context buffer + */ + getFrameContext(): FrameContext[] { + return [...this.frameContextBuffer]; + } + + /** + * Get session ID + */ + getSessionId(): string { + return this.sessionId; + } + + /** + * Internal helper to close and clean up the current socket + */ + private disconnectSocket(): void { + if (!this.socket) return; + + this.cleanupOnDisconnect(); + + try { + this.socket.removeAllListeners(); + if ( + this.socket.readyState === WebSocket.OPEN || + this.socket.readyState === WebSocket.CONNECTING + ) { + this.socket.close(); + } + } catch { + // Ignore close errors + } + this.socket = undefined; + this.isConnected = false; + } + + /** + * Disconnect from WebSocket and stop all in-flight work + */ + disconnect() { + this.disconnectSocket(); + } + + /** + * Permanently destroy the agent, releasing all resources + */ + destroy() { + this.isDestroyed = true; + this.disconnectSocket(); + this.conversationHistory = []; + this.frameContextBuffer = []; + this.tools = {}; + this.removeAllListeners(); + } + + /** + * Check if agent is connected to WebSocket + */ + get connected(): boolean { + return this.isConnected; + } + + /** + * Check if agent is currently processing a request + */ + get processing(): boolean { + return this.isProcessing; + } + + /** + * Check if agent is currently speaking + */ + get speaking(): boolean { + return this.isSpeaking; + } + + /** + * Get the number of pending speech chunks in the queue + */ + get pendingSpeechChunks(): number { + return this.speechChunkQueue.length; + } + + /** + * Check if agent has been permanently destroyed + */ + get destroyed(): boolean { + return this.isDestroyed; + } + + /** + * Get current frame sequence number + */ + get currentFrameSequence(): number { + return this.frameSequence; + } + + /** + * Check if there is visual context available + */ + get hasVisualContext(): boolean { + return !!this.currentFrameData; + } +} + +// Export types for external use +export type { + VideoFrame, + AudioData, + VideoAgentConfig, + FrameContext, + FrameTriggerReason, +}; + +// Re-export shared types +export type { StreamingSpeechConfig, HistoryConfig } from "./types"; \ No newline at end of file diff --git a/src/VoiceAgent.ts b/src/VoiceAgent.ts index 18f741a..2a20753 100644 --- a/src/VoiceAgent.ts +++ b/src/VoiceAgent.ts @@ -11,42 +11,14 @@ import { type TranscriptionModel, type SpeechModel, } from "ai"; - -/** - * Represents a chunk of text to be converted to speech - */ -interface SpeechChunk { - id: number; - text: string; - audioPromise?: Promise; -} - -/** - * Configuration for streaming speech behavior - */ -interface StreamingSpeechConfig { - /** Minimum characters before generating speech for a chunk */ - minChunkSize: number; - /** Maximum characters per chunk (will split at sentence boundary before this) */ - maxChunkSize: number; - /** Whether to enable parallel TTS generation */ - parallelGeneration: boolean; - /** Maximum number of parallel TTS requests */ - maxParallelRequests: number; -} - -/** - * Configuration for conversation history memory management - */ -interface HistoryConfig { - /** Maximum number of messages to keep in history. When exceeded, oldest messages are trimmed. Set to 0 for unlimited. */ - maxMessages: number; - /** Maximum total character count across all messages. When exceeded, oldest messages are trimmed. Set to 0 for unlimited. */ - maxTotalChars: number; -} - -/** Default maximum audio input size (10 MB) */ -const DEFAULT_MAX_AUDIO_SIZE = 10 * 1024 * 1024; +import { + type SpeechChunk, + type StreamingSpeechConfig, + type HistoryConfig, + DEFAULT_STREAMING_SPEECH_CONFIG, + DEFAULT_HISTORY_CONFIG, + DEFAULT_MAX_AUDIO_SIZE, +} from "./types"; export interface VoiceAgentOptions { model: LanguageModel; // AI SDK Model for chat (e.g., openai('gpt-4o')) @@ -126,17 +98,13 @@ export class VoiceAgent extends EventEmitter { // Initialize streaming speech config with defaults this.streamingSpeechConfig = { - minChunkSize: 50, - maxChunkSize: 200, - parallelGeneration: true, - maxParallelRequests: 3, + ...DEFAULT_STREAMING_SPEECH_CONFIG, ...options.streamingSpeech, }; // Initialize history config with defaults this.historyConfig = { - maxMessages: 100, - maxTotalChars: 0, // unlimited by default + ...DEFAULT_HISTORY_CONFIG, ...options.history, }; } diff --git a/src/index.ts b/src/index.ts index 03a07b4..5b5786a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,22 @@ +// Agents export { VoiceAgent, type VoiceAgentOptions } from "./VoiceAgent"; +export { + VideoAgent, + type VideoAgentOptions, + type VideoFrame, + type AudioData, + type VideoAgentConfig, + type FrameContext, + type FrameTriggerReason, +} from "./VideoAgent"; + +// Shared types +export { + type SpeechChunk, + type StreamingSpeechConfig, + type HistoryConfig, + type StopWhenCondition, + DEFAULT_STREAMING_SPEECH_CONFIG, + DEFAULT_HISTORY_CONFIG, + DEFAULT_MAX_AUDIO_SIZE, +} from "./types"; diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..7820625 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,60 @@ +import type { streamText } from "ai"; + +/** + * Represents a chunk of text to be converted to speech + */ +export interface SpeechChunk { + id: number; + text: string; + audioPromise?: Promise; +} + +/** + * Configuration for streaming speech behavior + */ +export interface StreamingSpeechConfig { + /** Minimum characters before generating speech for a chunk */ + minChunkSize: number; + /** Maximum characters per chunk (will split at sentence boundary before this) */ + maxChunkSize: number; + /** Whether to enable parallel TTS generation */ + parallelGeneration: boolean; + /** Maximum number of parallel TTS requests */ + maxParallelRequests: number; +} + +/** + * Configuration for conversation history memory management + */ +export interface HistoryConfig { + /** Maximum number of messages to keep in history. When exceeded, oldest messages are trimmed. Set to 0 for unlimited. */ + maxMessages: number; + /** Maximum total character count across all messages. When exceeded, oldest messages are trimmed. Set to 0 for unlimited. */ + maxTotalChars: number; +} + +/** + * Default streaming speech configuration + */ +export const DEFAULT_STREAMING_SPEECH_CONFIG: StreamingSpeechConfig = { + minChunkSize: 50, + maxChunkSize: 200, + parallelGeneration: true, + maxParallelRequests: 3, +}; + +/** + * Default history configuration + */ +export const DEFAULT_HISTORY_CONFIG: HistoryConfig = { + maxMessages: 100, + maxTotalChars: 0, // unlimited by default +}; + +/** Default maximum audio input size (10 MB) */ +export const DEFAULT_MAX_AUDIO_SIZE = 10 * 1024 * 1024; + +/** + * Default stop condition type from streamText + */ +export type StopWhenCondition = NonNullable[0]["stopWhen"]>; diff --git a/src/utils/StreamBuffer.ts b/src/utils/StreamBuffer.ts deleted file mode 100644 index e69de29..0000000