v
vibecode
Все скиллы
01Скилл
Реализация
адапт. из anthropics/claude-cookbooks
Tool use starter

AI с доступом к твоим функциям

Скелет Claude API с function calling. AI вызывает твои функции (БД, внешние API, отправка email) и отвечает на основе результатов.


01aКогда брать

Когда нужен AI который может **действовать**, а не только говорить. Например: AI-ассистент который сам ищет в БД, отправляет письма, бронирует слоты. Это шаг к настоящим агентам.

02Куда положить
<project>/lib/ai-tools.ts

Создай эту папку и файл (если их нет), вставь содержимое ниже. Затем в Claude Code: /exit и запусти claude заново — команда появится.

03Содержимое

Скопируй всё что внутри блока и вставь в файл по пути выше.

ai-tools.ts
1import Anthropic from "@anthropic-ai/sdk";2 3const claude = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });4 5// ─── 1. Описание доступных tools ───6const TOOLS = [7  {8    name: "search_orders",9    description: "Поиск заказов клиента по email или ID заказа",10    input_schema: {11      type: "object",12      properties: {13        email: { type: "string", description: "Email клиента" },14        orderId: { type: "string", description: "ID заказа" },15      },16    },17  },18  {19    name: "send_email",20    description: "Отправка email пользователю",21    input_schema: {22      type: "object",23      properties: {24        to: { type: "string" },25        subject: { type: "string" },26        body: { type: "string" },27      },28      required: ["to", "subject", "body"],29    },30  },31];32 33// ─── 2. Реализация tools ───34const toolHandlers: Record<string, (input: any) => Promise<any>> = {35  async search_orders({ email, orderId }) {36    // твоя логика поиска в БД37    return { found: true, order: { id: "12345", status: "shipped" } };38  },39  async send_email({ to, subject, body }) {40    // твоя интеграция с Resend / SendGrid41    return { sent: true };42  },43};44 45// ─── 3. Главный цикл — agentic loop ───46export async function chatWithTools(userMessage: string) {47  const messages: any[] = [{ role: "user", content: userMessage }];48 49  // Многошаговый цикл — Claude может вызвать несколько tools подряд50  for (let i = 0; i < 10; i++) {51    const response = await claude.messages.create({52      model: "claude-sonnet-4-6",53      max_tokens: 1024,54      tools: TOOLS,55      messages,56    });57 58    // Если Claude хочет вызвать tool59    if (response.stop_reason === "tool_use") {60      const toolUseBlocks = response.content.filter((b: any) => b.type === "tool_use");61 62      const toolResults = await Promise.all(63        toolUseBlocks.map(async (tu: any) => {64          const handler = toolHandlers[tu.name];65          const result = await handler(tu.input);66          return {67            type: "tool_result",68            tool_use_id: tu.id,69            content: JSON.stringify(result),70          };71        })72      );73 74      messages.push({ role: "assistant", content: response.content });75      messages.push({ role: "user", content: toolResults });76      continue;77    }78 79    // Финальный ответ80    return response.content.find((b: any) => b.type === "text")?.text ?? "";81  }82 83  throw new Error("Too many tool calls — likely infinite loop");84}
04Как использовать

Примеры команд

  • 01AI-секретарь который сам создаёт встречи в Google Calendar
  • 02AI-поддержка которая ищет заказы в БД
  • 03AI-агент который запрашивает погоду / курсы валют