-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(backend): enhance config loader with embedding support and impro… #74
Changes from 5 commits
78a3545
72c6dbc
1340532
0ee6b84
0b412b0
b378185
4c66d05
ad74c49
97cae53
e579146
8b25760
b7a8b30
7e68b3a
2c2027d
fb9be7d
0b85081
6ad8b9b
56c6ffc
b9c1909
50d3bd1
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -2,6 +2,8 @@ import * as fs from 'fs'; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
import * as path from 'path'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import * as _ from 'lodash'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { getConfigPath } from './common-path'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { Logger } from '@nestjs/common'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export interface ChatConfig { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
model: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
endpoint?: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -10,46 +12,237 @@ export interface ChatConfig { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
task?: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export class ConfigLoader { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private chatsConfig: ChatConfig[]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export interface EmbeddingConfig { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
model: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
endpoint?: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
token?: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export interface AppConfig { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
chats?: ChatConfig[]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
embeddings?: EmbeddingConfig; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export const exampleConfigContent = `{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Chat models configuration | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// You can configure multiple chat models | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"chats": [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Example of OpenAI GPT configuration | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"model": "gpt-3.5-turbo", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"endpoint": "https://api.openai.com/v1", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"token": "your-openai-token", // Replace with your OpenAI token | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"default": true // Set as default chat model | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Example of local model configuration | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"model": "llama2", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"endpoint": "http://localhost:11434/v1", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"task": "chat" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Embedding model configuration (optional) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"embeddings": { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"model": "text-embedding-ada-002", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"endpoint": "https://api.openai.com/v1", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"token": "your-openai-token" // Replace with your OpenAI token | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}`; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export class ConfigLoader { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private static instance: ConfigLoader; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private config: AppConfig; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private readonly configPath: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
constructor() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.configPath = getConfigPath('config'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private constructor() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.configPath = getConfigPath(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.initConfigFile(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.loadConfig(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private loadConfig() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const file = fs.readFileSync(this.configPath, 'utf-8'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public static getInstance(): ConfigLoader { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!ConfigLoader.instance) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ConfigLoader.instance = new ConfigLoader(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ConfigLoader.instance; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public initConfigFile(): void { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Logger.log('Creating example config file', 'ConfigLoader'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.chatsConfig = JSON.parse(file); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log('Raw file content:', this.chatsConfig); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const config = getConfigPath(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (fs.existsSync(config)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!fs.existsSync(config)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//make file | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fs.writeFileSync(config, exampleConfigContent, 'utf-8'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Logger.log('Creating example config file', 'ConfigLoader'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix duplicate log message and redundant existence check The
public initConfigFile(): void {
Logger.log('Creating example config file', 'ConfigLoader');
const config = getConfigPath();
if (fs.existsSync(config)) {
return;
}
- if (!fs.existsSync(config)) {
- //make file
- fs.writeFileSync(config, exampleConfigContent, 'utf-8');
- }
- Logger.log('Creating example config file', 'ConfigLoader');
+ fs.writeFileSync(config, exampleConfigContent, 'utf-8');
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
get<T>(path: string) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public reload(): void { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.loadConfig(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private loadConfig() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Logger.log( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
`Loading configuration from ${this.configPath}`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'ConfigLoader', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const file = fs.readFileSync(this.configPath, 'utf-8'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const jsonContent = file.replace( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(m, g) => (g ? '' : m), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.config = JSON.parse(jsonContent); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Consider using a library to parse JSON with comments The custom regex used to strip comments from the JSON content may not cover all edge cases and can be error-prone. Instead of manually handling comments, consider using a library like Apply this change using +import stripJsonComments from 'strip-json-comments';
...
-const jsonContent = file.replace(
- /\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g,
- (m, g) => (g ? '' : m),
-);
+const jsonContent = stripJsonComments(file); Remember to install the package: npm install strip-json-comments |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.validateConfig(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
error.code === 'ENOENT' || | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
error.message.includes('Unexpected end of JSON input') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.config = {}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.saveConfig(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw error; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
get<T>(path?: string): T { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!path) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return this.chatsConfig as unknown as T; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return this.config as unknown as T; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return _.get(this.chatsConfig, path) as T; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return _.get(this.config, path) as T; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set(path: string, value: any) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_.set(this.chatsConfig, path, value); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_.set(this.config, path, value); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.saveConfig(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private saveConfig() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const configDir = path.dirname(this.configPath); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!fs.existsSync(configDir)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fs.mkdirSync(configDir, { recursive: true }); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fs.writeFileSync( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.configPath, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
JSON.stringify(this.chatsConfig, null, 4), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
JSON.stringify(this.config, null, 2), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'utf-8', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add error handling for file write operations in The Consider wrapping the write operation in a try-catch block and logging any errors: private saveConfig() {
const configDir = path.dirname(this.configPath);
if (!fs.existsSync(configDir)) {
fs.mkdirSync(configDir, { recursive: true });
}
- fs.writeFileSync(
+ try {
+ fs.writeFileSync(
this.configPath,
JSON.stringify(this.config, null, 2),
'utf-8',
);
+ } catch (error) {
+ console.error(`Failed to save configuration: ${error.message}`);
+ }
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getAllChatConfigs(): ChatConfig[] { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return this.config.chats || []; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getChatConfig(modelName?: string): ChatConfig | null { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!this.config.chats || !Array.isArray(this.config.chats)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const chats = this.config.chats; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (modelName) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const foundChat = chats.find((chat) => chat.model === modelName); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (foundChat) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return foundChat; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
chats.find((chat) => chat.default) || (chats.length > 0 ? chats[0] : null) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
addChatConfig(config: ChatConfig) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!this.config.chats) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.config.chats = []; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const index = this.config.chats.findIndex( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(chat) => chat.model === config.model, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (index !== -1) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.config.chats.splice(index, 1); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (config.default) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.config.chats.forEach((chat) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
chat.default = false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.config.chats.push(config); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.saveConfig(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
removeChatConfig(modelName: string): boolean { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!this.config.chats) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const initialLength = this.config.chats.length; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.config.chats = this.config.chats.filter( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(chat) => chat.model !== modelName, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (this.config.chats.length !== initialLength) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.saveConfig(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return true; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getEmbeddingConfig(): EmbeddingConfig | null { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return this.config.embeddings || null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
validateConfig() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!this.chatsConfig) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new Error("Invalid configuration: 'chats' section is missing."); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!this.config) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.config = {}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (typeof this.config !== 'object') { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new Error('Invalid configuration: Must be an object'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (this.config.chats) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!Array.isArray(this.config.chats)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new Error("Invalid configuration: 'chats' must be an array"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.config.chats.forEach((chat, index) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!chat.model) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new Error( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
`Invalid chat configuration at index ${index}: 'model' is required`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const defaultChats = this.config.chats.filter((chat) => chat.default); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (defaultChats.length > 1) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new Error( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'Invalid configuration: Multiple default chat configurations found', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (this.config.embeddings) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!this.config.embeddings.model) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new Error("Invalid embedding configuration: 'model' is required"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getConfig(): AppConfig { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return this.config; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
This file was deleted.
This file was deleted.
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -1,9 +1,9 @@ | ||||||
import path from 'path'; | ||||||
import * as fs from 'fs'; | ||||||
import { ConfigLoader } from '../../config/config-loader'; | ||||||
import { ModelDownloader } from '../model-downloader'; | ||||||
import { ModelDownloader } from '../downloader/downloader'; | ||||||
import { downloadAllModels } from '../utils'; | ||||||
import { getConfigDir, getConfigPath } from 'src/config/common-path'; | ||||||
import { getConfigPath, getConfigPath } from 'src/config/common-path'; | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove duplicate import of getConfigPath -import { getConfigPath, getConfigPath } from 'src/config/common-path';
+import { getConfigPath } from 'src/config/common-path'; 📝 Committable suggestion
Suggested change
🧰 Tools🪛 Biome (1.9.4)[error] 6-6: Declarations inside of a a second declaration of
(parse) |
||||||
|
||||||
const originalIsArray = Array.isArray; | ||||||
|
||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Potential overwrite of existing model-status.json
Calling
getModelStatusPath
always writes'{}'
, even if the file exists. This can wipe out existing statuses. Implement a check to write only when missing the file.📝 Committable suggestion