@serenity-star/sdk 2.2.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +124 -9
- package/dist/index.d.ts +124 -9
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/readme.md +384 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/polyfill.ts","../src/EventEmitter.ts","../src/scopes/conversational/RealtimeSession/index.ts","../src/scopes/conversational/Conversation/SseConnection.ts","../src/utils/AgentMapper.ts","../src/utils/ErrorHelper.ts","../src/scopes/conversational/Conversation/index.ts","../src/scopes/conversational/ConversationalAgent.ts","../src/scopes/conversational/Assistant.ts","../src/scopes/conversational/Copilot.ts","../src/scopes/system/SystemAgent.ts","../src/scopes/system/Activity.ts","../src/scopes/system/ChatCompletion.ts","../src/scopes/system/Proxy.ts","../src/factories/AgentFactory.ts","../src/SerenityClient.ts"],"sourcesContent":["let undiciFetch, UndiciHeaders, UndiciRequest, UndiciResponse;\n\nif (typeof process !== 'undefined' && process.versions?.node) {\n // Only import undici in Node.js environment\n const undici = require('undici');\n undiciFetch = undici.fetch;\n UndiciHeaders = undici.Headers;\n UndiciRequest = undici.Request;\n UndiciResponse = undici.Response;\n\n if (!globalThis.fetch) {\n globalThis.fetch = undiciFetch as unknown as typeof globalThis.fetch;\n globalThis.Headers = UndiciHeaders as unknown as typeof globalThis.Headers;\n globalThis.Request = UndiciRequest as unknown as typeof globalThis.Request;\n globalThis.Response = UndiciResponse as unknown as typeof globalThis.Response;\n }\n}\n\nexport {\n undiciFetch as fetch,\n UndiciHeaders as Headers,\n UndiciRequest as Request,\n UndiciResponse as Response\n};\n","export class EventEmitter<T extends Record<string, (...args: any[]) => void>> {\n private listeners: { [K in keyof T]?: Array<T[K]> } = {};\n\n on<K extends keyof T>(eventName: K, listener: T[K]): this {\n if (!this.listeners[eventName]) {\n this.listeners[eventName] = [];\n }\n this.listeners[eventName]!.push(listener);\n return this;\n }\n\n emit<K extends keyof T>(eventName: K, ...args: Parameters<T[K]>): void {\n this.listeners[eventName]?.forEach((listener) => listener(...args));\n }\n}","import { EventEmitter } from \"../../../EventEmitter\";\nimport { AgentSetupOptions } from \"../../../types\";\nimport {\n RealtimeSessionEvents,\n SerenitySessionCreateEvent,\n SerenityEvent,\n SerenitySessionCreatedEvent,\n SerenitySessionCloseEvent,\n SerenitySessionErrorEvent,\n SDPConfiguration,\n SerenityResponseProcessedEvent,\n} from \"./types\";\n\nexport class RealtimeSession extends EventEmitter<RealtimeSessionEvents> {\n private agentCode: string;\n private apiKey: string;\n private baseUrl: string;\n\n // Optional parameters.\n private inputParameters?: { [key: string]: any };\n private userIdentifier?: string;\n private agentVersion?: number;\n private channel?: string;\n\n private inactivityTimeout?: NodeJS.Timeout;\n private timeout = 120000; // 2 minutes\n\n // WebRTC configuration.\n private sessionConfiguration?: SDPConfiguration;\n private peerConnection?: RTCPeerConnection;\n private localStream?: MediaStream;\n private dataChannel?: RTCDataChannel;\n\n // WebSockets configuration.\n private socket?: WebSocket;\n\n constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentSetupOptions\n ) {\n super();\n this.apiKey = apiKey;\n this.agentCode = agentCode;\n this.baseUrl = baseUrl;\n\n this.agentVersion = options?.agentVersion;\n this.inputParameters = options?.inputParameters;\n this.userIdentifier = options?.userIdentifier;\n this.channel = options?.channel;\n }\n\n // #region Public methods\n\n /**\n * Starts the real-time session.\n */\n async start(): Promise<void> {\n try {\n this.#setupWebSocketConnection();\n } catch (error) {\n throw new Error(`Error starting the session`);\n }\n }\n\n /**\n * Stops the real-time session.\n */\n stop(): void {\n this.#stop();\n }\n\n /**\n * Allows the user to mute the microphone during a real-time voice session.\n */\n muteMicrophone(): void {\n if (this.localStream) {\n const audioTrack = this.localStream.getAudioTracks()[0];\n if (audioTrack) {\n audioTrack.enabled = false;\n }\n }\n }\n\n /**\n * Allows the user to unmute the microphone during a real-time voice session.\n */\n unmuteMicrophone(): void {\n if (this.localStream) {\n const audioTrack = this.localStream.getAudioTracks()[0];\n if (audioTrack) {\n audioTrack.enabled = true;\n }\n }\n }\n // #endregion\n\n // #region Private methods\n\n /**\n * Internal method to stop the session. Allows for a reason and details to be provided.\n * @param reason The reason for stopping the session.\n * @param details Additional details about the stop event.\n */\n #stop(reason?: string, details?: any): void {\n // Send a closure message to the server if socket is connected\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n try {\n // Close the WebSocket connection properly\n this.socket.close(1000, \"Client closed the session\");\n } catch (error) {\n console.error(\"Error closing WebSocket connection:\", error);\n }\n }\n \n // Stop the local audio tracks.\n if (this.localStream) {\n this.localStream.getTracks().forEach((track) => track.stop());\n this.localStream = undefined;\n }\n \n // Close the WebRTC connection if it is open.\n this.peerConnection && this.peerConnection.close();\n \n // Reset variables\n this.socket = undefined;\n this.dataChannel = undefined;\n this.peerConnection = undefined;\n\n this.emit(\"session.stopped\", reason, details);\n clearTimeout(this.inactivityTimeout);\n }\n\n #setupWebSocketConnection() {\n let url = `${this.baseUrl}/v2/agent/${this.agentCode}/realtime`;\n\n if (this.agentVersion) {\n url += `/${this.agentVersion}`;\n }\n\n this.socket = new WebSocket(url, [\"X-API-KEY\", this.apiKey]);\n\n this.socket.onopen = () => {\n const sessionCreateEvent: SerenitySessionCreateEvent = {\n type: \"serenity.session.create\",\n input_parameters: this.inputParameters,\n user_identifier: this.userIdentifier,\n channel: this.channel,\n };\n\n this.socket!.send(JSON.stringify(sessionCreateEvent));\n };\n\n this.socket.onclose = () => {\n this.#stop();\n };\n\n this.socket.onerror = (event) => {\n this.emit(\"error\", \"Error connecting to the server\");\n this.#stop();\n };\n\n this.socket.onmessage = (event) => {\n this.#handleIncomingMessagesFromSerenity(event.data);\n };\n }\n\n async #handleIncomingMessagesFromSerenity(data: string) {\n const obj = JSON.parse(data) as SerenityEvent;\n switch (obj.type) {\n case \"serenity.session.created\": {\n const eventData = obj as SerenitySessionCreatedEvent;\n this.sessionConfiguration = {\n url: eventData.url,\n headers: eventData.headers,\n };\n\n // Setup the WebRTC connection.\n this.#setupWebRTCConnection();\n\n // Add listeners for the WebRTC connection.\n this.#handleIncomingMessagesFromVendor();\n\n // Start the session.\n await this.#startSession();\n\n break;\n }\n case \"serenity.session.close\": {\n const eventData = obj as SerenitySessionCloseEvent;\n const errorDetails = this.#extractErrorMessageFromEvent(eventData);\n this.emit(\"error\", errorDetails);\n this.#stop(eventData.reason, errorDetails);\n break;\n }\n case \"serenity.response.processed\": {\n const eventData = obj as SerenityResponseProcessedEvent;\n this.emit(\"response.processed\", eventData.result);\n break;\n }\n default: {\n const isSerenityEvent = obj.type.startsWith(\"serenity\");\n if (this.dataChannel && !isSerenityEvent) {\n this.dataChannel.send(JSON.stringify(obj));\n }\n }\n }\n }\n\n #handleIncomingMessagesFromVendor() {\n if (!this.peerConnection) {\n throw new Error(\n `Could not add listeners: WebRTC connection not initialized`\n );\n }\n // Set up data channel for sending and receiving events\n const currentDate = new Date()\n .toISOString()\n .replace(/T/, \"-\")\n .replace(/:/g, \"-\")\n .replace(/\\..+/, \"\");\n const channelName = `data-channel-${this.agentCode}-${currentDate}`;\n this.dataChannel = this.peerConnection.createDataChannel(channelName);\n\n this.dataChannel.addEventListener(\"message\", (e: MessageEvent) => {\n this.#resetInactivityTimeout();\n const data = JSON.parse(e.data);\n\n try {\n switch (data.type) {\n case \"input_audio_buffer.speech_started\": {\n this.emit(\"speech.started\");\n break;\n }\n case \"input_audio_buffer.speech_stopped\": {\n this.emit(\"speech.stopped\");\n break;\n }\n\n case \"response.done\": {\n this.emit(\"response.done\");\n break;\n }\n case \"error\": {\n this.emit(\"error\", \"There was an error processing your request\");\n break;\n }\n }\n } catch (error) {\n this.emit(\"error\", \"Error processing incoming messages from vendor\");\n } finally {\n // Forward the message to the server\n if (this.socket) {\n this.socket.send(JSON.stringify(data));\n }\n }\n });\n }\n\n #setupWebRTCConnection() {\n // Create the peer connection.\n this.peerConnection = new RTCPeerConnection();\n\n // Configure remote audio playback.\n const audioElement = document.createElement(\"audio\");\n audioElement.autoplay = true;\n\n this.peerConnection.ontrack = (event) => {\n if (event.streams && event.streams[0]) {\n audioElement.srcObject = event.streams[0];\n }\n };\n }\n\n async #getAudioFromMicrophone(): Promise<void> {\n if (!this.peerConnection) {\n throw new Error(\n `Could not start the session: WebRTC connection not initialized`\n );\n }\n\n this.localStream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n\n const audioTrack = this.localStream.getTracks()[0];\n this.peerConnection.addTrack(audioTrack, this.localStream);\n }\n\n async #startSession() {\n if (!this.peerConnection) {\n throw new Error(\n `Could not start the session: WebRTC connection not initialized`\n );\n }\n\n if (!this.sessionConfiguration) {\n throw new Error(\n `Could not start the session: Session configuration not available`\n );\n }\n\n try {\n // Get the audio from the microphone.\n await this.#getAudioFromMicrophone();\n\n // Start the session using the Session Description Protocol (SDP)\n const offer = await this.peerConnection.createOffer();\n await this.peerConnection.setLocalDescription(offer);\n\n const sdpResponse = await fetch(`${this.sessionConfiguration.url}`, {\n method: \"POST\",\n body: offer.sdp,\n headers: this.sessionConfiguration.headers,\n });\n\n if (!sdpResponse.ok) {\n throw new Error(\"Error starting the session\");\n }\n\n const answer: RTCSessionDescriptionInit = {\n type: \"answer\",\n sdp: await sdpResponse.text(),\n };\n\n await this.peerConnection.setRemoteDescription(answer);\n\n this.emit(\"session.created\");\n this.#resetInactivityTimeout();\n } catch (error) {\n this.emit(\"error\", \"Error starting the session\");\n this.#stop();\n }\n }\n\n #resetInactivityTimeout() {\n clearTimeout(this.inactivityTimeout);\n this.inactivityTimeout = setTimeout(() => {\n this.#stop();\n }, this.timeout);\n }\n\n #extractErrorMessageFromEvent(eventData: SerenitySessionErrorEvent) {\n switch (eventData.reason) {\n case \"Exception\":\n return eventData.message;\n case \"ValidationException\": {\n if (!eventData.errors) return eventData.message;\n\n return Object.values(eventData.errors).join(\". \");\n }\n default:\n return eventData.message;\n }\n }\n // #endregion\n}\n","/**\n * Interface representing the structure of event data.\n */\ninterface SseEventData {\n start_time_utc?: string;\n stop_time_utc?: string;\n message?: string;\n}\n\n/**\n * Interface representing the event object with optional event and data properties.\n */\ninterface Event {\n event?: string;\n data?: string;\n}\n\n/**\n * Type for the event listeners.\n */\ntype ConnectionEventListener = (data: string) => void;\n\n/**\n * Class representing a server-sent events (SSE) connection.\n */\nexport class SseConnection {\n private eventListeners: Record<string, ConnectionEventListener[]>;\n private active: boolean;\n private buffer: string = \"\";\n\n /**\n * Creates an instance of SseConnection.\n * @param options - Options for the SSE connection.\n */\n constructor() {\n this.eventListeners = {\n start: [\n (_: string) => {\n },\n ],\n stop: [\n (_: string) => {\n this.stop();\n },\n ],\n error: [\n (_: string) => {\n this.stop();\n },\n ],\n };\n this.active = false;\n }\n\n /**\n * Connects to the SSE server and listens for events.\n * @param url - The URL to connect to for SSE.\n * @param fetchOptions - Additional fetch options.\n * @returns A promise that resolves with the response when the connection is active.\n * @throws Will throw an error if the response is not an event stream.\n */\n async start(\n url: string,\n fetchOptions: RequestInit\n ): Promise<Response> {\n this.active = true;\n try {\n const response = await fetch(url, fetchOptions);\n\n if(!response.ok) {\n throw response;\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n\n if (contentType !== \"text/event-stream\") {\n return response;\n }\n\n const reader = response.body!.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n this.buffer = \"\";\n\n while (this.active) {\n const { done, value } = await reader.read();\n if (done) break;\n\n this.buffer += decoder.decode(value, { stream: true });\n this.processEvents();\n }\n\n return response;\n } catch (error) {\n this.active = false;\n throw error;\n }\n }\n\n /**\n * Processes the event data from the buffer.\n */\n private processEvents(): void {\n let eventEnd: number;\n const lineEnding = this.buffer.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const eventDelimiter = lineEnding + lineEnding;\n while ((eventEnd = this.buffer.indexOf(eventDelimiter)) !== -1) {\n const eventText = this.buffer.slice(0, eventEnd).trim();\n this.buffer = this.buffer.slice(eventEnd + eventDelimiter.length);\n\n const lines = eventText.split(lineEnding);\n const event: Event = {};\n for (let line of lines) {\n if (line.startsWith(\"data:\")) {\n event.data = line.slice(\"data:\".length).trim();\n } else if (line.startsWith(\"event:\")) {\n event.event = line.slice(\"event:\".length).trim();\n }\n }\n\n this.trigger(event.event || \"message\", event.data!);\n }\n }\n\n /**\n * Registers an event listener for a specific event type.\n * @param eventType - The type of event to listen for.\n * @param callback - The callback function to execute when the event occurs.\n */\n on(eventType: string, callback: ConnectionEventListener): void {\n if (!this.eventListeners[eventType]) {\n this.eventListeners[eventType] = [];\n }\n this.eventListeners[eventType].push(callback);\n }\n\n /**\n * Unregisters an event listener for a specific event type.\n * @param eventType - The type of event to stop listening for.\n * @param callback - The callback function to remove.\n */\n off(eventType: string, callback: ConnectionEventListener): void {\n const listeners = this.eventListeners[eventType];\n if (listeners) {\n this.eventListeners[eventType] = listeners.filter(\n (cb) => cb !== callback\n );\n }\n }\n\n /**\n * Triggers an event and calls all registered listeners for that event type.\n * @param eventType - The type of event to trigger.\n * @param data - The data to pass to the event listeners.\n */\n private trigger(eventType: string, data: string): void {\n const listeners = this.eventListeners[eventType];\n if (listeners) {\n listeners.forEach((callback) => callback(data));\n }\n }\n\n /**\n * Stops the SSE connection.\n */\n stop(): void {\n this.active = false;\n }\n}\n","import { AgentResult } from \"../types\";\n\nexport class AgentMapper {\n public static mapAgentResultToSnakeCase = (data: {\n [key: string]: any;\n }): AgentResult => {\n const result: AgentResult = {\n content: data.content,\n instance_id: data.instanceId,\n action_results: data.actionResults,\n completion_usage: data.completionUsage,\n executor_task_logs: data.executorTaskLogs,\n json_content: data.jsonContent,\n meta_analysis: data.metaAnalysis,\n time_to_first_token: data.timeToFirstToken,\n };\n\n return result;\n };\n}\n","import {\n BaseErrorBody,\n RateLimitErrorBody,\n ValidationErrorBody,\n} from \"../types\";\n\nexport class InternalErrorHelper {\n static async process(\n error: unknown,\n fallbackErrorMessage?: string\n ): Promise<BaseErrorBody | ValidationErrorBody | RateLimitErrorBody> {\n try {\n if (error instanceof Response) {\n switch (error.status) {\n case 400: {\n const errorBody = await error.json();\n return {\n message: errorBody.message || \"Validation error\",\n statusCode: 400,\n errors: errorBody.errors || {},\n } as ValidationErrorBody;\n }\n case 429: {\n const retryAfter = parseInt(\n error.headers.get(\"Retry-After\") || \"60\"\n );\n return {\n message: \"Rate limit exceeded\",\n statusCode: 429,\n retryAfter,\n } as RateLimitErrorBody;\n }\n default: {\n const errorBody = await error.json();\n return {\n message:\n errorBody.message ||\n fallbackErrorMessage ||\n \"An error occurred while processing your request.\",\n statusCode: error.status,\n } as BaseErrorBody;\n }\n }\n }\n\n if (error instanceof Error) {\n return {\n message:\n error.message ||\n fallbackErrorMessage ||\n \"An error occurred while processing your request.\",\n statusCode: 500,\n } as BaseErrorBody;\n }\n\n return {\n message: fallbackErrorMessage || \"An unknown error occurred.\",\n statusCode: 500,\n } as BaseErrorBody;\n } catch (error) {\n return {\n message:\n fallbackErrorMessage ||\n \"An error occurred while processing your request.\",\n statusCode: 500,\n } as BaseErrorBody;\n }\n }\n}\n\nexport class ExternalErrorHelper {\n static determineErrorType(error: unknown): {\n type: \"RateLimitError\" | \"ValidationError\" | \"BaseError\" | \"UnknownError\";\n error: RateLimitErrorBody | ValidationErrorBody | BaseErrorBody | unknown;\n } {\n if (this.isRateLimitErrorBody(error)) {\n return { type: \"RateLimitError\", error };\n }\n\n if (this.isValidationErrorBody(error)) {\n return { type: \"ValidationError\", error };\n }\n\n if (this.isBaseErrorBody(error)) {\n return { type: \"BaseError\", error };\n }\n\n return { type: \"UnknownError\", error };\n }\n\n private static isRateLimitErrorBody(\n error: unknown\n ): error is RateLimitErrorBody {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n \"statusCode\" in error &&\n \"retryAfter\" in error &&\n typeof (error as any).retryAfter === \"number\"\n );\n }\n\n private static isValidationErrorBody(\n error: unknown\n ): error is ValidationErrorBody {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n \"statusCode\" in error &&\n \"errors\" in error &&\n typeof (error as any).errors === \"object\" &&\n (error as any).errors !== null\n );\n }\n\n private static isBaseErrorBody(error: unknown): error is BaseErrorBody {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n \"statusCode\" in error &&\n typeof (error as any).message === \"string\" &&\n typeof (error as any).statusCode === \"number\"\n );\n }\n}\n// dividir helper en dos. internal y external.\n// exportar el external para que pueda ser usado en el chat widget\n","import { EventEmitter } from \"../../../EventEmitter\";\nimport {\n AgentExecutionOptions,\n AgentResult,\n ExecuteBodyParams,\n SSEStreamEvents,\n} from \"../../../types\";\nimport {\n ConversationInfoResult,\n ConversationRes,\n CreateExecuteBodyOptions,\n MessageAdditionalInfo,\n SubmitFeedbackOptions,\n SubmitFeedbackResult,\n RemoveFeedbackOptions,\n RemoveFeedbackResult,\n GetConnectorStatusOptions,\n ConnectorStatusResult,\n} from \"./types\";\nimport { SseConnection } from \"./SseConnection\";\nimport { AgentMapper } from \"../../../utils/AgentMapper\";\nimport { InternalErrorHelper } from \"../../../utils/ErrorHelper\";\n\nexport class Conversation extends EventEmitter<SSEStreamEvents> {\n private agentCode: string;\n private apiKey: string;\n private baseUrl: string;\n\n // Optional parameters.\n private userIdentifier?: string;\n private agentVersion?: number;\n private channel?: string;\n private inputParameters?: { [key: string]: any };\n public conversationId?: string;\n public info: ConversationInfoResult | null = null;\n\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ) {\n super();\n this.apiKey = apiKey;\n this.agentCode = agentCode;\n this.baseUrl = baseUrl;\n\n this.agentVersion = options?.agentVersion;\n this.userIdentifier = options?.userIdentifier;\n this.channel = options?.channel;\n this.inputParameters = options?.inputParameters;\n }\n\n private static async create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ): Promise<Conversation> {\n const instance = new Conversation(agentCode, apiKey, baseUrl, options);\n await instance.getInfo();\n return instance;\n }\n\n private static createWithoutInfo(\n agentCode: string,\n apiKey: string,\n baseUrl: string\n ): Conversation {\n return new Conversation(agentCode, apiKey, baseUrl);\n }\n\n async streamMessage(\n message: string,\n options?: MessageAdditionalInfo\n ): Promise<AgentResult> {\n const version = this.agentVersion ? `/${this.agentVersion}` : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.#createExecuteBody({\n message,\n stream: true,\n additionalInfo: options,\n isNewConversation: !this.conversationId,\n });\n\n const connection = new SseConnection();\n let responsePromise: Promise<AgentResult>;\n\n responsePromise = new Promise(async (resolve, reject) => {\n connection.on(\"start\", () => {\n this.emit(\"start\");\n });\n\n connection.on(\"error\", (data) => {\n const error = JSON.parse(data);\n this.emit(\"error\", error);\n reject(error);\n });\n\n connection.on(\"content\", (data) => {\n const chunk = JSON.parse(data);\n this.emit(\"content\", chunk.text);\n });\n\n connection.on(\"stop\", (data) => {\n const finalMessage = JSON.parse(data) as { result: AgentResult };\n if (!this.conversationId) {\n this.conversationId = finalMessage.result.instance_id;\n }\n this.emit(\"stop\", finalMessage.result);\n resolve(finalMessage.result);\n });\n\n const fetchOptions: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n };\n\n try {\n await connection.start(url, fetchOptions);\n } catch (error) {\n const response = await InternalErrorHelper.process(error, \"Failed to send message\");\n reject(response);\n }\n });\n\n return responsePromise;\n }\n\n async sendMessage(\n message: string,\n options?: MessageAdditionalInfo\n ): Promise<AgentResult> {\n const version = this.agentVersion ? `/${this.agentVersion}` : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.#createExecuteBody({\n message,\n stream: false,\n additionalInfo: options,\n isNewConversation: !this.conversationId,\n });\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (response.status !== 200) {\n throw await InternalErrorHelper.process(response, \"Failed to send message\");\n }\n\n const data = await response.json();\n\n const mappedData = AgentMapper.mapAgentResultToSnakeCase(data);\n if (!this.conversationId) {\n this.conversationId = mappedData.instance_id;\n }\n\n return mappedData;\n }\n\n async getConversationById(\n id: string,\n options: {\n showExecutorTaskLogs: boolean;\n } = {\n showExecutorTaskLogs: false,\n }\n ): Promise<ConversationRes> {\n let url = `${this.baseUrl}/v2/agent/${this.agentCode}/conversation/${id}`;\n\n const queryParams = new URLSearchParams();\n if (options.showExecutorTaskLogs) {\n queryParams.append(\"showExecutorTaskLogs\", \"true\");\n }\n\n if (queryParams.toString()) {\n url += `?${queryParams.toString()}`;\n }\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"X-API-KEY\": this.apiKey,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (response.status !== 200) {\n const error = await InternalErrorHelper.process(response, \"Failed to get conversation by id\");\n throw error;\n }\n\n const data = await response.json();\n\n // Map messagesJson string to messages array\n if (data.messagesJson && typeof data.messagesJson === 'string') {\n try {\n data.messages = JSON.parse(data.messagesJson);\n delete data.messagesJson; // Remove the original string property\n } catch (error) {\n throw new Error(\"Failed to parse messagesJson: \" + error);\n }\n }\n\n return data as ConversationRes;\n }\n\n async getInfo(): Promise<ConversationInfoResult> {\n let url = `${this.baseUrl}/v2/agent/${this.agentCode}`;\n if (this.agentVersion) {\n url += `/${this.agentVersion}`;\n }\n url += \"/conversation/info\";\n\n let body: {\n channel?: string;\n inputParameters?: ExecuteBodyParams;\n userIdentifier?: string;\n } = {};\n\n if (this.channel) {\n body.channel = this.channel;\n }\n if (this.inputParameters) {\n body.inputParameters = [];\n this.#appendInputParametersIfNeeded(\n body.inputParameters,\n this.inputParameters\n );\n }\n if (this.userIdentifier) {\n body.userIdentifier = this.userIdentifier;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-API-KEY\": this.apiKey,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (response.status !== 200) {\n const error = await InternalErrorHelper.process(response, \"Failed to get conversation initial info\");\n throw error;\n }\n \n const data = await response.json();\n \n this.info = data as ConversationInfoResult;\n return this.info;\n }\n\n /**\n * Submit feedback for an agent message in the conversation.\n * \n * @param options - The feedback options including the agent message ID and feedback value\n * @returns A promise that resolves to the feedback submission result\n * @throws Error if the conversation ID is not set or if the request fails\n * \n * @example\n * ```typescript\n * const conversation = await client.agents.assistants.createConversation(\"agent-code\");\n * const response = await conversation.sendMessage(\"Hello!\");\n * \n * // Submit positive feedback\n * await conversation.submitFeedback({\n * agentMessageId: response.agent_message_id!,\n * feedback: true\n * });\n * ```\n */\n async submitFeedback(options: SubmitFeedbackOptions): Promise<SubmitFeedbackResult> {\n if (!this.conversationId) {\n throw new Error(\"Conversation ID is not set. Please send a message first to initialize the conversation.\");\n }\n\n const url = `${this.baseUrl}/agent/${this.agentCode}/conversation/${this.conversationId}/message/${options.agentMessageId}/feedback`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-API-KEY\": this.apiKey,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n feedback: options.feedback\n }),\n });\n\n if (response.status !== 200) {\n return {\n success: false,\n }\n }\n\n return {\n success: true\n }\n }\n\n /**\n * Remove feedback for an agent message in the conversation.\n * \n * @param options - The feedback options including the agent message ID\n * @returns A promise that resolves to the feedback removal result\n * @throws Error if the conversation ID is not set or if the request fails\n * \n * @example\n * ```typescript\n * const conversation = await client.agents.assistants.createConversation(\"agent-code\");\n * const response = await conversation.sendMessage(\"Hello!\");\n * \n * // Submit feedback first\n * await conversation.submitFeedback({\n * agentMessageId: response.agent_message_id!,\n * feedback: true\n * });\n * \n * // Remove feedback\n * await conversation.removeFeedback({\n * agentMessageId: response.agent_message_id!\n * });\n * ```\n */\n async removeFeedback(options: RemoveFeedbackOptions): Promise<RemoveFeedbackResult> {\n if (!this.conversationId) {\n throw new Error(\"Conversation ID is not set. Please send a message first to initialize the conversation.\");\n }\n\n const url = `${this.baseUrl}/agent/${this.agentCode}/conversation/${this.conversationId}/message/${options.agentMessageId}/feedback`;\n\n const response = await fetch(url, {\n method: \"DELETE\",\n headers: {\n \"X-API-KEY\": this.apiKey,\n },\n });\n\n if (response.status !== 200) {\n return {\n success: false,\n }\n }\n\n return {\n success: true\n }\n }\n\n /**\n * Get the connector status for a specific agent instance and connector.\n * \n * @param options - The connector status options including agent instance ID and connector ID\n * @returns A promise that resolves to the connector status result\n * @throws Error if the request fails\n * \n * @example\n * ```typescript\n * const conversation = await client.agents.assistants.createConversation(\"agent-code\");\n * \n * // Check connector status\n * const status = await conversation.getConnectorStatus({\n * agentInstanceId: conversation.conversationId!,\n * connectorId: \"connector-uuid\"\n * });\n * \n * console.log(status.isConnected); // true or false\n * ```\n */\n async getConnectorStatus(options: GetConnectorStatusOptions): Promise<ConnectorStatusResult> {\n const url = `${this.baseUrl}/connection/agentInstance/${options.agentInstanceId}/connector/${options.connectorId}/status`;\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"X-API-KEY\": this.apiKey,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (response.status !== 200) {\n const error = await InternalErrorHelper.process(response, \"Failed to get connector status\");\n throw error;\n }\n\n const data = await response.json();\n return data as ConnectorStatusResult;\n }\n\n #createExecuteBody(options: CreateExecuteBodyOptions): ExecuteBodyParams {\n let body: ExecuteBodyParams = [\n {\n Key: \"message\",\n Value: options.message,\n },\n {\n Key: \"stream\",\n Value: options.stream.toString(),\n },\n ];\n\n if (options.isNewConversation) {\n this.#appendUserIdentifierIfNeeded(body);\n } else {\n body.push({\n Key: \"chatId\",\n Value: this.conversationId,\n });\n }\n\n this.#appendInputParametersIfNeeded(\n body,\n {\n ...(options.additionalInfo?.inputParameters ?? {}),\n ...(this.inputParameters ?? {})\n }\n );\n this.#appendVolatileKnowledgeIdsIfNeeded(\n body,\n options.additionalInfo?.volatileKnowledgeIds\n );\n this.#appendChannelIfNeeded(body);\n\n return body;\n }\n\n #appendUserIdentifierIfNeeded(body: ExecuteBodyParams) {\n if (this.userIdentifier) {\n body.push({\n Key: \"userIdentifier\",\n Value: this.userIdentifier,\n });\n }\n }\n\n #appendChannelIfNeeded(body: ExecuteBodyParams) {\n if (this.channel) {\n body.push({\n Key: \"channel\",\n Value: this.channel,\n });\n }\n }\n\n #appendInputParametersIfNeeded(\n body: ExecuteBodyParams,\n parameters: { [key: string]: any } = {}\n ) {\n if (!parameters || Object.keys(parameters).length === 0) return;\n\n for (const [key, value] of Object.entries(parameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n\n #appendVolatileKnowledgeIdsIfNeeded(\n body: ExecuteBodyParams,\n volatileKnowledgeIds?: string[]\n ) {\n if (!volatileKnowledgeIds || volatileKnowledgeIds.length === 0) return;\n\n body.push({\n Key: \"volatileKnowledgeIds\",\n Value: volatileKnowledgeIds,\n });\n }\n}\n","import { AgentSetupOptions } from \"../../types\";\nimport { Conversation } from \"./Conversation\";\nimport { RealtimeSession } from \"./RealtimeSession\";\n\nexport abstract class ConversationalAgent {\n protected constructor(\n protected readonly agentCode: string,\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n protected readonly options?: AgentSetupOptions\n ) {}\n\n createRealtimeSession(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentSetupOptions\n ): RealtimeSession {\n return new RealtimeSession(agentCode, apiKey, baseUrl, options);\n }\n\n async createConversation(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentSetupOptions\n ): Promise<Conversation> {\n return Conversation[\"create\"](agentCode, apiKey, baseUrl, options);\n }\n\n createConversationWithoutInfo(\n agentCode: string,\n apiKey: string,\n baseUrl: string\n ): Conversation {\n return Conversation[\"createWithoutInfo\"](agentCode, apiKey, baseUrl);\n }\n}\n","import { AgentSetupOptions } from \"../../types\";\nimport { ConversationalAgent } from \"./ConversationalAgent\";\n\nexport class Assistant extends ConversationalAgent {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentSetupOptions\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n \n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentSetupOptions\n ): Assistant {\n return new Assistant(agentCode, apiKey, baseUrl, options);\n }\n}\n","import { AgentSetupOptions } from \"../../types\";\nimport { ConversationalAgent } from \"./ConversationalAgent\";\n\nexport class Copilot extends ConversationalAgent {\n constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentSetupOptions\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentSetupOptions\n ): Copilot {\n return new Copilot(agentCode, apiKey, baseUrl, options);\n }\n}\n","import { EventEmitter } from \"../../EventEmitter\";\nimport { AgentResult, ExecuteBodyParams, SSEStreamEvents } from \"../../types\";\nimport { AgentMapper } from \"../../utils/AgentMapper\";\nimport { InternalErrorHelper } from \"../../utils/ErrorHelper\";\nimport { SseConnection } from \"../conversational/Conversation/SseConnection\";\nimport { SystemAgentExecutionOptionsMap } from \"./../../types\";\n\nexport abstract class SystemAgent<\n T extends keyof SystemAgentExecutionOptionsMap,\n> extends EventEmitter<SSEStreamEvents> {\n protected constructor(\n protected readonly agentCode: string,\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n protected readonly options?: SystemAgentExecutionOptionsMap[T]\n ) {\n super();\n }\n\n async stream(): Promise<AgentResult> {\n const version = this.options?.agentVersion\n ? `/${this.options.agentVersion}`\n : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.createExecuteBody(true);\n\n const connection = new SseConnection();\n let responsePromise: Promise<AgentResult>;\n\n responsePromise = new Promise(async (resolve, reject) => {\n connection.on(\"start\", () => {\n this.emit(\"start\");\n });\n\n connection.on(\"error\", (data) => {\n const error = JSON.parse(data);\n this.emit(\"error\", error);\n reject(error);\n });\n\n connection.on(\"content\", (data) => {\n const chunk = JSON.parse(data);\n this.emit(\"content\", chunk.text);\n });\n\n connection.on(\"stop\", (data) => {\n const finalMessage = JSON.parse(data) as { result: AgentResult };\n this.emit(\"stop\", finalMessage.result);\n resolve(finalMessage.result);\n });\n\n const fetchOptions: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n };\n\n try {\n await connection.start(url, fetchOptions);\n } catch (error) {\n const response = await InternalErrorHelper.process(error, \"Failed to send message\");\n reject(response);\n }\n });\n\n return responsePromise;\n }\n\n protected async execute(): Promise<AgentResult> {\n const version = this.options?.agentVersion\n ? `/${this.options.agentVersion}`\n : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.createExecuteBody(false);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (response.status !== 200) {\n const error = await InternalErrorHelper.process(response, \"Failed to send message\");\n throw error;\n }\n \n const data = await response.json();\n return AgentMapper.mapAgentResultToSnakeCase(data);\n }\n\n protected createExecuteBody(\n stream: boolean\n ): ExecuteBodyParams | { [key: string]: any } {\n let body: ExecuteBodyParams = [\n {\n Key: \"stream\",\n Value: stream.toString(),\n },\n ];\n\n this.appendVolatileKnowledgeIdsIfNeeded(body);\n this.appendUserIdentifierIfNeeded(body);\n this.appendChannelIfNeeded(body);\n\n return body;\n }\n\n protected appendUserIdentifierIfNeeded(body: ExecuteBodyParams) {\n if (this.options?.userIdentifier) {\n body.push({\n Key: \"userIdentifier\",\n Value: this.options.userIdentifier,\n });\n }\n }\n\n protected appendVolatileKnowledgeIdsIfNeeded(body: ExecuteBodyParams) {\n if (\n !this.options?.volatileKnowledgeIds ||\n this.options.volatileKnowledgeIds.length === 0\n )\n return;\n\n body.push({\n Key: \"volatileKnowledgeIds\",\n Value: this.options.volatileKnowledgeIds,\n });\n }\n\n protected appendChannelIfNeeded(body: ExecuteBodyParams) {\n if (this.options?.channel) {\n body.push({\n Key: \"channel\",\n Value: this.options.channel,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport {\n ExecuteBodyParams,\n SystemAgentExecutionOptionsMap,\n} from \"./../../types\";\n\nexport class Activity extends SystemAgent<\"activity\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Activity {\n return new Activity(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ) {\n const instance = new Activity(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(\n stream: boolean\n ): ExecuteBodyParams | { [key: string]: any } {\n const baseOptions = super.createExecuteBody(stream);\n\n this.appendInputParametersIfNeeded(baseOptions);\n\n return baseOptions;\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { ExecuteBodyParams } from \"../../types\";\nimport { SystemAgentExecutionOptionsMap } from \"./../../types\";\nimport { SystemAgent } from \"./SystemAgent\";\n\nexport class ChatCompletion extends SystemAgent<\"chat-completion\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): ChatCompletion {\n return new ChatCompletion(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ) {\n const instance = new ChatCompletion(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(stream: boolean): ExecuteBodyParams | { [key: string]: any } {\n const body = super.createExecuteBody(stream);\n\n this.appendMessagesIfNeeded(body);\n this.appendMessageIfNeeded(body);\n this.appendInputParametersIfNeeded(body);\n\n return body;\n }\n\n private appendMessagesIfNeeded(body: ExecuteBodyParams | { [key: string]: any }) {\n if (!this.options?.messages || this.options.messages.length === 0) return;\n\n body.push({\n Key: \"messages\",\n Value: JSON.stringify(this.options.messages),\n });\n }\n\n private appendMessageIfNeeded(body: ExecuteBodyParams | { [key: string]: any }) {\n if (!this.options?.message) return;\n\n body.push({\n Key: \"message\",\n Value: this.options.message,\n });\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport { ExecuteBodyParams, SystemAgentExecutionOptionsMap } from \"../../types\";\nimport { ProxyExecutionOptions } from \"./types\";\n\nexport class Proxy extends SystemAgent<\"proxy\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Proxy {\n return new Proxy(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ) {\n const instance = new Proxy(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(stream: boolean): ExecuteBodyParams | { [key: string]: any } {\n const options = this.options as ProxyExecutionOptions;\n \n return {\n model: options.model,\n messages: options.messages,\n frequency_penalty: options.frequency_penalty,\n max_tokens: options.max_tokens,\n presence_penalty: options.presence_penalty,\n temperature: options.temperature,\n top_p: options.top_p,\n top_k: options.top_k,\n vendor: options.vendor,\n userIdentifier: options.userIdentifier,\n groupIdentifier: options.groupIdentifier,\n useVision: options.useVision,\n stream: stream,\n }\n }\n}\n","import { Assistant } from \"../scopes/conversational/Assistant\";\nimport { Conversation } from \"../scopes/conversational/Conversation\";\nimport { ConversationInfoResult, ConversationRes } from \"../scopes/conversational/Conversation/types\";\nimport { Copilot } from \"../scopes/conversational/Copilot\";\nimport { RealtimeSession } from \"../scopes/conversational/RealtimeSession\";\nimport { Activity } from \"../scopes/system/Activity\";\nimport { ChatCompletion } from \"../scopes/system/ChatCompletion\";\nimport { Proxy } from \"../scopes/system/Proxy\";\nimport {\n AgentSetupOptions,\n AgentResult,\n AgentType,\n ConversationalAgentExecutionOptionsMap,\n SystemAgentExecutionOptionsMap,\n} from \"../types\";\n\nexport class AgentFactory {\n static createAgent<T extends AgentType>(\n type: T,\n apiKey: string,\n baseUrl: string\n ): AgentTypeMap[T] {\n switch (type) {\n case \"assistant\": {\n return {\n createConversation: async (\n agentCode: string,\n options?: AgentSetupOptions\n ) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n const conversation = await assistant.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n\n return conversation;\n },\n getConversationById: async (agentCode: string, conversationId: string, options: {\n showExecutorTaskLogs: boolean;\n } = { showExecutorTaskLogs: false }): Promise<ConversationRes> => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl\n );\n const conversation = await assistant.createConversationWithoutInfo(agentCode, apiKey, baseUrl);\n return await conversation.getConversationById(conversationId, options);\n },\n getInfoByCode: async (agentCode: string, options?: AgentSetupOptions) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options);\n const conversation = await assistant.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return conversation.info;\n },\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return assistant.createRealtimeSession(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n }\n case \"copilot\":\n return {\n createConversation: async (\n agentCode: string,\n options?: AgentSetupOptions\n ): Promise<Conversation> => {\n const copilot = Copilot.create(agentCode, apiKey, baseUrl, options);\n const conversation = await copilot.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return conversation;\n },\n getConversationById: async (agentCode: string, conversationId: string, options: {\n showExecutorTaskLogs: boolean;\n } = { showExecutorTaskLogs: false }): Promise<ConversationRes> => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl\n );\n const conversation = await assistant.createConversationWithoutInfo(agentCode, apiKey, baseUrl);\n return await conversation.getConversationById(conversationId, options);\n },\n getInfoByCode: async (agentCode: string, options?: AgentSetupOptions) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options);\n const conversation = await assistant.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return conversation.info;\n },\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"copilot\"]\n ) => {\n const copilot = Copilot.create(agentCode, apiKey, baseUrl, options);\n return copilot.createRealtimeSession(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n\n case \"activity\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Promise<AgentResult> => {\n return Activity[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Activity => {\n return Activity[\"create\"](agentCode, apiKey, baseUrl, options);\n },\n } as AgentTypeMap[T];\n }\n case \"chat-completion\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): Promise<AgentResult> => {\n return ChatCompletion[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): ChatCompletion => {\n return ChatCompletion[\"create\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n }\n case \"proxy\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Promise<AgentResult> => {\n return Proxy[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Proxy => {\n return Proxy[\"create\"](agentCode, apiKey, baseUrl, options);\n },\n } as AgentTypeMap[T];\n }\n default:\n throw new Error(`Agent type ${type} not supported`);\n }\n }\n}\n\nexport type ConversationalAgentScope<\n T extends keyof ConversationalAgentExecutionOptionsMap,\n> = {\n /**\n * Create a new conversation with an agent.\n * This allows you to send messages and receive responses.\n * \n * ## Regular conversation example:\n * ```typescript\n * const conversation = await client.agents.assistants.createConversation(\"agent-code\");\n * const response = await conversation.sendMessage(\"Hello!\");\n * console.log(response.content);\n * ```\n * \n * ## Streaming conversation example:\n * ```typescript\n * const conversation = await client.agents.assistants\n * .createConversation(\"agent-code\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"Hello!\");\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the conversation\n * @returns A Promise that resolves to a Conversation instance\n */\n createConversation: (\n agentCode: string,\n options?: AgentSetupOptions\n ) => Promise<Conversation>;\n\n /**\n * Create a real-time session with an agent.\n * This allows for voice interactions and real-time responses.\n * \n * ## Real-time session example:\n * ```typescript\n * const session = client.agents.assistants\n * .createRealtimeSession(\"agent-code\")\n * .on(\"session.created\", () => console.log(\"Session started\"))\n * .on(\"speech.started\", () => console.log(\"User started talking\"))\n * .on(\"speech.stopped\", () => console.log(\"User stopped talking\"))\n * .on(\"response.done\", (response) => console.log(\"Response:\", response))\n * .on(\"session.stopped\", () => console.log(\"Session stopped\"));\n * \n * await session.start();\n * // Later: session.stop();\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the real-time session\n * @returns A RealtimeSession instance\n */\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[T]\n ) => RealtimeSession;\n\n getInfoByCode: (agentCode: string, options?: AgentSetupOptions) => Promise<ConversationInfoResult> | null;\n getConversationById: (agentCode: string, conversationId: string, options?: {\n showExecutorTaskLogs: boolean;\n }) => Promise<ConversationRes>;\n};\n\nexport type SystemAgentScope<\n T extends keyof SystemAgentExecutionOptionsMap,\n TCreateReturn,\n> = {\n /**\n * Execute an agent synchronously and get the result.\n * \n * ## Example:\n * ```typescript\n * const response = await client.agents.activities.execute(\"agent-code\", {\n * // Optional parameters specific to the agent type\n * inputParameters: {\n * param1: \"value1\",\n * param2: \"value2\"\n * }\n * });\n * console.log(response.content);\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the execution\n * @returns A Promise that resolves to an AgentResult\n */\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[T]\n ) => Promise<AgentResult>;\n\n /**\n * Create an agent instance for streaming execution.\n * \n * ## Streaming example:\n * ```typescript\n * const agent = client.agents.activities\n * .create(\"agent-code\", {\n * // Optional parameters specific to the agent\n * inputParameters: {\n * param1: \"value1\",\n * param2: \"value2\"\n * }\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await agent.stream();\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the agent creation\n * @returns An agent instance ready for streaming\n */\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[T]\n ) => TCreateReturn;\n};\n\ntype AgentTypeMap = {\n assistant: ConversationalAgentScope<\"assistant\">;\n copilot: ConversationalAgentScope<\"copilot\">;\n activity: SystemAgentScope<\"activity\", Activity>;\n \"chat-completion\": SystemAgentScope<\"chat-completion\", ChatCompletion>;\n proxy: SystemAgentScope<\"proxy\", Proxy>;\n};\n","import {\n AgentFactory,\n ConversationalAgentScope,\n SystemAgentScope,\n} from \"./factories/AgentFactory\";\nimport { Activity } from \"./scopes/system/Activity\";\nimport { ChatCompletion } from \"./scopes/system/ChatCompletion\";\nimport { Proxy } from \"./scopes/system/Proxy\";\nimport { SerenityClientOptions } from \"./types\";\n\nexport default class SerenityClient {\n private apiKey: string;\n private baseUrl = \"https://api.serenitystar.ai/api\";\n\n /**\n * Interact with the different agents available in Serenity Star.\n * You can choose between assistants, copilots, activities, chat completions and proxies.\n */\n public readonly agents: {\n /**\n * Interact with Assistant agents available in Serenity Star.\n * This allows you to create conversations and real-time sessions.\n * \n * ## Start a new conversation and send a message:\n * ```typescript\n * // Regular text conversation\n * const conversation = await client.agents.assistants.createConversation(\"translator-assistant\");\n * const response = await conversation.sendMessage(\"The sun was beginning to set...\");\n * console.log(response.content);\n * \n * ```\n * \n * ## Stream message with SSE\n * ```typescript\n * const conversation = await client.agents.assistants\n * .createConversation(\"translator-assistant\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"The sun was beginning to set...\");\n * \n * ```\n * \n * ## Real-time voice conversation example:\n * ```typescript\n * const session = client.agents.assistants.createRealtimeSession(\"marketing-assistant\")\n * .on(\"session.created\", () => console.log(\"Session started\"))\n * .on(\"speech.started\", () => console.log(\"User started talking\"))\n * .on(\"speech.stopped\", () => console.log(\"User stopped talking\"))\n * .on(\"response.done\", (response) => console.log(\"Response:\", response))\n * .on(\"session.stopped\", () => console.log(\"Session stopped\"));\n * \n * await session.start();\n * // Later: session.stop();\n * ```\n */\n assistants: ConversationalAgentScope<\"assistant\">;\n\n /**\n * Interact with Copilot agents available in Serenity Star.\n * Similar to assistants but allows you to interact with the UI through callbacks.\n * \n * Text conversation example:\n * ```typescript\n * // Regular conversation\n * const conversation = await client.agents.copilots.createConversation(\"app-copilot\");\n * const response = await conversation.sendMessage(\"How do I create a new support ticket?\");\n * console.log(response.content);\n * \n * // Streaming conversation\n * const conversation = await client.agents.copilots\n * .createConversation(\"app-copilot\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"How do I create a new support ticket?\");\n * ```\n */\n copilots: ConversationalAgentScope<\"copilot\">;\n\n /**\n * Interact with Activity agents available in Serenity Star.\n * This allows you to execute activities.\n * It supports streaming.\n * Execute simple tasks based on the user input.\n * \n * ## Regular activity execution:\n * ```typescript\n * const response = await client.agents.activities.execute(\"marketing-campaign\")\n * console.log(response.content);\n * \n * // With parameters\n * const response = await client.agents.activities.execute(\"cooking-activity\", {\n * inputParameters: {\n * ingredientOne: \"chicken\",\n * ingredientTwo: \"onion\",\n * ingredientThree: \"cream\",\n * }\n * });\n * ```\n * \n * ## Stream activity with SSE:\n * ```typescript\n * const activity = client.agents.activities\n * .create(\"marketing-campaign\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await activity.stream();\n * ```\n */\n activities: SystemAgentScope<\"activity\", Activity>;\n\n /**\n * Interact with Chat Completion agents available in Serenity Star.\n * This allows you to execute chat completions.\n * It supports streaming.\n * Chat completions allows you to fully control the conversation and generate completions.\n * \n * ## Regular chat completion:\n * ```typescript\n * const response = await client.agents.chatCompletions.execute(\"Health-Coach\", {\n * message: \"Hello!\"\n * });\n * console.log(response.content);\n * ```\n * \n * ## Stream chat completion with SSE:\n * ```typescript\n * const chatCompletion = client.agents.chatCompletions\n * .create(\"Health-Coach\", {\n * message: \"Hello!\"\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await chatCompletion.stream();\n * ```\n */\n chatCompletions: SystemAgentScope<\"chat-completion\", ChatCompletion>;\n\n /**\n * Interact with Proxy agents available in Serenity Star.\n * This allows you to execute proxies.\n * It supports streaming.\n * Proxy agents allows you to define a set of parameters dynamically for each request\n * \n * ## Regular proxy execution:\n * ```typescript\n * const response = await client.agents.proxies.execute(\"proxy-agent\", {\n * model: \"gpt-4o-mini-2024-07-18\",\n * messages: [\n * {\n * role: \"system\",\n * content: \"You are a helpful assistant. Always use short and concise responses\"\n * },\n * { role: \"user\", content: \"What is artificial intelligence?\" }\n * ],\n * temperature: 1,\n * max_tokens: 250\n * });\n * console.log(response.content);\n * ```\n * \n * ## Stream proxy with SSE:\n * ```typescript\n * const proxy = client.agents.proxies\n * .create(\"proxy-agent\", {\n * model: \"gpt-4o-mini-2024-07-18\",\n * messages: [\n * {\n * role: \"system\",\n * content: \"You are a helpful assistant. Always use short and concise responses\"\n * },\n * { role: \"user\", content: \"What is artificial intelligence?\" }\n * ],\n * temperature: 1,\n * max_tokens: 250\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await proxy.stream();\n * ```\n */\n proxies: SystemAgentScope<\"proxy\", Proxy>;\n };\n\n constructor(options: SerenityClientOptions) {\n if (!options.apiKey) {\n throw new Error(\"The API key is required\");\n }\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl || this.baseUrl;\n\n this.agents = {\n assistants: AgentFactory.createAgent(\n \"assistant\",\n this.apiKey,\n this.baseUrl\n ),\n copilots: AgentFactory.createAgent(\"copilot\", this.apiKey, this.baseUrl),\n activities: AgentFactory.createAgent(\n \"activity\",\n this.apiKey,\n this.baseUrl\n ),\n chatCompletions: AgentFactory.createAgent(\n \"chat-completion\",\n this.apiKey,\n this.baseUrl\n ),\n proxies: AgentFactory.createAgent(\"proxy\", this.apiKey, this.baseUrl),\n };\n }\n}\n"],"mappings":"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","names":["undiciFetch","UndiciHeaders","UndiciRequest","UndiciResponse","_a","undici","EventEmitter","eventName","listener","args","_a","_RealtimeSession_instances","stop_fn","setupWebSocketConnection_fn","handleIncomingMessagesFromSerenity_fn","handleIncomingMessagesFromVendor_fn","setupWebRTCConnection_fn","getAudioFromMicrophone_fn","startSession_fn","resetInactivityTimeout_fn","extractErrorMessageFromEvent_fn","RealtimeSession","EventEmitter","agentCode","apiKey","baseUrl","options","__privateAdd","__async","__privateMethod","error","audioTrack","reason","details","track","url","sessionCreateEvent","event","data","obj","eventData","errorDetails","isSerenityEvent","currentDate","channelName","e","audioElement","offer","sdpResponse","answer","SseConnection","_","url","fetchOptions","__async","response","reader","decoder","done","value","error","eventEnd","lineEnding","eventDelimiter","eventText","lines","event","line","eventType","callback","listeners","cb","data","AgentMapper","data","InternalErrorHelper","error","fallbackErrorMessage","__async","errorBody","ExternalErrorHelper","_Conversation_instances","createExecuteBody_fn","appendUserIdentifierIfNeeded_fn","appendChannelIfNeeded_fn","appendInputParametersIfNeeded_fn","appendVolatileKnowledgeIdsIfNeeded_fn","_Conversation","EventEmitter","agentCode","apiKey","baseUrl","options","__privateAdd","__async","instance","message","version","url","body","__privateMethod","connection","SseConnection","responsePromise","resolve","reject","data","error","chunk","finalMessage","fetchOptions","response","InternalErrorHelper","mappedData","AgentMapper","_0","id","queryParams","_a","_b","_c","_d","__spreadValues","parameters","key","value","volatileKnowledgeIds","Conversation","ConversationalAgent","agentCode","apiKey","baseUrl","options","RealtimeSession","__async","Conversation","Assistant","_Assistant","ConversationalAgent","agentCode","apiKey","baseUrl","options","Copilot","_Copilot","ConversationalAgent","agentCode","apiKey","baseUrl","options","SystemAgent","EventEmitter","agentCode","apiKey","baseUrl","options","__async","_a","version","url","body","connection","SseConnection","responsePromise","resolve","reject","data","error","chunk","finalMessage","fetchOptions","response","InternalErrorHelper","AgentMapper","stream","Activity","_Activity","SystemAgent","agentCode","apiKey","baseUrl","options","stream","baseOptions","body","_a","key","value","ChatCompletion","_ChatCompletion","SystemAgent","agentCode","apiKey","baseUrl","options","stream","body","_a","key","value","Proxy","_Proxy","SystemAgent","agentCode","apiKey","baseUrl","options","stream","AgentFactory","type","apiKey","baseUrl","agentCode","options","__async","Assistant","_0","_1","_2","conversationId","Copilot","Activity","ChatCompletion","Proxy","SerenityClient","options","AgentFactory"]}
|
|
1
|
+
{"version":3,"sources":["../src/polyfill.ts","../src/EventEmitter.ts","../src/scopes/conversational/RealtimeSession/index.ts","../src/scopes/conversational/Conversation/SseConnection.ts","../src/utils/AgentMapper.ts","../src/utils/ErrorHelper.ts","../src/utils/VolatileKnowledgeManager.ts","../src/scopes/conversational/Conversation/index.ts","../src/scopes/conversational/ConversationalAgent.ts","../src/scopes/conversational/Assistant.ts","../src/scopes/conversational/Copilot.ts","../src/scopes/system/SystemAgent.ts","../src/scopes/system/Activity.ts","../src/scopes/system/ChatCompletion.ts","../src/scopes/system/Proxy.ts","../src/factories/AgentFactory.ts","../src/SerenityClient.ts"],"sourcesContent":["let undiciFetch, UndiciHeaders, UndiciRequest, UndiciResponse;\n\nif (typeof process !== 'undefined' && process.versions?.node) {\n // Only import undici in Node.js environment\n const undici = require('undici');\n undiciFetch = undici.fetch;\n UndiciHeaders = undici.Headers;\n UndiciRequest = undici.Request;\n UndiciResponse = undici.Response;\n\n if (!globalThis.fetch) {\n globalThis.fetch = undiciFetch as unknown as typeof globalThis.fetch;\n globalThis.Headers = UndiciHeaders as unknown as typeof globalThis.Headers;\n globalThis.Request = UndiciRequest as unknown as typeof globalThis.Request;\n globalThis.Response = UndiciResponse as unknown as typeof globalThis.Response;\n }\n}\n\nexport {\n undiciFetch as fetch,\n UndiciHeaders as Headers,\n UndiciRequest as Request,\n UndiciResponse as Response\n};\n","export class EventEmitter<T extends Record<string, (...args: any[]) => void>> {\n private listeners: { [K in keyof T]?: Array<T[K]> } = {};\n\n on<K extends keyof T>(eventName: K, listener: T[K]): this {\n if (!this.listeners[eventName]) {\n this.listeners[eventName] = [];\n }\n this.listeners[eventName]!.push(listener);\n return this;\n }\n\n emit<K extends keyof T>(eventName: K, ...args: Parameters<T[K]>): void {\n this.listeners[eventName]?.forEach((listener) => listener(...args));\n }\n}","import { EventEmitter } from \"../../../EventEmitter\";\nimport { AgentSetupOptions } from \"../../../types\";\nimport {\n RealtimeSessionEvents,\n SerenitySessionCreateEvent,\n SerenityEvent,\n SerenitySessionCreatedEvent,\n SerenitySessionCloseEvent,\n SerenitySessionErrorEvent,\n SDPConfiguration,\n SerenityResponseProcessedEvent,\n} from \"./types\";\n\nexport class RealtimeSession extends EventEmitter<RealtimeSessionEvents> {\n private agentCode: string;\n private apiKey: string;\n private baseUrl: string;\n\n // Optional parameters.\n private inputParameters?: { [key: string]: any };\n private userIdentifier?: string;\n private agentVersion?: number;\n private channel?: string;\n\n private inactivityTimeout?: NodeJS.Timeout;\n private timeout = 120000; // 2 minutes\n\n // WebRTC configuration.\n private sessionConfiguration?: SDPConfiguration;\n private peerConnection?: RTCPeerConnection;\n private localStream?: MediaStream;\n private dataChannel?: RTCDataChannel;\n\n // WebSockets configuration.\n private socket?: WebSocket;\n\n constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentSetupOptions\n ) {\n super();\n this.apiKey = apiKey;\n this.agentCode = agentCode;\n this.baseUrl = baseUrl;\n\n this.agentVersion = options?.agentVersion;\n this.inputParameters = options?.inputParameters;\n this.userIdentifier = options?.userIdentifier;\n this.channel = options?.channel;\n }\n\n // #region Public methods\n\n /**\n * Starts the real-time session.\n */\n async start(): Promise<void> {\n try {\n this.#setupWebSocketConnection();\n } catch (error) {\n throw new Error(`Error starting the session`);\n }\n }\n\n /**\n * Stops the real-time session.\n */\n stop(): void {\n this.#stop();\n }\n\n /**\n * Allows the user to mute the microphone during a real-time voice session.\n */\n muteMicrophone(): void {\n if (this.localStream) {\n const audioTrack = this.localStream.getAudioTracks()[0];\n if (audioTrack) {\n audioTrack.enabled = false;\n }\n }\n }\n\n /**\n * Allows the user to unmute the microphone during a real-time voice session.\n */\n unmuteMicrophone(): void {\n if (this.localStream) {\n const audioTrack = this.localStream.getAudioTracks()[0];\n if (audioTrack) {\n audioTrack.enabled = true;\n }\n }\n }\n // #endregion\n\n // #region Private methods\n\n /**\n * Internal method to stop the session. Allows for a reason and details to be provided.\n * @param reason The reason for stopping the session.\n * @param details Additional details about the stop event.\n */\n #stop(reason?: string, details?: any): void {\n // Send a closure message to the server if socket is connected\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n try {\n // Close the WebSocket connection properly\n this.socket.close(1000, \"Client closed the session\");\n } catch (error) {\n console.error(\"Error closing WebSocket connection:\", error);\n }\n }\n \n // Stop the local audio tracks.\n if (this.localStream) {\n this.localStream.getTracks().forEach((track) => track.stop());\n this.localStream = undefined;\n }\n \n // Close the WebRTC connection if it is open.\n this.peerConnection && this.peerConnection.close();\n \n // Reset variables\n this.socket = undefined;\n this.dataChannel = undefined;\n this.peerConnection = undefined;\n\n this.emit(\"session.stopped\", reason, details);\n clearTimeout(this.inactivityTimeout);\n }\n\n #setupWebSocketConnection() {\n let url = `${this.baseUrl}/v2/agent/${this.agentCode}/realtime`;\n\n if (this.agentVersion) {\n url += `/${this.agentVersion}`;\n }\n\n this.socket = new WebSocket(url, [\"X-API-KEY\", this.apiKey]);\n\n this.socket.onopen = () => {\n const sessionCreateEvent: SerenitySessionCreateEvent = {\n type: \"serenity.session.create\",\n input_parameters: this.inputParameters,\n user_identifier: this.userIdentifier,\n channel: this.channel,\n };\n\n this.socket!.send(JSON.stringify(sessionCreateEvent));\n };\n\n this.socket.onclose = () => {\n this.#stop();\n };\n\n this.socket.onerror = (event) => {\n this.emit(\"error\", \"Error connecting to the server\");\n this.#stop();\n };\n\n this.socket.onmessage = (event) => {\n this.#handleIncomingMessagesFromSerenity(event.data);\n };\n }\n\n async #handleIncomingMessagesFromSerenity(data: string) {\n const obj = JSON.parse(data) as SerenityEvent;\n switch (obj.type) {\n case \"serenity.session.created\": {\n const eventData = obj as SerenitySessionCreatedEvent;\n this.sessionConfiguration = {\n url: eventData.url,\n headers: eventData.headers,\n };\n\n // Setup the WebRTC connection.\n this.#setupWebRTCConnection();\n\n // Add listeners for the WebRTC connection.\n this.#handleIncomingMessagesFromVendor();\n\n // Start the session.\n await this.#startSession();\n\n break;\n }\n case \"serenity.session.close\": {\n const eventData = obj as SerenitySessionCloseEvent;\n const errorDetails = this.#extractErrorMessageFromEvent(eventData);\n this.emit(\"error\", errorDetails);\n this.#stop(eventData.reason, errorDetails);\n break;\n }\n case \"serenity.response.processed\": {\n const eventData = obj as SerenityResponseProcessedEvent;\n this.emit(\"response.processed\", eventData.result);\n break;\n }\n default: {\n const isSerenityEvent = obj.type.startsWith(\"serenity\");\n if (this.dataChannel && !isSerenityEvent) {\n this.dataChannel.send(JSON.stringify(obj));\n }\n }\n }\n }\n\n #handleIncomingMessagesFromVendor() {\n if (!this.peerConnection) {\n throw new Error(\n `Could not add listeners: WebRTC connection not initialized`\n );\n }\n // Set up data channel for sending and receiving events\n const currentDate = new Date()\n .toISOString()\n .replace(/T/, \"-\")\n .replace(/:/g, \"-\")\n .replace(/\\..+/, \"\");\n const channelName = `data-channel-${this.agentCode}-${currentDate}`;\n this.dataChannel = this.peerConnection.createDataChannel(channelName);\n\n this.dataChannel.addEventListener(\"message\", (e: MessageEvent) => {\n this.#resetInactivityTimeout();\n const data = JSON.parse(e.data);\n\n try {\n switch (data.type) {\n case \"input_audio_buffer.speech_started\": {\n this.emit(\"speech.started\");\n break;\n }\n case \"input_audio_buffer.speech_stopped\": {\n this.emit(\"speech.stopped\");\n break;\n }\n\n case \"response.done\": {\n this.emit(\"response.done\");\n break;\n }\n case \"error\": {\n this.emit(\"error\", \"There was an error processing your request\");\n break;\n }\n }\n } catch (error) {\n this.emit(\"error\", \"Error processing incoming messages from vendor\");\n } finally {\n // Forward the message to the server\n if (this.socket) {\n this.socket.send(JSON.stringify(data));\n }\n }\n });\n }\n\n #setupWebRTCConnection() {\n // Create the peer connection.\n this.peerConnection = new RTCPeerConnection();\n\n // Configure remote audio playback.\n const audioElement = document.createElement(\"audio\");\n audioElement.autoplay = true;\n\n this.peerConnection.ontrack = (event) => {\n if (event.streams && event.streams[0]) {\n audioElement.srcObject = event.streams[0];\n }\n };\n }\n\n async #getAudioFromMicrophone(): Promise<void> {\n if (!this.peerConnection) {\n throw new Error(\n `Could not start the session: WebRTC connection not initialized`\n );\n }\n\n this.localStream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n\n const audioTrack = this.localStream.getTracks()[0];\n this.peerConnection.addTrack(audioTrack, this.localStream);\n }\n\n async #startSession() {\n if (!this.peerConnection) {\n throw new Error(\n `Could not start the session: WebRTC connection not initialized`\n );\n }\n\n if (!this.sessionConfiguration) {\n throw new Error(\n `Could not start the session: Session configuration not available`\n );\n }\n\n try {\n // Get the audio from the microphone.\n await this.#getAudioFromMicrophone();\n\n // Start the session using the Session Description Protocol (SDP)\n const offer = await this.peerConnection.createOffer();\n await this.peerConnection.setLocalDescription(offer);\n\n const sdpResponse = await fetch(`${this.sessionConfiguration.url}`, {\n method: \"POST\",\n body: offer.sdp,\n headers: this.sessionConfiguration.headers,\n });\n\n if (!sdpResponse.ok) {\n throw new Error(\"Error starting the session\");\n }\n\n const answer: RTCSessionDescriptionInit = {\n type: \"answer\",\n sdp: await sdpResponse.text(),\n };\n\n await this.peerConnection.setRemoteDescription(answer);\n\n this.emit(\"session.created\");\n this.#resetInactivityTimeout();\n } catch (error) {\n this.emit(\"error\", \"Error starting the session\");\n this.#stop();\n }\n }\n\n #resetInactivityTimeout() {\n clearTimeout(this.inactivityTimeout);\n this.inactivityTimeout = setTimeout(() => {\n this.#stop();\n }, this.timeout);\n }\n\n #extractErrorMessageFromEvent(eventData: SerenitySessionErrorEvent) {\n switch (eventData.reason) {\n case \"Exception\":\n return eventData.message;\n case \"ValidationException\": {\n if (!eventData.errors) return eventData.message;\n\n return Object.values(eventData.errors).join(\". \");\n }\n default:\n return eventData.message;\n }\n }\n // #endregion\n}\n","/**\n * Interface representing the structure of event data.\n */\ninterface SseEventData {\n start_time_utc?: string;\n stop_time_utc?: string;\n message?: string;\n}\n\n/**\n * Interface representing the event object with optional event and data properties.\n */\ninterface Event {\n event?: string;\n data?: string;\n}\n\n/**\n * Type for the event listeners.\n */\ntype ConnectionEventListener = (data: string) => void;\n\n/**\n * Class representing a server-sent events (SSE) connection.\n */\nexport class SseConnection {\n private eventListeners: Record<string, ConnectionEventListener[]>;\n private active: boolean;\n private buffer: string = \"\";\n\n /**\n * Creates an instance of SseConnection.\n * @param options - Options for the SSE connection.\n */\n constructor() {\n this.eventListeners = {\n start: [\n (_: string) => {\n },\n ],\n stop: [\n (_: string) => {\n this.stop();\n },\n ],\n error: [\n (_: string) => {\n this.stop();\n },\n ],\n };\n this.active = false;\n }\n\n /**\n * Connects to the SSE server and listens for events.\n * @param url - The URL to connect to for SSE.\n * @param fetchOptions - Additional fetch options.\n * @returns A promise that resolves with the response when the connection is active.\n * @throws Will throw an error if the response is not an event stream.\n */\n async start(\n url: string,\n fetchOptions: RequestInit\n ): Promise<Response> {\n this.active = true;\n try {\n const response = await fetch(url, fetchOptions);\n\n if(!response.ok) {\n throw response;\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n\n if (contentType !== \"text/event-stream\") {\n return response;\n }\n\n const reader = response.body!.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n this.buffer = \"\";\n\n while (this.active) {\n const { done, value } = await reader.read();\n if (done) break;\n\n this.buffer += decoder.decode(value, { stream: true });\n this.processEvents();\n }\n\n return response;\n } catch (error) {\n this.active = false;\n throw error;\n }\n }\n\n /**\n * Processes the event data from the buffer.\n */\n private processEvents(): void {\n let eventEnd: number;\n const lineEnding = this.buffer.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const eventDelimiter = lineEnding + lineEnding;\n while ((eventEnd = this.buffer.indexOf(eventDelimiter)) !== -1) {\n const eventText = this.buffer.slice(0, eventEnd).trim();\n this.buffer = this.buffer.slice(eventEnd + eventDelimiter.length);\n\n const lines = eventText.split(lineEnding);\n const event: Event = {};\n for (let line of lines) {\n if (line.startsWith(\"data:\")) {\n event.data = line.slice(\"data:\".length).trim();\n } else if (line.startsWith(\"event:\")) {\n event.event = line.slice(\"event:\".length).trim();\n }\n }\n\n this.trigger(event.event || \"message\", event.data!);\n }\n }\n\n /**\n * Registers an event listener for a specific event type.\n * @param eventType - The type of event to listen for.\n * @param callback - The callback function to execute when the event occurs.\n */\n on(eventType: string, callback: ConnectionEventListener): void {\n if (!this.eventListeners[eventType]) {\n this.eventListeners[eventType] = [];\n }\n this.eventListeners[eventType].push(callback);\n }\n\n /**\n * Unregisters an event listener for a specific event type.\n * @param eventType - The type of event to stop listening for.\n * @param callback - The callback function to remove.\n */\n off(eventType: string, callback: ConnectionEventListener): void {\n const listeners = this.eventListeners[eventType];\n if (listeners) {\n this.eventListeners[eventType] = listeners.filter(\n (cb) => cb !== callback\n );\n }\n }\n\n /**\n * Triggers an event and calls all registered listeners for that event type.\n * @param eventType - The type of event to trigger.\n * @param data - The data to pass to the event listeners.\n */\n private trigger(eventType: string, data: string): void {\n const listeners = this.eventListeners[eventType];\n if (listeners) {\n listeners.forEach((callback) => callback(data));\n }\n }\n\n /**\n * Stops the SSE connection.\n */\n stop(): void {\n this.active = false;\n }\n}\n","import { AgentResult } from \"../types\";\n\nexport class AgentMapper {\n public static mapAgentResultToSnakeCase = (data: {\n [key: string]: any;\n }): AgentResult => {\n const result: AgentResult = {\n content: data.content,\n instance_id: data.instanceId,\n action_results: data.actionResults,\n completion_usage: data.completionUsage,\n executor_task_logs: data.executorTaskLogs,\n json_content: data.jsonContent,\n meta_analysis: data.metaAnalysis,\n time_to_first_token: data.timeToFirstToken,\n };\n\n return result;\n };\n}\n","import {\n BaseErrorBody,\n RateLimitErrorBody,\n RequestEntityTooLargeErrorBody,\n UnauthorizedErrorBody,\n ValidationErrorBody,\n} from \"../types\";\n\nexport class InternalErrorHelper {\n static async process(\n error: unknown,\n fallbackErrorMessage?: string\n ): Promise<BaseErrorBody | ValidationErrorBody | RateLimitErrorBody> {\n try {\n if (error instanceof Response) {\n switch (error.status) {\n case 400: {\n const errorBody = await error.json();\n return {\n message: errorBody.message || \"Validation error\",\n statusCode: 400,\n errors: errorBody.errors || {},\n } as ValidationErrorBody;\n }\n case 429: {\n const retryAfter = parseInt(\n error.headers.get(\"Retry-After\") || \"60\"\n );\n return {\n message: \"Rate limit exceeded\",\n statusCode: 429,\n retryAfter,\n } as RateLimitErrorBody;\n }\n default: {\n const errorBody = await error.json();\n return {\n message:\n errorBody.message ||\n fallbackErrorMessage ||\n \"An error occurred while processing your request.\",\n statusCode: error.status,\n } as BaseErrorBody;\n }\n }\n }\n\n if (error instanceof Error) {\n return {\n message:\n error.message ||\n fallbackErrorMessage ||\n \"An error occurred while processing your request.\",\n statusCode: 500,\n } as BaseErrorBody;\n }\n\n return {\n message: fallbackErrorMessage || \"An unknown error occurred.\",\n statusCode: 500,\n } as BaseErrorBody;\n } catch (error) {\n return {\n message:\n fallbackErrorMessage ||\n \"An error occurred while processing your request.\",\n statusCode: 500,\n } as BaseErrorBody;\n }\n }\n\n static processFile = (\n statusCode: number,\n file: File,\n responseBody: unknown,\n fallbackErrorMessage?: string\n ) => {\n switch (statusCode) {\n case 401: {\n const body = responseBody as UnauthorizedErrorBody;\n return `${file.name}: ${body.message}`;\n }\n case 400: {\n const body = responseBody as ValidationErrorBody;\n return `${file.name}: ${this.#mergeFileErrors(body)}`;\n }\n case 413: {\n const body = responseBody as RequestEntityTooLargeErrorBody;\n return `${file.name}: ${body.message}`;\n }\n default: {\n return `${file.name}: ${fallbackErrorMessage || \"An unknown error occurred while uploading the file.\"}`;\n }\n }\n };\n \n static #mergeFileErrors = (error: ValidationErrorBody) => {\n // Validation errors uploading a file\n if (error.errors && error.errors[\"File\"]) {\n if(Array.isArray(error.errors[\"File\"])) {\n return error.errors[\"File\"].join(\", \");\n } else {\n return error.errors[\"File\"]\n }\n }\n\n // merge errors into a single string\n return Object.values(error.errors).flat().join(\", \");\n };\n}\n\nexport class ExternalErrorHelper {\n static determineErrorType(error: unknown): {\n type: \"RateLimitError\" | \"ValidationError\" | \"BaseError\" | \"UnknownError\";\n error: RateLimitErrorBody | ValidationErrorBody | BaseErrorBody | unknown;\n } {\n if (this.isRateLimitErrorBody(error)) {\n return { type: \"RateLimitError\", error };\n }\n\n if (this.isValidationErrorBody(error)) {\n return { type: \"ValidationError\", error };\n }\n\n if (this.isBaseErrorBody(error)) {\n return { type: \"BaseError\", error };\n }\n\n return { type: \"UnknownError\", error };\n }\n\n private static isRateLimitErrorBody(\n error: unknown\n ): error is RateLimitErrorBody {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n \"statusCode\" in error &&\n \"retryAfter\" in error &&\n typeof (error as any).retryAfter === \"number\"\n );\n }\n\n private static isValidationErrorBody(\n error: unknown\n ): error is ValidationErrorBody {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n \"statusCode\" in error &&\n \"errors\" in error &&\n typeof (error as any).errors === \"object\" &&\n (error as any).errors !== null\n );\n }\n\n private static isBaseErrorBody(error: unknown): error is BaseErrorBody {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n \"statusCode\" in error &&\n typeof (error as any).message === \"string\" &&\n typeof (error as any).statusCode === \"number\"\n );\n }\n}","import {\n VolatileKnowledgeUploadOptions,\n VolatileKnowledgeUploadRes,\n} from \"../types\";\nimport { InternalErrorHelper } from \"./ErrorHelper\";\n\n/**\n * Manages volatile knowledge files for agent instances.\n * Provides methods to upload, remove, and clear files.\n */\nexport class VolatileKnowledgeManager {\n private ids: string[] = [];\n\n constructor(\n private readonly baseUrl: string,\n private readonly apiKey: string\n ) {}\n\n /**\n * Upload a file to be used as volatile knowledge in the next agent execution.\n * The file will be automatically included in subsequent messages/executions until cleared.\n *\n * @param file - The file to upload\n * @param options - Optional configuration for file processing\n * @returns Upload result with file details or errors\n *\n * @example\n * ```typescript\n * const uploadResult = await conversation.volatileKnowledge.upload(file);\n *\n * if (uploadResult.success) {\n * console.log('File uploaded:', uploadResult.id);\n * } else {\n * console.error('Upload failed:', uploadResult.error);\n * }\n * ```\n */\n async upload(\n file: File,\n options: VolatileKnowledgeUploadOptions = {\n useVision: false,\n processEmbeddings: false,\n }\n ): Promise<VolatileKnowledgeUploadRes> {\n const url = `${this.baseUrl}/v2/volatileKnowledge`;\n\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const queryParams = new URLSearchParams();\n\n if (!options?.processEmbeddings) {\n // Check if useVision is enabled and the file is an image\n const isImageFile = file.type.startsWith(\"image/\");\n if (isImageFile) {\n queryParams.append(\n \"processEmbeddings\",\n (!options.useVision).toString()\n );\n }\n }\n\n try {\n const response = await fetch(`${url}?${queryParams.toString()}`, {\n method: \"POST\",\n body: formData,\n headers: {\n contentType: \"multipart/form-data\",\n \"X-API-KEY\": this.apiKey,\n },\n });\n\n const data = await response.json();\n if (!response.ok) {\n return {\n success: false,\n error: {\n file: file,\n error: new Error(\n InternalErrorHelper.processFile(\n response.status,\n file,\n data,\n options.locale?.uploadFileErrorMessage\n )\n ),\n },\n };\n } else {\n // Store file id in volatileKnowledgeIds to be included in next message\n if (!this.ids.includes(data.id)) {\n this.ids.push(data.id);\n }\n\n return {\n success: true,\n id: data.id,\n expirationDate: data.expirationDate,\n status: data.status,\n fileName: file.name,\n fileSize: data.fileSize,\n };\n }\n } catch (error) {\n return {\n success: false,\n error: {\n file: file,\n error: new Error(\n InternalErrorHelper.processFile(\n 500,\n file,\n {},\n options.locale?.uploadFileErrorMessage\n )\n ),\n },\n };\n }\n }\n\n /**\n * Remove a specific volatile knowledge file by its ID.\n *\n * @param fileId - The ID of the file to remove\n * @returns True if the file was removed, false otherwise\n *\n * @example\n * ```typescript\n * const uploadResult = await conversation.volatileKnowledge.upload(file);\n *\n * if (uploadResult.success) {\n * // Remove the file from the queue\n * conversation.volatileKnowledge.removeById(uploadResult.id);\n * }\n * ```\n */\n removeById(fileId: string): boolean {\n const index = this.ids.indexOf(fileId);\n if (index > -1) {\n this.ids.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Clear all volatile knowledge files from the queue.\n *\n * @example\n * ```typescript\n * await conversation.volatileKnowledge.upload(file1);\n * await conversation.volatileKnowledge.upload(file2);\n *\n * // Clear all files from the queue\n * conversation.volatileKnowledge.clear();\n * ```\n */\n clear(): void {\n this.ids = [];\n }\n\n /**\n * Get all volatile knowledge file IDs currently in the queue.\n * @internal\n */\n getIds(): string[] {\n return [...this.ids];\n }\n\n /**\n * Fetch details of a volatile knowledge file by its ID.\n * @param fileId - The ID of the file to fetch\n * @returns The file details or an error\n */\n async getById(fileId: string): Promise<VolatileKnowledgeUploadRes> {\n const url = `${this.baseUrl}/v2/volatileKnowledge/${fileId}`;\n\n const result = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n });\n\n const data = await result.json();\n\n if (!result.ok) {\n return {\n success: false,\n error: {\n error: new Error(\n data.message || \"Failed to fetch volatile knowledge file.\"\n ),\n },\n };\n }\n\n return {\n success: true,\n ...data,\n };\n }\n}\n","import { EventEmitter } from \"../../../EventEmitter\";\nimport {\n AgentExecutionOptions,\n AgentResult,\n ExecuteBodyParams,\n SSEStreamEvents,\n} from \"../../../types\";\nimport {\n ConversationInfoResult,\n ConversationRes,\n CreateExecuteBodyOptions,\n MessageAdditionalInfo,\n SubmitFeedbackOptions,\n SubmitFeedbackResult,\n RemoveFeedbackOptions,\n RemoveFeedbackResult,\n GetConnectorStatusOptions,\n ConnectorStatusResult,\n} from \"./types\";\nimport { SseConnection } from \"./SseConnection\";\nimport { AgentMapper } from \"../../../utils/AgentMapper\";\nimport { InternalErrorHelper } from \"../../../utils/ErrorHelper\";\nimport { VolatileKnowledgeManager } from \"../../../utils/VolatileKnowledgeManager\";\n\nexport class Conversation extends EventEmitter<SSEStreamEvents> {\n private agentCode: string;\n private apiKey: string;\n private baseUrl: string;\n\n // Optional parameters.\n private userIdentifier?: string;\n private agentVersion?: number;\n private channel?: string;\n private inputParameters?: { [key: string]: any };\n public conversationId?: string;\n public info: ConversationInfoResult | null = null;\n \n /**\n * Volatile knowledge manager for uploading and managing temporary files.\n * Files uploaded through this manager will be included in the next message/execution.\n * \n * @example\n * ```typescript\n * const uploadResult = await conversation.volatileKnowledge.upload(file);\n * if (uploadResult.success) {\n * console.log('File uploaded:', uploadResult.id);\n * }\n * ```\n */\n public readonly volatileKnowledge: VolatileKnowledgeManager;\n\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ) {\n super();\n this.apiKey = apiKey;\n this.agentCode = agentCode;\n this.baseUrl = baseUrl;\n this.volatileKnowledge = new VolatileKnowledgeManager(baseUrl, apiKey);\n\n this.agentVersion = options?.agentVersion;\n this.userIdentifier = options?.userIdentifier;\n this.channel = options?.channel;\n this.inputParameters = options?.inputParameters;\n }\n\n private static async create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ): Promise<Conversation> {\n const instance = new Conversation(agentCode, apiKey, baseUrl, options);\n await instance.getInfo();\n return instance;\n }\n\n private static createWithoutInfo(\n agentCode: string,\n apiKey: string,\n baseUrl: string\n ): Conversation {\n return new Conversation(agentCode, apiKey, baseUrl);\n }\n\n async streamMessage(\n message: string,\n options?: MessageAdditionalInfo\n ): Promise<AgentResult> {\n const version = this.agentVersion ? `/${this.agentVersion}` : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.#createExecuteBody({\n message,\n stream: true,\n additionalInfo: options,\n isNewConversation: !this.conversationId,\n });\n\n const connection = new SseConnection();\n let responsePromise: Promise<AgentResult>;\n\n responsePromise = new Promise(async (resolve, reject) => {\n connection.on(\"start\", () => {\n this.emit(\"start\");\n });\n\n connection.on(\"error\", (data) => {\n const error = JSON.parse(data);\n this.emit(\"error\", error);\n reject(error);\n });\n\n connection.on(\"content\", (data) => {\n const chunk = JSON.parse(data);\n this.emit(\"content\", chunk.text);\n });\n\n connection.on(\"stop\", (data) => {\n const finalMessage = JSON.parse(data) as { result: AgentResult };\n if (!this.conversationId) {\n this.conversationId = finalMessage.result.instance_id;\n }\n // Clear volatile knowledge IDs after message is sent\n this.volatileKnowledge.clear();\n this.emit(\"stop\", finalMessage.result);\n resolve(finalMessage.result);\n });\n\n const fetchOptions: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n };\n\n try {\n await connection.start(url, fetchOptions);\n } catch (error) {\n const response = await InternalErrorHelper.process(error, \"Failed to send message\");\n reject(response);\n }\n });\n\n return responsePromise;\n }\n\n async sendMessage(\n message: string,\n options?: MessageAdditionalInfo\n ): Promise<AgentResult> {\n const version = this.agentVersion ? `/${this.agentVersion}` : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.#createExecuteBody({\n message,\n stream: false,\n additionalInfo: options,\n isNewConversation: !this.conversationId,\n });\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (response.status !== 200) {\n throw await InternalErrorHelper.process(response, \"Failed to send message\");\n }\n\n const data = await response.json();\n\n const mappedData = AgentMapper.mapAgentResultToSnakeCase(data);\n if (!this.conversationId) {\n this.conversationId = mappedData.instance_id;\n }\n // Clear volatile knowledge IDs after message is sent\n this.volatileKnowledge.clear();\n\n return mappedData;\n }\n\n async getConversationById(\n id: string,\n options: {\n showExecutorTaskLogs: boolean;\n } = {\n showExecutorTaskLogs: false,\n }\n ): Promise<ConversationRes> {\n let url = `${this.baseUrl}/v2/agent/${this.agentCode}/conversation/${id}`;\n\n const queryParams = new URLSearchParams();\n if (options.showExecutorTaskLogs) {\n queryParams.append(\"showExecutorTaskLogs\", \"true\");\n }\n\n if (queryParams.toString()) {\n url += `?${queryParams.toString()}`;\n }\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"X-API-KEY\": this.apiKey,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (response.status !== 200) {\n const error = await InternalErrorHelper.process(response, \"Failed to get conversation by id\");\n throw error;\n }\n\n const data = await response.json();\n\n // Map messagesJson string to messages array\n if (data.messagesJson && typeof data.messagesJson === 'string') {\n try {\n data.messages = JSON.parse(data.messagesJson);\n delete data.messagesJson; // Remove the original string property\n } catch (error) {\n throw new Error(\"Failed to parse messagesJson: \" + error);\n }\n }\n\n return data as ConversationRes;\n }\n\n async getInfo(): Promise<ConversationInfoResult> {\n let url = `${this.baseUrl}/v2/agent/${this.agentCode}`;\n if (this.agentVersion) {\n url += `/${this.agentVersion}`;\n }\n url += \"/conversation/info\";\n\n let body: {\n channel?: string;\n inputParameters?: ExecuteBodyParams;\n userIdentifier?: string;\n } = {};\n\n if (this.channel) {\n body.channel = this.channel;\n }\n if (this.inputParameters) {\n body.inputParameters = [];\n this.#appendInputParametersIfNeeded(\n body.inputParameters,\n this.inputParameters\n );\n }\n if (this.userIdentifier) {\n body.userIdentifier = this.userIdentifier;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-API-KEY\": this.apiKey,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (response.status !== 200) {\n const error = await InternalErrorHelper.process(response, \"Failed to get conversation initial info\");\n throw error;\n }\n \n const data = await response.json();\n \n this.info = data as ConversationInfoResult;\n return this.info;\n }\n\n /**\n * Submit feedback for an agent message in the conversation.\n * \n * @param options - The feedback options including the agent message ID and feedback value\n * @returns A promise that resolves to the feedback submission result\n * @throws Error if the conversation ID is not set or if the request fails\n * \n * @example\n * ```typescript\n * const conversation = await client.agents.assistants.createConversation(\"agent-code\");\n * const response = await conversation.sendMessage(\"Hello!\");\n * \n * // Submit positive feedback\n * await conversation.submitFeedback({\n * agentMessageId: response.agent_message_id!,\n * feedback: true\n * });\n * ```\n */\n async submitFeedback(options: SubmitFeedbackOptions): Promise<SubmitFeedbackResult> {\n if (!this.conversationId) {\n throw new Error(\"Conversation ID is not set. Please send a message first to initialize the conversation.\");\n }\n\n const url = `${this.baseUrl}/agent/${this.agentCode}/conversation/${this.conversationId}/message/${options.agentMessageId}/feedback`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-API-KEY\": this.apiKey,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n feedback: options.feedback\n }),\n });\n\n if (response.status !== 200) {\n return {\n success: false,\n }\n }\n\n return {\n success: true\n }\n }\n\n /**\n * Remove feedback for an agent message in the conversation.\n * \n * @param options - The feedback options including the agent message ID\n * @returns A promise that resolves to the feedback removal result\n * @throws Error if the conversation ID is not set or if the request fails\n * \n * @example\n * ```typescript\n * const conversation = await client.agents.assistants.createConversation(\"agent-code\");\n * const response = await conversation.sendMessage(\"Hello!\");\n * \n * // Submit feedback first\n * await conversation.submitFeedback({\n * agentMessageId: response.agent_message_id!,\n * feedback: true\n * });\n * \n * // Remove feedback\n * await conversation.removeFeedback({\n * agentMessageId: response.agent_message_id!\n * });\n * ```\n */\n async removeFeedback(options: RemoveFeedbackOptions): Promise<RemoveFeedbackResult> {\n if (!this.conversationId) {\n throw new Error(\"Conversation ID is not set. Please send a message first to initialize the conversation.\");\n }\n\n const url = `${this.baseUrl}/agent/${this.agentCode}/conversation/${this.conversationId}/message/${options.agentMessageId}/feedback`;\n\n const response = await fetch(url, {\n method: \"DELETE\",\n headers: {\n \"X-API-KEY\": this.apiKey,\n },\n });\n\n if (response.status !== 200) {\n return {\n success: false,\n }\n }\n\n return {\n success: true\n }\n }\n\n /**\n * Get the connector status for a specific agent instance and connector.\n * \n * @param options - The connector status options including agent instance ID and connector ID\n * @returns A promise that resolves to the connector status result\n * @throws Error if the request fails\n * \n * @example\n * ```typescript\n * const conversation = await client.agents.assistants.createConversation(\"agent-code\");\n * \n * // Check connector status\n * const status = await conversation.getConnectorStatus({\n * agentInstanceId: conversation.conversationId!,\n * connectorId: \"connector-uuid\"\n * });\n * \n * console.log(status.isConnected); // true or false\n * ```\n */\n async getConnectorStatus(options: GetConnectorStatusOptions): Promise<ConnectorStatusResult> {\n const url = `${this.baseUrl}/connection/agentInstance/${options.agentInstanceId}/connector/${options.connectorId}/status`;\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"X-API-KEY\": this.apiKey,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (response.status !== 200) {\n const error = await InternalErrorHelper.process(response, \"Failed to get connector status\");\n throw error;\n }\n\n const data = await response.json();\n return data as ConnectorStatusResult;\n }\n\n\n\n #createExecuteBody(options: CreateExecuteBodyOptions): ExecuteBodyParams {\n let body: ExecuteBodyParams = [\n {\n Key: \"message\",\n Value: options.message,\n },\n {\n Key: \"stream\",\n Value: options.stream.toString(),\n },\n ];\n\n if (options.isNewConversation) {\n this.#appendUserIdentifierIfNeeded(body);\n } else {\n body.push({\n Key: \"chatId\",\n Value: this.conversationId,\n });\n }\n\n this.#appendInputParametersIfNeeded(\n body,\n {\n ...(options.additionalInfo?.inputParameters ?? {}),\n ...(this.inputParameters ?? {})\n }\n );\n \n // Merge volatile knowledge IDs from both sources and remove duplicates\n const mergedVolatileKnowledgeIds = Array.from(new Set([\n ...(options.additionalInfo?.volatileKnowledgeIds ?? []),\n ...this.volatileKnowledge.getIds()\n ]));\n this.#appendVolatileKnowledgeIdsIfNeeded(\n body,\n mergedVolatileKnowledgeIds.length > 0 ? mergedVolatileKnowledgeIds : undefined\n );\n this.#appendChannelIfNeeded(body);\n\n return body;\n }\n\n #appendUserIdentifierIfNeeded(body: ExecuteBodyParams) {\n if (this.userIdentifier) {\n body.push({\n Key: \"userIdentifier\",\n Value: this.userIdentifier,\n });\n }\n }\n\n #appendChannelIfNeeded(body: ExecuteBodyParams) {\n if (this.channel) {\n body.push({\n Key: \"channel\",\n Value: this.channel,\n });\n }\n }\n\n #appendInputParametersIfNeeded(\n body: ExecuteBodyParams,\n parameters: { [key: string]: any } = {}\n ) {\n if (!parameters || Object.keys(parameters).length === 0) return;\n\n for (const [key, value] of Object.entries(parameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n\n #appendVolatileKnowledgeIdsIfNeeded(\n body: ExecuteBodyParams,\n volatileKnowledgeIds?: string[]\n ) {\n if (!volatileKnowledgeIds || volatileKnowledgeIds.length === 0) return;\n\n body.push({\n Key: \"volatileKnowledgeIds\",\n Value: volatileKnowledgeIds,\n });\n }\n}\n","import { AgentSetupOptions } from \"../../types\";\nimport { Conversation } from \"./Conversation\";\nimport { RealtimeSession } from \"./RealtimeSession\";\n\nexport abstract class ConversationalAgent {\n protected constructor(\n protected readonly agentCode: string,\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n protected readonly options?: AgentSetupOptions\n ) {}\n\n createRealtimeSession(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentSetupOptions\n ): RealtimeSession {\n return new RealtimeSession(agentCode, apiKey, baseUrl, options);\n }\n\n async createConversation(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentSetupOptions\n ): Promise<Conversation> {\n return Conversation[\"create\"](agentCode, apiKey, baseUrl, options);\n }\n\n createConversationWithoutInfo(\n agentCode: string,\n apiKey: string,\n baseUrl: string\n ): Conversation {\n return Conversation[\"createWithoutInfo\"](agentCode, apiKey, baseUrl);\n }\n}\n","import { AgentSetupOptions } from \"../../types\";\nimport { ConversationalAgent } from \"./ConversationalAgent\";\n\nexport class Assistant extends ConversationalAgent {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentSetupOptions\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n \n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentSetupOptions\n ): Assistant {\n return new Assistant(agentCode, apiKey, baseUrl, options);\n }\n}\n","import { AgentSetupOptions } from \"../../types\";\nimport { ConversationalAgent } from \"./ConversationalAgent\";\n\nexport class Copilot extends ConversationalAgent {\n constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentSetupOptions\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentSetupOptions\n ): Copilot {\n return new Copilot(agentCode, apiKey, baseUrl, options);\n }\n}\n","import { EventEmitter } from \"../../EventEmitter\";\nimport { AgentResult, ExecuteBodyParams, SSEStreamEvents } from \"../../types\";\nimport { AgentMapper } from \"../../utils/AgentMapper\";\nimport { InternalErrorHelper } from \"../../utils/ErrorHelper\";\nimport { VolatileKnowledgeManager } from \"../../utils/VolatileKnowledgeManager\";\nimport { SseConnection } from \"../conversational/Conversation/SseConnection\";\nimport { SystemAgentExecutionOptionsMap } from \"./../../types\";\n\nexport abstract class SystemAgent<\n T extends keyof SystemAgentExecutionOptionsMap,\n> extends EventEmitter<SSEStreamEvents> {\n /**\n * Volatile knowledge manager for uploading and managing temporary files.\n * Files uploaded through this manager will be included in the next execution.\n * \n * @example\n * ```typescript\n * const uploadResult = await activity.volatileKnowledge.upload(file);\n * if (uploadResult.success) {\n * console.log('File uploaded:', uploadResult.id);\n * }\n * ```\n */\n public readonly volatileKnowledge: VolatileKnowledgeManager;\n\n protected constructor(\n protected readonly agentCode: string,\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n protected readonly options?: SystemAgentExecutionOptionsMap[T]\n ) {\n super();\n this.volatileKnowledge = new VolatileKnowledgeManager(baseUrl, apiKey);\n }\n\n async stream(): Promise<AgentResult> {\n const version = this.options?.agentVersion\n ? `/${this.options.agentVersion}`\n : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.createExecuteBody(true);\n\n const connection = new SseConnection();\n let responsePromise: Promise<AgentResult>;\n\n responsePromise = new Promise(async (resolve, reject) => {\n connection.on(\"start\", () => {\n this.emit(\"start\");\n });\n\n connection.on(\"error\", (data) => {\n const error = JSON.parse(data);\n this.emit(\"error\", error);\n reject(error);\n });\n\n connection.on(\"content\", (data) => {\n const chunk = JSON.parse(data);\n this.emit(\"content\", chunk.text);\n });\n\n connection.on(\"stop\", (data) => {\n const finalMessage = JSON.parse(data) as { result: AgentResult };\n // Clear volatile knowledge IDs after message is sent\n this.volatileKnowledge.clear();\n this.emit(\"stop\", finalMessage.result);\n resolve(finalMessage.result);\n });\n\n const fetchOptions: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n };\n\n try {\n await connection.start(url, fetchOptions);\n } catch (error) {\n const response = await InternalErrorHelper.process(error, \"Failed to send message\");\n reject(response);\n }\n });\n\n return responsePromise;\n }\n\n protected async execute(): Promise<AgentResult> {\n const version = this.options?.agentVersion\n ? `/${this.options.agentVersion}`\n : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.createExecuteBody(false);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (response.status !== 200) {\n const error = await InternalErrorHelper.process(response, \"Failed to send message\");\n throw error;\n }\n \n const data = await response.json();\n const mappedData = AgentMapper.mapAgentResultToSnakeCase(data);\n // Clear volatile knowledge IDs after message is sent\n this.volatileKnowledge.clear();\n return mappedData;\n }\n\n protected createExecuteBody(\n stream: boolean\n ): ExecuteBodyParams | { [key: string]: any } {\n let body: ExecuteBodyParams = [\n {\n Key: \"stream\",\n Value: stream.toString(),\n },\n ];\n\n this.appendVolatileKnowledgeIdsIfNeeded(body);\n this.appendUserIdentifierIfNeeded(body);\n this.appendChannelIfNeeded(body);\n\n return body;\n }\n\n protected appendUserIdentifierIfNeeded(body: ExecuteBodyParams) {\n if (this.options?.userIdentifier) {\n body.push({\n Key: \"userIdentifier\",\n Value: this.options.userIdentifier,\n });\n }\n }\n\n protected appendVolatileKnowledgeIdsIfNeeded(body: ExecuteBodyParams) {\n // Merge volatile knowledge IDs from both sources and remove duplicates\n const mergedVolatileKnowledgeIds = Array.from(new Set([\n ...(this.options?.volatileKnowledgeIds ?? []),\n ...this.volatileKnowledge.getIds()\n ]));\n\n if (mergedVolatileKnowledgeIds.length === 0) return;\n\n body.push({\n Key: \"volatileKnowledgeIds\",\n Value: mergedVolatileKnowledgeIds,\n });\n }\n\n protected appendChannelIfNeeded(body: ExecuteBodyParams) {\n if (this.options?.channel) {\n body.push({\n Key: \"channel\",\n Value: this.options.channel,\n });\n }\n }\n\n\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport {\n ExecuteBodyParams,\n SystemAgentExecutionOptionsMap,\n} from \"./../../types\";\n\nexport class Activity extends SystemAgent<\"activity\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Activity {\n return new Activity(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ) {\n const instance = new Activity(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(\n stream: boolean\n ): ExecuteBodyParams | { [key: string]: any } {\n const baseOptions = super.createExecuteBody(stream);\n\n this.appendInputParametersIfNeeded(baseOptions);\n\n return baseOptions;\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { ExecuteBodyParams } from \"../../types\";\nimport { SystemAgentExecutionOptionsMap } from \"./../../types\";\nimport { SystemAgent } from \"./SystemAgent\";\n\nexport class ChatCompletion extends SystemAgent<\"chat-completion\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): ChatCompletion {\n return new ChatCompletion(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ) {\n const instance = new ChatCompletion(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(stream: boolean): ExecuteBodyParams | { [key: string]: any } {\n const body = super.createExecuteBody(stream);\n\n this.appendMessagesIfNeeded(body);\n this.appendMessageIfNeeded(body);\n this.appendInputParametersIfNeeded(body);\n\n return body;\n }\n\n private appendMessagesIfNeeded(body: ExecuteBodyParams | { [key: string]: any }) {\n if (!this.options?.messages || this.options.messages.length === 0) return;\n\n body.push({\n Key: \"messages\",\n Value: JSON.stringify(this.options.messages),\n });\n }\n\n private appendMessageIfNeeded(body: ExecuteBodyParams | { [key: string]: any }) {\n if (!this.options?.message) return;\n\n body.push({\n Key: \"message\",\n Value: this.options.message,\n });\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport { ExecuteBodyParams, SystemAgentExecutionOptionsMap } from \"../../types\";\nimport { ProxyExecutionOptions } from \"./types\";\n\nexport class Proxy extends SystemAgent<\"proxy\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Proxy {\n return new Proxy(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ) {\n const instance = new Proxy(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(stream: boolean): ExecuteBodyParams | { [key: string]: any } {\n const options = this.options as ProxyExecutionOptions;\n \n return {\n model: options.model,\n messages: options.messages,\n frequency_penalty: options.frequency_penalty,\n max_tokens: options.max_tokens,\n presence_penalty: options.presence_penalty,\n temperature: options.temperature,\n top_p: options.top_p,\n top_k: options.top_k,\n vendor: options.vendor,\n userIdentifier: options.userIdentifier,\n groupIdentifier: options.groupIdentifier,\n useVision: options.useVision,\n stream: stream,\n }\n }\n}\n","import { Assistant } from \"../scopes/conversational/Assistant\";\nimport { Conversation } from \"../scopes/conversational/Conversation\";\nimport { ConversationInfoResult, ConversationRes } from \"../scopes/conversational/Conversation/types\";\nimport { Copilot } from \"../scopes/conversational/Copilot\";\nimport { RealtimeSession } from \"../scopes/conversational/RealtimeSession\";\nimport { Activity } from \"../scopes/system/Activity\";\nimport { ChatCompletion } from \"../scopes/system/ChatCompletion\";\nimport { Proxy } from \"../scopes/system/Proxy\";\nimport {\n AgentSetupOptions,\n AgentResult,\n AgentType,\n ConversationalAgentExecutionOptionsMap,\n SystemAgentExecutionOptionsMap,\n} from \"../types\";\n\nexport class AgentFactory {\n static createAgent<T extends AgentType>(\n type: T,\n apiKey: string,\n baseUrl: string\n ): AgentTypeMap[T] {\n switch (type) {\n case \"assistant\": {\n return {\n createConversation: async (\n agentCode: string,\n options?: AgentSetupOptions\n ) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n const conversation = await assistant.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n\n return conversation;\n },\n getConversationById: async (agentCode: string, conversationId: string, options: {\n showExecutorTaskLogs: boolean;\n } = { showExecutorTaskLogs: false }): Promise<ConversationRes> => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl\n );\n const conversation = await assistant.createConversationWithoutInfo(agentCode, apiKey, baseUrl);\n return await conversation.getConversationById(conversationId, options);\n },\n getInfoByCode: async (agentCode: string, options?: AgentSetupOptions) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options);\n const conversation = await assistant.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return conversation.info;\n },\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return assistant.createRealtimeSession(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n }\n case \"copilot\":\n return {\n createConversation: async (\n agentCode: string,\n options?: AgentSetupOptions\n ): Promise<Conversation> => {\n const copilot = Copilot.create(agentCode, apiKey, baseUrl, options);\n const conversation = await copilot.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return conversation;\n },\n getConversationById: async (agentCode: string, conversationId: string, options: {\n showExecutorTaskLogs: boolean;\n } = { showExecutorTaskLogs: false }): Promise<ConversationRes> => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl\n );\n const conversation = await assistant.createConversationWithoutInfo(agentCode, apiKey, baseUrl);\n return await conversation.getConversationById(conversationId, options);\n },\n getInfoByCode: async (agentCode: string, options?: AgentSetupOptions) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options);\n const conversation = await assistant.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return conversation.info;\n },\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"copilot\"]\n ) => {\n const copilot = Copilot.create(agentCode, apiKey, baseUrl, options);\n return copilot.createRealtimeSession(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n\n case \"activity\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Promise<AgentResult> => {\n return Activity[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Activity => {\n return Activity[\"create\"](agentCode, apiKey, baseUrl, options);\n },\n } as AgentTypeMap[T];\n }\n case \"chat-completion\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): Promise<AgentResult> => {\n return ChatCompletion[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): ChatCompletion => {\n return ChatCompletion[\"create\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n }\n case \"proxy\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Promise<AgentResult> => {\n return Proxy[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Proxy => {\n return Proxy[\"create\"](agentCode, apiKey, baseUrl, options);\n },\n } as AgentTypeMap[T];\n }\n default:\n throw new Error(`Agent type ${type} not supported`);\n }\n }\n}\n\nexport type ConversationalAgentScope<\n T extends keyof ConversationalAgentExecutionOptionsMap,\n> = {\n /**\n * Create a new conversation with an agent.\n * This allows you to send messages and receive responses.\n * \n * ## Regular conversation example:\n * ```typescript\n * const conversation = await client.agents.assistants.createConversation(\"agent-code\");\n * const response = await conversation.sendMessage(\"Hello!\");\n * console.log(response.content);\n * ```\n * \n * ## Streaming conversation example:\n * ```typescript\n * const conversation = await client.agents.assistants\n * .createConversation(\"agent-code\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"Hello!\");\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the conversation\n * @returns A Promise that resolves to a Conversation instance\n */\n createConversation: (\n agentCode: string,\n options?: AgentSetupOptions\n ) => Promise<Conversation>;\n\n /**\n * Create a real-time session with an agent.\n * This allows for voice interactions and real-time responses.\n * \n * ## Real-time session example:\n * ```typescript\n * const session = client.agents.assistants\n * .createRealtimeSession(\"agent-code\")\n * .on(\"session.created\", () => console.log(\"Session started\"))\n * .on(\"speech.started\", () => console.log(\"User started talking\"))\n * .on(\"speech.stopped\", () => console.log(\"User stopped talking\"))\n * .on(\"response.done\", (response) => console.log(\"Response:\", response))\n * .on(\"session.stopped\", () => console.log(\"Session stopped\"));\n * \n * await session.start();\n * // Later: session.stop();\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the real-time session\n * @returns A RealtimeSession instance\n */\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[T]\n ) => RealtimeSession;\n\n getInfoByCode: (agentCode: string, options?: AgentSetupOptions) => Promise<ConversationInfoResult> | null;\n getConversationById: (agentCode: string, conversationId: string, options?: {\n showExecutorTaskLogs: boolean;\n }) => Promise<ConversationRes>;\n};\n\nexport type SystemAgentScope<\n T extends keyof SystemAgentExecutionOptionsMap,\n TCreateReturn,\n> = {\n /**\n * Execute an agent synchronously and get the result.\n * \n * ## Example:\n * ```typescript\n * const response = await client.agents.activities.execute(\"agent-code\", {\n * // Optional parameters specific to the agent type\n * inputParameters: {\n * param1: \"value1\",\n * param2: \"value2\"\n * }\n * });\n * console.log(response.content);\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the execution\n * @returns A Promise that resolves to an AgentResult\n */\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[T]\n ) => Promise<AgentResult>;\n\n /**\n * Create an agent instance for streaming execution.\n * \n * ## Streaming example:\n * ```typescript\n * const agent = client.agents.activities\n * .create(\"agent-code\", {\n * // Optional parameters specific to the agent\n * inputParameters: {\n * param1: \"value1\",\n * param2: \"value2\"\n * }\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await agent.stream();\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the agent creation\n * @returns An agent instance ready for streaming\n */\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[T]\n ) => TCreateReturn;\n};\n\ntype AgentTypeMap = {\n assistant: ConversationalAgentScope<\"assistant\">;\n copilot: ConversationalAgentScope<\"copilot\">;\n activity: SystemAgentScope<\"activity\", Activity>;\n \"chat-completion\": SystemAgentScope<\"chat-completion\", ChatCompletion>;\n proxy: SystemAgentScope<\"proxy\", Proxy>;\n};\n","import {\n AgentFactory,\n ConversationalAgentScope,\n SystemAgentScope,\n} from \"./factories/AgentFactory\";\nimport { Activity } from \"./scopes/system/Activity\";\nimport { ChatCompletion } from \"./scopes/system/ChatCompletion\";\nimport { Proxy } from \"./scopes/system/Proxy\";\nimport { SerenityClientOptions } from \"./types\";\n\nexport default class SerenityClient {\n private apiKey: string;\n private baseUrl = \"https://api.serenitystar.ai/api\";\n\n /**\n * Interact with the different agents available in Serenity Star.\n * You can choose between assistants, copilots, activities, chat completions and proxies.\n */\n public readonly agents: {\n /**\n * Interact with Assistant agents available in Serenity Star.\n * This allows you to create conversations and real-time sessions.\n * \n * ## Start a new conversation and send a message:\n * ```typescript\n * // Regular text conversation\n * const conversation = await client.agents.assistants.createConversation(\"translator-assistant\");\n * const response = await conversation.sendMessage(\"The sun was beginning to set...\");\n * console.log(response.content);\n * \n * ```\n * \n * ## Stream message with SSE\n * ```typescript\n * const conversation = await client.agents.assistants\n * .createConversation(\"translator-assistant\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"The sun was beginning to set...\");\n * \n * ```\n * \n * ## Real-time voice conversation example:\n * ```typescript\n * const session = client.agents.assistants.createRealtimeSession(\"marketing-assistant\")\n * .on(\"session.created\", () => console.log(\"Session started\"))\n * .on(\"speech.started\", () => console.log(\"User started talking\"))\n * .on(\"speech.stopped\", () => console.log(\"User stopped talking\"))\n * .on(\"response.done\", (response) => console.log(\"Response:\", response))\n * .on(\"session.stopped\", () => console.log(\"Session stopped\"));\n * \n * await session.start();\n * // Later: session.stop();\n * ```\n */\n assistants: ConversationalAgentScope<\"assistant\">;\n\n /**\n * Interact with Copilot agents available in Serenity Star.\n * Similar to assistants but allows you to interact with the UI through callbacks.\n * \n * Text conversation example:\n * ```typescript\n * // Regular conversation\n * const conversation = await client.agents.copilots.createConversation(\"app-copilot\");\n * const response = await conversation.sendMessage(\"How do I create a new support ticket?\");\n * console.log(response.content);\n * \n * // Streaming conversation\n * const conversation = await client.agents.copilots\n * .createConversation(\"app-copilot\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"How do I create a new support ticket?\");\n * ```\n */\n copilots: ConversationalAgentScope<\"copilot\">;\n\n /**\n * Interact with Activity agents available in Serenity Star.\n * This allows you to execute activities.\n * It supports streaming.\n * Execute simple tasks based on the user input.\n * \n * ## Regular activity execution:\n * ```typescript\n * const response = await client.agents.activities.execute(\"marketing-campaign\")\n * console.log(response.content);\n * \n * // With parameters\n * const response = await client.agents.activities.execute(\"cooking-activity\", {\n * inputParameters: {\n * ingredientOne: \"chicken\",\n * ingredientTwo: \"onion\",\n * ingredientThree: \"cream\",\n * }\n * });\n * ```\n * \n * ## Stream activity with SSE:\n * ```typescript\n * const activity = client.agents.activities\n * .create(\"marketing-campaign\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await activity.stream();\n * ```\n */\n activities: SystemAgentScope<\"activity\", Activity>;\n\n /**\n * Interact with Chat Completion agents available in Serenity Star.\n * This allows you to execute chat completions.\n * It supports streaming.\n * Chat completions allows you to fully control the conversation and generate completions.\n * \n * ## Regular chat completion:\n * ```typescript\n * const response = await client.agents.chatCompletions.execute(\"Health-Coach\", {\n * message: \"Hello!\"\n * });\n * console.log(response.content);\n * ```\n * \n * ## Stream chat completion with SSE:\n * ```typescript\n * const chatCompletion = client.agents.chatCompletions\n * .create(\"Health-Coach\", {\n * message: \"Hello!\"\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await chatCompletion.stream();\n * ```\n */\n chatCompletions: SystemAgentScope<\"chat-completion\", ChatCompletion>;\n\n /**\n * Interact with Proxy agents available in Serenity Star.\n * This allows you to execute proxies.\n * It supports streaming.\n * Proxy agents allows you to define a set of parameters dynamically for each request\n * \n * ## Regular proxy execution:\n * ```typescript\n * const response = await client.agents.proxies.execute(\"proxy-agent\", {\n * model: \"gpt-4o-mini-2024-07-18\",\n * messages: [\n * {\n * role: \"system\",\n * content: \"You are a helpful assistant. Always use short and concise responses\"\n * },\n * { role: \"user\", content: \"What is artificial intelligence?\" }\n * ],\n * temperature: 1,\n * max_tokens: 250\n * });\n * console.log(response.content);\n * ```\n * \n * ## Stream proxy with SSE:\n * ```typescript\n * const proxy = client.agents.proxies\n * .create(\"proxy-agent\", {\n * model: \"gpt-4o-mini-2024-07-18\",\n * messages: [\n * {\n * role: \"system\",\n * content: \"You are a helpful assistant. Always use short and concise responses\"\n * },\n * { role: \"user\", content: \"What is artificial intelligence?\" }\n * ],\n * temperature: 1,\n * max_tokens: 250\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await proxy.stream();\n * ```\n */\n proxies: SystemAgentScope<\"proxy\", Proxy>;\n };\n\n constructor(options: SerenityClientOptions) {\n if (!options.apiKey) {\n throw new Error(\"The API key is required\");\n }\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl || this.baseUrl;\n\n this.agents = {\n assistants: AgentFactory.createAgent(\n \"assistant\",\n this.apiKey,\n this.baseUrl\n ),\n copilots: AgentFactory.createAgent(\"copilot\", this.apiKey, this.baseUrl),\n activities: AgentFactory.createAgent(\n \"activity\",\n this.apiKey,\n this.baseUrl\n ),\n chatCompletions: AgentFactory.createAgent(\n \"chat-completion\",\n this.apiKey,\n this.baseUrl\n ),\n proxies: AgentFactory.createAgent(\"proxy\", this.apiKey, this.baseUrl),\n };\n }\n}\n"],"mappings":"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","names":["undiciFetch","UndiciHeaders","UndiciRequest","UndiciResponse","_a","undici","EventEmitter","eventName","listener","args","_a","_RealtimeSession_instances","stop_fn","setupWebSocketConnection_fn","handleIncomingMessagesFromSerenity_fn","handleIncomingMessagesFromVendor_fn","setupWebRTCConnection_fn","getAudioFromMicrophone_fn","startSession_fn","resetInactivityTimeout_fn","extractErrorMessageFromEvent_fn","RealtimeSession","EventEmitter","agentCode","apiKey","baseUrl","options","__privateAdd","__async","__privateMethod","error","audioTrack","reason","details","track","url","sessionCreateEvent","event","data","obj","eventData","errorDetails","isSerenityEvent","currentDate","channelName","e","audioElement","offer","sdpResponse","answer","SseConnection","_","url","fetchOptions","__async","response","reader","decoder","done","value","error","eventEnd","lineEnding","eventDelimiter","eventText","lines","event","line","eventType","callback","listeners","cb","data","AgentMapper","data","_mergeFileErrors","_InternalErrorHelper","error","fallbackErrorMessage","__async","errorBody","statusCode","file","responseBody","_a","body","__privateGet","__privateAdd","InternalErrorHelper","ExternalErrorHelper","VolatileKnowledgeManager","baseUrl","apiKey","_0","__async","file","options","_a","_b","url","formData","queryParams","response","data","InternalErrorHelper","error","fileId","index","result","__spreadValues","_Conversation_instances","createExecuteBody_fn","appendUserIdentifierIfNeeded_fn","appendChannelIfNeeded_fn","appendInputParametersIfNeeded_fn","appendVolatileKnowledgeIdsIfNeeded_fn","_Conversation","EventEmitter","agentCode","apiKey","baseUrl","options","__privateAdd","VolatileKnowledgeManager","__async","instance","message","version","url","body","__privateMethod","connection","SseConnection","responsePromise","resolve","reject","data","error","chunk","finalMessage","fetchOptions","response","InternalErrorHelper","mappedData","AgentMapper","_0","id","queryParams","_a","_b","_c","_d","_e","__spreadValues","mergedVolatileKnowledgeIds","parameters","key","value","volatileKnowledgeIds","Conversation","ConversationalAgent","agentCode","apiKey","baseUrl","options","RealtimeSession","__async","Conversation","Assistant","_Assistant","ConversationalAgent","agentCode","apiKey","baseUrl","options","Copilot","_Copilot","ConversationalAgent","agentCode","apiKey","baseUrl","options","SystemAgent","EventEmitter","agentCode","apiKey","baseUrl","options","VolatileKnowledgeManager","__async","_a","version","url","body","connection","SseConnection","responsePromise","resolve","reject","data","error","chunk","finalMessage","fetchOptions","response","InternalErrorHelper","mappedData","AgentMapper","stream","_b","mergedVolatileKnowledgeIds","Activity","_Activity","SystemAgent","agentCode","apiKey","baseUrl","options","stream","baseOptions","body","_a","key","value","ChatCompletion","_ChatCompletion","SystemAgent","agentCode","apiKey","baseUrl","options","stream","body","_a","key","value","Proxy","_Proxy","SystemAgent","agentCode","apiKey","baseUrl","options","stream","AgentFactory","type","apiKey","baseUrl","agentCode","options","__async","Assistant","_0","_1","_2","conversationId","Copilot","Activity","ChatCompletion","Proxy","SerenityClient","options","AgentFactory"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@serenity-star/sdk",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "The Serenity Star JavaScript SDK provides a convenient way to interact with the Serenity Star API, enabling you to build custom applications.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|