POST/v1/chat
Nhận câu trả lời của trợ lý qua luồng (SSE)
chat
Khi có nhiều bản sao API phía sau bộ cân bằng tải (địa chỉ api.<domain>, 1.62.0), câu trả lời và bộ đệm sự kiện của nó nằm trong bộ nhớ của bản sao đang tạo ra câu trả lời đó. Tiếp tục luồng bằng Last-Event-ID chỉ hoạt động trên bản sao đó.
Yêu cầu lặp lại với cùng request_id và cùng cuộc trò chuyện, nếu đến một bản sao khác sau khi câu trả lời đã hoàn tất, sẽ nhận câu trả lời đã lưu (token và done, sự kiện đánh số từ 1) mà không đặt lại câu hỏi. Yêu cầu lặp lại đến một bản sao khác trong khi câu trả lời vẫn đang được tạo sẽ dừng lần tạo đó và tạo câu trả lời từ đầu; cũng không có câu hỏi thứ hai nào được tạo. Để tiếp tục luồng mà không tạo lại câu trả lời, hãy giữ kết nối tới cùng một bản sao hoặc lặp lại yêu cầu sau sự kiện done.
Xác thực
Gửi khóa API trong header Authorization: Authorization: Bearer <khóa>.
Tham số header
X-View-AsstringChỉ dành cho khóa API có vai trò
admin. Thực hiện yêu cầu với tư cách hồ sơ dữ liệu<profile>[:viewer|verifier|editor], ví dụemployee:viewer. Khóa cài đặt không thể dùng header này (403).
Tham số cookie
kb_view_asstringCookie của chế độ “View as” cho một phiên.
POST /auth/view-asđặt cookie này, cònDELETE /auth/view-asxóa nó.
Phần thân yêu cầu
application/json
items ≥ 1
collectionstringMặc định: "default"
tagsarray of string | nullexportstring | nullcard_idsarray of string | nullitems ≤ 50
streambooleanMặc định: false
conversation_idstring | nulllength ≤ 64
originstring | nulltoolsboolean | nullbypass_cachebooleanKhông lấy câu trả lời từ bộ nhớ đệm câu trả lời (nút “Get a fresh answer” (Nhận câu trả lời mới) bên dưới câu trả lời lấy từ bộ nhớ đệm). Câu trả lời mới thay thế mục trong bộ nhớ đệm.
Mặc định: false
languagestring | nullNgôn ngữ trả lời: mã ISO 639-1 (
de,en,ru, …) để trả lời bằng ngôn ngữ đó. Vớiautohoặc khi không có trường này, ngôn ngữ được xác định theo câu hỏi. Giao diện truyền rõ ngôn ngữ của gợi ý viết bằng ngôn ngữ khác (Starter.language).scopeChatScope | nullPhạm vi câu hỏi: nhiều bộ sưu tập, một nguồn, nhãn và một khoảng thời gian. Các bộ sưu tập của phạm vi thay thế
collection. Nguồn thu hẹp câu trả lời trong bộ sưu tập của nguồn đó (và các thẻ của chính nguồn). Nhãn được thêm vàotags. Khoảng thời gian giới hạn câu trả lời tài chính trong khoảng đó. Bạn chỉ có thể chọn những gì người dùng nhìn thấy (bộ sưu tập:collections.no_access/collections.not_found; nguồn:sources.not_found). Vớiconversation_id, phạm vi được lưu trong cuộc trò chuyện. Khi không có trường này, phạm vi của cuộc trò chuyện được áp dụng;nullhoặc phạm vi trống sẽ xóa phạm vi đó.request_idstringKhóa idempotency của câu hỏi. Gửi cùng một khóa trong mọi lần thử lại luồng cho một câu hỏi (thử lại sau khi mất kết nối; ở đây
Last-Event-IDkhông tiếp tục luồng và chỉ được ghi vào nhật ký). Lần thử lại với khóa của câu trả lời đã được lưu không tạo câu hỏi thứ hai: kết quả đã lưu được gửi lại dưới dạng một sự kiệndone(và mộttokenchứa văn bản), ngay cả khi giới hạn câu hỏi hoặc tín dụng đã hết. Nếu câu trả lời trước vẫn đang được tạo cho một client đã mất kết nối, việc tạo đó dừng lại và câu trả lời được tạo lại từ đầu.length ≤ 64
version_ofinteger (int64)Tạo phiên bản mới cho lượt của câu hỏi này trong cuộc trò chuyện (
question_idtừ nguồn cấp): câu hỏi đã sửa (văn bản mới trongmessages), câu trả lời được tạo lại (cùng văn bản, thường kèmbypass_cache), hoặc cùng câu hỏi vớiqualitykhác (ví dụprecisesau một câu trả lờifast). Cặp câu hỏi và câu trả lời trước được giữ lại. Các lượt sau nó ở lại trong nhánh của nó và bị ẩn khỏi nguồn cấp trong khi phiên bản mới được chọn (FeedItem.versions,POST /v1/conversations/{conv_id}/versions). Lịch sử dùng cho câu trả lời là nhánh đã chọn tính đến lượt này.qualitycủa một phiên bản không thay đổi cài đặt của cuộc trò chuyện. Cần cóconversation_id; câu hỏi từ cuộc trò chuyện khác trả về404 questions.not_found.qualitystringCân bằng giữa tốc độ và độ chính xác của việc tìm kiếm tạo nên kết quả:
fastnhanh hơn,precisechính xác hơn. Mặc định:precise.Giá trị cho phép:
fastprecise
Phản hồi
200Với `stream=true`: `text/event-stream`. Mỗi sự kiện gồm các dòng `id: <number>` (số thứ tự của sự kiện trong luồng, bắt đầu từ 1) và `data: <JSON>`, tiếp theo là một dòng trống. Các trường `event:` và `retry:` không được dùng; loại sự kiện nằm trong trường `type` (`ChatEvent`).
Với stream=true: text/event-stream. Mỗi sự kiện gồm các dòng id: <number> (số thứ tự của sự kiện trong luồng, bắt đầu từ 1) và data: <JSON>, tiếp theo là một dòng trống. Các trường event: và retry: không được dùng; loại sự kiện nằm trong trường type (ChatEvent).
Câu hỏi có request_id được trả lời độc lập với kết nối. Mất kết nối không dừng câu trả lời: câu trả lời vẫn được hoàn tất và lưu vào cuộc trò chuyện (trong tối đa 10 phút). Lặp lại cùng yêu cầu (cùng request_id và cùng cuộc trò chuyện) sẽ gắn vào câu trả lời đang được tạo, và với header Last-Event-ID, yêu cầu nhận các sự kiện sau số đó, nên luồng tiếp tục với cùng số thứ tự sự kiện. Nếu luồng không thể tiếp tục từ số đó, yêu cầu lặp lại nhận luồng từ đầu: khi đó sự kiện đầu tiên có số không lớn hơn Last-Event-ID, và client bắt đầu lại câu trả lời. Nếu câu trả lời đã hoàn tất và bộ đệm sự kiện của nó đã được giải phóng (sau 3 phút), kết quả đã lưu được gửi lại (token và done, đánh số từ 1) mà không đặt lại câu hỏi; nếu không, câu trả lời được tạo lại từ đầu. Để dừng câu trả lời như vậy, hãy gọi POST /v1/chat/cancel. Khi không có request_id, việc client ngắt kết nối sẽ hủy câu trả lời.
Sau sự kiện đầu tiên, trong khi câu trả lời đang được tạo, máy chủ gửi chú thích : ping mỗi 15 giây; hãy bỏ qua nó. Thứ tự sự kiện: các sự kiện stage (tiến độ), meta, sources, data, sau đó là nội dung câu trả lời trong các sự kiện token, rồi done. Trước nội dung câu trả lời, sources và data có thể lặp lại và có thể xuất hiện sự kiện tool; nội dung có thể đến trong một token hoặc theo từng phần. Câu trả lời từ bộ nhớ đệm: meta (có cached), sources, data, token, done. Lỗi xảy ra sau khi luồng đã bắt đầu đến dưới dạng sự kiện error, và luồng đóng lại mà không có done; trạng thái HTTP của luồng luôn là 200. Sau done, có thể đến sự kiện followups với các câu hỏi tiếp theo được gợi ý. Hãy bỏ qua các loại sự kiện mà bạn không xử lý.
Với stream=false: application/json với phần thân AnswerResponse (kèm conversation_id).
Header phản hồi
RateLimit-PolicyCác giới hạn đang áp dụng, theo định dạng của bản dự thảo IETF
draft-ietf-httpapi-ratelimit-headers: các mục phân tách bằng dấu phẩy"<name>";q=<quota>;w=<window in seconds>.keylà tốc độ yêu cầu của khóa API (hạn mức là đợt tăng đột biến, khung thời gian là thời gian để hạn mức hồi lại hoàn toàn; với phiên làuser, khi không có thông tin xác thực làip);minute,dayvàmonthlà hạn mức của tổ chức cho phút, ngày và tháng theo lịch, tính theo UTC.RateLimitPhần còn lại của mỗi giới hạn trong
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitGiới hạn của mục chặt nhất trong
RateLimit-Policy(mục còn ít yêu cầu nhất).X-RateLimit-RemainingSố yêu cầu còn lại theo giới hạn chặt nhất.
X-RateLimit-ResetSố giây cho đến khi giới hạn chặt nhất được đặt lại.
text/event-stream
application/json
answerstringbắt buộcquestion_idintegerbắt buộcquerystringcollectionstringbắt buộcprovenancearray of NumberProvenanceemptystringGiá trị cho phép:
no_hitsrestrictedguardrailno_data_for_periodbasisAnswerBasisverificationAnswerVerificationalt_periodsarray of AnswerAltPerioditems ≤ 6
drilldownarray of AnswerDrilldownitems ≤ 20
restrictedRestrictedInfoguardrailGuardrailVerdictverified_onlybooleancachedbooleancache_hitAnswerCacheHitout_of_scopeAnswerOutOfScopeattachmentsarray of Attachmentexport_errorstringtoolsstring | nullLý do dùng công cụ cho câu trả lời này:
request(được yêu cầu rõ);compare,compute,action(dựa trên câu hỏi);needs_calc(cần tính toán trên bảng);summary(tổng quan về một bộ sưu tập hoặc tài liệu);mcp(tổ chức đã kết nối máy chủ MCP bên ngoài).Giá trị cho phép:
requestcomparecomputeactionneeds_calcsummarymcpnulltool_callsarray of ToolCallInfocalculationsarray of Calculationpending_actionsarray of PendingActionconversation_idstringChỉ với
POST /v1/chatcó cuộc trò chuyện.answer_idstringID của đối tượng câu trả lời.
400Yêu cầu không hợp lệ: giá trị tham số hoặc trạng thái của đối tượng không cho phép thực hiện hành động (`detail` là thông báo).
Header phản hồi
RateLimit-PolicyCác giới hạn đang áp dụng, theo định dạng của bản dự thảo IETF
draft-ietf-httpapi-ratelimit-headers: các mục phân tách bằng dấu phẩy"<name>";q=<quota>;w=<window in seconds>.keylà tốc độ yêu cầu của khóa API (hạn mức là đợt tăng đột biến, khung thời gian là thời gian để hạn mức hồi lại hoàn toàn; với phiên làuser, khi không có thông tin xác thực làip);minute,dayvàmonthlà hạn mức của tổ chức cho phút, ngày và tháng theo lịch, tính theo UTC.RateLimitPhần còn lại của mỗi giới hạn trong
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitGiới hạn của mục chặt nhất trong
RateLimit-Policy(mục còn ít yêu cầu nhất).X-RateLimit-RemainingSố yêu cầu còn lại theo giới hạn chặt nhất.
X-RateLimit-ResetSố giây cho đến khi giới hạn chặt nhất được đặt lại.
application/json
401Không có thông tin xác thực nào được gửi (không có cookie phiên lẫn khóa API), hoặc không tìm thấy khóa.
Header phản hồi
RateLimit-PolicyCác giới hạn đang áp dụng, theo định dạng của bản dự thảo IETF
draft-ietf-httpapi-ratelimit-headers: các mục phân tách bằng dấu phẩy"<name>";q=<quota>;w=<window in seconds>.keylà tốc độ yêu cầu của khóa API (hạn mức là đợt tăng đột biến, khung thời gian là thời gian để hạn mức hồi lại hoàn toàn; với phiên làuser, khi không có thông tin xác thực làip);minute,dayvàmonthlà hạn mức của tổ chức cho phút, ngày và tháng theo lịch, tính theo UTC.RateLimitPhần còn lại của mỗi giới hạn trong
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitGiới hạn của mục chặt nhất trong
RateLimit-Policy(mục còn ít yêu cầu nhất).X-RateLimit-RemainingSố yêu cầu còn lại theo giới hạn chặt nhất.
X-RateLimit-ResetSố giây cho đến khi giới hạn chặt nhất được đặt lại.
application/json
403Hành động không được phép: vai trò không đủ quyền, không có quyền truy cập vào bộ sưu tập hoặc thẻ, yêu cầu chạy ở chế độ “View as”, hoặc tổ chức bị tạm ngưng hay đã bị xóa (`detail` là đối tượng có `code: org_suspended | org_deleted`).
Header phản hồi
RateLimit-PolicyCác giới hạn đang áp dụng, theo định dạng của bản dự thảo IETF
draft-ietf-httpapi-ratelimit-headers: các mục phân tách bằng dấu phẩy"<name>";q=<quota>;w=<window in seconds>.keylà tốc độ yêu cầu của khóa API (hạn mức là đợt tăng đột biến, khung thời gian là thời gian để hạn mức hồi lại hoàn toàn; với phiên làuser, khi không có thông tin xác thực làip);minute,dayvàmonthlà hạn mức của tổ chức cho phút, ngày và tháng theo lịch, tính theo UTC.RateLimitPhần còn lại của mỗi giới hạn trong
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitGiới hạn của mục chặt nhất trong
RateLimit-Policy(mục còn ít yêu cầu nhất).X-RateLimit-RemainingSố yêu cầu còn lại theo giới hạn chặt nhất.
X-RateLimit-ResetSố giây cho đến khi giới hạn chặt nhất được đặt lại.
application/json
404Đối tượng không tồn tại hoặc bạn không có quyền truy cập. API không xác nhận sự tồn tại của đối tượng bị hạn chế quyền truy cập.
Header phản hồi
RateLimit-PolicyCác giới hạn đang áp dụng, theo định dạng của bản dự thảo IETF
draft-ietf-httpapi-ratelimit-headers: các mục phân tách bằng dấu phẩy"<name>";q=<quota>;w=<window in seconds>.keylà tốc độ yêu cầu của khóa API (hạn mức là đợt tăng đột biến, khung thời gian là thời gian để hạn mức hồi lại hoàn toàn; với phiên làuser, khi không có thông tin xác thực làip);minute,dayvàmonthlà hạn mức của tổ chức cho phút, ngày và tháng theo lịch, tính theo UTC.RateLimitPhần còn lại của mỗi giới hạn trong
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitGiới hạn của mục chặt nhất trong
RateLimit-Policy(mục còn ít yêu cầu nhất).X-RateLimit-RemainingSố yêu cầu còn lại theo giới hạn chặt nhất.
X-RateLimit-ResetSố giây cho đến khi giới hạn chặt nhất được đặt lại.
application/json
422Lỗi dữ liệu không hợp lệ: phần thân hoặc tham số không khớp với lược đồ (`detail` là danh sách lỗi dữ liệu không hợp lệ), hoặc giá trị tham số nằm ngoài phạm vi cho phép (`detail` là thông báo).
Header phản hồi
RateLimit-PolicyCác giới hạn đang áp dụng, theo định dạng của bản dự thảo IETF
draft-ietf-httpapi-ratelimit-headers: các mục phân tách bằng dấu phẩy"<name>";q=<quota>;w=<window in seconds>.keylà tốc độ yêu cầu của khóa API (hạn mức là đợt tăng đột biến, khung thời gian là thời gian để hạn mức hồi lại hoàn toàn; với phiên làuser, khi không có thông tin xác thực làip);minute,dayvàmonthlà hạn mức của tổ chức cho phút, ngày và tháng theo lịch, tính theo UTC.RateLimitPhần còn lại của mỗi giới hạn trong
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitGiới hạn của mục chặt nhất trong
RateLimit-Policy(mục còn ít yêu cầu nhất).X-RateLimit-RemainingSố yêu cầu còn lại theo giới hạn chặt nhất.
X-RateLimit-ResetSố giây cho đến khi giới hạn chặt nhất được đặt lại.
application/json
429Quá nhiều yêu cầu (`api.rate_limited`), hạn mức của tổ chức theo phút, ngày hoặc tháng đã dùng hết (`api.quota_exceeded`; `error.details` chứa `quota`, `limit` và `reset_at`), tổ chức đã đạt giới hạn, hoặc dịch vụ trả lời đang bận (`answers.engine_busy`). Hãy chờ khoảng thời gian ghi trong header `Retry-After`.
Header phản hồi
Retry-AfterSố giây cần chờ trước khi thử lại yêu cầu.
RateLimit-PolicyCác giới hạn đang áp dụng, theo định dạng của bản dự thảo IETF
draft-ietf-httpapi-ratelimit-headers: các mục phân tách bằng dấu phẩy"<name>";q=<quota>;w=<window in seconds>.keylà tốc độ yêu cầu của khóa API (hạn mức là đợt tăng đột biến, khung thời gian là thời gian để hạn mức hồi lại hoàn toàn; với phiên làuser, khi không có thông tin xác thực làip);minute,dayvàmonthlà hạn mức của tổ chức cho phút, ngày và tháng theo lịch, tính theo UTC.RateLimitPhần còn lại của mỗi giới hạn trong
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitGiới hạn của mục chặt nhất trong
RateLimit-Policy(mục còn ít yêu cầu nhất).X-RateLimit-RemainingSố yêu cầu còn lại theo giới hạn chặt nhất.
X-RateLimit-ResetSố giây cho đến khi giới hạn chặt nhất được đặt lại.
application/json
Mã lỗi
Các mã endpoint này có thể trả về trong error.code, ngoài các mã chung của mọi yêu cầu.
- 400answers.empty_question
- 409answers.external_ai_disabled
- 400answers.last_message_not_user
- 404answers.no_collections
- 422answers.scope_invalid
- 401auth.not_authenticated
- 403auth.system_scope
- 403collections.no_access
- 404collections.not_found
- 404conversations.not_found
- 422conversations.title_empty
- 429limits.concurrent_answers
- 429limits.questions
- 403org.deleted
- 403org.suspended
- 404sources.not_found
- 403view_as.read_only
Thử lại an toàn
Gửi header Idempotency-Key (ví dụ một UUID) với mỗi yêu cầu POST và PATCH. Một lần thử lại với cùng khóa trong vòng 24 giờ trả về phản hồi đã lưu thay vì thực hiện lại yêu cầu.
Giới hạn tốc độ
Phản hồi có các header RateLimit và RateLimit-Policy cùng các header cũ hơn X-RateLimit-Limit, X-RateLimit-Remaining và X-RateLimit-Reset. Phản hồi 429 có Retry-After tính bằng giây: hãy chờ rồi thử lại.