Настройка TanStack AI
Подключите chat-сценарии TanStack AI к GonkaGate.
Подключите чат-сценарии TanStack AI к GonkaGate через один server route, один React-клиент и OpenAI-адаптер. Держите GONKAGATE_API_KEY на сервере и используйте актуальный model ID из GET /v1/models.
Эта страница покрывает путь useChat и SSE. Если вы работаете напрямую с AI SDK-примитивами вроде streamText, используйте настройку Vercel AI SDK для GonkaGate.
Установите пакеты
npm install @tanstack/ai @tanstack/ai-react @tanstack/ai-openaiЗадайте GONKAGATE_API_KEY
GONKAGATE_API_KEY=your_api_key_hereХраните ключ только на сервере. Не передавайте его в клиентский код.
Создайте один server route и один React-клиент
Самый короткий полезный вариант здесь: один server route и один React-клиент, которые используют один и тот же чат-путь через GonkaGate.
Server route
import { chat, toServerSentEventsResponse } from "@tanstack/ai";
import { createOpenaiChat } from "@tanstack/ai-openai";
const apiKey = process.env.GONKAGATE_API_KEY;
if (!apiKey) {
throw new Error("Set GONKAGATE_API_KEY");
}
const gonkagate = createOpenaiChat(apiKey, {
baseURL: "https://api.gonkagate.com/v1",
});
export async function POST(request: Request) {
const { messages } = await request.json();
const stream = chat({
adapter: gonkagate("qwen/qwen3-235b-a22b-instruct-2507-fp8"),
messages,
});
return toServerSentEventsResponse(stream);
}React client
"use client";
import { useState } from "react";
import { fetchServerSentEvents, useChat } from "@tanstack/ai-react";
export function Chat() {
const [input, setInput] = useState("");
const { messages, sendMessage, isLoading, error } = useChat({
connection: fetchServerSentEvents("/api/chat"),
});
return (
<div>
{messages.map((message) => (
<div key={message.id}>
{message.parts.map((part, index) =>
part.type === "text" ? <p key={index}>{part.content}</p> : null
)}
</div>
))}
{error ? <p>{error.message}</p> : null}
<form
onSubmit={(event) => {
event.preventDefault();
if (!input.trim() || isLoading) return;
void sendMessage(input);
setInput("");
}}
>
<input value={input} onChange={(event) => setInput(event.target.value)} />
<button type="submit" disabled={isLoading}>
Send
</button>
</form>
</div>
);
}Замените пример model ID на актуальное значение из GET /v1/models.
Проверьте чат-путь
Отправьте Return exactly: TanStack AI connected через chat UI. Успех означает, что ответ стримится в клиент через useChat.
Держите SSE-пару вместе
- На сервере оставьте
toServerSentEventsResponse(stream), а на клиентеfetchServerSentEvents("/api/chat"). - Держите
GONKAGATE_API_KEYв том server runtime, который обрабатывает route.
Частые ошибки
| Ответ или симптом | Что это обычно значит | Что делать |
|---|---|---|
401 invalid_api_key | Server route не видит GONKAGATE_API_KEY или ключ невалиден | Перепроверьте Аутентификацию и API-ключи |
404 model_not_found | ID модели устарел или не поддерживается | Обновите его через GET /v1/models или гайд по выбору моделей |
429 insufficient_quota | Для запроса не хватает средств на предоплаченном USD-балансе | Сначала пополните баланс |
429 rate_limit_exceeded | Вы упёрлись в лимит запросов | Учитывайте Retry-After и добавьте bounded backoff |
| Route отвечает, но UI не стримит | Сервер и клиент больше не используют один и тот же SSE-путь | Возвращайте toServerSentEventsResponse(stream) из route и оставьте fetchServerSentEvents("/api/chat") на клиенте |
См. также
- Гайд по миграции с OpenAI на GonkaGate если вы переводите больше одного OpenAI-compatible чат-пути
- Настройка Vercel AI SDK для GonkaGate если приложение работает напрямую с AI SDK-примитивами вроде
streamText - TanStack AI OpenAI adapter docs для параметров адаптера
- TanStack AI React chat example для более полного end-to-end примера