TL;DR
กำหนดค่า CometAPI เพียงครั้งเดียวใน OpenCode แล้วเลือก Claude, GPT หรือ DeepSeek สำหรับงานเขียนโปรแกรมของคุณ คู่มือนี้ขยายความจาก คู่มือการผสาน CometAPI กับ OpenCode อย่างเป็นทางการ ไปสู่การตั้งค่าโปรเจ็กต์ครบถ้วน: ใช้คีย์ API ของ CometAPI เพียงชุดเดียว ไฟล์กำหนดค่าที่มีตัวอย่างโมเดล 3 รายการ คำสั่งสลับโมเดล และงาน JavaScript ขนาดเล็กพร้อมการตรวจสอบที่ทำซ้ำได้
Key Takeaways
- การตั้งค่า OpenCode กับ CometAPI ต้องใช้ provider ID, API base URL, credential และ model ID
- ใช้ {env:COMETAPI_KEY} เพื่อไม่ให้คีย์ API จริงถูกบันทึกใน opencode.json
- ลงทะเบียนตัวอย่าง Claude, GPT และ DeepSeek ใน opencode.json ไฟล์เดียว ทั้งสามรายการใช้คีย์และ gateway ของ CometAPI ชุดเดียวกัน
- สลับผู้ให้บริการ/โมเดลที่เลือกใน OpenCode ได้โดยไม่ต้องขอคีย์ของ Anthropic, OpenAI และ DeepSeek แยกกัน
- ระวังตัวแปรสภาพแวดล้อมที่หายไป เส้นทาง API ไม่ตรงกัน และพรอมต์ขออนุมัติที่อาจดูเหมือนคำขอที่ค้างอยู่
What Is OpenCode and Why Use It with CometAPI?
OpenCode เป็นเอเย่นต์โค้ดดิ้งแบบโอเพนซอร์ซที่มีส่วนติดต่อผ่านเทอร์มินัล แอปเดสก์ท็อป และปลั๊กอิน IDE ภายในโปรเจ็กต์ มันสามารถอธิบายโค้ดเดิม วางแผนการเปลี่ยนแปลง แก้ไขไฟล์ และรันคำสั่งภายใต้สิทธิ์ที่กำหนดไว้ คู่มือนี้ใช้เวิร์กโฟลว์ผ่านเทอร์มินัล: มอบงานเขียนโปรแกรมเล็กๆ ให้เอเย่นต์ ตรวจทานการดำเนินการที่เสนอ และยืนยันไฟล์ผลลัพธ์ด้วยการทดสอบภายในเครื่อง ดู เอกสาร OpenCode อย่างเป็นทางการ เพื่อการติดตั้งและการใช้งาน
CometAPI ทำหน้าที่เป็นชั้นการเข้าถึงโมเดล เวิร์กโฟลว์ที่ใช้หลายโมเดลตามปกติต้องจัดการ credential การเรียกเก็บเงิน และการตั้งค่าการเชื่อมต่อข้ามผู้ให้บริการ การส่งต่อโมเดลที่รองรับผ่านบัญชี CometAPI เดียวมอบคีย์และ base URL ร่วมกันให้โปรเจ็กต์นี้ ขณะที่ OpenCode ดูแลรีโพและคำสั่งงาน วิธีนี้มีประโยชน์เมื่อเปรียบเทียบโมเดลบนงานเดียวกันหรือเปลี่ยนโมเดลที่เลือกโดยไม่ต้องจัดระเบียบโปรเจ็กต์ใหม่ เกตเวย์แบบรวมเป็นตัวเลือก: การเข้าถึงผู้ให้บริการโดยตรงอาจเหมาะสำหรับเวิร์กโฟลว์ผู้ให้บริการเดียวหรือข้อกำหนดตามสัญญาเฉพาะ ประโยชน์ที่นี่คือการเข้าถึงหลายผู้ให้บริการที่ง่ายขึ้น; อย่างไรก็ดี รูปแบบ API พฤติกรรมโมเดล และความเข้ากันได้ของเครื่องมือยังต้องตรวจสอบแยกต่างหาก
CometAPI รองรับ OpenAI-compatible Chat Completions และยังเปิดเผยรูปแบบ API อื่นๆ การผสานอย่างเป็นทางการเลือก adapter ให้กับแต่ละรูปแบบ ที่นี่ Claude Sonnet 5 ใช้ Messages, GPT-6.1 Sol ใช้ Responses และ DeepSeek V4.1 Flash ใช้ Chat Completions ตามตัวอย่างที่ลิงก์ด้านล่าง ทุกคำขอยังคงส่งไปยัง CometAPI ด้วยคีย์เดียวกัน ชื่อผู้ให้บริการและรูปแบบ API อธิบายสิ่งที่ต่างกัน; ไม่ควรสมมุติว่าโมเดลเดียวจะยอมรับทุกรูปแบบ
| การกำหนดค่า | Claude Sonnet 5 API ใน CometAPI | GPT-6.1 Sol API ใน CometAPI | DeepSeek V4.1 Flash API ใน CometAPI |
|---|---|---|---|
| Model supplier | Anthropic | OpenAI | DeepSeek |
| Model ID | claude-sonnet-5 | gpt-6.1-sol | deepseek-v4.1-flash |
| OpenCode provider ID | cometapi-messages | cometapi-responses | cometapi-chat |
| API format used here | Messages | Responses/ chat | Chat Completions |
| Adapter | @ai-sdk/anthropic | @ai-sdk/openai | @ai-sdk/openai-compatible |
What Do You Need Before Configuring CometAPI in OpenCode?
ใช้เทอร์มินัล, Node.js พร้อม npm, บัญชี CometAPI ที่มีสิทธิ์ API และยอดคงเหลือเพียงพอ และไดเรกทอรีโปรเจ็กต์สำหรับทิ้ง Bash ตัวอย่างใช้กับ macOS, Linux หรือ WSL; ตัวอย่าง PowerShell ที่ติดป้ายใช้ไวยากรณ์ของ Windows Node.js ต้องพร้อมใช้งานในเซสชันเดียวกันสำหรับการตรวจสอบ JavaScript ตอนท้ายของคู่มือนี้
เวิร์กทูธิสนี้ใช้สไตล์การกำหนดค่า OpenCode 1 เอกสารอย่างเป็นทางการ แยกความต่างระหว่าง OpenCode 1 กับ OpenCode 2; ทั้งสองใช้คำสั่ง opencode บันทึก opencode --version ก่อนเริ่ม และใช้เอกสารการกำหนดค่าสำหรับเวอร์ชันหลักนั้น เวิร์กโฟลว์ 3 โมเดลด้านล่างเป็นการเดินผสานพร้อมผลลัพธ์ที่คาดหวัง ไม่ได้อ้างว่าเป็นการทดสอบ end-to-end ที่เสร็จสมบูรณ์
บันทึก CLI, Node.js, npm, ระบบปฏิบัติการ และวันที่ทดสอบของคุณเมื่อรันตัวอย่าง การใช้ API จะถูกเรียกเก็บเงินกับบัญชี CometAPI ของคุณ คำสั่งด้านล่างเป็นการทำตามจริงพร้อมผลลัพธ์ที่คาดหวัง; ไม่มีการอ้างผลลัพธ์ที่สร้างโดยโมเดลหรือการรันผสาน 3 โมเดลสำเร็จ
node --versionnpm --versionopencode --version
How to Configure CometAPI in OpenCode Step by Step?
Step 1: Install OpenCode
ติดตั้งแพ็กเกจ npm อย่างเป็นทางการหากยังไม่มี OpenCode การติดตั้งแบบไม่ปักเวอร์ชันจะตามเวอร์ชันแพ็กเกจปัจจุบัน; บันทึกเวอร์ชันที่ติดตั้งก่อนใช้งานการกำหนดค่า หากต้องการทำซ้ำสภาพแวดล้อมของคู่มือแหล่งที่มา เวอร์ชัน CLI ที่ระบุคือ 1.18.16
ติดตั้ง OpenCode CLI และแสดงเวอร์ชัน
npm install -g opencode-aiopencode --version
เปิดเทอร์มินัลใหม่หากไม่พบ executable หลังติดตั้ง ดำเนินการต่อภายในไดเรกทอรีโปรเจ็กต์สำหรับทิ้งเพื่อให้งานเอเย่นต์แรกมีขอบเขตชัดเจน
สร้างและเข้าสู่ไดเรกทอรีโปรเจ็กต์
mkdir cometapi-opencode-democd cometapi-opencode-demo
Step 2: Create a CometAPI API Key
สร้างคีย์ API จาก บัญชี CometAPI ของคุณ และตั้งค่าในเทอร์มินัลเดียวกับที่ใช้เริ่ม OpenCode แทนที่ placeholder ในเครื่อง ห้ามคอมมิตคีย์ ห้ามวางในพรอมต์ หรือรวมไว้ในล็อกที่แชร์
ตัวแปรมีผลกับเชลล์ปัจจุบันและโปรเซสที่เปิดจากมัน ห้ามถ่ายภาพหน้าจอ token จริง การตรวจสอบต่อไปนี้จะรายงานว่ามีตัวแปรหรือไม่โดยไม่พิมพ์ค่า
ตั้งค่า CometAPI key สำหรับเซสชัน Bash ปัจจุบัน
export COMETAPI_KEY="YOUR_COMETAPI_KEY"
ตั้งค่า CometAPI key สำหรับเซสชัน PowerShell ปัจจุบัน
$env:COMETAPI_KEY = "YOUR_COMETAPI_KEY"test -n "$COMETAPI_KEY" && printf "COMETAPI_KEY is set\n" || printf "COMETAPI_KEY is missing\n"if ([string]::IsNullOrWhiteSpace($env:COMETAPI_KEY)) { "COMETAPI_KEY is missing"} else { "COMETAPI_KEY is set"}
Step 3: Create opencode.json
สร้าง opencode.json ที่รูทของโปรเจ็กต์ หรือใช้ ~/.config/opencode/opencode.json เพื่อให้รายการพร้อมใช้ข้ามโปรเจ็กต์ ไฟล์โปรเจ็กต์ทำให้บทความนี้เป็นแบบ self-contained ใช้ provider object เดียวที่มีสามรายการด้านล่าง; หากมี provider object อยู่แล้ว ให้ผสานรายการของมันแทนการสร้างคีย์ JSON ซ้ำ
สำหรับฟิลด์ที่ขัดแย้งกัน การกำหนดค่าของโปรเจ็กต์จะครอบการกำหนดค่าระดับ global; ฟิลด์ที่ไม่ขัดแย้งจะยังอยู่ ไฟล์ OPENCODE_CONFIG แบบกำหนดเองจะถูกโหลดระหว่าง global และโปรเจ็กต์ ตรวจสอบสายโซ่ลำดับความสำคัญที่มีเอกสารไว้หากมีการตั้งค่าที่จัดการหรือ inline อยู่ด้วย
บันทึกการกำหนดค่าครบถ้วนต่อไปนี้เป็น opencode.json ผู้ให้บริการแต่ละตัวอ่าน COMETAPI_KEY จาก environment ไม่ได้กำหนดโมเดลเริ่มต้นไว้โดยเจตนาเพื่อให้คุณเลือกหนึ่งในสามตัวอย่างอย่างชัดเจน
รุ่น Flash ทำให้ตัวอย่าง DeepSeek V4.1 ที่ร้องขอชัดเจน เก็บ GPT ไว้บน adapter Responses เพื่อใช้เครื่องมือ; คู่มือ CometAPI DeepSeek บันทึกเส้นทาง Chat Completions ที่ใช้ที่นี่ ตรวจสอบความพร้อมของโมเดลและสิทธิ์ในบัญชีของคุณก่อนรันตัวอย่าง
{ "$schema": "https://opencode.ai/config.json", "provider": { "cometapi-messages": { "npm": "@ai-sdk/anthropic", "name": "CometAPI Claude", "options": { "baseURL": "https://api.cometapi.com/v1", "apiKey": "{env:COMETAPI_KEY}" }, "models": { "claude-sonnet-5": { "name": "Claude Sonnet 5" } } }, "cometapi-responses": { "npm": "@ai-sdk/openai", "name": "CometAPI GPT", "options": { "baseURL": "https://api.cometapi.com/v1", "apiKey": "{env:COMETAPI_KEY}" }, "models": { "gpt-6.1-sol": { "name": "GPT-6.1 Sol" } } }, "cometapi-chat": { "npm": "@ai-sdk/openai-compatible", "name": "CometAPI DeepSeek", "options": { "baseURL": "https://api.cometapi.com/v1", "apiKey": "{env:COMETAPI_KEY}" }, "models": { "deepseek-v4.1-flash": { "name": "DeepSeek V4.1 Flash" } } } }, "permission": { "edit": "ask", "shell": "ask" }}
baseURL ที่ถูกต้อง: https://api.cometapi.com/v1 baseURL ที่ไม่ถูกต้อง: https://api.cometapi.com/v1/chat/completions ตัว adapter จะเพิ่ม endpoint path เอง ผสานตัวอย่างเข้ากับ opencode.json ที่มีอยู่โดยไม่ลบการตั้งค่าอื่นที่ไม่เกี่ยวข้อง
การตั้งค่า edit และ shell จะขออนุมัติสำหรับการเปลี่ยนไฟล์และคำสั่งภายใต้ กฎสิทธิ์ปัจจุบันของ OpenCode รันตัวอย่างการเขียนโค้ดแบบโต้ตอบและตรวจสอบคำขอเหล่านั้น OpenCode ยังสืบทอดการเข้าถึงระบบปฏิบัติการของโปรเซสที่เปิดมัน; ใช้ไดเรกทอรีเพื่อการทิ้งสำหรับการฝึกครั้งนี้
Step 4: Check the Gateway Connection
การตั้งค่าและการตรวจสอบ Gemini แบบเลือกทำหลังจากการตรวจสอบการเชื่อมต่อ 3 โมเดลด้านล่าง
ตัวอย่าง HTTP ด้านล่างตรวจสอบรายการ DeepSeek Chat Completions โดยตรง เป็นวิธีที่มีประโยชน์ในการแยกการเชื่อมต่อ gateway ออกจาก OpenCode Claude และ GPT ใช้เส้นทาง adapter ที่เลือกในขั้นตอนถัดไป; การเปลี่ยน model ID ภายในคำขอ HTTP นี้จะไม่เปลี่ยนโปรโตคอลโดยอัตโนมัติ
ส่งคำขอ Chat Completions แบบน้อยที่สุดจาก Bash
curl --silent --show-error \ --output response.json \ --write-out "HTTP %{http_code}\n" \ https://api.cometapi.com/v1/chat/completions \ -H "Authorization: Bearer $COMETAPI_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"deepseek-v4.1-flash","messages":[{"role":"user","content":"Reply with a short greeting."}]}'
คำสั่งนี้ใช้ ตัวเลือก write-out และ output ของ curl เพื่อแยกสถานะ HTTP ออกจาก response.json การถ่ายโอนที่สำเร็จอาจยังมีข้อผิดพลาด HTTP ได้ ดังนั้นให้ตรวจสอบทั้งสถานะที่พิมพ์และเนื้อหา JSON วิธีนี้หลีกเลี่ยงการพึ่งพา --fail-with-body ซึ่งต้องการ curl 7.76.0 ขึ้นไป
ส่งคำขอเดียวกันจาก PowerShell โดยไม่มีการอ้าง JSON ที่เฉพาะเจาะจงของเชลล์
$body = @{ model = "deepseek-v4.1-flash" messages = @(@{ role = "user"; content = "Reply with a short greeting." })} | ConvertTo-Json -Depth 4$response = Invoke-WebRequest -UseBasicParsing -Method Post ` -Uri "https://api.cometapi.com/v1/chat/completions" ` -Headers @{ Authorization = "Bearer $env:COMETAPI_KEY" } ` -ContentType "application/json" ` -Body $body$response.Content | Set-Content -Encoding UTF8 response.json"HTTP $($response.StatusCode)"
เมื่อเกิดข้อผิดพลาด HTTP PowerShell อาจยกเว้นข้อยกเว้นก่อนสองบรรทัดสุดท้ายจะรัน เก็บสถานะและรายละเอียดข้อผิดพลาดแบบปิดบังจากความล้มเหล่านั้น; อย่าบันทึกว่าเป็นการตอบกลับที่สำเร็จ
ผลลัพธ์ที่คาดหวังสำหรับคำขอ DeepSeek: HTTP 200 และข้อความไม่ว่างใน choices[0].message.content ตรวจสอบไฟล์ response.json ที่บันทึกไว้แทนที่จะยอมรับเพียง HTTP 200 การเพิ่มเติมต่อไปนี้แสดงรูปทรงของการตอบกลับและวิธีตรวจสอบทั้งสามเส้นทางที่กำหนดไว้ ตัวอย่างมีจุดประสงค์เพื่อประกอบ; เวอร์ชันนี้ไม่อ้างผลการทดสอบ CometAPI แบบ live คำขอแบบข้อความล้วนไม่ได้ตรวจสอบการสตรีมหรือการเรียกใช้เครื่องมือ
ตัวอย่างรูปทรงการตอบกลับ DeepSeek: คำทักทาย ค่า usage และฟิลด์อื่นขึ้นอยู่กับคำขอจริง JSON ต่อไปนี้ถูกย่อโดยเจตนา ไม่ใช่การตอบกลับ API ที่จับมา
{"choices":[{"message":{"role":"assistant","content":"Hello!"}}]}
หลังจากคำขอ HTTP สำเร็จจริง บรรทัดสถานะควรเป็น HTTP 200 และ response.json ควรมีข้อความ assistant ที่ไม่ว่าง เก็บสถานะและเนื้อหาจริงสำหรับการรันของคุณเอง; อย่าคัดลอกตัวอย่างนี้เป็นหลักฐานทดสอบ
Step 5: Switch Between Claude, GPT, and DeepSeek
คำสั่งในขั้นตอนนี้ควรคืนตัวบ่งชี้ของ assistant ที่ร้องขอ ตัวอย่างข้อความ assistant โดยละแบนเนอร์เทอร์มินัล เวลา และเมทาดาตา:
Claude: CLAUDE_READYGPT: GPT_READYDeepSeek: DEEPSEEK_READY
บรรทัดเหล่านี้แสดงเฉพาะเนื้อหาที่คาดไว้ ไม่ใช่ทรานสคริปต์เทอร์มินัล บันทึกผลลัพธ์จริงและสถานะออกของโปรเซสสำหรับผู้ให้บริการแต่ละตัว; ตัวบ่งชี้ที่หายไปหรือคำขอที่ล้มเหลวต้องตรวจสอบ
เริ่มในไดเรกทอรีที่มี opencode.json แสดงรายการโมเดลสำหรับแต่ละผู้ให้บริการที่กำหนด แล้วทำคำขอข้อความสั้นๆ ไปยังแต่ละรายการ คำสั่งเหล่านี้จะเปลี่ยนโมเดลและ adapter ที่เลือก; คีย์และ base URL ของ CometAPI ยังคงเดิม
ใช้คำสั่งเหล่านี้เพื่อตรวจสอบว่าทั้งสามรายการมองเห็นได้และสามารถคืนข้อความได้
opencode models cometapi-messagesopencode models cometapi-responsesopencode models cometapi-chatopencode run --model cometapi-messages/claude-sonnet-5 "Reply exactly with: CLAUDE_READY"opencode run --model cometapi-responses/gpt-6.1-sol "Reply exactly with: GPT_READY"opencode run --model cometapi-chat/deepseek-v4.1-flash "Reply exactly with: DEEPSEEK_READY"
สำหรับการสลับแบบโต้ตอบ ให้เริ่ม opencode, เข้าสู่ /models และเลือก CometAPI Claude, CometAPI GPT หรือ CometAPI DeepSeek OpenCode จะใช้คู่ provider/model ของรายการนั้น คุณไม่ต้องการบัญชีผู้ให้บริการสามบัญชีหรือคีย์สามชุด ด้วยการกำหนดค่าแบบอิง environment นี้ อย่าใช้ /connect เพื่อให้ credential ชุดที่สอง; ต้องแก้ไข COMETAPI_KEY ที่ขาดไปในเชลล์ที่เปิดโปรเซส
ผลลัพธ์ที่คาดหวัง: แต่ละคำขอสั้นๆ คืนตัวบ่งชี้ที่ร้องขอ บันทึกผลจริงสำหรับแต่ละโมเดล รายการโมเดลที่มองเห็นยืนยันการลงทะเบียน; การตอบกลับข้อความสำเร็จยืนยันเส้นทางคำขอ เพียงอย่างใดอย่างหนึ่งไม่พิสูจน์ว่าเครื่องมือไฟล์ใช้งานได้
Gemini ใช้ผู้ให้บริการและโปรโตคอลแยกต่างหาก เก็บรายการ Claude, GPT และ DeepSeek ข้างต้นไว้; ผสานรายการต่อไปนี้เข้า provider object ที่มีอยู่ base URL ด้านล่างเป็นไปตามการกำหนดค่า CometAPI ที่ผู้ตรวจให้ ยืนยันเส้นทางปัจจุบันและการเข้าถึงโมเดลในบัญชี CometAPI ของคุณก่อนใช้งาน
ตัว adapter ของ Google รองรับ baseURL แบบกำหนดเองและส่ง apiKey ผ่าน x-goog-api-key ดู เอกสารอ้างอิงผู้ให้บริการ AI SDK Google อย่างเป็นทางการ นี่เป็นการยืนยันการตั้งค่า adapter; ไม่ได้พิสูจน์ว่าโมเดล Gemini เฉพาะเปิดใช้งานบน gateway ของ CometAPI
{ "provider": { "cometapi-gemini": { "npm": "@ai-sdk/google", "name": "CometAPI Gemini", "options": { "baseURL": "https://api.cometapi.com/v1beta", "apiKey": "{env:COMETAPI_KEY}" }, "models": { "YOUR_GEMINI_MODEL_ID": { "name": "CometAPI Gemini (account-selected model)" } } } }}
แทนที่ YOUR_GEMINI_MODEL_ID ทั้งในคีย์ JSON และคำสั่งด้านล่างด้วย model ID ของ Gemini ที่เปิดใช้งานสำหรับบัญชี CometAPI ของคุณ นี่เป็น placeholder ไม่ใช่ model ID จริง ผสานรายการผู้ให้บริการนี้โดยไม่ทำให้คีย์ provider ระดับบนซ้ำ และเริ่ม OpenCode จากเชลล์เดียวกันที่ตั้งค่า COMETAPI_KEY ไว้
opencode models cometapi-geminiopencode run --model cometapi-gemini/YOUR_GEMINI_MODEL_ID "Reply exactly with: GEMINI_READY"
ข้อความ assistant ที่คาดหวัง: GEMINI_READY รายการโมเดลที่แสดงยืนยันการลงทะเบียนในเครื่อง; การได้รับตัวบ่งชี้ยืนยันคำขอข้อความ บันทึกการตอบกลับจริงและสถานะออก เพื่อยืนยันเครื่องมือโค้ดดิ้ง ให้เปิด opencode --model cometapi-gemini/YOUR_GEMINI_MODEL_ID ในไดเรกทอรีใหม่สำหรับทิ้ง และทำซ้ำงาน greet.cjs/check.cjs ด้านล่าง ความสำเร็จของข้อความเพียงอย่างเดียวไม่ยืนยันการสตรีม การแก้ไข หรือการเรียกใช้เครื่องมือ
How Do You Run a Coding Task with Claude, GPT, and DeepSeek?
ใช้งานเดียวกันสำหรับแต่ละโมเดล: สร้างฟังก์ชันทักทาย เพิ่ม assertion และรันมัน เก็บไดเรกทอรีใหม่สามชุดเพื่อที่โมเดลที่สองจะไม่สามารถนำไฟล์ที่โมเดลแรกสร้างไว้มาใช้ต่อได้ ตรวจสอบเวิร์กโฟลว์การผสานโดยไม่ทำให้บทความกลายเป็นการจัดอันดับประสิทธิภาพ
บันทึก prepare-runs.cjs ไว้ข้าง opencode.json แล้วรันหนึ่งครั้ง มันจะสร้างไดเรกทอรีใหม่สามรายการและคัดลอกเฉพาะการกำหนดค่าที่ใช้ร่วมกัน มันจะหยุดหากมีไดเรกทอรีเป้าหมายใดๆ อยู่แล้ว เพื่อป้องกันงานเดิมถูกทับ
const fs = require("node:fs");const path = require("node:path");const root = __dirname;const names = ["claude-demo", "gpt-demo", "deepseek-demo"];const config = path.join(root, "opencode.json");if (!fs.existsSync(config)) throw new Error("Missing opencode.json");for (const name of names) { if (fs.existsSync(path.join(root, name))) { throw new Error(`Directory already exists: ${name}`); }}for (const name of names) { const dir = path.join(root, name); fs.mkdirSync(dir); fs.copyFileSync(config, path.join(dir, "opencode.json"));}node prepare-runs.cjscd claude-demoopencode --model cometapi-messages/claude-sonnet-5# After exiting OpenCode:cd ..cd gpt-demoopencode --model cometapi-responses/gpt-6.1-sol# After exiting OpenCode:cd ..cd deepseek-demoopencode --model cometapi-chat/deepseek-v4.1-flash# After exiting OpenCode:cd ..
รันหนึ่งเซสชันต่อครั้ง โดยเริ่มจากไดเรกทอรีแม่ของโปรเจ็กต์ ออกจากเซสชันก่อนขยับไปยังตัวอย่างถัดไป ในแต่ละเซสชัน ส่งงานเดียวกันด้านล่างและตรวจทานการแก้ไขและคำสั่งที่เสนอ Node.js ต้องพร้อมใช้กับโปรเซสที่เปิด OpenCode
ขอให้เอเย่นต์สร้างและตรวจสอบฟังก์ชัน JavaScript ขนาดเล็ก
Create greet.cjs in this directory.Export a function named greet(name) that returns "Hello, " + name + "!".Create check.cjs using node:assert/strict.Assert that greet("Ada") equals "Hello, Ada!".Run node check.cjs and report its actual exit status.Do not modify opencode.json or unrelated files.
ผลลัพธ์ที่คาดหวัง: เอเย่นต์ขออนุมัติตามการตั้งค่า สร้างไฟล์ทั้งสอง และทำ node check.cjs สำเร็จด้วย exit status 0 บันทึกสิ่งที่เกิดขึ้นจริง ตรวจสอบไฟล์และรันการตรวจสอบด้วยตัวเอง; การกล่าวอ้างด้วยร้อยแก้วว่า “สำเร็จ” ไม่เพียงพอ หากการเรียกใช้เครื่องมือถูกปฏิเสธหรือผิดรูป ตรวจสอบความเข้ากันได้ของเส้นทางแยกจากคำขออนุมัติที่ค้างอยู่
Reference Files and Local Verification
ไฟล์ต่อไปนี้เป็นการอิมพลีเมนต์อ้างอิงของงานที่ร้องขอ เขียนขึ้นโดยตรงสำหรับคู่มือนี้; ไม่ได้ถูกนำเสนอว่าเป็นสิ่งประดิษฐ์ที่สร้างโดยโมเดล การจับคู่พฤติกรรมที่สังเกตได้ของมันคือเงื่อนไขการยอมรับสำหรับการรันเอเย่นต์ของคุณ
function greet(name) { return "Hello, " + name + "!";}module.exports = { greet };const assert = require("node:assert/strict");const { greet } = require("./greet.cjs");assert.equal(greet("Ada"), "Hello, Ada!");node check.cjsprintf "exit=%s\n" "$?"node check.cjs"exit=$LASTEXITCODE"
การตรวจสอบอ้างอิงภายในเครื่อง: Windows, Node.js v24.19.0, 22 ตุลาคม 2026; node check.cjs คืน exit status 0 โดยไม่มี standard output นี่ตรวจเฉพาะสองไฟล์อ้างอิง ไม่ยืนยันการติดตั้ง OpenCode การเข้าถึง CometAPI พรอมต์ขออนุมัติ หรือการเรียกใช้เครื่องมือของโมเดล
| Run | รายการโมเดลที่เลือก | สิ่งที่ต้องบันทึก |
|---|---|---|
| Claude | cometapi-messages/claude-sonnet-5 | การตอบกลับ ไฟล์ที่สร้าง คำขออนุมัติ โค้ดออกของการทดสอบ |
| GPT | cometapi-responses/gpt-6.1-sol | การตอบกลับ ไฟล์ที่สร้าง คำขออนุมัติ โค้ดออกของการทดสอบ |
| DeepSeek | cometapi-chat/deepseek-v4.1-flash | การตอบกลับ ไฟล์ที่สร้าง คำขออนุมัติ โค้ดออกของการทดสอบ |
เก็บบันทึกผลหนึ่งชุดต่อโมเดล: ผู้ให้บริการ/โมเดลที่เลือก มีการตอบกลับหรือไม่ มีการสร้าง greet.cjs และ check.cjs หรือไม่ มีคำขออนุมัติหรือไม่ และ exit code ของ node check.cjs บันทึกความล้มเหลวเป็นความล้มเหลว; อย่าคาดเดาว่าผ่านจากอิมพลีเมนต์อ้างอิง
Protect Credentials and Verify Reliability
เก็บ COMETAPI_KEY ไว้ในตัวแปรสภาพแวดล้อมแทนการใส่ไว้ในไฟล์กำหนดค่าหรือบันทึกที่แชร์ เปิดการอนุมัติสำหรับการแก้ไขไฟล์และคำสั่ง และทดสอบการกำหนดค่าใหม่ในโปรเจ็กต์สำหรับทิ้ง
ยืนยันคำขอ API โดยตรง การตอบกลับของ OpenCode และเวิร์กโฟลว์การแก้ไขไฟล์แยกจากกัน บันทึกข้อผิดพลาดและผลการทดสอบ พยายามใหม่เฉพาะความล้มเหลวชั่วคราว และตรวจสอบพื้นที่ทำงานก่อนทำซ้ำงานที่ถูกขัดจังหวะ
CometAPI ทำให้การสลับระหว่างโมเดลง่ายขึ้น แต่ OpenCode ไม่ได้จัดหา failover ข้ามโมเดลโดยอัตโนมัติผ่านการกำหนดค่านี้ หากโมเดลหนึ่งไม่พร้อมใช้งาน ให้เลือกโมเดลที่ผ่านการยืนยันอีกตัวหนึ่งด้วยตนเองและทำการตรวจรับซ้ำ
How much does it cost to use Opencode with CometAPI?
Prices for CometAPI, and how is billing structured
CometAPI คิดค่าบริการแบบจ่ายตามการใช้งานโดยไม่มีค่าบริการรายเดือน คิดเฉพาะการใช้งาน API จริง อัตราของโมเดลอย่างเป็นทางการโดยทั่วไปต่ำกว่าราคามาตรฐานของผู้ให้บริการ 20% และมีส่วนลดตามปริมาณเพิ่มเติม นักพัฒนาสามารถเข้าถึง Claude, GPT, DeepSeek และโมเดลอื่นๆ ผ่านบัญชีเดียว โดยชำระเงินตามการใช้โทเค็นของโมเดลที่เลือก ตรวจสอบ หน้าราคา CometAPI สำหรับอัตราปัจจุบัน
สำหรับคำขอที่ไม่มีการแคชหรือค่าธรรมเนียมเพิ่มเติม:
Cost = (Input tokens × Input rate + Output tokens × Output rate) / 1,000,000
ตัวอย่าง เช่น ที่อัตราสมมุติ $1/M โทเค็นอินพุต และ $4/M โทเค็นเอาต์พุต การใช้ 20,000 อินพุตและ 2,000 เอาต์พุตมีค่าใช้จ่าย $0.028 เหล่านี้เป็นอัตราสาธิต ไม่ใช่ราคาจริงของโมเดล
บันทึกการใช้โทเค็น ค่าธรรมเนียม API รวม เวลาในการดำเนินการ และผลการทดสอบสำหรับแต่ละงาน เพื่อลดค่าใช้จ่าย จำกัดคอนเท็กซ์ที่ไม่จำเป็น ใช้พรอมต์ให้กระชับ หลีกเลี่ยงการส่งคอนเท็กซ์รีโพขนาดใหญ่ซ้ำๆ ลดคำขอล้มเหลวซ้ำ และเลือกโมเดลที่มีต้นทุนต่ำกว่าเมื่อให้คุณภาพเทียบเท่า
OpenCode API Cost Optimization Strategies
เพื่อลดค่าใช้จ่ายของ OpenCode โดยไม่กระทบคุณภาพการเขียนโค้ด ให้โฟกัสที่การเลือกโมเดล ประสิทธิภาพโทเค็น และการหลีกเลี่ยงคำขอ API ที่ไม่จำเป็น
- เลือกโมเดลที่เหมาะสม: ใช้โมเดลที่มีต้นทุนต่ำกว่า เช่น DeepSeek สำหรับงานประจำ ขณะที่เก็บ Claude หรือ GPT ไว้สำหรับการดีบัก การรีแฟคเตอร์ และการให้เหตุผลที่ซับซ้อน
- ลดการใช้โทเค็น: ทำพรอมต์ให้กระชับ ให้เฉพาะไฟล์โปรเจ็กต์ที่เกี่ยวข้อง และหลีกเลี่ยงการส่งบริบทของรีโพขนาดใหญ่ซ้ำแล้วซ้ำอีก
- ใช้การแคชพรอมต์: ใช้คุณสมบัติแคชที่รองรับสำหรับบริบทที่ทำซ้ำ เช่น คำแนะนำโปรเจ็กต์และอ้างอิงโค้ด เพื่อลดต้นทุนอินพุต
- หลีกเลี่ยงการลองใหม่ที่ไม่จำเป็น: แก้ไขการกำหนดค่าและการยืนยันตัวตนให้ถูกต้องก่อนลองใหม่ และตรวจทานผลลัพธ์ก่อนหน้าเพื่อหลีกเลี่ยงงานซ้ำ
- ติดตามการใช้จริง: ติดตามการใช้โทเค็น ค่า API และความสำเร็จของงานผ่าน CometAPI เปรียบเทียบค่าใช้จ่ายต่อ “งานสำเร็จ” มากกว่าราคาโทเค็นเพียงอย่างเดียว
เมื่อรวมกับการกำหนดราคาส่วนลดแบบจ่ายตามการใช้งานของ CometAPI แนวทางเหล่านี้ช่วยให้ผู้พัฒนาควบคุมค่าใช้จ่ายขณะคงประสิทธิภาพการเขียนโค้ดที่เชื่อถือได้ใน OpenCode
How Can You Extend the CometAPI Configuration?
หากต้องการเพิ่มโมเดลอื่น ให้ใส่ model ID ของมันภายใต้ผู้ให้บริการที่รองรับรูปแบบ API นั้น หรือเพิ่มรายการผู้ให้บริการใหม่พร้อม adapter ที่ต้องการ จากนั้นเลือกผู้ให้บริการ/โมเดลนั้นผ่าน /models เก็บ credential ไว้ใน COMETAPI_KEY และคงรายการที่มีอยู่เพื่อให้การสลับยังเป็นเพียงการเลือก
คู่มืออย่างเป็นทางการครอบคลุมรูปแบบ API สี่แบบ รวมถึง Gemini บทความนี้ใช้รายการสามตัวที่จำเป็นสำหรับ Claude, GPT และ DeepSeek หากโมเดลหลายตัวที่เลือกสนับสนุน Chat Completions พวกมันสามารถใช้แผนที่ models ของ cometapi-chat ร่วมกันได้ อย่าย้ายเส้นทางที่เฉพาะ Responses หรือ Messages เข้าแผนที่นั้นเพียงเพื่อจะลดจำนวนรายการ
เลือก adapter ตามเส้นทางที่คุณตั้งใจจะเรียก และเลือกโมเดลตามงานเขียนโปรแกรม การเปลี่ยนผู้ให้บริการไม่ต้องใช้คีย์ CometAPI ใหม่; การเปลี่ยนรูปแบบ API ต้องใช้ adapter ที่กำหนดค่าให้ตรงกัน
How to Troubleshoot CometAPI in OpenCode?
ตามลำดับขั้นที่ล้มเหลวแรก: คำขอ HTTP → ผู้ให้บริการ OpenCode → เครื่องมือไฟล์ ถ้า HTTP ล้มเหลว ตรวจสอบ credential การเข้าถึงโมเดล และรายละเอียด endpoint หาก HTTP ใช้ได้แต่ OpenCode ล้มเหลว ตรวจสอบการกำหนดค่าและสภาพแวดล้อมที่เปิดใช้ หากการตรวจข้อความทั้งสองใช้ได้แต่การทำงานกับไฟล์ล้มเหลว ตรวจสอบสิทธิ์และความเข้ากันได้ของการเรียกใช้เครื่องมือ
| อาการ | ตรวจแรก | การดำเนินการถัดไป | คำสั่ง/หลักฐานสำหรับวินิจฉัย |
|---|---|---|---|
| 401 response | ค่า key และส่วนหัว Authorization | ตั้งคีย์ในเทอร์มินัลปัจจุบัน; ตรวจสอบช่องว่างโดยไม่ตั้งใจ | ตรวจสอบการมีอยู่ของตัวแปรโดยไม่พิมพ์คีย์; เก็บสถานะ HTTP และข้อผิดพลาดแบบปิดบัง |
| 403 หรือข้อจำกัดบัญชี | เนื้อความ error และสิทธิ์บัญชี | ยืนยันการเข้าถึงโมเดลและสถานะบัญชีใน CometAPI | บันทึกการตอบกลับ error แบบปิดบังและยืนยันการเข้าถึงบัญชี |
| 404 response | โฮสต์ เส้นทาง endpoint และ model ID | เปรียบเทียบคำขอกับเอกสารของ API ของโมเดลที่เลือก | เปรียบเทียบ response.json กับโมเดลและ endpoint ที่ร้องขอ |
| โมเดลไม่แสดงใน OpenCode | ไดเรกทอรีโปรเจ็กต์และการกำหนดค่าผู้ให้บริการ | ตรวจสอบ JSON ถูกต้องและชื่อผู้ให้บริการ/โมเดลตรงกัน; รีสตาร์ตหลังแก้ไข | รัน opencode models cometapi-chat, opencode models cometapi-messages, และ opencode models cometapi-responses; บันทึก opencode --version |
| ข้อความใช้ได้ เครื่องมือล้มเหลว | การตอบกลับเครื่องมือและความเข้ากันได้ของ adapter | ยืนยันว่ารองรับเส้นทาง; แยกแยะระหว่างการเรียกเครื่องมือที่ถูกปฏิเสธกับพรอมต์ขออนุมัติ | เปรียบเทียบคำขอข้อความสั้นกับการทำงานเครื่องมือที่ล้มเหลว; เก็บ error |
| คำสั่งรอการอนุมัติ | เซสชันแบบโต้ตอบและการตั้งค่าสิทธิ์ | ทบทวนและอนุมัติการกระทำที่ตั้งใจไว้; อย่าถือว่าคำขอที่ค้างเป็นการหยุดทำงานของ API | ใช้เซสชันแบบโต้ตอบ; บันทึกการกระทำที่ร้องขอและผลการอนุมัติ |
| 429 หรือข้อผิดพลาดชั่วคราว | รายละเอียด error และขีดจำกัดการใช้งาน | ลดความพร้อมกันของคำขอ; ปฏิบัติตามคำแนะนำการลองใหม่แทนการลองใหม่ซ้ำๆ | เก็บสถานะ HTTP และคำแนะนำการลองใหม่; ลดความพร้อมกัน |
เมื่อแบ่งปันปัญหา ให้รวมเวอร์ชัน OpenCode ระบบปฏิบัติการ model ID เส้นทาง endpoint และข้อความ error แบบปิดบัง ไม่รวมคีย์ API และเนื้อหาส่วนตัวของรีโพ เก็บคำขอที่เล็กที่สุดที่ทำให้เกิดปัญหาเพื่อให้สามารถตรวจสอบความล้มเหลวของการกำหนดค่าและเครื่องมือได้แยกจากกัน
FAQ
Why does OpenCode lose my CometAPI key in a new terminal?
คำสั่ง export และ PowerShell ข้างต้นตั้งค่าตัวแปรสภาพแวดล้อมสำหรับเซสชันปัจจุบันและโปรเซสลูก เทอร์มินัลที่เปิดแยกต่างหากหรือเอดิเตอร์ที่รันอยู่แล้วอาจไม่ได้รับมรดกตัวแปร ตั้งคีย์ในสภาพแวดล้อมที่เปิด OpenCode และรีสตาร์ตโปรเซสนั้น สำหรับการตั้งค่าถาวร ใช้ตัวจัดการ credential ของสภาพแวดล้อมแทนการฝังความลับไว้ในไฟล์รีโพ
Does OpenCode load COMETAPI_KEY from a .env file automatically?
นิพจน์ {env:COMETAPI_KEY} อ่านจากสภาพแวดล้อมของโปรเซส เพียงแค่สร้างไฟล์ .env ไม่ได้ยืนยันว่าตัวแปรถูกโหลด ใช้เชลล์ของคุณหรือเครื่องมือโหลดสภาพแวดล้อมที่กำหนดไว้อย่างชัดเจนก่อนเริ่ม OpenCode วินิจฉัยค่าเว้นว่างที่โปรเซสที่เปิดใช้งานแทนที่จะถือว่าผู้ให้บริการไม่พร้อมใช้งาน
Can a global OpenCode configuration change this project setup?
OpenCode ผสานการกำหนดค่าแทนการแทนที่ไฟล์ก่อนหน้าทั้งหมด ไฟล์โปรเจ็กต์จะครอบฟิลด์ที่ทับซ้อนในไฟล์ global ขณะที่การตั้งค่า global อื่นที่ไม่เกี่ยวข้องยังอยู่ ไฟล์ OPENCODE_CONFIG แบบกำหนดเองจะถูกโหลดระหว่างสองไฟล์ หากพฤติกรรมแตกต่างข้ามรีโพ ให้เปรียบเทียบแหล่งเหล่านี้และการตั้งค่าที่จัดการหรือ inline แทนที่จะถือว่าไฟล์ท้องถิ่นเป็นอินพุตเดียว
Does refreshing the OpenCode model list enable CometAPI access?
ไม่ ตัวเลือกรีเฟรชโมเดลจะอัปเดตแคช models.dev; มันไม่ได้ให้สิทธิ์เข้าถึงบัญชีหรือพิสูจน์ว่า endpoint ยอมรับ model ID รายการที่กำหนดเองอาจมองเห็นได้ก่อนคำขอสำเร็จ ใช้คำขอจริงเพื่อตรวจเส้นทางและตรวจสอบการจำกัดการเข้าถึงในบัญชี CometAPI
Why does curl work while OpenCode cannot call CometAPI?
สองโปรเซสอาจโหลด credential ต่างกัน ใช้ model ID ต่างกัน หรือส่งรูปทรงคำขอต่างกัน ก่อนอื่นให้รันพรอมต์ข้อความสั้นจากเทอร์มินัลเดียวกับคำขอ HTTP ที่สำเร็จ จากนั้นเปรียบเทียบ base URL ของผู้ให้บริการ adapter และโมเดลที่เลือก หากข้อความง่ายใช้ได้แต่ภารกิจเอเย่นต์ล้มเหลว เก็บ error ที่เกี่ยวกับเครื่องมือแยกต่างหาก; การเชื่อมต่อ HTTP เพียงอย่างเดียวไม่แสดงความเข้ากันได้ของเครื่องมือ
Conclusion
ตอนนี้คุณมี opencode.json เดียวที่มีตัวอย่าง Claude, GPT และ DeepSeek คีย์ CometAPI ร่วมกัน และคำสั่งสำหรับสลับโมเดลที่ใช้งาน ใช้คำขอข้อความสั้นเพื่อตรวจการเข้าถึง แล้วรันงานสร้างไฟล์เดียวกันในไดเรกทอรีแยกเพื่อยืนยันเวิร์กโฟลว์การเขียนโค้ด เก็บผลลัพธ์ที่สังเกตได้พร้อมรายละเอียดสภาพแวดล้อมของคุณก่อนนำการตั้งค่านี้ไปใช้กับรีโพที่ใหญ่ขึ้น
