Files
claude-relay-service/assets/TutorialView-Cpvhof5r.js
2026-01-22 13:58:01 +00:00

3 lines
50 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{c as b,x as d,y as a,z as t,P as l,O as m,aT as v,R as f,Q as i,u as w,L as $,ac as h,C as k,r as _,I as A,M as P}from"./vue-vendor-DV7DYXbz.js";import{_ as O}from"./index-BahP9Xx9.js";function S(){const r=()=>{let u="";if(window.location.origin)u=window.location.origin;else{const p=window.location.protocol,y=window.location.hostname,g=window.location.port;u=p+"//"+y,g&&(p==="http:"&&g!=="80"||p==="https:"&&g!=="443")&&(u+=":"+g)}if(!u){const p=window.location.href,y=p.indexOf("/",8);if(y!==-1)u=p.substring(0,y);else return""}return u},x=b(()=>r()+"/api"),n=b(()=>r()+"/gemini"),s=b(()=>r()+"/openai"),c=b(()=>r()+"/droid/claude"),e=b(()=>r()+"/droid/openai");return{currentBaseUrl:x,geminiBaseUrl:n,openaiBaseUrl:s,droidClaudeBaseUrl:c,droidOpenaiBaseUrl:e}}const L={class:"rounded-lg border border-green-200 bg-green-50 p-3 dark:border-green-500/40 dark:bg-green-950/30 sm:p-4"},N={class:"mb-2 text-xs text-green-700 dark:text-green-300 sm:mb-3 sm:text-sm"},C={__name:"VerifyInstall",props:{terminal:{type:String,default:"终端"}},setup(r){return(x,n)=>(a(),d("div",L,[n[0]||(n[0]=t("h6",{class:"mb-2 text-sm font-medium text-green-800 dark:text-green-300 sm:text-base"}," 验证安装是否成功 ",-1)),t("p",N," 安装完成后,打开 "+l(r.terminal)+",输入以下命令: ",1),n[1]||(n[1]=t("div",{class:"overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},[t("div",{class:"whitespace-nowrap text-gray-300"},"node --version"),t("div",{class:"whitespace-nowrap text-gray-300"},"npm --version")],-1)),n[2]||(n[2]=t("p",{class:"mt-2 text-xs text-green-700 dark:text-green-300 sm:text-sm"}," 如果显示版本号,说明安装成功了! ",-1))]))}},T={class:"mb-4 sm:mb-10 sm:mb-6"},R={class:"mb-3 flex items-center text-lg font-semibold text-gray-800 dark:text-gray-300 sm:mb-4 sm:text-xl"},U={class:"mr-2 flex h-6 w-6 items-center justify-center rounded-full bg-blue-500 text-xs font-bold text-white sm:mr-3 sm:h-8 sm:w-8 sm:text-sm"},K={class:"mb-4 text-sm text-gray-600 dark:text-gray-400 sm:mb-4 sm:mb-6 sm:text-base"},G={key:0,class:"node-install-section"},j={key:1,class:"node-install-section"},M={key:2,class:"node-install-section"},E={__name:"NodeInstallTutorial",props:{platform:{type:String,required:!0,validator:r=>["windows","macos","linux"].includes(r)},stepNumber:{type:[Number,String],default:1},toolName:{type:String,default:"CLI 工具"}},setup(r){return(x,n)=>(a(),d("div",T,[t("h4",R,[t("span",U,l(r.stepNumber),1),n[0]||(n[0]=m(" 安装 Node.js 环境 ",-1))]),t("p",K,l(r.toolName)+" 需要 Node.js 环境才能运行。 ",1),r.platform==="windows"?(a(),d("div",G,[n[1]||(n[1]=v('<div class="mb-4 rounded-xl border border-blue-100 bg-gradient-to-r from-blue-50 to-indigo-50 p-4 dark:border-blue-500/40 dark:from-blue-950/30 dark:to-indigo-950/30 sm:mb-6 sm:p-6"><h5 class="mb-2 flex items-center text-base font-semibold text-gray-800 dark:text-gray-200 sm:mb-3 sm:text-lg"><i class="fab fa-windows mr-2 text-blue-600"></i> Windows 安装方法 </h5><div class="mb-3 sm:mb-4"><p class="mb-2 text-sm text-gray-700 dark:text-gray-300 sm:mb-3 sm:text-base"> 方法一:官网下载(推荐) </p><ol class="ml-2 list-inside list-decimal space-y-1 text-xs text-gray-600 dark:text-gray-400 sm:ml-4 sm:space-y-2 sm:text-sm"><li> 打开浏览器访问 <code class="rounded bg-gray-100 px-1 py-1 text-xs dark:bg-gray-800 dark:text-yellow-400 sm:px-2 sm:text-sm">https://nodejs.org/</code></li><li>点击 &quot;LTS&quot; 版本进行下载(推荐长期支持版本)</li><li> 下载完成后双击 <code class="rounded bg-gray-100 px-1 py-1 text-xs dark:bg-gray-800 dark:text-yellow-400 sm:px-2 sm:text-sm">.msi</code> 文件 </li><li>按照安装向导完成安装,保持默认设置即可</li></ol></div><div class="mb-3 sm:mb-4"><p class="mb-2 text-sm text-gray-700 dark:text-gray-300 sm:mb-3 sm:text-base"> 方法二:使用包管理器 </p><p class="mb-2 text-xs text-gray-600 dark:text-gray-400 sm:text-sm"> 如果你安装了 Chocolatey 或 Scoop可以使用命令行安装 </p><div class="overflow-x-auto rounded-lg bg-gray-900 p-3 font-mono text-xs text-green-400 dark:border dark:border-gray-700 dark:bg-gray-900 sm:p-4 sm:text-sm"><div class="mb-2"># 使用 Chocolatey</div><div class="whitespace-nowrap text-gray-300">choco install nodejs</div><div class="mb-2 mt-3"># 或使用 Scoop</div><div class="whitespace-nowrap text-gray-300">scoop install nodejs</div></div></div><div class="rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-500/40 dark:bg-blue-950/30 sm:p-4"><h6 class="mb-2 text-sm font-medium text-blue-800 dark:text-blue-300 sm:text-base"> Windows 注意事项 </h6><ul class="space-y-1 text-xs text-blue-700 dark:text-blue-300 sm:text-sm"><li>• 建议使用 PowerShell 而不是 CMD</li><li>• 如果遇到权限问题,尝试以管理员身份运行</li><li>• 某些杀毒软件可能会误报,需要添加白名单</li></ul></div></div>',1)),f(C,{terminal:"PowerShell 或 CMD"})])):r.platform==="macos"?(a(),d("div",j,[n[2]||(n[2]=v('<div class="mb-4 rounded-xl border border-gray-200 bg-gradient-to-r from-gray-50 to-gray-50 p-4 dark:border-gray-700 dark:from-gray-800 dark:to-gray-800 sm:mb-6 sm:p-6"><h5 class="mb-2 flex items-center text-base font-semibold text-gray-800 dark:text-gray-200 sm:mb-3 sm:text-lg"><i class="fab fa-apple mr-2 text-gray-700 dark:text-gray-400"></i> macOS 安装方法 </h5><div class="mb-4"><p class="mb-3 text-gray-700 dark:text-gray-300">方法一:使用 Homebrew推荐</p><p class="mb-2 text-xs text-gray-600 dark:text-gray-400 sm:text-sm"> 如果你已经安装了 Homebrew使用它安装 Node.js 会更方便: </p><div class="overflow-x-auto rounded-lg bg-gray-900 p-3 font-mono text-xs text-green-400 dark:border dark:border-gray-700 dark:bg-gray-900 sm:p-4 sm:text-sm"><div class="mb-2"># 更新 Homebrew</div><div class="whitespace-nowrap text-gray-300">brew update</div><div class="mb-2 mt-3"># 安装 Node.js</div><div class="whitespace-nowrap text-gray-300">brew install node</div></div></div><div class="mb-4"><p class="mb-3 text-gray-700 dark:text-gray-300">方法二:官网下载</p><ol class="ml-2 list-inside list-decimal space-y-1 text-xs text-gray-600 dark:text-gray-400 sm:ml-4 sm:space-y-2 sm:text-sm"><li> 访问 <code class="rounded bg-gray-100 px-1 py-1 text-xs dark:bg-gray-700 sm:px-2 sm:text-sm">https://nodejs.org/</code></li><li>下载适合 macOS 的 LTS 版本</li><li> 打开下载的 <code class="rounded bg-gray-100 px-1 py-1 text-xs dark:bg-gray-700 sm:px-2 sm:text-sm">.pkg</code> 文件 </li><li>按照安装程序指引完成安装</li></ol></div><div class="rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-600 dark:bg-gray-800 sm:p-4"><h6 class="mb-2 text-sm font-medium text-gray-800 dark:text-gray-300 sm:text-base"> macOS 注意事项 </h6><ul class="space-y-1 text-xs text-gray-700 dark:text-gray-300 sm:text-sm"><li> • 如果遇到权限问题,可能需要使用 <code class="rounded bg-gray-200 px-1 text-xs dark:bg-gray-700 sm:text-sm">sudo</code></li><li>• 首次运行可能需要在系统偏好设置中允许</li><li>• 建议使用 Terminal 或 iTerm2</li></ul></div></div>',1)),f(C,{terminal:"Terminal"})])):(a(),d("div",M,[n[3]||(n[3]=v('<div class="mb-4 rounded-xl border border-orange-100 bg-gradient-to-r from-orange-50 to-amber-50 p-4 dark:border-orange-500/40 dark:from-orange-950/30 dark:to-amber-950/30 sm:mb-6 sm:p-6"><h5 class="mb-2 flex items-center text-base font-semibold text-gray-800 dark:text-gray-200 sm:mb-3 sm:text-lg"><i class="fab fa-linux mr-2 text-orange-600"></i> Linux / WSL2 安装方法 </h5><div class="mb-4"><p class="mb-3 text-gray-700 dark:text-gray-300">方法一:使用 nvm推荐</p><p class="mb-2 text-xs text-gray-600 dark:text-gray-400 sm:text-sm"> nvm 可以方便地管理多个 Node.js 版本: </p><div class="overflow-x-auto rounded-lg bg-gray-900 p-3 font-mono text-xs text-green-400 dark:border dark:border-gray-700 dark:bg-gray-900 sm:p-4 sm:text-sm"><div class="mb-2"># 安装 nvm</div><div class="whitespace-nowrap text-gray-300"> curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash </div><div class="mb-2 mt-3"># 重新加载 shell 配置</div><div class="whitespace-nowrap text-gray-300">source ~/.bashrc</div><div class="mb-2 mt-3"># 安装最新 LTS 版本</div><div class="whitespace-nowrap text-gray-300">nvm install --lts</div></div></div><div class="mb-4"><p class="mb-3 text-gray-700 dark:text-gray-300">方法二:使用包管理器</p><div class="overflow-x-auto rounded-lg bg-gray-900 p-3 font-mono text-xs text-green-400 dark:border dark:border-gray-700 dark:bg-gray-900 sm:p-4 sm:text-sm"><div class="mb-2"># Ubuntu/Debian</div><div class="whitespace-nowrap text-gray-300"> curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - </div><div class="whitespace-nowrap text-gray-300">sudo apt-get install -y nodejs</div><div class="mb-2 mt-3"># Fedora</div><div class="whitespace-nowrap text-gray-300">sudo dnf install nodejs</div><div class="mb-2 mt-3"># Arch Linux</div><div class="whitespace-nowrap text-gray-300">sudo pacman -S nodejs npm</div></div></div><div class="rounded-lg border border-orange-200 bg-orange-50 p-3 dark:border-orange-500/40 dark:bg-orange-950/30 sm:p-4"><h6 class="mb-2 text-sm font-medium text-orange-800 dark:text-orange-300 sm:text-base"> Linux / WSL2 注意事项 </h6><ul class="space-y-1 text-xs text-orange-700 dark:text-orange-300 sm:text-sm"><li>• WSL2 用户建议在 Linux 子系统中安装,而不是 Windows</li><li>• 使用 nvm 可以避免权限问题</li><li>• 确保 shell 配置文件正确加载了 nvm</li></ul></div></div>',1)),f(C,{terminal:"终端"})]))]))}},Y={class:"tutorial-content"},B={class:"mb-4 sm:mb-10 sm:mb-6"},V={class:"mb-4 rounded-xl border border-green-100 bg-gradient-to-r from-green-50 to-emerald-50 p-4 dark:border-green-500/40 dark:from-green-950/30 dark:to-emerald-950/30 sm:mb-6 sm:p-6"},D={class:"mb-3 text-sm text-gray-700 dark:text-gray-300 sm:mb-4 sm:text-base"},H={class:"mb-4 overflow-x-auto rounded-lg bg-gray-900 p-3 font-mono text-xs text-green-400 sm:p-4 sm:text-sm"},q={class:"whitespace-nowrap text-gray-300"},W={class:"mt-4 rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-500/40 dark:bg-blue-950/30 sm:p-4"},z={class:"space-y-1 text-xs text-blue-700 dark:text-blue-300 sm:text-sm"},F={class:"mb-6 sm:mb-10"},J={class:"mb-4 rounded-xl border border-purple-100 bg-gradient-to-r from-purple-50 to-pink-50 p-4 dark:border-purple-500/40 dark:from-purple-950/30 dark:to-pink-950/30 sm:mb-6 sm:p-6"},Q={class:"space-y-4"},X={class:"rounded-lg border border-purple-200 bg-white p-3 dark:border-purple-700 dark:bg-gray-800 sm:p-4"},Z={class:"overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},tt={class:"whitespace-nowrap text-gray-300"},et={class:"rounded-lg border border-purple-200 bg-white p-3 dark:border-purple-700 dark:bg-gray-800 sm:p-4"},st={class:"mb-3 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},rt={class:"whitespace-nowrap text-gray-300"},ot={class:"rounded-lg border border-purple-200 bg-white p-3 dark:border-purple-700 dark:bg-gray-800 sm:p-4"},at={class:"overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},dt={class:"whitespace-nowrap text-gray-300"},lt={class:"rounded-lg border border-purple-200 bg-white p-3 dark:border-purple-700 dark:bg-gray-800 sm:p-4"},nt={class:"mb-3 text-sm text-gray-600 dark:text-gray-400"},mt={class:"mb-3 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},it={class:"whitespace-nowrap text-gray-300"},xt={class:"overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},gt={class:"whitespace-nowrap text-gray-300"},pt={class:"mt-6 rounded-lg border border-indigo-200 bg-indigo-50 p-3 dark:border-indigo-500/40 dark:bg-indigo-950/30 sm:p-4"},bt={class:"mb-3 space-y-2"},ut={class:"text-sm text-indigo-700 dark:text-indigo-300"},yt={class:"rounded bg-indigo-100 px-1 dark:bg-indigo-900"},vt={class:"mt-6 rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-500/40 dark:bg-blue-950/30 sm:p-4"},ct={class:"space-y-4"},wt={class:"mb-2 text-sm font-medium text-gray-800 dark:text-gray-300 sm:text-base"},ft={class:"space-y-1 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},kt={class:"mt-3 space-y-2"},ht={class:"rounded bg-gray-100 p-2 font-mono text-sm dark:bg-gray-700"},St={class:"mb-6 sm:mb-8"},Et={class:"rounded-xl border border-orange-100 bg-gradient-to-r from-orange-50 to-yellow-50 p-4 dark:border-orange-500/40 dark:from-orange-950/30 dark:to-yellow-950/30 sm:p-6"},It={class:"space-y-4"},Ct={class:"overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},$t={class:"whitespace-nowrap text-gray-300"},_t={class:"mb-8"},At={class:"mb-3 flex items-center text-lg font-semibold text-gray-800 dark:text-gray-300 sm:mb-4 sm:text-xl"},Pt={class:"space-y-4"},Ot={class:"rounded-lg border border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800"},Lt={class:"px-3 pb-3 text-gray-600 dark:text-gray-400 sm:px-4 sm:pb-4"},Nt={class:"list-inside list-disc space-y-1 text-sm"},Tt={key:0,class:"rounded-lg border border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800"},Rt={class:"rounded-lg border border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800"},Ut={class:"px-3 pb-3 text-gray-600 dark:text-gray-400 sm:px-4 sm:pb-4"},Kt={class:"list-inside list-disc space-y-1 text-sm"},Gt={class:"rounded bg-gray-200 px-1 text-xs dark:bg-gray-700 sm:text-sm"},jt={key:1,class:"rounded-lg border border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800"},Mt={__name:"ClaudeCodeTutorial",props:{platform:{type:String,required:!0,validator:r=>["windows","macos","linux"].includes(r)}},setup(r){const x=r,{currentBaseUrl:n}=S(),s=b(()=>({windows:"Windows",macos:"macOS",linux:"Linux / WSL2"})[x.platform]);return(c,e)=>(a(),d("div",Y,[f(E,{platform:r.platform,"step-number":1,"tool-name":"Claude Code"},null,8,["platform"]),t("div",B,[e[10]||(e[10]=t("h4",{class:"mb-3 flex items-center text-lg font-semibold text-gray-800 dark:text-gray-300 sm:mb-4 sm:text-xl"},[t("span",{class:"mr-2 flex h-6 w-6 items-center justify-center rounded-full bg-green-500 text-xs font-bold text-white sm:mr-3 sm:h-8 sm:w-8 sm:text-sm"},"2"),m(" 安装 Claude Code ")],-1)),t("div",V,[e[8]||(e[8]=t("h5",{class:"mb-2 flex items-center text-base font-semibold text-gray-800 dark:text-gray-200 sm:mb-3 sm:text-lg"},[t("i",{class:"fas fa-download mr-2 text-green-600"}),m(" 安装 Claude Code ")],-1)),t("p",D,l(r.platform==="windows"?"打开 PowerShell 或 CMD":"打开终端")+",运行以下命令: ",1),t("div",H,[e[0]||(e[0]=t("div",{class:"mb-2"},"# 全局安装 Claude Code",-1)),t("div",q,l(r.platform==="windows"?"npm install -g @anthropic-ai/claude-code":"sudo npm install -g @anthropic-ai/claude-code"),1)]),e[9]||(e[9]=t("p",{class:"text-sm text-gray-600 dark:text-gray-400"}," 这个命令会从 npm 官方仓库下载并安装最新版本的 Claude Code。 ",-1)),t("div",W,[e[7]||(e[7]=t("h6",{class:"mb-2 text-sm font-medium text-blue-800 dark:text-blue-300 sm:text-base"}," 提示 ",-1)),t("ul",z,[r.platform==="windows"?(a(),d(i,{key:0},[e[1]||(e[1]=t("li",null,"• 建议使用 PowerShell 而不是 CMD功能更强大",-1)),e[2]||(e[2]=t("li",null,"• 如果遇到权限问题,以管理员身份运行 PowerShell",-1))],64)):r.platform==="macos"?(a(),d(i,{key:1},[e[3]||(e[3]=t("li",null,"• 如果遇到权限问题,可以使用 sudo",-1)),e[4]||(e[4]=t("li",null,"• 或者使用 nvm 安装的 Node.js 避免权限问题",-1))],64)):(a(),d(i,{key:2},[e[5]||(e[5]=t("li",null,"• 使用 nvm 安装的 Node.js 可以避免 sudo",-1)),e[6]||(e[6]=t("li",null,"• WSL2 用户确保在 Linux 子系统中运行",-1))],64))])])]),e[11]||(e[11]=v('<div class="rounded-lg border border-green-200 bg-green-50 p-3 dark:border-green-500/40 dark:bg-green-950/30 sm:p-4"><h6 class="mb-2 font-medium text-green-800 dark:text-green-300">验证 Claude Code 安装</h6><p class="mb-3 text-sm text-green-700 dark:text-green-300"> 安装完成后,输入以下命令检查是否安装成功: </p><div class="overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"><div class="whitespace-nowrap text-gray-300">claude --version</div></div><p class="mt-2 text-sm text-green-700 dark:text-green-300"> 如果显示版本号恭喜你Claude Code 已经成功安装了。 </p></div>',1))]),t("div",F,[e[44]||(e[44]=t("h4",{class:"mb-3 flex items-center text-lg font-semibold text-gray-800 dark:text-gray-300 sm:mb-4 sm:text-xl"},[t("span",{class:"mr-2 flex h-6 w-6 items-center justify-center rounded-full bg-purple-500 text-xs font-bold text-white sm:mr-3 sm:h-8 sm:w-8 sm:text-sm"},"3"),m(" 设置环境变量 ")],-1)),t("div",J,[e[28]||(e[28]=t("h5",{class:"mb-2 flex items-center text-base font-semibold text-gray-800 dark:text-gray-200 sm:mb-3 sm:text-lg"},[t("i",{class:"fas fa-cog mr-2 text-purple-600"}),m(" 配置 Claude Code 环境变量 ")],-1)),e[29]||(e[29]=t("p",{class:"mb-3 text-sm text-gray-700 dark:text-gray-300 sm:mb-4 sm:text-base"}," 为了让 Claude Code 连接到你的中转服务,需要设置两个环境变量: ",-1)),t("div",Q,[r.platform==="windows"?(a(),d(i,{key:0},[t("div",X,[e[13]||(e[13]=t("h6",{class:"mb-2 text-sm font-medium text-gray-800 dark:text-gray-300 sm:text-base"}," 方法一PowerShell 临时设置(当前会话) ",-1)),e[14]||(e[14]=t("p",{class:"mb-3 text-sm text-gray-600 dark:text-gray-400"}," 在 PowerShell 中运行以下命令: ",-1)),t("div",Z,[t("div",tt,' $env:ANTHROPIC_BASE_URL = "'+l(w(n))+'" ',1),e[12]||(e[12]=t("div",{class:"whitespace-nowrap text-gray-300"},' $env:ANTHROPIC_AUTH_TOKEN = "你的API密钥" ',-1))]),e[15]||(e[15]=t("p",{class:"mt-2 text-xs text-yellow-700 dark:text-yellow-400"},' 💡 记得将 "你的API密钥" 替换为在上方 "API Keys" 标签页中创建的实际密钥。 ',-1))]),t("div",et,[e[18]||(e[18]=t("h6",{class:"mb-2 text-sm font-medium text-gray-800 dark:text-gray-300 sm:text-base"}," 方法二PowerShell 永久设置(用户级) ",-1)),e[19]||(e[19]=t("p",{class:"mb-3 text-sm text-gray-600 dark:text-gray-400"}," 在 PowerShell 中运行以下命令设置用户级环境变量: ",-1)),t("div",st,[e[16]||(e[16]=t("div",{class:"mb-2"},"# 设置用户级环境变量(永久生效)",-1)),t("div",rt,' [System.Environment]::SetEnvironmentVariable("ANTHROPIC_BASE_URL", "'+l(w(n))+'", [System.EnvironmentVariableTarget]::User) ',1),e[17]||(e[17]=t("div",{class:"whitespace-nowrap text-gray-300"},' [System.Environment]::SetEnvironmentVariable("ANTHROPIC_AUTH_TOKEN", "你的API密钥", [System.EnvironmentVariableTarget]::User) ',-1))]),e[20]||(e[20]=t("p",{class:"mt-2 text-xs text-blue-700 dark:text-blue-300"}," 💡 设置后需要重新打开 PowerShell 窗口才能生效。 ",-1))])],64)):(a(),d(i,{key:1},[t("div",ot,[e[22]||(e[22]=t("h6",{class:"mb-2 text-sm font-medium text-gray-800 dark:text-gray-300 sm:text-base"}," 方法一:临时设置(当前会话) ",-1)),e[23]||(e[23]=t("p",{class:"mb-3 text-sm text-gray-600 dark:text-gray-400"},"在终端中运行以下命令:",-1)),t("div",at,[t("div",dt,' export ANTHROPIC_BASE_URL="'+l(w(n))+'" ',1),e[21]||(e[21]=t("div",{class:"whitespace-nowrap text-gray-300"},' export ANTHROPIC_AUTH_TOKEN="你的API密钥" ',-1))]),e[24]||(e[24]=t("p",{class:"mt-2 text-xs text-yellow-700 dark:text-yellow-400"},' 💡 记得将 "你的API密钥" 替换为在上方 "API Keys" 标签页中创建的实际密钥。 ',-1))]),t("div",lt,[e[26]||(e[26]=t("h6",{class:"mb-2 text-sm font-medium text-gray-800 dark:text-gray-300 sm:text-base"}," 方法二永久设置Shell 配置文件) ",-1)),t("p",nt," 将以下内容添加到你的 shell 配置文件中("+l(r.platform==="macos"?"~/.zshrc":"~/.bashrc")+" ",1),t("div",mt,[t("div",it,' export ANTHROPIC_BASE_URL="'+l(w(n))+'" ',1),e[25]||(e[25]=t("div",{class:"whitespace-nowrap text-gray-300"},' export ANTHROPIC_AUTH_TOKEN="你的API密钥" ',-1))]),e[27]||(e[27]=t("p",{class:"mb-3 text-sm text-gray-600 dark:text-gray-400"},"然后执行:",-1)),t("div",xt,[t("div",gt," source "+l(r.platform==="macos"?"~/.zshrc":"~/.bashrc"),1)])])],64))])]),t("div",pt,[e[32]||(e[32]=t("h6",{class:"mb-2 font-medium text-indigo-800 dark:text-indigo-300"}," VSCode Claude 插件配置 ",-1)),e[33]||(e[33]=t("p",{class:"mb-3 text-sm text-indigo-700 dark:text-indigo-300"}," 如果使用 VSCode 的 Claude 插件,需要在配置文件中进行设置: ",-1)),t("div",bt,[t("p",ut,[e[30]||(e[30]=t("strong",null,"配置文件位置:",-1)),t("code",yt,l(r.platform==="windows"?"C:\\Users\\你的用户名\\.claude\\config.json":"~/.claude/config.json"),1)]),e[31]||(e[31]=t("p",{class:"text-xs text-indigo-600 dark:text-indigo-400"}," 💡 如果该文件不存在,请手动创建。 ",-1))]),e[34]||(e[34]=t("div",{class:"overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},[t("div",{class:"whitespace-nowrap text-gray-300"},"{"),t("div",{class:"whitespace-nowrap text-gray-300"},'"primaryApiKey": "crs"'),t("div",{class:"whitespace-nowrap text-gray-300"},"}")],-1))]),t("div",vt,[e[42]||(e[42]=t("h6",{class:"mb-2 font-medium text-blue-800 dark:text-blue-300"},"验证环境变量设置",-1)),e[43]||(e[43]=t("p",{class:"mb-3 text-sm text-blue-700 dark:text-blue-300"}," 设置完环境变量后,可以通过以下命令验证是否设置成功: ",-1)),t("div",ct,[t("div",null,[t("h6",wt,l(r.platform==="windows"?"在 PowerShell 中验证:":"在终端中验证:"),1),t("div",ft,[r.platform==="windows"?(a(),d(i,{key:0},[e[35]||(e[35]=t("div",{class:"whitespace-nowrap text-gray-300"},"echo $env:ANTHROPIC_BASE_URL",-1)),e[36]||(e[36]=t("div",{class:"whitespace-nowrap text-gray-300"},"echo $env:ANTHROPIC_AUTH_TOKEN",-1))],64)):(a(),d(i,{key:1},[e[37]||(e[37]=t("div",{class:"whitespace-nowrap text-gray-300"},"echo $ANTHROPIC_BASE_URL",-1)),e[38]||(e[38]=t("div",{class:"whitespace-nowrap text-gray-300"},"echo $ANTHROPIC_AUTH_TOKEN",-1))],64))])])]),t("div",kt,[e[40]||(e[40]=t("p",{class:"text-sm text-blue-700 dark:text-blue-300"},[t("strong",null,"预期输出示例:")],-1)),t("div",ht,[t("div",null,l(w(n)),1),e[39]||(e[39]=t("div",null,"cr_xxxxxxxxxxxxxxxxxx",-1))]),e[41]||(e[41]=t("p",{class:"text-xs text-blue-700 dark:text-blue-300"}," 💡 如果输出为空或显示变量名本身,说明环境变量设置失败,请重新设置。 ",-1))])])]),t("div",St,[e[51]||(e[51]=t("h4",{class:"mb-3 flex items-center text-lg font-semibold text-gray-800 dark:text-gray-300 sm:mb-4 sm:text-xl"},[t("span",{class:"mr-2 flex h-6 w-6 items-center justify-center rounded-full bg-orange-500 text-xs font-bold text-white sm:mr-3 sm:h-8 sm:w-8 sm:text-sm"},"4"),m(" 开始使用 Claude Code ")],-1)),t("div",Et,[e[50]||(e[50]=t("p",{class:"mb-3 text-sm text-gray-700 dark:text-gray-300 sm:mb-4 sm:text-base"}," 现在你可以开始使用 Claude Code 了! ",-1)),t("div",It,[e[49]||(e[49]=t("div",null,[t("h6",{class:"mb-2 text-sm font-medium text-gray-800 dark:text-gray-300 sm:text-base"}," 启动 Claude Code "),t("div",{class:"overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},[t("div",{class:"whitespace-nowrap text-gray-300"},"claude")])],-1)),t("div",null,[e[48]||(e[48]=t("h6",{class:"mb-2 text-sm font-medium text-gray-800 dark:text-gray-300 sm:text-base"}," 在特定项目中使用 ",-1)),t("div",Ct,[e[45]||(e[45]=t("div",{class:"mb-2"},"# 进入你的项目目录",-1)),t("div",$t," cd "+l(r.platform==="windows"?"C:\\path\\to\\your\\project":"/path/to/your/project"),1),e[46]||(e[46]=t("div",{class:"mb-2 mt-2"},"# 启动 Claude Code",-1)),e[47]||(e[47]=t("div",{class:"whitespace-nowrap text-gray-300"},"claude",-1))])])])])]),t("div",_t,[t("h4",At,[e[52]||(e[52]=t("i",{class:"fas fa-wrench mr-2 text-red-600 sm:mr-3"},null,-1)),m(" "+l(s.value)+" 常见问题解决 ",1)]),t("div",Pt,[t("details",Ot,[e[58]||(e[58]=t("summary",{class:"cursor-pointer p-3 text-sm font-medium text-gray-800 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700 sm:p-4 sm:text-base"},' 安装时提示 "permission denied" 错误 ',-1)),t("div",Lt,[e[57]||(e[57]=t("p",{class:"mb-2"},"这通常是权限问题,尝试以下解决方法:",-1)),t("ul",Nt,[r.platform==="windows"?(a(),d(i,{key:0},[e[53]||(e[53]=t("li",null,"以管理员身份运行 PowerShell",-1)),e[54]||(e[54]=t("li",null,[m(" 或者配置 npm 使用用户目录:"),t("code",{class:"rounded bg-gray-200 px-1 text-xs dark:bg-gray-700 sm:text-sm"},"npm config set prefix %APPDATA%\\npm")],-1))],64)):(a(),d(i,{key:1},[e[55]||(e[55]=t("li",null,"使用 sudo 运行安装命令",-1)),e[56]||(e[56]=t("li",null,"或者使用 nvm 安装 Node.js 避免权限问题",-1))],64))])])]),r.platform==="windows"?(a(),d("details",Tt,e[59]||(e[59]=[v('<summary class="cursor-pointer p-3 text-sm font-medium text-gray-800 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700 sm:p-4 sm:text-base"> PowerShell 执行策略错误 </summary><div class="px-3 pb-3 text-gray-600 dark:text-gray-400 sm:px-4 sm:pb-4"><p class="mb-2">如果遇到执行策略限制,运行:</p><div class="overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"><div class="whitespace-nowrap text-gray-300"> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser </div></div></div>',2)]))):$("",!0),t("details",Rt,[e[67]||(e[67]=t("summary",{class:"cursor-pointer p-3 text-sm font-medium text-gray-800 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700 sm:p-4 sm:text-base"}," 环境变量设置后不生效 ",-1)),t("div",Ut,[e[66]||(e[66]=t("p",{class:"mb-2"},"设置永久环境变量后需要:",-1)),t("ul",Kt,[r.platform==="windows"?(a(),d(i,{key:0},[e[60]||(e[60]=t("li",null,"重新启动 PowerShell 或 CMD",-1)),e[61]||(e[61]=t("li",null,"或者注销并重新登录 Windows",-1)),e[62]||(e[62]=t("li",null,[m(" 验证设置:"),t("code",{class:"rounded bg-gray-200 px-1 text-xs dark:bg-gray-700 sm:text-sm"},"echo $env:ANTHROPIC_BASE_URL")],-1))],64)):(a(),d(i,{key:1},[e[64]||(e[64]=t("li",null,"重新打开终端窗口",-1)),t("li",null,[e[63]||(e[63]=m(" 或者执行 ",-1)),t("code",Gt,"source "+l(r.platform==="macos"?"~/.zshrc":"~/.bashrc"),1)]),e[65]||(e[65]=t("li",null,[m(" 验证设置:"),t("code",{class:"rounded bg-gray-200 px-1 text-xs dark:bg-gray-700 sm:text-sm"},"echo $ANTHROPIC_BASE_URL")],-1))],64))])])]),r.platform==="linux"?(a(),d("details",jt,e[68]||(e[68]=[v('<summary class="cursor-pointer p-3 text-sm font-medium text-gray-800 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700 sm:p-4 sm:text-base"> WSL2 中无法访问 Windows 文件 </summary><div class="px-3 pb-3 text-gray-600 dark:text-gray-400 sm:px-4 sm:pb-4"><p class="mb-2">WSL2 可以通过 /mnt/ 路径访问 Windows 文件:</p><div class="overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"><div class="whitespace-nowrap text-gray-300">cd /mnt/c/Users/你的用户名/项目目录</div></div></div>',2)]))):$("",!0)])])]))}},Yt={class:"tutorial-section"},Bt={class:"mb-4 sm:mb-10 sm:mb-6"},Vt={class:"space-y-4"},Dt={class:"rounded-lg border border-green-200 bg-white p-3 dark:border-green-700 dark:bg-gray-800 sm:p-4"},Ht={class:"overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},qt={class:"whitespace-nowrap text-gray-300"},Wt={class:"rounded-lg border border-green-200 bg-white p-3 dark:border-green-700 dark:bg-gray-800 sm:p-4"},zt={class:"mb-3 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},Ft={class:"whitespace-nowrap text-gray-300"},Jt={class:"rounded-lg border border-green-200 bg-white p-3 dark:border-green-700 dark:bg-gray-800 sm:p-4"},Qt={class:"overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},Xt={class:"whitespace-nowrap text-gray-300"},Zt={class:"rounded-lg border border-green-200 bg-white p-3 dark:border-green-700 dark:bg-gray-800 sm:p-4"},te={class:"mb-3 text-sm text-gray-600 dark:text-gray-400"},ee={class:"mb-3 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},se={class:"whitespace-nowrap text-gray-300"},re={class:"overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},oe={class:"whitespace-nowrap text-gray-300"},ae={class:"rounded-lg border border-green-200 bg-green-50 p-3 dark:border-green-500/40 dark:bg-green-950/30 sm:p-4"},de={class:"mb-3 text-sm text-green-700 dark:text-green-300"},le={class:"space-y-1 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},ne={__name:"GeminiCliTutorial",props:{platform:{type:String,required:!0,validator:r=>["windows","macos","linux"].includes(r)}},setup(r){const{geminiBaseUrl:x}=S();return(n,s)=>(a(),d("div",Yt,[f(E,{platform:r.platform,"step-number":1,"tool-name":"Gemini CLI"},null,8,["platform"]),t("div",Bt,[s[27]||(s[27]=t("h4",{class:"mb-3 flex items-center text-lg font-semibold text-gray-800 dark:text-gray-300 sm:mb-4 sm:text-xl"},[t("span",{class:"mr-2 flex h-6 w-6 items-center justify-center rounded-full bg-green-500 text-xs font-bold text-white sm:mr-3 sm:h-8 sm:w-8 sm:text-sm"},"2"),m(" 配置 Gemini CLI 环境变量 ")],-1)),s[28]||(s[28]=t("p",{class:"mb-3 text-sm text-gray-700 dark:text-gray-300 sm:mb-4 sm:text-base"}," 设置以下环境变量以连接到中转服务: ",-1)),t("div",Vt,[r.platform==="windows"?(a(),d(i,{key:0},[t("div",Dt,[s[2]||(s[2]=t("h6",{class:"mb-2 text-sm font-medium text-gray-800 dark:text-gray-300 sm:text-base"}," PowerShell 设置方法 ",-1)),s[3]||(s[3]=t("p",{class:"mb-3 text-sm text-gray-600 dark:text-gray-400"}," 在 PowerShell 中运行以下命令: ",-1)),t("div",Ht,[t("div",qt,' $env:GOOGLE_GEMINI_BASE_URL = "'+l(w(x))+'" ',1),s[0]||(s[0]=t("div",{class:"whitespace-nowrap text-gray-300"},'$env:GEMINI_API_KEY = "你的API密钥"',-1)),s[1]||(s[1]=t("div",{class:"whitespace-nowrap text-gray-300"},' $env:GEMINI_MODEL = "gemini-2.5-pro" ',-1))]),s[4]||(s[4]=t("p",{class:"mt-2 text-xs text-yellow-700 dark:text-yellow-400"}," 💡 使用与 Claude Code 相同的 API 密钥即可。 ",-1))]),t("div",Wt,[s[8]||(s[8]=t("h6",{class:"mb-2 text-sm font-medium text-gray-800 dark:text-gray-300 sm:text-base"}," PowerShell 永久设置(用户级) ",-1)),s[9]||(s[9]=t("p",{class:"mb-3 text-sm text-gray-600 dark:text-gray-400"}," 在 PowerShell 中运行以下命令: ",-1)),t("div",zt,[s[5]||(s[5]=t("div",{class:"mb-2"},"# 设置用户级环境变量(永久生效)",-1)),t("div",Ft,' [System.Environment]::SetEnvironmentVariable("GOOGLE_GEMINI_BASE_URL", "'+l(w(x))+'", [System.EnvironmentVariableTarget]::User) ',1),s[6]||(s[6]=t("div",{class:"whitespace-nowrap text-gray-300"},' [System.Environment]::SetEnvironmentVariable("GEMINI_API_KEY", "你的API密钥", [System.EnvironmentVariableTarget]::User) ',-1)),s[7]||(s[7]=t("div",{class:"whitespace-nowrap text-gray-300"},' [System.Environment]::SetEnvironmentVariable("GEMINI_MODEL", "gemini-2.5-pro", [System.EnvironmentVariableTarget]::User) ',-1))]),s[10]||(s[10]=t("p",{class:"mt-2 text-xs text-blue-700 dark:text-blue-300"}," 💡 设置后需要重新打开 PowerShell 窗口才能生效。 ",-1))])],64)):(a(),d(i,{key:1},[t("div",Jt,[s[13]||(s[13]=t("h6",{class:"mb-2 text-sm font-medium text-gray-800 dark:text-gray-300 sm:text-base"}," 临时设置(当前会话) ",-1)),s[14]||(s[14]=t("p",{class:"mb-3 text-sm text-gray-600 dark:text-gray-400"},"在终端中运行以下命令:",-1)),t("div",Qt,[t("div",Xt,' export GOOGLE_GEMINI_BASE_URL="'+l(w(x))+'" ',1),s[11]||(s[11]=t("div",{class:"whitespace-nowrap text-gray-300"},'export GEMINI_API_KEY="你的API密钥"',-1)),s[12]||(s[12]=t("div",{class:"whitespace-nowrap text-gray-300"},' export GEMINI_MODEL="gemini-2.5-pro" ',-1))]),s[15]||(s[15]=t("p",{class:"mt-2 text-xs text-yellow-700 dark:text-yellow-400"}," 💡 使用与 Claude Code 相同的 API 密钥即可。 ",-1))]),t("div",Zt,[s[18]||(s[18]=t("h6",{class:"mb-2 text-sm font-medium text-gray-800 dark:text-gray-300 sm:text-base"}," 永久设置Shell 配置文件) ",-1)),t("p",te," 将以下内容添加到你的 shell 配置文件中("+l(r.platform==="macos"?"~/.zshrc":"~/.bashrc")+" ",1),t("div",ee,[t("div",se,' export GOOGLE_GEMINI_BASE_URL="'+l(w(x))+'" ',1),s[16]||(s[16]=t("div",{class:"whitespace-nowrap text-gray-300"},'export GEMINI_API_KEY="你的API密钥"',-1)),s[17]||(s[17]=t("div",{class:"whitespace-nowrap text-gray-300"},' export GEMINI_MODEL="gemini-2.5-pro" ',-1))]),s[19]||(s[19]=t("p",{class:"mb-3 text-sm text-gray-600 dark:text-gray-400"},"然后执行:",-1)),t("div",re,[t("div",oe," source "+l(r.platform==="macos"?"~/.zshrc":"~/.bashrc"),1)])])],64)),t("div",ae,[s[26]||(s[26]=t("h6",{class:"mb-2 font-medium text-green-800 dark:text-green-300"}," 验证 Gemini CLI 环境变量 ",-1)),t("p",de,l(r.platform==="windows"?"在 PowerShell 中验证:":"在终端中验证:"),1),t("div",le,[r.platform==="windows"?(a(),d(i,{key:0},[s[20]||(s[20]=t("div",{class:"whitespace-nowrap text-gray-300"},"echo $env:GOOGLE_GEMINI_BASE_URL",-1)),s[21]||(s[21]=t("div",{class:"whitespace-nowrap text-gray-300"},"echo $env:GEMINI_API_KEY",-1)),s[22]||(s[22]=t("div",{class:"whitespace-nowrap text-gray-300"},"echo $env:GEMINI_MODEL",-1))],64)):(a(),d(i,{key:1},[s[23]||(s[23]=t("div",{class:"whitespace-nowrap text-gray-300"},"echo $GOOGLE_GEMINI_BASE_URL",-1)),s[24]||(s[24]=t("div",{class:"whitespace-nowrap text-gray-300"},"echo $GEMINI_API_KEY",-1)),s[25]||(s[25]=t("div",{class:"whitespace-nowrap text-gray-300"},"echo $GEMINI_MODEL",-1))],64))])])])])]))}},me={class:"tutorial-section"},ie={class:"mb-4 sm:mb-10 sm:mb-6"},xe={class:"space-y-4"},ge={class:"rounded-lg border border-yellow-200 bg-yellow-50 p-3 dark:border-yellow-500/40 dark:bg-yellow-950/30 sm:p-4"},pe={class:"mb-3 text-sm text-yellow-700 dark:text-yellow-300"},be={class:"rounded bg-yellow-100 px-1 dark:bg-yellow-900"},ue={class:"overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},ye={class:"mt-2 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},ve={class:"whitespace-nowrap text-gray-300"},ce={class:"rounded-lg border border-orange-200 bg-orange-50 p-3 dark:border-orange-500/40 dark:bg-orange-950/30 sm:p-4"},we={class:"mb-3 text-sm text-orange-700 dark:text-orange-300"},fe={class:"rounded bg-orange-100 px-1 dark:bg-orange-900"},ke={class:"mt-2 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},he={class:"whitespace-nowrap text-gray-300"},Se={class:"rounded-lg border border-purple-200 bg-purple-50 p-3 dark:border-purple-500/40 dark:bg-purple-950/30 sm:p-4"},Ee={class:"mb-1 mt-2 text-sm text-purple-600 dark:text-purple-400"},Ie={class:"mb-3 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},Ce={class:"whitespace-nowrap text-gray-300"},$e={class:"mb-1 text-sm text-purple-600 dark:text-purple-400"},_e={class:"mb-3 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},Ae={class:"whitespace-nowrap text-gray-300"},Pe={class:"rounded-lg border border-green-200 bg-green-50 p-3 dark:border-green-500/40 dark:bg-green-950/30 sm:p-4"},Oe={class:"overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},Le={key:0,class:"whitespace-nowrap text-gray-300"},Ne={key:1,class:"whitespace-nowrap text-gray-300"},Te={class:"rounded-lg border border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800"},Re={class:"px-3 pb-3"},Ue={class:"overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},Ke={key:0,class:"whitespace-nowrap text-gray-300"},Ge={key:1,class:"whitespace-nowrap text-gray-300"},je={__name:"CodexTutorial",props:{platform:{type:String,required:!0,validator:r=>["windows","macos","linux"].includes(r)}},setup(r){const x=r,{openaiBaseUrl:n}=S(),s=b(()=>x.platform==="windows"?"%USERPROFILE%\\.codex\\config.toml":"~/.codex/config.toml"),c=b(()=>x.platform==="windows"?"%USERPROFILE%\\.codex\\auth.json":"~/.codex/auth.json"),e=b(()=>['model_provider = "crs"','model = "gpt-5-codex"','model_reasoning_effort = "high"',"disable_response_storage = true",'preferred_auth_method = "apikey"',"","[model_providers.crs]",'name = "crs"',`base_url = "${n.value}"`,'wire_api = "responses"',"requires_openai_auth = true",'env_key = "CRS_OAI_KEY"']),u=b(()=>e.value.join(`
`)),p=b(()=>x.platform==="windows"?`New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\\.codex" | Out-Null; "${u.value.replace(/"/g,'`"').replace(/\n/g,"`n")}" | Set-Content -Path "$env:USERPROFILE\\.codex\\config.toml" -Force`:`mkdir -p ~/.codex && printf '${u.value.replace(/\n/g,"\\n")}\\n' > ~/.codex/config.toml`),y=b(()=>x.platform==="windows"?`New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\\.codex" | Out-Null; '{"OPENAI_API_KEY": null}' | Set-Content -Path "$env:USERPROFILE\\.codex\\auth.json" -Force`:`mkdir -p ~/.codex && echo '{"OPENAI_API_KEY": null}' > ~/.codex/auth.json`);return(g,o)=>(a(),d("div",me,[f(E,{platform:r.platform,"step-number":1,"tool-name":"Codex"},null,8,["platform"]),t("div",ie,[o[20]||(o[20]=t("h4",{class:"mb-3 flex items-center text-lg font-semibold text-gray-800 dark:text-gray-300 sm:mb-4 sm:text-xl"},[t("span",{class:"mr-2 flex h-6 w-6 items-center justify-center rounded-full bg-indigo-500 text-xs font-bold text-white sm:mr-3 sm:h-8 sm:w-8 sm:text-sm"},"2"),m(" 配置 Codex ")],-1)),o[21]||(o[21]=t("p",{class:"mb-3 text-sm text-gray-700 dark:text-gray-300 sm:mb-4 sm:text-base"}," 配置 Codex 以连接到中转服务: ",-1)),t("div",xe,[t("div",ge,[o[2]||(o[2]=t("h6",{class:"mb-2 font-medium text-yellow-800 dark:text-yellow-300"}," 1. 配置文件 config.toml ",-1)),t("p",pe,[o[0]||(o[0]=m(" 在 ",-1)),t("code",be,l(s.value),1),o[1]||(o[1]=m(" 文件开头添加以下配置: ",-1))]),t("div",ue,[(a(!0),d(i,null,h(e.value,I=>(a(),d("div",{key:I,class:k(["whitespace-nowrap text-gray-300",{"mt-2":I===""}])},l(I||" "),3))),128))]),o[3]||(o[3]=t("p",{class:"mt-3 text-sm text-yellow-600 dark:text-yellow-400"},"一键写入命令:",-1)),t("div",ye,[t("div",ve,l(p.value),1)])]),t("div",ce,[o[6]||(o[6]=t("h6",{class:"mb-2 font-medium text-orange-800 dark:text-orange-300"}," 2. 认证文件 auth.json ",-1)),t("p",we,[o[4]||(o[4]=m(" 在 ",-1)),t("code",fe,l(c.value),1),o[5]||(o[5]=m(" 文件中配置: ",-1))]),o[7]||(o[7]=v('<div class="overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"><div class="whitespace-nowrap text-gray-300">{</div><div class="whitespace-nowrap text-gray-300">  &quot;OPENAI_API_KEY&quot;: null</div><div class="whitespace-nowrap text-gray-300">}</div></div><div class="mt-3 rounded border border-red-200 bg-red-50 p-2 dark:border-red-500/40 dark:bg-red-950/30"><p class="text-sm font-semibold text-red-700 dark:text-red-300"> ⚠️ 必须将 OPENAI_API_KEY 设置为 null否则 Codex 会优先使用它而忽略环境变量! </p></div><p class="mt-3 text-sm text-orange-600 dark:text-orange-400">一键写入命令:</p>',3)),t("div",ke,[t("div",he,l(y.value),1)])]),t("div",Se,[o[11]||(o[11]=t("h6",{class:"mb-2 font-medium text-purple-800 dark:text-purple-300"}," 3. 设置环境变量 CRS_OAI_KEY ",-1)),o[12]||(o[12]=t("p",{class:"mb-3 text-sm text-purple-700 dark:text-purple-300"}," 设置环境变量 CRS_OAI_KEY 为您的 API 密钥(格式如 cr_xxxxxxxxxx ",-1)),r.platform==="windows"?(a(),d(i,{key:0},[o[8]||(o[8]=v('<p class="mb-1 text-sm text-purple-600 dark:text-purple-400"> 系统级环境变量(推荐): </p><div class="mb-3 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"><div class="whitespace-nowrap text-gray-300"> [System.Environment]::SetEnvironmentVariable(&quot;CRS_OAI_KEY&quot;, &quot;cr_xxxxxxxxxx&quot;, [System.EnvironmentVariableTarget]::Machine) </div></div><p class="mb-1 text-sm text-purple-600 line-through opacity-60 dark:text-purple-400"> 用户级环境变量 <span class="text-xs text-red-500">(不推荐)</span></p><div class="mb-3 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 opacity-60 sm:p-3 sm:text-sm"><div class="whitespace-nowrap text-gray-300 line-through"> [System.Environment]::SetEnvironmentVariable(&quot;CRS_OAI_KEY&quot;, &quot;cr_xxxxxxxxxx&quot;, [System.EnvironmentVariableTarget]::User) </div></div><p class="text-sm text-purple-600 dark:text-purple-400"> 💡 设置后需要重新打开终端窗口才能生效 </p>',5))],64)):(a(),d(i,{key:1},[o[9]||(o[9]=v('<p class="mb-1 text-sm text-purple-600 dark:text-purple-400"> 检查当前 shell<code class="rounded bg-purple-100 px-1 dark:bg-purple-900">echo $SHELL</code></p><details class="my-3 rounded-lg border border-blue-200 bg-blue-50 dark:border-blue-500/40 dark:bg-blue-950/30"><summary class="cursor-pointer p-2 text-sm font-medium text-blue-800 dark:text-blue-300"> 检查是否已有旧配置 </summary><div class="px-3 pb-3"><p class="mb-2 text-sm text-blue-700 dark:text-blue-300"> 如果之前配置过,建议先检查并清理旧配置: </p><div class="mb-2 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"><div class="text-gray-500"># zsh</div><div class="whitespace-nowrap text-gray-300">grep &#39;CRS_OAI_KEY&#39; ~/.zshrc</div><div class="mt-1 text-gray-500"># bash</div><div class="whitespace-nowrap text-gray-300">grep &#39;CRS_OAI_KEY&#39; ~/.bashrc</div></div><p class="text-sm text-blue-600 dark:text-blue-400"> 如果有输出,说明已配置过,可以手动编辑文件修改或删除旧配置 </p></div></details>',2)),t("p",Ee,l(r.platform==="macos"?"zsh (macOS 默认)":"bash (Linux 默认)")+" ",1),t("div",Ie,[t("div",Ce,` echo 'export CRS_OAI_KEY="cr_xxxxxxxxxx"' >> `+l(r.platform==="macos"?"~/.zshrc && source ~/.zshrc":"~/.bashrc && source ~/.bashrc"),1)]),t("p",$e,l(r.platform==="macos"?"bash":"zsh")+" ",1),t("div",_e,[t("div",Ae,` echo 'export CRS_OAI_KEY="cr_xxxxxxxxxx"' >> `+l(r.platform==="macos"?"~/.bashrc && source ~/.bashrc":"~/.zshrc && source ~/.zshrc"),1)]),o[10]||(o[10]=t("p",{class:"text-sm text-purple-600 dark:text-purple-400"}," 💡 设置后需要重新打开终端窗口或执行 source 命令才能生效 ",-1))],64))]),t("div",Pe,[o[13]||(o[13]=t("h6",{class:"mb-2 font-medium text-green-800 dark:text-green-300"},"4. 验证环境变量",-1)),o[14]||(o[14]=t("p",{class:"mb-2 text-sm text-green-700 dark:text-green-300"}," 重新打开终端后,验证环境变量是否设置成功: ",-1)),t("div",Oe,[r.platform==="windows"?(a(),d("div",Le," Get-ChildItem Env:CRS_OAI_KEY ")):(a(),d("div",Ne,' echo "CRS_OAI_KEY: $CRS_OAI_KEY" '))])]),t("details",Te,[o[18]||(o[18]=t("summary",{class:"cursor-pointer p-3 text-sm font-medium text-gray-800 dark:text-gray-300"}," 如何删除环境变量 ",-1)),t("div",Re,[r.platform==="windows"?(a(),d(i,{key:0},[o[15]||(o[15]=v('<p class="mb-1 text-sm text-gray-600 dark:text-gray-400">删除用户级环境变量:</p><div class="mb-2 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"><div class="whitespace-nowrap text-gray-300"> [System.Environment]::SetEnvironmentVariable(&quot;CRS_OAI_KEY&quot;, $null, [System.EnvironmentVariableTarget]::User) </div></div><p class="mb-1 text-sm text-gray-600 dark:text-gray-400">删除系统级环境变量:</p><div class="mb-2 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"><div class="whitespace-nowrap text-gray-300"> [System.Environment]::SetEnvironmentVariable(&quot;CRS_OAI_KEY&quot;, $null, [System.EnvironmentVariableTarget]::Machine) </div></div>',4))],64)):(a(),d(i,{key:1},[o[16]||(o[16]=v('<p class="mb-1 text-sm text-gray-600 dark:text-gray-400">从 zsh 配置中删除:</p><div class="mb-2 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"><div class="text-gray-500"># 删除包含 CRS_OAI_KEY 的行</div><div class="whitespace-nowrap text-gray-300"> sed -i &#39;&#39; &#39;/CRS_OAI_KEY/d&#39; ~/.zshrc &amp;&amp; source ~/.zshrc </div></div><p class="mb-1 text-sm text-gray-600 dark:text-gray-400">从 bash 配置中删除:</p><div class="mb-2 overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"><div class="text-gray-500"># 删除包含 CRS_OAI_KEY 的行</div><div class="whitespace-nowrap text-gray-300"> sed -i &#39;&#39; &#39;/CRS_OAI_KEY/d&#39; ~/.bashrc &amp;&amp; source ~/.bashrc </div></div>',4))],64)),o[17]||(o[17]=t("p",{class:"mb-1 text-sm text-gray-600 dark:text-gray-400"},"验证是否删除成功:",-1)),t("div",Ue,[r.platform==="windows"?(a(),d("div",Ke," Get-ChildItem Env:CRS_OAI_KEY ")):(a(),d("div",Ge,' echo "CRS_OAI_KEY: $CRS_OAI_KEY" '))])])]),o[19]||(o[19]=t("div",{class:"rounded-lg border border-yellow-200 bg-yellow-50 p-3 dark:border-yellow-500/40 dark:bg-yellow-950/30 sm:p-4"},[t("p",{class:"text-sm text-yellow-700 dark:text-yellow-300"},[m(" 💡 请将示例中的 "),t("code",{class:"rounded bg-yellow-100 px-1 dark:bg-yellow-900"},"cr_xxxxxxxxxx"),m(" 替换为您的实际 API 密钥 ")])],-1))])])]))}},Me={class:"tutorial-section"},Ye={class:"mb-4 sm:mb-10 sm:mb-6"},Be={class:"mb-3 text-sm text-gray-700 dark:text-gray-300 sm:mb-4 sm:text-base"},Ve={class:"rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-500/40 dark:bg-blue-950/30 sm:p-4"},De={class:"overflow-x-auto rounded bg-gray-900 p-2 font-mono text-xs text-green-400 sm:p-3 sm:text-sm"},He={__name:"DroidCliTutorial",props:{platform:{type:String,required:!0,validator:r=>["windows","macos","linux"].includes(r)}},setup(r){const{droidClaudeBaseUrl:x,droidOpenaiBaseUrl:n}=S(),s=b(()=>["{",' "custom_models": ['," {",' "model_display_name": "Sonnet 4.5 [crs]",',' "model": "claude-sonnet-4-5-20250929",',` "base_url": "${x.value}",`,' "api_key": "你的API密钥",',' "provider": "anthropic",',' "max_tokens": 8192'," },"," {",' "model_display_name": "GPT5-Codex [crs]",',' "model": "gpt-5-codex",',` "base_url": "${n.value}",`,' "api_key": "你的API密钥",',' "provider": "openai",',' "max_tokens": 16384'," }"," ]","}"]);return(c,e)=>(a(),d("div",Me,[f(E,{platform:r.platform,"step-number":1,"tool-name":"Droid CLI"},null,8,["platform"]),t("div",Ye,[e[12]||(e[12]=t("h4",{class:"mb-3 flex items-center text-lg font-semibold text-gray-800 dark:text-gray-300 sm:mb-4 sm:text-xl"},[t("span",{class:"mr-2 flex h-6 w-6 items-center justify-center rounded-full bg-blue-500 text-xs font-bold text-white sm:mr-3 sm:h-8 sm:w-8 sm:text-sm"},"2"),m(" 配置 Droid CLI ")],-1)),t("p",Be,[e[6]||(e[6]=m(" Droid CLI 使用 ",-1)),e[7]||(e[7]=t("code",{class:"rounded bg-gray-100 px-1 dark:bg-gray-800"},"~/.factory/config.json",-1)),e[8]||(e[8]=m(" 保存自定义模型; ",-1)),r.platform==="windows"?(a(),d(i,{key:0},[e[0]||(e[0]=m(" 在 Windows 中可直接编辑 ",-1)),e[1]||(e[1]=t("code",{class:"rounded bg-gray-100 px-1 dark:bg-gray-800"},"C:\\Users\\你的用户名\\.factory\\config.json",-1)),e[2]||(e[2]=m("。 ",-1))],64)):(a(),d(i,{key:1},[e[3]||(e[3]=m(" 在终端中可使用 ",-1)),e[4]||(e[4]=t("code",{class:"rounded bg-gray-100 px-1 dark:bg-gray-800"},"vim ~/.factory/config.json",-1)),e[5]||(e[5]=m(" 编辑。 ",-1))],64))]),t("div",Ve,[e[9]||(e[9]=t("h6",{class:"mb-2 text-sm font-medium text-blue-800 dark:text-blue-200 sm:text-base"}," 配置文件示例 ",-1)),e[10]||(e[10]=t("p",{class:"mb-3 text-sm text-blue-700 dark:text-blue-200"}," 将以下内容追加到配置文件中,并替换示例中的域名和 API 密钥: ",-1)),t("div",De,[(a(!0),d(i,null,h(s.value,(u,p)=>(a(),d("div",{key:u+p,class:"whitespace-pre text-gray-300"},l(u),1))),128))]),e[11]||(e[11]=t("p",{class:"mt-3 text-xs text-blue-700 dark:text-blue-200 sm:text-sm"}," 💡 在 Droid CLI 中选择自定义模型即可使用新的 Droid 账号池;确保服务地址可被本地访问。 ",-1))])])]))}},qe={class:"card p-3 sm:p-6"},We={class:"mb-4 sm:mb-8"},ze={class:"mb-3 flex items-center text-xl font-bold text-gray-900 dark:text-gray-100 sm:mb-4 sm:text-2xl"},Fe={class:"text-sm text-gray-600 dark:text-gray-400 sm:text-lg"},Je={class:"mb-4 sm:mb-6"},Qe={class:"flex flex-wrap gap-1 rounded-xl bg-gray-100 p-1 dark:bg-gray-800 sm:gap-2 sm:p-2"},Xe=["onClick"],Ze={class:"mb-4 sm:mb-8"},ts={class:"flex flex-wrap gap-1 rounded-xl bg-gray-100 p-1 dark:bg-gray-800 sm:gap-2 sm:p-2"},es=["onClick"],ss={__name:"TutorialView",setup(r){const x=_("windows"),n=_("claude-code"),s=[{key:"windows",name:"Windows",icon:"fab fa-windows"},{key:"macos",name:"macOS",icon:"fab fa-apple"},{key:"linux",name:"Linux / WSL2",icon:"fab fa-linux"}],c=[{key:"claude-code",name:"Claude Code",icon:"fas fa-robot",component:Mt},{key:"codex",name:"Codex",icon:"fas fa-code",component:je},{key:"gemini-cli",name:"Gemini CLI",icon:"fab fa-google",component:ne},{key:"droid-cli",name:"Droid CLI",icon:"fas fa-terminal",component:He}],e=b(()=>{const p=c.find(y=>y.key===n.value);return p?p.name:"CLI 工具"}),u=b(()=>{const p=c.find(y=>y.key===n.value);return p?p.component:null});return(p,y)=>(a(),d("div",qe,[t("div",We,[t("h3",ze,[y[0]||(y[0]=t("i",{class:"fas fa-graduation-cap mr-2 text-blue-600 sm:mr-3"},null,-1)),m(" "+l(e.value)+" 使用教程 ",1)]),t("p",Fe," 跟着这个教程,你可以轻松在自己的电脑上安装并使用 "+l(e.value)+"。 ",1)]),t("div",Je,[t("div",Qe,[(a(),d(i,null,h(s,g=>t("button",{key:g.key,class:k(["flex flex-1 items-center justify-center gap-1 rounded-lg px-3 py-2 text-xs font-semibold transition-all duration-300 sm:gap-2 sm:px-6 sm:py-3 sm:text-sm",x.value===g.key?"bg-white text-blue-600 shadow-sm dark:bg-blue-600 dark:text-white dark:shadow-blue-500/40":"text-gray-600 hover:bg-white/50 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-700 dark:hover:text-white"]),onClick:o=>x.value=g.key},[t("i",{class:k(g.icon)},null,2),m(" "+l(g.name),1)],10,Xe)),64))])]),t("div",Ze,[t("div",ts,[(a(),d(i,null,h(c,g=>t("button",{key:g.key,class:k(["flex flex-1 items-center justify-center gap-1 rounded-lg px-3 py-2 text-xs font-semibold transition-all duration-300 sm:gap-2 sm:px-4 sm:py-3 sm:text-sm",n.value===g.key?"bg-white text-blue-600 shadow-sm dark:bg-blue-600 dark:text-white dark:shadow-blue-500/40":"text-gray-600 hover:bg-white/50 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-700 dark:hover:text-white"]),onClick:o=>n.value=g.key},[t("i",{class:k(g.icon)},null,2),m(" "+l(g.name),1)],10,es)),64))])]),(a(),A(P(u.value),{platform:x.value},null,8,["platform"]))]))}},as=O(ss,[["__scopeId","data-v-c8fcc5f9"]]);export{as as T};