| import { DefaultSystem } from '../utils/constant'; |
| import { IChatInputMessage, IStreamHandler } from '../interface'; |
| import { BaseChat } from './base/base'; |
| import { LMStudioClient } from '@lmstudio/sdk'; |
|
|
| const host = process.env.OLLAMA_HOST || 'localhost:1234'; |
| const lmstudioClient = new LMStudioClient({ |
| baseUrl: `ws://${host}` |
| }); |
| |
| |
| |
| export class LMStudioChat implements BaseChat { |
| public platform = 'lmstudio'; |
|
|
| public async chat( |
| messages: IChatInputMessage[], |
| model = 'lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF', |
| system = DefaultSystem |
| ): Promise<string | null> { |
| if (system) { |
| messages.unshift({ |
| role: 'system', |
| content: system |
| }); |
| } |
|
|
| const llama3 = await lmstudioClient.llm.load(model); |
| const response = await llama3.respond(messages); |
|
|
| return response.content; |
| } |
|
|
| public async chatStream( |
| messages: IChatInputMessage[], |
| onMessage: IStreamHandler, |
| model = 'llama2', |
| system = DefaultSystem |
| ): Promise<void> { |
| if (system) { |
| messages.unshift({ |
| role: 'system', |
| content: system |
| }); |
| } |
| const llama3 = await lmstudioClient.llm.load(model); |
|
|
| const response = llama3.respond(messages); |
|
|
| for await (const chunk of response) { |
| onMessage?.(chunk, false); |
| } |
| onMessage?.(null, true); |
| } |
|
|
| public async list() { |
| const models = await lmstudioClient.llm.listLoaded(); |
| if (models.length === 0) return Promise.reject('No models loaded.'); |
| return { |
| models: models.map((x: any) => { |
| return { |
| name: x.identifier |
| }; |
| }) |
| }; |
| } |
| } |
|
|
| export const lmstudio = new LMStudioChat(); |
|
|