Tài liệu
Pi
Pi — tác nhân lập trình trên terminal của Earendil, không phải chatbot Inflection hay đồng tiền — nhận nhà cung cấp tùy chỉnh dưới dạng một khối trong models.json: gồm baseUrl, api, key và các model id bạn muốn dùng. Chỉ cần bốn trường là có thể dùng Claude và GPT thông qua một khóa.
Một khối nhà cung cấp tùy chỉnh trong ~/.pi/agent/models.json — baseUrl, api và các model id — đưa agent lập trình terminal Pi của Earendil chạy Claude và GPT qua một key.
{
"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
}
]
}
}
}/v1 khi dùng nhà cung cấp openai-completions. Ví dụ về endpoint tương thích trên trang model của Pi ghép giá trị đó với http://localhost:11434/v1, và trước khi tài liệu được viết lại vào ngày 22 tháng 9, các ví dụ OpenRouter, Vercel AI Gateway và llama.cpp của Pi cũng có cùng đường dẫn phiên bản. Không có câu nào nêu rõ quy tắc này, nên chính các ví dụ là căn cứ để xác định. Base URL thiếu hậu tố sẽ dẫn đến 404, chứ không phải lỗi xác thực.cost của model tùy chỉnh là toàn số 0 — giá trị mặc định này nằm trong mã nguồn Pi (v0.99.2), nhưng tài liệu hiện không còn ghi rõ — vì vậy nhà cung cấp bạn vừa thêm sẽ hiển thị $0 ở chân trang và trong /session cho đến khi bạn tự nhập đơn giá. Hai giá trị mặc định âm thầm tiếp theo còn gây ảnh hưởng lớn hơn: contextWindow sẽ dùng 128000, còn maxTokens sẽ dùng 16384, nên model bạn để trống sẽ bị nén và cắt ngắn rất xa so với dung lượng thực tế mà nó có thể xử lý. Khối cấu hình phía trên đặt cả hai giá trị theo danh mục; hãy làm tương tự với mọi id bạn thêm từ bảng bên dưới.--api-key trong lúc chạy trước, sau đó là thông tin xác thực auth.json đã lưu, một apiKey từ models.json, và cuối cùng là các biến môi trường của nhà cung cấp”. Vì vậy, khóa cũ được lưu qua /login sẽ được ưu tiên hơn khóa trong tệp của bạn; đây thường là lý do khối cấu hình vừa chỉnh sửa vẫn xác thực bằng một khóa khác. Cùng trang đó cũng cho biết model tùy chỉnh “có thể được tải từ models.json nhưng vẫn không khả dụng trong /model cho đến khi Pi phân giải được thông tin xác thực” — model không xuất hiện trong bộ chọn là lỗi thông tin xác thực, không phải lỗi cú pháp.api — được đối chiếu với mã nguồn Pi ở phiên bản v0.99.2 cùng ngày. Kunavo chưa chạy Pi với endpoint của mình — chưa chạy phiên nào, lượt nào có truyền phát, vòng gọi công cụ nào, cũng chưa kiểm tra yêu cầu được định tuyến đến mô hình nào. Trang hướng dẫn thiết lập đã công bố là tài liệu tham khảo cấu hình, không phải bài kiểm tra khả năng tương thích; đừng xem nội dung ở đây là bài kiểm tra như vậy. Phần curl bên dưới là điều bạn có thể xác nhận trong mười giây; hành vi của client thì bạn và Pi cần tự kiểm tra.sk-kn-) và nạp tín dụng từ $10 — các lệnh gọi được thanh toán từ số dư đó và các lệnh gọi thất bại không bị tính phí. Sau đó, bảng điều khiển mở tại phần thiết lập Pi.Từng bước
- Tạo khóa tại
/app/keysrồi sao chép khóa — khóa chỉ hiển thị một lần. - Đặt biến này trong môi trường dưới tên
KUNAVO_API_KEY. Trong trườngapiKey, Pi phân giải"$NAME"hoặc"${NAME}", cũng như giá trị cố định hoặc tiền tố!command. Dùng dạng có dấu ngoặc nhọn khi sau tên biến còn có văn bản cố định. - Tạo hoặc chỉnh sửa
~/.pi/agent/models.jsonrồi dán khối bên trên. Nhà cung cấp không tích hợp sẵn cần cóbaseUrlvà giá trịapiở cấp nhà cung cấp hoặc mô hình — mã nguồn Pi từ chối tải mô hình nếu thiếu các giá trị này — còn mọi thứ khác đều không bắt buộc. Mở/modelđể tải lại tệp. - Khởi động
pi, chạy/modelrồi chọn một trong các ID bạn đã khai báo. Nếu chúng không xuất hiện trong danh sách, hãy kiểm tra khóa trước khi kiểm tra JSON — xem ghi chú về thứ tự phân giải ở trên. - Giao cho ứng dụng một tác vụ đọc và chỉnh sửa một tệp thực. Pi dựa vào việc gọi công cụ trong gần như mọi thao tác, vì vậy lần chạy đầu tiên có truy cập hệ thống tệp sẽ cho bạn biết nhiều hơn một lời chào — đồng thời có thể làm lộ ra điểm không tương thích khi truyền phát hoặc trong lược đồ công cụ, chính là loại vấn đề Kunavo chưa kiểm tra giúp bạn.
Đã kiểm tra đối chiếu với Tài liệu Choose a Model của Pi vào 1 tháng 10, 2026. Cài đặt của bên thứ ba có thể thay đổi; nếu tên trường ở đây không còn khớp với những gì bạn thấy, trang đó là nguồn có thẩm quyền, không phải trang này.
Xác minh trước khi gỡ lỗi ứng dụng khách
Một yêu cầu sẽ xác định liệu lỗi nằm ở endpoint, khóa hay tệp cấu hình. Nếu lệnh này trả về JSON, cùng base URL và khóa sẽ hoạt động trong Pi.
# Settles whether a failure is the endpoint, the key, or the client.
curl -sS https://api.kunavo.com/v1/models \
-H "Authorization: Bearer sk-kn-..."Đặt model id nào vào trường
Mọi mô hình văn bản đều có thể truy cập bằng model id — danh sách đang hoạt động là GET /v1/models, còn danh mục kèm giá nằm trên trang mô hình. Mức giá tính bằng USD trên mỗi 1M token, đầu vào / đầu ra.
| ID mô hình | Kunavo vào / ra | Phù hợp ở đâu trong Pi |
|---|---|---|
claude-sonnet-5 | $1.40 / $7.00 | model làm việc mặc định cho các phiên chỉnh sửa tệp |
claude-opus-5 | $3.50 / $17.50 | lập kế hoạch thay đổi mà nếu sai sẽ tốn kém để sửa |
claude-haiku-4-5 | $0.70 / $3.50 | các lượt xử lý giá rẻ — phân loại, tóm tắt, vòng lặp chạy cả ngày |
gpt-5-6-sol | $2.00 / $12.00 | ý kiến thứ hai từ một họ mô hình khác, cùng khóa và cùng baseUrl |
Lựa chọn khác: anthropic-messages
Trước lần cập nhật tài liệu ngày 22 tháng 9 năm 2026, Pi ghi lại bốn giá trị cho api của nhà cung cấp tùy chỉnh — openai-completions, openai-responses, anthropic-messages và google-generative-ai. Trang mô hình sau khi cập nhật không liệt kê giá trị nào: trang này đưa ra ví dụ có openai-completions và mô tả trường hợp đó là “Endpoint tương thích với OpenAI, Anthropic hoặc Google”. Mã nguồn Pi phiên bản v0.99.2 định kiểu trường này là chuỗi tự do và chuyển xử lý đến một trong mười phần triển khai tích hợp sẵn tương ứng — bốn giá trị trên cùng với openai-codex-responses, azure-openai-responses, google-vertex, mistral-conversations, bedrock-converse-stream và pi-messages. Chỉ bốn giá trị đầu từng được ghi trong tài liệu dành cho nhà cung cấp tùy chỉnh; sáu giá trị còn lại chưa được kiểm tra ở đây. Trang này không khẳng định giá trị nào trong số đó hoạt động với endpoint bên thứ ba.
anthropic-messages là một trong bốn giá trị được ghi trong tài liệu, và Kunavo hỗ trợ giao diện Anthropic Messages cũng như giao diện tương thích OpenAI. Vì vậy, có thể khai báo tuyến này. Trang này sẽ không ghi sẵn base URL cho tuyến đó trong khối cấu hình để bạn dán vào: tài liệu Pi chưa bao giờ xác định rõ trường này cho api này. Trước ngày 22 tháng 9, tài liệu đưa ra hai cách — https://proxy.example.com/v1 trong một ví dụ và https://proxy.example.com không có hậu tố /v1 trong ví dụ khác — còn bản cập nhật hôm đó loại bỏ cả hai mà không chọn cách nào. Nếu chọn tuyến này, hãy thử một cách; nếu lệnh gọi đầu tiên trả về 404 thay vì 401, hãy sửa dòng đó.
Có ba trường trong lược đồ compat của Pi dành cho api này đáng lưu ý trước khi dùng (mã nguồn phiên bản v0.99.2). Trước hết, cần trích dẫn quy tắc duy nhất trong tài liệu áp dụng cho cả ba: các thiết lập tương thích “nên mô tả những khác biệt đã được xác minh trong cách endpoint xử lý yêu cầu hoặc phản hồi. Không bật chúng chỉ vì endpoint quảng bá khả năng tương thích với OpenAI hoặc Anthropic.”
compat.supportsEagerToolInputStreaming— dành cho backend từ chối truyền dữ liệu đầu vào từng công cụ ngay từ đầu.compat.supportsStrictTools— endpoint có chấp nhận định nghĩa công cụ theo JSON Schema nghiêm ngặt hay không; mô hình tùy chỉnh không kế thừa thiết lập do mô hình Anthropic tích hợp sẵn khai báo.compat.supportsMidConvoEffort— thay đổi mức độ suy luận giữa cuộc trò chuyện. Việc endpoint này có đáp ứng điều kiện hay không là vấn đề cần kiểm tra khi chạy thực tế; Kunavo chưa xác minh điều đó bằng cách chạy thử.
Khối openai-completions ở đầu trang này không dùng đến cả ba thiết lập trên; đó là lý do chính đáng để bắt đầu từ khối này, chứ không phải khẳng định rằng khối này hoạt động tốt hơn.
Câu hỏi thường gặp
Làm cách nào để trỏ tác nhân lập trình Pi đến nhà cung cấp API tùy chỉnh?
Thêm một khối nhà cung cấp vào ~/.pi/agent/models.json. Trang mô hình của Pi hướng dẫn dùng models.json “khi endpoint cung cấp API mà Pi đã hỗ trợ”; lược đồ của Pi (mã nguồn phiên bản v0.99.2) chấp nhận baseUrl, apiKey, api, headers, authHeader, models và modelOverrides ở cấp nhà cung cấp. Nhà cung cấp không tích hợp sẵn cần có baseUrl và giá trị api ở cấp nhà cung cấp hoặc mô hình. Lược đồ định kiểu api là một chuỗi tự do, không phải danh sách: trước lần cập nhật tài liệu ngày 22 tháng 9 năm 2026, Pi ghi lại bốn giá trị dành cho nhà cung cấp tùy chỉnh — openai-completions, openai-responses, anthropic-messages và google-generative-ai — còn mã nguồn phiên bản v0.99.2 chuyển xử lý trường này đến bất kỳ phần triển khai nào trong số mười phần tích hợp sẵn; sáu phần còn lại chưa từng được ghi trong tài liệu cho mục đích này và chưa được kiểm tra ở đây. Với endpoint tương thích OpenAI, openai-completions là giá trị vẫn xuất hiện trong tài liệu sau cập nhật. Mỗi mục trong models cần có ít nhất một id; id này được gửi nguyên vẹn đến endpoint. Do đó, cùng một cấu trúc dùng được cho gateway, máy chủ Ollama hoặc vLLM chạy cục bộ, cũng như mọi máy chủ tương thích khác.
Tác nhân lập trình Pi lấy khóa API ở đâu?
Pi lấy khóa từ một trong bốn nơi theo thứ tự được công bố trên trang mô hình: trước tiên là --api-key lúc chạy, tiếp theo là thông tin xác thực lưu trong auth.json, rồi đến apiKey trong models.json, cuối cùng là các biến môi trường của nhà cung cấp. Vì vậy, khóa đã lưu trước đó bằng /login sẽ được ưu tiên hơn khóa bạn vừa sửa trong models.json. Trường apiKey hỗ trợ nội suy biến môi trường — "$NAME" hoặc "${NAME}" — giá trị cố định, hoặc đầu ra của lệnh shell có tiền tố "!"; do đó, không cần lưu bí mật trong tệp. Theo tài liệu, nếu không có thông tin xác thực dùng được thì mô hình tùy chỉnh vẫn được tải từ models.json nhưng không khả dụng trong /model.
baseUrl của Pi có cần kết thúc bằng /v1 không?
Với nhà cung cấp openai-completions thì có. Tài liệu Pi không nêu quy tắc này thành câu, nhưng ví dụ endpoint tương thích dùng http://localhost:11434/v1 cho Ollama; trước lần cập nhật tài liệu ngày 22 tháng 9 năm 2026, các ví dụ về OpenRouter, Vercel AI Gateway và llama.cpp cũng dùng cùng đường dẫn phiên bản. Vì vậy, với endpoint tương thích OpenAI, hãy dùng đường dẫn gốc /v1, chẳng hạn https://api.kunavo.com/v1. Trường hợp anthropic-messages vẫn chưa được xác định rõ: tài liệu cũ đưa ra ví dụ có và không có /v1; bản cập nhật đã xóa cả hai mà không chọn cách nào.
Vì sao Pi hiển thị $0 ở chân trang cho nhà cung cấp tùy chỉnh của tôi?
Vì đối tượng chi phí của mô hình tùy chỉnh mặc định toàn bộ giá trị bằng không trong Pi (mã nguồn phiên bản v0.99.2); chân trang hiển thị thông tin trong danh mục chứ không phải khoản phí endpoint thu. Không có gì là miễn phí; con số này đơn giản là chưa có nguồn dữ liệu cho đến khi bạn điền mức giá trên mỗi triệu token đầu vào, đầu ra, cacheRead và cacheWrite, cùng mọi mức giá theo bậc, dựa trên bảng giá của nhà cung cấp. Khi đang chỉnh sửa tệp, hãy lưu ý hai giá trị mặc định liền kề cũng cần được xử lý tương tự: contextWindow mặc định là 128000 và maxTokens là 16384, nên mô hình có cửa sổ ngữ cảnh lớn hơn sẽ bị nén sớm và câu trả lời bị cắt ngắn nếu không đặt rõ cả hai giá trị này.
Kunavo đã kiểm tra tác nhân lập trình Pi chưa?
Chưa. Cấu hình trên trang này được đọc từ tài liệu của chính Pi và, với những chi tiết bị lược bỏ trong lần cập nhật tài liệu ngày 22 tháng 9, từ mã nguồn đã phát hành của Pi; việc đọc này được thực hiện vào ngày được ghi trên trang. Tuy nhiên, chưa chạy phiên, lượt truyền phát, vòng gọi công cụ hay kiểm tra định tuyến mô hình nào với endpoint này bằng client này — và điều tương tự cũng đúng với mọi client trong phần này. Hãy xem khối thiết lập như tài liệu tham khảo về những gì lược đồ Pi chấp nhận, xác minh endpoint và khóa bằng lệnh curl ở trên, và giữ sẵn một tuyến đang hoạt động trong khi thử.