Cấu hình mô hình của Pi coding agent có ba lớp: provider tích hợp dùng /login để đăng nhập (gói đăng ký hoặc khóa API) hoặc đặt biến môi trường; endpoint không tích hợp trong Pi nhưng tương thích với API OpenAI/Anthropic/Google được ghi vào ~/.pi/agent/models.json; chỉ dịch vụ cần xác thực hoặc giao thức đặc biệt mới cần tiện ích mở rộng. Sau khi chọn, dùng /model để chuyển đổi.Bài viết này dựa trên tài liệu Pi sau lần sửa ngày 22 tháng 9 năm 2026 và mã nguồn v0.99.2 phát hành ngày 30 tháng 9 năm 2026, giải thích cách cấu hình từng lớp, thứ tự đọc khóa (đã thay đổi sau lần sửa), ba giá trị mặc định của mô hình tùy chỉnh có thể âm thầm gây lỗi và ví dụ đầy đủ để kết nối endpoint tương thích OpenAI.
Trước hết hãy xác nhận bạn đang dùng Pi nào. Trang này nói về tác nhân lập trình terminal do công ty Earendil phát hành tại pi.dev, thư viện là earendil-works/pi (trước đây là badlogic/pi-mono), cấp phép MIT. Đây không phải chatbot Pi của Inflection (pi.ai), đồng Pi Network, Raspberry Pi hay Oh My Pi của một tác giả khác.
Trước tiên chọn cách kết nối
Ngay phần đầu của tài liệu mô hình Pi đã có bảng đối chiếu này:
| Bạn đang có | Cách nên làm |
|---|---|
| Gói đăng ký được hỗ trợ | Đăng nhập bằng /login |
| Khóa API của một provider | Lưu bằng /login hoặc đặt biến môi trường của provider đó |
| Mô hình GGUF cục bộ | Kết nối llama.cpp router (quản lý bằng /llama) |
| Endpoint tương thích với OpenAI, Anthropic hoặc Google | Ghi vào models.json |
| Provider có giao thức hoặc quy trình xác thực tùy chỉnh | Viết hoặc cài đặt provider extension |
Pi có một danh mục mô hình tích hợp và có thể bổ sung dữ liệu danh mục mới hơn từ pi.dev; khi ngoại tuyến, nó sử dụng bộ nhớ đệm, còn để buộc cập nhật có thể chạy pi update --models. Chỉ cần cấu hình mô hình tùy chỉnh khi Pi không có provider hoặc endpoint bạn cần.
Chọn mô hình trong Pi
/model: tìm kiếm và chọn mô hình. Chỉ liệt kê các mô hình thuộc provider đã có thông tin xác thực khả dụng.- Nhấn Ctrl+S trên mô hình: lưu làm mô hình mặc định của phiên làm việc mới.
/thinking: chọn mức độ suy nghĩ của mô hình hiện tại; Pi chỉ liệt kê các mức mà mô hình đó hỗ trợ. Cũng nhấn Ctrl+S để lưu làm mặc định khi khởi động.- Ctrl+P: luân phiên giữa các mô hình khả dụng;
/scoped-modelskiểm soát danh sách luân phiên và lưu lại.
Phiên làm việc ghi lại các thay đổi về mô hình và mức độ suy nghĩ; khi khôi phục phiên, các thay đổi này được khôi phục theo, nhưng không thay đổi mặc định của phiên mới.
Thứ tự đọc khóa (đã thay đổi sau lần sửa)
Khi đồng thời cấu hình nhiều nguồn khóa, tài liệu Pi ghi thứ tự là: --api-key trong thời gian chạy → thông tin xác thực lưu trong auth.json → apiKey trong models.json → biến môi trường của provider (hoặc thông tin xác thực môi trường của nền tảng đám mây). Vì vậy, khóa cũ đã lưu bằng /login sẽ ghi đè khóa bạn vừa ghi vào tệp; đây là nguyên nhân phổ biến nhất của tình trạng “đã thay đổi cấu hình nhưng vẫn dùng tài khoản cũ”. /logout có thể xóa thông tin xác thực đã lưu. Lưu ý: trước lần sửa ngày 22 tháng 9, tài liệu ghi biến môi trường đứng trước models.json, nên các hướng dẫn cũ trên mạng có thể vẫn dùng thứ tự cũ.
Một hiểu lầm phổ biến khác: mô hình không xuất hiện trong /model phần lớn là vấn đề xác thực chứ không phải JSON viết sai. Tài liệu nói mô hình tùy chỉnh có thể được tải từ models.json, nhưng trước khi Pi phân giải được thông tin xác thực, mô hình sẽ luôn ở trạng thái “không khả dụng”.
models.json: ví dụ đầy đủ để kết nối endpoint tương thích OpenAI
Ví dụ của Pi là Ollama cục bộ — khóa giả chỉ làm cho mô hình trở nên khả dụng; bản thân Ollama không kiểm tra khóa đó:
{
"providers": {
"ollama": {
"baseUrl": "http://localhost:11434/v1",
"api": "openai-completions",
"apiKey": "ollama",
"models": [{ "id": "qwen2.5-coder:7b" }]
}
}
}Để kết nối một endpoint yêu cầu xác thực, chẳng hạn Kunavo, hãy viết như sau:
{
"providers": {
"kunavo": {
"baseUrl": "https://api.kunavo.com/v1",
"api": "openai-completions",
"apiKey": "$KUNAVO_API_KEY",
"models": [
{
"id": "claude-sonnet-5",
"name": "Claude Sonnet 5",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 1000000,
"maxTokens": 128000
},
{
"id": "claude-haiku-4-5",
"name": "Claude Haiku 4.5",
"input": ["text", "image"],
"contextWindow": 200000,
"maxTokens": 64000
}
]
}
}
}baseUrlvàapilà bắt buộc.Có thể viết chúng ở cấp provider hoặc cấp mô hình; theo mã nguồn v0.99.2, nếu thiếu một trong hai, Pi sẽ không tải mô hình đó.apikhông phải lựa chọn một trong bốn.Trước lần sửa ngày 22 tháng 9, tài liệu Pi liệt kê bốn giá trị cho provider tùy chỉnh:openai-completions,openai-responses,anthropic-messages,google-generative-ai. Sau lần sửa, tài liệu không còn liệt kê danh sách, chỉ ghi “endpoint tương thích với OpenAI, Anthropic hoặc Google” trong bảng đối chiếu ở trên và ví dụ cũng chỉ dùngopenai-completions. Mã nguồn v0.99.2 định nghĩaapilà chuỗi tùy ý và chuyển cho một trong mười triển khai tích hợp tương ứng xử lý — bốn giá trị nêu trên, cộng vớiopenai-codex-responses,azure-openai-responses,google-vertex,mistral-conversations,bedrock-converse-stream,pi-messages. Chỉ bốn giá trị đầu từng được tài liệu hóa như cách dùng cho provider tùy chỉnh; sáu giá trị còn lại chưa được kiểm thử ở đây và trang này cũng không khẳng định chúng có thể kết nối endpoint bên thứ ba.baseUrlcủaopenai-completionsphải có/v1.Tài liệu không quy định điều này trong một câu duy nhất, nhưng tất cả ví dụ endpoint tương thích đều có đường dẫn phiên bản. Thiếu/v1sẽ nhận 404, không phải lỗi xác thực.- Đừng ghi cứng khóa.
apiKeyvà giá trị header có thể viết$NAMEhoặc${NAME}để tham chiếu biến môi trường, viết trực tiếp một giá trị hoặc dùng!指令để lấy giá trị; tài liệu nói lệnh trongmodels.jsonđược chạy mỗi lần yêu cầu và không được lưu vào bộ nhớ đệm. Hãy giữ bí mậtauth.jsonvà mọi lệnh lấy khóa. - Sửa xong không cần khởi động lại.Khi mở
/model, tệp sẽ được đọc lại. Các mục có cùng ID trongmodelssẽ thêm hoặc thay thế mô hình của provider đó; nếu muốn sửa metadata của mô hình tích hợp mà không thay thế toàn bộ danh sách, hãy dùngmodelOverrides.
Ba giá trị mặc định có thể âm thầm gây lỗi
Lần sửa tài liệu ngày 22 tháng 9 đã xóa bảng trường, nhưng các giá trị mặc định vẫn có trong mã nguồn (v0.99.2 của provider-composer.ts). Nếu không điền, mô hình tùy chỉnh sẽ áp dụng:
| Trường | Mặc định khi bỏ trống | Hậu quả |
|---|---|---|
cost | input, output, cacheRead, cacheWrite đều bằng 0 | Chi phí ở cuối và trong /session luôn hiển thị $0, không có nghĩa là miễn phí mà chỉ là chưa có nguồn giá |
contextWindow | 128000 | Mô hình có ngữ cảnh lớn hơn bị nén quá sớm |
maxTokens | 16384 | Câu trả lời dài bị cắt ngắn |
Ngoài ra, reasoning mặc định là false và input mặc định chỉ có văn bản. Ví dụ Kunavo ở trên đã điền context và giới hạn đầu ra theo bảng giá, không đặt cost, vì ghi cứng giá trong tệp sẽ nhanh chóng lỗi thời — nếu muốn chi phí hiển thị ở cuối, hãy tự điền giá mỗi triệu token theo bảng giá. Pi cũng hỗ trợ promptCache (khai báo thời gian tồn tại của bộ nhớ đệm nhà cung cấp theo giây, dùng để làm nóng bộ nhớ đệm); tài liệu khuyến nghị chọn đầu bảo thủ trong phạm vi công khai.
anthropic-messages: có thể kết nối, nhưng baseUrl chưa có kết luận
anthropic-messages là một trong bốn giá trị mà tài liệu trước lần sửa liệt kê cho provider tùy chỉnh; Kunavo cũng cung cấp giao diện Anthropic Messages, nên tuyến api: "anthropic-messages" này tồn tại. Tuy nhiên, tài liệu Pi chưa bao giờ nói rõ baseUrl của loại này có cần có /v1 hay không: trước lần sửa, một ví dụ ghi https://proxy.example.com/v1, ví dụ khác dùng https://proxy.example.com không có đường dẫn; sau lần sửa, cả hai ví dụ đều bị xóa và vẫn không có kết luận. Nếu đi theo tuyến này, trước tiên hãy thử một cách; nếu yêu cầu đầu tiên trả về 404 (không phải 401), hãy sửa dòng này. Trong compat cũng có một số công tắc được thiết kế riêng cho endpoint không chính thức (chẳng hạn supportsEagerToolInputStreaming, supportsStrictTools), nhưng tài liệu nhắc rằng cấu hình tương thích nên mô tả “khác biệt hành vi đã được xác minh”, không nên bật chỉ vì endpoint tuyên bố tương thích với OpenAI hoặc Anthropic. Ví dụ openai-completions ở trên tránh được các vấn đề này; đó mới là lý do thực sự nên bắt đầu từ ví dụ này, không phải vì nó nhanh hơn.
Minh bạch và thanh toán
Nói rõ trước: đây là tài liệu tham khảo về cấu hình được tổng hợp từ tài liệu và mã nguồn của Pi, Kunavo chưa thực sự chạy endpoint của mình bằng Pi — chưa chạy phiên làm việc, chế độ streaming hay vòng lặp công cụ, cũng chưa xác nhận cuối cùng yêu cầu được định tuyến đến model nào. Hãy giữ lại tuyến bạn hiện có thể sử dụng và giao cho Pi một nhiệm vụ đọc/ghi tệp thực tế để thử; Pi phụ thuộc vào lệnh gọi công cụ ở hầu hết mọi bước, nên lần chạy đầu tiên như vậy sẽ dễ phát hiện nhất các vấn đề không tương thích về streaming hoặc định dạng công cụ. Trang cấu hình đầy đủ bằng tiếng Anh có tại Pi integration guide; phần so sánh các tuyến tính phí khác nhau (bao gồm gateway Radius của chính Earendil) xem tại Pi coding agent pricing.
Kunavo là dịch vụ nạp tiền trả trước, tính phí theo token và không có phí hàng tháng. Mức nạp tối thiểu là $10; thanh toán qua Stripe, tại Đài Loan có thể dùng thẻ tín dụng (Visa, Mastercard, American Express, JCB, UnionPay), Apple Pay, Google Pay và Link; JKoPay và LINE Pay không có trong danh sách được hỗ trợ. Xem Hướng dẫn thanh toán, sau đó bạn có thể tạo tài khoản và tạo khóa.
Câu hỏi thường gặp
Làm thế nào để đổi mô hình trong Pi coding agent?
Trong Pi, nhập /model để tìm kiếm và chọn mô hình khả dụng; nhấn Ctrl+S trên một mô hình để lưu mô hình đó làm mặc định cho phiên làm việc mới, /thinking để chọn mức độ suy nghĩ (cũng dùng Ctrl+S để lưu làm mặc định khi khởi động), Ctrl+P để luân phiên giữa các mô hình khả dụng và /scoped-models để kiểm soát phạm vi luân phiên. Menu chỉ liệt kê các mô hình thuộc provider đã có thông tin xác thực khả dụng; phiên làm việc ghi lại lịch sử đổi mô hình và sẽ khôi phục lịch sử đó khi tiếp tục, nhưng không thay đổi mặc định của phiên mới.
Làm thế nào để kết nối Pi với endpoint API tùy chỉnh?
Với provider tích hợp, chỉ cần dùng /login hoặc biến môi trường; nếu Pi không tích hợp endpoint nhưng endpoint sử dụng API mà Pi hỗ trợ (tương thích OpenAI, Anthropic hoặc Google), hãy thêm một block provider vào ~/.pi/agent/models.json gồm baseUrl, api, apiKey và danh sách models. Nếu thiếu baseUrl hoặc api, mã nguồn Pi sẽ không tải mô hình đó. api không phải là một danh sách lựa chọn cố định: trước lần sửa tài liệu ngày 22 tháng 9 năm 2026, Pi ghi rõ bốn giá trị cho provider tùy chỉnh (openai-completions, openai-responses, anthropic-messages, google-generative-ai); sau lần sửa, tài liệu không còn liệt kê danh sách này. Mã nguồn v0.99.2 định nghĩa api là một chuỗi tùy ý và chuyển cho một trong mười triển khai tích hợp tương ứng xử lý; sáu giá trị còn lại chưa từng được tài liệu hóa như cách dùng cho provider tùy chỉnh và cũng chưa được kiểm thử ở đây. Khi kết nối endpoint tương thích OpenAI, hãy điền openai-completions, giá trị vẫn được dùng trong ví dụ của tài liệu sau lần sửa. Chỉ cần viết provider extension khi dịch vụ yêu cầu truyền dữ liệu dạng luồng tùy chỉnh, khám phá mô hình hoặc quy trình xác thực đặc biệt.
Pi đọc khóa API từ đâu? Thứ tự là gì?
Tài liệu mô hình Pi (ngày 1 tháng 10 năm 2026) nêu thứ tự như sau: --api-key trong thời gian chạy có ưu tiên cao nhất, tiếp theo là thông tin xác thực được lưu trong auth.json (đây là nơi /login lưu), rồi đến apiKey trong models.json, cuối cùng mới là biến môi trường của provider. Vì vậy, khóa cũ từng được lưu bằng /login sẽ ghi đè khóa bạn vừa thêm vào models.json. Trường apiKey có thể viết $NAME hoặc ${NAME} để tham chiếu biến môi trường, viết trực tiếp một giá trị hoặc bắt đầu bằng ! để chạy lệnh lấy giá trị. Lưu ý: trước lần sửa tài liệu ngày 22 tháng 9 năm 2026, thứ tự này khác (biến môi trường đứng trước models.json), nên các hướng dẫn cũ có thể vẫn ghi thứ tự cũ.
Tại sao mô hình tôi tự thêm lại hiển thị $0 ở cuối Pi?
Vì mặc định cost của mô hình tùy chỉnh đều là 0 (theo mã nguồn v0.99.2); chi phí hiển thị ở cuối và trong /session là giá trong tệp cấu hình, không phải số tiền endpoint thực sự thu. Không phải dịch vụ miễn phí, mà là chưa có nguồn giá; hãy điền input, output, cacheRead và cacheWrite cho mỗi triệu token theo bảng giá của nhà cung cấp. Đồng thời điền contextWindow và maxTokens: khi bỏ trống, giá trị mặc định lần lượt là 128000 và 16384, khiến mô hình có ngữ cảnh lớn bị nén quá sớm và câu trả lời bị cắt ngắn.
baseUrl của Pi có cần thêm /v1 không?
Với loại openai-completions thì cần thêm. Tài liệu Pi không nêu quy tắc này trong một câu duy nhất, nhưng ví dụ endpoint tương thích của nó là Ollama tại http://localhost:11434/v1; các ví dụ OpenRouter, Vercel AI Gateway và llama.cpp trước lần sửa cũng đều có đường dẫn phiên bản. Vì vậy, với endpoint tương thích OpenAI, hãy điền gốc /v1, chẳng hạn https://api.kunavo.com/v1. Với loại anthropic-messages thì chưa có kết luận: trước lần sửa, một chỗ trong tài liệu ghi /v1 và một chỗ không ghi; sau lần sửa, cả hai ví dụ đều bị xóa, nhưng tài liệu vẫn không giải thích cách nào đúng.
Đã xác minh ngày 1 tháng 10 năm 2026: các trang pi.dev/docs/latest/models (Choose a Model) và providers; src/core/model-config.ts và provider-composer.ts trong tag v0.99.2 của earendil-works/pi; cùng thông tin phiên bản từ GitHub API. Cũng trong ngày đó, đã xác minh riêng trường api: các giá trị hiện được liệt kê trên trang models (chỉ có openai-completions trong ví dụ Ollama), kiểu của api trong model-config.ts của v0.99.2 (chuỗi tùy ý, dòng 191 và 233), cách provider-composer.ts phân phối model tùy chỉnh (dòng 579), và BUILTIN_APIS trong packages/ai/src/compat.ts (dòng 180, tổng cộng mười loại). Kunavo chưa thực sự chạy endpoint của mình bằng Pi.