ваше сообщение коммита

This commit is contained in:
2025-06-04 14:39:36 +03:00
parent 77f09a03a5
commit 59557e4413
15 changed files with 912 additions and 84 deletions

View File

@@ -34,30 +34,51 @@ class AIAssistant {
}
// Основной метод для получения ответа
async getResponse(message, language = 'auto') {
async getResponse(message, language = 'auto', history = null, systemPrompt = '', rules = null) {
try {
console.log('getResponse called with:', { message, language });
console.log('getResponse called with:', { message, language, history, systemPrompt, rules });
// Определяем язык, если не указан явно
const detectedLanguage = language === 'auto' ? this.detectLanguage(message) : language;
console.log('Detected language:', detectedLanguage);
// Сначала пробуем прямой API запрос
// Формируем system prompt с учётом правил
let fullSystemPrompt = systemPrompt || '';
if (rules && typeof rules === 'object') {
fullSystemPrompt += '\n' + JSON.stringify(rules, null, 2);
}
// Формируем массив сообщений для Qwen2.5/OpenAI API
const messages = [];
if (fullSystemPrompt) {
messages.push({ role: 'system', content: fullSystemPrompt });
}
if (Array.isArray(history) && history.length > 0) {
for (const msg of history) {
if (msg.role && msg.content) {
messages.push({ role: msg.role, content: msg.content });
}
}
}
// Добавляем текущее сообщение пользователя
messages.push({ role: 'user', content: message });
// Пробуем прямой API запрос (OpenAI-совместимый endpoint)
try {
console.log('Trying direct API request...');
const response = await this.fallbackRequest(message, detectedLanguage);
const response = await this.fallbackRequestOpenAI(messages, detectedLanguage);
console.log('Direct API response received:', response);
return response;
} catch (error) {
console.error('Error in direct API request:', error);
}
// Если прямой запрос не удался, пробуем через ChatOllama
// Если прямой запрос не удался, пробуем через ChatOllama (склеиваем сообщения в текст)
const chat = this.createChat(detectedLanguage);
try {
const prompt = messages.map(m => `${m.role === 'user' ? 'Пользователь' : m.role === 'assistant' ? 'Ассистент' : 'Система'}: ${m.content}`).join('\n');
console.log('Sending request to ChatOllama...');
const response = await chat.invoke(message);
const response = await chat.invoke(prompt);
console.log('ChatOllama response:', response);
return response.content;
} catch (error) {
@@ -70,24 +91,17 @@ class AIAssistant {
}
}
// Альтернативный метод запроса через прямой API
async fallbackRequest(message, language) {
// Новый метод для OpenAI/Qwen2.5 совместимого endpoint
async fallbackRequestOpenAI(messages, language) {
try {
console.log('Using fallback request method with:', { message, language });
const systemPrompt =
language === 'ru'
? 'Вы - полезный ассистент. Отвечайте на русском языке.'
: 'You are a helpful assistant. Respond in English.';
console.log('Sending request to Ollama API...');
const response = await fetch(`${this.baseUrl}/api/generate`, {
console.log('Using fallbackRequestOpenAI with:', { messages, language });
const model = this.defaultModel;
const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
model: this.defaultModel,
prompt: message,
system: systemPrompt,
model,
messages,
stream: false,
options: {
temperature: 0.7,
@@ -95,16 +109,17 @@ class AIAssistant {
},
}),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
console.log('Ollama API response:', data);
return data.response;
// Qwen2.5/OpenAI API возвращает ответ в data.choices[0].message.content
if (data.choices && data.choices[0] && data.choices[0].message && data.choices[0].message.content) {
return data.choices[0].message.content;
}
return data.response || '';
} catch (error) {
console.error('Error in fallback request:', error);
console.error('Error in fallbackRequestOpenAI:', error);
throw error;
}
}