=== СТРУКТУРА ПРОЕКТА ===
yandex.php [1,573 B]
.htaccess [239 B]
index.php [1,398 B]
gemini_cloud.php [1,699 B]
qwen.php [1,398 B]
debug.php [3,228 B]
gigachat.php [2,428 B]
openai.php [1,637 B]
openrouter.php [1,394 B]
test.php [3,554 B]
db.php [1,395 B]
config.php [10,565 B]
cloudflare.php [1,524 B]
groq.php [1,557 B]
assets/app.js [3,702 B]
assets/style.css [1,552 B]
deepseek.php [1,412 B]
api.php [12,449 B]
opencode.php [1,324 B]
huggingface.php [1,483 B]
test_all.php [1,460 B]
gemini.php [1,708 B]
xai.php [1,721 B]
================================================================================
=== СОДЕРЖИМОЕ ФАЙЛОВ ===
================================================================================
### ФАЙЛ: yandex.php
--------------------------------------------------------------------------------
'No message']); exit; }
$api_key = 'AQVN1znekXUo4dmZVNrU1KbTM9cDygfeku8A2F4w';
$url = 'https://llm.api.cloud.yandex.net/foundationModels/v1/completion';
// Специфичный формат для Яндекса!
$data = [
'modelUri' => $model_uri,
'completionOptions' => [
'stream' => false,
'temperature' => 0.7,
'maxTokens' => 2048
],
'messages' => [
['role' => 'user', 'text' => $message]
]
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $api_key,
'Content-Type: application/json'
],
CURLOPT_TIMEOUT => 120,
CURLOPT_SSL_VERIFYPEER => false
]);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
echo json_encode([
'success' => $code === 200,
'provider' => 'YandexGPT',
'model' => $model_uri,
'response' => $result['result']['alternatives'][0]['message']['text'] ?? '',
'error' => $result['error']['message'] ?? $result['message'] ?? null
]);
### ФАЙЛ: .htaccess
--------------------------------------------------------------------------------
SetEnv no-gzip 1
RewriteEngine On
RewriteRule ^data/ - [F,L]
RewriteRule ^config\.php$ - [F,L]
RewriteRule ^db\.php$ - [F,L]
Options -Indexes
### ФАЙЛ: index.php
--------------------------------------------------------------------------------
AI Hub
### ФАЙЛ: gemini_cloud.php
--------------------------------------------------------------------------------
'No message']); exit; }
// ⚠️ Получите API-ключ в Google Cloud Console:
// https://console.cloud.google.com/apis/credentials
$api_key = 'AQ.Ab8RN6LxImFlfCNi6QOAkCPBu4TkBeyBSA9CJkEU_JHXHXzR3w'; // ← ВСТАВЬТЕ!
$project_id = 'ваш-project-id'; // ← ВСТАВЬТЕ!
$url = "https://mute-brook-8e1e.lysakov-kolyan.workers.dev/gemini/v1beta/models/{$model}:generateContent?key={$api_key}";
$data = [
'contents' => [['parts' => [['text' => $message]]]],
'generationConfig' => ['temperature' => 0.7, 'maxOutputTokens' => 2048]
];
$ch = curl_init($url);
$opts = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_TIMEOUT => 120,
CURLOPT_SSL_VERIFYPEER => false
];
if (USE_PROXY) $opts[CURLOPT_PROXY] = PROXY_URL;
curl_setopt_array($ch, $opts);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
echo json_encode([
'success' => $code === 200,
'provider' => 'Gemini (Cloud Console)',
'model' => $model,
'response' => $result['candidates'][0]['content']['parts'][0]['text'] ?? '',
'error' => $result['error']['message'] ?? null
]);
### ФАЙЛ: qwen.php
--------------------------------------------------------------------------------
'No message']); exit; }
$api_key = 'sk-ws-H.DMIIHXY.tU97.MEUCIQDDbAVLAJV5HrdPcrPIDOEfhE-99zbM7Ho1PYZfVj90RgIgSyVJbIwHcFBye4FkvsR9rAEtER6ggbJKtYk8TOCrS9o';
$url = 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions';
$data = [
'model' => $model,
'messages' => [['role' => 'user', 'content' => $message]],
'temperature' => 0.7,
'max_tokens' => 4096
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $api_key,
'Content-Type: application/json'
],
CURLOPT_TIMEOUT => 120,
CURLOPT_SSL_VERIFYPEER => false
]);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
echo json_encode([
'success' => $code === 200,
'provider' => 'Qwen',
'model' => $model,
'response' => $result['choices'][0]['message']['content'] ?? '',
'error' => $result['message'] ?? null
]);
### ФАЙЛ: debug.php
--------------------------------------------------------------------------------
" . $e->getMessage() . "\n";
}
// 2. База данных
try {
require __DIR__ . '/db.php';
$pdo = db();
echo "[2] MySQL connect: OK\n";
$pdo->exec("INSERT INTO messages (session_id,role,content,provider,model) VALUES ('debug','user','test','debug','debug')");
echo "[2] MySQL insert: OK\n";
$n = $pdo->query("SELECT COUNT(*) c FROM messages")->fetch()['c'];
echo "[2] MySQL select: OK (rows: $n)\n";
$pdo->exec("DELETE FROM messages WHERE session_id='debug'");
echo "[2] MySQL delete: OK\n";
} catch (Throwable $e) {
echo "[2] MySQL: FAIL -> " . $e->getMessage() . "\n";
}
// 3. Сеть: OpenCode (бесплатная модель)
try {
$key = $config['providers']['opencode']['key'] ?? '';
$ch = curl_init('https://opencode.ai/zen/v1/chat/completions');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(['model' => 'ling-3.0-tiny-free', 'messages' => [['role' => 'user', 'content' => 'hi']], 'max_tokens' => 16]),
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $key, 'Content-Type: application/json'],
CURLOPT_TIMEOUT => 30,
]);
$res = curl_exec($ch);
if ($res === false) {
echo "[3] OpenCode: FAIL -> " . curl_error($ch) . "\n";
} else {
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "[3] OpenCode: HTTP $code -> " . substr($res, 0, 150) . "\n";
}
curl_close($ch);
} catch (Throwable $e) {
echo "[3] OpenCode: FAIL -> " . $e->getMessage() . "\n";
}
// 4. Сеть: Yandex
try {
$key = $config['providers']['yandex']['key'] ?? '';
$uri = $config['providers']['yandex']['models'][0][0] ?? '';
$ch = curl_init('https://llm.api.cloud.yandex.net/foundationModels/v1/completion');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(['modelUri' => $uri, 'completionOptions' => ['stream' => false, 'maxTokens' => '16'], 'messages' => [['role' => 'user', 'text' => 'hi']]]),
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $key, 'Content-Type: application/json'],
CURLOPT_TIMEOUT => 30,
]);
$res = curl_exec($ch);
if ($res === false) {
echo "[4] Yandex: FAIL -> " . curl_error($ch) . "\n";
} else {
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "[4] Yandex: HTTP $code -> " . substr($res, 0, 150) . "\n";
}
curl_close($ch);
} catch (Throwable $e) {
echo "[4] Yandex: FAIL -> " . $e->getMessage() . "\n";
}
echo "\nГотово. Пришлите этот текст.\n";
### ФАЙЛ: gigachat.php
--------------------------------------------------------------------------------
'No message']); exit; }
$client_id = '019fe682-6c06-7ffc-b15b-368f446216d1';
$auth_key = 'MDE5ZmU2ODItNmMwNi03ZmZjLWIxNWItMzY4ZjQ0NjIxNmQxOjM4Mjk0Y2RkLTZmNGQtNGM5MC1iN2VhLWJjNTlkNjNhNTUzMw==';
$scope = 'GIGACHAT_API_PERS';
// Шаг 1: получаем OAuth-токен
$basic = base64_encode($client_id . ':' . $auth_key);
$ch = curl_init('https://ngw.devices.sberbank.ru:9443/api/v2/oauth');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['scope' => $scope]),
CURLOPT_HTTPHEADER => [
'Authorization: Basic ' . $basic,
'Content-Type: application/x-www-form-urlencoded',
'Accept: application/json'
],
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_TIMEOUT => 30
]);
$token_resp = curl_exec($ch);
curl_close($ch);
$token_data = json_decode($token_resp, true);
if (!isset($token_data['access_token'])) {
echo json_encode(['error' => 'OAuth fail', 'details' => $token_data]);
exit;
}
$access_token = $token_data['access_token'];
// Шаг 2: отправляем запрос в чат
$ch = curl_init('https://gigachat.devices.sberbank.ru/api/v1/chat/completions');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode([
'model' => $model,
'messages' => [['role' => 'user', 'content' => $message]],
'temperature' => 0.7,
'max_tokens' => 2048,
'stream' => false
]),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $access_token,
'Content-Type: application/json',
'Accept: application/json'
],
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_TIMEOUT => 120
]);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
echo json_encode([
'success' => $code === 200,
'provider' => 'GigaChat',
'model' => $model,
'response' => $result['choices'][0]['message']['content'] ?? '',
'error' => $result['error'] ?? null
]);
### ФАЙЛ: openai.php
--------------------------------------------------------------------------------
'No message']); exit; }
$api_key = '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';
$url = 'https://mute-brook-8e1e.lysakov-kolyan.workers.dev/openai/v1/chat/completions';
$data = [
'model' => $model,
'messages' => [['role' => 'user', 'content' => $message]],
'max_tokens' => 4096
];
$ch = curl_init($url);
$opts = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $api_key,
'Content-Type: application/json'
],
CURLOPT_TIMEOUT => 120,
CURLOPT_SSL_VERIFYPEER => false
];
if (USE_PROXY) $opts[CURLOPT_PROXY] = PROXY_URL;
curl_setopt_array($ch, $opts);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
echo json_encode([
'success' => $code === 200,
'provider' => 'OpenAI',
'model' => $model,
'response' => $result['choices'][0]['message']['content'] ?? '',
'error' => $result['error']['message'] ?? null
]);
### ФАЙЛ: openrouter.php
--------------------------------------------------------------------------------
'No message']); exit; }
$api_key = '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';
$url = 'https://openrouter.ai/api/v1/chat/completions';
$data = [
'model' => $model,
'messages' => [['role' => 'user', 'content' => $message]]
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $api_key,
'Content-Type: application/json',
'HTTP-Referer: https://localhost',
'X-Title: AI Hub'
],
CURLOPT_TIMEOUT => 120,
CURLOPT_SSL_VERIFYPEER => false
]);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
echo json_encode([
'success' => $code === 200,
'provider' => 'OpenRouter',
'model' => $model,
'response' => $result['choices'][0]['message']['content'] ?? '',
'error' => $result['error']['message'] ?? null
]);
### ФАЙЛ: test.php
--------------------------------------------------------------------------------
🩺 Диагностика провайдеров";
foreach ($config['providers'] as $id => $p) {
$t0 = microtime(true);
$result = test_provider($p, $config['proxy']);
$dt = round(microtime(true) - $t0, 1);
echo sprintf("%-12s %-28s → %s (%ss)\n", $id, $p['name'], $result, $dt);
@ob_flush(); @flush();
}
echo "Готово. Если провайдер показывает ERROR/timeout — он недоступен с хостинга.
";
function test_provider($p, $proxy) {
$model = $p['models'][0];
try {
switch ($p['type']) {
case 'openai':
$h = ['Authorization: Bearer '.$p['key'], 'Content-Type: application/json'];
if (!empty($p['extra'])) $h = array_merge($h, $p['extra']);
$r = quick_post($p['url'], $h, ['model'=>$model,'messages'=>[['role'=>'user','content'=>'hi']],'max_tokens'=>5], $proxy);
return isset($r['choices']) ? '✅ OK' : '❌ '.substr(json_encode($r),0,150);
case 'gemini':
$url = str_replace('{model}', $model, $p['url']).'?key='.$p['key'];
$r = quick_post($url, ['Content-Type: application/json'], ['contents'=>[['parts'=>[['text'=>'hi']]]]], $proxy);
return isset($r['candidates']) ? '✅ OK' : '❌ '.substr(json_encode($r),0,150);
case 'gigachat':
$basic = base64_encode($p['client_id'].':'.$p['auth_key']);
$t = quick_post('https://ngw.devices.sberbank.ru:9443/api/v2/oauth',
['Authorization: Basic '.$basic,'Content-Type: application/x-www-form-urlencoded'],
['scope'=>$p['scope']], $proxy, true);
if (!isset($t['access_token'])) return '❌ токен не получен';
$r = quick_post($p['url'], ['Authorization: Bearer '.$t['access_token'],'Content-Type: application/json'],
['model'=>$model,'messages'=>[['role'=>'user','content'=>'hi']]], $proxy);
return isset($r['choices']) ? '✅ OK' : '❌ '.substr(json_encode($r),0,150);
case 'yandex':
$r = quick_post('https://llm.api.cloud.yandex.net/foundationModels/v1/completion',
['Authorization: Bearer '.$p['key'],'Content-Type: application/json'],
['modelUri'=>$model,'completionOptions'=>['maxTokens'=>'5'],'messages'=>[['role'=>'user','text'=>'hi']]], $proxy);
return isset($r['result']) ? '✅ OK' : '❌ '.substr(json_encode($r),0,150);
}
} catch (Exception $e) {
return '💀 ERROR: '.$e->getMessage();
}
}
function quick_post($url, $headers, $body, $proxy, $form = false) {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $form ? http_build_query($body) : json_encode($body),
CURLOPT_HTTPHEADER => $headers,
CURLOPT_TIMEOUT => 20, CURLOPT_CONNECTTIMEOUT => 10,
]);
if ($proxy) curl_setopt($ch, CURLOPT_PROXY, $proxy);
$res = curl_exec($ch);
if ($res === false) { $e = curl_error($ch); curl_close($ch); throw new Exception($e); }
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
if ($code >= 400) throw new Exception("HTTP $code: ".substr($res,0,150));
return json_decode($res, true);
}
### ФАЙЛ: db.php
--------------------------------------------------------------------------------
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
$schema = "CREATE TABLE IF NOT EXISTS messages (
id INT AUTO_INCREMENT PRIMARY KEY,
session_id VARCHAR(64) NOT NULL,
role VARCHAR(20) NOT NULL,
content LONGTEXT NOT NULL,
provider VARCHAR(50),
model VARCHAR(255),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_session (session_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
$pdo->exec($schema);
// САМОЧИНИЛКА: если таблица была с чужими колонками — пересоздаём
$cols = $pdo->query("SHOW COLUMNS FROM messages")->fetchAll(PDO::FETCH_COLUMN);
if (!in_array('session_id', $cols) || !in_array('content', $cols)) {
$pdo->exec("DROP TABLE messages");
$pdo->exec($schema);
}
} catch (Exception $e) {
throw new Exception('DB error: ' . $e->getMessage());
}
return $pdo;
}
### ФАЙЛ: config.php
--------------------------------------------------------------------------------
'', // пароль на вход, '' = без пароля
'proxy' => '', // не нужен — Worker заменяет прокси
'providers' => [
// ═══ 1. YANDEX (РФ ✅) ═══
'yandex' => [
'name' => 'YandexGPT',
'type' => 'yandex',
'key' => 'AQVN1znekXUo4dmZVNrU1KbTM9cDygfeku8A2F4w',
'models' => [
['gpt://b1ghkoj6im13k78igkut/yandexgpt-5-lite/latest', 'YandexGPT 5 Lite'],
['gpt://b1ghkoj6im13k78igkut/yandexgpt-5-pro/latest', 'YandexGPT 5 Pro'],
['gpt://b1ghkoj6im13k78igkut/yandexgpt-5.1/latest', 'YandexGPT 5.1'],
['gpt://b1ghkoj6im13k78igkut/aliceai-llm/latest', 'Alice AI'],
['gpt://b1ghkoj6im13k78igkut/aliceai-llm-flash/latest', 'Alice AI Flash'],
['gpt://b1ghkoj6im13k78igkut/deepseek-v4-flash/latest', 'DeepSeek V4 Flash'],
['gpt://b1ghkoj6im13k78igkut/qwen3-235b-a22b-fp8/latest', 'Qwen 3 235B'],
['gpt://b1ghkoj6im13k78igkut/qwen3.6-35b-a3b/latest', 'Qwen 3.6 35B'],
['gpt://b1ghkoj6im13k78igkut/gpt-oss-20b/latest', 'GPT OSS 20B'],
['gpt://b1ghkoj6im13k78igkut/gpt-oss-120b/latest', 'GPT OSS 120B'],
]
],
// ═══ 2. GIGACHAT / СБЕР (РФ ✅) ═══
'gigachat' => [
'name' => 'GigaChat',
'type' => 'gigachat',
'url' => 'https://gigachat.devices.sberbank.ru/api/v1/chat/completions',
'client_id' => '019fe682-6c06-7ffc-b15b-368f446216d1',
'auth_key' => 'MDE5ZmU2ODItNmMwNi03ZmZjLWIxNWItMzY4ZjQ0NjIxNmQxOjM4Mjk0Y2RkLTZmNGQtNGM5MC1iN2VhLWJjNTlkNjNhNTUzMw==',
'scope' => 'GIGACHAT_API_PERS',
'models' => [
['GigaChat-Lite', 'GigaChat Lite'],
['GigaChat', 'GigaChat Base'],
['GigaChat-Pro', 'GigaChat Pro'],
['GigaChat-Max', 'GigaChat Max'],
]
],
// ═══ 3. OPENCODE (только 9 FREE) ═══
'opencode' => [
'name' => 'OpenCode (FREE)',
'type' => 'openai',
'url' => 'https://opencode.ai/zen/v1/chat/completions',
'key' => 'sk-2udxr51mdS5lPkxYHFqDI75VhmEjbGxUwpVK3TyEINinArCTciOjfM49LnBdqCsg',
'models' => [
['ling-3.0-tiny-free', '🆓 Ling 3.0 Tiny'],
['ling-3.0-flash-free', '🆓 Ling 3.0 Flash'],
['deepseek-v4-flash-free', '🆓 DeepSeek V4 Flash'],
['mimo-v2.5-free', '🆓 MiMo V2.5'],
['nemotron-3-ultra-free', '🆓 Nemotron 3 Ultra'],
['laguna-s-2.1-free', '🆓 Laguna S 2.1'],
['longcat-2.0-free', '🆓 LongCat 2.0'],
['north-mini-code-free', '🆓 North Mini Code'],
['big-pickle', '🆓 Big Pickle'],
]
],
// ═══ 4. GROQ (самый быстрый ⚡) ══
'groq' => [
'name' => 'Groq (Llama 3)',
'type' => 'openai',
'url' => 'https://api.groq.com/openai/v1/chat/completions',
'key' => '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',
'models' => [
['llama-3.3-70b-versatile', 'Llama 3.3 70B'],
['llama-3.1-8b-instant', 'Llama 3.1 8B'],
['deepseek-r1-distill-llama-70b', 'DeepSeek R1 70B'],
['mixtral-8x7b-32768', 'Mixtral 8x7B'],
]
],
// ═══ 5. HUGGINGFACE (open-source) ═══
'hf' => [
'name' => 'HuggingFace',
'type' => 'openai',
'url' => 'https://router.huggingface.co/v1/chat/completions',
'key' => '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',
'models' => [
['meta-llama/Llama-3.3-70B-Instruct', 'Llama 3.3 70B'],
['mistralai/Mixtral-8x7B-Instruct-v0.1', 'Mixtral 8x7B'],
['Qwen/Qwen2.5-72B-Instruct', 'Qwen 2.5 72B'],
['deepseek-ai/DeepSeek-R1', 'DeepSeek R1'],
]
],
// ═══ 6. OPENROUTER (FREE модели) ═══
'openrouter' => [
'name' => 'OpenRouter (FREE)',
'type' => 'openai',
'url' => 'https://openrouter.ai/api/v1/chat/completions',
'key' => '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',
'extra'=> ['HTTP-Referer: https://localhost', 'X-Title: AI Hub'],
'models' => [
['deepseek/deepseek-v4-flash:free', 'DeepSeek V4 Flash'],
['xiaomi/mimo-v2.5:free', 'MiMo V2.5'],
['nvidia/nemotron-3-ultra:free', 'Nemotron 3 Ultra'],
['stealth/ling-3.0-tiny:free', 'Ling 3.0 Tiny'],
['stealth/ling-3.0-flash:free', 'Ling 3.0 Flash'],
['stealth/laguna-s-2.1:free', 'Laguna S 2.1'],
['stealth/longcat-2.0:free', 'LongCat 2.0'],
['stealth/big-pickle', 'Big Pickle'],
]
],
// ═══ 7. GEMINI через Worker (НОВЫЙ ключ из Cloud Console) ═══
'gemini' => [
'name' => 'Gemini (Worker)',
'type' => 'gemini',
'url' => 'https://green-limit-4736.ln003796.workers.dev/gemini/v1beta/models/{model}:generateContent',
'key' => 'AQ.Ab8RN6LxImFlfCNi6QOAkCPBu4TkBeyBSA9CJkEU_JHXHXzR3w',
'models' => [
['gemini-2.0-flash', 'Gemini 2.0 Flash'],
['gemini-2.5-flash', 'Gemini 2.5 Flash'],
['gemini-2.5-pro', 'Gemini 2.5 Pro'],
['gemini-2.0-flash-lite', 'Gemini 2.0 Flash Lite'],
['gemini-1.5-flash', 'Gemini 1.5 Flash'],
['gemini-1.5-pro', 'Gemini 1.5 Pro'],
]
],
// ═══ 8. OPENAI через Worker ═══
'openai' => [
'name' => 'OpenAI (Worker)',
'type' => 'openai',
'url' => 'https://green-limit-4736.ln003796.workers.dev/openai/v1/chat/completions',
'key' => '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',
'models' => [
['gpt-4o', 'GPT-4o'],
['gpt-4o-mini', 'GPT-4o Mini'],
['chatgpt-4o-latest', 'ChatGPT-4o Latest'],
['o1-preview', 'o1-preview'],
['o1-mini', 'o1-mini'],
]
],
// ═══ 9. ANTHROPIC через Worker ═══
'anthropic' => [
'name' => 'Claude (Worker)',
'type' => 'anthropic',
'url' => 'https://green-limit-4736.ln003796.workers.dev/anthropic/v1/messages',
'key' => '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',
'models' => [
['claude-sonnet-4-5', 'Claude Sonnet 4.5'],
['claude-opus-4-5', 'Claude Opus 4.5'],
['claude-haiku-4-5', 'Claude Haiku 4.5'],
['claude-3-5-sonnet-20241022', 'Claude 3.5 Sonnet'],
]
],
// ═══ 10. XAI / GROK через Worker ═══
'xai' => [
'name' => 'Grok (Worker)',
'type' => 'openai',
'url' => 'https://green-limit-4736.ln003796.workers.dev/xai/v1/chat/completions',
'key' => 'xai-mCUE2nQaf6jWWx0mnmuB2bhPhGPzjFRtcUk0G2r1sMQqCYbBXvLthOMq9faTE5TR3SVkXM8x5ILxyVOj',
'models' => [
['grok-3-latest', 'Grok 3'],
['grok-3-mini-latest', 'Grok 3 Mini'],
['grok-2-latest', 'Grok 2'],
['grok-2-mini-latest', 'Grok 2 Mini'],
]
],
// ═══ 11. DEEPSEEK (прямой; баланс кончился — пополнить $1) ═══
'deepseek' => [
'name' => 'DeepSeek (прямой)',
'type' => 'openai',
'url' => 'https://api.deepseek.com/chat/completions',
'key' => 'sk-315975d7c3b24b24ad5e3bafc8ad06fd',
'models' => [
['deepseek-chat', 'DeepSeek V3'],
['deepseek-reasoner', 'DeepSeek R1'],
]
],
// ═══ 12. QWEN (прямой; ключ отозван — пересоздать) ═══
'qwen' => [
'name' => 'Qwen Cloud (прямой)',
'type' => 'openai',
'url' => 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions',
'key' => 'sk-ws-H.DMIIHXY.tU97.MEUCIQDDbAVLAJV5HrdPcrPIDOEfhE-99zbM7Ho1PYZfVj90RgIgSyVJbIwHcFBye4FkvsR9rAEtER6ggbJKtYk8TOCrS9o',
'models' => [
['qwen-turbo', 'Qwen Turbo'],
['qwen-plus', 'Qwen Plus'],
['qwen-max', 'Qwen Max'],
['qwen-long', 'Qwen Long'],
['qwq-32b', 'QwQ 32B'],
['qwen3-235b-a22b', 'Qwen3 235B'],
['qwen2.5-coder-32b-instruct', 'Qwen 2.5 Coder 32B'],
['qwen-vl-max', 'Qwen VL Max (зрение)'],
]
],
// ═══ 13. CLOUDFLARE (впишите ACCOUNT_ID из дашборда CF) ═══
'cloudflare' => [
'name' => 'Cloudflare AI',
'type' => 'openai',
'url' => 'https://api.cloudflare.com/client/v4/accounts/ВАШ_ACCOUNT_ID/ai/v1/chat/completions',
'key' => 'cfut_cvFZVcpeXNnTOKDFkNoYbrOhQy0sCRNQHhIDmgK5beb303fd',
'models' => [
['@cf/meta/llama-3.3-70b-instruct-fp8-fast', 'Llama 3.3 70B'],
['@cf/meta/llama-3.1-8b-instruct', 'Llama 3.1 8B'],
['@cf/mistralai/mistral-7b-instruct', 'Mistral 7B'],
['@cf/qwen/qwen2.5-coder-32b-instruct', 'Qwen 2.5 Coder'],
]
],
],
];
### ФАЙЛ: cloudflare.php
--------------------------------------------------------------------------------
'No message']); exit; }
$api_key = 'cfut_cvFZVcpeXNnTOKDFkNoYbrOhQy0sCRNQHhIDmgK5beb303fd';
$account_id = 'ВАШ_ACCOUNT_ID'; // ← ВСТАВЬТЕ из дашборда CF (справа сверху)!
$url = "https://api.cloudflare.com/client/v4/accounts/{$account_id}/ai/v1/chat/completions";
$data = [
'model' => $model,
'messages' => [['role' => 'user', 'content' => $message]],
'max_tokens' => 2048
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $api_key,
'Content-Type: application/json'
],
CURLOPT_TIMEOUT => 120,
CURLOPT_SSL_VERIFYPEER => false
]);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
echo json_encode([
'success' => $code === 200,
'provider' => 'Cloudflare AI',
'model' => $model,
'response' => $result['result']['response'] ?? $result['choices'][0]['message']['content'] ?? '',
'error' => $result['errors'][0]['message'] ?? null
]);
### ФАЙЛ: groq.php
--------------------------------------------------------------------------------
'No message']); exit; }
$api_key = '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';
$url = 'https://api.groq.com/openai/v1/chat/completions';
$data = [
'model' => $model,
'messages' => [['role' => 'user', 'content' => $message]],
'max_tokens' => 4096,
'temperature' => 0.7
];
$ch = curl_init($url);
$opts = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $api_key,
'Content-Type: application/json'
],
CURLOPT_TIMEOUT => 60,
CURLOPT_SSL_VERIFYPEER => false
];
if (USE_PROXY) $opts[CURLOPT_PROXY] = PROXY_URL;
curl_setopt_array($ch, $opts);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
echo json_encode([
'success' => $code === 200,
'provider' => 'Groq',
'model' => $model,
'response' => $result['choices'][0]['message']['content'] ?? '',
'error' => $result['error']['message'] ?? null
]);
### ФАЙЛ: assets/app.js
--------------------------------------------------------------------------------
const $ = s => document.querySelector(s);
let session = localStorage.getItem('sid');
if (!session) { session = 's' + Date.now(); localStorage.setItem('sid', session); }
const esc = s => String(s).replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
let DATA = {};
function findLabel(pid, id) {
if (DATA[pid]) {
const m = DATA[pid].models.find(x => x.id === id);
if (m) return m.label;
}
return id;
}
function addMsg(role, text, meta) {
const d = document.createElement('div');
d.className = 'msg ' + role;
const content = document.createElement('div');
content.className = 'content';
content.innerHTML = esc(text);
d.appendChild(content);
if (meta) {
const m = document.createElement('span');
m.className = 'meta';
m.textContent = meta;
d.appendChild(m);
}
$('#chat').appendChild(d);
$('#chat').scrollTop = 1e9;
return content;
}
async function init() {
DATA = await (await fetch('api.php?action=models')).json();
const p = $('#provider'), m = $('#model');
for (const [id, v] of Object.entries(DATA)) {
const o = document.createElement('option');
o.value = id;
o.textContent = v.name;
p.appendChild(o);
}
const fill = () => {
m.innerHTML = '';
DATA[p.value].models.forEach(item => {
const o = document.createElement('option');
o.value = item.id;
o.textContent = item.label;
m.appendChild(o);
});
};
p.onchange = fill;
fill();
const hist = await (await fetch('api.php?action=history&session=' + session)).json();
hist.forEach(h => addMsg(h.role, h.content, h.provider + ' / ' + findLabel(h.provider, h.model)));
}
async function send() {
const text = $('#msg').value.trim();
if (!text) return;
$('#msg').value = '';
$('#send').disabled = true;
const pid = $('#provider').value;
const mid = $('#model').value;
addMsg('user', text);
const assistant = addMsg('assistant', '⏳ жду ответ...', pid + ' / ' + findLabel(pid, mid));
const ctrl = new AbortController();
const watchdog = setTimeout(() => ctrl.abort(), 120000);
try {
const res = await fetch('api.php?action=chat', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
signal: ctrl.signal,
body: JSON.stringify({ session, provider: pid, model: mid, message: text })
});
clearTimeout(watchdog);
const raw = await res.text();
let d;
try { d = JSON.parse(raw); }
catch (e) {
assistant.parentElement.className = 'msg error';
assistant.innerHTML = '❌ Сервер вернул не JSON:
' + esc(raw.slice(0, 400));
$('#send').disabled = false;
return;
}
if (d.error) {
assistant.parentElement.className = 'msg error';
assistant.innerHTML = '❌ ' + esc(d.error);
} else {
assistant.innerHTML = esc(d.reply);
}
} catch (e) {
clearTimeout(watchdog);
assistant.parentElement.className = 'msg error';
assistant.innerHTML = (e.name === 'AbortError')
? '❌ Таймаут 120с — модель слишком долго думает или сервер недоступен'
: '❌ ' + esc(e.message);
}
$('#send').disabled = false;
$('#chat').scrollTop = 1e9;
}
$('#send').onclick = send;
$('#msg').addEventListener('keydown', e => { if (e.key === 'Enter' && !$('#send').disabled) send(); });
init();
### ФАЙЛ: assets/style.css
--------------------------------------------------------------------------------
* { box-sizing: border-box; margin: 0; }
body { background: #0f1220; color: #e8eaf6; font: 15px/1.5 system-ui, sans-serif; }
.wrap { max-width: 860px; margin: 0 auto; height: 100vh; display: flex; flex-direction: column; padding: 12px; }
header { display: flex; gap: 8px; align-items: center; padding: 8px 0; flex-wrap: wrap; }
header h1 { font-size: 18px; margin-right: auto; }
select, input, button { background: #1b2036; color: #e8eaf6; border: 1px solid #2c3352; border-radius: 8px; padding: 9px 12px; font-size: 14px; }
button { background: #4f6df5; border: none; cursor: pointer; }
button:hover { background: #3d5be0; }
button:disabled { background: #2c3352; cursor: not-allowed; }
#chat { flex: 1; overflow-y: auto; padding: 12px 4px; display: flex; flex-direction: column; gap: 10px; }
.msg { max-width: 82%; padding: 10px 14px; border-radius: 12px; white-space: pre-wrap; word-break: break-word; }
.msg.user { align-self: flex-end; background: #27407c; }
.msg.assistant { align-self: flex-start; background: #1e2440; border: 1px solid #2c3352; }
.msg.error { align-self: center; background: #5c1a2a; color: #ffb3c0; }
.msg .meta { display: block; font-size: 11px; opacity: .55; margin-top: 6px; }
.input-row { display: flex; gap: 8px; padding-top: 10px; }
.input-row input { flex: 1; }
.login-page { display: flex; align-items: center; justify-content: center; height: 100vh; }
.login-box { display: flex; flex-direction: column; gap: 10px; background: #1b2036; padding: 26px; border-radius: 14px; }
.error { color: #ff8fa3; font-size: 13px; }
### ФАЙЛ: deepseek.php
--------------------------------------------------------------------------------
'No message']); exit;
}
$api_key = 'sk-315975d7c3b24b24ad5e3bafc8ad06fd';
$url = 'https://api.deepseek.com/chat/completions';
$data = [
'model' => $model,
'messages' => [['role' => 'user', 'content' => $message]],
'temperature' => 0.7,
'max_tokens' => 4096
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $api_key,
'Content-Type: application/json'
],
CURLOPT_TIMEOUT => 120,
CURLOPT_SSL_VERIFYPEER => false
]);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
if ($code !== 200) {
echo json_encode(['error' => 'API ' . $code, 'details' => $result]);
exit;
}
echo json_encode([
'success' => true,
'provider' => 'DeepSeek',
'model' => $model,
'response' => $result['choices'][0]['message']['content'] ?? ''
]);
### ФАЙЛ: api.php
--------------------------------------------------------------------------------
'PHP FATAL: '.$e['message']], JSON_UNESCAPED_UNICODE);
}
});
session_start();
header('Content-Type: application/json; charset=utf-8');
$config = require __DIR__ . '/config.php';
require __DIR__ . '/db.php';
function safe_db() {
try { return db(); } catch (Exception $e) { return null; }
}
$action = $_GET['action'] ?? 'chat';
if ($action === 'ping') {
$dbok = 'ok';
try { db(); } catch (Exception $e) { $dbok = $e->getMessage(); }
echo json_encode(['php' => PHP_VERSION, 'curl' => function_exists('curl_init'), 'db' => $dbok,
'providers' => array_keys($config['providers'])], JSON_UNESCAPED_UNICODE);
exit;
}
if ($action === 'models') {
$out = [];
foreach ($config['providers'] as $id => $p) {
$list = [];
foreach ($p['models'] as $m) {
if (is_array($m)) $list[] = ['id' => $m[0], 'label' => $m[1]];
else $list[] = ['id' => $m, 'label' => $m];
}
$out[$id] = ['name' => $p['name'], 'models' => $list];
}
echo json_encode($out, JSON_UNESCAPED_UNICODE);
exit;
}
if ($action === 'history') {
try {
$db = safe_db();
if (!$db) { echo '[]'; exit; }
$st = $db->prepare("SELECT role, content, provider, model FROM messages WHERE session_id=? ORDER BY id ASC LIMIT 300");
$st->execute([$_GET['session'] ?? '']);
echo json_encode($st->fetchAll(PDO::FETCH_ASSOC), JSON_UNESCAPED_UNICODE);
} catch (Exception $e) {
echo json_encode(['error' => $e->getMessage()], JSON_UNESCAPED_UNICODE);
}
exit;
}
try {
$in = json_decode(file_get_contents('php://input'), true);
$sid = $in['session'] ?? '';
$pid = $in['provider'] ?? '';
$model = $in['model'] ?? '';
$msg = trim($in['message'] ?? '');
if (!$msg || !isset($config['providers'][$pid])) {
http_response_code(400);
echo json_encode(['error' => 'bad request'], JSON_UNESCAPED_UNICODE);
exit;
}
$p = $config['providers'][$pid];
$db = safe_db();
if ($db) $db->prepare("INSERT INTO messages (session_id,role,content,provider,model) VALUES (?,?,?,?,?)")
->execute([$sid, 'user', $msg, $pid, $model]);
$history = [['role' => 'user', 'content' => $msg]];
if ($db) {
$st = $db->prepare("SELECT role, content FROM messages WHERE session_id=? ORDER BY id DESC LIMIT 10");
$st->execute([$sid]);
$rows = array_reverse($st->fetchAll(PDO::FETCH_ASSOC));
if ($rows) $history = $rows;
}
$reply = call_llm($p, $model, $history, $config['proxy']);
if ($db) $db->prepare("INSERT INTO messages (session_id,role,content,provider,model) VALUES (?,?,?,?,?)")
->execute([$sid, 'assistant', $reply, $pid, $model]);
echo json_encode(['reply' => $reply], JSON_UNESCAPED_UNICODE);
} catch (Exception $e) {
http_response_code(502);
echo json_encode(['error' => $e->getMessage()], JSON_UNESCAPED_UNICODE);
}
function call_llm($p, $model, $history, $proxy) {
$msgs = [];
foreach ($history as $m) $msgs[] = ['role' => $m['role'], 'content' => $m['content']];
switch ($p['type']) {
case 'openai':
$h = ['Authorization: Bearer '.$p['key'], 'Content-Type: application/json', 'User-Agent: '.UA];
if (!empty($p['extra'])) $h = array_merge($h, $p['extra']);
$ch = curl_init($p['url']);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(['model' => $model, 'messages' => $msgs, 'max_tokens' => 4096]),
CURLOPT_HTTPHEADER => $h, CURLOPT_TIMEOUT => 300, CURLOPT_CONNECTTIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => 0,
]);
if ($proxy) curl_setopt($ch, CURLOPT_PROXY, $proxy);
$res = curl_exec($ch);
if ($res === false) { $e = curl_error($ch); curl_close($ch); throw new Exception("curl: $e"); }
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
$data = json_decode($res, true);
if ($code >= 400) throw new Exception("API $code: ".($data['error']['message'] ?? substr($res, 0, 200)));
return $data['choices'][0]['message']['content'] ?? '(нет ответа)';
// ─── YANDEX OpenAI-совместимый API (для Alice AI Flash, Qwen 3 235B) ───
case 'yandex_openai':
$ch = curl_init('https://llm.api.cloud.yandex.net/v1/chat/completions');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(['model' => $model, 'messages' => $msgs, 'max_tokens' => 4096]),
CURLOPT_HTTPHEADER => ['Authorization: Bearer '.$p['key'], 'Content-Type: application/json', 'User-Agent: '.UA],
CURLOPT_TIMEOUT => 300, CURLOPT_CONNECTTIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => false,
]);
if ($proxy) curl_setopt($ch, CURLOPT_PROXY, $proxy);
$res = curl_exec($ch);
if ($res === false) { $e = curl_error($ch); curl_close($ch); throw new Exception("curl: $e"); }
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
$data = json_decode($res, true);
if ($code >= 400) throw new Exception("API $code: ".($data['error']['message'] ?? substr($res, 0, 200)));
return $data['choices'][0]['message']['content'] ?? '(нет ответа)';
case 'gemini':
$contents = [];
foreach ($history as $m) {
$contents[] = ['role' => $m['role'] === 'assistant' ? 'model' : 'user', 'parts' => [['text' => $m['content']]]];
}
$url = str_replace('{model}', $model, $p['url']).'?key='.$p['key'];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(['contents' => $contents]),
CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'User-Agent: '.UA],
CURLOPT_TIMEOUT => 300, CURLOPT_CONNECTTIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => false,
]);
if ($proxy) curl_setopt($ch, CURLOPT_PROXY, $proxy);
$res = curl_exec($ch);
if ($res === false) { $e = curl_error($ch); curl_close($ch); throw new Exception("curl: $e"); }
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
$data = json_decode($res, true);
if ($code >= 400) throw new Exception("API $code: ".($data['error']['message'] ?? substr($res, 0, 200)));
return $data['candidates'][0]['content']['parts'][0]['text'] ?? '(нет ответа)';
case 'anthropic':
$am = [];
foreach ($history as $m) {
if ($m['role'] !== 'system') $am[] = ['role' => $m['role'], 'content' => $m['content']];
}
$ch = curl_init($p['url']);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(['model' => $model, 'messages' => $am, 'max_tokens' => 4096]),
CURLOPT_HTTPHEADER => ['x-api-key: '.$p['key'], 'anthropic-version: 2023-06-01', 'Content-Type: application/json', 'User-Agent: '.UA],
CURLOPT_TIMEOUT => 300, CURLOPT_CONNECTTIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => false,
]);
if ($proxy) curl_setopt($ch, CURLOPT_PROXY, $proxy);
$res = curl_exec($ch);
if ($res === false) { $e = curl_error($ch); curl_close($ch); throw new Exception("curl: $e"); }
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
$data = json_decode($res, true);
if ($code >= 400) throw new Exception("API $code: ".($data['error']['message'] ?? substr($res, 0, 200)));
return $data['content'][0]['text'] ?? '(нет ответа)';
case 'gigachat':
$basic = base64_encode($p['client_id'].':'.$p['auth_key']);
$ch = curl_init('https://ngw.devices.sberbank.ru:9443/api/v2/oauth');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['scope' => $p['scope']]),
CURLOPT_HTTPHEADER => ['Authorization: Basic '.$basic, 'Content-Type: application/x-www-form-urlencoded', 'User-Agent: '.UA],
CURLOPT_TIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => false, // ← ОБХОД SSL
CURLOPT_SSL_VERIFYHOST => 0,
]);
if ($proxy) curl_setopt($ch, CURLOPT_PROXY, $proxy);
$tres = curl_exec($ch);
if ($tres === false) { $e = curl_error($ch); curl_close($ch); throw new Exception("curl oauth: $e"); }
curl_close($ch);
$t = json_decode($tres, true);
if (!$t || !isset($t['access_token'])) throw new Exception('GigaChat: не получен токен: '.substr($tres, 0, 200));
$ch = curl_init($p['url']);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(['model' => $model, 'messages' => $msgs]),
CURLOPT_HTTPHEADER => ['Authorization: Bearer '.$t['access_token'], 'Content-Type: application/json', 'User-Agent: '.UA],
CURLOPT_TIMEOUT => 300, CURLOPT_CONNECTTIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => false, // ← ОБХОД SSL
CURLOPT_SSL_VERIFYHOST => 0,
]);
if ($proxy) curl_setopt($ch, CURLOPT_PROXY, $proxy);
$res = curl_exec($ch);
if ($res === false) { $e = curl_error($ch); curl_close($ch); throw new Exception("curl: $e"); }
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
$data = json_decode($res, true);
if ($code >= 400) throw new Exception("API $code: ".($data['error']['message'] ?? substr($res, 0, 200)));
return $data['choices'][0]['message']['content'] ?? '(нет ответа)';
case 'yandex':
$ym = [];
foreach ($history as $m) {
$ym[] = ['role' => $m['role'] === 'assistant' ? 'assistant' : 'user', 'text' => $m['content']];
}
$ch = curl_init('https://llm.api.cloud.yandex.net/foundationModels/v1/completion');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode([
'modelUri' => $model,
'completionOptions' => ['stream' => false, 'temperature' => 0.7, 'maxTokens' => '2048'],
'messages' => $ym,
]),
CURLOPT_HTTPHEADER => ['Authorization: Bearer '.$p['key'], 'Content-Type: application/json', 'User-Agent: '.UA],
CURLOPT_TIMEOUT => 300, CURLOPT_CONNECTTIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => false,
]);
if ($proxy) curl_setopt($ch, CURLOPT_PROXY, $proxy);
$res = curl_exec($ch);
if ($res === false) { $e = curl_error($ch); curl_close($ch); throw new Exception("curl: $e"); }
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
$data = json_decode($res, true);
if ($code >= 400) throw new Exception("API $code: ".($data['message'] ?? substr($res, 0, 200)));
return $data['result']['alternatives'][0]['message']['text'] ?? '(нет ответа)';
}
throw new Exception('unknown provider type: '.$p['type']);
}
### ФАЙЛ: opencode.php
--------------------------------------------------------------------------------
'No message']); exit; }
$api_key = 'sk-2udxr51mdS5lPkxYHFqDI75VhmEjbGxUwpVK3TyEINinArCTciOjfM49LnBdqCsg';
$url = 'https://opencode.ai/zen/v1/chat/completions';
$data = [
'model' => $model,
'messages' => [['role' => 'user', 'content' => $message]],
'max_tokens' => 4096
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $api_key,
'Content-Type: application/json',
'User-Agent: Mozilla/5.0'
],
CURLOPT_TIMEOUT => 120,
CURLOPT_SSL_VERIFYPEER => false
]);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
echo json_encode([
'success' => $code === 200,
'provider' => 'OpenCode',
'model' => $model,
'response' => $result['choices'][0]['message']['content'] ?? '',
'error' => $result['error']['message'] ?? null
]);
### ФАЙЛ: huggingface.php
--------------------------------------------------------------------------------
'No message']); exit; }
$api_key = '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';
$url = 'https://mute-brook-8e1e.lysakov-kolyan.workers.dev/openai/v1/chat/completions';
$data = [
'model' => $model,
'messages' => [['role' => 'user', 'content' => $message]],
'max_tokens' => 2048
];
$ch = curl_init($url);
$opts = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $api_key,
'Content-Type: application/json'
],
CURLOPT_TIMEOUT => 120,
CURLOPT_SSL_VERIFYPEER => false
];
if (USE_PROXY) $opts[CURLOPT_PROXY] = PROXY_URL;
curl_setopt_array($ch, $opts);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
echo json_encode([
'success' => $code === 200,
'provider' => 'HuggingFace',
'model' => $model,
'response' => $result['choices'][0]['message']['content'] ?? '',
'error' => $result['error']['message'] ?? null
]);
### ФАЙЛ: test_all.php
--------------------------------------------------------------------------------
🔍 Тест всех API";
echo "";
foreach ($apis as $file) {
echo "📡 {$file}
";
$ch = curl_init("http://localhost/{$file}");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(['message' => 'привет, ответь одним словом']),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_TIMEOUT => 60
]);
$resp = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($resp, true);
if ($data && !empty($data['success'])) {
echo "✅ OK
";
echo "" . htmlspecialchars(substr($data['response'], 0, 200)) . "
";
} else {
echo "❌ FAIL (HTTP {$code})
";
echo "" . htmlspecialchars(substr($resp, 0, 300)) . "
";
}
ob_flush(); flush();
}
### ФАЙЛ: gemini.php
--------------------------------------------------------------------------------
'No message']); exit; }
$api_key = 'AQ.Ab8RN6JWt-C7BOFCcsC8MzbMCYgE_LqToN5UBH1U9QncttWP-Q';
$url = "https://mute-brook-8e1e.lysakov-kolyan.workers.dev/gemini/v1beta/models/{$model}:generateContent?key={$api_key}";
// Специфичный для Gemini формат!
$data = [
'contents' => [
['parts' => [['text' => $message]]]
],
'generationConfig' => [
'temperature' => 0.7,
'maxOutputTokens' => 2048
]
];
$ch = curl_init($url);
$opts = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_TIMEOUT => 120,
CURLOPT_SSL_VERIFYPEER => false
];
if (USE_PROXY) $opts[CURLOPT_PROXY] = PROXY_URL;
curl_setopt_array($ch, $opts);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
echo json_encode([
'success' => $code === 200,
'provider' => 'Gemini (AI Studio)',
'model' => $model,
'response' => $result['candidates'][0]['content']['parts'][0]['text'] ?? '',
'error' => $result['error']['message'] ?? null
]);
### ФАЙЛ: xai.php
--------------------------------------------------------------------------------
'No message']); exit; }
$api_key = 'xai-mCUE2nQaf6jWWx0mnmuB2bhPhGPzjFRtcUk0G2r1sMQqCYbBXvLthOMq9faTE5TR3SVkXM8x5ILxyVOj';
$url = 'https://mute-brook-8e1e.lysakov-kolyan.workers.dev/xai/v1/chat/completions';
$data = [
'model' => $model,
'messages' => [['role' => 'user', 'content' => $message]],
'max_tokens' => 4096
];
$ch = curl_init($url);
$opts = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $api_key,
'Content-Type: application/json'
],
CURLOPT_TIMEOUT => 120,
CURLOPT_SSL_VERIFYPEER => false
];
if (USE_PROXY) $opts[CURLOPT_PROXY] = PROXY_URL;
curl_setopt_array($ch, $opts);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$err = curl_error($ch);
curl_close($ch);
if ($err) { echo json_encode(['error' => 'CURL: ' . $err]); exit; }
$result = json_decode($response, true);
echo json_encode([
'success' => $code === 200,
'provider' => 'xAI Grok',
'model' => $model,
'response' => $result['choices'][0]['message']['content'] ?? '',
'error' => $result['error']['message'] ?? null
]);