UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

76 lines (64 loc) 1.75 kB
import { EnhancedGenerateContentResponse, GenerateContentResponse } from '@google/generative-ai'; import { nanoid } from '@/utils/uuid'; import { ChatStreamCallbacks } from '../../types'; import { StreamContext, StreamProtocolChunk, createCallbacksTransformer, createSSEProtocolTransformer, generateToolCallId, } from './protocol'; const transformVertexAIStream = ( chunk: GenerateContentResponse, stack: StreamContext, ): StreamProtocolChunk => { // maybe need another structure to add support for multiple choices const candidates = chunk.candidates; if (!candidates) return { data: '', id: stack?.id, type: 'text', }; const item = candidates[0]; if (item.content) { const part = item.content.parts[0]; if (part.functionCall) { const functionCall = part.functionCall; return { data: [ { function: { arguments: JSON.stringify(functionCall.args), name: functionCall.name, }, id: generateToolCallId(0, functionCall.name), index: 0, type: 'function', }, ], id: stack?.id, type: 'tool_calls', }; } return { data: part.text, id: stack?.id, type: 'text', }; } return { data: '', id: stack?.id, type: 'stop', }; }; export const VertexAIStream = ( rawStream: ReadableStream<EnhancedGenerateContentResponse>, callbacks?: ChatStreamCallbacks, ) => { const streamStack: StreamContext = { id: 'chat_' + nanoid() }; return rawStream .pipeThrough(createSSEProtocolTransformer(transformVertexAIStream, streamStack)) .pipeThrough(createCallbacksTransformer(callbacks)); };