diff --git a/.claude/tools/bashrc.tail.sh b/.claude/tools/bashrc.tail.sh index fd1abb0..fa5e8e6 100755 --- a/.claude/tools/bashrc.tail.sh +++ b/.claude/tools/bashrc.tail.sh @@ -26,15 +26,38 @@ alias cc51='cc 51' alias ccds='cc -p deepseek ds' alias ccdsf='cc -p deepseek dsf' -# tmux pane 级模型继承:从 pane option 读取模型配置(由 runcc.sh 写入) +# ── OpenCode 启动函数(参数透传至 runoc.sh)────────────────── +oc() { $BIN_PATH/runoc.sh "$@"; } + +# OpenCode 模型快捷方式: oc51, oc51 ..., oc -p deepseek ds ... +alias oc45='oc 45' +alias oc45a='oc 45a' +alias oc46='oc 46' +alias oc47='oc 47' +alias oc5='oc 5' +alias oc5t='oc 5t' +alias oc51='oc 51' + +# OpenCode DeepSeek 快捷方式 +alias ocds='oc -p deepseek ds' +alias ocdsf='oc -p deepseek dsf' + +# tmux pane 级模型继承:从 pane option 读取模型配置(由 runcc.sh / runoc.sh 写入) # 覆盖 session 级环境变量,实现同 session 不同 pane 的模型隔离 if [ -n "${TMUX:-}" ]; then - _model="$(tmux show-option -pv @anthropic_model 2>/dev/null || true)" - if [ -n "$_model" ]; then - export ANTHROPIC_DEFAULT_HAIKU_MODEL="$_model" - export ANTHROPIC_DEFAULT_SONNET_MODEL="$_model" - export ANTHROPIC_DEFAULT_OPUS_MODEL="$_model" + # Claude Code 模型继承 + _cc_model="$(tmux show-option -pv @anthropic_model 2>/dev/null || true)" + if [ -n "$_cc_model" ]; then + export ANTHROPIC_DEFAULT_HAIKU_MODEL="$_cc_model" + export ANTHROPIC_DEFAULT_SONNET_MODEL="$_cc_model" + export ANTHROPIC_DEFAULT_OPUS_MODEL="$_cc_model" fi - unset _model + unset _cc_model + # OpenCode 配置继承 + _oc_config="$(tmux show-environment -t "$(tmux display-message -p '#{session_id}')" OPENCODE_CONFIG 2>/dev/null | sed 's/^OPENCODE_CONFIG=//' || true)" + if [ -n "$_oc_config" ]; then + export OPENCODE_CONFIG="$_oc_config" + fi + unset _oc_config fi diff --git a/.claude/tools/runoc.sh b/.claude/tools/runoc.sh new file mode 100644 index 0000000..ae38683 --- /dev/null +++ b/.claude/tools/runoc.sh @@ -0,0 +1,80 @@ +#!/bin/bash +# OpenCode 启动脚本 +# 支持通过快捷名指定模型 +# +# Provider ID: +# zhipuai-coding-plan 智谱 GLM 系列(凭据在 opencode.json + auth.json 中配置) +# deepseek DeepSeek 系列(凭据在 auth.json 中配置) +# +# 用法: +# runoc.sh # 默认模型 (GLM 5.1) +# runoc.sh 51 # GLM 5.1 +# runoc.sh ds # DeepSeek V4 Pro +# runoc.sh -p deepseek # DeepSeek Provider + 默认模型 +# runoc.sh -p deepseek ds # DeepSeek Provider + DeepSeek V4 Pro + +# ── 参数解析 ────────────────────────────────────────────── +MODEL_KEY="" +PROVIDER_OVERRIDE="" + +while [ $# -gt 0 ]; do + case "$1" in + --provider|-p) + [ $# -ge 2 ] || { echo "错误: --provider 需要参数" >&2; exit 1; } + PROVIDER_OVERRIDE="$2"; shift 2 + ;; + -h|--help) + echo "用法: runoc.sh [选项] [模型]" + echo "" + echo "选项:" + echo " --provider, -p <名称> API 提供商 (glm / deepseek)" + echo "" + echo "GLM 模型: 45|45a|46|47|5|5t|51" + echo "DeepSeek 模型: ds|dsf" + echo "其他: 直接传入 provider/model 格式" + echo "" + echo "示例:" + echo " runoc.sh # 默认 GLM 5.1" + echo " runoc.sh 47 # GLM 4.7" + echo " runoc.sh -p deepseek ds # DeepSeek V4 Pro" + echo " runoc.sh zhipuai-coding-plan/glm-5.1 # 完整格式" + exit 0 + ;; + *) + MODEL_KEY="$1"; shift + ;; + esac +done + +# ── Provider & 模型解析 ────────────────────────────────── +MODEL_KEY="${MODEL_KEY:-51}" + +case "$MODEL_KEY" in + 45) MODEL="zhipuai-coding-plan/glm-4.5" ;; + 45a) MODEL="zhipuai-coding-plan/glm-4.5-air" ;; + 46) MODEL="zhipuai-coding-plan/glm-4.6" ;; + 47) MODEL="zhipuai-coding-plan/glm-4.7" ;; + 5) MODEL="zhipuai-coding-plan/glm-5" ;; + 5t) MODEL="zhipuai-coding-plan/glm-5-turbo" ;; + 51) MODEL="zhipuai-coding-plan/glm-5.1" ;; + ds) MODEL="deepseek/deepseek-v4-pro"; PROVIDER_OVERRIDE="deepseek" ;; + dsf) MODEL="deepseek/deepseek-v4-flash"; PROVIDER_OVERRIDE="deepseek" ;; + *) MODEL="$MODEL_KEY" ;; +esac + +if [ -n "$PROVIDER_OVERRIDE" ]; then + case "$MODEL" in + */*) ;; + *) MODEL="${PROVIDER_OVERRIDE}/${MODEL}" ;; + esac +fi + +# ── tmux 模型传播 ──────────────────────────────────────── +if [ -n "${TMUX:-}" ]; then + SESSION_ID="$(tmux display-message -p '#{session_id}')" + tmux set-option -p @opencode_model "$MODEL" +fi + +# ── 启动 OpenCode ──────────────────────────────────────── +echo "启动 OpenCode (模型: $MODEL)" +opencode -m "$MODEL"