#!/bin/bash # 磐石 API · Codex CLI 一键配置(macOS / Linux) # 默认以「独立配置档」方式接入,不动你原有的官方登录。 set -u BASE_URL="https://api.panshiapi.com/v1" # Codex 要求带 /v1 CFG="$HOME/.codex/config.toml" ENVVAR="PANSHI_API_KEY" RED=$'\033[31m'; GRN=$'\033[32m'; YEL=$'\033[33m'; DIM=$'\033[2m'; RST=$'\033[0m' say(){ printf '%s\n' "$*"; } die(){ printf '%s%s%s\n' "$RED" "$*" "$RST" >&2; exit 1; } say "" say " 磐石 API · Codex 配置工具" say " ${DIM}只修改本机配置文件,不会上传任何信息${RST}" say "" KEY="${1:-}" if [ -z "$KEY" ]; then printf ' 请粘贴你的 API Key(sk- 开头): '; read -r KEY; fi KEY="$(printf '%s' "$KEY" | tr -d '[:space:]')" [ -z "$KEY" ] && die " 没有输入 Key,已退出" # ---------- 自动挑一个你这个 Key 能用的模型 ---------- say " 正在读取你可用的模型…" LIST=$(curl -sS "$BASE_URL/models" -H "authorization: Bearer $KEY" --max-time 30 2>/dev/null \ | tr ',' '\n' | grep -oE '"id":"[^"]+"' | sed 's/.*:"//;s/"//') # Codex 是写代码用的,优先挑 gpt 系;没有再退而求其次 MODEL=$(printf '%s\n' "$LIST" | grep -i '^gpt' | head -1) [ -z "$MODEL" ] && MODEL=$(printf '%s\n' "$LIST" | head -1) if [ -z "$MODEL" ]; then MODEL="gpt-5.5" say " ${YEL}没读到模型列表,先用 $MODEL 占位,之后可在配置里改${RST}" else say " 将使用模型:${GRN}$MODEL${RST}" fi # ---------- 备份 ---------- mkdir -p "$HOME/.codex" [ -f "$CFG" ] || : > "$CFG" BAK="$CFG.bak.$(date +%Y%m%d-%H%M%S)"; cp "$CFG" "$BAK" say " 已备份原配置 → ${DIM}$BAK${RST}" # ---------- 追加配置(已存在就先删旧段,避免重复)---------- if grep -q '# >>> panshi' "$CFG" 2>/dev/null; then awk '/# >>> panshi/{s=1} !s{print} /# <<< panshi/{s=0}' "$CFG" > "$CFG.tmp" && mv "$CFG.tmp" "$CFG" say " 检测到旧的磐石配置,已替换" fi cat >> "$CFG" <>> panshi 磐石API(本段由配置脚本生成,可整段删除) [model_providers.panshi] name = "磐石API" base_url = "$BASE_URL" env_key = "$ENVVAR" wire_api = "chat" [profiles.panshi] model_provider = "panshi" model = "$MODEL" # <<< panshi TOML say " ${GRN}配置已写入${RST} ${DIM}$CFG${RST}" # ---------- 写入 Key 到 shell 配置 ---------- RC="" case "${SHELL:-}" in *zsh) RC="$HOME/.zshrc" ;; *bash) [ -f "$HOME/.bash_profile" ] && RC="$HOME/.bash_profile" || RC="$HOME/.bashrc" ;; *) [ -f "$HOME/.zshrc" ] && RC="$HOME/.zshrc" || RC="$HOME/.profile" ;; esac touch "$RC" sed -i.panshibak "/^export $ENVVAR=/d" "$RC" 2>/dev/null || true rm -f "$RC.panshibak" printf 'export %s="%s"\n' "$ENVVAR" "$KEY" >> "$RC" export PANSHI_API_KEY="$KEY" say " Key 已写入 ${DIM}$RC${RST}" # ---------- 验证 ---------- say ""; say " 正在验证连接…" RESP=$(curl -sS -o /tmp/panshi_codex.$$ -w '%{http_code}' "$BASE_URL/chat/completions" \ -H "authorization: Bearer $KEY" -H "content-type: application/json" \ -H "user-agent: codex-cli/1.0" \ -d "{\"model\":\"$MODEL\",\"max_tokens\":8,\"messages\":[{\"role\":\"user\",\"content\":\"hi\"}]}" \ --max-time 90 2>/dev/null) BODY=$(cat /tmp/panshi_codex.$$ 2>/dev/null); rm -f /tmp/panshi_codex.$$ say "" case "$RESP" in 200) say " ${GRN}✓ 配置成功${RST}" ;; 401) say " ${RED}✗ Key 无效${RST} 检查有没有复制漏字符" ;; 403) printf '%s' "$BODY" | grep -qi balance \ && { say " ${RED}✗ 余额不足${RST} 请到 https://panshiapi.com 充值"; } \ || say " ${RED}✗ 访问被拒绝${RST} $(printf '%s' "$BODY" | head -c 140)" ;; 404) say " ${YEL}! 模型 $MODEL 不可用${RST} 登录后台查看该 Key 可用的模型,改 $CFG 里的 model" ;; 429) say " ${YEL}! 上游限流,稍后重试${RST}(配置没问题)" ;; 000|"") say " ${RED}✗ 连不上服务器${RST} 检查网络" ;; *) say " ${YEL}! 返回 HTTP $RESP${RST} $(printf '%s' "$BODY" | head -c 140)" ;; esac say "" say " ${GRN}用法${RST}:新开一个终端窗口,然后运行" say " ${DIM}codex --profile panshi${RST}" say "" say " ${DIM}想设为默认(以后直接敲 codex 就走磐石):${RST}" say " ${DIM}在 $CFG 顶部加一行 model_provider = \"panshi\"${RST}" say " ${DIM}如需还原:cp \"$BAK\" \"$CFG\"${RST}" say ""