메인 콘텐츠로 건너뛰기

LLM 클라이언트 계측

instrumentLLM()은 원본 클라이언트와 같은 public shape를 가진 proxy를 반환합니다. SDK가 알고 있는 generation method는 자동으로 수집됩니다.
const openai = lynx.instrumentLLM(new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
}));

await lynx.run("SupportAgent", async () => {
  const response = await openai.chat.completions.create({
    model: "gpt-4.1-mini",
    messages: [{ role: "user", content: "이 대화를 요약해줘" }],
  });

  lynx.decision("support triage를 위해 대화를 요약했습니다");
  return response;
});
Lynx는 모델 메타데이터, 지연 시간, 가능한 경우 토큰 사용량, span ID, 오류를 기록합니다.

도구 계측

일반 수집만 필요하면 instrumentTool()을 사용하세요. 호출 전에 정책 검사까지 해야 한다면 guardTool()을 사용하세요.
const searchOrders = lynx.instrumentTool(
  "search_orders",
  async ({ userId }: { userId: string }) => {
    return db.orders.findMany({ where: { userId } });
  },
  {
    toolVersion: "2026-06-01",
    sideEffect: false,
    riskLevel: "LOW",
  },
);

await lynx.run("SupportAgent", async () => {
  const orders = await searchOrders({ userId: "usr_123" });
  lynx.context("orders", orders);
});

Custom LLM interception

클라이언트가 SDK에서 기본으로 아는 method 이름을 쓰지 않는다면 custom rule을 넘기면 됩니다.
const model = lynx.instrumentLLM(customClient, {
  modelLabel: "custom.llm",
  customRule: {
    isTargetMethod: (path) => path.join(".") === "responses.generate",
    extractInput: (args) => args[0],
    extractOutput: (result) => result.text,
    extractUsage: (result) => result.usage,
  },
});