DEV Community

Cover image for วิธีแก้ปัญหาข้อผิดพลาด 'Invalid custom3p enterprise config' ใน Claude Code
Thanawat Wongchai
Thanawat Wongchai

Posted on • Originally published at apidog.com

วิธีแก้ปัญหาข้อผิดพลาด 'Invalid custom3p enterprise config' ใน Claude Code

หากคุณเคยใช้ Claude Code กับ DeepSeek V4, OpenRouter หรือผู้ให้บริการโมเดลบุคคลที่สามอื่น ๆ แล้วเจอข้อผิดพลาด Invalid custom3p enterprise config ปัญหามักไม่ได้อยู่ที่โมเดล แต่เกิดจาก Claude Code ตรวจสอบการตั้งค่า provider ไม่ผ่าน คู่มือนี้สรุปสาเหตุหลักและวิธีแก้แบบลงมือทำได้ทันที

ลองใช้ Apidog วันนี้

บทความนี้จะอธิบายว่า custom3p คืออะไร ทำไม Claude Code ถึงมอง provider ของคุณเป็น custom third-party และต้องตรวจจุดใดบ้างเมื่อรัน agent loop ผ่าน DeepSeek, OpenRouter, LiteLLM หรือ vLLM

สรุปสั้น ๆ

Invalid custom3p enterprise config หมายความว่า Claude Code ตรวจสอบ config ของผู้ให้บริการบุคคลที่สามไม่ผ่าน

สาเหตุที่พบบ่อยที่สุด:

  1. ใส่ /v1 ต่อท้าย ANTHROPIC_BASE_URL
  2. ใช้ตัวแปร auth ผิดตัว เช่น ANTHROPIC_API_KEY แทน ANTHROPIC_AUTH_TOKEN
  3. ~/.claude/settings.json เป็น JSON ไม่ถูกต้อง
  4. ติดตั้ง Claude Code ใหม่แล้วยังไม่ผ่าน onboarding
  5. gateway ไม่ส่งต่อ header ที่ Claude Code ต้องใช้
  6. 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
Enter fullscreen mode Exit fullscreen mode

นี่เป็น 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
Enter fullscreen mode Exit fullscreen mode

ซึ่งมักทำให้ gateway ตอบ 404

ผิด

export ANTHROPIC_BASE_URL="https://api.openrouter.ai/api/v1"
Enter fullscreen mode Exit fullscreen mode
export ANTHROPIC_BASE_URL="https://litellm.yourcompany.com/v1"
Enter fullscreen mode Exit fullscreen mode

ถูกต้อง

export ANTHROPIC_BASE_URL="https://api.openrouter.ai/api"
Enter fullscreen mode Exit fullscreen mode
export ANTHROPIC_BASE_URL="https://litellm.yourcompany.com"
Enter fullscreen mode Exit fullscreen mode

ตรวจสอบ 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"}]}'
Enter fullscreen mode Exit fullscreen mode

ผลลัพธ์ที่ควรตีความ:

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"
Enter fullscreen mode Exit fullscreen mode

ถ้าใช้ 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"
Enter fullscreen mode Exit fullscreen mode

vLLM หรือ DeepSeek gateway ที่ใช้ API key

export ANTHROPIC_API_KEY="your-key-here"
export ANTHROPIC_BASE_URL="https://your-vllm-server"
Enter fullscreen mode Exit fullscreen mode

ถ้าไม่แน่ใจ ให้ดู 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",
  }
}
Enter fullscreen mode Exit fullscreen mode

ตัวอย่างที่ผิด: smart quotes

{
  "env": {
    “ANTHROPIC_BASE_URL”: “https://openrouter.ai/api”
  }
}
Enter fullscreen mode Exit fullscreen mode

ตัวอย่างที่ถูกต้อง

{
  "env": {
    "ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
    "ANTHROPIC_AUTH_TOKEN": "sk-or-your-openrouter-key"
  }
}
Enter fullscreen mode Exit fullscreen mode

Validate ก่อนรัน Claude Code

ใช้ Python:

python3 -c "import json, os; json.load(open(os.path.expanduser('~/.claude/settings.json')))" && echo "Valid JSON"
Enter fullscreen mode Exit fullscreen mode

หรือใช้ jq:

jq . ~/.claude/settings.json
Enter fullscreen mode Exit fullscreen mode

ถ้า parse ไม่ผ่าน Claude Code จะถือว่า enterprise config ใช้งานไม่ได้


สาเหตุที่ 4: ติดตั้งใหม่แล้วยังไม่ผ่าน onboarding

Claude Code จะเช็กไฟล์ ~/.claude.json เพื่อดูว่า onboarding เสร็จหรือยัง โดยดูค่า:

"hasCompletedOnboarding": true
Enter fullscreen mode Exit fullscreen mode

ถ้ายังไม่มีค่านี้ Claude Code อาจยังไม่อ่าน custom provider config จาก settings.json

ตรวจสอบด้วยคำสั่ง:

cat ~/.claude.json | python3 -m json.tool 2>/dev/null | grep hasCompletedOnboarding
Enter fullscreen mode Exit fullscreen mode

ถ้าไม่เจอค่า หรือค่าไม่ใช่ true ให้เพิ่ม config ขั้นต่ำนี้:

{
  "hasCompletedOnboarding": true,
  "primaryApiKey": "sk-placeholder"
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

สำหรับ 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;
}
Enter fullscreen mode Exit fullscreen mode

ถ้าคุณแก้ gateway ไม่ได้ ให้ปิด experimental beta handshake:

export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
Enter fullscreen mode Exit fullscreen mode

ผลคือ 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"
Enter fullscreen mode Exit fullscreen mode

หรือเช็กจากใน Claude Code:

/status
Enter fullscreen mode Exit fullscreen mode

ถ้าเห็นว่า managed settings active คุณต้องให้ admin ตรวจ policy เช่น:

  • อนุญาต domain ของ gateway
  • เพิ่ม model ID เข้า availableModels
  • อนุญาต custom base URL

สำหรับ deployment ระดับองค์กร ไฟล์ managed settings อาจอยู่ที่:

/Library/Application Support/ClaudeCode/managed-settings.json
Enter fullscreen mode Exit fullscreen mode

บน 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"
  }
}
Enter fullscreen mode Exit fullscreen mode

ต้องตั้ง 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"
Enter fullscreen mode Exit fullscreen mode

ตั้งค่า Claude Code:

{
  "env": {
    "ANTHROPIC_BASE_URL": "http://localhost:4000",
    "ANTHROPIC_AUTH_TOKEN": "sk-litellm-your-key"
  }
}
Enter fullscreen mode Exit fullscreen mode

ใน 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
Enter fullscreen mode Exit fullscreen mode

จากนั้นตั้งค่า Claude Code:

export ANTHROPIC_BASE_URL="http://localhost:8000"
export ANTHROPIC_API_KEY="local-key"
export ANTHROPIC_DEFAULT_SONNET_MODEL="deepseek-ai/DeepSeek-V3"
Enter fullscreen mode Exit fullscreen mode

วิธี debug แบบเป็นขั้นตอน

รัน Claude Code พร้อม debug log:

claude --debug 2>&1 | head -100
Enter fullscreen mode Exit fullscreen mode

ให้มองหาบรรทัดเหล่านี้:

  • 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"}]
  }'
Enter fullscreen mode Exit fullscreen mode

ถ้าได้ 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_url
  • auth_token
  • anthropic_version
  • anthropic_beta

จากนั้นสร้าง request:

POST {{base_url}}/v1/messages
Authorization: Bearer {{auth_token}}
anthropic-version: {{anthropic_version}}
anthropic-beta: {{anthropic_beta}}
Content-Type: application/json
Enter fullscreen mode Exit fullscreen mode

Body:

{
  "model": "claude-sonnet-4-6",
  "max_tokens": 10,
  "messages": [
    {
      "role": "user",
      "content": "hi"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

วิธีนี้ช่วยแยกปัญหาได้เร็วขึ้น โดยเฉพาะกรณี header ถูก proxy ตัดออกก่อนถึง gateway


Environment variables ที่ควรรู้

ปิด experimental beta headers

export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
Enter fullscreen mode Exit fullscreen mode

ใช้เมื่อ gateway ไม่รองรับหรือไม่ส่งต่อ anthropic-beta


เปิด gateway model discovery

ตั้งแต่ Claude Code v2.1.129 เป็นต้นไป สามารถให้ Claude Code อ่าน model list จาก gateway ได้:

export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1
Enter fullscreen mode Exit fullscreen mode

Claude Code จะเรียก /v1/models ตอนเริ่มต้น แต่โดยทั่วไปจะเพิ่มเฉพาะ model ID ที่ขึ้นต้นด้วย claude หรือ anthropic ถ้าใช้ DeepSeek ให้ pin model เองด้วย:

export ANTHROPIC_DEFAULT_SONNET_MODEL="deepseek/deepseek-v4-pro"
Enter fullscreen mode Exit fullscreen mode

เพิ่ม 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"
Enter fullscreen mode Exit fullscreen mode

model นี้จะปรากฏในตัวเลือก /model เพื่อให้สลับใช้งานได้สะดวกขึ้น


คู่มือที่เกี่ยวข้อง

ถ้าคุณใช้งาน Claude Code เป็น coding agent ร่วมกับ custom backend อ่านต่อได้จากบทความเหล่านี้:


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 ให้:

  1. ออกจาก Claude Code
  2. เปลี่ยน environment variables หรือ settings.json
  3. เริ่ม 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"
Enter fullscreen mode Exit fullscreen mode

ถ้าองค์กรมี TLS interception ให้เพิ่ม CA bundle:

export NODE_EXTRA_CA_CERTS="/path/to/corporate-ca-bundle.pem"
Enter fullscreen mode Exit fullscreen mode

curl ใช้งานได้ แต่ Claude Code ยัง error เพราะอะไร

Claude Code อาจส่ง preflight หรือ validation request ที่ curl ของคุณไม่ได้จำลอง เช่น header เหล่านี้:

  • anthropic-beta
  • X-Claude-Code-Session-Id
  • anthropic-version

ให้รัน:

claude --debug
Enter fullscreen mode Exit fullscreen mode

แล้วเปรียบเทียบ request จริงกับ curl test


บทสรุป

Invalid custom3p enterprise config คือปัญหา config validation ไม่ใช่ policy block ลำดับการแก้ที่แนะนำคือ:

  1. ลบ /v1 ออกจาก ANTHROPIC_BASE_URL
  2. ตรวจว่าใช้ ANTHROPIC_AUTH_TOKEN หรือ ANTHROPIC_API_KEY ถูกตัว
  3. validate ~/.claude/settings.json
  4. ตรวจ hasCompletedOnboarding
  5. ตรวจว่า gateway ส่งต่อ header ที่จำเป็น
  6. ตรวจ managed settings ขององค์กร

เมื่อ config ผ่าน validation แล้ว Claude Code สามารถรัน agent loop ผ่าน backend ที่คุณเลือกได้ เช่น OpenRouter, LiteLLM, DeepSeek หรือ vLLM โดยข้อจำกัดหลักยังอยู่ที่ feature เฉพาะอย่าง MCP tools และ vision input

Top comments (0)