Tài liệu · Ingest

Gửi bước đi của agent

Clone repo, wrap client, rồi observe() một hàm. Bot Zalo, Lark, Google Chat thì dán webhook trên Kênh.

← Tài liệu

Package

Import @vet/sdk từ packages/sdk-js. Package này chưa lên npm.

Wrap

wrapAnthropic hoặc wrapFptGetAnswer.

Observe

observe() một hàm, hoặc trỏ OpenTelemetry vào console.

  1. 1. Clone repo. Import @vet/sdk từ packages/sdk-js. Package này chưa lên npm. Hoặc trỏ SDK Langfuse vào cùng baseUrl.
  2. 2. wrapAnthropic hoặc wrapFptGetAnswer. Local thì khóa nằm trong .env.console.example, baseUrl http://localhost:3000. Production thì copy key từ console. Đừng gửi khóa model vào Vết.
  3. 3. observe() một hàm. Bot Zalo, Lark, Google Chat thì dán webhook trên Kênh, bỏ bước này.

@vet/sdk nằm trong packages/sdk-js của repo này. Console dùng API Langfuse, nên SDK Langfuse trỏ cùng baseUrl cũng được.

import Anthropic from "@anthropic-ai/sdk"
import { wrapAnthropic, observe } from "@vet/sdk"

const vet = {
  publicKey: process.env.LANGFUSE_PUBLIC_KEY,
  secretKey: process.env.LANGFUSE_SECRET_KEY,
  baseUrl: "http://localhost:3000",
}

const client = wrapAnthropic(new Anthropic(), vet)

await observe(
  "hoan-tien",
  () =>
    client.messages.create({
      model: "claude-sonnet-4-5",
      max_tokens: 256,
      messages,
    }),
  { ...vet, sessionId, userId, channel: "zalo_oa", tags: ["zalo"] },
)

FPT.AI Conversation

import { wrapFptGetAnswer } from "@vet/sdk"

const getAnswer = wrapFptGetAnswer(fetch, {
  publicKey: process.env.LANGFUSE_PUBLIC_KEY,
  secretKey: process.env.LANGFUSE_SECRET_KEY,
  baseUrl: "http://localhost:3000",
})

await getAnswer({
  channel: "zalo",
  sender_id: userId,
  message: "Chính sách hoàn tiền đơn DH-88421?",
})

Kênh production Việt Nam

Trên Kênh, dán webhook vào Zalo OA, FPT.AI, Lark hoặc Google Chat. Viettel ASR/TTS hiện trên cùng một cây với lượt Zalo.

Zalo OA bắt chữ ký X-ZEvent-Signature. Hook sai chữ ký trả 401 và không ghi lượt.

curl -X POST http://localhost:43173/hooks/zalo/oa/<projectId> \
  -H "content-type: application/json" \
  -H "X-ZEvent-Timestamp: <ts>" \
  -H "X-ZEvent-Signature: <mac>" \
  -d '{"event_name":"user_send_text","sender":{"id":"u1"},"message":{"text":"Hoàn tiền DH-88421?"}}'

Thử local thì dùng nút Gửi thử trên trang Kênh, hoặc node scripts/zalo-fixture.mjs, zalo-bot-fixture.mjs, lark-fixture.mjs, gchat-fixture.mjs. Tin Zalo thật cần Cloudflare Tunnel tới :43173. Hướng dẫn nằm ở trang Tự vận hành, mục Cloudflare Tunnel. Teams ghi span qua SDK hoặc OTLP.

OTLP

Bot đã có OpenTelemetry thì trỏ exporter vào console. Nền tảng :43173 nhận cùng payload khi LANGFUSE_* được set, rồi ghi tiếp vào console.

# Console (Langfuse public OTLP)
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:3000/api/public/otel
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic $(printf '%s' "$LANGFUSE_PUBLIC_KEY:$LANGFUSE_SECRET_KEY" | base64)"

# Same JSON on the platform, dual-writes when LANGFUSE_* is set
# POST http://localhost:43173/otlp/v1/traces