Skip to main content

Настройка 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
GONKAGATE_API_KEY=your_api_key_here

Храните ключ только на сервере. Не передавайте его в клиентский код.

Создайте один server route и один React-клиент

Самый короткий полезный вариант здесь: один server route и один React-клиент, которые используют один и тот же чат-путь через GonkaGate.

Server route

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

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_keyServer route не видит GONKAGATE_API_KEY или ключ невалиденПерепроверьте Аутентификацию и API-ключи
404 model_not_foundID модели устарел или не поддерживаетсяОбновите его через GET /v1/models или гайд по выбору моделей
429 insufficient_quotaДля запроса не хватает средств на предоплаченном USD-балансеСначала пополните баланс
429 rate_limit_exceededВы упёрлись в лимит запросовУчитывайте Retry-After и добавьте bounded backoff
Route отвечает, но UI не стримитСервер и клиент больше не используют один и тот же SSE-путьВозвращайте toServerSentEventsResponse(stream) из route и оставьте fetchServerSentEvents("/api/chat") на клиенте

См. также

Была ли эта страница полезной?