feat: добавить ai-opencode лаунчер (OpenCode Go + routatic-proxy)
- Новый лаунчер ai-opencode с routatic-proxy на 127.0.0.1:3456 - Автоустановка routatic-proxy под linux/darwin amd64/arm64 - Модели: deepseek-v4-pro (opus/sonnet), kimi-k2.6 (haiku) - AI_RESET_KEY, OPENCODE_GO_API_KEY env fallback, управление opencode_key - Документация: EFFORT_MAPPING.md, QUICK_START.md, README.md - Статус-проверка в setup.sh: ai-opencode, opencode_key, opencode.ai - Тесты: 4 новых теста для ai-opencode в test_fixes.sh Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -685,6 +685,54 @@ else
|
||||
info "Android CLI не найден в PATH, пропускаю android init"
|
||||
fi
|
||||
|
||||
# ── 5. routatic-proxy (OpenCode Go → Claude Code) ──────────
|
||||
info "Проверяю routatic-proxy..."
|
||||
ROUTATIC_BIN="$HOME/.local/bin/routatic-proxy"
|
||||
[ ! -f "$ROUTATIC_BIN" ] && ROUTATIC_BIN="$(command -v routatic-proxy 2>/dev/null || true)"
|
||||
|
||||
if [ -z "$ROUTATIC_BIN" ] || [ ! -f "$ROUTATIC_BIN" ]; then
|
||||
info "Устанавливаю routatic-proxy..."
|
||||
_uname_s=$(uname -s)
|
||||
_uname_m=$(uname -m)
|
||||
ROUTATIC_PLATFORM=""
|
||||
case "${_uname_s}-${_uname_m}" in
|
||||
Linux-x86_64) ROUTATIC_PLATFORM="linux-amd64" ;;
|
||||
Linux-aarch64) ROUTATIC_PLATFORM="linux-arm64" ;;
|
||||
Linux-arm64) ROUTATIC_PLATFORM="linux-arm64" ;;
|
||||
Darwin-x86_64) ROUTATIC_PLATFORM="darwin-amd64" ;;
|
||||
Darwin-arm64) ROUTATIC_PLATFORM="darwin-arm64" ;;
|
||||
Darwin-aarch64) ROUTATIC_PLATFORM="darwin-arm64" ;;
|
||||
esac
|
||||
|
||||
if [ -n "$ROUTATIC_PLATFORM" ]; then
|
||||
ROUTATIC_URL="https://github.com/routatic/proxy/releases/latest/download/routatic-proxy_${ROUTATIC_PLATFORM}"
|
||||
if curl -fsSL "$ROUTATIC_URL" -o "$HOME/.local/bin/routatic-proxy"; then
|
||||
chmod +x "$HOME/.local/bin/routatic-proxy"
|
||||
success "routatic-proxy установлен"
|
||||
else
|
||||
warn "Не удалось скачать routatic-proxy с GitHub"
|
||||
fi
|
||||
else
|
||||
warn "Неизвестная платформа ${_uname_s} ${_uname_m}. Пропускаю routatic-proxy."
|
||||
fi
|
||||
else
|
||||
success "routatic-proxy уже установлен"
|
||||
fi
|
||||
|
||||
# Symlink в BIN_DIR если используется ~/bin вместо ~/.local/bin
|
||||
if [ "$BIN_DIR" != "$HOME/.local/bin" ] && [ -f "$HOME/.local/bin/routatic-proxy" ] && [ ! -f "$BIN_DIR/routatic-proxy" ]; then
|
||||
ln -sf "$HOME/.local/bin/routatic-proxy" "$BIN_DIR/routatic-proxy"
|
||||
success "routatic-proxy symlink -> $BIN_DIR/routatic-proxy"
|
||||
fi
|
||||
|
||||
# Инициализируем конфиг routatic-proxy
|
||||
if command -v routatic-proxy &>/dev/null; then
|
||||
if [ ! -f "$HOME/.config/routatic-proxy/config.json" ]; then
|
||||
routatic-proxy init 2>/dev/null || true
|
||||
success "routatic-proxy config инициализирован"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ── 6. Папка для конфигов ────────────────────────────────────
|
||||
mkdir -p "$CONFIG_DIR"
|
||||
|
||||
@@ -2145,6 +2193,85 @@ claude --dangerously-skip-permissions --system-prompt-file "$_PROMPT_FILE" "$@"
|
||||
CLAUDEEOF
|
||||
chmod +x "$BIN_DIR/ai-claude"
|
||||
|
||||
# === ai-opencode ===
|
||||
cat > "$BIN_DIR/ai-opencode" << 'OPENCODEEOF'
|
||||
#!/usr/bin/env bash
|
||||
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/ai-api-helpers.sh" 2>/dev/null || true
|
||||
|
||||
key_file="$HOME/.config/ai-setup/opencode_key"
|
||||
api_key=""
|
||||
|
||||
# Принудительный сброс сохранённого ключа через AI_RESET_KEY=1
|
||||
if [ "${AI_RESET_KEY:-0}" == "1" ] && [ -f "$key_file" ]; then
|
||||
rm -f "$key_file"
|
||||
api_key=""
|
||||
fi
|
||||
|
||||
[ -f "$key_file" ] && api_key=$(cat "$key_file")
|
||||
|
||||
# Приоритет: env var → файл → ввод
|
||||
if [ -z "$api_key" ] && [ -n "$OPENCODE_GO_API_KEY" ]; then
|
||||
api_key="$OPENCODE_GO_API_KEY"
|
||||
mkdir -p "$(dirname "$key_file")"
|
||||
printf '%s' "$api_key" > "$key_file"
|
||||
chmod 600 "$key_file"
|
||||
fi
|
||||
|
||||
if [ -z "$api_key" ]; then
|
||||
echo "Получить ключ: https://opencode.ai/en/go"
|
||||
read -r -p "Введи OpenCode Go ключ (sk-opencode-...): " api_key
|
||||
[ -z "$api_key" ] && { echo "Выход."; exit 1; }
|
||||
mkdir -p "$(dirname "$key_file")"
|
||||
printf '%s' "$api_key" > "$key_file"
|
||||
chmod 600 "$key_file"
|
||||
echo "Ключ сохранён."
|
||||
fi
|
||||
|
||||
# --- routatic-proxy ---
|
||||
export ROUTATIC_PROXY_API_KEY="$api_key"
|
||||
|
||||
# Запускаем прокси в фоне, если ещё не запущен
|
||||
if ! routatic-proxy status &>/dev/null; then
|
||||
echo -n "Запускаю routatic-proxy... "
|
||||
routatic-proxy serve -b 2>/dev/null
|
||||
sleep 1
|
||||
if routatic-proxy status &>/dev/null; then
|
||||
echo "готово"
|
||||
else
|
||||
echo "НЕ УДАЛОСЬ"
|
||||
echo "Проверь: routatic-proxy serve"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
_PROMPT_FILE=$(mktemp /tmp/ai-sys-prompt.XXXXXX)
|
||||
trap 'rm -f "$_PROMPT_FILE"' EXIT INT TERM
|
||||
_build_ai_sys_prompt > "$_PROMPT_FILE"
|
||||
export AI_LAUNCHER=opencode
|
||||
export CLAUDE_CONFIG_DIR="$HOME/.config/ai-setup/cfg/opencode"
|
||||
# Модели OpenCode Go через routatic-proxy.
|
||||
# deepseek-v4-pro — основной для сложных задач (opus/sonnet),
|
||||
# kimi-k2.6 — быстрый (haiku), рекомендован routatic-proxy как дефолт.
|
||||
_setup_isolated_config opencode deepseek-v4-pro high ''
|
||||
_apply_effort opencode high
|
||||
ANTHROPIC_BASE_URL="http://127.0.0.1:3456" \
|
||||
ANTHROPIC_AUTH_TOKEN="unused" \
|
||||
ANTHROPIC_DEFAULT_OPUS_MODEL="deepseek-v4-pro" \
|
||||
ANTHROPIC_DEFAULT_OPUS_MODEL_NAME="DeepSeek V4 Pro (Go)" \
|
||||
ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION="DeepSeek V4 Pro через OpenCode Go" \
|
||||
ANTHROPIC_DEFAULT_SONNET_MODEL="deepseek-v4-pro" \
|
||||
ANTHROPIC_DEFAULT_SONNET_MODEL_NAME="DeepSeek V4 Pro (Go)" \
|
||||
ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION="DeepSeek V4 Pro через OpenCode Go" \
|
||||
ANTHROPIC_DEFAULT_HAIKU_MODEL="kimi-k2.6" \
|
||||
ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME="Kimi K2.6 (Go)" \
|
||||
ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION="Kimi K2.6 через OpenCode Go" \
|
||||
CLAUDE_CODE_SUBAGENT_MODEL="kimi-k2.6" \
|
||||
CLAUDE_CODE_DISABLE_1M_CONTEXT=1 \
|
||||
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 \
|
||||
claude --dangerously-skip-permissions --system-prompt-file "$_PROMPT_FILE" "$@"
|
||||
OPENCODEEOF
|
||||
chmod +x "$BIN_DIR/ai-opencode"
|
||||
|
||||
# ── 8.5. Proxychains инъекция (только в режиме vless) ────────
|
||||
if [ "$USE_VLESS" -eq 1 ]; then
|
||||
info "Включаю proxychains4 в ai-лаунчеры..."
|
||||
@@ -2155,6 +2282,7 @@ if [ "$USE_VLESS" -eq 1 ]; then
|
||||
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-openrouter"
|
||||
sed -i 's|^\([[:space:]]*\)"\$agy_bin" --dangerously-skip-permissions "\$@"|\1proxychains4 -f "\$HOME/.proxychains-xray.conf" "\$agy_bin" --dangerously-skip-permissions "\$@"|' "$BIN_DIR/ai-gemini"
|
||||
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-claude"
|
||||
sed -i 's/^claude --dangerously-skip-permissions/proxychains4 -f "\$HOME\/\.proxychains-xray\.conf" claude --dangerously-skip-permissions/' "$BIN_DIR/ai-opencode"
|
||||
success "proxychains4 интегрирован"
|
||||
fi
|
||||
|
||||
@@ -2166,6 +2294,7 @@ _setup_isolated_config deepseek opus high ''
|
||||
_setup_isolated_config kimi opus high ''
|
||||
_setup_isolated_config glm opus high ''
|
||||
_setup_isolated_config openrouter "openai/gpt-5.5" high ''
|
||||
_setup_isolated_config opencode deepseek-v4-pro high ''
|
||||
|
||||
info "Удаляю старые версии скриптов (claude_*)..."
|
||||
rm -f "$BIN_DIR/claude_gpt" "$BIN_DIR/claude_deepseek" "$BIN_DIR/claude_kimi" "$BIN_DIR/claude_gemini" "$BIN_DIR/claude_api_helpers.sh"
|
||||
@@ -2175,6 +2304,7 @@ if [ "$BIN_DIR" != "$HOME/.local/bin" ]; then
|
||||
warn "BIN_DIR=$BIN_DIR — удаляю старые скрипты из ~/.local/bin/ ..."
|
||||
rm -f "$HOME/.local/bin/ai-gpt" "$HOME/.local/bin/ai-deepseek" "$HOME/.local/bin/ai-kimi" \
|
||||
"$HOME/.local/bin/ai-glm" "$HOME/.local/bin/ai-openrouter" "$HOME/.local/bin/ai-gemini" "$HOME/.local/bin/ai-claude" \
|
||||
"$HOME/.local/bin/ai-opencode" \
|
||||
"$HOME/.local/bin/ai-api-helpers.sh" "$HOME/.local/bin/claude-gpt-effort-proxy.py"
|
||||
fi
|
||||
|
||||
@@ -2194,6 +2324,7 @@ echo -e " ${CYAN}ai-deepseek${NC} - DeepSeek (через Claude Code,
|
||||
echo -e " ${CYAN}ai-kimi${NC} - Kimi K2.7 Code (через Claude Code, API ключ сохраняется)"
|
||||
echo -e " ${CYAN}ai-glm${NC} - GLM 5.2 (через Claude Code, Zhipu AI API)"
|
||||
echo -e " ${CYAN}ai-openrouter${NC} - OpenRouter (через Claude Code: GPT-5.5, Grok, Qwen, GLM 5.2 и др.)"
|
||||
echo -e " ${CYAN}ai-opencode${NC} - OpenCode Go (через Claude Code + routatic-proxy: DeepSeek, Kimi, Qwen, GLM, MiniMax, MiMo)"
|
||||
echo ""
|
||||
echo " Нативные CLI:"
|
||||
echo -e " ${CYAN}ai-gpt${NC} - OpenAI Codex (нативный CLI, автоустановка)"
|
||||
|
||||
Reference in New Issue
Block a user