0

# Hướng dẫn cài đặt Claude Code trên Windows và kết nối Crazyrouter: từ lỗi 403 đến chạy thành công

Hướng dẫn cài đặt Claude Code trên Windows và kết nối Crazyrouter: từ lỗi 403 đến chạy thành công

Lần đầu cài Claude Code (công cụ mã hóa AI) trên Windows, rất nhiều người bị kẹt ở cùng một chỗ: terminal đã hiện version, nhưng gõ claude thì nhận toàn lỗi 403.

Chính tôi cũng từng kẹt như vậy. claude --version hiển thị bình thường, nhưng mỗi lần khởi động đều báo không kết nối được api.anthropic.com. Tôi từng nghĩ do version cũ, nên cài lại npm ba lần, loay hoay giữa proxy và file cấu hình, cuối cùng mới phát hiện nguyên nhân thật sự chỉ là tôi ghi sai một tên biến trong cấu hình.

Bài viết này ghi lại toàn bộ chuỗi thao tác theo đúng trình tự: cài xong Claude Code → kết nối API của Crazyrouter → xác thực bằng một phản hồi mô hình hoàn chỉnh. Mọi lỗi gặp phải đều được giữ lại ảnh thật, và mỗi bước đều nói rõ "bước này đang kiểm tra điều gì".

Làm theo bài này, bạn sẽ có một chuỗi bằng chứng đầy đủ: lệnh chạy được, cấu hình đọc được, mô hình trả lời được, log backend khớp. Cuối bài có dữ liệu thực đo được trong lần chạy thử.

Bài viết dùng Windows 10/11 và PowerShell làm ví dụ. Mọi chỗ ghi YOUR_CRAZYROUTER_API_KEY đều là placeholder, bạn cần thay bằng key do chính mình tạo.

Ba khái niệm cần phân biệt trước đã

Người mới dễ nhầm lẫn ba thứ thành một, rồi sửa lung tung trước một lỗi.

Tên Hiểu đơn giản Bài này làm gì
Claude Code Công cụ AI chạy trên máy, đọc file, viết code trong terminal Cài chương trình, xác nhận lệnh chạy được
Mô hình (model) Dịch vụ thực sự nhận câu hỏi và sinh câu trả lời Chọn một model hiện hữu với key, phù hợp Claude Code
Crazyrouter API Cổng kết nối bên thứ ba dùng trong bài Tạo Key, điền Base URL, tra model, đối soát log

Claude Code bản thân nó không phải là mô hình. Cài xong nó không đồng nghĩa bạn có subscription chính thức của Claude, cũng không đồng nghĩa tài khoản Crazyrouter đã có sẵn额度 (hạn mức). Hai việc này cần chuẩn bị riêng.

Dưới đây chia làm ba phần: cài nó, nối nó, xác thực nó.

Version hiển thị bình thường nhưng khi khởi động vẫn truy cập api.anthropic.com và nhận 403

Ảnh này là điểm xuất phát của toàn bộ bài: cài thành công và gọi thành công là hai lần nghiệm thu khác nhau. Version number chỉ chứng minh lần thứ nhất.


Phần 1: Cài Claude Code đến mức chạy được

Bước 1: Mở PowerShell, xác định đúng nơi nhập lệnh

Nhấn Start, tìm PowerShell, mở lên. Hoặc trong Windows Terminal, chọn tab PowerShell.

Thấy dấu nhắc kiểu thế này mới là vị trí nhập lệnh của bài:

PS C:\Users\tên_của_bạn>

Dấu nhắc này không cần copy. Chỉ copy lệnh trong khung code, từng dòng một, chờ kết quả rồi mới sang bước sau.

Nếu bạn đang bị kẹt trong giao diện chat của Claude Code, hãy thoát session về PowerShell trước. Đừng gửi lệnh cài đặt vào ô chat như nội dung hội thoại.

Cửa sổ thường là đủ để cài. Chỉ xử lý quyền admin khi trình cài đặt báo thiếu quyền. Đừng vì một lỗi không hiểu mà tắt toàn cục execution policy.

Bước 2: Ưu tiên cài bằng cách thức chính chủ

Theo tài liệu cài đặt chính thức hiện tại của Claude Code, lệnh cài native trên Windows PowerShell là:

irm https://claude.ai/install.ps1 | iex

Lệnh này tải script chính chủ và thực thi. Trước khi chạy, hãy xác nhận domain là claude.ai, không thay bằng địa chỉ không rõ nguồn gốc.

Cài native không yêu cầu cài Node.js trước. Một số hướng dẫn cũ viết "không có Node.js thì không cài được" là nói về cách npm, không áp dụng cho cài native hiện tại.

Sau khi cài, xử lý PATH theo hướng dẫn. Nếu cần mở lại terminal, hãy đóng cửa sổ hiện tại và mở cái mới, rồi chạy:

claude --version

Thấy version là lệnh trên máy đã dùng được. Số cụ thể thay đổi theo version, không cần khớp với ảnh trong bài.

Nếu báo không tìm thấy lệnh, hãy kiểm tra trình cài đặt có yêu cầu thêm thư mục sau vào PATH của user hiện tại:

%USERPROFILE%\.local\bin

Vào Start tìm "Edit environment variables for your account", vào mục Path của user variables, xác nhận thư mục này có mặt. Sửa xong thì mở lại terminal.

Nếu script tải thất bại, hoặc output lẫn HTML, <script>, captcha trang web, hãy dừng ngay tuyến đường này. Đó nghĩa là bạn nhận được không phải script cài đặt; sửa cú pháp PowerShell tiếp là vô nghĩa, hãy chuyển sang cách npm ở bước sau.

Script cài đặt chính chủ trả về trang HTML, iex thực thi trang web như lệnh và báo một màn lỗi cú pháp JavaScript

Nhìn ảnh này đừng đi tìm dòng nào sai. Thông tin then chốt là trong lỗi xuất hiện <script type="text/javascript">, var, ||, && — đây đều là thứ của JavaScript và HTML. PowerShell báo "từ khóa var không được hỗ trợ" không phải vì nó hỏng, mà vì nó đang dùng cú pháp PowerShell để parse một đoạn trang web.

Bước 3: Script chính chủ lỗi, hoặc bạn đã có sẵn Node.js: dùng npm

Ai đã cài xong ở bước trước thì bỏ qua đoạn này, không cần cài hai bộ.

Đầu tiên vào trang tải Node.js chọn bản LTS cho Windows, cài theo wizard. Tài liệu chính thức hiện tại yêu cầu cách npm cần Node.js 22 trở lên, đừng bê version thấp từ hướng dẫn cũ.

Đóng terminal cũ, mở lại PowerShell, chạy lần lượt:

node --version
npm.cmd --version

Cả hai phải hiện version. Dòng đầu không có thì sửa Node.js hoặc PATH; dòng sau không có thì sửa npm. Lệnh cơ bản chưa chạy được thì đừng vội cài Claude Code.

Ở đây dùng npm.cmd thay vì npm để gọi rõ ràng wrapper lệnh của Windows, tránh PowerShell ưu tiên chọn npm.ps1 mà vướng execution policy.

Sau đó chỉ copy một dòng này:

npm.cmd install -g @anthropic-ai/claude-code

Lưu ý có khoảng trắng giữa -g và tên gói, tên gói không có chữ npm thứ hai ở cuối. Đợi chạy xong, rồi kiểm tra:

claude.cmd --version

claude.cmd tương ứng với cài npm. Phần thân bài thống nhất viết claude; người dùng npm nếu vướng lỗi execution policy của claude.ps1 thì đổi sang claude.cmd.

Nếu bước này báo E404

Đừng nghi ngờ mạng hay mirror, hãy đọc kỹ từng ký tự tên gói trong lỗi.

Hai lệnh npm dính liền nhau, tên gói bị ghép thành claude-codenpm không tồn tại

Tên gói trong ảnh là @anthropic-ai/claude-codenpm, thừa chữ npm ở cuối. Nhìn lại lệnh tôi chạy, thực tế là:

npm install -g @anthropic-ai/claude-codenpm install -g @anthropic-ai/claude-code

Khi copy, hai lệnh dính thành một, tên gói và đầu dòng lệnh sau dính vào nhau. Việc này không liên quan gì đến mạng hay registry. Xóa input, chạy lại một mình lệnh cài gói là được.

Tên gói đúng luôn là @anthropic-ai/claude-code.

Bước 4: Có cần cài Git không?

Theo tài liệu chính thức tôi đọc được, bản Windows hiện tại vẫn thực thi được lệnh Shell qua PowerShell ngay cả khi chưa có Git for Windows; có Git for Windows thì có thể dùng Git Bash.

Vậy đừng viết "phải cài Git mới khởi động được". Chỉ khi bạn cần clone repo, quản lý version, hoặc version của bạn yêu cầu rõ Git Bash, hãy cài Git for Windows, xong mở lại terminal dùng git --version kiểm tra.

Bước 5: Dấu hiệu thành công duy nhất của bước cài

Chỉ có một: lệnh version trả về bình thường.

Đừng gọi đó là "mô hình chạy được". Trong ảnh 403 ở trên, version hiện rõ ràng, nhưng khởi động vẫn bị từ chối. Nhớ ranh giới này thì sau không tự lừa mình.


Phần 2: Kết nối Crazyrouter API

Phần này đừng bỏ qua. Chỉ cài Claude Code mà không cấu hình dịch vụ mô hình khả dụng, bạn vẫn không hỏi được câu nào.

Bước 1: Đăng ký và đăng nhập Crazyrouter

Mở trang đăng ký của Crazyrouter. Nếu đã có tài khoản thì đăng nhập luôn.

Điền tên user, email, mật khẩu và captcha theo hướng dẫn trang, đọc xong thỏa thuận thì hoàn tất đăng ký. Trường và cách xác thực có thể thay đổi, lấy theo trang bạn thực tế thấy.

Sau khi đăng nhập, hãy xem trước trạng thái tài khoản và trang ví/hạn mức. Đăng ký thành công không đồng nghĩa đủ điều kiện gọi; có cần nạp tiền, giá hiện tại và phương thức thanh toán lấy theo trang tài khoản của bạn.

Bước 2: Tạo một API Key riêng cho Claude Code

Vào console, tìm mục tạo "API Key":

  1. Đặt tên dễ nhận biết, ví dụ claude-code-windows.
  2. Kiểm tra hạn hiệu lực, đừng vừa cấu hình xong đã hết hạn.
  3. Nếu có giới hạn hạn mức hoặc mô hình, xác nhận đủ chạy xong bài test đầu, và bao gồm model bạn dùng.
  4. Sau khi lưu, copy Key và cất trên máy mình.

Mật khẩu đăng nhập, mã xác thực email, API Key là ba thứ khác nhau. Claude Code cần là API Key tạo ở đây.

Bước 3: Phân biệt cổng web và cổng API, đừng điền sai

Bài này dùng thống nhất cổng Đông Á đang cấu hình trên máy:

https://cn.crazyrouter.com
Dùng cho Địa chỉ bài này Điền ở đâu
Đăng ký, đăng nhập, quản lý tài khoản https://crazyrouter.com Trình duyệt
Base URL (địa chỉ gốc API) của Claude Code https://cn.crazyrouter.com ANTHROPIC_BASE_URL
Tra danh sách model https://cn.crazyrouter.com/v1/models Kiểm tra riêng
API Anthropic Messages https://cn.crazyrouter.com/v1/messages Client gọi khi hỏi model

Cổng quốc tế mặc định trong tài liệu Crazyrouter là https://api.crazyrouter.com. Nếu bạn chọn cổng quốc tế, hãy đổi luôn cả root address trong mọi cấu hình và lệnh kiểm tra sau, đừng đoạn này Đông Á, đoạn kia quốc tế.

Điều then chốt: điền cho Claude Code là root address, không phải nguyên chuỗi /v1/messages. Điểm này ngược với client tương thích OpenAI (loại đó thường bắt buộc có /v1), copy bừa sang thường ra 404 hoặc đường dẫn xuất hiện /v1/v1/messages.

Các địa chỉ máy gọi này không được thêm tham số UTM. Link web như đăng ký, giá cả có thể mang tham số thống kê, nhưng đừng dán cả link tham số vào cấu hình API.

Bước 4: Mở file cấu hình của Claude Code

Bài này dùng settings.json cấp user, để khởi động từ bất kỳ thư mục dự án nào cũng có hiệu lực. Đường dẫn:

%USERPROFILE%\.claude\settings.json

Trước tiên tạo thư mục trong PowerShell:

New-Item -ItemType Directory -Path "$env:USERPROFILE\.claude" -Force | Out-Null

Nếu đã có file cấu hình, hãy backup trước:

$settingsPath = Join-Path $env:USERPROFILE '.claude\settings.json'
if (Test-Path -LiteralPath $settingsPath) {
    $backupPath = "$settingsPath.backup-$(Get-Date -Format 'yyyyMMdd-HHmmss')"
    Copy-Item -LiteralPath $settingsPath -Destination $backupPath
}

Sau đó mở bằng Notepad:

notepad.exe "$env:USERPROFILE\.claude\settings.json"

Báo file không tồn tại thì tạo mới. Khi lưu, xác nhận tên file là settings.json, không phải settings.json.txt — bật "Hiển thị phần mở rộng file" trong File Explorer để kiểm tra đuôi.

Bước 5: Viết JSON vào Notepad, đừng viết vào PowerShell

File trống mới tạo thì điền đoạn này:

{
  "env": {
    "ANTHROPIC_BASE_URL": "https://cn.crazyrouter.com",
    "ANTHROPIC_AUTH_TOKEN": "YOUR_CRAZYROUTER_API_KEY"
  }
}

Thay YOUR_CRAZYROUTER_API_KEY bằng Key của mình, Ctrl+S lưu.

Ba điểm dễ vấp:

  • Tên trường, URL, Key đều nằm trong dấu ngoặc kép tiếng Anh, không dùng dấu ngoặc kép tiếng Việt.
  • Không thêm //comment, sau mục cuối không để dấu phẩy.
  • Nếu file sẵn có cấu hình khác, chỉ merge các trường cần, đừng ghi đè toàn bộ. Đã có env thì bổ sung trong cùng một env, đừng viết hai env.

Tại sao dùng ANTHROPIC_AUTH_TOKEN thay vì ANTHROPIC_API_KEY

Đây là câu đáng nhớ nhất bài: khi nối endpoint tương thích Anthropic bên thứ ba, dùng ANTHROPIC_AUTH_TOKEN, đừng dùng ANTHROPIC_API_KEY.

Hai biến này gửi không phải cùng một request header:

Biến Header thực tế gửi đi Mục đích thiết kế
ANTHROPIC_API_KEY x-api-key: <key> Xác thực API chính chủ Anthropic
ANTHROPIC_AUTH_TOKEN Authorization: Bearer <token> Gateway tùy biến / tương thích

x-api-key là header riêng do Anthropic định nghĩa, gắn với ngữ nghĩa "tôi đi kênh chính chủ"; endpoint tương thích nhận header chuẩn Authorization: Bearer.

Vậy điền ANTHROPIC_API_KEY tức là bảo client "tôi có key chính chủ", nó sẽ tiếp tục đi kênh chính chủ, ANTHROPIC_BASE_URL không kéo được nó — đó là lý do đã cấu hình地址 (địa chỉ) vẫn 403.

Đừng "cho chắc" mà nhét cả hai credentials, sẽ khiến mỗi lần khởi động đều bật hỏi chọn một. Ai đã cấu hình tài khoản chính chủ, proxy khác thì đối chiếu cấu hình hiện tại rồi mới sửa.

Bước 6: Kiểm tra cấu hình có parse được không

Sau khi lưu, về PowerShell:

$settingsPath = Join-Path $env:USERPROFILE '.claude\settings.json'
$ccSettings = Get-Content -Raw -LiteralPath $settingsPath | ConvertFrom-Json
[pscustomobject]@{
    BaseURL = $ccSettings.env.ANTHROPIC_BASE_URL
    HasAuthToken = -not [string]::IsNullOrWhiteSpace(
        [string]$ccSettings.env.ANTHROPIC_AUTH_TOKEN
    )
}

Kỳ vọng thấy Base URL đúng, và HasAuthToken là True.

Bước này chỉ xác thực "cấu hình parse được, trường không rỗng", không xác thực Key có hợp lệ. Nếu chưa thay placeholder, nó vẫn hiện True.

Đừng vì chụp ảnh mà in toàn bộ $ccSettings ra màn hình, sẽ làm lộ Key thật. Khi nhờ người khác sửa lỗi, chỉ gửi tên trường, địa chỉ và thông báo lỗi đã che.

Bước 7: Dùng chính Key của bạn tra danh sách model một lần

Tiếp tục trong cùng cửa sổ:

$crBase = ([string]$ccSettings.env.ANTHROPIC_BASE_URL).TrimEnd('/')
$crHeaders = @{
    Authorization = "Bearer $($ccSettings.env.ANTHROPIC_AUTH_TOKEN)"
}
$crModels = Invoke-RestMethod `
    -Uri "$crBase/v1/models" `
    -Headers $crHeaders `
    -Method Get `
    -TimeoutSec 30
$crModels.data | Select-Object id

Nó đọc trực tiếp cấu hình vừa lưu, không cần viết Key vào lệnh sẽ lưu trong history.

Sau khi trả về danh sách ID model, hãy vào trang model và giá của Crazyrouter xác nhận: model bạn chọn có áp dụng cho giao thức Anthropic Messages mà Claude Code dùng hay không, và hiện đang tính phí ra sao.

Model hiện trong danh sách không đồng nghĩa mọi giao thức đều gọi được, cũng không đồng nghĩa kênh hiện tại chắc chắn sinh được. Đây là lý do sau vẫn cần hỏi thật một câu.

Đừng lấy tên marketing hoặc tên model trong ảnh cũ làm ID, copy chính xác ID do interface trả về.

Bước 8: Ghi model ID và khởi động lại

Xác định ID rồi, bổ sung cấu hình thành:

{
  "env": {
    "ANTHROPIC_BASE_URL": "https://cn.crazyrouter.com",
    "ANTHROPIC_AUTH_TOKEN": "YOUR_CRAZYROUTER_API_KEY"
  },
  "model": "YOUR_MODEL_ID"
}

Key và model ID đều thay bằng giá trị hợp lệ của mình. YOUR_MODEL_ID không phải tên model có thể gọi.

Sau khi lưu, thoát session cũ, khởi động lại từ terminal. Nếu đã sửa biến môi trường user Windows thì cũng mở lại terminal, đừng tiếp tục dùng giá trị trong process cũ.

Ai đang dùng CC Switch hay công cụ quản lý cấu hình khác, hãy xác nhận đang đi tuyến kết nối nào. Đừng vừa để tool tự ghi đè cấu hình, vừa sửa thủ công cùng file, cuối cùng không biết bản nào có hiệu lực.


Phần 3: Câu hỏi đầu tiên, thế nào mới gọi là thật sự nối được

Bước 1: Tạo thư mục luyện tập sạch

Đừng lập tức mở ngay dự án thật. Trong PowerShell:

$demoDir = Join-Path $env:USERPROFILE 'claude-code-first-run'
New-Item -ItemType Directory -Path $demoDir -Force | Out-Null
Set-Location -LiteralPath $demoDir

Xác nhận thư mục này không có dữ liệu cần bảo vệ, cũng không có cấu hình dự án thêm, rồi khởi động:

claude

Người cài npm vướng chính sách script thì dùng:

claude.cmd

Lần đầu chạy có thể xuất hiện chọn theme, tin cậy thư mục, xác thực — giao diện thay đổi theo version. Chỉ xác nhận tin cậy khi thư mục đích thực sự là thư mục luyện tập của bạn — Claude Code sẽ đọc, ghi và thực thi file trong thư mục này.

Nếu bật ra quy trình đăng nhập chính chủ, hãy quay lại kiểm tra cấu hình bên thứ ba, đừng điền Key của Crazyrouter vào ô mật khẩu tài khoản chính chủ.

Bước 2: Để model chỉ trả lời một câu

Vào ô nhập, gõ câu này:

请只回复OK,不要读取文件,不要运行命令。

Lưu ý: câu này vào ô chat của Claude Code, không phải PowerShell.

Kỳ vọng nhận một OK hoàn chỉnh.

Nếu thích kiểm tra tối thiểu ngay trên terminal, có thể dùng chế độ non-interactive:

claude -p "请只回复OK,不要读取文件,不要运行命令。"

Người dùng npm tương ứng claude.cmd -p .... Chạy thông qua một request tối thiểu trước, rồi mới lên task phức tạp, không thì lập tức để tool đọc dự án, gọi tool ngoài, biến số sửa lỗi sẽ nhiều đến mức bạn phân biệt không nổi.

Bước 3: Về console đối chiếu log sử dụng

Thấy câu trả lời rồi, mở log sử dụng của console Crazyrouter, lọc theo thời gian, tên Key, model, đối chiếu lần gọi này:

  1. Thời gian có khớp với câu hỏi vừa rồi không.
  2. Model có phải cái bạn chọn không (có ánh xạ alias thì kết hợp giải thích nền tảng xem).
  3. Có bản ghi request nhận diện được, trạng thái và lượng dùng không.
  4. Client có thực sự trả lời hoàn chỉnh, không chỉ có animation tải.

Log có thể trễ hoặc lọc sai, tra không thấy thì refresh trước, đối chiếu điều kiện lọc trước, đừng vội kết luận; ngược lại, chỉ thấy một bản ghi backend cũng không khẳng định trả lời thành công.

Lệnh chạy được + cấu hình đọc được + nhận trả lời hoàn chỉnh + log backend khớp, mới là một chuỗi kết nối có bằng chứng.

Bước 4: Thử thêm một task nhỏ thật sự

Có thể tiếp tục nói với nó:

请在当前练习目录中创建一个README.md,用中文写三条学习Claude Code的计划。不要读取其他目录,不要安装依赖。需要写文件时先让我确认。

Nó có thể đề xuất sửa file. Đọc kỹ đường dẫn và nội dung, xác nhận là hành động dự kiến rồi mới cấp quyền. Xong mở README.md tự kiểm tra, đừng chỉ tin model nói "đã xong".

Bài này không viết --dangerously-skip-permissions thành lệnh khởi động mặc định cho người mới. Hãy học xem nó chuẩn bị đọc gì, viết gì, rồi mới bàn nới lỏng quyền.


Phần 4: Gặp lỗi, xử lý theo vị trí xuất hiện

Trước hết đối chiếu bảng này tìm trường hợp trùng với bạn, đừng đồng thời đổi endpoint, đổi Key, sửa proxy, cài lại phần mềm — như vậy dù phục hồi, bạn cũng không biết bước nào phát huy tác dụng.

Hiện tượng Kiểm tra lớp nào trước Hành động đầu
Không tìm thấy claude Cài đặt hoặc PATH Mở lại terminal, kiểm tra đường cài và nguồn lệnh
npm E404 Tên gói, nguồn hoặc quyền Đọc kỹ tên gói và địa chỉ request trong lỗi
Dán JSON ra ParserError Vị trí thao tác hoặc cú pháp Lưu JSON vào file cấu hình, đừng thực thi trong PowerShell
Lỗi nhắc api.anthropic.com Đích request hoặc xác thực Phân biệt là request model, kiểm tra đăng nhập hay request khác
401 / 403 Xác thực, quyền, chính sách dịch vụ Xem response body, host đích, trạng thái Key và log nền tảng
ConnectionRefused Giai đoạn kết nối Tra host và port bị từ chối, nhất là proxy local
Model không tồn tại / không có kênh Model và routing Đối chiếu ID chính xác, giao thức, quyền Key và trạng thái dịch vụ
Vào giao diện chính nhưng không trả lời Chưa xong nghiệm thu model Thực hiện câu hỏi tối thiểu, ghi lỗi đầy đủ, đừng viết "chạy được"

403: Xem request thực sự đánh vào đâu

Lỗi lúc đó là:

Failed to connect to api.anthropic.com: Status 403

Chia làm ba lớp đọc:

  1. Status 403 — request đã gửi đi, cũng nhận phản hồi, là server từ chối rõ ràng. Nếu mạng không thông, bạn sẽ thấy timeout hoặc DNS fail, không cho mã HTTP.
  2. Tên host là api.anthropic.com — đây là thông tin đắt giá nhất cả dòng. Bạn đã cấu hình Crazyrouter, request lại còn đánh domain chính chủ, chứng tỏ client hoàn toàn không nhận cấu hình bạn điền.
  3. Kết hợp kết luận "version bình thường" ở trước, vấn đề không ở cài đặt, mà ở request đi đâu, dùng credentials gì.

Vậy thứ tự đúng là: xác nhận request đánh vào đâu trước, rồi mới bàn tại sao bị từ chối. Lộn ngược, bạn sẽ như tôi, điều chỉnh tham số trong kịch bản không hề xảy ra.

Nếu bạn định đi Crazyrouter nhưng request vẫn chỉ host khác, hãy kiểm tra theo thứ tự:

  1. File cấu hình user có thực sự nằm trong thư mục Windows account hiện tại không.
  2. settings.json có parse được, Base URL có gõ sai không.
  3. CLAUDE_CONFIG_DIR có thay đổi thư mục cấu hình không.
  4. Có còn trong session cũ, chưa restart không.
  5. Dưới dự án hiện tại có .claude/settings.json hoặc .claude/settings.local.json ưu tiên cao hơn ghi đè không.
  6. Tham số khởi động, biến môi trường, trạng thái đăng nhập chính chủ hoặc CC Switch có ảnh hưởng route xác thực thực tế không.

Đồng thời phân biệt request model và request phụ như đăng nhập, cập nhật. Trong lỗi xuất hiện domain chính chủ không nhất định nghĩa mọi request model đều bỏ qua Base URL bạn điền.

Nếu 403 đến từ Crazyrouter, hãy tra response body lần đó, hạn Key, hạn mức, giới hạn model và log sử dụng. Giữ request ID trong lỗi, hữu dụng hơn nhiều so với chỉ gửi một ảnh "403". Đừng gửi Key thật ra ngoài.

ConnectionRefused: Tra kết nối, đừng vội đổi Key

Nếu lỗi chỉ vào một port của 127.0.0.1 hoặc localhost, thường là chương trình đang kết nối proxy local, nhưng port đó không có service lắng nghe.

Ví dụ port trong lỗi bạn là 7890 (chỉ là ví dụ, hãy dùng port thật trong lỗi của bạn), mới kiểm tra:

Test-NetConnection 127.0.0.1 -Port 7890

TcpTestSucceeded=False nghĩa là TCP này không thiết lập được, nó còn chưa chạm tới dịch vụ remote, tất nhiên không thể dùng để chứng minh Key có vấn đề.

Nếu xác nhận kết nối hiện tại không cần proxy, có thể trong một cửa sổ PowerShell tạm xóa biến proxy mà process kế thừa rồi test:

Remove-Item Env:HTTP_PROXY, Env:HTTPS_PROXY, Env:ALL_PROXY -ErrorAction SilentlyContinue

Lệnh này chỉ xóa ba biến trong process hiện tại, không sửa biến môi trường Windows vĩnh viễn, cũng không tự xóa proxy riêng trong settings.json. Môi trường phụ thuộc proxy lên mạng đừng bê nguyên xi.

Có thể tiện thể xem port 443 của cổng:

Test-NetConnection cn.crazyrouter.com -Port 443

Lệnh này chỉ phán đoán tính thông suốt TCP, không xác thực TLS, Key, quyền model hay kết quả sinh. Port thông rồi bạn vẫn phải quay lại làm câu hỏi tối thiểu.

Model hiện hữu nhưng request vẫn fail

Trước hết xác nhận bạn dùng ID chính xác, và phù hợp giao thức hiện tại. Sau đó xem response body và log nền tảng, phân biệt là quyền model, số dư, giới hạn tốc độ, kênh không dùng được hay lỗi tham số.

Đừng vì /v1/models từng xuất hiện một cái tên mà viết "model này đã thực測 (thực đo) hỗ trợ Claude Code". Danh sách model, response interface Messages, vận hành thực tế Claude Code là ba tầng bằng chứng khác nhau.


Phần 5: Bản ghi thực đo lần này

Toàn bộ bước trên chạy xong trên máy, dưới đây là dữ liệu thực lấy ngày 28 tháng 9 năm 2026.

Hạng mục kiểm tra Kết quả lần này
Hệ điều hành Windows 10
Terminal Windows PowerShell
Node.js v22.22.2
npm 10.9.7
Claude Code 2.1.281
Base URL https://cn.crazyrouter.com
Đọc cấu hình settings.json parse được, ANTHROPIC_AUTH_TOKEN đã sẵn sàng, không trộn ANTHROPIC_API_KEY
GET /v1/models HTTP 200, trả về 161 ID model, model chọn có trong danh sách
POST /v1/messages HTTP 200, nội dung trả về OK, stop_reason là end_turn
Response ID trả về msg_011CfVJqbN2DVuqoYqgLcdNE
Lượng token Input 18, output 4
Thời gian khứ hồi (gọi trực tiếp interface) 11569 ms
Gọi từ client Claude Code exit code 0, is_error=false, subtype=success, trả về OK
Thời gian client 5103 ms
Session ID a7a76f08-fa36-4a36-8787-3f2b24dad626

Lần test này dùng cách ly: thư mục cấu hình tạm, credentials chỉ truyền qua process environment, không echo ra màn hình. Vậy nó xác thực "cấu hình này hiện tại thông", không phải "cấu hình thường ngày của bạn chắc chắn không vấn đề".

Request body dùng cho kiểm tra interface tối thiểu:

{
  "model": "claude-fable-5-1",
  "max_tokens": 32,
  "messages": [
    {
      "role": "user",
      "content": "Reply with exactly OK."
    }
  ]
}

Interface dự định gọi là POST https://cn.crazyrouter.com/v1/messages. Đoạn JSON này là HTTP request body, đừng lưu thành settings.json, cũng đừng dán thẳng vào PowerShell thực thi.

Về giới hạn kết luận, tôi muốn nói rõ thêm:

  • Lần này lấy được một câu trả lời model hoàn chỉnh, nó chứng minh request tối thiểu lần đó thành công.
  • Một lần thành công không đồng nghĩa ổn định lâu dài, cũng không đồng nghĩa mọi model đều dùng được, task dự án lớn chắc chắn hoàn thành.
  • Model ID và giá sẽ thay đổi theo kênh và cấu hình nền tảng, lấy theo /v1/models và console của bạn lúc tra cứu.
  • Bài này ghi lại model ID tra được lần đó, không đại diện danh tính model thật sau nền tảng.

Câu hỏi thường gặp

1. Cài Claude Code có nhất thiết phải cài Node.js trước không?

Chưa chắc. Cài native chính chủ hiện tại không yêu cầu cài Node.js trước; chỉ tuyến dự phòng npm của bài này mới cần, và phải thỏa mãn yêu cầu version của gói npm hiện tại (Node.js 22+).

2. Tại sao trong PowerShell phải viết npm.cmd và claude.cmd?

Cài npm trên Windows kèm theo wrapper lệnh. Viết rõ .cmd tránh PowerShell ưu tiên chọn .ps1 mà vướng giới hạn execution policy. Cài native chưa chắc có claude.cmd, dùng claude là được.

3. claude --version có version rồi là thông chưa?

Chưa. Nó chỉ chứng minh CLI trên máy chạy được. Thật sự thông cần có câu trả lời hoàn chỉnh của model, tốt nhất về console đối chiếu log. Ảnh 403 đầu bài, version vẫn bình thường.

4. Mật khẩu tài khoản Crazyrouter dùng làm API Key được không?

Không được. Mật khẩu để đăng nhập web, API Key phải tạo riêng trong console. Hạn hiệu lực, hạn mức và giới hạn model cũng phải kiểm tra riêng.

5. Base URL của Claude Code có cần thêm /v1 không?

Cấu hình bài này điền root address https://cn.crazyrouter.com, không điền /v1 hay /v1/messages vào. Claude Code tự ghép, điểm này ngược với client tương thích OpenAI, đừng bê nguyên xi.

6. Tại sao dùng ANTHROPIC_AUTH_TOKEN, không phải ANTHROPIC_API_KEY?

Hai biến gửi header khác nhau (Authorization: Bearer so với x-api-key). Điền ANTHROPIC_API_KEY sẽ đi logic xác thực chính chủ, ANTHROPIC_BASE_URL kéo không được nó, kết quả là cấu hình nhìn đúng, request vẫn đánh domain chính chủ, tiếp tục 403.

7. Tại sao JSON không thể dán thẳng vào PowerShell?

PowerShell thực thi lệnh, JSON là nội dung file. Dán vào sẽ ra ParserError, chỉ vào dấu hai chấm báo UnexpectedToken — không phải cấu hình sai, mà là vị trí sai.

8. 403 và ConnectionRefused khác gì?

403 là request đã đến server và bị từ chối; ConnectionRefused là giai đoạn kết nối đã thất bại, thường tra phần mềm proxy và lắng nghe port trước, đừng coi là lỗi Key.

9. Sau khi lưu cấu hình có cần restart máy không?

Thông thường thoát và khởi động lại Claude Code là đủ; khi sửa PATH hoặc biến môi trường user Windows thì mở lại terminal. Không cần thiết đưa restart máy thành bước đầu.

10. Nhận một OK là ổn định lâu dài chưa?

Chưa. Một câu trả lời hoàn chỉnh chỉ chứng minh request tối thiểu lần đó thành công, không đại diện ổn định lâu dài, toàn bộ model khả dụng. Giá cũng vậy, lấy theo log gọi của chính bạn.


Lời kết

Lần đầu cài Claude Code, hãy bẻ mục tiêu thành vài lần nghiệm thu rõ ràng:

Version bình thường → tài khoản và Key Crazyrouter sẵn sàng → JSON parse được → chọn được model phù hợp → nhận câu trả lời hoàn chỉnh → log backend khớp.

Bước trước chưa qua thì dừng ở bước đó xử lý:

  • Version đã bình thường, đừng vì 403 mà cài lại npm nhiều lần;
  • Kết nối bị từ chối, xem host và port trong lỗi trước;
  • Request vẫn đánh domain chính chủ, quay lại tra biến xác thực và độ ưu tiên cấu hình;
  • Chưa có câu trả lời model, đừng gọi "vào giao diện chính" là chạy được.

Chạy xong câu hỏi tối thiểu, rồi bắt đầu từ một file nhỏ, một task nhỏ. Biết mỗi bước đang xác thực điều gì còn hữu dụng hơn việc copy một chuỗi lệnh dài không hiểu, lần sau gặp vấn đề bạn tự định vị được.

Tài liệu tham khảo

Tuyên bố miễn trách nhiệm: Bài viết này là chia sẻ kinh nghiệm cá nhân, không phải tài liệu chính thức. Các dịch vụ bên thứ ba, tên mô hình, giá cả và mô hình khả dụng có thể thay đổi bất cứ lúc nào — vui lòng xác minh trên trang chính thức và bảng điều khiển của bạn. Endpoint API và đường dẫn cấu hình nên tuân theo tài liệu chính thức tại thời điểm bạn tra cứu. Bài viết không chứa nội dung liên kết, hoa hồng hay tài trợ.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí