AgentAPI

SDK и прямые запросы

AgentAPI совместим с OpenAI Chat Completions, поэтому подходит любой клиент, который позволяет задать base URL. Ключевое правило одно.

Base URL — https://api.agentapi.ru/v1/ai. Без /chat/completions на конце: SDK добавляет путь сам. Если передать полный путь, запрос уйдёт на …/v1/ai/chat/completions/chat/completions и вернёт 404.

OpenAI SDK (TypeScript)

npm install openai
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.AGENTAPI_KEY,
  baseURL: "https://api.agentapi.ru/v1/ai",
});

const completion = await client.chat.completions.create({
  model: "openai/gpt-4.1",
  messages: [{ role: "user", content: "Привет!" }],
  max_tokens: 500,
});

console.log(completion.choices[0].message.content);

Стриминг:

const stream = await client.chat.completions.create({
  model: "openai/gpt-4.1",
  messages: [{ role: "user", content: "Расскажи о Байкале" }],
  stream: true,
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}

OpenAI SDK (Python)

pip install openai
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["AGENTAPI_KEY"],
    base_url="https://api.agentapi.ru/v1/ai",
)

completion = client.chat.completions.create(
    model="openai/gpt-4.1",
    messages=[{"role": "user", "content": "Привет!"}],
    max_tokens=500,
)

print(completion.choices[0].message.content)
print(completion.usage.total_tokens, completion.usage.prompt_tokens)

Стриминг:

stream = client.chat.completions.create(
    model="openai/gpt-4.1",
    messages=[{"role": "user", "content": "Расскажи о Байкале"}],
    stream=True,
)

for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)

Vercel AI SDK

npm install ai @ai-sdk/openai-compatible
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
import { streamText } from "ai";

const agentapi = createOpenAICompatible({
  name: "agentapi",
  baseURL: "https://api.agentapi.ru/v1/ai",
  apiKey: process.env.AGENTAPI_KEY,
});

const result = streamText({
  model: agentapi("openai/gpt-4.1"),
  prompt: "Объясни event loop в двух абзацах",
});

for await (const chunk of result.textStream) {
  process.stdout.write(chunk);
}

LangChain

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="openai/gpt-4.1",
    api_key="agentapi-ВАШ_КЛЮЧ",
    base_url="https://api.agentapi.ru/v1/ai",
)

print(llm.invoke("Привет!").content)

Embeddings для векторного поиска:

from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(
    model="openai/text-embedding-3-small",
    api_key="agentapi-ВАШ_КЛЮЧ",
    base_url="https://api.agentapi.ru/v1/ai",
)

vector = embeddings.embed_query("Байкал")
print(len(vector))

Go

go get github.com/sashabaranov/go-openai
package main

import (
    "context"
    "fmt"
    "os"

    openai "github.com/sashabaranov/go-openai"
)

func main() {
    config := openai.DefaultConfig(os.Getenv("AGENTAPI_KEY"))
    config.BaseURL = "https://api.agentapi.ru/v1/ai"
    client := openai.NewClientWithConfig(config)

    resp, err := client.CreateChatCompletion(
        context.Background(),
        openai.ChatCompletionRequest{
            Model: "openai/gpt-4.1",
            Messages: []openai.ChatCompletionMessage{
                {Role: openai.ChatMessageRoleUser, Content: "Привет!"},
            },
        },
    )
    if err != nil {
        fmt.Printf("Ошибка: %v\n", err)
        return
    }

    fmt.Println(resp.Choices[0].Message.Content)
}

Без SDK: fetch

const response = await fetch(
  "https://api.agentapi.ru/v1/ai/chat/completions",
  {
    method: "POST",
    headers: {
      "x-api-key": process.env.AGENTAPI_KEY!,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      model: "openai/gpt-4.1",
      messages: [{ role: "user", content: "Привет!" }],
    }),
  },
);

if (!response.ok) {
  throw new Error(`AgentAPI ${response.status}: ${await response.text()}`);
}

const data = await response.json();
console.log(data.choices[0].message.content);

Ручной разбор SSE:

const response = await fetch(
  "https://api.agentapi.ru/v1/ai/chat/completions",
  {
    method: "POST",
    headers: {
      "x-api-key": process.env.AGENTAPI_KEY!,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      model: "openai/gpt-4.1",
      messages: [{ role: "user", content: "Привет!" }],
      stream: true,
    }),
  },
);

const reader = response.body!.getReader();
const decoder = new TextDecoder();
let buffer = "";

while (true) {
  const { done, value } = await reader.read();
  if (done) break;

  buffer += decoder.decode(value, { stream: true });
  const lines = buffer.split("\n");
  // Последняя строка может быть неполной — оставляем её в буфере.
  buffer = lines.pop() ?? "";

  for (const line of lines) {
    if (!line.startsWith("data: ")) continue;

    const payload = line.slice(6);
    if (payload === "[DONE]") continue;

    const chunk = JSON.parse(payload);

    // Ошибки приходят внутри потока при статусе 200.
    if (chunk.error) throw new Error(chunk.error.message);

    process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
  }
}

Что стоит помнить

Слаг моделиС префиксом провайдера: openai/gpt-4.1, не gpt-4.1
ЗаголовокapiKey в SDK уходит как Authorization: Bearer — этого достаточно
РасходТокены — в usage ответа, рублёвые списания — в транзакциях
ОшибкиНе в OpenAI-формате {error: {type, code}} — см. Ошибки
ИзображенияНе поддерживаются, см. Ограничения