Модуль 4.3 · Урок 1
SDK вендоров: Anthropic, OpenAI, Vercel
Содержание
- Введение
- Anthropic Agent SDK
- Архитектура
- Два режима работы
- Пример: агент с пользовательским инструментом
- Подключение внешних MCP-серверов
- TypeScript-версия
- OpenAI Agents SDK
- Три примитива
- Пример: система с handoffs
- Guardrails
- Встроенный трейсинг
- Провайдер-агностичность
- Vercel AI SDK
- Особенности
- Пример: агент с инструментами
- Смена провайдера
- Streaming в React
- MCP в Vercel AI SDK v6
- Сравнительная таблица
- Когда какой выбрать
- Доступность из России
Введение
Открытые фреймворки вроде LangChain и CrewAI решают задачу оркестрации агентов, но у них есть слабое место: они работают поверх API провайдеров, а не вместе с ними. Каждый новый релиз модели требует адаптации на стороне фреймворка, и обновления приходят с задержкой.
Вендорские SDK устраняют эту прослойку. Anthropic, OpenAI и Vercel выпустили собственные инструменты для построения агентов, которые используют возможности моделей напрямую, без абстракций-посредников.
Когда использовать вендорский SDK вместо открытого фреймворка:
- Вы работаете с одним провайдером и хотите максимум от его модели
- Вам нужна нативная поддержка новых функций в день релиза
- Вы строите production-систему и хотите минимум зависимостей
- Вам важна официальная документация и поддержка
Когда лучше открытый фреймворк:
- Вы переключаетесь между провайдерами регулярно
- Вам нужны специфичные абстракции (цепочки, графы, memory)
- Проект уже построен на LangChain/CrewAI и переписывать дорого
Anthropic Agent SDK
Репозиторий: github.com/anthropics/claude-agent-sdk-python (~5 300 stars)
Архитектура
Ключевая идея Anthropic Agent SDK: каждый пользовательский инструмент оформляется как in-process MCP-сервер. Это означает, что агент общается со своими инструментами по тому же протоколу, что и с внешними MCP-серверами. Единый интерфейс для всего.
graph LR
A[Agent] -->|MCP| B[Ваш инструмент]
A -->|MCP| C[Внешний MCP-сервер]
A -->|MCP| D[Файловая система]
A -->|API| E[Claude API]
style A fill:#f8fafc,stroke:#4f46e5,stroke-width:2px
style B fill:#f8fafc,stroke:#059669,stroke-width:2px
style C fill:#f8fafc,stroke:#059669,stroke-width:2px
style D fill:#f8fafc,stroke:#059669,stroke-width:2px
style E fill:#f8fafc,stroke:#2563eb,stroke-width:2px
Два режима работы
query() — одноразовый запрос. Агент получает задачу, выполняет её и завершается. Подходит для скриптов и автоматизации.
ClaudeSDKClient — сессия. Агент живёт в рамках сессии, сохраняет контекст между вызовами. Подходит для интерактивных приложений.
Пример: агент с пользовательским инструментом
from claude_agent_sdk import Agent, tool
@tool
def get_weather(city: str) -> str:
"""Получить погоду в городе"""
return f"В городе {city} солнечно, +22C"
agent = Agent(tools=[get_weather])
result = agent.query("Какая погода в Москве?")
print(result.text)
Декоратор @tool автоматически превращает функцию в MCP-совместимый инструмент. Docstring становится описанием инструмента для модели, типы аргументов извлекаются из аннотаций.
Подключение внешних MCP-серверов
from claude_agent_sdk import Agent, MCPServer
agent = Agent(
mcp_servers=[
MCPServer("npx", ["-y", "@anthropic/mcp-filesystem"]),
MCPServer("npx", ["-y", "@anthropic/mcp-git"]),
]
)
result = agent.query("Покажи структуру текущего проекта")
MCP-интеграция работает из коробки. Не нужно писать обёртки или адаптеры.
TypeScript-версия
SDK доступен и для TypeScript. API аналогичен Python-версии:
Anthropic Agent SDK -- TypeScript
OpenAI Agents SDK
Репозиторий: github.com/openai/openai-agents-python (~19 500 stars)
Три примитива
OpenAI Agents SDK построен на трёх концепциях:
Agents — агенты с инструкциями, инструментами и набором правил поведения.
Handoffs — механизм передачи управления между агентами. Текущий агент решает, что задача не его, и делегирует другому. Это уникальная особенность SDK.
Guardrails — валидация входных и выходных данных. Работают параллельно с основным вызовом модели, не замедляя обработку.
graph TD
U[Пользователь] --> A[Агент биллинга]
A -->|Handoff| B[Агент поддержки]
A -->|Handoff| C[Агент возвратов]
B -->|Handoff| A
C -->|Handoff| A
G1[Guardrail: ввод] -.->|Параллельно| A
G2[Guardrail: вывод] -.->|Параллельно| A
style U fill:#f8fafc,stroke:#64748b,stroke-width:2px
style A fill:#f8fafc,stroke:#4f46e5,stroke-width:2px
style B fill:#f8fafc,stroke:#2563eb,stroke-width:2px
style C fill:#f8fafc,stroke:#2563eb,stroke-width:2px
style G1 fill:#f8fafc,stroke:#059669,stroke-width:2px
style G2 fill:#f8fafc,stroke:#059669,stroke-width:2px
Пример: система с handoffs
OpenAI Agents SDK -- handoffs между агентами
Когда биллинг-агент получает вопрос, не связанный с оплатой, он автоматически передаёт управление агенту поддержки. Модель сама решает, когда выполнить handoff, на основе описания.
Guardrails
from agents import Agent, Runner, InputGuardrail, GuardrailFunctionOutput
async def check_language(ctx, agent, input_text):
"""Проверить, что запрос на русском языке"""
is_russian = any(c in input_text for c in "абвгдежз")
return GuardrailFunctionOutput(
output_info={"language": "ru" if is_russian else "other"},
tripwire_triggered=not is_russian,
)
agent = Agent(
name="Ассистент",
instructions="Отвечай на вопросы.",
input_guardrails=[
InputGuardrail(guardrail_function=check_language)
],
)
Guardrails выполняются параллельно с основным запросом к модели. Если guardrail срабатывает, ответ модели отбрасывается.
Встроенный трейсинг
Каждый вызов автоматически записывается в трейс. Трейсы визуализируются в OpenAI Dashboard: видно, какой агент обрабатывал запрос, какие инструменты вызывались, где произошёл handoff.
Провайдер-агностичность
Несмотря на название, SDK работает не только с OpenAI:
from agents import Agent, Runner, OpenAIChatCompletionsModel
from openai import AsyncOpenAI
client = AsyncOpenAI(
base_url="http://localhost:11434/v1", # Ollama
api_key="ollama",
)
agent = Agent(
name="Локальный агент",
model=OpenAIChatCompletionsModel(
model="llama4",
openai_client=client,
),
)
Любой сервер с OpenAI-совместимым API подходит: Ollama, vLLM, LiteLLM.
Vercel AI SDK
Репозиторий: github.com/vercel/ai (~22 400 stars)
Особенности
Vercel AI SDK — TypeScript-first библиотека для построения AI-приложений. Главное преимущество: лучшая в экосистеме интеграция с React и Next.js.
Унифицированный API провайдеров. Один и тот же код работает с OpenAI, Anthropic, Google, Mistral и десятками других. Смена провайдера — замена одной строки.
Streaming UI. Потоковый рендеринг ответов модели в React-компоненты из коробки. Не нужно вручную обрабатывать SSE или WebSocket.
v6: агенты и MCP. В версии 6 появилась абстракция Agent, поддержка MCP и встроенные DevTools для отладки.
Пример: агент с инструментами
import { openai } from '@ai-sdk/openai';
import { generateText, tool } from 'ai';
import { z } from 'zod';
const result = await generateText({
model: openai('gpt-4o'),
tools: {
weather: tool({
description: 'Получить погоду',
parameters: z.object({ city: z.string() }),
execute: async ({ city }) => `В ${city} солнечно, +22C`,
}),
},
maxSteps: 5,
prompt: 'Какая погода в Москве?',
});
Параметр maxSteps разрешает агенту выполнять несколько шагов: вызвать инструмент, обработать результат, вызвать следующий инструмент.
Смена провайдера
import { anthropic } from '@ai-sdk/anthropic';
import { google } from '@ai-sdk/google';
// Один и тот же код, разные модели
const result1 = await generateText({
model: anthropic('claude-sonnet-4-6'),
prompt: 'Объясни квантовые вычисления',
});
const result2 = await generateText({
model: google('gemini-2.0-flash'),
prompt: 'Объясни квантовые вычисления',
});
Streaming в React
'use client';
import { useChat } from '@ai-sdk/react';
export default function Chat() {
const { messages, input, handleInputChange, handleSubmit } = useChat();
return (
<div>
{messages.map((m) => (
<div key={m.id}>
<strong>{m.role}:</strong> {m.content}
</div>
))}
<form onSubmit={handleSubmit}>
<input value={input} onChange={handleInputChange} />
</form>
</div>
);
}
Хук useChat обрабатывает стриминг, историю сообщений и состояние формы. На бэкенде достаточно вернуть streamText() из API-роута.
MCP в Vercel AI SDK v6
import { createMCPClient } from 'ai';
const mcpClient = await createMCPClient({
transport: {
type: 'stdio',
command: 'npx',
args: ['-y', '@anthropic/mcp-filesystem'],
},
});
const tools = await mcpClient.tools();
const result = await generateText({
model: openai('gpt-4o'),
tools,
prompt: 'Покажи файлы в текущей директории',
});
await mcpClient.close();
Сравнительная таблица
| Критерий | Anthropic SDK | OpenAI Agents SDK | Vercel AI SDK |
|---|---|---|---|
| Язык | Python, TS | Python, JS | TypeScript |
| Stars | ~5 300 | ~19 500 | ~22 400 |
| Модели | Только Claude | OpenAI + провайдеры | Все провайдеры |
| Мультиагенты | Через MCP | Handoffs | Agent abstraction |
| Стриминг | Да | Да | Лучший в классе |
| MCP | Нативный | Нет | Поддержка в v6 |
| Guardrails | Нет | Встроенные | Нет |
| Трейсинг | Нет | Встроенный | DevTools в v6 |
| React-интеграция | Нет | Нет | Нативная |
| Для кого | Claude-разработчики | Python-разработчики | Fullstack / React |
Когда какой выбрать
flowchart TD
START[Выбор SDK] --> Q1{Работаете только с Claude?}
Q1 -->|Да| R1[Anthropic Agent SDK]
Q1 -->|Нет| Q2{Нужны handoffs между агентами?}
Q2 -->|Да| R2[OpenAI Agents SDK]
Q2 -->|Нет| Q3{Строите веб-приложение на React / Next.js?}
Q3 -->|Да| R3[Vercel AI SDK]
Q3 -->|Нет| Q4{Нужна поддержка нескольких провайдеров?}
Q4 -->|Да| R3
Q4 -->|Нет| Q5{Основной язык -- Python?}
Q5 -->|Да| R2
Q5 -->|Нет| R3
style START fill:#f8fafc,stroke:#64748b,stroke-width:2px
style Q1 fill:#f8fafc,stroke:#4f46e5,stroke-width:2px
style Q2 fill:#f8fafc,stroke:#4f46e5,stroke-width:2px
style Q3 fill:#f8fafc,stroke:#4f46e5,stroke-width:2px
style Q4 fill:#f8fafc,stroke:#4f46e5,stroke-width:2px
style Q5 fill:#f8fafc,stroke:#4f46e5,stroke-width:2px
style R1 fill:#f8fafc,stroke:#059669,stroke-width:2px
style R2 fill:#f8fafc,stroke:#059669,stroke-width:2px
style R3 fill:#f8fafc,stroke:#059669,stroke-width:2px
Частые комбинации:
- Стартап на Next.js — Vercel AI SDK для фронтенда и бэкенда
- Python-бэкенд с OpenAI — OpenAI Agents SDK для оркестрации
- Инструменты для Claude — Anthropic Agent SDK + MCP-серверы
- Мультипровайдер на Python — OpenAI Agents SDK с кастомным провайдером
Доступность из России
Прямой доступ к API Anthropic и OpenAI из России ограничен. Для работы с этими SDK потребуется VPN или прокси-сервер для маршрутизации запросов.
Anthropic Agent SDK — требуется VPN для доступа к Claude API. SDK взаимодействует с api.anthropic.com.
OpenAI Agents SDK — требуется VPN для доступа к OpenAI API. Однако SDK провайдер-агностичен: можно направить запросы на локальный сервер через Ollama или vLLM, и тогда VPN не нужен.
Vercel AI SDK — сам SDK полностью открытый и устанавливается из npm без ограничений. Работает с любым провайдером, включая:
- Локальные модели через Ollama
- Российские провайдеры через кастомные адаптеры
- Любой OpenAI-совместимый сервер
Vercel AI SDK — наиболее доступный вариант для разработки в условиях ограничений, потому что не привязан к конкретному облачному провайдеру.