=== СТРУКТУРА ПРОЕКТА === 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 --------------------------------------------------------------------------------

🔒 Вход

$err

"; ?>
AI Hub

🤖 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 ]);