Class: EasyAI::Command::Setup

Inherits:
Command
  • Object
show all
Defined in:
lib/easyai/command/setup.rb

Overview

交互式本地配置生成器

子命令矩阵: easyai setup # 全量交互(首次)/ 选择菜单 upsert(已存在) easyai setup --tool=claude # 仅配置指定工具 easyai setup --add=kimi --tool=claude # 追加 / 覆盖单平台 easyai setup --remove=kimi --tool=claude # 删除单平台 easyai setup --list # 脱敏概览 easyai setup --reset # 删除现有 config 后重走交互 easyai setup --edit # 用 $EDITOR 直接编辑 config.json

Constant Summary collapse

KNOWN_PLATFORMS =

仅 setup 内含的硬编码平台清单;runtime(AIToolBase)不读取此常量

{
  'claude' => {
    'claude_official' => {
      label: 'Claude 官方',
      required_env: %w[ANTHROPIC_AUTH_TOKEN],
      fixed_env: {
        'ANTHROPIC_BASE_URL' => 'https://api.anthropic.com'
      }
    },
    'kimi' => {
      label: 'Kimi(Moonshot)',
      required_env: %w[ANTHROPIC_AUTH_TOKEN],
      fixed_env: {
        'ANTHROPIC_BASE_URL' => 'https://api.kimi.com/coding/'
      }
    },
    'deepseek' => {
      label: 'DeepSeek',
      required_env: %w[ANTHROPIC_AUTH_TOKEN],
      fixed_env: {
        'ANTHROPIC_BASE_URL' => 'https://api.deepseek.com/anthropic',
        'ANTHROPIC_MODEL' => 'deepseek-v4-pro[1m]',
        'ANTHROPIC_DEFAULT_OPUS_MODEL' => 'deepseek-v4-pro[1m]',
        'ANTHROPIC_DEFAULT_SONNET_MODEL' => 'deepseek-v4-pro[1m]',
        'ANTHROPIC_DEFAULT_HAIKU_MODEL' => 'deepseek-v4-flash',
        'CLAUDE_CODE_SUBAGENT_MODEL' => 'deepseek-v4-flash',
        'CLAUDE_CODE_EFFORT_LEVEL' => 'max'
      }
    },
    'aliqwen' => {
      label: '阿里千问 Coding Plan(兼容 Anthropic 协议)',
      required_env: %w[ANTHROPIC_AUTH_TOKEN],
      fixed_env: {
        'ANTHROPIC_BASE_URL' => 'https://coding.dashscope.aliyuncs.com/apps/anthropic',
        'ANTHROPIC_MODEL' => 'qwen3.6-plus',
        'ANTHROPIC_DEFAULT_OPUS_MODEL' => 'qwen3.6-plus',
        'ANTHROPIC_DEFAULT_SONNET_MODEL' => 'qwen3.6-plus',
        'ANTHROPIC_DEFAULT_HAIKU_MODEL' => 'qwen3.6-plus',
        'ANTHROPIC_SMALL_FAST_MODEL' => 'qwen3.6-plus',
        'CLAUDE_CODE_SUBAGENT_MODEL' => 'qwen3.6-plus',
        'CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS' => '1'
      }
    },
    'minimax' => {
      label: 'MiniMax(兼容 Anthropic 协议)',
      required_env: %w[ANTHROPIC_AUTH_TOKEN],
      fixed_env: {
        'ANTHROPIC_BASE_URL' => 'https://api.minimaxi.com/anthropic',
        'ANTHROPIC_MODEL' => 'MiniMax-M2.7-highspeed',
        'ANTHROPIC_DEFAULT_SONNET_MODEL' => 'MiniMax-M2.7-highspeed',
        'ANTHROPIC_DEFAULT_HAIKU_MODEL' => 'MiniMax-M2.7-highspeed',
        'ANTHROPIC_DEFAULT_OPUS_MODEL' => 'MiniMax-M2.7-highspeed'
      }
    },
    'glm' => {
      label: 'GLM Coding Plan(bigmodel.cn)',
      required_env: %w[ANTHROPIC_AUTH_TOKEN],
      fixed_env: {
        'ANTHROPIC_BASE_URL' => 'https://open.bigmodel.cn/api/anthropic',
        'API_TIMEOUT_MS' => '3000000',
        'CLAUDE_CODE_AUTO_COMPACT_WINDOW' => '1000000',
        'ANTHROPIC_DEFAULT_OPUS_MODEL' => 'glm-5.2[1m]',
        'ANTHROPIC_DEFAULT_SONNET_MODEL' => 'glm-5.2[1m]',
        'ANTHROPIC_DEFAULT_HAIKU_MODEL' => 'glm-4.7'
      }
    },
    'longcat' => {
      label: 'LongCat(美团,兼容 Anthropic 协议)',
      required_env: %w[ANTHROPIC_AUTH_TOKEN],
      fixed_env: {
        'ANTHROPIC_BASE_URL' => 'https://api.longcat.chat/anthropic',
        'ANTHROPIC_MODEL' => 'LongCat-2.0',
        'ANTHROPIC_SMALL_FAST_MODEL' => 'LongCat-2.0',
        'ANTHROPIC_DEFAULT_SONNET_MODEL' => 'LongCat-2.0',
        'ANTHROPIC_DEFAULT_OPUS_MODEL' => 'LongCat-2.0',
        'CLAUDE_CODE_MAX_OUTPUT_TOKENS' => '131072',
        'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC' => '1'
      }
    }
  },
  'codex' => {
    'openai_official' => {
      label: 'ChatGPT Subscribe(使用 ChatGPT 订阅账户授权信息)',
      # 不录入 API Key:直接复用 ~/.codex 的 ChatGPT OAuth 登录态,
      # 配置动作 = 等同 easyai backup codex(仅当存在官方 token 时更新备份)
      chatgpt_subscribe: true
    },
    'deepseek' => {
      label: 'DeepSeek(兼容 OpenAI 协议,codex 自动写 responses provider profile)',
      required_env: %w[OPENAI_API_KEY],
      fixed_env: {
        'OPENAI_BASE_URL' => 'https://api.deepseek.com/v1'
      }
    },
    'longcat' => {
      label: 'LongCat(美团,兼容 OpenAI 协议)',
      required_env: %w[OPENAI_API_KEY],
      fixed_env: {
        'OPENAI_BASE_URL' => 'https://api.longcat.chat/openai/v1'
      }
    }
  }
}.freeze
SENSITIVE_KEY_PATTERN =

敏感字段脱敏统一走 Base::SecretMasker,保留常量别名仅用于历史兼容

Base::SecretMasker::SENSITIVE_KEY_PATTERN

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(argv) ⇒ Setup

Returns a new instance of Setup.



158
159
160
161
162
163
164
165
166
# File 'lib/easyai/command/setup.rb', line 158

def initialize(argv)
  @tool = argv.option('tool')
  @add = argv.option('add')
  @remove = argv.option('remove')
  @list = argv.flag?('list')
  @reset = argv.flag?('reset')
  @edit = argv.flag?('edit')
  super
end

Class Method Details

.optionsObject



147
148
149
150
151
152
153
154
155
156
# File 'lib/easyai/command/setup.rb', line 147

def self.options
  [
    ['--tool=NAME', '指定要配置的工具(claude / codex)'],
    ['--add=PLATFORM', '在指定工具下追加或覆盖单个平台'],
    ['--remove=PLATFORM', '在指定工具下删除单个平台'],
    ['--list', '脱敏方式展示当前所有配置'],
    ['--reset', '删除现有 config.json 后重走全量交互'],
    ['--edit', '使用 $EDITOR / $VISUAL 直接编辑 config.json']
  ].concat(super)
end

Instance Method Details

#runObject



168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/easyai/command/setup.rb', line 168

def run
  return run_list if @list
  return run_remove if @remove
  return run_add if @add
  return run_reset if @reset
  return run_edit if @edit

  run_full_interactive
rescue Config::LocalConfig::ParseError, Config::LocalConfig::IncompatibleVersionError => e
  print_error(e.message)
  puts "  可运行: #{'easyai setup --reset'.yellow} 重新生成配置"
  exit 1
rescue Interrupt
  puts
  print_error('用户取消操作')
  exit 130
end