หากคุณเคยใช้ Claude Code กับ DeepSeek V4, OpenRouter หรือผู้ให้บริการโมเดลบุคคลที่สามอื่น ๆ แล้วเจอข้อผิดพลาด Invalid custom3p enterprise config ปัญหามักไม่ได้อยู่ที่โมเดล แต่เกิดจาก Claude Code ตรวจสอบการตั้งค่า provider ไม่ผ่าน คู่มือนี้สรุปสาเหตุหลักและวิธีแก้แบบลงมือทำได้ทันที
บทความนี้จะอธิบายว่า custom3p คืออะไร ทำไม Claude Code ถึงมอง provider ของคุณเป็น custom third-party และต้องตรวจจุดใดบ้างเมื่อรัน agent loop ผ่าน DeepSeek, OpenRouter, LiteLLM หรือ vLLM
สรุปสั้น ๆ
Invalid custom3p enterprise config หมายความว่า Claude Code ตรวจสอบ config ของผู้ให้บริการบุคคลที่สามไม่ผ่าน
สาเหตุที่พบบ่อยที่สุด:
- ใส่
/v1ต่อท้ายANTHROPIC_BASE_URL - ใช้ตัวแปร auth ผิดตัว เช่น
ANTHROPIC_API_KEYแทนANTHROPIC_AUTH_TOKEN -
~/.claude/settings.jsonเป็น JSON ไม่ถูกต้อง - ติดตั้ง Claude Code ใหม่แล้วยังไม่ผ่าน onboarding
- gateway ไม่ส่งต่อ header ที่ Claude Code ต้องใช้
- managed settings ขององค์กร override ค่า local
เริ่มแก้จาก URL ก่อน เพราะมักเป็นจุดที่ผิดบ่อยที่สุด
custom3p คืออะไร
Claude Code เลือก backend จาก config ที่ตั้งไว้:
| โหมด | Trigger |
|---|---|
| Anthropic API | ไม่ตั้งค่า override |
| Amazon Bedrock | CLAUDE_CODE_USE_BEDROCK=1 |
| Google Vertex AI | CLAUDE_CODE_USE_VERTEX=1 |
| Microsoft Foundry | CLAUDE_CODE_USE_FOUNDRY=1 |
| Custom third-party |
ANTHROPIC_BASE_URL ชี้ไปยัง provider อื่น |
เมื่อคุณตั้ง ANTHROPIC_BASE_URL ไปยัง endpoint ที่ไม่ใช่ Anthropic เช่น OpenRouter, LiteLLM, vLLM หรือ gateway ภายในองค์กร Claude Code จะถือว่าเป็น custom3p และตรวจสอบ enterprise config ก่อนยิง request แรก
ถ้าตรวจไม่ผ่าน คุณจะเห็น:
Invalid custom3p enterprise config
นี่เป็น error ระดับ config validation ไม่ใช่ policy block ดังนั้นสามารถแก้ได้จากฝั่ง configuration
ทำไมนักพัฒนาถึงเจอ error นี้บ่อยขึ้น
หลังจาก Anthropic บล็อกการเข้าถึง Claude Pro และ Max จาก third-party agent tools ที่ปลอม client ID ของ Claude Code ในเดือนเมษายน 2026 นักพัฒนาจำนวนมากเริ่มย้ายมาใช้วิธีที่ Claude Code รองรับอย่างเป็นทางการแทน นั่นคือการตั้ง ANTHROPIC_BASE_URL ไปยัง gateway ของตนเองหรือ provider บุคคลที่สาม
ตัวอย่างเช่น มีการใช้งาน DeepSeek V4 Pro ผ่าน OpenRouter เพื่อลดต้นทุนต่อ token เมื่อเทียบกับ Anthropic API และโปรเจกต์อย่าง DeepClaude ก็ทำให้ flow นี้ตั้งค่าได้ง่ายขึ้น
แต่ Claude Code ยังต้องการ config ที่ถูกต้องครบถ้วน ถ้าค่าใดค่าหนึ่งผิด จะจบที่ Invalid custom3p enterprise config
สาเหตุที่ 1: ใส่ /v1 ต่อท้าย ANTHROPIC_BASE_URL
Claude Code จะเติม /v1/messages เองโดยอัตโนมัติ ถ้าคุณใส่ /v1 ไว้ใน base URL แล้ว path สุดท้ายจะกลายเป็น:
/v1/v1/messages
ซึ่งมักทำให้ gateway ตอบ 404
ผิด
export ANTHROPIC_BASE_URL="https://api.openrouter.ai/api/v1"
export ANTHROPIC_BASE_URL="https://litellm.yourcompany.com/v1"
ถูกต้อง
export ANTHROPIC_BASE_URL="https://api.openrouter.ai/api"
export ANTHROPIC_BASE_URL="https://litellm.yourcompany.com"
ตรวจสอบ endpoint ด้วย curl
curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
"${ANTHROPIC_BASE_URL}/v1/messages" \
-d '{"model":"claude-sonnet-4-6","max_tokens":1,"messages":[{"role":"user","content":"hi"}]}'
ผลลัพธ์ที่ควรตีความ:
| HTTP status | ความหมาย |
|---|---|
200 |
endpoint ใช้งานได้ |
400 |
endpoint มีอยู่ แต่ body อาจไม่ถูกต้อง |
404 |
base URL น่าจะผิด โดยเฉพาะปัญหา /v1/v1
|
สาเหตุที่ 2: ใช้ตัวแปร auth ผิดตัว
Claude Code ส่ง credential ต่างกันตามตัวแปรที่ใช้
| ตัวแปร | Header ที่ส่ง | ใช้เมื่อ |
|---|---|---|
ANTHROPIC_API_KEY |
x-api-key |
gateway ที่รองรับ Anthropic-style API key |
ANTHROPIC_AUTH_TOKEN |
Authorization: Bearer |
OAuth-style gateway, LiteLLM, OpenRouter ส่วนใหญ่ |
OpenRouter
OpenRouter คาดหวัง Bearer token:
export ANTHROPIC_AUTH_TOKEN="sk-or-your-openrouter-key"
export ANTHROPIC_BASE_URL="https://openrouter.ai/api"
ถ้าใช้ ANTHROPIC_API_KEY กับ OpenRouter Claude Code จะส่ง x-api-key ซึ่งอาจไม่ใช่ header ที่ gateway ใช้ตรวจ auth แล้วทำให้ validation fail
LiteLLM
export ANTHROPIC_AUTH_TOKEN="sk-litellm-your-virtual-key"
export ANTHROPIC_BASE_URL="https://your-litellm-server:4000"
vLLM หรือ DeepSeek gateway ที่ใช้ API key
export ANTHROPIC_API_KEY="your-key-here"
export ANTHROPIC_BASE_URL="https://your-vllm-server"
ถ้าไม่แน่ใจ ให้ดู documentation ของ gateway ว่ารับ auth ผ่าน Authorization: Bearer หรือ x-api-key
สาเหตุที่ 3: settings.json เป็น JSON ไม่ถูกต้อง
ถ้าคุณตั้งค่าใน ~/.claude/settings.json แทน environment variables ข้อผิดพลาด JSON เล็ก ๆ ก็ทำให้ Claude Code อ่าน config ไม่ได้
ตัวอย่างที่ผิด: trailing comma
{
"env": {
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
"ANTHROPIC_AUTH_TOKEN": "sk-or-your-key",
}
}
ตัวอย่างที่ผิด: smart quotes
{
"env": {
“ANTHROPIC_BASE_URL”: “https://openrouter.ai/api”
}
}
ตัวอย่างที่ถูกต้อง
{
"env": {
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
"ANTHROPIC_AUTH_TOKEN": "sk-or-your-openrouter-key"
}
}
Validate ก่อนรัน Claude Code
ใช้ Python:
python3 -c "import json, os; json.load(open(os.path.expanduser('~/.claude/settings.json')))" && echo "Valid JSON"
หรือใช้ jq:
jq . ~/.claude/settings.json
ถ้า parse ไม่ผ่าน Claude Code จะถือว่า enterprise config ใช้งานไม่ได้
สาเหตุที่ 4: ติดตั้งใหม่แล้วยังไม่ผ่าน onboarding
Claude Code จะเช็กไฟล์ ~/.claude.json เพื่อดูว่า onboarding เสร็จหรือยัง โดยดูค่า:
"hasCompletedOnboarding": true
ถ้ายังไม่มีค่านี้ Claude Code อาจยังไม่อ่าน custom provider config จาก settings.json
ตรวจสอบด้วยคำสั่ง:
cat ~/.claude.json | python3 -m json.tool 2>/dev/null | grep hasCompletedOnboarding
ถ้าไม่เจอค่า หรือค่าไม่ใช่ true ให้เพิ่ม config ขั้นต่ำนี้:
{
"hasCompletedOnboarding": true,
"primaryApiKey": "sk-placeholder"
}
primaryApiKey เป็น placeholder เพื่อผ่าน format check เท่านั้น ค่า provider จริงจะมาจาก enterprise/custom config ของคุณ
หลังแก้แล้วให้ restart Claude Code
สาเหตุที่ 5: Gateway ไม่ส่งต่อ header ที่จำเป็น
Claude Code ใช้ header บางตัวในการตรวจ feature และ session ถ้า gateway หรือ reverse proxy ตัด header เหล่านี้ออก อาจทำให้ validation fail
Header ที่ควรส่งต่อ:
anthropic-beta
anthropic-version
X-Claude-Code-Session-Id
สำหรับ LiteLLM โดยทั่วไปใช้งานได้ตั้งแต่ v1.82.9+ แต่ถ้าใช้ nginx หรือ proxy เอง ให้ forward header ชัดเจน
location /v1/ {
proxy_pass http://backend;
proxy_set_header anthropic-beta $http_anthropic_beta;
proxy_set_header anthropic-version $http_anthropic_version;
proxy_set_header X-Claude-Code-Session-Id $http_x_claude_code_session_id;
}
ถ้าคุณแก้ gateway ไม่ได้ ให้ปิด experimental beta handshake:
export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
ผลคือ agent loop หลักยังทำงานได้ แต่ feature ทดลองบางส่วนอาจใช้ไม่ได้
สาเหตุที่ 6: Managed settings ขององค์กร override ค่า local
ถ้าคุณใช้ Claude Team หรือ Enterprise แล้ว admin ตั้ง managed settings ไว้ ค่าเหล่านั้นจะ override:
- environment variables
~/.claude/settings.json- custom base URL ในเครื่อง
ตรวจสอบว่ามี managed settings หรือไม่:
ls ~/.claude/managed-settings.json 2>/dev/null && echo "Managed settings found"
หรือเช็กจากใน Claude Code:
/status
ถ้าเห็นว่า managed settings active คุณต้องให้ admin ตรวจ policy เช่น:
- อนุญาต domain ของ gateway
- เพิ่ม model ID เข้า
availableModels - อนุญาต custom base URL
สำหรับ deployment ระดับองค์กร ไฟล์ managed settings อาจอยู่ที่:
/Library/Application Support/ClaudeCode/managed-settings.json
บน macOS หรือ path ที่เทียบเท่าบน Windows/Linux
ตัวอย่าง config ที่ใช้งานได้
Claude Code + OpenRouter + DeepSeek V4 Pro
ตั้งค่าใน ~/.claude/settings.json:
{
"env": {
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
"ANTHROPIC_AUTH_TOKEN": "sk-or-your-openrouter-key",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "deepseek/deepseek-v4-pro",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "deepseek/deepseek-v4-pro",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "deepseek/deepseek-v4-pro"
}
}
ต้องตั้ง model override เพราะ Claude Code อาจ default ไปที่ claude-sonnet-4-6 แม้เปลี่ยน base URL แล้ว ถ้าไม่ pin model request อาจถูก route ไปยัง model ที่ไม่ต้องการ
หมายเหตุ: OpenRouter ยังไม่ได้ implement Anthropic streaming spec สำหรับ tool calls ได้ครบทุก edge case บางกรณี function arguments อาจว่างเปล่า main agent loop ใช้งานได้ แต่ multi-tool chains ที่ซับซ้อนอาจมีปัญหา ติดตามสถานะได้ที่ OpenRouter Claude Code integration
Claude Code + LiteLLM
LiteLLM เหมาะเมื่อคุณต้องการ route model หลาย provider ผ่าน gateway เดียว
ตัวอย่าง config.yaml ของ LiteLLM:
model_list:
- model_name: claude-sonnet-4-6
litellm_params:
model: deepseek/deepseek-v4
api_key: "sk-your-deepseek-key"
- model_name: claude-opus-4-7
litellm_params:
model: deepseek/deepseek-v4-pro
api_key: "sk-your-deepseek-key"
ตั้งค่า Claude Code:
{
"env": {
"ANTHROPIC_BASE_URL": "http://localhost:4000",
"ANTHROPIC_AUTH_TOKEN": "sk-litellm-your-key"
}
}
ใน flow นี้ Claude Code ยังส่ง model name เช่น claude-sonnet-4-6 แต่ LiteLLM จะ map ไปยัง backend model ที่คุณกำหนด
Claude Code + vLLM ในเครื่อง
ถ้าต้องการรัน inference ในเครื่องด้วย vLLM ให้เริ่ม server:
python -m vllm.entrypoints.openai.api_server \
--model deepseek-ai/DeepSeek-V3 \
--dtype auto \
--api-key local-key \
--port 8000
จากนั้นตั้งค่า Claude Code:
export ANTHROPIC_BASE_URL="http://localhost:8000"
export ANTHROPIC_API_KEY="local-key"
export ANTHROPIC_DEFAULT_SONNET_MODEL="deepseek-ai/DeepSeek-V3"
วิธี debug แบบเป็นขั้นตอน
รัน Claude Code พร้อม debug log:
claude --debug 2>&1 | head -100
ให้มองหาบรรทัดเหล่านี้:
-
Sending request to:ตรวจ base URL -
Response status:ดู HTTP status จาก gateway -
enterprise config error:ดู validation error ภายใน
ทดสอบ request แบบใกล้เคียงกับที่ Claude Code ส่ง:
curl -v -X POST "${ANTHROPIC_BASE_URL}/v1/messages" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${ANTHROPIC_AUTH_TOKEN}" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: max-tokens-3-5-sonnet-2024-07-15" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 10,
"messages": [{"role": "user", "content": "hi"}]
}'
ถ้าได้ 401, 403 หรือ 422 ปัญหาอาจอยู่ที่ gateway auth หรือ request schema ไม่ใช่ Claude Code config
ทดสอบ API ด้วย Apidog
ระหว่าง debug integration กับ third-party provider คุณสามารถใช้ Apidog เพื่อสร้าง collection สำหรับ endpoint /v1/messages ของ gateway และบันทึก request template ที่ใช้งานได้ไว้ทดสอบซ้ำ
ตั้งค่าตัวแปรระดับ collection เช่น:
base_urlauth_tokenanthropic_versionanthropic_beta
จากนั้นสร้าง request:
POST {{base_url}}/v1/messages
Authorization: Bearer {{auth_token}}
anthropic-version: {{anthropic_version}}
anthropic-beta: {{anthropic_beta}}
Content-Type: application/json
Body:
{
"model": "claude-sonnet-4-6",
"max_tokens": 10,
"messages": [
{
"role": "user",
"content": "hi"
}
]
}
วิธีนี้ช่วยแยกปัญหาได้เร็วขึ้น โดยเฉพาะกรณี header ถูก proxy ตัดออกก่อนถึง gateway
Environment variables ที่ควรรู้
ปิด experimental beta headers
export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
ใช้เมื่อ gateway ไม่รองรับหรือไม่ส่งต่อ anthropic-beta
เปิด gateway model discovery
ตั้งแต่ Claude Code v2.1.129 เป็นต้นไป สามารถให้ Claude Code อ่าน model list จาก gateway ได้:
export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1
Claude Code จะเรียก /v1/models ตอนเริ่มต้น แต่โดยทั่วไปจะเพิ่มเฉพาะ model ID ที่ขึ้นต้นด้วย claude หรือ anthropic ถ้าใช้ DeepSeek ให้ pin model เองด้วย:
export ANTHROPIC_DEFAULT_SONNET_MODEL="deepseek/deepseek-v4-pro"
เพิ่ม custom model option
export ANTHROPIC_CUSTOM_MODEL_OPTION="deepseek/deepseek-v4-pro"
export ANTHROPIC_CUSTOM_MODEL_OPTION_NAME="DeepSeek V4 Pro"
export ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION="17x cheaper than Claude Opus"
model นี้จะปรากฏในตัวเลือก /model เพื่อให้สลับใช้งานได้สะดวกขึ้น
คู่มือที่เกี่ยวข้อง
ถ้าคุณใช้งาน Claude Code เป็น coding agent ร่วมกับ custom backend อ่านต่อได้จากบทความเหล่านี้:
- วิธีเขียนไฟล์ AGENTS.md สำหรับทีมพัฒนา API
- Ruflo: การจัดการ Multi-Agent สำหรับ Claude Code
- รับ Claude API แบบฟรีไม่จำกัดผ่าน Puter.js
- LLM ในเครื่องที่ดีที่สุดปี 2026
FAQ
การใช้ provider บุคคลที่สามกับ Claude Code ขัดต่อข้อกำหนดของ Anthropic หรือไม่
ไม่ใช่ในกรณีที่ใช้ ANTHROPIC_BASE_URL และ API key ของคุณเอง Anthropic รองรับ pattern นี้สำหรับ Bedrock, Vertex AI, Foundry และ custom gateway
สิ่งที่ถูกบล็อกคือเครื่องมือที่ปลอม client ID ของ Claude Code เพื่อใช้ subscription pricing กับ API ของ Anthropic
Agent loop ของ Claude Code ใช้กับ DeepSeek V4 Pro ได้หรือไม่
core loop ใช้งานได้ เช่น:
- แก้ไฟล์
- รัน shell command
- ทำงานหลายขั้นตอน
- ใช้ reasoning flow พื้นฐาน
ข้อจำกัดที่ระบุไว้คือ MCP server tools และ image/vision input อาจยังต้องใช้ Anthropic API หรือ provider ที่รองรับเต็มรูปแบบ
ทำไม error ถึงใช้คำว่า enterprise config ทั้งที่ไม่ได้ใช้แผน Enterprise
Claude Code ใช้คำว่า enterprise config เป็นชื่อภายในสำหรับ configuration ของ provider/gateway ไม่ได้หมายความว่าคุณต้องอยู่ในแผน Enterprise
สลับระหว่าง Anthropic กับ third-party provider ใน session เดียวได้ไหม
ไม่ได้ ANTHROPIC_BASE_URL จะถูกอ่านตอนเริ่ม session ถ้าจะเปลี่ยน provider ให้:
- ออกจาก Claude Code
- เปลี่ยน environment variables หรือ
settings.json - เริ่ม session ใหม่
เครื่องมืออย่าง DeepClaude ช่วย wrap flow นี้ผ่าน CLI flag เช่น --backend ds หรือ --backend anthropic
Gateway อยู่หลัง corporate proxy ต้องตั้งค่าอะไรเพิ่ม
ตั้ง proxy ก่อนรัน Claude Code:
export HTTPS_PROXY="http://your-proxy:8080"
export ANTHROPIC_BASE_URL="https://your-internal-gateway"
ถ้าองค์กรมี TLS interception ให้เพิ่ม CA bundle:
export NODE_EXTRA_CA_CERTS="/path/to/corporate-ca-bundle.pem"
curl ใช้งานได้ แต่ Claude Code ยัง error เพราะอะไร
Claude Code อาจส่ง preflight หรือ validation request ที่ curl ของคุณไม่ได้จำลอง เช่น header เหล่านี้:
anthropic-betaX-Claude-Code-Session-Idanthropic-version
ให้รัน:
claude --debug
แล้วเปรียบเทียบ request จริงกับ curl test
บทสรุป
Invalid custom3p enterprise config คือปัญหา config validation ไม่ใช่ policy block ลำดับการแก้ที่แนะนำคือ:
- ลบ
/v1ออกจากANTHROPIC_BASE_URL - ตรวจว่าใช้
ANTHROPIC_AUTH_TOKENหรือANTHROPIC_API_KEYถูกตัว - validate
~/.claude/settings.json - ตรวจ
hasCompletedOnboarding - ตรวจว่า gateway ส่งต่อ header ที่จำเป็น
- ตรวจ managed settings ขององค์กร
เมื่อ config ผ่าน validation แล้ว Claude Code สามารถรัน agent loop ผ่าน backend ที่คุณเลือกได้ เช่น OpenRouter, LiteLLM, DeepSeek หรือ vLLM โดยข้อจำกัดหลักยังอยู่ที่ feature เฉพาะอย่าง MCP tools และ vision input

Top comments (0)