"use strict";(globalThis.webpackChunkproject_public_docs=globalThis.webpackChunkproject_public_docs||[]).push([[105],{2403(e,n,d){d.r(n),d.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>a,frontMatter:()=>l,metadata:()=>s,toc:()=>t});const s=JSON.parse('{"id":"reference/providers","title":"Provider Setup Guide","description":"CmdForge works with any AI CLI tool that accepts input via stdin or arguments. This guide covers setup for the most popular providers.","source":"@site/docs/reference/providers.md","sourceDirName":"reference","slug":"/reference/providers","permalink":"/rob/CmdForge/reference/providers","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_label":"Provider Setup","sidebar_position":1,"format":"md"},"sidebar":"docs","previous":{"title":"Reference","permalink":"/rob/CmdForge/category/reference"},"next":{"title":"Registry API","permalink":"/rob/CmdForge/reference/registry-spec"}}');var i=d(4848),r=d(8453);const l={sidebar_label:"Provider Setup",sidebar_position:1,format:"md"},c="Provider Setup Guide",o={},t=[{value:"Provider Comparison",id:"provider-comparison",level:2},{value:"Recommendations",id:"recommendations",level:3},{value:"Provider Setup",id:"provider-setup",level:2},{value:"OpenCode (Recommended)",id:"opencode-recommended",level:3},{value:"Claude CLI",id:"claude-cli",level:3},{value:"Codex (OpenAI)",id:"codex-openai",level:3},{value:"Gemini",id:"gemini",level:3},{value:"Managing Providers",id:"managing-providers",level:2},{value:"Interactive Installation (Recommended)",id:"interactive-installation-recommended",level:3},{value:"List Providers",id:"list-providers",level:3},{value:"Check Availability",id:"check-availability",level:3},{value:"Add Custom Provider",id:"add-custom-provider",level:3},{value:"Provider Command Format",id:"provider-command-format",level:3},{value:"Using Providers in Tools",id:"using-providers-in-tools",level:2},{value:"In Tool Config",id:"in-tool-config",level:3},{value:"Override at Runtime",id:"override-at-runtime",level:3},{value:"Provider Selection Strategy",id:"provider-selection-strategy",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:""Provider 'X' not found"",id:"provider-x-not-found",level:3},{value:""Command 'X' not found"",id:"command-x-not-found",level:3},{value:"Slow Provider",id:"slow-provider",level:3},{value:"Cost Optimization",id:"cost-optimization",level:2},{value:"Free Providers",id:"free-providers",level:3},{value:"Cheap Providers",id:"cheap-providers",level:3},{value:"Tips",id:"tips",level:3},{value:"Adding New Providers",id:"adding-new-providers",level:2}];function h(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"provider-setup-guide",children:"Provider Setup Guide"})}),"\n",(0,i.jsx)(n.p,{children:"CmdForge works with any AI CLI tool that accepts input via stdin or arguments. This guide covers setup for the most popular providers."}),"\n",(0,i.jsx)(n.h2,{id:"provider-comparison",children:"Provider Comparison"}),"\n",(0,i.jsx)(n.p,{children:"We profiled 12 providers with a 4-task benchmark (Math, Code, Reasoning, Data Extraction):"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Provider"}),(0,i.jsx)(n.th,{children:"Speed"}),(0,i.jsx)(n.th,{children:"Score"}),(0,i.jsx)(n.th,{children:"Cost"}),(0,i.jsx)(n.th,{children:"Best For"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"opencode-deepseek"})}),(0,i.jsx)(n.td,{children:"13s"}),(0,i.jsx)(n.td,{children:"4/4"}),(0,i.jsx)(n.td,{children:"~$0.28/M tokens"}),(0,i.jsxs)(n.td,{children:[(0,i.jsx)(n.strong,{children:"Best value"})," - daily driver"]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"opencode-pickle"})}),(0,i.jsx)(n.td,{children:"13s"}),(0,i.jsx)(n.td,{children:"4/4"}),(0,i.jsx)(n.td,{children:"FREE"}),(0,i.jsxs)(n.td,{children:[(0,i.jsx)(n.strong,{children:"Best free"})," - accurate"]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"claude-haiku"})}),(0,i.jsx)(n.td,{children:"14s"}),(0,i.jsx)(n.td,{children:"4/4"}),(0,i.jsx)(n.td,{children:"~$0.25/M tokens"}),(0,i.jsx)(n.td,{children:"Fast + high quality"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"codex"})}),(0,i.jsx)(n.td,{children:"14s"}),(0,i.jsx)(n.td,{children:"4/4"}),(0,i.jsx)(n.td,{children:"~$1.25/M tokens"}),(0,i.jsx)(n.td,{children:"Reliable, auto-routes"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"claude"})}),(0,i.jsx)(n.td,{children:"18s"}),(0,i.jsx)(n.td,{children:"4/4"}),(0,i.jsx)(n.td,{children:"Varies"}),(0,i.jsx)(n.td,{children:"Auto-routes to best"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"claude-opus"})}),(0,i.jsx)(n.td,{children:"18s"}),(0,i.jsx)(n.td,{children:"4/4"}),(0,i.jsx)(n.td,{children:"~$15/M tokens"}),(0,i.jsx)(n.td,{children:"Highest quality"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"claude-sonnet"})}),(0,i.jsx)(n.td,{children:"21s"}),(0,i.jsx)(n.td,{children:"4/4"}),(0,i.jsx)(n.td,{children:"~$3/M tokens"}),(0,i.jsx)(n.td,{children:"Balanced"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"opencode-nano"})}),(0,i.jsx)(n.td,{children:"24s"}),(0,i.jsx)(n.td,{children:"4/4"}),(0,i.jsx)(n.td,{children:"Paid"}),(0,i.jsx)(n.td,{children:"GPT-5 Nano"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"gemini-flash"})}),(0,i.jsx)(n.td,{children:"28s"}),(0,i.jsx)(n.td,{children:"4/4"}),(0,i.jsx)(n.td,{children:"~$0.075/M tokens"}),(0,i.jsx)(n.td,{children:"Google, faster"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"opencode-reasoner"})}),(0,i.jsx)(n.td,{children:"33s"}),(0,i.jsx)(n.td,{children:"4/4"}),(0,i.jsx)(n.td,{children:"~$0.28/M tokens"}),(0,i.jsx)(n.td,{children:"Complex reasoning"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"gemini"})}),(0,i.jsx)(n.td,{children:"91s"}),(0,i.jsx)(n.td,{children:"3/4"}),(0,i.jsx)(n.td,{children:"~$1.25/M tokens"}),(0,i.jsx)(n.td,{children:"1M token context"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"opencode-grok"})}),(0,i.jsx)(n.td,{children:"11s"}),(0,i.jsx)(n.td,{children:"2/4"}),(0,i.jsx)(n.td,{children:"FREE"}),(0,i.jsx)(n.td,{children:"Fastest but unreliable"})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"recommendations",children:"Recommendations"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Daily use:"})," ",(0,i.jsx)(n.code,{children:"opencode-deepseek"})," or ",(0,i.jsx)(n.code,{children:"opencode-pickle"})," (free)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Quality work:"})," ",(0,i.jsx)(n.code,{children:"claude-haiku"})," or ",(0,i.jsx)(n.code,{children:"claude-opus"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Complex reasoning:"})," ",(0,i.jsx)(n.code,{children:"opencode-reasoner"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Large documents:"})," ",(0,i.jsx)(n.code,{children:"gemini"})," (1M token context window)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Budget:"})," ",(0,i.jsx)(n.code,{children:"opencode-pickle"})," (free) or ",(0,i.jsx)(n.code,{children:"opencode-deepseek"})," (cheap)"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"provider-setup",children:"Provider Setup"}),"\n",(0,i.jsx)(n.h3,{id:"opencode-recommended",children:"OpenCode (Recommended)"}),"\n",(0,i.jsx)(n.p,{children:"OpenCode provides access to multiple models including free options."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Install:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"curl -fsSL https://opencode.ai/install | bash\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Authenticate:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"~/.opencode/bin/opencode auth\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Available Models:"})}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Provider Name"}),(0,i.jsx)(n.th,{children:"Model"}),(0,i.jsx)(n.th,{children:"Cost"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"opencode-deepseek"})}),(0,i.jsx)(n.td,{children:"deepseek-chat"}),(0,i.jsx)(n.td,{children:"Cheap"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"opencode-pickle"})}),(0,i.jsx)(n.td,{children:"big-pickle"}),(0,i.jsx)(n.td,{children:"FREE"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"opencode-grok"})}),(0,i.jsx)(n.td,{children:"grok-code"}),(0,i.jsx)(n.td,{children:"FREE"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"opencode-nano"})}),(0,i.jsx)(n.td,{children:"gpt-5-nano"}),(0,i.jsx)(n.td,{children:"Paid"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"opencode-reasoner"})}),(0,i.jsx)(n.td,{children:"deepseek-reasoner"}),(0,i.jsx)(n.td,{children:"Cheap"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Test:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'echo "Hello" | ~/.opencode/bin/opencode run --model opencode/big-pickle\n'})}),"\n",(0,i.jsx)(n.h3,{id:"claude-cli",children:"Claude CLI"}),"\n",(0,i.jsx)(n.p,{children:"Anthropic's official CLI for Claude models."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Install:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"npm install -g @anthropic-ai/claude-code\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Authenticate:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"claude # Opens browser for sign-in (auto-saves auth tokens)\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Available Models:"})}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Provider Name"}),(0,i.jsx)(n.th,{children:"Model"}),(0,i.jsx)(n.th,{children:"Cost"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"claude"})}),(0,i.jsx)(n.td,{children:"Auto-routes"}),(0,i.jsx)(n.td,{children:"Varies"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"claude-haiku"})}),(0,i.jsx)(n.td,{children:"Haiku 4.5"}),(0,i.jsx)(n.td,{children:"Cheap"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"claude-sonnet"})}),(0,i.jsx)(n.td,{children:"Sonnet 4.5"}),(0,i.jsx)(n.td,{children:"Medium"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"claude-opus"})}),(0,i.jsx)(n.td,{children:"Opus 4.5"}),(0,i.jsx)(n.td,{children:"Expensive"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Test:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'echo "Hello" | claude -p\n'})}),"\n",(0,i.jsx)(n.h3,{id:"codex-openai",children:"Codex (OpenAI)"}),"\n",(0,i.jsx)(n.p,{children:"OpenAI's Codex CLI with auto-routing."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Install:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"npm install -g @openai/codex\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Authenticate:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"codex # Opens browser for sign-in (auto-saves auth tokens)\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Test:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'echo "Hello" | codex exec -\n'})}),"\n",(0,i.jsx)(n.h3,{id:"gemini",children:"Gemini"}),"\n",(0,i.jsx)(n.p,{children:"Google's Gemini models. Best for large context (1M tokens)."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Install:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"npm install -g @google/gemini-cli\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Authenticate:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"gemini # Opens browser for Google sign-in\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Available Models:"})}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Provider Name"}),(0,i.jsx)(n.th,{children:"Model"}),(0,i.jsx)(n.th,{children:"Notes"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"gemini"})}),(0,i.jsx)(n.td,{children:"gemini-2.5-pro"}),(0,i.jsx)(n.td,{children:"Quality, slow CLI"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"gemini-flash"})}),(0,i.jsx)(n.td,{children:"gemini-2.5-flash"}),(0,i.jsx)(n.td,{children:"Faster"})]})]})]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Note:"})," Gemini CLI has known performance issues. Use ",(0,i.jsx)(n.code,{children:"gemini-flash"})," for interactive tasks, ",(0,i.jsx)(n.code,{children:"gemini"})," for large documents."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Test:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'echo "Hello" | gemini --model gemini-2.5-flash\n'})}),"\n",(0,i.jsx)(n.h2,{id:"managing-providers",children:"Managing Providers"}),"\n",(0,i.jsx)(n.h3,{id:"interactive-installation-recommended",children:"Interactive Installation (Recommended)"}),"\n",(0,i.jsx)(n.p,{children:"The easiest way to install providers:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cmdforge providers install\n"})}),"\n",(0,i.jsx)(n.p,{children:"This interactive guide:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Shows available AI providers with costs"}),"\n",(0,i.jsx)(n.li,{children:"Runs the installation command"}),"\n",(0,i.jsx)(n.li,{children:"Updates PATH automatically"}),"\n",(0,i.jsx)(n.li,{children:"Shows next steps for authentication"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"list-providers",children:"List Providers"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cmdforge providers list\n"})}),"\n",(0,i.jsx)(n.h3,{id:"check-availability",children:"Check Availability"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cmdforge providers check\n"})}),"\n",(0,i.jsx)(n.h3,{id:"add-custom-provider",children:"Add Custom Provider"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'cmdforge providers add myname "my-command --args" -d "Description"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Or edit ",(0,i.jsx)(n.code,{children:"~/.cmdforge/providers.yaml"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"providers:\n - name: my-custom\n command: my-ai-tool --prompt\n description: My custom AI tool\n"})}),"\n",(0,i.jsx)(n.h3,{id:"provider-command-format",children:"Provider Command Format"}),"\n",(0,i.jsx)(n.p,{children:"The command should:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Accept input via stdin"}),"\n",(0,i.jsx)(n.li,{children:"Output response to stdout"}),"\n",(0,i.jsx)(n.li,{children:"Exit 0 on success"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Example commands:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# Claude\nclaude -p\n\n# OpenCode\n$HOME/.opencode/bin/opencode run --model deepseek/deepseek-chat\n\n# Gemini\ngemini --model gemini-2.5-flash\n\n# Codex\ncodex exec -\n\n# Custom (any tool that reads stdin)\nmy-tool --input -\n"})}),"\n",(0,i.jsx)(n.h2,{id:"using-providers-in-tools",children:"Using Providers in Tools"}),"\n",(0,i.jsx)(n.h3,{id:"in-tool-config",children:"In Tool Config"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'steps:\n - type: prompt\n prompt: "Summarize: {input}"\n provider: opencode-pickle # Use this provider\n output_var: response\n'})}),"\n",(0,i.jsx)(n.h3,{id:"override-at-runtime",children:"Override at Runtime"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# Use a different provider for this run\ncat file.txt | summarize --provider claude-opus\n"})}),"\n",(0,i.jsx)(n.h3,{id:"provider-selection-strategy",children:"Provider Selection Strategy"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Tool default"})," - Set in tool's config.yaml"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Runtime override"})," - ",(0,i.jsx)(n.code,{children:"--provider"})," flag"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Cost optimization"})," - Use cheap providers for simple tasks"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Quality needs"})," - Use opus/sonnet for important work"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsx)(n.h3,{id:"provider-x-not-found",children:"\"Provider 'X' not found\""}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Check it's in your providers list: ",(0,i.jsx)(n.code,{children:"cmdforge providers"})]}),"\n",(0,i.jsxs)(n.li,{children:["Verify the command works: ",(0,i.jsx)(n.code,{children:'echo "test" | '})]}),"\n",(0,i.jsxs)(n.li,{children:["Add it: ",(0,i.jsx)(n.code,{children:"cmdforge providers add"})]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"command-x-not-found",children:"\"Command 'X' not found\""}),"\n",(0,i.jsx)(n.p,{children:"The AI CLI tool isn't installed or not in PATH:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"which claude # Should show path\nwhich opencode # Might need full path\n"})}),"\n",(0,i.jsx)(n.p,{children:"For OpenCode, use full path in provider:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"command: $HOME/.opencode/bin/opencode run\n"})}),"\n",(0,i.jsx)(n.h3,{id:"slow-provider",children:"Slow Provider"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Use ",(0,i.jsx)(n.code,{children:"gemini-flash"})," instead of ",(0,i.jsx)(n.code,{children:"gemini"})]}),"\n",(0,i.jsxs)(n.li,{children:["Use ",(0,i.jsx)(n.code,{children:"claude-haiku"})," instead of ",(0,i.jsx)(n.code,{children:"claude-opus"})]}),"\n",(0,i.jsxs)(n.li,{children:["Use ",(0,i.jsx)(n.code,{children:"opencode-deepseek"})," for best speed/quality ratio"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"cost-optimization",children:"Cost Optimization"}),"\n",(0,i.jsx)(n.h3,{id:"free-providers",children:"Free Providers"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"opencode-pickle"})," - Big Pickle model (FREE, accurate)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"opencode-grok"})," - Grok Code (FREE, fast but less reliable)"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"cheap-providers",children:"Cheap Providers"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"opencode-deepseek"})," - ~$0.28/M tokens"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"opencode-reasoner"})," - ~$0.28/M tokens"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"claude-haiku"})," - ~$0.25/M tokens"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"tips",children:"Tips"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Use ",(0,i.jsx)(n.code,{children:"opencode-pickle"})," for simple tasks (free + accurate)"]}),"\n",(0,i.jsxs)(n.li,{children:["Use ",(0,i.jsx)(n.code,{children:"claude-haiku"})," when you need reliability"]}),"\n",(0,i.jsxs)(n.li,{children:["Reserve ",(0,i.jsx)(n.code,{children:"claude-opus"})," for important work"]}),"\n",(0,i.jsxs)(n.li,{children:["Use ",(0,i.jsx)(n.code,{children:"gemini"})," only for large document analysis"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"adding-new-providers",children:"Adding New Providers"}),"\n",(0,i.jsx)(n.p,{children:"Any CLI tool that:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Reads from stdin"}),"\n",(0,i.jsx)(n.li,{children:"Writes to stdout"}),"\n",(0,i.jsx)(n.li,{children:"Exits 0 on success"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Can be a provider. Examples:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Local LLM (Ollama):"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"- name: ollama-llama\n command: ollama run llama3\n description: Local Llama 3\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Custom API wrapper:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"- name: my-api\n command: curl -s -X POST https://my-api.com/chat -d @-\n description: My custom API\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Python script:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"- name: my-python\n command: python3 ~/scripts/my_ai.py\n description: Custom Python AI\n"})})]})}function a(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,n,d){d.d(n,{R:()=>l,x:()=>c});var s=d(6540);const i={},r=s.createContext(i);function l(e){const n=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);