shawon_majid

ipcHandlers.ts

Nov 12th, 2025
725
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
TypeScript 4.02 KB | Source Code | 0 0
  1. // LangGraph streaming handler for IPC transport
  2.   // Handles streaming from LangGraph assistant over dedicated event channels
  3.   ipcMain.handle('lg/stream/start', async (event, payload) => {
  4.     const {
  5.       runId,
  6.       eventChannel,
  7.       input,
  8.       context,
  9.       command,
  10.       config,
  11.     }: {
  12.       runId: string;
  13.       eventChannel: string;
  14.       input: any;
  15.       context?: { model?: string; webSearch?: boolean; threadId?: string };
  16.       command?: any;
  17.       config?: any;
  18.     } = payload;
  19.  
  20.     log.info(`Starting LangGraph stream ${runId} on channel ${eventChannel}`);
  21.     log.debug(`Context:`, context);
  22.  
  23.     try {
  24.       // Initialize LangGraph client with production credentials
  25.       const client = new Client({
  26.         apiUrl: 'http://localhost:2024/',
  27.       });
  28.  
  29.       // Get the first assistant
  30.       const assistants = await client.assistants.search({
  31.         metadata: null,
  32.         offset: 0,
  33.         limit: 5,
  34.       });
  35.  
  36.       if (!assistants || assistants.length === 0) {
  37.         throw new Error('No assistants found');
  38.       }
  39.  
  40.       const assistant = assistants[0];
  41.       log.info(`Using assistant: ${assistant.assistant_id}`);
  42.  
  43.       // Use existing thread or create new one
  44.       const threadId = context?.threadId;
  45.       log.info(`Thread ID: ${threadId || 'creating new thread'}`);
  46.  
  47.       // Build config with context as configurable parameters
  48.       const streamConfig = {
  49.         ...config,
  50.         configurable: {
  51.           ...config?.configurable,
  52.           ...(context && {
  53.             model: context.model,
  54.             webSearch: context.webSearch,
  55.           }),
  56.         },
  57.       };
  58.  
  59.       // Start streaming from LangGraph - handle null vs string threadId properly
  60.       const streamResponse = threadId
  61.         ? client.runs.stream(threadId, assistant.assistant_id, {
  62.             input: input || {},
  63.             config: streamConfig,
  64.             streamMode: 'messages-tuple',
  65.           })
  66.         : client.runs.stream(null, assistant.assistant_id, {
  67.             input: input || {},
  68.             config: streamConfig,
  69.             streamMode: 'messages',
  70.           });
  71.  
  72.       let newThreadId: string | null = null;
  73.  
  74.       // Stream events back to the renderer via the dedicated event channel
  75.       // eslint-disable-next-line no-restricted-syntax
  76.       for await (const chunk of streamResponse) {
  77.         log.debug(`Stream chunk:`, chunk);
  78.  
  79.         // Capture thread_id from metadata events
  80.         if (chunk.event === 'metadata' && chunk.data?.thread_id) {
  81.           newThreadId = chunk.data.thread_id;
  82.           log.info(`Thread ID from stream: ${newThreadId}`);
  83.         }
  84.  
  85.         // Forward the stream event to the renderer
  86.         event.sender.send(eventChannel, {
  87.           event: chunk.event,
  88.           data: chunk.data,
  89.           id: runId,
  90.         });
  91.       }
  92.  
  93.       // Send thread_id back to renderer so it can be used for future messages
  94.       if (newThreadId) {
  95.         event.sender.send(eventChannel, {
  96.           event: 'thread',
  97.           data: { thread_id: newThreadId },
  98.           id: runId,
  99.         });
  100.       }
  101.  
  102.       log.info(`Stream ${runId} completed successfully`);
  103.       return { success: true, threadId: newThreadId };
  104.     } catch (error) {
  105.       log.error(`Error in LangGraph stream ${runId}:`, error);
  106.  
  107.       // Send error event to renderer
  108.       event.sender.send(eventChannel, {
  109.         event: 'error',
  110.         data: {
  111.           error: error instanceof Error ? error.name : 'StreamError',
  112.           message: error instanceof Error ? error.message : 'Unknown error',
  113.         },
  114.         id: runId,
  115.       });
  116.  
  117.       throw error;
  118.     }
  119.   });
  120.  
  121.   // LangGraph stream cancellation handler
  122.   ipcMain.handle('lg/stream/cancel', async (event, payload) => {
  123.     const { runId }: { runId: string } = payload;
  124.     log.info(`Cancellation requested for stream ${runId}`);
  125.  
  126.     // TODO: Implement cancellation logic if LangGraph SDK supports it
  127.     // For now, just acknowledge the cancellation request
  128.     return { success: true, runId };
  129.   });
Advertisement
Add Comment
Please, Sign In to add comment