import type { SmartAi } from "./classes.smartai.js"; import { OpenAiProvider } from "./provider.openai.js"; type TProcessFunction = (input: string) => Promise; export interface IConversationOptions { processFunction: TProcessFunction; } /** * a conversation */ export class Conversation { // STATIC public static async createWithOpenAi(smartaiRef: SmartAi) { const openaiProvider = new OpenAiProvider(smartaiRef.options.openaiToken); const conversation = new Conversation(smartaiRef, { processFunction: async (input) => { return '' // TODO implement proper streaming } }); return conversation; } public static async createWithAnthropic(smartaiRef: SmartAi) { const anthropicProvider = new OpenAiProvider(smartaiRef.options.anthropicToken); const conversation = new Conversation(smartaiRef, { processFunction: async (input) => { return '' // TODO implement proper streaming } }); return conversation; } // INSTANCE smartaiRef: SmartAi private systemMessage: string; private processFunction: TProcessFunction; private inputStreamWriter: WritableStreamDefaultWriter | null = null; private outputStreamController: ReadableStreamDefaultController | null = null; constructor(smartairefArg: SmartAi, options: IConversationOptions) { this.processFunction = options.processFunction; } setSystemMessage(systemMessage: string) { this.systemMessage = systemMessage; } private setupOutputStream(): ReadableStream { return new ReadableStream({ start: (controller) => { this.outputStreamController = controller; } }); } private setupInputStream(): WritableStream { return new WritableStream({ write: async (chunk) => { const processedData = await this.processFunction(chunk); if (this.outputStreamController) { this.outputStreamController.enqueue(processedData); } }, close: () => { this.outputStreamController?.close(); }, abort: (err) => { console.error('Stream aborted', err); this.outputStreamController?.error(err); } }); } public getInputStreamWriter(): WritableStreamDefaultWriter { if (!this.inputStreamWriter) { const inputStream = this.setupInputStream(); this.inputStreamWriter = inputStream.getWriter(); } return this.inputStreamWriter; } public getOutputStream(): ReadableStream { return this.setupOutputStream(); } }