Chuyển đến nội dung chính
Khi bạn đã có workspace và API key (xem Giới thiệu), prompt là bước tiếp theo. Trang này là tài liệu tham khảo chính thức cho registry prompt của OrcaRouter — nó là gì, cách dùng, và cách phối hợp với phần còn lại của gateway.

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ửi prompt_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

1

Tạo một prompt

Trong console, vào /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.
2

Liên kết một key

Vào /console/token, tạo hoặc sửa một API key, chọn support-agent từ dropdown Promptproduction từ dropdown Label.
3

Gửi một request

Dùng key đó, gọi OrcaRouter chính xác như trước:
curl https://api.orcarouter.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-orca-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "messages": [
      {"role": "user", "content": "What are your business hours?"}
    ]
  }'
Gateway sẽ chèn system message đã lưu vào trước khi chuyển tiếp. Header phản hồi X-Orca-Prompt: support-agent@production:v1 xác nhận prompt nào đã được chèn.
4

Chỉnh sửa prompt

Quay lại /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.
5

Thăng cấp

Nhấn Labels trên hàng prompt, di chuyển production sang v2, xác nhận. Request kế tiếp qua key của bạn sẽ nhận system message của v2. Không thay đổi ứng dụng.
Đó là giá trị cốt lõi.

3. Khái niệm: prompt, phiên bản, nhãn

Khái niệmĐịnh nghĩaTính khả biến
PromptMộ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ảnMộ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ãnCon 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ển latest bằng tay.
Bạn có thể thêm nhãn tùy chỉnh (vd: 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 qua prompt_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ới name@<label> sẽ nhận phiên bản mới ở request kế.
Chỉ Owner. Promote là một thay đổi production-traffic và bị giới hạn cho Owner của workspace (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ển latest đế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ới name@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 khi flag là truthy. Section đảo ngược ({{^flag}}...) hiện block khi flag thiế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.
Các provider bên ngoài tôn trọng cú pháp native:
  • Prompt Langfuse dùng cùng cú pháp Mustache {{var}}.
  • Prompt LangSmith khai báo template_format: f-string | mustache trong 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:
{
  "model": "openai/gpt-4o-mini",
  "messages": [
    {"role": "user", "content": "Who is on call tonight?"}
  ],
  "prompt_ref": {
    "name": "support-agent",
    "label": "staging",
    "variables": {
      "product_name": "Orca"
    }
  }
}
Ưu tiên (cao nhất thắng): 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:
type PromptRef = {
  provider?: string;   // omit for native; or the provider's configured name for external
  name: string;        // required
  label?: string;      // mutually exclusive with `version`
  version?: string;    // pin to a specific version
  variables?: { [key: string]: string };  // mustache substitution
};
Trường hợp dùng: A/B test các phiên bản prompt khác nhau cho cùng một key; canary rollout từ phía người gọi; nội suy biến theo request.

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ạng kind: '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ố system gốc.
Với prompt chat bên ngoài (Langfuse, LangSmith), gateway làm phẳng template thành cùng hình dạng.

8. Quan hệ với phần còn lại của gateway

Bề mặtPhối hợp với Prompts thế nào?
ModelsPrompt 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 đó.
RoutingRouting 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.
GuardrailsGuardrails 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 KeysMộ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.
InsightsMỗ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í.
Router vẫn là thẩm quyền duy nhất về model. Ngay cả prompt bên ngoài khai báo một 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ửi prompt_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ợ:
  • LangfuseGET {base}/api/public/v2/prompts/{name}?label=..., Basic auth từ cặp public:secret của bạn. Prompt text và chat.
  • LangSmithGET {base}/commits/{owner}/{name}/{tag|hash|latest}, header x-api-key. Gateway parse manifest đã serialize để trích messages/text và khai báo template_format. Các trường nhúng model_config / model_provider bị 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.
Kết nối nguồn ở Integrations → Prompt sources (cấu hình chỉ Owner; secret được mã hóa lưu, masked khi đọc). Quy trình Test & Save dry-resolve một prompt đã biết trước khi persist và từ chối các URL bị SSRF chặn (loopback, private, link-local, dải metadata).

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ườngMặc địnhLàm gì
URL templaterequiredURL đầ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 methodGETGET hoặc POST. Chọn POST khi nền tảng yêu cầu body.
Auth header nameAuthorizationHeader 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 prefixBearer (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 templateemptyChỉ 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 pathemptyĐườ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.
Ví dụ — kết nối PromptLayer thủ công:
URL template:        https://api.promptlayer.com/rest/get-prompt-template?prompt_name={name}&label={label}&version={version}
HTTP method:         GET
Auth header name:    X-API-KEY
Auth scheme prefix:  (empty)
Body template:       (empty)
Response JSON path:  prompt_template.messages
Secret:              <your PromptLayer API key>

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

X-Orca-Prompt: support-agent@production:v7 (native)
Định dạng:
  • Native: name@label:vN (native) (hoặc name@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 header X-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 & pathVai tròMục đích
GET /api/prompt/MemberLiệt kê prompt (phân trang, hỗ trợ ?tag=).
GET /api/prompt/?in_trash=trueOwnerLiệt kê prompt đã xóa mềm (chỉ Owner — lớp khôi phục).
GET /api/prompt/searchMemberTìm theo từ khóa + tag (rate-limited).
GET /api/prompt/tagsMemberTypeahead tag cho workspace.
GET /api/prompt/:idMemberChi tiết một prompt.
GET /api/prompt/:id/versionsMemberLịch sử phiên bản (mới nhất trước).
GET /api/prompt/:id/labelsMemberMap hiện tại nhãn → phiên bản.
GET /api/prompt/:id/tagsMemberTập tag cho một prompt.
GET /api/prompt/:id/label_historyMemberAudit log thăng cấp.
GET /api/prompt/:id/analyticsMemberDữ liệu biểu đồ usage theo prompt.
GET /api/prompt/analytics/topMemberPrompt đượ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/tagsDeveloper+Thay thế tập tag.
POST /api/prompt/:id/runDeveloper+“Try it” Playground (rate-limited 30/min/workspace).
DELETE /api/prompt/:idDeveloper+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/restoreOwnerKhôi phục từ thùng rác.
POST /api/prompt/:id/rollbackOwnerKhôi phục một phiên bản cũ hơn thành phiên bản mới.
POST /api/prompt/:id/labelOwnerDi 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 & pathVai tròMục đích
GET /api/prompt_provider/MemberLiệt kê nguồn đã kết nối (secret masked).
POST /api/prompt_provider/OwnerKết nối một nguồn.
PUT /api/prompt_provider/OwnerCập nhật một nguồn.
DELETE /api/prompt_provider/:idOwnerNgắt kết nối.
POST /api/prompt_provider/testOwnerDry-resolve trước khi lưu.
GET /api/prompt_provider/:id/promptsMemberLiệt kê các prompt có sẵn trong một nguồn bên ngoài.
POST /api/prompt_provider/:id/prompts/importDeveloper+Nhập một prompt bên ngoài vào registry cục bộ.

Prompt webhook

Method & pathVai tròMục đích
GET /api/prompt_webhook/MemberLiệt kê webhook.
POST /api/prompt_webhook/OwnerThêm webhook (secret trả về một lần).
PUT /api/prompt_webhook/:idOwnerSửa.
DELETE /api/prompt_webhook/:idOwnerXóa.
POST /api/prompt_webhook/:id/testOwnerGử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:
{
  "event": "label.promoted",
  "workspace_id": "ws_...",
  "occurred_at": "2025-01-15T08:30:00Z",
  "data": { "...": "event-specific fields" }
}
Các loại event: 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ường event trong phong bì.
  • X-Orca-Signature — có định dạng sha256=<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

type ChatCompletionsRequest = {
  // ... all existing OpenAI-compatible fields ...
  prompt_ref?: PromptRef;  // gateway-only; stripped before upstream
};

12. FAQ

Hành vi giống hệt byte với một workspace chưa bao giờ bật tính năng này. Nếu key không được liên kết, không có 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 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.
Không ở v1. Bất kỳ key nào có thể 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.
Có. Token system prompt được chèn được tính vào usage / quota / billing chính xác như bất kỳ system message nào khác. Prompt quá dài vượt cửa sổ ngữ cảnh của model sẽ trả lỗi bình thường từ thượng nguồn — gateway không pre-truncate.
Không. Các trườ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.
Resolver coi prompt thiếu / đã xóa / không có thẩm quyền là fail-safe skip — request được chuyển tiếp không đổi mà không có lỗi cho người gọi. Modal Edit và Promote hiển thị badge “Used by N keys” để bạn thấy bán kính ảnh hưởng trước khi xóa hoặc thăng cấp.
Di chuyển nhãn native gần như tức thì (gateway đồng bộ từ DB ở khoảng cách giới hạn theo giây, cộng với ghi local-map trên đường ghi controller). Di chuyển nhãn bên ngoài xuất hiện trong TTL cache đã cấu hình (mặc định 60 giây). Cả hai đều là kỳ vọng được tài liệu hóa, không phải lỗi.
Có. Modal Create prompt có toggle 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).
  • Header phản hồi X-Orca-Prompt trên phản hồi gửi cho người dùng.
  • Các cột Log.PromptId / PromptVersion / PromptLabel trên hàng log request.
  • Facet filter Prompt trong Insights — chọn một prompt; mọi tab Insights filter theo prompt_id đó.
Sửa webhook qua 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.)