| import { Message } from '@/types/chat'; | |
| import { OllamaModel } from '@/types/ollama'; | |
| import { OLLAMA_HOST } from '../app/const'; | |
| import { | |
| ParsedEvent, | |
| ReconnectInterval, | |
| createParser, | |
| } from 'eventsource-parser'; | |
| export class OllamaError extends Error { | |
| constructor(message: string) { | |
| super(message); | |
| this.name = 'OllamaError'; | |
| } | |
| } | |
| export const OllamaStream = async ( | |
| model: string, | |
| systemPrompt: string, | |
| temperature : number, | |
| prompt: string, | |
| ) => { | |
| let url = `${OLLAMA_HOST}/api/generate`; | |
| const res = await fetch(url, { | |
| headers: { | |
| 'Accept': 'application/json', | |
| 'Content-Type': 'application/json', | |
| 'Cache-Control': 'no-cache', | |
| 'Pragma': 'no-cache', | |
| }, | |
| method: 'POST', | |
| body: JSON.stringify({ | |
| model: model, | |
| prompt: prompt, | |
| system: systemPrompt, | |
| options: { | |
| temperature: temperature, | |
| }, | |
| }), | |
| }); | |
| const encoder = new TextEncoder(); | |
| const decoder = new TextDecoder(); | |
| if (res.status !== 200) { | |
| const result = await res.json(); | |
| if (result.error) { | |
| throw new OllamaError( | |
| result.error | |
| ); | |
| } | |
| } | |
| const responseStream = new ReadableStream({ | |
| async start(controller) { | |
| try { | |
| for await (const chunk of res.body as any) { | |
| const text = decoder.decode(chunk); | |
| const parsedData = JSON.parse(text); | |
| if (parsedData.response) { | |
| controller.enqueue(encoder.encode(parsedData.response)); | |
| } | |
| } | |
| controller.close(); | |
| } catch (e) { | |
| controller.error(e); | |
| } | |
| }, | |
| }); | |
| return responseStream; | |
| }; |