1. Registry prompt là gì
Registry prompt là thư viện các system message có thể tái sử dụng, theo phạm vi workspace. Bạn lưu một prompt một lần, liên kết bất kỳ API key nào với nó (hoặc gửiprompt_ref mỗi request), và gateway sẽ
chèn prompt đó như là system message trước khi chuyển tiếp request tới
mô hình thượng nguồn.
Chỉnh sửa một prompt sẽ cập nhật mọi key liên kết với nó ngay ở
lần gọi kế tiếp. Không triển khai lại. Không đổi code. Không nâng cấp
SDK. Liên kết nằm ở gateway, không phải trong ứng dụng của bạn.
Đây cũng là ý tưởng mà Langfuse và LangSmith đã tiên phong, nhưng có
một khác biệt: OrcaRouter là lớp phân phối. Code ứng dụng vẫn gọi
/v1/chat/completions y như trước; gateway phân giải và chèn prompt.
Không cần cài thêm gì trong ứng dụng.
Prompt thuộc phạm vi workspace — mọi thành viên thấy prompt của
workspace; không có gì vượt biên tenant.
2. Bắt đầu nhanh — liên kết prompt đầu tiên trong 5 bước
Tạo một prompt
/console/prompts và nhấn New prompt.
Đặt tên là support-agent. Dán system message:“Bạn là một nhân viên hỗ trợ ngắn gọn cho Acme. Trả lời trong 2 câu hoặc ít hơn.”Lưu — thao tác này tạo phiên bản 1.
Liên kết một key
/console/token, tạo hoặc sửa một API key, chọn support-agent
từ dropdown Prompt và production từ dropdown Label.Gửi một request
X-Orca-Prompt: support-agent@production:v1 xác
nhận prompt nào đã được chèn.Chỉnh sửa prompt
/console/prompts, chỉnh support-agent — thay đổi
system message. Lưu — phiên bản 2 được tạo tự động; production
vẫn trỏ tới v1.3. Khái niệm: prompt, phiên bản, nhãn
| Khái niệm | Định nghĩa | Tính khả biến |
|---|---|---|
| Prompt | Một mục có tên, theo phạm vi workspace. Định danh: name (regex ^[a-zA-Z0-9._-]{1,128}$). | Xóa mềm (thùng rác 30 ngày + xóa cứng). |
| Phiên bản | Một snapshot bất biến của nội dung prompt. Tạo tự động mỗi lần lưu. Định danh: int đơn điệu. | Bất biến — không bao giờ sửa, không tái sử dụng. |
| Nhãn | Con trỏ có thể di chuyển trỏ tới một phiên bản (vd: production → v7). | Di chuyển nguyên tử qua Promote; audit log ghi lại mỗi lần di chuyển. |
Nhãn dành riêng
productionđược tự động ghim vào v1 ở phiên bản đầu tiên của mọi prompt mới. Di chuyển nó là một thay đổi production-traffic — chỉ Owner trong RBAC.latestđược gateway tự động duy trì và luôn trỏ tới phiên bản mới nhất. Bạn không thể di chuyểnlatestbằng tay.
staging, canary, eu-prod)
sau này qua dialog Labels và liên kết key với chúng. Cho đến khi một
nhãn được ghim vào phiên bản, key liên kết với name@<nhãn-đó> sẽ
fail open mà không chèn gì.
Tại sao hình thức này
Phân tách giữa phiên bản bất biến và nhãn di chuyển được là nguyên thủy deploy-without-code. Code ứng dụng tham chiếu tới một nhãn (ngầm định, qua liên kết key, hoặc tường minh quaprompt_ref). Thăng cấp di
chuyển nhãn — ứng dụng thấy nội dung mới ở lần gọi kế tiếp mà không có
thay đổi code. Rollback chỉ là thăng cấp phiên bản cũ hơn lên nhãn.
4. Các pattern production: promote, rollback, phát hành theo giai đoạn
Promote
Mở Labels trên hàng prompt, chọn phiên bản đích, nhấn Promote. Việc di chuyển nhãn là nguyên tử và được kiểm toán (audit log cho thấy ai đã di chuyển nhãn nào từ phiên bản nào sang phiên bản nào, khi nào). Mọi key liên kết vớiname@<label> sẽ nhận phiên bản mới ở request kế.
POST /api/prompt/:id/label). Developer
và Viewer thấy danh sách nhãn và lịch sử audit nhưng không có nút
Promote; dialog hiển thị gợi ý inline “ask an Owner” để giới hạn này
hiện rõ thay vì âm thầm.Rollback
Restore trên một phiên bản cũ hơn trong drawer History. Restore sao chép nội dung của phiên bản đó tiến lên thành một phiên bản mới (lịch sử không bao giờ bị mutate) và di chuyểnlatest đến nó. Để
traffic thực sự rollback, Promote nhãn liên quan đến phiên bản đã
khôi phục.
Phát hành theo giai đoạn
Liên kết các key canary vớiname@staging, các key prod với
name@production. Thăng cấp staging lên phiên bản mới, quan sát
trong Insights, sau đó thăng cấp production khi hài lòng. Không sửa
key, không deploy, không cập nhật SDK.
Chia tải A/B
Dialog Label có toggle Split traffic. Bật để trỏ một nhãn tới nhiều phiên bản với phân phối có trọng số (vd: v7: 60%, v8: 40%). Phân nhóm xác định theo(workspace, token, request-id) nên một cuộc hội thoại
duy nhất ở cùng nhóm qua các lần retry.
5. Templating: thay thế {{var}}
Nội dung prompt hỗ trợ placeholder {{var}} kiểu Mustache. Giá trị từ
phía gọi đến từ prompt_ref.variables (xem §6).
Quy tắc:
- Thay thế một lượt. Giá trị biến được phát ra như văn bản literal.
Chúng KHÔNG được đánh giá lại như template — điều này ngăn prompt
injection khi giá trị do người gọi cung cấp cố chèn thêm chỉ thị
{{...}}. - Placeholder không xác định giữ nguyên. Nếu placeholder
{{foo}}không có biến tương ứng, literal{{foo}}được phát ra (và cảnh báo được ghi log). Request không bao giờ thất bại vì thiếu biến. - Truy cập có dấu chấm.
{{user.name}}duyệt các object lồng nhau khi người gọi truyền map lồng nhau. - Section.
{{#flag}}...{{/flag}}chỉ hiện block khiflaglà truthy. Section đảo ngược ({{^flag}}...) hiện block khiflagthiếu/falsy. - Giới hạn kích thước văn bản đã render: 256 KiB. Nếu văn bản
cuối cùng sau khi render vượt ngưỡng này, toàn bộ việc tiêm bị bỏ
qua (phản hồi không mang header
X-Orca-Prompt) và request được chuyển tiếp nguyên trạng — bảo vệ chống khuếch đại do biến phình to.
- Prompt Langfuse dùng cùng cú pháp Mustache
{{var}}. - Prompt LangSmith khai báo
template_format: f-string | mustachetrong manifest. Gateway tôn trọng khai báo đó.
6. Ghi đè theo request: prompt_ref
Ghi đè hoặc chọn một prompt theo request mà không đổi liên kết
key. Thêm trường prompt_ref cấp cao nhất vào body request:
prompt_ref request > liên kết key (native
PromptId/PromptLabel hoặc PromptProviderId) > SystemPrompt
kênh > không có.
prompt_ref được gateway tiêu thụ và loại bỏ trước khi chuyển tiếp
thượng nguồn — các provider khắt khe không bao giờ thấy trường lạ.
Hình dạng:
7. Prompt kiểu chat (system + few-shot)
Phần lớn prompt là một chuỗi system đơn lẻ. Nhưng đôi khi bạn muốn gateway chèn một template phong phú hơn — một system message cộng với chuỗi few-shot user/assistant. Registry hỗ trợ điều này dưới dạngkind: 'chat'.
Modal Create prompt trong console có toggle Text / Chat. Khi
bạn chọn Chat, editor nội dung trở thành danh sách các hàng
{role, content} (system, user, assistant) — thêm bao nhiêu tùy nhu
cầu. Khi lưu, các hàng được lưu là messages_json. Sau khi tạo,
kind là bất biến.
Hành vi khi chèn:
- Không có system message trong request ⇒ gateway chèn system message của template và các lượt few-shot của template xuất hiện trước messages của người gọi.
- Có system message trong request ⇒ việc chèn tuân theo mặc định
của adapter định dạng. Với request kiểu OpenAI, system message của
template được chèn lên đầu; với request kiểu Claude, system của
template đi vào tham số
systemgốc.
8. Quan hệ với phần còn lại của gateway
| Bề mặt | Phối hợp với Prompts thế nào? |
|---|---|
| Models | Prompt là model-agnostic. Cùng một prompt chạy trên GPT-5, Claude, Gemini. Routing chọn mô hình thượng nguồn dựa trên model của request và group của key — Prompts không bao giờ ghi đè điều đó. |
| Routing | Routing chạy trước; prompt resolver chạy sau. Vì vậy prompt đã phân giải đi theo bất kỳ kênh nào router chọn, kể cả qua chuỗi fallback. |
| Guardrails | Guardrails là cổng độc lập kiểm tra và redact nội dung. Prompts chèn một system message; chúng không bỏ qua chính sách. Một request có thể mang cả hai — guardrails luôn chạy. |
| API Keys | Một key liên kết với một prompt ở một nhãn (vd: support-agent@production). Liên kết nằm trên key trong gateway, nên thăng cấp phiên bản mới sẽ dịch chuyển mọi key trên nhãn đó cùng lúc. |
| Insights | Mỗi request đóng dấu prompt_id, prompt_version, prompt_label trên hàng log. Insights chia theo prompt — sử dụng, tỷ lệ lỗi, độ trễ, chi phí. |
config (Langfuse config.model, LangSmith
model_config) — gateway bỏ qua những trường đó. Prompts chỉ chèn văn
bản; chọn model là việc của router.
9. Nguồn bên ngoài: Langfuse, LangSmith, Generic HTTP
Liên kết: kết nối một nguồn prompt bên ngoài một lần, sau đó liên kết key hoặc gửiprompt_ref đến các tên được host ở đó. Prompt native và
bên ngoài liên kết và phục vụ giống hệt nhau — chỉ khác backend
resolver.
Nguồn được hỗ trợ:
- Langfuse —
GET {base}/api/public/v2/prompts/{name}?label=..., Basic auth từ cặppublic:secretcủa bạn. Prompt text và chat. - LangSmith —
GET {base}/commits/{owner}/{name}/{tag|hash|latest}, headerx-api-key. Gateway parse manifest đã serialize để trích messages/text và khai báotemplate_format. Các trường nhúngmodel_config/model_providerbị loại bỏ (phòng vệ sâu: registry chỉ phục vụ văn bản). - Generic HTTP — connector do operator cấu hình cho bất kỳ registry prompt nào lộ ra một lệnh HTTP đơn cho mỗi lần fetch. Xem dưới để biết các trường có thể cấu hình.
Các trường của connector Generic HTTP
Nguồn Generic HTTP là adapter “mô tả một lệnh HTTP và một hình dạng phản hồi”. Dùng cho prompt store self-hosted VÀ cho các nền tảng bên thứ ba không cần tích hợp backend riêng (PromptLayer, API tùy chỉnh đơn giản, v.v.). Các trường cố ý nhỏ — luồng đa bước hoặc giao thức đặc thù provider nằm ngoài phạm vi.| Trường | Mặc định | Làm gì |
|---|---|---|
| URL template | required | URL đầy đủ của request với placeholder {name} / {label} / {version}. Placeholder trong path dùng PathEscape; placeholder trong query dùng QueryEscape để &/= trong tên prompt không thể inject query param phụ. |
| HTTP method | GET | GET hoặc POST. Chọn POST khi nền tảng yêu cầu body. |
| Auth header name | Authorization | Header HTTP gửi secret. Đặt thành X-API-KEY (hoặc tương tự) cho các provider dùng header tùy chỉnh. |
| Auth scheme prefix | Bearer (có khoảng trắng cuối) | Chuỗi thêm trước secret trong giá trị header. Đặt rỗng nếu nền tảng mong đợi API key thô, hoặc Token / prefix tùy chỉnh khác. |
| Body template | empty | Chỉ POST. Body request thô với hai họ placeholder. Verbatim: {name} / {label} / {version} thay thế giá trị literal (dùng cho body form-encoded, XML, hoặc template — bạn tự lo escaping). JSON-safe: {name_json} / {label_json} / {version_json} thay thế bằng chuỗi JSON đã trích dẫn đầy đủ (vd: "hello") — dùng những cái này BÊN TRONG body JSON để tên prompt phía request chứa " / \ / ký tự điều khiển không thể inject trường anh em vào thượng nguồn. |
| Response JSON path | empty | Đường dẫn dấu chấm tùy chọn vào JSON phản hồi nơi payload prompt nằm (vd: data.0.template.messages). Rỗng = tự dò các hình dạng text / prompt / messages cấp cao nhất. |
Khả năng chịu lỗi
- Cache TTL (mặc định 60 giây) để chỉnh sửa prompt lan truyền trong vòng một phút.
- Stale-while-revalidate — giá trị cached được phục vụ trong khi lần refresh tiếp theo chạy nền.
- Stale-on-error — nếu nguồn bên ngoài trả 5xx hoặc time out, gateway phục vụ phản hồi tốt cuối cùng đã biết. Lưu lượng người dùng không bao giờ hard-fail vì sự cố provider.
10. Khả năng quan sát
Mỗi request có prompt được chèn để lại bốn dấu vết.Header phản hồi
- Native:
name@label:vN (native)(hoặcname@label (native)khi int phiên bản chưa biết). - External:
name@label:<provider-version-tag> (langfuse)v.v. - Bỏ nhãn ⇒ không có đoạn
@label.
Các cột log
Log.PromptId, Log.PromptVersion, Log.PromptLabel — các cột có
kiểu, được index cho query Insights.
Drilldown Insights
Trong/console/insights, hàng filter có facet Prompt — chọn
một prompt và mọi tab (latency, errors, cost) filter theo
prompt_id đó. Đây là đóng vòng cho “tôi đã sửa một prompt — điều
gì thay đổi về traffic?”.
Audit
Mỗi lần di chuyển nhãn và rollback được ghi vào Promote history của prompt với user id của tác nhân, timestamp, from-version, và to-version. Hiển thị cho mọi thành viên; mutate bị giới hạn bởi vai trò Owner.11. Tham chiếu API
Mọi route đều theo phạm vi workspace qua headerX-Workspace-Id.
RBAC được thực thi nhất quán: đọc mở cho mọi thành viên; ghi là
Developer+; thay đổi production-traffic (di chuyển nhãn, rollback,
cấu hình provider, webhook) chỉ Owner.
Prompts
| Method & path | Vai trò | Mục đích |
|---|---|---|
GET /api/prompt/ | Member | Liệt kê prompt (phân trang, hỗ trợ ?tag=). |
GET /api/prompt/?in_trash=true | Owner | Liệt kê prompt đã xóa mềm (chỉ Owner — lớp khôi phục). |
GET /api/prompt/search | Member | Tìm theo từ khóa + tag (rate-limited). |
GET /api/prompt/tags | Member | Typeahead tag cho workspace. |
GET /api/prompt/:id | Member | Chi tiết một prompt. |
GET /api/prompt/:id/versions | Member | Lịch sử phiên bản (mới nhất trước). |
GET /api/prompt/:id/labels | Member | Map hiện tại nhãn → phiên bản. |
GET /api/prompt/:id/tags | Member | Tập tag cho một prompt. |
GET /api/prompt/:id/label_history | Member | Audit log thăng cấp. |
GET /api/prompt/:id/analytics | Member | Dữ liệu biểu đồ usage theo prompt. |
GET /api/prompt/analytics/top | Member | Prompt được dùng nhiều nhất toàn workspace. |
POST /api/prompt/ | Developer+ | Tạo prompt (text hoặc chat). |
PUT /api/prompt/ | Developer+ | Cập nhật prompt (tạo phiên bản mới). |
POST /api/prompt/:id/tags | Developer+ | Thay thế tập tag. |
POST /api/prompt/:id/run | Developer+ | “Try it” Playground (rate-limited 30/min/workspace). |
DELETE /api/prompt/:id | Developer+ | Xóa mềm vào thùng rác (mặc định); ?purge=true là xóa cứng chỉ Owner. |
POST /api/prompt/:id/restore | Owner | Khôi phục từ thùng rác. |
POST /api/prompt/:id/rollback | Owner | Khôi phục một phiên bản cũ hơn thành phiên bản mới. |
POST /api/prompt/:id/label | Owner | Di chuyển nhãn sang một phiên bản (nguyên tử, audited; cũng nhận payload split cho A/B). |
Prompt provider (liên kết)
| Method & path | Vai trò | Mục đích |
|---|---|---|
GET /api/prompt_provider/ | Member | Liệt kê nguồn đã kết nối (secret masked). |
POST /api/prompt_provider/ | Owner | Kết nối một nguồn. |
PUT /api/prompt_provider/ | Owner | Cập nhật một nguồn. |
DELETE /api/prompt_provider/:id | Owner | Ngắt kết nối. |
POST /api/prompt_provider/test | Owner | Dry-resolve trước khi lưu. |
GET /api/prompt_provider/:id/prompts | Member | Liệt kê các prompt có sẵn trong một nguồn bên ngoài. |
POST /api/prompt_provider/:id/prompts/import | Developer+ | Nhập một prompt bên ngoài vào registry cục bộ. |
Prompt webhook
| Method & path | Vai trò | Mục đích |
|---|---|---|
GET /api/prompt_webhook/ | Member | Liệt kê webhook. |
POST /api/prompt_webhook/ | Owner | Thêm webhook (secret trả về một lần). |
PUT /api/prompt_webhook/:id | Owner | Sửa. |
DELETE /api/prompt_webhook/:id | Owner | Xóa. |
POST /api/prompt_webhook/:id/test | Owner | Gửi event mẫu. |
Giao nhận sự kiện webhook
Mỗi lần giao nhận sẽ POST một phong bì JSON đến URL bạn đã cấu hình:prompt.created, prompt.updated, prompt.deleted,
label.promoted, version.rolled_back.
Header đi kèm trong mỗi lần giao nhận:
X-Orca-Webhook-Id— id của webhook của bạn (dùng để khử trùng lặp).X-Orca-Event— giống với trườngeventtrong phong bì.X-Orca-Signature— có định dạngsha256=<hex>, trong đó<hex>là HMAC-SHA256 của body thô của request, ký bằng webhook secret. So sánh theo thời gian hằng số.
Bổ sung payload request
12. FAQ
Sẽ ra sao nếu không có prompt nào phân giải trên một request?
Sẽ ra sao nếu không có prompt nào phân giải trên một request?
prompt_ref, và không
có channel default — gateway không làm gì cả. Phản hồi không mang
header X-Orca-Prompt. Các cột log là NULL.Đây là đảm bảo không hồi quy: resolver là một no-op đã được xác
minh khi không có gì được liên kết.SystemPromptOverride tương tác với registry như thế nào?
SystemPromptOverride tương tác với registry như thế nào?
SystemPromptOverride là system prompt mặc định cấp kênh hiện có.
Một prompt registry đã liên kết ghi đè default kênh — được tài
liệu hóa và có chủ ý. Khi không có gì phân giải, default kênh vẫn
hoạt động chính xác như trước.Khi request của người gọi đã bao gồm một system message, hành vi
được quyết định bởi adapter định dạng: request kiểu OpenAI nhận
system message của template được chèn lên đầu; request kiểu Claude
đặt system của template vào tham số system gốc.Tôi có thể giới hạn prompt nào mà một key cụ thể có thể dùng không?
Tôi có thể giới hạn prompt nào mà một key cụ thể có thể dùng không?
prompt_ref bất kỳ prompt nào
trong workspace của chính nó. Điều này khớp với mô hình key theo
phạm vi workspace của Langfuse và LangSmith. Truy cập
cross-workspace bị từ chối ở cấp resolver (kiểm tra lại trong
đường relay; không bao giờ tin cậy liên kết cũ).Allowlist prompt theo key là khả năng bổ sung trong tương lai.Token prompt được chèn có bị tính phí không?
Token prompt được chèn có bị tính phí không?
Registry có ghi đè model không?
Registry có ghi đè model không?
config.model / model_config của provider
bên ngoài bị bỏ qua. Chọn model vẫn là thẩm quyền duy nhất của
router — Prompts chỉ chèn văn bản.Điều gì xảy ra với key liên kết với một prompt đã xóa?
Điều gì xảy ra với key liên kết với một prompt đã xóa?
Di chuyển nhãn lan truyền nhanh thế nào?
Di chuyển nhãn lan truyền nhanh thế nào?
Tôi có thể sửa chat prompt trong UI không?
Tôi có thể sửa chat prompt trong UI không?
Text / Chat; chế độ chat
hiển thị editor cấu trúc {role, content}. Sau khi prompt được
tạo, kind của nó là bất biến (bạn sẽ tạo prompt mới để đổi hình
dạng).Dấu vết prompt-stamp đi về đâu?
Dấu vết prompt-stamp đi về đâu?
- Header phản hồi
X-Orca-Prompttrên phản hồi gửi cho người dùng. - Các cột
Log.PromptId/PromptVersion/PromptLabeltrên hàng log request. - Facet filter Prompt trong Insights — chọn một prompt; mọi
tab Insights filter theo
prompt_idđó.
Làm sao xoay secret webhook?
Làm sao xoay secret webhook?
PUT /api/prompt_webhook/:id và cung cấp giá trị
secret mới. Secret mới được hiển thị một lần trong response —
copy lúc đó; sau đó secret bị masked. (Không có endpoint chuyên
dụng để xoay; xoay là chỉnh sửa thông thường.)