1
import logger from '../logger';
2
import { fetchWithCache } from '../cache';
3
import { REQUEST_TIMEOUT_MS, parseChatPrompt } from './shared';
8
ProviderEmbeddingResponse,
12
interface LocalAiCompletionOptions {
17
class LocalAiGenericProvider implements ApiProvider {
20
config: LocalAiCompletionOptions;
24
options: { config?: LocalAiCompletionOptions; id?: string; env?: EnvOverrides } = {},
26
const { id, config, env } = options;
27
this.modelName = modelName;
30
env?.LOCALAI_BASE_URL ||
31
process.env.LOCALAI_BASE_URL ||
32
'http://localhost:8080/v1';
33
this.config = config || {};
34
this.id = id ? () => id : this.id;
38
return `localai:${this.modelName}`;
42
return `[LocalAI Provider ${this.modelName}]`;
46
async callApi(prompt: string): Promise<ProviderResponse> {
47
throw new Error('Not implemented');
51
export class LocalAiChatProvider extends LocalAiGenericProvider {
52
async callApi(prompt: string): Promise<ProviderResponse> {
53
const messages = parseChatPrompt(prompt, [{ role: 'user', content: prompt }]);
55
model: this.modelName,
57
temperature: this.config.temperature || process.env.LOCALAI_TEMPERATURE || 0.7,
59
logger.debug(`Calling LocalAI API: ${JSON.stringify(body)}`);
64
({ data, cached } = (await fetchWithCache(
65
`${this.apiBaseUrl}/chat/completions`,
69
'Content-Type': 'application/json',
71
body: JSON.stringify(body),
74
)) as unknown as any);
77
error: `API call error: ${String(err)}`,
80
logger.debug(`\tLocalAI API chat completions response: ${JSON.stringify(data)}`);
83
output: data.choices[0].message.content,
87
error: `API response error: ${String(err)}: ${JSON.stringify(data)}`,
93
export class LocalAiEmbeddingProvider extends LocalAiGenericProvider {
94
async callEmbeddingApi(text: string): Promise<ProviderEmbeddingResponse> {
97
model: this.modelName,
102
({ data, cached } = (await fetchWithCache(
103
`${this.apiBaseUrl}/embeddings`,
107
'Content-Type': 'application/json',
109
body: JSON.stringify(body),
112
)) as unknown as any);
115
error: `API call error: ${String(err)}`,
118
logger.debug(`\tLocalAI embeddings API response: ${JSON.stringify(data)}`);
121
const embedding = data?.data?.[0]?.embedding;
123
throw new Error('No embedding found in LocalAI embeddings API response');
130
error: `API response error: ${String(err)}: ${JSON.stringify(data)}`,
136
export class LocalAiCompletionProvider extends LocalAiGenericProvider {
137
async callApi(prompt: string): Promise<ProviderResponse> {
139
model: this.modelName,
141
temperature: this.config.temperature || process.env.LOCALAI_TEMPERATURE || 0.7,
143
logger.debug(`Calling LocalAI API: ${JSON.stringify(body)}`);
148
({ data, cached } = (await fetchWithCache(
149
`${this.apiBaseUrl}/completions`,
153
'Content-Type': 'application/json',
155
body: JSON.stringify(body),
158
)) as unknown as any);
161
error: `API call error: ${String(err)}`,
164
logger.debug(`\tLocalAI completions API response: ${JSON.stringify(data)}`);
167
output: data.choices[0].text,
171
error: `API response error: ${String(err)}: ${JSON.stringify(data)}`,