{"id":26877,"date":"2025-12-07T19:20:29","date_gmt":"2025-12-07T19:20:29","guid":{"rendered":"https:\/\/pokecon.jp\/job\/?p=26877"},"modified":"2025-12-07T19:20:29","modified_gmt":"2025-12-07T19:20:29","slug":"typescript-%e5%90%91%e3%81%91%e3%81%ae-ai-%e3%83%95%e3%83%ac%e3%83%bc%e3%83%a0%e3%83%af%e3%83%bc%e3%82%af-tanstack-ai-%e3%82%92%e8%a9%a6%e3%81%97%e3%81%a6%e3%81%bf%e3%81%9f","status":"publish","type":"post","link":"https:\/\/pokecon.jp\/job\/26877\/","title":{"rendered":"TypeScript \u5411\u3051\u306e AI \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af TanStack AI \u3092\u8a66\u3057\u3066\u307f\u305f"},"content":{"rendered":"\n<\/p>\n<div>\n<p>AI \u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306e\u958b\u767a\u3092\u3059\u308b\u4e0a\u3067 LLM \u306e API \u547c\u3073\u51fa\u3057\u3092\u62bd\u8c61\u5316\u3057\u3066\u304f\u308c\u308b\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306f\u6b20\u304b\u305b\u306a\u3044\u3082\u306e\u3068\u8a00\u3048\u308b\u3067\u3057\u3087\u3046\u3002OpenAI \u3084 Anthropic \u306a\u3069\u306e\u4e3b\u8981\u306a LLM \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306f\u305d\u308c\u305e\u308c\u516c\u5f0f SDK \u3092\u63d0\u4f9b\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u305d\u308c\u305e\u308c\u7570\u306a\u308b\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3092\u63d0\u4f9b\u3057\u3066\u3044\u308b\u305f\u3081\u8907\u6570\u306e LLM \u30e2\u30c7\u30eb\u3092\u5207\u308a\u66ff\u3048\u306a\u304c\u3089\u958b\u767a\u3059\u308b\u5834\u5408\u306b\u306f\u7169\u96d1\u3055\u304c\u5897\u3057\u3066\u3057\u307e\u3044\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u5dee\u7570\u3092\u5438\u53ce\u3057\u3066\u304f\u308c\u308b\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3068\u3057\u3066 TypeScript \u306a\u3089 <a target=\"_blank\" href=\"https:\/\/ai-sdk.dev\/\">AI SDK<\/a>\u3001Python \u306a\u3089 <a target=\"_blank\" href=\"https:\/\/langchain.com\/\">LangChain<\/a> \u304c\u3088\u304f\u77e5\u3089\u308c\u3066\u3044\u307e\u3059\u3002\u3053\u308c\u3089\u306e SDK \u306f\u6700\u4f4e\u9650\u306e\u6a5f\u80fd\u306e\u307f\u3092\u63d0\u4f9b\u3057\u30b7\u30f3\u30d7\u30eb\u306a\u62bd\u8c61\u5316\u304c\u884c\u308f\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u521d\u3081\u306b\u5c0e\u5165\u3057\u3084\u3059\u3044\u3068\u3044\u3046\u5229\u70b9\u304c\u3042\u308a\u307e\u3059\u3002\u307e\u305f AI SDK \u306a\u3089 <a target=\"_blank\" href=\"https:\/\/mastra.ai\/\">Mastra<\/a> \u3084 <a target=\"_blank\" href=\"https:\/\/voltagent.dev\/\">VoltAgent<\/a>\u3001LangChain \u306a\u3089 <a target=\"_blank\" href=\"https:\/\/langgraph.com\/\">LangGraph<\/a> \u306a\u3069\u306e\u3088\u308a\u9ad8\u6a5f\u80fd\u306a\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e\u57fa\u76e4\u3068\u3057\u3066\u3082\u5229\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>AI SDK \u3084 LangChain \u306e\u3088\u3046\u306b\u30b7\u30f3\u30d7\u30eb\u306a AI \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3068\u3057\u3066 <a target=\"_blank\" href=\"https:\/\/tanstack.com\/ai\/latest\">TanStack AI<\/a> \u304c\u6700\u8fd1\u30ea\u30ea\u30fc\u30b9\u3055\u308c\u307e\u3057\u305f\u3002TanStack AI \u306f TypeScript\/JavaScript \u5411\u3051\u306e\u8efd\u91cf\u306a AI SDK \u3067\u3001TanStack \u30c1\u30fc\u30e0\u304c\u958b\u767a\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u8a18\u4e8b\u3067\u306f TanStack AI \u306e\u6982\u8981\u3068\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n<h2 id=\"tanstack-ai-\u3092\u4f7f\u3063\u3066\u307f\u308b\"><a target=\"_blank\" aria-hidden=\"true\" tabindex=\"-1\" href=\"#tanstack-ai-\u3092\u4f7f\u3063\u3066\u307f\u308b\"><span class=\"icon icon-link\"\/><\/a>TanStack AI \u3092\u4f7f\u3063\u3066\u307f\u308b<\/h2>\n<p>\u521d\u3081\u306b\u6700\u3082\u57fa\u672c\u7684\u306a AI \u547c\u3073\u51fa\u3057\u306e\u4f8b\u3092\u8a66\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/p>\n<figure data-rehype-pretty-code-figure=\"\">\n<pre style=\"background-color:#212121;color:#EEFFFF\" tabindex=\"0\" data-language=\"bash\" data-theme=\"material-theme-darker\"><code data-language=\"bash\" data-theme=\"material-theme-darker\" style=\"display: grid;\"><span data-line=\"\"><span style=\"color:#FFCB6B\">npm<\/span><span style=\"color:#C3E88D\"> install<\/span><span style=\"color:#C3E88D\"> @tanstack\/ai<\/span><span style=\"color:#C3E88D\"> @tanstack\/ai-anthropic<\/span><\/span><\/code><\/pre>\n<\/figure>\n<p><code>@tanstack\/ai<\/code> \u306f TanStack AI \u306e\u30b3\u30a2\u30d1\u30c3\u30b1\u30fc\u30b8\u3067\u3059\u3002\u30c1\u30e3\u30c3\u30c8\u3084\u30c4\u30fc\u30eb\u547c\u3073\u51fa\u3057\u306a\u3069\u306e\u57fa\u672c\u7684\u306a\u6a5f\u80fd\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002<code>@tanstack\/ai-anthropic<\/code> \u306f Anthropic \u793e\u306e Claude \u30e2\u30c7\u30eb\u3092\u5229\u7528\u3059\u308b\u305f\u3081\u306e\u30a2\u30c0\u30d7\u30bf\u30fc\u30d1\u30c3\u30b1\u30fc\u30b8\u3067\u3059\u3002LLM \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3054\u3068\u306b <code>@tanstack\/ai-openai<\/code> \u3084 <code>@tanstack\/ai-gemini<\/code> \u306a\u3069\u306e\u30a2\u30c0\u30d7\u30bf\u30fc\u30d1\u30c3\u30b1\u30fc\u30b8\u304c\u63d0\u4f9b\u3055\u308c\u3066\u3044\u307e\u3059\u3002LLM \u30e2\u30c7\u30eb\u3092\u5909\u66f4\u3057\u305f\u3044\u5834\u5408\u306f\u30a2\u30c0\u30d7\u30bf\u30fc\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u5dee\u3057\u66ff\u3048\u308b\u3060\u3051\u3067\u6e08\u3080\u305f\u3081\u3001\u30b3\u30fc\u30c9\u306e\u5909\u66f4\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p><code>@tanstack\/ai-anthropic<\/code> \u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306b\u306f\u3001\u74b0\u5883\u5909\u6570 <code>ANTHROPIC_API_KEY<\/code> \u306b Anthropic API \u30ad\u30fc\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<figure data-rehype-pretty-code-figure=\"\">\n<pre style=\"background-color:#212121;color:#EEFFFF\" tabindex=\"0\" data-language=\"bash\" data-theme=\"material-theme-darker\"><code data-language=\"bash\" data-theme=\"material-theme-darker\" style=\"display: grid;\"><span data-line=\"\"><span style=\"color:#C792EA\">export<\/span><span style=\"color:#EEFFFF\"> ANTHROPIC_API_KEY<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">your_api_key_here<\/span><span style=\"color:#89DDFF\">\"<\/span><\/span><\/code><\/pre>\n<\/figure>\n<p>TanStack AI \u3092\u4f7f\u3063\u3066 Claude \u306b\u7c21\u5358\u306a\u30d7\u30ed\u30f3\u30d7\u30c8\u3092\u9001\u4fe1\u3059\u308b\u30b3\u30fc\u30c9\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<figure data-rehype-pretty-code-figure=\"\">\n<pre style=\"background-color:#212121;color:#EEFFFF\" tabindex=\"0\" data-language=\"typescript\" data-theme=\"material-theme-darker\"><code data-language=\"typescript\" data-theme=\"material-theme-darker\" style=\"display: grid;\"><span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">import<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> chat<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF;font-style:italic\"> from<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">@tanstack\/ai<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">import<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> anthropic<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF;font-style:italic\"> from<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">@tanstack\/ai-anthropic<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">const<\/span><span style=\"color:#EEFFFF\"> stream <\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#82AAFF\"> chat<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  adapter<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#82AAFF\"> anthropic<\/span><span style=\"color:#EEFFFF\">()<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  messages<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> [<\/span><span style=\"color:#89DDFF\">{<\/span><span style=\"color:#F07178\"> role<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">user<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#F07178\"> content<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">\u3053\u3093\u306b\u3061\u306f\u3001\u53ef\u611b\u3044\u72ac\u3067\u3059\u306d\uff01<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#EEFFFF\">]<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  model<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">claude-haiku-4-5<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">}<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">for<\/span><span style=\"color:#89DDFF;font-style:italic\"> await<\/span><span style=\"color:#EEFFFF\"> (<\/span><span style=\"color:#C792EA\">const<\/span><span style=\"color:#EEFFFF\"> chunk <\/span><span style=\"color:#89DDFF\">of<\/span><span style=\"color:#EEFFFF\"> stream) <\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">  switch<\/span><span style=\"color:#F07178\"> (<\/span><span style=\"color:#EEFFFF\">chunk<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">type<\/span><span style=\"color:#F07178\">) <\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">content<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      process<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">stdout<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">write<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#EEFFFF\">chunk<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">delta<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">      break<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">done<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">log<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#EEFFFF\">\\n\\n<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">log<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">Response completed. Finish reason:<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\"> +<\/span><span style=\"color:#EEFFFF\"> chunk<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">finishReason<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">      break<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">error<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">error<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">Error:<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> chunk<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">error<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">      break<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">tool_call<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">tool_result<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">tool-input-available<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">approval-requested<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">thinking<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">      \/\/ \u305d\u306e\u4ed6\u306e\u30c1\u30e3\u30f3\u30af\u30bf\u30a4\u30d7\u306f\u7701\u7565...<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">      break<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  }<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">}<\/span><\/span><\/code><\/pre>\n<\/figure>\n<p><code>@tanstack\/ai<\/code> \u30d1\u30c3\u30b1\u30fc\u30b8\u306e <code>chat<\/code> \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066 LLM \u306b\u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1\u3057\u3066\u3044\u307e\u3059\u3002<code>chat<\/code> \u95a2\u6570\u306f\u975e\u540c\u671f\u30a4\u30c6\u30ec\u30fc\u30bf\u3092\u8fd4\u3059\u305f\u3081\u3001<code>for await...of<\/code> \u30eb\u30fc\u30d7\u3067\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u53d7\u3051\u53d6\u308c\u307e\u3059\u3002\u5404\u30c1\u30e3\u30f3\u30af\u306e <code>type<\/code> \u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u78ba\u8a8d\u3057\u3066\u3001\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u8ffd\u52a0\u3001\u5b8c\u4e86\u3001\u30a8\u30e9\u30fc\u306a\u3069\u306e\u30a4\u30d9\u30f3\u30c8\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><code>chunk.type<\/code> \u304c <code>content<\/code> \u306e\u5834\u5408\u3001<code>chunk.delta<\/code> \u306b\u65b0\u3057\u3044\u30c6\u30ad\u30b9\u30c8\u306e\u65ad\u7247\u304c\u542b\u307e\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u3053\u308c\u3092\u6a19\u6e96\u51fa\u529b\u306b\u66f8\u304d\u8fbc\u3093\u3067\u3044\u307e\u3059\u3002\u30b3\u30fc\u30c9\u3092\u5b9f\u884c\u3057\u305f\u7d50\u679c\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u3067\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<figure data-rehype-pretty-code-figure=\"\">\n<pre style=\"background-color:#212121;color:#EEFFFF\" tabindex=\"0\" data-language=\"sh\" data-theme=\"material-theme-darker\"><code data-language=\"sh\" data-theme=\"material-theme-darker\" style=\"display: grid;\"><span data-line=\"\"><span style=\"color:#FFCB6B\">\u3053\u3093\u306b\u3061\u306f\uff01\u3042\u308a\u304c\u3068\u3046\u3054\u3056\u3044\u307e\u3059\ud83d\ude0a<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#FFCB6B\">\u305f\u3060\u3001\u79c1\u306fAI\u30a2\u30b7\u30b9\u30bf\u30f3\u30c8\u306a\u306e\u3067\u3001\u5b9f\u306f\u72ac\u3067\u306f\u306a\u304f\u3001\u30c6\u30ad\u30b9\u30c8\u30d9\u30fc\u30b9\u306e\u4f1a\u8a71\u76f8\u624b\u3067\u3059\u3002\u3082\u3057\u53ef\u611b\u3044\u72ac\u306e\u5199\u771f\u3084\u52d5\u753b\u306b\u3064\u3044\u3066\u8a71\u3057\u305f\u3044\u306e\u3067\u3042\u308c\u3070\u3001\u559c\u3093\u3067\u304a\u8a71\u3057\u3067\u304d\u307e\u3059\u3088\uff01<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#FFCB6B\">\u4f55\u304b\u304a\u624b\u4f1d\u3044\u3067\u304d\u308b\u3053\u3068\u306f\u3042\u308a\u307e\u3059\u304b<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#FFCB6B\">\uff1fResponse<\/span><span style=\"color:#C3E88D\"> completed.<\/span><span style=\"color:#C3E88D\"> Finish<\/span><span style=\"color:#C3E88D\"> reason:stop<\/span><\/span><\/code><\/pre>\n<\/figure>\n<h2 id=\"\u30c4\u30fc\u30eb\u306e\u547c\u3073\u51fa\u3057\"><a target=\"_blank\" aria-hidden=\"true\" tabindex=\"-1\" href=\"#\u30c4\u30fc\u30eb\u306e\u547c\u3073\u51fa\u3057\"><span class=\"icon icon-link\"\/><\/a>\u30c4\u30fc\u30eb\u306e\u547c\u3073\u51fa\u3057<\/h2>\n<p>\u30c4\u30fc\u30eb\u306f AI \u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u5916\u90e8\u306e API \u3084\u30b5\u30fc\u30d3\u30b9\u3068\u9023\u643a\u3059\u308b\u305f\u3081\u306e\u91cd\u8981\u306a\u6a5f\u80fd\u3067\u3059\u3002TanStack AI \u306b\u304a\u3051\u308b\u30c4\u30fc\u30eb\u306f\u4ee5\u4e0b\u306e 3 \u3064\u306e\u7279\u5fb4\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<ul>\n<li>\u30b5\u30fc\u30d0\u30fc\u3068\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u4e21\u65b9\u3067\u52d5\u4f5c\u53ef\u80fd<\/li>\n<li>\u30c4\u30fc\u30eb\u306e\u5b9a\u7fa9\u3068\u5b9f\u88c5\u304c\u5206\u96e2\u3055\u308c\u3066\u3044\u308b<\/li>\n<li><a target=\"_blank\" href=\"https:\/\/zod.dev\/\">Zod<\/a> \u306b\u3088\u308b\u578b\u5b89\u5168\u306a\u30b9\u30ad\u30fc\u30de<\/li>\n<\/ul>\n<p>\u30c4\u30fc\u30eb\u306e\u5b9a\u7fa9\u3068\u5b9f\u88c5\u304c\u5206\u96e2\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u540c\u3058\u30c4\u30fc\u30eb\u5b9a\u7fa9\u3092\u30b5\u30fc\u30d0\u30fc\u3068\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u4e21\u65b9\u3067\u5171\u6709\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u4f8b\u3048\u3070\u300c\u30b7\u30e7\u30c3\u30d4\u30f3\u30b0\u30ab\u30fc\u30c8\u306b\u5546\u54c1\u3092\u8ffd\u52a0\u3059\u308b\u300d\u30c4\u30fc\u30eb\u3092\u5b9a\u7fa9\u3057\u3001\u30b5\u30fc\u30d0\u30fc\u30b5\u30a4\u30c9\u304b\u3089 AI \u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u547c\u3073\u51fa\u3055\u308c\u305f\u5834\u5408\u306b\u306f DB \u306b\u5546\u54c1\u3092\u8ffd\u52a0\u3057\u3001\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30b5\u30a4\u30c9\u304b\u3089\u547c\u3073\u51fa\u3055\u308c\u305f\u5834\u5408\u306b\u306f\u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u5546\u54c1\u3092\u8ffd\u52a0\u3059\u308b\u3001\u3068\u3044\u3063\u305f\u3053\u3068\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<p>\u30c4\u30fc\u30eb\u306e\u5b9a\u7fa9\u306f <code>@tanstack\/ai<\/code> \u30d1\u30c3\u30b1\u30fc\u30b8\u306e <code>toolDefinition<\/code> \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u884c\u3044\u307e\u3059\u3002\u5b9a\u7fa9\u3055\u308c\u305f\u30c4\u30fc\u30eb\u306b\u5bfe\u3057\u3066\u5b9f\u88c5\u3092\u63d0\u4f9b\u3059\u308b\u306b\u306f <code>.server()<\/code> \u307e\u305f\u306f <code>.client()<\/code> \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002\u4ee5\u4e0b\u306e\u4f8b\u3067\u306f\u300c\u73fe\u5728\u306e\u5929\u6c17\u3092\u53d6\u5f97\u3059\u308b\u300d\u30c4\u30fc\u30eb\u3092\u5b9a\u7fa9\u3057\u3001\u30b5\u30fc\u30d0\u30fc\u30b5\u30a4\u30c9\u3067\u5b9f\u88c5\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<figure data-rehype-pretty-code-figure=\"\">\n<pre style=\"background-color:#212121;color:#EEFFFF\" tabindex=\"0\" data-language=\"typescript\" data-theme=\"material-theme-darker\"><code data-language=\"typescript\" data-theme=\"material-theme-darker\" style=\"display: grid;\"><span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">import<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> chat<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> toolDefinition<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF;font-style:italic\"> from<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">@tanstack\/ai<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">import<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> anthropic<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF;font-style:italic\"> from<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">@tanstack\/ai-anthropic<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">import<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> z<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF;font-style:italic\"> from<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">zod<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">const<\/span><span style=\"color:#EEFFFF\"> weatherToolDef <\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#82AAFF\"> toolDefinition<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  name<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">getWeather<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  description<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">Get the current weather for a given location.<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  inputSchema<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">object<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    location<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">string<\/span><span style=\"color:#EEFFFF\">()<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">describe<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">The location to get the weather for.<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  }<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  outputSchema<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">object<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    temperature<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">number<\/span><span style=\"color:#EEFFFF\">()<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">describe<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">The current temperature in Celsius.<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    condition<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      .<\/span><span style=\"color:#82AAFF\">string<\/span><span style=\"color:#EEFFFF\">()<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      .<\/span><span style=\"color:#82AAFF\">describe<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">A brief description of the weather condition.<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  }<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">}<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">const<\/span><span style=\"color:#EEFFFF\"> getWeatherServer <\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#EEFFFF\"> weatherToolDef<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">server<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#C792EA\">async<\/span><span style=\"color:#89DDFF\"> ({<\/span><span style=\"color:#EEFFFF;font-style:italic\"> location<\/span><span style=\"color:#89DDFF\"> })<\/span><span style=\"color:#C792EA\"> =&gt;<\/span><span style=\"color:#89DDFF\"> {<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">  \/\/ \u30c0\u30df\u30fc\u306e\u5929\u6c17\u30c7\u30fc\u30bf\u3092\u8fd4\u3059<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">  return<\/span><span style=\"color:#89DDFF\"> {<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    temperature<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#F78C6C\"> 22<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    condition<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> `<\/span><span style=\"color:#C3E88D\">Sunny in <\/span><span style=\"color:#89DDFF\">${<\/span><span style=\"color:#EEFFFF\">location<\/span><span style=\"color:#89DDFF\">}`<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  };<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">}<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span><\/code><\/pre>\n<\/figure>\n<p>\u5b9f\u88c5\u3057\u305f\u30c4\u30fc\u30eb\u306f <code>chat<\/code> \u95a2\u6570\u306e <code>tools<\/code> \u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u6e21\u3059\u3053\u3068\u3067\u3001AI \u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304b\u3089\u547c\u3073\u51fa\u305b\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002\u30c4\u30fc\u30eb\u306e\u5b9a\u7fa9\u3092\u6e21\u3057\u305f\u5834\u5408\u3001AI \u306e <code>tool_call<\/code> \u8981\u6c42\u306b\u5bfe\u3057\u3066\u624b\u52d5\u3067\u5fdc\u7b54\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30c4\u30fc\u30eb\u306e\u81ea\u52d5\u547c\u3073\u51fa\u3057\u3092\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u3001\u5b9f\u88c5\u6e08\u307f\u306e\u30c4\u30fc\u30eb\u3092 <code>tools<\/code> \u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u6e21\u3057\u307e\u3059\u3002<\/p>\n<figure data-rehype-pretty-code-figure=\"\">\n<pre style=\"background-color:#212121;color:#EEFFFF\" tabindex=\"0\" data-language=\"typescript\" data-theme=\"material-theme-darker\"><code data-language=\"typescript\" data-theme=\"material-theme-darker\" style=\"display: grid;\"><span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">import<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> chat<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> toolDefinition<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF;font-style:italic\"> from<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">@tanstack\/ai<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">import<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> anthropic<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF;font-style:italic\"> from<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">@tanstack\/ai-anthropic<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">import<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> z<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF;font-style:italic\"> from<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">zod<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">const<\/span><span style=\"color:#EEFFFF\"> weatherToolDef <\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#82AAFF\"> toolDefinition<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">{...}<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">const<\/span><span style=\"color:#EEFFFF\"> getWeatherServer <\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#EEFFFF\"> weatherToolDef<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">server<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">...<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">const<\/span><span style=\"color:#EEFFFF\"> stream <\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#82AAFF\"> chat<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  adapter<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#82AAFF\"> anthropic<\/span><span style=\"color:#EEFFFF\">()<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  messages<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> [<\/span><span style=\"color:#89DDFF\">{<\/span><span style=\"color:#F07178\"> role<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">user<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#F07178\"> content<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">\u6771\u4eac\u306e\u5929\u6c17\u3092\u6559\u3048\u3066\u304f\u3060\u3055\u3044\u3002<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#EEFFFF\">]<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  model<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">claude-haiku-4-5<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\" data-highlighted-line=\"\"><span style=\"color:#F07178\">  tools<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> [getWeatherServer]<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">}<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">for<\/span><span style=\"color:#89DDFF;font-style:italic\"> await<\/span><span style=\"color:#EEFFFF\"> (<\/span><span style=\"color:#C792EA\">const<\/span><span style=\"color:#EEFFFF\"> chunk <\/span><span style=\"color:#89DDFF\">of<\/span><span style=\"color:#EEFFFF\"> stream) <\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">  switch<\/span><span style=\"color:#F07178\"> (<\/span><span style=\"color:#EEFFFF\">chunk<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">type<\/span><span style=\"color:#F07178\">) <\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">content<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      process<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">stdout<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">write<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#EEFFFF\">chunk<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">delta<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">      break<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">done<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">log<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#EEFFFF\">\\n\\n<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">log<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">Response completed. Finish reason:<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\"> +<\/span><span style=\"color:#EEFFFF\"> chunk<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">finishReason<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">      break<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">error<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">error<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">Error:<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> chunk<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">error<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">      break<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">tool_call<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">log<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#EEFFFF\">\\n\\n<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">log<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">Tool Call:<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">log<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">Tool Name:<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> chunk<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">toolCall<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">function<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">name<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">log<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">Tool Arguments:<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> chunk<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">toolCall<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">function<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">arguments<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">      break<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">tool_result<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">log<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#EEFFFF\">\\n\\n<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">log<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">Tool Result:<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> chunk<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">content<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">      break<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">tool-input-available<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">approval-requested<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">thinking<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">      \/\/ \u305d\u306e\u4ed6\u306e\u30c1\u30e3\u30f3\u30af\u30bf\u30a4\u30d7\u306f\u7701\u7565...<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">      break<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  }<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">}<\/span><\/span><\/code><\/pre>\n<\/figure>\n<p>\u30b3\u30fc\u30c9\u3092\u5b9f\u884c\u3059\u308b\u3068\u3001AI \u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u5929\u6c17\u30c4\u30fc\u30eb\u3092\u547c\u3073\u51fa\u3057\u3001\u305d\u306e\u7d50\u679c\u3092\u53d7\u3051\u53d6\u308b\u69d8\u5b50\u304c\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\n<figure data-rehype-pretty-code-figure=\"\">\n<pre style=\"background-color:#212121;color:#EEFFFF\" tabindex=\"0\" data-language=\"sh\" data-theme=\"material-theme-darker\"><code data-language=\"sh\" data-theme=\"material-theme-darker\" style=\"display: grid;\"><span data-line=\"\"><span style=\"color:#FFCB6B\">\u6771\u4eac\u306e\u5929\u6c17\u3092\u78ba\u8a8d\u3044\u305f\u3057\u307e\u3059\u3002<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#FFCB6B\">Tool<\/span><span style=\"color:#C3E88D\"> Call:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#FFCB6B\">Tool<\/span><span style=\"color:#C3E88D\"> Name:<\/span><span style=\"color:#C3E88D\"> getWeather<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#FFCB6B\">Tool<\/span><span style=\"color:#C3E88D\"> Arguments:<\/span><span style=\"color:#C3E88D\"> on<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">: <\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">\u6771\u4eac<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">}<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#C3E88D\">Response completed. Finish reason:tool_calls<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#C3E88D\">Tool Result: {<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">temperature<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">:22,<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">condition<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">:<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">Sunny<\/span><span style=\"color:#C3E88D\"> in<\/span><span style=\"color:#C3E88D\"> \u6771\u4eac<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C3E88D\">\u6771\u4eac\u306e\u5929\u6c17\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#C3E88D\">- **\u6c17\u6e29**: 22\u2103<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C3E88D\">- **\u5929\u6c17**: \u6674\u308c<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#C3E88D\">\u826f\u3044\u5929\u6c17\u306e\u3088\u3046\u3067\u3059\u306e\u3067\u3001\u304a\u51fa\u304b\u3051\u306b\u9069\u3057\u305f\u65e5\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u306d\u3002<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#C3E88D\">Response completed. Finish reason:stop<\/span><\/span><\/code><\/pre>\n<\/figure>\n<h3 id=\"\u30c4\u30fc\u30eb\u306e\u5b9f\u884c\u306b\u5bfe\u3059\u308b\u627f\u8a8d\"><a target=\"_blank\" aria-hidden=\"true\" tabindex=\"-1\" href=\"#\u30c4\u30fc\u30eb\u306e\u5b9f\u884c\u306b\u5bfe\u3059\u308b\u627f\u8a8d\"><span class=\"icon icon-link\"\/><\/a>\u30c4\u30fc\u30eb\u306e\u5b9f\u884c\u306b\u5bfe\u3059\u308b\u627f\u8a8d<\/h3>\n<p>AI \u304c\u30c4\u30fc\u30eb\u3092\u901a\u3058\u3066\u30b3\u30fc\u30c9\u3084\u30b7\u30a7\u30eb\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u306a\u3069\u306e\u5371\u967a\u306a\u64cd\u4f5c\u3092\u3059\u308b\u5834\u5408\u3001\u5b9f\u884c\u524d\u306b\u30e6\u30fc\u30b6\u30fc\u306e\u627f\u8a8d\u3092\u6c42\u3081\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002TanStack AI \u3067\u30c4\u30fc\u30eb\u306e\u5b9f\u884c\u524d\u306b\u30e6\u30fc\u30b6\u30fc\u306b\u8a31\u53ef\u3092\u6c42\u3081\u308b\u3088\u3046\u306b\u3059\u308b\u306b\u306f\u3001<code>toolDefinition<\/code> \u95a2\u6570\u306e <code>needsApproval<\/code> \u30aa\u30d7\u30b7\u30e7\u30f3\u3092 <code>true<\/code> \u306b\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<figure data-rehype-pretty-code-figure=\"\">\n<pre style=\"background-color:#212121;color:#EEFFFF\" tabindex=\"0\" data-language=\"typescript\" data-theme=\"material-theme-darker\"><code data-language=\"typescript\" data-theme=\"material-theme-darker\" style=\"display: grid;\"><span data-line=\"\"><span style=\"color:#C792EA\">const<\/span><span style=\"color:#EEFFFF\"> weatherToolDef <\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#82AAFF\"> toolDefinition<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  name<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">getWeather<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  description<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">Get the current weather for a given location.<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  inputSchema<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">object<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    location<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">string<\/span><span style=\"color:#EEFFFF\">()<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">describe<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">The location to get the weather for.<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  }<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  outputSchema<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">object<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    temperature<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">number<\/span><span style=\"color:#EEFFFF\">()<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">describe<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">The current temperature in Celsius.<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    condition<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      .<\/span><span style=\"color:#82AAFF\">string<\/span><span style=\"color:#EEFFFF\">()<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      .<\/span><span style=\"color:#82AAFF\">describe<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">A brief description of the weather condition.<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  }<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\" data-highlighted-line=\"\"><span style=\"color:#F07178\">  needsApproval<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#FF9CAC\"> true<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">}<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span><\/code><\/pre>\n<\/figure>\n<p><code>needsApproval<\/code> \u3092 <code>true<\/code> \u306b\u8a2d\u5b9a\u3059\u308b\u3068\u3001AI \u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u30c4\u30fc\u30eb\u3092\u547c\u3073\u51fa\u3059\u524d\u306b <code>approval-requested<\/code> \u30c1\u30e3\u30f3\u30af\u304c\u9001\u4fe1\u3055\u308c\u307e\u3059\u3002\u30e6\u30fc\u30b6\u30fc\u306f\u3053\u306e\u30c1\u30e3\u30f3\u30af\u3092\u53d7\u3051\u53d6\u3063\u305f\u5f8c\u3001\u30c4\u30fc\u30eb\u306e\u5b9f\u884c\u3092\u627f\u8a8d\u307e\u305f\u306f\u62d2\u5426\u3067\u304d\u307e\u3059\u3002<\/p>\n<figure data-rehype-pretty-code-figure=\"\">\n<pre style=\"background-color:#212121;color:#EEFFFF\" tabindex=\"0\" data-language=\"typescript\" data-theme=\"material-theme-darker\"><code data-language=\"typescript\" data-theme=\"material-theme-darker\" style=\"display: grid;\"><span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">for<\/span><span style=\"color:#89DDFF;font-style:italic\"> await<\/span><span style=\"color:#EEFFFF\"> (<\/span><span style=\"color:#C792EA\">const<\/span><span style=\"color:#EEFFFF\"> chunk <\/span><span style=\"color:#89DDFF\">of<\/span><span style=\"color:#EEFFFF\"> stream) <\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">  switch<\/span><span style=\"color:#F07178\"> (<\/span><span style=\"color:#EEFFFF\">chunk<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">type<\/span><span style=\"color:#F07178\">) <\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">    \/\/ \u7701\u7565...<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    case<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">approval-requested<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">log<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#EEFFFF\">\\n\\n<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">log<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">Approval Requested for Tool:<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">log<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">Tool Name:<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> chunk<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">toolCall<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">function<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">name<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      console<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">log<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">Tool Arguments:<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> chunk<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">toolCall<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">function<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">arguments<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">      \/\/ \u30c4\u30fc\u30eb\u306e\u5b9f\u884c\u3092\u627f\u8a8d<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">      break<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">    \/\/ \u7701\u7565...<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  }<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">}<\/span><\/span><\/code><\/pre>\n<\/figure>\n<h2 id=\"nextjs-\u3067-tanstack-ai-\u3092\u4f7f\u3046\"><a target=\"_blank\" aria-hidden=\"true\" tabindex=\"-1\" href=\"#nextjs-\u3067-tanstack-ai-\u3092\u4f7f\u3046\"><span class=\"icon icon-link\"\/><\/a>Next.js \u3067 TanStack AI \u3092\u4f7f\u3046<\/h2>\n<p>\u3053\u3053\u304b\u3089\u306f\u3088\u308a\u5b9f\u8df5\u7684\u306a\u4f8b\u3068\u3057\u3066\u3001Next.js \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067 TanStack AI \u3092\u4f7f\u7528\u3057\u3066\u7c21\u5358\u306a AI \u30c1\u30e3\u30c3\u30c8\u30dc\u30c3\u30c8\u3092\u4f5c\u6210\u3059\u308b\u65b9\u6cd5\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002\u307e\u305a\u306f Next.js \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u3001\u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/p>\n<figure data-rehype-pretty-code-figure=\"\">\n<pre style=\"background-color:#212121;color:#EEFFFF\" tabindex=\"0\" data-language=\"bash\" data-theme=\"material-theme-darker\"><code data-language=\"bash\" data-theme=\"material-theme-darker\" style=\"display: grid;\"><span data-line=\"\"><span style=\"color:#FFCB6B\">npx<\/span><span style=\"color:#C3E88D\"> create-next-app@latest<\/span><span style=\"color:#C3E88D\"> tanstack-ai-chatbot<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#82AAFF\">cd<\/span><span style=\"color:#C3E88D\"> tanstack-ai-chatbot<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#FFCB6B\">npm<\/span><span style=\"color:#C3E88D\"> install<\/span><span style=\"color:#C3E88D\"> @tanstack\/ai<\/span><span style=\"color:#C3E88D\"> @tanstack\/ai-anthropic<\/span><span style=\"color:#C3E88D\"> @tanstack\/ai-react<\/span><span style=\"color:#C3E88D\"> zod<\/span><\/span><\/code><\/pre>\n<\/figure>\n<p><code>.env<\/code> \u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u3001Anthropic API \u30ad\u30fc\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<figure data-rehype-pretty-code-figure=\"\">\n<pre style=\"background-color:#212121;color:#EEFFFF\" tabindex=\"0\" data-language=\"env\" data-theme=\"material-theme-darker\"><code data-language=\"env\" data-theme=\"material-theme-darker\" style=\"display: grid;\"><span data-line=\"\"><span>ANTHROPIC_API_KEY=\"your_api_key_here\"<\/span><\/span><\/code><\/pre>\n<\/figure>\n<h3 id=\"api-\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u306e\u4f5c\u6210\"><a target=\"_blank\" aria-hidden=\"true\" tabindex=\"-1\" href=\"#api-\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u306e\u4f5c\u6210\"><span class=\"icon icon-link\"\/><\/a>API \u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u306e\u4f5c\u6210<\/h3>\n<p>Next.js \u306e <a target=\"_blank\" href=\"https:\/\/nextjs.org\/docs\/app\/getting-started\/route-handlers\">Route Handlers<\/a> \u3092\u4f7f\u7528\u3057\u3066\u3001\u30b5\u30fc\u30d0\u30fc\u30b5\u30a4\u30c9\u3067 TanStack AI \u3092\u547c\u3073\u51fa\u3059\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<code>app\/api\/chat\/route.ts<\/code> \u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u3001\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n<p>app\/api\/chat\/route.ts<\/p>\n<figure data-rehype-pretty-code-figure=\"\">\n<pre style=\"background-color:#212121;color:#EEFFFF\" tabindex=\"0\" data-language=\"typescript\" data-theme=\"material-theme-darker\"><code data-language=\"typescript\" data-theme=\"material-theme-darker\" style=\"display: grid;\"><span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">import<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> chat<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> toolDefinition<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> toStreamResponse<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF;font-style:italic\"> from<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">@tanstack\/ai<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">import<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> anthropic<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF;font-style:italic\"> from<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">@tanstack\/ai-anthropic<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">import<\/span><span style=\"color:#EEFFFF\"> z <\/span><span style=\"color:#89DDFF;font-style:italic\">from<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">zod<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">const<\/span><span style=\"color:#EEFFFF\"> weatherToolDef <\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#82AAFF\"> toolDefinition<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  name<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">getWeather<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  description<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">Get the current weather for a given location.<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  inputSchema<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">object<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    location<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">string<\/span><span style=\"color:#EEFFFF\">()<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">describe<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">The location to get the weather for.<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  }<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  outputSchema<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">object<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    temperature<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">number<\/span><span style=\"color:#EEFFFF\">()<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">describe<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">The current temperature in Celsius.<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    condition<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> z<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      .<\/span><span style=\"color:#82AAFF\">string<\/span><span style=\"color:#EEFFFF\">()<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      .<\/span><span style=\"color:#82AAFF\">describe<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">A brief description of the weather condition.<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  }<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">}<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">const<\/span><span style=\"color:#EEFFFF\"> getWeatherServer <\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#EEFFFF\"> weatherToolDef<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">server<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#C792EA\">async<\/span><span style=\"color:#89DDFF\"> ({<\/span><span style=\"color:#EEFFFF;font-style:italic\"> location<\/span><span style=\"color:#89DDFF\"> })<\/span><span style=\"color:#C792EA\"> =&gt;<\/span><span style=\"color:#89DDFF\"> {<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">  \/\/ \u30c0\u30df\u30fc\u306e\u5929\u6c17\u30c7\u30fc\u30bf\u3092\u8fd4\u3059<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">  return<\/span><span style=\"color:#89DDFF\"> {<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    temperature<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#F78C6C\"> 22<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    condition<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> `<\/span><span style=\"color:#C3E88D\">Sunny in <\/span><span style=\"color:#89DDFF\">${<\/span><span style=\"color:#EEFFFF\">location<\/span><span style=\"color:#89DDFF\">}`<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  };<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">}<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">export<\/span><span style=\"color:#C792EA\"> async<\/span><span style=\"color:#C792EA\"> function<\/span><span style=\"color:#82AAFF\"> POST<\/span><span style=\"color:#89DDFF\">(<\/span><span style=\"color:#EEFFFF;font-style:italic\">request<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#FFCB6B\"> Request<\/span><span style=\"color:#89DDFF\">)<\/span><span style=\"color:#89DDFF\"> {<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">  \/\/ API \u30ad\u30fc\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u308b\u304b\u78ba\u8a8d<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">  if<\/span><span style=\"color:#F07178\"> (<\/span><span style=\"color:#89DDFF\">!<\/span><span style=\"color:#EEFFFF\">process<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">env<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">ANTHROPIC_API_KEY<\/span><span style=\"color:#F07178\">) <\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    return<\/span><span style=\"color:#89DDFF\"> new<\/span><span style=\"color:#82AAFF\"> Response<\/span><span style=\"color:#F07178\">(<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      JSON<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">stringify<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">        error<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">ANTHROPIC_API_KEY not configured<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      }<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      {<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">        status<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#F78C6C\"> 500<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">        headers<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#F07178\">Content-Type<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">application\/json<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\"> },<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      }<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    )<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  }<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">  \/\/ \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304b\u3089\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u30dc\u30c7\u30a3\u306e messages \u3068 conversationId \u3092\u53d6\u5f97<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">  \/\/ \u3053\u306e\u5f8c\u767b\u5834\u3059\u308b useChat Hook \u304b\u3089\u9001\u4fe1\u3055\u308c\u308b<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">  const<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> messages<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> conversationId<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF\"> =<\/span><span style=\"color:#89DDFF;font-style:italic\"> await<\/span><span style=\"color:#EEFFFF\"> request<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">json<\/span><span style=\"color:#F07178\">()<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">  try<\/span><span style=\"color:#89DDFF\"> {<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">    const<\/span><span style=\"color:#EEFFFF\"> stream<\/span><span style=\"color:#89DDFF\"> =<\/span><span style=\"color:#82AAFF\"> chat<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">      adapter<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#82AAFF\"> anthropic<\/span><span style=\"color:#F07178\">()<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      messages<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">      model<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">claude-haiku-4-5<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      conversationId<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">      tools<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#F07178\"> [<\/span><span style=\"color:#EEFFFF\">getWeatherServer<\/span><span style=\"color:#F07178\">]<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">    }<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">    \/\/ HTTP \u30b9\u30c8\u30ea\u30fc\u30e0\u30ec\u30b9\u30dd\u30f3\u30b9\u306b\u5909\u63db\u3057\u3066\u8fd4\u3059<\/span><\/span>\n<span data-line=\"\" data-highlighted-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    return<\/span><span style=\"color:#82AAFF\"> toStreamResponse<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#EEFFFF\">stream<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  }<\/span><span style=\"color:#89DDFF;font-style:italic\"> catch<\/span><span style=\"color:#89DDFF\"> (<\/span><span style=\"color:#EEFFFF;font-style:italic\">error<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#FFCB6B\"> any<\/span><span style=\"color:#89DDFF\">)<\/span><span style=\"color:#89DDFF\"> {<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    return<\/span><span style=\"color:#89DDFF\"> new<\/span><span style=\"color:#82AAFF\"> Response<\/span><span style=\"color:#F07178\">(<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">      JSON<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">stringify<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">        error<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#EEFFFF\"> error<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">message<\/span><span style=\"color:#89DDFF\"> ||<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">An error occurred<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      }<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      {<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">        status<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#F78C6C\"> 500<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">        headers<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#F07178\">Content-Type<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">application\/json<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\"> },<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      }<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    )<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  }<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">}<\/span><\/span><\/code><\/pre>\n<\/figure>\n<p>Next.js \u306e Route Handlers \u3067\u306f <code>POST<\/code> \u95a2\u6570\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3057\u3066 POST \u30ea\u30af\u30a8\u30b9\u30c8\u3092\u51e6\u7406\u3057\u307e\u3059\u3002\u30ea\u30af\u30a8\u30b9\u30c8\u30dc\u30c7\u30a3\u304b\u3089\u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u3068\u4f1a\u8a71 ID \u3092\u53d6\u5f97\u3057\u3001TanStack AI \u306e <code>chat<\/code> \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066 Claude \u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1\u3057\u3066\u3044\u307e\u3059\u3002<code>toStreamResponse<\/code> \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u3001\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u30ec\u30b9\u30dd\u30f3\u30b9\u3092 HTTP \u30ec\u30b9\u30dd\u30f3\u30b9\u306b\u5909\u63db\u3057\u3066\u8fd4\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<h3 id=\"\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30b5\u30a4\u30c9\u306e\u5b9f\u88c5\"><a target=\"_blank\" aria-hidden=\"true\" tabindex=\"-1\" href=\"#\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30b5\u30a4\u30c9\u306e\u5b9f\u88c5\"><span class=\"icon icon-link\"\/><\/a>\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30b5\u30a4\u30c9\u306e\u5b9f\u88c5<\/h3>\n<p>\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30b5\u30a4\u30c9\u3067\u306f\u3001<code>@tanstack\/ai-react<\/code> \u30d1\u30c3\u30b1\u30fc\u30b8\u306e <code>useChat<\/code> \u30d5\u30c3\u30af\u3092\u4f7f\u7528\u3057\u3066\u30c1\u30e3\u30c3\u30c8\u306e\u72b6\u614b\u3092\u7ba1\u7406\u3057\u307e\u3059\u3002<code>app\/Chat.tsx<\/code> \u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u3001\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n<p>app\/Chat.tsx<\/p>\n<figure data-rehype-pretty-code-figure=\"\">\n<pre style=\"background-color:#212121;color:#EEFFFF\" tabindex=\"0\" data-language=\"tsx\" data-theme=\"material-theme-darker\"><code data-language=\"tsx\" data-theme=\"material-theme-darker\" style=\"display: grid;\"><span data-line=\"\"><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">use client<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">import<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> useState<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF;font-style:italic\"> from<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">react<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">import<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> useChat<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> fetchServerSentEvents<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF;font-style:italic\"> from<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">@tanstack\/ai-react<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">export<\/span><span style=\"color:#C792EA\"> function<\/span><span style=\"color:#82AAFF\"> Chat<\/span><span style=\"color:#89DDFF\">()<\/span><span style=\"color:#89DDFF\"> {<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">  const<\/span><span style=\"color:#89DDFF\"> [<\/span><span style=\"color:#EEFFFF\">input<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> setInput<\/span><span style=\"color:#89DDFF\">]<\/span><span style=\"color:#89DDFF\"> =<\/span><span style=\"color:#82AAFF\"> useState<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"\"<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">  const<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> messages<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> sendMessage<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> isLoading<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> reload<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF\"> stop<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF\"> =<\/span><span style=\"color:#82AAFF\"> useChat<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">    connection<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#82AAFF\"> fetchServerSentEvents<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">\/api\/chat<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">,<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  }<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">  const<\/span><span style=\"color:#EEFFFF\"> handleSubmit<\/span><span style=\"color:#89DDFF\"> =<\/span><span style=\"color:#89DDFF\"> (<\/span><span style=\"color:#EEFFFF;font-style:italic\">e<\/span><span style=\"color:#89DDFF\">:<\/span><span style=\"color:#FFCB6B\"> React<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#FFCB6B\">FormEvent<\/span><span style=\"color:#89DDFF\">)<\/span><span style=\"color:#C792EA\"> =&gt;<\/span><span style=\"color:#89DDFF\"> {<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">    e<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">preventDefault<\/span><span style=\"color:#F07178\">()<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">    if<\/span><span style=\"color:#F07178\"> (<\/span><span style=\"color:#EEFFFF\">input<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">trim<\/span><span style=\"color:#F07178\">() <\/span><span style=\"color:#89DDFF\">&amp;&amp;<\/span><span style=\"color:#89DDFF\"> !<\/span><span style=\"color:#EEFFFF\">isLoading<\/span><span style=\"color:#F07178\">) <\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#82AAFF\">      sendMessage<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#EEFFFF\">input<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#82AAFF\">      setInput<\/span><span style=\"color:#F07178\">(<\/span><span style=\"color:#89DDFF\">\"\"<\/span><span style=\"color:#F07178\">)<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">    }<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">  };<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">  return<\/span><span style=\"color:#F07178\"> (<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">    &lt;<\/span><span style=\"color:#F07178\">div<\/span><span style=\"color:#C792EA\"> className<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">flex flex-col h-full max-w-2xl mx-auto p-4 border rounded-lg<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      &lt;<\/span><span style=\"color:#F07178\">div<\/span><span style=\"color:#C792EA\"> className<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">flex-1 overflow-y-auto mb-4<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">        {<\/span><span style=\"color:#EEFFFF\">messages<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">map<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">(<\/span><span style=\"color:#EEFFFF;font-style:italic\">msg<\/span><span style=\"color:#89DDFF\">)<\/span><span style=\"color:#C792EA\"> =&gt;<\/span><span style=\"color:#EEFFFF\"> (<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">          &lt;<\/span><span style=\"color:#F07178\">div<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">            key<\/span><span style=\"color:#89DDFF\">={<\/span><span style=\"color:#EEFFFF\">msg<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">id<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">            className<\/span><span style=\"color:#89DDFF\">={<\/span><span style=\"color:#89DDFF\">`<\/span><span style=\"color:#C3E88D\">mb-2 p-2 rounded <\/span><span style=\"color:#89DDFF\">${<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">              msg<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">role <\/span><span style=\"color:#89DDFF\">===<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">user<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\"> ?<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">bg-blue-100 self-end<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\"> :<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">bg-gray-200<\/span><span style=\"color:#89DDFF\">\"<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">            }`<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">          &gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">            &lt;<\/span><span style=\"color:#F07178\">strong<\/span><span style=\"color:#89DDFF\">&gt;{<\/span><span style=\"color:#EEFFFF\">msg<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">role <\/span><span style=\"color:#89DDFF\">===<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">user<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\"> ?<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">You<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\"> :<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">Bot<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">}<\/span><span style=\"color:#EEFFFF\">:<\/span><span style=\"color:#89DDFF\"><!--<\/span--><span style=\"color:#F07178\">strong<\/span><span style=\"color:#89DDFF\">&gt;{<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">            {<\/span><span style=\"color:#EEFFFF\">msg<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">parts<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">map<\/span><span style=\"color:#EEFFFF\">(<\/span><span style=\"color:#89DDFF\">(<\/span><span style=\"color:#EEFFFF;font-style:italic\">part<\/span><span style=\"color:#89DDFF\">,<\/span><span style=\"color:#EEFFFF;font-style:italic\"> index<\/span><span style=\"color:#89DDFF\">)<\/span><span style=\"color:#C792EA\"> =&gt;<\/span><span style=\"color:#89DDFF\"> {<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">              \/\/ \u601d\u8003\u4e2d<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">              if<\/span><span style=\"color:#F07178\"> (<\/span><span style=\"color:#EEFFFF\">part<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">type<\/span><span style=\"color:#89DDFF\"> ===<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">thinking<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#F07178\">) <\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">                return<\/span><span style=\"color:#F07178\"> (<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">                  &lt;<\/span><span style=\"color:#F07178\">span<\/span><span style=\"color:#C792EA\"> key<\/span><span style=\"color:#89DDFF\">={<\/span><span style=\"color:#EEFFFF\">index<\/span><span style=\"color:#89DDFF\">} <\/span><span style=\"color:#C792EA\">className<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">italic text-gray-500<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">                    \ud83e\udd14 Thinking: <\/span><span style=\"color:#89DDFF\">{<\/span><span style=\"color:#EEFFFF\">part<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">content<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">                  <!--<\/span--><span style=\"color:#F07178\">span<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">                )<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">              }<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">              \/\/ \u30c4\u30fc\u30eb\u547c\u3073\u51fa\u3057<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">              if<\/span><span style=\"color:#F07178\"> (<\/span><span style=\"color:#EEFFFF\">part<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">type<\/span><span style=\"color:#89DDFF\"> ===<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">tool-call<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#F07178\">) <\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">                return<\/span><span style=\"color:#F07178\"> (<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">                  &lt;<\/span><span style=\"color:#F07178\">span<\/span><span style=\"color:#C792EA\"> key<\/span><span style=\"color:#89DDFF\">={<\/span><span style=\"color:#EEFFFF\">index<\/span><span style=\"color:#89DDFF\">} <\/span><span style=\"color:#C792EA\">className<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">italic text-green-600<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">                    \ud83d\udee0\ufe0f Calling tool: <\/span><span style=\"color:#89DDFF\">{<\/span><span style=\"color:#EEFFFF\">part<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">name<\/span><span style=\"color:#89DDFF\">}<\/span><span style=\"color:#EEFFFF\"> with input<\/span><span style=\"color:#89DDFF\">{<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">                    {<\/span><span style=\"color:#EEFFFF\">JSON<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">stringify<\/span><span style=\"color:#EEFFFF\">(part<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">input)<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">                  <!--<\/span--><span style=\"color:#F07178\">span<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">                )<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">              }<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">              \/\/ \u30c4\u30fc\u30eb\u306e\u7d50\u679c<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">              if<\/span><span style=\"color:#F07178\"> (<\/span><span style=\"color:#EEFFFF\">part<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">type<\/span><span style=\"color:#89DDFF\"> ===<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">tool-result<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#F07178\">) <\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">                return<\/span><span style=\"color:#F07178\"> (<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">                  &lt;<\/span><span style=\"color:#F07178\">span<\/span><span style=\"color:#C792EA\"> key<\/span><span style=\"color:#89DDFF\">={<\/span><span style=\"color:#EEFFFF\">index<\/span><span style=\"color:#89DDFF\">} <\/span><span style=\"color:#C792EA\">className<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">italic text-purple-600<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">                    \ud83d\udee0\ufe0f Tool result: <\/span><span style=\"color:#89DDFF\">{<\/span><span style=\"color:#EEFFFF\">JSON<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#82AAFF\">stringify<\/span><span style=\"color:#EEFFFF\">(part<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">content)<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">                  <!--<\/span--><span style=\"color:#F07178\">span<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">                )<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">              }<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#545454;font-style:italic\">              \/\/ \u901a\u5e38\u306e\u30ec\u30b9\u30dd\u30f3\u30b9<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">              if<\/span><span style=\"color:#F07178\"> (<\/span><span style=\"color:#EEFFFF\">part<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">type<\/span><span style=\"color:#89DDFF\"> ===<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">text<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#F07178\">) <\/span><span style=\"color:#89DDFF\">{<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">                return<\/span><span style=\"color:#89DDFF\"> &lt;<\/span><span style=\"color:#F07178\">span<\/span><span style=\"color:#C792EA\"> key<\/span><span style=\"color:#89DDFF\">={<\/span><span style=\"color:#EEFFFF\">index<\/span><span style=\"color:#89DDFF\">}&gt;{<\/span><span style=\"color:#EEFFFF\">part<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">content<\/span><span style=\"color:#89DDFF\">}<!--<\/span--><span style=\"color:#F07178\">span<\/span><span style=\"color:#89DDFF\">&gt;;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">              }<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">              return<\/span><span style=\"color:#89DDFF\"> null;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">            }<\/span><span style=\"color:#EEFFFF\">)<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">          <!--<\/span--><span style=\"color:#F07178\">div<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">        ))<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">        {<\/span><span style=\"color:#EEFFFF\">messages<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">length <\/span><span style=\"color:#89DDFF\">&gt;<\/span><span style=\"color:#F78C6C\"> 0<\/span><span style=\"color:#89DDFF\"> &amp;&amp;<\/span><span style=\"color:#89DDFF\"> !<\/span><span style=\"color:#EEFFFF\">isLoading <\/span><span style=\"color:#89DDFF\">&amp;&amp;<\/span><span style=\"color:#EEFFFF\"> (<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">          &lt;<\/span><span style=\"color:#F07178\">button<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">            onClick<\/span><span style=\"color:#89DDFF\">={<\/span><span style=\"color:#EEFFFF\">reload<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">            className<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">mb-4 px-4 py-2 bg-gray-300 rounded<\/span><span style=\"color:#89DDFF\">\"<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">          &gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">            \u7d50\u679c\u3092\u518d\u751f\u6210<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">          <!--<\/span--><span style=\"color:#F07178\">button<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">        )<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">        {<\/span><span style=\"color:#EEFFFF\">isLoading <\/span><span style=\"color:#89DDFF\">&amp;&amp;<\/span><span style=\"color:#EEFFFF\"> (<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">          &lt;<\/span><span style=\"color:#F07178\">button<\/span><span style=\"color:#C792EA\"> onClick<\/span><span style=\"color:#89DDFF\">={<\/span><span style=\"color:#EEFFFF\">stop<\/span><span style=\"color:#89DDFF\">} <\/span><span style=\"color:#C792EA\">className<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">mb-4 px-4 py-2 bg-red-300 rounded<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">            \u505c\u6b62<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">          <!--<\/span--><span style=\"color:#F07178\">button<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#EEFFFF\">        )<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      <!--<\/span--><span style=\"color:#F07178\">div<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      &lt;<\/span><span style=\"color:#F07178\">form<\/span><span style=\"color:#C792EA\"> onSubmit<\/span><span style=\"color:#89DDFF\">={<\/span><span style=\"color:#EEFFFF\">handleSubmit<\/span><span style=\"color:#89DDFF\">} <\/span><span style=\"color:#C792EA\">className<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">flex<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">        &lt;<\/span><span style=\"color:#F07178\">input<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">          type<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">text<\/span><span style=\"color:#89DDFF\">\"<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">          value<\/span><span style=\"color:#89DDFF\">={<\/span><span style=\"color:#EEFFFF\">input<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">          onChange<\/span><span style=\"color:#89DDFF\">={(<\/span><span style=\"color:#EEFFFF;font-style:italic\">e<\/span><span style=\"color:#89DDFF\">)<\/span><span style=\"color:#C792EA\"> =&gt;<\/span><span style=\"color:#82AAFF\"> setInput<\/span><span style=\"color:#EEFFFF\">(e<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">target<\/span><span style=\"color:#89DDFF\">.<\/span><span style=\"color:#EEFFFF\">value)<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">          className<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">flex-1 border rounded-l px-4 py-2<\/span><span style=\"color:#89DDFF\">\"<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">          placeholder<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">Type your message...<\/span><span style=\"color:#89DDFF\">\"<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">          disabled<\/span><span style=\"color:#89DDFF\">={<\/span><span style=\"color:#EEFFFF\">isLoading<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">        \/&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">        &lt;<\/span><span style=\"color:#F07178\">button<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">          type<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">submit<\/span><span style=\"color:#89DDFF\">\"<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">          className<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">bg-blue-500 text-white px-4 py-2 rounded-r<\/span><span style=\"color:#89DDFF\">\"<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#C792EA\">          disabled<\/span><span style=\"color:#89DDFF\">={<\/span><span style=\"color:#EEFFFF\">isLoading<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">        &gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">          {<\/span><span style=\"color:#EEFFFF\">isLoading <\/span><span style=\"color:#89DDFF\">?<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">Sending...<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\"> :<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">Send<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">}<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">        <!--<\/span--><span style=\"color:#F07178\">button<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      <!--<\/span--><span style=\"color:#F07178\">form<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">    <!--<\/span--><span style=\"color:#F07178\">div<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  )<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/code><\/pre>\n<\/figure>\n<p><code>useChat<\/code> \u30d5\u30c3\u30af\u306e <code>connection<\/code> \u30aa\u30d7\u30b7\u30e7\u30f3\u306b <code>fetchServerSentEvents(\"\/api\/chat\")<\/code> \u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u3067\u3001\u5148\u307b\u3069\u4f5c\u6210\u3057\u305f API \u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3068\u63a5\u7d9a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>API \u304b\u3089\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u306f <code>messages<\/code> \u914d\u5217\u306b\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3053\u308c\u3092 <code>.map<\/code> \u30e1\u30bd\u30c3\u30c9\u3067\u8981\u7d20\u3054\u3068\u306b\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3057\u3066\u3044\u307e\u3059\u3002\u5404\u30e1\u30c3\u30bb\u30fc\u30b8\u306e <code>parts<\/code> \u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u78ba\u8a8d\u3057\u3001<code>type<\/code> \u306b\u5fdc\u3058\u3066\u601d\u8003\u4e2d\u3001\u30c4\u30fc\u30eb\u547c\u3073\u51fa\u3057\u3001\u30c4\u30fc\u30eb\u7d50\u679c\u3001\u901a\u5e38\u306e\u30c6\u30ad\u30b9\u30c8\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u8868\u793a\u3059\u308b\u3088\u3046\u306b\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><code>reload<\/code> \u95a2\u6570\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u76f4\u524d\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u306b\u5bfe\u3059\u308b\u5fdc\u7b54\u3092\u518d\u751f\u6210\u3057\u3001<code>stop<\/code> \u95a2\u6570\u306f\u73fe\u5728\u306e\u5fdc\u7b54\u3092\u505c\u6b62\u3057\u307e\u3059\u3002<\/p>\n<p>\u30d5\u30a9\u30fc\u30e0\u304c\u9001\u4fe1\u3055\u308c\u308b\u3068 <code>sendMessage<\/code> \u95a2\u6570\u304c\u547c\u3073\u51fa\u3055\u308c\u3001\u5165\u529b\u3055\u308c\u305f\u30e1\u30c3\u30bb\u30fc\u30b8\u304c Server Sent Events \u30ea\u30af\u30a8\u30b9\u30c8\u3068\u3057\u3066\u9001\u4fe1\u3055\u308c\u307e\u3059\u3002\u30dc\u30c7\u30a3\u30ea\u30af\u30a8\u30b9\u30c8\u306b\u306f <code>messages<\/code> \u914d\u5217\u3068 <code>conversationId<\/code> \u304c\u81ea\u52d5\u7684\u306b\u542b\u307e\u308c\u307e\u3059\u3002<\/p>\n<p>\u4f5c\u6210\u3057\u305f <code>Chat<\/code> \u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3092 <code>app\/page.tsx<\/code> \u306b\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u3066\u8868\u793a\u3057\u307e\u3059\u3002<\/p>\n<p>app\/page.tsx<\/p>\n<figure data-rehype-pretty-code-figure=\"\">\n<pre style=\"background-color:#212121;color:#EEFFFF\" tabindex=\"0\" data-language=\"tsx\" data-theme=\"material-theme-darker\"><code data-language=\"tsx\" data-theme=\"material-theme-darker\" style=\"display: grid;\"><span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">import<\/span><span style=\"color:#89DDFF\"> {<\/span><span style=\"color:#EEFFFF\"> Chat<\/span><span style=\"color:#89DDFF\"> }<\/span><span style=\"color:#89DDFF;font-style:italic\"> from<\/span><span style=\"color:#89DDFF\"> \"<\/span><span style=\"color:#C3E88D\">.\/Chat<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"> <\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">export<\/span><span style=\"color:#89DDFF;font-style:italic\"> default<\/span><span style=\"color:#C792EA\"> function<\/span><span style=\"color:#82AAFF\"> Home<\/span><span style=\"color:#89DDFF\">()<\/span><span style=\"color:#89DDFF\"> {<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF;font-style:italic\">  return<\/span><span style=\"color:#F07178\"> (<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">    &lt;<\/span><span style=\"color:#F07178\">div<\/span><span style=\"color:#C792EA\"> className<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">flex min-h-screen items-center justify-center bg-zinc-50 font-sans dark:bg-black<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      &lt;<\/span><span style=\"color:#F07178\">main<\/span><span style=\"color:#C792EA\"> className<\/span><span style=\"color:#89DDFF\">=<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#C3E88D\">flex min-h-screen w-full max-w-3xl flex-col items-center justify-between py-32 px-16 bg-white dark:bg-black sm:items-start<\/span><span style=\"color:#89DDFF\">\"<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">        &lt;<\/span><span style=\"color:#FFCB6B\">Chat<\/span><span style=\"color:#89DDFF\"> \/&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">      <!--<\/span--><span style=\"color:#F07178\">main<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">    <!--<\/span--><span style=\"color:#F07178\">div<\/span><span style=\"color:#89DDFF\">&gt;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#F07178\">  )<\/span><span style=\"color:#89DDFF\">;<\/span><\/span>\n<span data-line=\"\"><span style=\"color:#89DDFF\">}<\/span><\/span><\/span><\/span><\/code><\/pre>\n<\/figure>\n<p><code>npm run dev<\/code> \u30b3\u30de\u30f3\u30c9\u3067\u958b\u767a\u30b5\u30fc\u30d0\u30fc\u3092\u8d77\u52d5\u3057\u3001\u30d6\u30e9\u30a6\u30b6\u3067 <code>http:\/\/localhost:3000<\/code> \u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001\u7c21\u5358\u306a\u30c1\u30e3\u30c3\u30c8\u30dc\u30c3\u30c8\u304c\u52d5\u4f5c\u3057\u3066\u3044\u308b\u3053\u3068\u304c\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\n<h2 id=\"\u307e\u3068\u3081\"><a target=\"_blank\" aria-hidden=\"true\" tabindex=\"-1\" href=\"#\u307e\u3068\u3081\"><span class=\"icon icon-link\"\/><\/a>\u307e\u3068\u3081<\/h2>\n<ul>\n<li>TanStack AI \u306f TypeScript \u5411\u3051\u306e\u8efd\u91cf\u306a AI SDK \u3067\u3001\u8907\u6570\u306e LLM \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u62bd\u8c61\u5316\u3057\u3066\u5229\u7528\u3067\u304d\u308b<\/li>\n<li><code>chat<\/code> \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u9001\u4fe1\u3068\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u53d7\u4fe1\u304c\u53ef\u80fd<\/li>\n<li>TanStack AI \u3067\u306f\u30c4\u30fc\u30eb\u306e\u5b9a\u7fa9\u3068\u5b9f\u88c5\u304c\u5206\u96e2\u3055\u308c\u3066\u304a\u308a\u3001\u30b5\u30fc\u30d0\u30fc\u3068\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u4e21\u65b9\u3067\u5171\u6709\u3067\u304d\u308b\u3002<code>toolDefinition<\/code> \u95a2\u6570\u3067\u30c4\u30fc\u30eb\u3092\u5b9a\u7fa9\u3057\u3001<code>.server()<\/code> \u307e\u305f\u306f <code>.client()<\/code> \u30e1\u30bd\u30c3\u30c9\u3067\u5b9f\u88c5\u3092\u63d0\u4f9b\u3059\u308b<\/li>\n<li><code>toStreamResponse<\/code> \u95a2\u6570\u3092\u4f7f\u7528\u3057\u3066\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u751f\u6210\u3057\u3001Server Sent Events \u3068\u3057\u3066\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u9001\u4fe1\u3067\u304d\u308b<\/li>\n<li><code>@tanstack\/ai-react<\/code> \u30d1\u30c3\u30b1\u30fc\u30b8\u306e <code>useChat<\/code> \u30d5\u30c3\u30af\u3092\u4f7f\u7528\u3057\u3066\u3001React \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30b5\u30a4\u30c9\u3067\u30c1\u30e3\u30c3\u30c8\u306e\u72b6\u614b\u7ba1\u7406\u3068\u30e1\u30c3\u30bb\u30fc\u30b8\u9001\u4fe1\u3092\u884c\u3048\u308b<\/li>\n<li><code>connection<\/code> \u30aa\u30d7\u30b7\u30e7\u30f3\u306b <code>fetchServerSentEvents<\/code> \u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u3067\u3001Server Sent Events \u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3068\u63a5\u7d9a\u3067\u304d\u308b<\/li>\n<\/ul>\n<h2 id=\"\u53c2\u8003\"><a target=\"_blank\" aria-hidden=\"true\" tabindex=\"-1\" href=\"#\u53c2\u8003\"><span class=\"icon icon-link\"\/><\/a>\u53c2\u8003<\/h2>\n<\/div>\n\n<br \/><a href=\"https:\/\/azukiazusa.dev\/blog\/try-tanstack-ai\/\">\u5143\u306e\u8a18\u4e8b\u3092\u78ba\u8a8d\u3059\u308b <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"AI \u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306e\u958b\u767a\u3092\u3059\u308b\u4e0a\u3067 LLM \u306e API \u547c\u3073\u51fa\u3057\u3092\u62bd\u8c61\u5316\u3057\u3066\u304f\u308c\u308b\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306f\u6b20\u304b\u305b\u306a\u3044\u3082\u306e\u3068\u8a00\u3048\u308b\u3067\u3057\u3087\u3046\u3002OpenAI \u3084 Anthropic \u306a\u3069\u306e\u4e3b\u8981\u306a LLM \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306f\u305d\u308c\u305e\u308c\u516c\u5f0f S [&hellip;]","protected":false},"author":1,"featured_media":26878,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-26877","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hatena-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TypeScript \u5411\u3051\u306e AI \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af TanStack AI \u3092\u8a66\u3057\u3066\u307f\u305f - \u30dd\u30b1\u30b3\u30f3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/azukiazusa.dev\/blog\/try-tanstack-ai\/\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TypeScript \u5411\u3051\u306e AI \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af TanStack AI \u3092\u8a66\u3057\u3066\u307f\u305f - \u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"og:description\" content=\"AI \u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306e\u958b\u767a\u3092\u3059\u308b\u4e0a\u3067 LLM \u306e API \u547c\u3073\u51fa\u3057\u3092\u62bd\u8c61\u5316\u3057\u3066\u304f\u308c\u308b\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306f\u6b20\u304b\u305b\u306a\u3044\u3082\u306e\u3068\u8a00\u3048\u308b\u3067\u3057\u3087\u3046\u3002OpenAI \u3084 Anthropic \u306a\u3069\u306e\u4e3b\u8981\u306a LLM \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306f\u305d\u308c\u305e\u308c\u516c\u5f0f S [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/azukiazusa.dev\/blog\/try-tanstack-ai\/\" \/>\n<meta property=\"og:site_name\" content=\"\u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-07T19:20:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/try-tanstack-ai.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"info@pokecon.jp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"info@pokecon.jp\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"6\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/azukiazusa.dev\\\/blog\\\/try-tanstack-ai\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/26877\\\/\"},\"author\":{\"name\":\"info@pokecon.jp\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"headline\":\"TypeScript \u5411\u3051\u306e AI \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af TanStack AI \u3092\u8a66\u3057\u3066\u307f\u305f\",\"datePublished\":\"2025-12-07T19:20:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/26877\\\/\"},\"wordCount\":131,\"image\":{\"@id\":\"https:\\\/\\\/azukiazusa.dev\\\/blog\\\/try-tanstack-ai\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/try-tanstack-ai.png\",\"articleSection\":[\"\u306f\u3066\u306a\u30d6\u30ed\u30b0\"],\"inLanguage\":\"ja\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/26877\\\/\",\"url\":\"https:\\\/\\\/azukiazusa.dev\\\/blog\\\/try-tanstack-ai\\\/\",\"name\":\"TypeScript \u5411\u3051\u306e AI \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af TanStack AI \u3092\u8a66\u3057\u3066\u307f\u305f - \u30dd\u30b1\u30b3\u30f3\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/azukiazusa.dev\\\/blog\\\/try-tanstack-ai\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/azukiazusa.dev\\\/blog\\\/try-tanstack-ai\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/try-tanstack-ai.png\",\"datePublished\":\"2025-12-07T19:20:29+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/azukiazusa.dev\\\/blog\\\/try-tanstack-ai\\\/#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/azukiazusa.dev\\\/blog\\\/try-tanstack-ai\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/azukiazusa.dev\\\/blog\\\/try-tanstack-ai\\\/#primaryimage\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/try-tanstack-ai.png\",\"contentUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/try-tanstack-ai.png\",\"width\":1200,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/azukiazusa.dev\\\/blog\\\/try-tanstack-ai\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TypeScript \u5411\u3051\u306e AI \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af TanStack AI \u3092\u8a66\u3057\u3066\u307f\u305f\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\",\"name\":\"\u30dd\u30b1\u30b3\u30f3\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\",\"name\":\"info@pokecon.jp\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"caption\":\"info@pokecon.jp\"},\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/author\\\/infopokecon-jp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"TypeScript \u5411\u3051\u306e AI \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af TanStack AI \u3092\u8a66\u3057\u3066\u307f\u305f - \u30dd\u30b1\u30b3\u30f3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/azukiazusa.dev\/blog\/try-tanstack-ai\/","og_locale":"ja_JP","og_type":"article","og_title":"TypeScript \u5411\u3051\u306e AI \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af TanStack AI \u3092\u8a66\u3057\u3066\u307f\u305f - \u30dd\u30b1\u30b3\u30f3","og_description":"AI \u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306e\u958b\u767a\u3092\u3059\u308b\u4e0a\u3067 LLM \u306e API \u547c\u3073\u51fa\u3057\u3092\u62bd\u8c61\u5316\u3057\u3066\u304f\u308c\u308b\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306f\u6b20\u304b\u305b\u306a\u3044\u3082\u306e\u3068\u8a00\u3048\u308b\u3067\u3057\u3087\u3046\u3002OpenAI \u3084 Anthropic \u306a\u3069\u306e\u4e3b\u8981\u306a LLM \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306f\u305d\u308c\u305e\u308c\u516c\u5f0f S [&hellip;]","og_url":"https:\/\/azukiazusa.dev\/blog\/try-tanstack-ai\/","og_site_name":"\u30dd\u30b1\u30b3\u30f3","article_published_time":"2025-12-07T19:20:29+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/try-tanstack-ai.png","type":"image\/png"}],"author":"info@pokecon.jp","twitter_card":"summary_large_image","twitter_misc":{"\u57f7\u7b46\u8005":"info@pokecon.jp","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"6\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/azukiazusa.dev\/blog\/try-tanstack-ai\/#article","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/26877\/"},"author":{"name":"info@pokecon.jp","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"headline":"TypeScript \u5411\u3051\u306e AI \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af TanStack AI \u3092\u8a66\u3057\u3066\u307f\u305f","datePublished":"2025-12-07T19:20:29+00:00","mainEntityOfPage":{"@id":"https:\/\/pokecon.jp\/job\/26877\/"},"wordCount":131,"image":{"@id":"https:\/\/azukiazusa.dev\/blog\/try-tanstack-ai\/#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/try-tanstack-ai.png","articleSection":["\u306f\u3066\u306a\u30d6\u30ed\u30b0"],"inLanguage":"ja"},{"@type":"WebPage","@id":"https:\/\/pokecon.jp\/job\/26877\/","url":"https:\/\/azukiazusa.dev\/blog\/try-tanstack-ai\/","name":"TypeScript \u5411\u3051\u306e AI \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af TanStack AI \u3092\u8a66\u3057\u3066\u307f\u305f - \u30dd\u30b1\u30b3\u30f3","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/#website"},"primaryImageOfPage":{"@id":"https:\/\/azukiazusa.dev\/blog\/try-tanstack-ai\/#primaryimage"},"image":{"@id":"https:\/\/azukiazusa.dev\/blog\/try-tanstack-ai\/#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/try-tanstack-ai.png","datePublished":"2025-12-07T19:20:29+00:00","author":{"@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"breadcrumb":{"@id":"https:\/\/azukiazusa.dev\/blog\/try-tanstack-ai\/#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/azukiazusa.dev\/blog\/try-tanstack-ai\/"]}]},{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/azukiazusa.dev\/blog\/try-tanstack-ai\/#primaryimage","url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/try-tanstack-ai.png","contentUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/12\/try-tanstack-ai.png","width":1200,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/azukiazusa.dev\/blog\/try-tanstack-ai\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/pokecon.jp\/job\/"},{"@type":"ListItem","position":2,"name":"TypeScript \u5411\u3051\u306e AI \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af TanStack AI \u3092\u8a66\u3057\u3066\u307f\u305f"}]},{"@type":"WebSite","@id":"https:\/\/pokecon.jp\/job\/#website","url":"https:\/\/pokecon.jp\/job\/","name":"\u30dd\u30b1\u30b3\u30f3","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/pokecon.jp\/job\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997","name":"info@pokecon.jp","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","caption":"info@pokecon.jp"},"url":"https:\/\/pokecon.jp\/job\/author\/infopokecon-jp\/"}]}},"_links":{"self":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/26877","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/comments?post=26877"}],"version-history":[{"count":1,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/26877\/revisions"}],"predecessor-version":[{"id":26879,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/26877\/revisions\/26879"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media\/26878"}],"wp:attachment":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media?parent=26877"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/categories?post=26877"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/tags?post=26877"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}