November 16

my-chat-app

собранный код для вашего проекта, который включает все предложенные модули и организует их в единую структуру.

### Структура проекта

```
/my-chat-app

├── /src
│ ├── api.js // Функции для работы с API
│ ├── logger.js // Модуль логирования
│ ├── config.js // Конфигурация приложения
│ └── index.js // Основной файл приложения

├── /tests // Тесты для вашего приложения

├── .env // Файл для хранения переменных окружения
├── package.json // Зависимости проекта
└── README.md // Документация
```

### 1. `config.js`

```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"
}
};
```

### 2. `logger.js`

```javascript
// src/logger.js
const config = require('./config');

function log(message, level = "info") {
if (config.logging.enabled) {
console[level](message);
}
}

module.exports = { log };
```

### 3. `api.js`

```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 };
```

### 4. `index.js`

```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");
}
}

main();
```

### 5. `.env`

Создайте файл `.env` в корне проекта и добавьте ваш API ключ:

```
OPENAI_API_KEY=ваш_ключ_здесь
```

### 6. `package.json`

Создайте файл `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"
}
}
```

### 7. Установка зависимостей

После создания всех файлов, выполните команду для установки зависимостей:

```bash
npm install
```

### 8. Запуск приложения

Запустите приложение с помощью команды:

```bash
npm start
```

### Заключение

Теперь у вас есть полностью собранный проект для взаимодействия с API OpenAI. Вы можете расширять его функциональность, добавлять тесты и улучшать обработку ошибок по мере необходимости. Не забудьте создать тесты в папке `/tests`, чтобы убедиться, что все работает корректно.