my-chat-app
собранный код для вашего проекта, который включает все предложенные модули и организует их в единую структуру.
```
/my-chat-app
│
├── /src
│ ├── api.js // Функции для работы с API
│ ├── logger.js // Модуль логирования
│ ├── config.js // Конфигурация приложения
│ └── index.js // Основной файл приложения
│
├── /tests // Тесты для вашего приложения
│
├── .env // Файл для хранения переменных окружения
├── package.json // Зависимости проекта
└── README.md // Документация
```
```javascript
// src/config.js
require('dotenv').config(); // Загружаем переменные окружения из .env файла
module.exports = {
channel: {
id: 0,
name: "默认渠道",
baseUrl: "https://api.chat.work/api/openai"
},
openaiUrl: "/api/openai",
chatPath: "https://api.chat.work/api/openai/v1/chat/completions",
useModel: "gpt-4o-mini",
login: false,
connect: true,
timeout: 30,
retryAttempts: 3,
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${process.env.OPENAI_API_KEY}` // Используйте переменные окружения
},
logging: {
enabled: true,
level: "info"
}
};
```
```javascript
// src/logger.js
const config = require('./config');
function log(message, level = "info") {
if (config.logging.enabled) {
console[level](message);
}
}
```javascript
// src/api.js
const config = require('./config');
const { log } = require('./logger');
async function initializeConnection() {
if (!config.connect) {
log("Connection is disabled", "warn");
return;
}
log("Initializing connection to OpenAI API...", "info");
}
async function sendMessage(message) {
const url = `${config.channel.baseUrl}${config.chatPath}`;
const body = {
model: config.useModel,
messages: [{ role: "user", content: message }]
};
let attempts = 0;
while (attempts < config.retryAttempts) {
try {
const response = await fetch(url, {
method: "POST",
headers: config.headers,
body: JSON.stringify(body),
timeout: config.timeout * 1000 // Преобразование в миллисекунды
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
log("Message sent successfully", "info");
return data;
} catch (error) {
attempts++;
log(`Attempt ${attempts} failed: ${error.message}`, "error");
if (attempts >= config.retryAttempts) {
log("All attempts to send message failed", "error");
throw error;
}
}
}
}
function handleResponse(response) {
if (response.choices && response.choices.length > 0) {
const reply = response.choices[0].message.content;
log(`Received response: ${reply}`, "info");
return reply;
} else {
log("No valid response received", "warn");
return null;
}
}
module.exports = { initializeConnection, sendMessage, handleResponse };
```
```javascript
// src/index.js
const { log } = require('./logger');
const { initializeConnection, sendMessage, handleResponse } = require('./api');
async function main() {
await initializeConnection();
const userMessage = "Привет, как дела?";
try {
const response = await sendMessage(userMessage);
const reply = handleResponse(response);
console.log(`AI Reply: ${reply}`);
} catch (error) {
log("Error during API interaction:", "error");
}
}
Создайте файл `.env` в корне проекта и добавьте ваш API ключ:
```
OPENAI_API_KEY=ваш_ключ_здесь
```
Создайте файл `package.json` и добавьте необходимые зависимости:
```json
{
"name": "my-chat-app",
"version": "1.0.0",
"main": "src/index.js",
"scripts": {
"start": "node src/index.js"
},
"dependencies": {
"node-fetch": "^3.1.0",
"dotenv": "^10.0.0"
},
"devDependencies": {
"jest": "^27.0.0"
}
}
```
После создания всех файлов, выполните команду для установки зависимостей:
Запустите приложение с помощью команды:
Теперь у вас есть полностью собранный проект для взаимодействия с API OpenAI. Вы можете расширять его функциональность, добавлять тесты и улучшать обработку ошибок по мере необходимости. Не забудьте создать тесты в папке `/tests`, чтобы убедиться, что все работает корректно.