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}} — см. Ошибки |
| Изображения | Не поддерживаются, см. Ограничения |