Добавить поддержку Kimi K2.6 (Moonshot AI) и улучшить проверку API ключей
- Новая функция claude_kimi: Anthropic-совместимый API Moonshot AI - Улучшена проверка ключей DeepSeek и Kimi: реальный вызов API с 1 токеном вместо GET /v1/models (бесплатный endpoint не ловил заблокированные аккаунты) - Проверка различает: 200 (OK), 429 (заблокирован/нет средств), 401/403 (невалидный ключ), сетевые ошибки - При блокировке (429) выводится сообщение об ошибке и ссылка на пополнение баланса, ключ не сохраняется - Обновлён README.md Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
# Claude Code Launcher
|
# Claude Code Launcher
|
||||||
|
|
||||||
Скрипт `claude_setup.sh` предназначен для автоматизации установки и настройки `Claude Code` вместе с прокси-серверами для доступа к различным LLM (Anthropic, ChatGPT, DeepSeek, Gemini).
|
Скрипт `claude_setup.sh` предназначен для автоматизации установки и настройки `Claude Code` вместе с прокси-серверами для доступа к различным LLM (Anthropic, ChatGPT, DeepSeek, Kimi, Gemini).
|
||||||
|
|
||||||
## Что делает скрипт
|
## Что делает скрипт
|
||||||
|
|
||||||
@@ -28,11 +28,12 @@ source ~/.bashrc
|
|||||||
* `claude_anthropic`: Оригинальный Claude (через API Anthropic).
|
* `claude_anthropic`: Оригинальный Claude (через API Anthropic).
|
||||||
* `claude_gpt`: Доступ к GPT-5.5 (требует авторизации через `claude-code-proxy`).
|
* `claude_gpt`: Доступ к GPT-5.5 (требует авторизации через `claude-code-proxy`).
|
||||||
* `claude_deepseek`: Доступ к DeepSeek (требуется API ключ).
|
* `claude_deepseek`: Доступ к DeepSeek (требуется API ключ).
|
||||||
|
* `claude_kimi`: Доступ к Kimi K2.6 от Moonshot AI (требуется API ключ).
|
||||||
* `claude_gemini`: Доступ к Gemini (требует авторизации через веб-интерфейс `antigravity-claude-proxy`).
|
* `claude_gemini`: Доступ к Gemini (требует авторизации через веб-интерфейс `antigravity-claude-proxy`).
|
||||||
|
|
||||||
## Важные замечания
|
## Важные замечания
|
||||||
|
|
||||||
* **Gemini**: Для работы с Gemini крайне рекомендуется использовать отдельный Google-аккаунт, чтобы избежать блокировок основного аккаунта из-за использования прокси.
|
* **Gemini**: Для работы с Gemini крайне рекомендуется использовать отдельный Google-аккаунт, чтобы избежать блокировок основного аккаунта из-за использования прокси.
|
||||||
* **Безопасность**:
|
* **Безопасность**:
|
||||||
* `deepseek_key` сохраняется в `~/.config/claude-launcher/deepseek_key` с правами доступа `600`.
|
* `deepseek_key` и `kimi_key` сохраняются в `~/.config/claude-launcher/` с правами доступа `600`.
|
||||||
* Скрипт проверяет, чтобы не запускаться от `root`.
|
* Скрипт проверяет, чтобы не запускаться от `root`.
|
||||||
|
|||||||
109
claude_setup.sh
109
claude_setup.sh
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# Claude Code Setup — Anthropic / GPT-5.5 / DeepSeek / Gemini
|
# Claude Code Setup — Anthropic / GPT-5.5 / DeepSeek / Kimi / Gemini
|
||||||
# Запуск: bash claude_setup.sh
|
# Запуск: bash claude_setup.sh
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
@@ -224,25 +224,43 @@ claude_deepseek() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Проверяю ключ..."
|
echo "Проверяю ключ и баланс..."
|
||||||
local http_code
|
local http_code http_body err_msg
|
||||||
http_code=$(curl -s -o /dev/null -w "%{http_code}" \
|
http_body=$(curl -s -w "\n%{http_code}" \
|
||||||
https://api.deepseek.com/v1/models \
|
https://api.deepseek.com/anthropic/v1/messages \
|
||||||
-H "Authorization: Bearer $api_key" 2>/dev/null || echo "000")
|
-H "Authorization: Bearer $api_key" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "anthropic-version: 2023-06-01" \
|
||||||
|
-d '{"model":"deepseek-v4-flash","max_tokens":1,"messages":[{"role":"user","content":"hi"}]}' 2>/dev/null || echo "000")
|
||||||
|
http_code=$(echo "$http_body" | tail -1)
|
||||||
|
http_body=$(echo "$http_body" | sed '$d')
|
||||||
|
|
||||||
if [ "$http_code" = "200" ]; then
|
if [ "$http_code" = "200" ]; then
|
||||||
mkdir -p "$(dirname "$key_file")"
|
mkdir -p "$(dirname "$key_file")"
|
||||||
echo "$api_key" > "$key_file"
|
echo "$api_key" > "$key_file"
|
||||||
chmod 600 "$key_file"
|
chmod 600 "$key_file"
|
||||||
echo "Ключ сохранён. В следующий раз вводить не нужно."
|
echo "Ключ действителен, баланс в порядке. Ключ сохранён."
|
||||||
elif [ "$http_code" = "000" ]; then
|
elif [ "$http_code" = "000" ]; then
|
||||||
echo "Не удалось проверить ключ (нет сети?). Сохраняю без проверки..."
|
echo "Не удалось проверить ключ (нет сети?). Сохраняю без проверки..."
|
||||||
mkdir -p "$(dirname "$key_file")"
|
mkdir -p "$(dirname "$key_file")"
|
||||||
echo "$api_key" > "$key_file"
|
echo "$api_key" > "$key_file"
|
||||||
chmod 600 "$key_file"
|
chmod 600 "$key_file"
|
||||||
else
|
elif [ "$http_code" = "429" ]; then
|
||||||
|
err_msg=$(echo "$http_body" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('error',{}).get('message',''))" 2>/dev/null || echo "")
|
||||||
|
echo ""
|
||||||
|
echo -e "\033[0;31m[ОШИБКА]\033[0m Ключ действителен, но аккаунт заблокирован."
|
||||||
|
echo " Причина: $err_msg"
|
||||||
|
echo " Пополните баланс: https://platform.deepseek.com/top_up"
|
||||||
|
echo " Ключ НЕ сохранён — сначала пополните счёт."
|
||||||
|
return 1
|
||||||
|
elif [ "$http_code" = "401" ] || [ "$http_code" = "403" ]; then
|
||||||
echo "Ключ недействителен (HTTP $http_code). Ключ не сохранён."
|
echo "Ключ недействителен (HTTP $http_code). Ключ не сохранён."
|
||||||
return 1
|
return 1
|
||||||
|
else
|
||||||
|
err_msg=$(echo "$http_body" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('error',{}).get('message',''))" 2>/dev/null || echo "$http_body")
|
||||||
|
echo "Ошибка API (HTTP $http_code): $err_msg"
|
||||||
|
echo "Ключ не сохранён."
|
||||||
|
return 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -257,6 +275,79 @@ claude_deepseek() {
|
|||||||
claude "$@"
|
claude "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ── claude_kimi ─────────────────────────────────────────────
|
||||||
|
claude_kimi() {
|
||||||
|
local key_file="$HOME/.config/claude-launcher/kimi_key"
|
||||||
|
local api_key=""
|
||||||
|
|
||||||
|
if [ -f "$key_file" ]; then
|
||||||
|
api_key=$(cat "$key_file")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$api_key" ]; then
|
||||||
|
echo ""
|
||||||
|
echo "Kimi (Moonshot AI) API ключ не найден."
|
||||||
|
echo "Получить ключ: https://platform.moonshot.ai/console/api-keys"
|
||||||
|
echo ""
|
||||||
|
read -r -p "Введите ваш Kimi API ключ (начинается с 'sk-'): " api_key
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ -z "$api_key" ]; then
|
||||||
|
echo "Ключ не введён. Выход."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Проверяю ключ и баланс..."
|
||||||
|
local http_code http_body err_msg
|
||||||
|
http_body=$(curl -s -w "\n%{http_code}" \
|
||||||
|
https://api.moonshot.ai/anthropic/v1/messages \
|
||||||
|
-H "Authorization: Bearer $api_key" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "anthropic-version: 2023-06-01" \
|
||||||
|
-d '{"model":"kimi-k2.6","max_tokens":1,"messages":[{"role":"user","content":"hi"}]}' 2>/dev/null || echo "000")
|
||||||
|
http_code=$(echo "$http_body" | tail -1)
|
||||||
|
http_body=$(echo "$http_body" | sed '$d')
|
||||||
|
|
||||||
|
if [ "$http_code" = "200" ]; then
|
||||||
|
mkdir -p "$(dirname "$key_file")"
|
||||||
|
echo "$api_key" > "$key_file"
|
||||||
|
chmod 600 "$key_file"
|
||||||
|
echo "Ключ действителен, баланс в порядке. Ключ сохранён."
|
||||||
|
elif [ "$http_code" = "000" ]; then
|
||||||
|
echo "Не удалось проверить ключ (нет сети?). Сохраняю без проверки..."
|
||||||
|
mkdir -p "$(dirname "$key_file")"
|
||||||
|
echo "$api_key" > "$key_file"
|
||||||
|
chmod 600 "$key_file"
|
||||||
|
elif [ "$http_code" = "429" ]; then
|
||||||
|
err_msg=$(echo "$http_body" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('error',{}).get('message',''))" 2>/dev/null || echo "")
|
||||||
|
echo ""
|
||||||
|
echo -e "\033[0;31m[ОШИБКА]\033[0m Ключ действителен, но аккаунт заблокирован."
|
||||||
|
echo " Причина: $err_msg"
|
||||||
|
echo " Пополните баланс: https://platform.moonshot.ai/console/billing"
|
||||||
|
echo " Ключ НЕ сохранён — сначала пополните счёт."
|
||||||
|
return 1
|
||||||
|
elif [ "$http_code" = "401" ] || [ "$http_code" = "403" ]; then
|
||||||
|
echo "Ключ недействителен (HTTP $http_code). Ключ не сохранён."
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
err_msg=$(echo "$http_body" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('error',{}).get('message',''))" 2>/dev/null || echo "$http_body")
|
||||||
|
echo "Ошибка API (HTTP $http_code): $err_msg"
|
||||||
|
echo "Ключ не сохранён."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
ANTHROPIC_BASE_URL=https://api.moonshot.ai/anthropic \
|
||||||
|
ANTHROPIC_AUTH_TOKEN="$api_key" \
|
||||||
|
ANTHROPIC_MODEL=kimi-k2.6 \
|
||||||
|
ANTHROPIC_DEFAULT_OPUS_MODEL=kimi-k2.6 \
|
||||||
|
ANTHROPIC_DEFAULT_SONNET_MODEL=kimi-k2.6 \
|
||||||
|
ANTHROPIC_DEFAULT_HAIKU_MODEL=kimi-k2.6 \
|
||||||
|
CLAUDE_CODE_SUBAGENT_MODEL=kimi-k2.6 \
|
||||||
|
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 \
|
||||||
|
claude "$@"
|
||||||
|
}
|
||||||
|
|
||||||
# ── claude_gemini ─────────────────────────────────────────────
|
# ── claude_gemini ─────────────────────────────────────────────
|
||||||
claude_gemini() {
|
claude_gemini() {
|
||||||
local acc_cmd=""
|
local acc_cmd=""
|
||||||
@@ -342,6 +433,7 @@ echo "Доступные команды:"
|
|||||||
echo -e " ${CYAN}claude_anthropic${NC} — оригинальный Claude (Anthropic API)"
|
echo -e " ${CYAN}claude_anthropic${NC} — оригинальный Claude (Anthropic API)"
|
||||||
echo -e " ${CYAN}claude_gpt${NC} — GPT-5.5 (ChatGPT Plus/Pro, браузерная авторизация)"
|
echo -e " ${CYAN}claude_gpt${NC} — GPT-5.5 (ChatGPT Plus/Pro, браузерная авторизация)"
|
||||||
echo -e " ${CYAN}claude_deepseek${NC} — DeepSeek (API ключ сохраняется)"
|
echo -e " ${CYAN}claude_deepseek${NC} — DeepSeek (API ключ сохраняется)"
|
||||||
|
echo -e " ${CYAN}claude_kimi${NC} — Kimi K2.6 (Moonshot AI, API ключ сохраняется)"
|
||||||
echo -e " ${CYAN}claude_gemini${NC} — Gemini (Google OAuth через браузер)"
|
echo -e " ${CYAN}claude_gemini${NC} — Gemini (Google OAuth через браузер)"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Все команды принимают стандартные флаги:"
|
echo "Все команды принимают стандартные флаги:"
|
||||||
@@ -351,6 +443,7 @@ echo -e "${YELLOW}⚠️ Для Gemini используйте отдельны
|
|||||||
echo ""
|
echo ""
|
||||||
echo "Управление:"
|
echo "Управление:"
|
||||||
echo -e " DeepSeek ключ: ${CYAN}rm $DEEPSEEK_KEY_FILE${NC} (сбросить)"
|
echo -e " DeepSeek ключ: ${CYAN}rm $DEEPSEEK_KEY_FILE${NC} (сбросить)"
|
||||||
|
echo -e " Kimi ключ: ${CYAN}rm $CONFIG_DIR/kimi_key${NC} (сбросить)"
|
||||||
echo -e " GPT статус: ${CYAN}claude-code-proxy codex auth status${NC}"
|
echo -e " GPT статус: ${CYAN}claude-code-proxy codex auth status${NC}"
|
||||||
echo -e " GPT выйти: ${CYAN}claude-code-proxy codex auth logout${NC}"
|
echo -e " GPT выйти: ${CYAN}claude-code-proxy codex auth logout${NC}"
|
||||||
echo -e " Gemini WebUI: ${CYAN}http://localhost:8080${NC} (когда прокси запущен)"
|
echo -e " Gemini WebUI: ${CYAN}http://localhost:8080${NC} (когда прокси запущен)"
|
||||||
|
|||||||
Reference in New Issue
Block a user