Дайджесты новостей
Конструктор модулей рантайма с быстрыми локальными конвейерами исполнения

Factory Droid 1.0: программный вызов инструментов ускоряет ИИ-агентов на 20%

Когда автономный агент решает инженерную задачу медленно, ошибается или сжигает гору токенов, разработчики привычно ругают языковую модель: мол, «контекст поплыл» или «нейросеть опять отупела». Но если заглянуть в логи выполнения сложного скрипта, выясняется удивительная вещь: в девяти случаях из десяти виновата не сама модель, а убогая инфраструктурная среда вокруг нее.

Компания Factory, создающая корпоративную платформу автономной разработки софта factory.ai, представила релиз Factory Droid 1.0. Это специализированная среда исполнения и агентная обвязка (Agent Harness), которая без смены базовых нейросетей ускоряет решение задач на 20%, а на пакетных операциях сокращает количество запросов к API в десятки раз. Я внимательно изучил документацию docs.factory.ai и архитектуру Droid SDK, и готов разобрать, как концепция программного вызова инструментов (Programmatic Tool Calling) меняет правила игры.

Почему узким местом стал не интеллект, а среда вокруг него

Что такое Agent Harness («агентная обвязка»)? Это программный слой, который оборачивает «голую» языковую модель: управляет системными инструкциями, предоставляет реестр инструментов (чтение файлов, bash, git), изолирует процессы в песочницах и следит за кешированием контекста. Когда мы исследовали опыт организации автономной фабрики, мы уже говорили: дать агенту безграничные права без жестких правил — верный путь к хаосу.

Традиционный механизм работы агентов (Turn-by-Turn Tool Calling) устроен пошагово:

  1. Модель решает вызвать команду: fs.readFile("package.json").
  2. Обвязка читает файл и возвращает его полный текст в историю диалога.
  3. Модель видит ответ, думает и вызывает следующий шаг: fs.readFile("tsconfig.json").
  4. В историю снова падает весь файл целиком.

Если нужно проанализировать 50 файлов или перенести сотню задач в трекере, этот пошаговый пинг-понг превращается в кошмар. Контекстное окно моментально засоряется мегабайтами сырых логов, модель теряет исходную цель, а каждое следующее обращение к API становится все тяжелее и дороже.

Пошаговый тулколлинг против скриптов в песочнице (Script Tool)

В Droid 1.0 подход кардинально перевернули. Вместо того чтобы вызывать инструменты по одному через бесконечные раунды общения с сервером, модель генерирует исполняемую программу на JavaScript (Script Tool).

Этот скрипт запускается локально внутри изолированной песочницы (sandbox) Droid. Внутри кода агент может выполнять циклы, фильтровать массивы файлов через регулярные выражения, запускать компиляцию и параллельные асинхронные операции (Promise.all).

И главное: в контекст самой языковой модели возвращается не гигабайт промежуточного мусора, а ровно то, что скрипт вывел через console.log() или return.

Показательный кейс из практики Factory: миграция 151 задачи в трекере Linear.

  • Традиционный tool calling: потребовал бы около 36 запросов к модели, 312 последовательных вызовов API и расход свыше 3.1 миллиона входных токенов.
  • Script Tool в Droid 1.0: решил ту же задачу ровно за 2 запроса к модели, потратив всего 61 000 токенов! Экономия контекста превысила 95%.

Анатомия Droid 1.0: как кешировать 98% промпта

Помимо программного тулколлинга, инженеры Factory внедрили глубокую оптимизацию prompt-кеширования. Современные провайдеры (Anthropic, OpenAI, DeepSeek) умеют кешировать входные токены со скидкой до 90%, но только в том случае, если префикс запроса не изменился ни на один символ.

Стандартные агентные фреймворки постоянно ломают этот кеш: они динамически подмешивают описания найденных инструментов или текущее время прямо в середину системного промпта. В Droid 1.0 архитектура строго структурирована:

  • Базовый системный фрейм зафиксирован и кешируется на 100%.
  • Все динамические инструменты и контекстные подсказки монтируются строго в конец запроса. В результате до 98% входного контекста считывается из быстрого кеша.
  • Сам стартовый промпт первого запроса уменьшили на 37% (с 20 887 токенов до 13 055) благодаря ленивой загрузке: вместо 11 тяжелых схем инструментов агенту сначала отдаются лишь 2 базовых, а остальные подключаются по требованию.
  • Встроенные предохранители (Safety Guardrails): если агент 3 раза повторяет неудачный вызов, Droid делает мягкое предупреждение (nudge), а на 6-й попытке принудительно останавливает цикл.

Реализация в коде: настройка Droid SDK и изолированный запуск

Посмотрим, как выглядит запуск задачи через официальную библиотеку @factory/droid-sdk в среде Node.js:

import { DroidHarness, FactoryRouter } from '@factory/droid-sdk';

async function runRefactorPipeline() {
  const harness = new DroidHarness({
    apiKey: process.env.FACTORY_API_KEY!,
    projectRoot: process.cwd(),
    executionMode: 'script_preferred',
    sandboxConfig: {
      timeoutMs: 300_000,
      memoryLimitMb: 512,
      allowNetwork: false // Полная изоляция от внешней сети
    },
    safetyGuardrails: {
      maxToolCallRetries: 3,
      hardStopLoopCount: 6
    }
  });

  const session = await harness.createSession({
    model: FactoryRouter.selectOptimalModel({ taskType: 'batch_refactor' }),
    initialPrompt: `
      Найди все файлы в src/components/, использующие устаревший ButtonLegacy.
      Замени импорт на ButtonV2 и обнови пропс isPrimary на variant="primary".
      Запусти тесты и верни краткий отчет.
    `
  });

  const result = await session.execute();
  console.log(`Завершено за ${result.elapsedSeconds}с. Токены: ${result.totalTokens}`);
}

runRefactorPipeline().catch(console.error);

А вот пример компактного скрипта, который сама модель генерирует и выполняет внутри песочницы Droid без промежуточных запросов к LLM:

async function executeBatchRefactor() {
  const files = tools.fs.glob('src/components/**/*.tsx');
  const matched = [];

  for (const file of files) {
    const text = await tools.fs.readFile(file);
    if (text.includes('ButtonLegacy')) {
      matched.push({ file, text });
    }
  }

  // Параллельная перезапись компонентов на диске
  await Promise.all(matched.map(async ({ file, text }) => {
    const next = text
      .replace(/ButtonLegacy/g, 'ButtonV2')
      .replace(/isPrimary/g, 'variant="primary"');
    await tools.fs.writeFile(file, next);
  }));

  const testRun = await tools.runner.exec('npm test -- --bail');
  return {
    updated: matched.length,
    testsPassed: testRun.exitCode === 0,
    summary: testRun.stdout.slice(-150)
  };
}

return await executeBatchRefactor();

Все циклы и файловые операции выполнились на локальном процессоре за доли секунды. В модель вернулся один аккуратный JSON-объект.

Бенчмарки и экономика токенов в продакшене

На независимом бенчмарке Terminal-Bench 4 Droid 1.0 показал убедительное преимущество:

  • В связке с Claude Opus 5.5 система решила 65.2% задач против 57.6% у Claude Code.
  • В связке с GPT-6.1 Sol результат составил 57.6% против 54.0% у Codex.
  • Время устранения типового упавшего теста сократилось с 56.8 до 41.6 секунды.
Поддержка открытых моделей

Благодаря встроенному компоненту Factory Router обвязка Droid не привязана к проприетарным облакам. Вы можете перенаправить выполнение тяжелых рутинных скриптов на локальные веса через vLLM или Ollama, полностью исключив затраты на сторонние API.

Главный практический вывод: производительность автономных агентов сегодня определяется архитектурой среды исполнения. Переход от пошагового чата к локальному выполнению скриптов экономит компаниям тысячи долларов и превращает капризные нейросети в надежный рабочий конвейер.