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)
- useChat — 채팅 훅
- Dynamic Tools — 동적 도구