onToolCall 타입 에러

onToolCall 타입 에러 (Type Error with onToolCall)

onToolCall 콜백을 TypeScript에서 쓸 때, 도구 속성을 addToolOutput으로 직접 넘기면 타입 에러가 나는 문제와 해결 방법을 알려드려요.

출처: 문서

본문

onToolCall 콜백을 TypeScript에서 사용할 때, 도구 속성을 직접 addToolOutput에 전달하려고 하면 타입 에러가 발생할 수 있어요.

문제 (Problem)

정적(static) 도구와 동적(dynamic) 도구가 모두 있을 때 TypeScript가 toolCall.toolName의 타입을 자동으로 좁힐(narrow) 수 없어 타입 에러가 나요:

// ❌ 이러면 TypeScript 에러가 나요
const { messages, sendMessage, addToolOutput } = useChat({
  async onToolCall({ toolCall }) {
    addToolOutput({
      tool: toolCall.toolName, // Type 'string' is not assignable to type '"yourTool" | "yourOtherTool"'
      toolCallId: toolCall.toolCallId,
      output: someOutput,
    });
  },
});

에러가 발생하는 이유:

  • 정적 도구는 이름에 특정 리터럴 타입이 있어요 (예: "getWeatherInformation")
  • 동적 도구는 toolName이 일반적인 string이에요
  • TypeScript는 toolCall.toolName이 특정 도구 이름과 일치한다고 보장할 수 없어요

해결 방법 (Solution)

먼저 도구가 동적인지 확인해 적절한 타입 좁히기를 활성화하세요:

// ✅ 타입 좁히기가 있는 올바른 접근
const { messages, sendMessage, addToolOutput } = useChat({
  async onToolCall({ toolCall }) {
    // 먼저 동적 도구인지 확인
    if (toolCall.dynamic) {
      return;
    }

    // 이제 TypeScript는 올바른 타입을 가진 정적 도구라는 걸 알아요
    addToolOutput({
      tool: toolCall.toolName, // 타입 에러 없음!
      toolCallId: toolCall.toolCallId,
      output: someOutput,
    });
  },
});

참고: deprecated된 addToolResult 메서드를 아직 쓰고 있다면 이 해결책이 동일하게 적용돼요. 최신 API와의 일관성을 위해 addToolOutput으로 마이그레이션하는 것을 고려해보세요.

관련 항목

더 알아보기 (Learn more)