1 line
16 KiB
JSON
1 line
16 KiB
JSON
{"repo": "brv4k/rice-ai-friend", "files": {"backend/routes/api.js": {"5de4bb40bd4abe7caeb4f433267b511fe1116cd9": {"t": 1785745556.0355384, "n": 6938, "h": "19b325f4102403bc", "c": "const express = require('express');\nconst { getDb } = require('../db');\nconst axios = require('axios');\nconst { encoding_for_model } = require('tiktoken');\n\nconst router = express.Router();\n\n// Функция для подсчёта токенов\nconst countTokens = (text) => {\n const encoder = encoding_for_model('gpt-3.5-turbo');\n const tokens = encoder.encode(text).length;\n return tokens;\n};\n\n// Эндпоинт для получения настроек\nrouter.get('/rice/:userId', async (req, res) => {\n try {\n const userId = req.params.userId || 'default';\n console.log(`Fetching settings for userId: ${userId}`);\n const db = getDb();\n const settings = await db.collection('settings').findOne({ userId });\n console.log(`Settings found:`, settings);\n res.json(settings || {});\n } catch (err) {\n console.error('Error fetching settings:', err);\n res.status(500).json({ error: 'Failed to fetch settings' });\n }\n});\n\n// Эндпоинт для сохранения настроек\nrouter.post('/rice', async (req, res) => {\n try {\n console.log('Received settings:', req.body);\n const settings = req.body;\n const db = getDb();\n await db.collection('settings').updateOne(\n { userId: settings.userId || 'default' },\n { $set: settings },\n { upsert: true }\n );\n res.json({ message: 'Settings saved' });\n } catch (err) {\n console.error('Error saving settings:', err);\n res.status(500).json({ error: 'Failed to save settings' });\n }\n});\n\n// Эндпоинт для получения истории переписки\nrouter.get('/chat/:userId', async (req, res) => {\n try {\n const userId = req.params.userId || 'default';\n console.log(`Fetching chat history for userId: ${userId}`);\n const db = getDb();\n let chatHistory = await db.collection('chat').findOne({ userId });\n\n if (!chatHistory) {\n console.log(`No chat history found for userId: ${userId}, creating initial message`);\n const initialMessage = {\n role: 'assistant',\n content: 'привет, друг!',\n timestamp: new Date().toISOString(),\n };\n await db.collection('chat').insertOne({\n userId,\n messages: [initialMessage],\n });\n chatHistory = { messages: [initialMessage] };\n } else {\n console.log(`Chat history found:`, chatHistory.messages);\n }\n\n res.json(chatHistory.messages);\n } catch (err) {\n console.error('Error fetching chat history:', err);\n res.status(500).json({ error: 'Failed to fetch chat history' });\n }\n});\n\n// Эндпоинт для отправки сообщения и получения ответа от DeepSeek\nrouter.post('/chat', async (req, res) => {\n try {\n console.log('Received chat request:', req.body);\n const { userId = 'default', message, settings, history } = req.body;\n\n // Сохраняем сообщение пользователя\n console.log('Saving user message to MongoDB...');\n const userMessage = { role: 'user', content: message, timestamp: new Date().toISOString() };\n const db = getDb();\n await db.collection('chat').updateOne(\n { userId },\n { $push: { messages: userMessage } },\n { upsert: true }\n );\n console.log('User message saved:', userMessage);\n\n // Формируем промпт для DeepSeek на основе настроек\n console.log('Generating system prompt for DeepSeek...');\n const systemPrompt = `\n Ты виртуальный ${settings.gender} по имени Rice. Твои характеристики:\n - Болтливость: ${settings.talkativeness} (0 - молчаливый, 10 - болтливый)\n - Чуткость: ${settings.sensitivity} (0 - рациональный, 10 - чуткий)\n - Энтузиазм: ${settings.enthusiasm} (0 - скептик, 10 - энтузиаст)\n - Дерзость: ${settings.boldness} (0 - вежливый, 10 - дерзкий)\n - Юмор: ${settings.humor} (0 - серьёзный, 10 - шутник)\n - Спорливость: ${settings.argumentativeness} (0 - соглашается, 10 - спорит)\n Интересы: ${settings.interests.join(', ')}.\n Отвечай кратко, как человек, не используй длинные ответы. Твой максимум - 150 токенов, учитывай это при генерации ответов.\n Не выделяй слова * или другими символами, форматирование работать не будет.\n `;\n console.log('System prompt:', systemPrompt);\n\n // Берём последние 15 сообщений (пользователя и бота)\n console.log('Preparing message history for DeepSeek...');\n const recentMessages = history.slice(-15);\n const messages = [\n { role: 'system', content: systemPrompt },\n ...recentMessages.map((msg) => ({ role: msg.role, content: msg.content })),\n { role: 'user', content: message },\n ];\n console.log('Messages for DeepSeek:', messages);\n\n // Подсчитываем токены в запросе\n let totalTokens = 0;\n messages.forEach((msg) => {\n totalTokens += countTokens(msg.content);\n });\n console.log(`Tokens in request: ${totalTokens}`);\n\n // Запрос к DeepSeek API\n console.log('Sending request to DeepSeek API...');\n const response = await axios.post(\n 'https://api.deepseek.com/v1/chat/completions',\n {\n model: 'deepseek-chat',\n messages,\n max_tokens: 150,\n temperature: 0.7,\n },\n {\n headers: {\n Authorization: `Bearer ${process.env.DEEPSEEK_API_KEY}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n console.log('DeepSeek API response:', response.data);\n\n const reply = response.data.choices[0].message.content;\n console.log('Extracted reply:', reply);\n\n // Подсчитываем токены в ответе\n const responseTokens = countTokens(reply);\n totalTokens += responseTokens;\n console.log(`Tokens in response: ${responseTokens}`);\n console.log(`Total tokens for request: ${totalTokens}`);\n\n // Сохраняем ответ бота\n console.log('Saving bot message to MongoDB...');\n const botMessage = { role: 'assistant', content: reply, timestamp: new Date().toISOString() };\n await db.collection('chat').updateOne(\n { userId },\n { $push: { messages: botMessage } },\n { upsert: true }\n );\n console.log('Bot message saved:', botMessage);\n\n res.json({ reply });\n } catch (err) {\n console.error('Error in /api/chat:', err.response ? err.response.data : err.message);\n res.status(500).json({ error: 'Failed to process message' });\n }\n});\n\n// Логирование всех маршрутов\nconsole.log('Registered API routes:', router.stack.map(layer => layer.route?.path || layer.regexp?.source).filter(Boolean));\n\nmodule.exports = router;"}, "11e120dd43fe3a5e84f90777a54ed8e94941c482": {"t": 1785754176.2645888, "n": 6938, "h": "19b325f4102403bc", "c": "const express = require('express');\nconst { getDb } = require('../db');\nconst axios = require('axios');\nconst { encoding_for_model } = require('tiktoken');\n\nconst router = express.Router();\n\n// Функция для подсчёта токенов\nconst countTokens = (text) => {\n const encoder = encoding_for_model('gpt-3.5-turbo');\n const tokens = encoder.encode(text).length;\n return tokens;\n};\n\n// Эндпоинт для получения настроек\nrouter.get('/rice/:userId', async (req, res) => {\n try {\n const userId = req.params.userId || 'default';\n console.log(`Fetching settings for userId: ${userId}`);\n const db = getDb();\n const settings = await db.collection('settings').findOne({ userId });\n console.log(`Settings found:`, settings);\n res.json(settings || {});\n } catch (err) {\n console.error('Error fetching settings:', err);\n res.status(500).json({ error: 'Failed to fetch settings' });\n }\n});\n\n// Эндпоинт для сохранения настроек\nrouter.post('/rice', async (req, res) => {\n try {\n console.log('Received settings:', req.body);\n const settings = req.body;\n const db = getDb();\n await db.collection('settings').updateOne(\n { userId: settings.userId || 'default' },\n { $set: settings },\n { upsert: true }\n );\n res.json({ message: 'Settings saved' });\n } catch (err) {\n console.error('Error saving settings:', err);\n res.status(500).json({ error: 'Failed to save settings' });\n }\n});\n\n// Эндпоинт для получения истории переписки\nrouter.get('/chat/:userId', async (req, res) => {\n try {\n const userId = req.params.userId || 'default';\n console.log(`Fetching chat history for userId: ${userId}`);\n const db = getDb();\n let chatHistory = await db.collection('chat').findOne({ userId });\n\n if (!chatHistory) {\n console.log(`No chat history found for userId: ${userId}, creating initial message`);\n const initialMessage = {\n role: 'assistant',\n content: 'привет, друг!',\n timestamp: new Date().toISOString(),\n };\n await db.collection('chat').insertOne({\n userId,\n messages: [initialMessage],\n });\n chatHistory = { messages: [initialMessage] };\n } else {\n console.log(`Chat history found:`, chatHistory.messages);\n }\n\n res.json(chatHistory.messages);\n } catch (err) {\n console.error('Error fetching chat history:', err);\n res.status(500).json({ error: 'Failed to fetch chat history' });\n }\n});\n\n// Эндпоинт для отправки сообщения и получения ответа от DeepSeek\nrouter.post('/chat', async (req, res) => {\n try {\n console.log('Received chat request:', req.body);\n const { userId = 'default', message, settings, history } = req.body;\n\n // Сохраняем сообщение пользователя\n console.log('Saving user message to MongoDB...');\n const userMessage = { role: 'user', content: message, timestamp: new Date().toISOString() };\n const db = getDb();\n await db.collection('chat').updateOne(\n { userId },\n { $push: { messages: userMessage } },\n { upsert: true }\n );\n console.log('User message saved:', userMessage);\n\n // Формируем промпт для DeepSeek на основе настроек\n console.log('Generating system prompt for DeepSeek...');\n const systemPrompt = `\n Ты виртуальный ${settings.gender} по имени Rice. Твои характеристики:\n - Болтливость: ${settings.talkativeness} (0 - молчаливый, 10 - болтливый)\n - Чуткость: ${settings.sensitivity} (0 - рациональный, 10 - чуткий)\n - Энтузиазм: ${settings.enthusiasm} (0 - скептик, 10 - энтузиаст)\n - Дерзость: ${settings.boldness} (0 - вежливый, 10 - дерзкий)\n - Юмор: ${settings.humor} (0 - серьёзный, 10 - шутник)\n - Спорливость: ${settings.argumentativeness} (0 - соглашается, 10 - спорит)\n Интересы: ${settings.interests.join(', ')}.\n Отвечай кратко, как человек, не используй длинные ответы. Твой максимум - 150 токенов, учитывай это при генерации ответов.\n Не выделяй слова * или другими символами, форматирование работать не будет.\n `;\n console.log('System prompt:', systemPrompt);\n\n // Берём последние 15 сообщений (пользователя и бота)\n console.log('Preparing message history for DeepSeek...');\n const recentMessages = history.slice(-15);\n const messages = [\n { role: 'system', content: systemPrompt },\n ...recentMessages.map((msg) => ({ role: msg.role, content: msg.content })),\n { role: 'user', content: message },\n ];\n console.log('Messages for DeepSeek:', messages);\n\n // Подсчитываем токены в запросе\n let totalTokens = 0;\n messages.forEach((msg) => {\n totalTokens += countTokens(msg.content);\n });\n console.log(`Tokens in request: ${totalTokens}`);\n\n // Запрос к DeepSeek API\n console.log('Sending request to DeepSeek API...');\n const response = await axios.post(\n 'https://api.deepseek.com/v1/chat/completions',\n {\n model: 'deepseek-chat',\n messages,\n max_tokens: 150,\n temperature: 0.7,\n },\n {\n headers: {\n Authorization: `Bearer ${process.env.DEEPSEEK_API_KEY}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n console.log('DeepSeek API response:', response.data);\n\n const reply = response.data.choices[0].message.content;\n console.log('Extracted reply:', reply);\n\n // Подсчитываем токены в ответе\n const responseTokens = countTokens(reply);\n totalTokens += responseTokens;\n console.log(`Tokens in response: ${responseTokens}`);\n console.log(`Total tokens for request: ${totalTokens}`);\n\n // Сохраняем ответ бота\n console.log('Saving bot message to MongoDB...');\n const botMessage = { role: 'assistant', content: reply, timestamp: new Date().toISOString() };\n await db.collection('chat').updateOne(\n { userId },\n { $push: { messages: botMessage } },\n { upsert: true }\n );\n console.log('Bot message saved:', botMessage);\n\n res.json({ reply });\n } catch (err) {\n console.error('Error in /api/chat:', err.response ? err.response.data : err.message);\n res.status(500).json({ error: 'Failed to process message' });\n }\n});\n\n// Логирование всех маршрутов\nconsole.log('Registered API routes:', router.stack.map(layer => layer.route?.path || layer.regexp?.source).filter(Boolean));\n\nmodule.exports = router;"}}}} |