Skip to content

@tasco/ai/server

Handler Nitro proxy chat tới AI gateway — chỉ import trong server/ của app, không dùng ở client. Hướng dẫn: AI trong sản phẩm.

Hàm

createAiChatProxy()

ts
function createAiChatProxy(options): EventHandler<EventHandlerRequest, Promise<Response>>;

Tạo Nitro handler proxy chat-completions streaming tới AI gateway. App sản phẩm dùng: tạo file server/api/ai/chat.post.ts:

import { createAiChatProxy } from '@tasco/ai/server' export default createAiChatProxy({ gatewayUrl: process.env.AI_GATEWAY_URL!, apiKey: process.env.AI_GATEWAY_KEY!, defaultModel: 'claude-sonnet-5', })

Tham số

Tham sốKiểu
optionsAiChatProxyOptions

Trả về

EventHandler<EventHandlerRequest, Promise<Response>>


sanitizeChatRequest()

ts
function sanitizeChatRequest(body, options?): SanitizeResult;

Whitelist + validate body từ client trước khi forward tới gateway. Nguyên tắc: client KHÔNG được đẩy param tuỳ ý xuống gateway — chỉ các field đã duyệt (model/messages/temperature/max_tokens) đi qua, phần còn lại bị bỏ.

Tham số

Tham sốKiểu
bodyunknown
optionsSanitizeOptions

Trả về

SanitizeResult

Interface

AiChatProxyOptions

Tuỳ chọn của createAiChatProxy: địa chỉ gateway, key và giới hạn request.

Kế thừa

Thuộc tính

Thuộc tínhKiểuMô tả
apiKeystringAPI key app-level do gateway cấp — CHỈ tồn tại server-side, không bao giờ xuống client.
authorize?(event) => boolean | Promise<boolean>Hook chặn request chưa đủ quyền (trả false → 401). Mặc định KHÔNG tự check — khuyến nghị mount route sau middleware auth của @tasco/nuxt-layer-base.
gatewayUrlstringURL gốc gateway OpenAI-compatible (vd LiteLLM), có /v1: https://ai-gateway.example.com/v1.

ChatGatewayPayload

Payload đã whitelist, sẵn sàng forward tới gateway OpenAI-compatible.

Thuộc tính

Thuộc tínhKiểuMô tả
max_tokens?numberChỉ giữ khi là số nguyên dương. Tên theo chuẩn OpenAI nên giữ snake_case.
messagesChatMessage[]Message chỉ còn rolecontent.
modelstringModel đã qua allowlist (hoặc defaultModel khi client không gửi).
streamtrueLuôn stream.
temperature?numberChỉ giữ khi là số trong khoảng 0–2.

SanitizeOptions

Giới hạn áp lên body chat client gửi lên, dùng chung cho sanitizeChatRequestcreateAiChatProxy.

Được kế thừa bởi

Thuộc tính

Thuộc tínhKiểuMô tả
allowedModels?string[]Danh sách model cho phép; bỏ trống = chấp nhận mọi model client gửi.
defaultModel?stringModel dùng khi client không gửi.
maxMessages?numberSố message tối đa mỗi request (chặn payload phình). Mặc định 50.
maxTotalChars?numberTổng ký tự tối đa của toàn bộ messages. Mặc định 100_000.

Kiểu

SanitizeResult

ts
type SanitizeResult = 
  | {
  ok: true;
  payload: ChatGatewayPayload;
}
  | {
  ok: false;
  reason: string;
};

Kết quả kiểm tra body: ok kèm payload sạch, hoặc lý do từ chối (tiếng Việt, trả cho client ở lỗi 400).