Class: EasyAI::Command::Setup

Inherits:
EasyAI::Command 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],
      optional_env: {
        'ANTHROPIC_BASE_URL' => 'https://api.anthropic.com'
      }
    },
    'kimi' => {
      label: 'Kimi(Moonshot)',
      required_env: %w[ANTHROPIC_AUTH_TOKEN],
      optional_env: {
        'ANTHROPIC_BASE_URL' => 'https://api.kimi.com/coding/'
      }
    },
    'deepseek' => {
      label: 'DeepSeek',
      required_env: %w[ANTHROPIC_AUTH_TOKEN],
      optional_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],
      optional_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],
      optional_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],
      optional_env: {
        'ANTHROPIC_BASE_URL' => 'https://open.bigmodel.cn/api/anthropic',
        'API_TIMEOUT_MS' => '3000000',
        'ANTHROPIC_DEFAULT_OPUS_MODEL' => 'glm-5.1',
        'ANTHROPIC_DEFAULT_SONNET_MODEL' => 'glm-5-turbo',
        'ANTHROPIC_DEFAULT_HAIKU_MODEL' => 'glm-4.5-air'
      }
    }
  },
  'gemini' => {
    'google_official' => {
      label: 'Google 官方',
      required_env: %w[GEMINI_API_KEY],
      optional_env: {}
    }
  },
  'codex' => {
    'openai_official' => {
      label: 'OpenAI 官方',
      required_env: %w[OPENAI_API_KEY],
      optional_env: {
        'OPENAI_BASE_URL' => 'https://api.openai.com/v1'
      }
    },
    'azure_openai' => {
      label: 'Azure OpenAI',
      required_env: %w[AZURE_OPENAI_API_KEY AZURE_OPENAI_ENDPOINT],
      optional_env: {}
    },
    'deepseek' => {
      label: 'DeepSeek(兼容 OpenAI 协议)',
      required_env: %w[OPENAI_API_KEY],
      optional_env: {
        'OPENAI_BASE_URL' => 'https://api.deepseek.com/v1'
      }
    }
  }
}.freeze
SENSITIVE_KEY_PATTERN =

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

Base::SecretMasker::SENSITIVE_KEY_PATTERN

Constants inherited from EasyAI::Command

DEFAULT_OPTIONS, DEFAULT_ROOT_OPTIONS

Instance Attribute Summary

Attributes inherited from EasyAI::Command

#args_help_flag

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from EasyAI::Command

run, #validate!

Constructor Details

#initialize(argv) ⇒ Setup

Returns a new instance of Setup.



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

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



138
139
140
141
142
143
144
145
146
147
# File 'lib/easyai/command/setup.rb', line 138

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

Instance Method Details

#runObject



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/easyai/command/setup.rb', line 159

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