Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ http://localhost:3264/api
## Возможности fork

- **Chat Completions API**: `POST /api/chat/completions`, совместимый с OpenAI SDK, Open WebUI, LiteLLM и агентами.
- **Thinking / reasoning для Qwen Chat**: текстовые запросы в этой копии по умолчанию уходят с `thinking_enabled`; ответ разделяет размышления (`reasoning_content`) и финальный текст (`content`).
- **Актуальные модели Qwen Chat**: `qwen3.7-max`, `qwen3.7-plus`, `qwen3.6-plus` и другие модели из `src/AvailableModels.txt`.
- **Генерация изображений через Qwen Chat**: `POST /api/images/generations` без `DASHSCOPE_API_KEY`.
- **Генерация видео через Qwen Chat**: `POST /api/videos/generations` + polling задач через `GET /api/tasks/status/:taskId`.
Expand Down Expand Up @@ -122,13 +123,32 @@ curl http://localhost:3264/api/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3.7-max",
"enable_thinking": true,
"messages": [
{"role": "user", "content": "Ответь коротко: что такое FreeQwenApi?"}
],
"stream": false
}'
```

В non-streaming ответе размышления возвращаются отдельно:

```json
{
"choices": [
{
"message": {
"role": "assistant",
"reasoning_content": "...ход рассуждения...",
"content": "...финальный ответ..."
}
}
]
}
```

В streaming-режиме reasoning приходит чанками как `delta.reasoning_content`, а финальный ответ как `delta.content`. Отключить thinking для конкретного запроса можно через `enable_thinking: false`, `thinking_enabled: false` или `reasoning_effort: "none"`.

OpenAI SDK:

```js
Expand Down
22 changes: 11 additions & 11 deletions examples/openai-sdk/conversation.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,30 @@
import OpenAI from 'openai';

const openai = new OpenAI({
baseURL: 'http://localhost:3264/api',
baseURL: 'http://localhost:3264/api',
apiKey: 'dummy-key', // Ключ не используется, но требуется для SDK
});

async function conversationExample() {
try {
console.log('Начинаем диалог с Qwen AI...\n');

// Первое сообщение пользователя
console.log('Пользователь: Привет! Расскажи о квантовой физике простыми словами.');

let completion = await openai.chat.completions.create({
messages: [
{ role: 'user', content: 'Привет! Расскажи о квантовой физике простыми словами.' }
],
model: 'qwen-max-latest',
});

const assistantResponse1 = completion.choices[0].message.content;
console.log('\nQwen:', assistantResponse1);

// Второе сообщение пользователя, включающее историю беседы
console.log('\nПользователь: А как это связано с теорией относительности?');

completion = await openai.chat.completions.create({
messages: [
{ role: 'user', content: 'Привет! Расскажи о квантовой физике простыми словами.' },
Expand All @@ -36,13 +36,13 @@ async function conversationExample() {
],
model: 'qwen-max-latest',
});

const assistantResponse2 = completion.choices[0].message.content;
console.log('\nQwen:', assistantResponse2);

// Третье сообщение пользователя
console.log('\nПользователь: Спасибо! Кто из ученых внес наибольший вклад в развитие этих теорий?');

completion = await openai.chat.completions.create({
messages: [
{ role: 'user', content: 'Привет! Расскажи о квантовой физике простыми словами.' },
Expand All @@ -53,7 +53,7 @@ async function conversationExample() {
],
model: 'qwen-max-latest',
});

console.log('\nQwen:', completion.choices[0].message.content);
console.log('\nДиалог успешно завершен.');

Expand All @@ -63,4 +63,4 @@ async function conversationExample() {
}

// Запуск
conversationExample();
conversationExample();
6 changes: 3 additions & 3 deletions examples/openai-sdk/image-analysis.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import OpenAI from 'openai';

const openai = new OpenAI({
baseURL: 'http://localhost:3264/api',
baseURL: 'http://localhost:3264/api',
apiKey: 'dummy-key', // Ключ не используется, но требуется для SDK
});

Expand All @@ -18,7 +18,7 @@ async function analyzeImage() {

const completion = await openai.chat.completions.create({
messages: [
{
{
role: 'user',
content: [
{
Expand All @@ -45,4 +45,4 @@ async function analyzeImage() {
}

// Запуск
analyzeImage();
analyzeImage();
26 changes: 13 additions & 13 deletions examples/openai-sdk/openai-compatibility.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@ import OpenAI from 'openai';

// Настройка клиента OpenAI с использованием нашего прокси как точки доступа
const openai = new OpenAI({
baseURL: 'http://localhost:3264/api',
baseURL: 'http://localhost:3264/api',
apiKey: 'dummy-key', // Ключ не используется, но требуется для SDK
});

async function openaiCompatibilityExample() {
try {
console.log('Демонстрация совместимости с OpenAI API\n');

// 1. Стандартный запрос в формате OpenAI
console.log('1. Стандартный запрос в формате OpenAI...');

const completion = await openai.chat.completions.create({
model: 'qwen-max-latest',
messages: [
Expand All @@ -24,13 +24,13 @@ async function openaiCompatibilityExample() {
],
temperature: 0.7,
});

console.log('Ответ:');
console.log(completion.choices[0].message.content);

// 2. Потоковый запрос в формате OpenAI
console.log('\n2. Потоковый запрос в формате OpenAI...');

console.log('Ответ (потоковый режим):');
const stream = await openai.chat.completions.create({
model: 'qwen-max-latest',
Expand All @@ -40,23 +40,23 @@ async function openaiCompatibilityExample() {
],
stream: true,
});

let streamedContent = '';
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content || '';
streamedContent += content;
process.stdout.write(content);
}
console.log('\n');

// 3. Демонстрация структуры ответа в формате OpenAI
console.log('\n3. Структура ответа в формате OpenAI:');

const responseDemo = await openai.chat.completions.create({
model: 'qwen-max-latest',
messages: [{ role: 'user', content: 'Привет!' }],
});

// Выводим структуру ответа (без содержимого сообщения)
const { choices, ...responseWithoutChoices } = responseDemo;
console.log(JSON.stringify({
Expand All @@ -66,13 +66,13 @@ async function openaiCompatibilityExample() {
message: { role: choices[0].message.role, content: '[содержимое сообщения скрыто для краткости]' }
}]
}, null, 2));





} catch (error) {
console.error('Ошибка при выполнении примера:', error);
}
}

// Запуск
openaiCompatibilityExample();
openaiCompatibilityExample();
6 changes: 3 additions & 3 deletions examples/openai-sdk/simple.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import OpenAI from 'openai';

const openai = new OpenAI({
baseURL: 'http://localhost:3264/api',
baseURL: 'http://localhost:3264/api',
apiKey: 'dummy-key', // Ключ не используется, но требуется для SDK
});

Expand All @@ -16,7 +16,7 @@ async function simpleRequest() {
messages: [
{ role: 'user', content: 'Напиши 5 интересных фактов о космосе' }
],
model: 'qwen-max-latest',
model: 'qwen-max-latest',
});

console.log('Ответ от Qwen:\n');
Expand All @@ -29,4 +29,4 @@ async function simpleRequest() {
}

// Запуск
simpleRequest();
simpleRequest();
10 changes: 5 additions & 5 deletions examples/openai-sdk/streaming.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import OpenAI from 'openai';

const openai = new OpenAI({
baseURL: 'http://localhost:3264/api',
apiKey: 'dummy-key',
baseURL: 'http://localhost:3264/api',
apiKey: 'dummy-key',
});

async function streamFromQwen() {
Expand All @@ -17,8 +17,8 @@ async function streamFromQwen() {
messages: [
{ role: 'user', content: 'Напиши небольшую историю о космических путешествиях' }
],
model: 'qwen-max-latest',
stream: true,
model: 'qwen-max-latest',
stream: true,
});

console.log('Ответ от Qwen (потоковый режим):\n');
Expand All @@ -36,4 +36,4 @@ async function streamFromQwen() {
}

// Запуск
streamFromQwen();
streamFromQwen();
18 changes: 9 additions & 9 deletions examples/openai-sdk/system-message.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import OpenAI from 'openai';

const openai = new OpenAI({
baseURL: 'http://localhost:3264/api',
baseURL: 'http://localhost:3264/api',
apiKey: 'dummy-key', // Ключ не используется, но требуется для SDK
});

Expand All @@ -14,16 +14,16 @@ async function systemMessageExample() {

const completion = await openai.chat.completions.create({
messages: [
{
role: 'system',
content: 'Ты опытный астроном, который специализируется на планетах Солнечной системы. Отвечай научно точно, но понятным языком.'
{
role: 'system',
content: 'Ты опытный астроном, который специализируется на планетах Солнечной системы. Отвечай научно точно, но понятным языком.'
},
{
role: 'user',
content: 'Расскажи мне о Марсе и его особенностях'
{
role: 'user',
content: 'Расскажи мне о Марсе и его особенностях'
}
],
model: 'qwen-max-latest',
model: 'qwen-max-latest',
});

console.log('Ответ от Qwen:\n');
Expand All @@ -36,4 +36,4 @@ async function systemMessageExample() {
}

// Запуск
systemMessageExample();
systemMessageExample();
Loading