Локальная 8B-модель как полноценный агент — теперь реально

Forge — это слой надёжности для self-hosted (локального) вызова инструментов LLM. Инструмент поднимает 8B-модель до уровня лучших в своём классе на многошаговых агентных задачах через систему guardrails (защитных барьеров) — rescue parsing (восстановление сломанного парсинга), retry nudges (подсказки при повторных попытках) и step enforcement (контроль шагов) — плюс управление контекстом с VRAM-aware budgets (бюджетами памяти GPU) и tiered compaction (многоуровневым сжатием).

Автор проекта признаётся, что строил Forge для собственных всегда-включённых агентных систем, не желая платить за облачные frontier-модели, — и сразу столкнулся с математикой накопленных ошибок: при точности 90% на каждом шаге 5-шаговый воркфлоу даёт 40% вероятность отказа.

Маленькие локальные модели (~8B) нельзя доверить самостоятельному выбору между текстом и вызовом инструмента — их нужно направлять.


Результаты: цифры говорят сами за себя

Лучшая конфигурация на сегодняшний день — Ministral-3 8B Instruct Q8 на llama-server — набирает 86,5% в наборе из 26 сценариев eval-набора Forge и 76% на наиболее сложном уровне.

Это впечатляет на фоне исходных 53% у той же модели без Forge — рост почти вдвое.

ℹ Что такое guardrails в Forge
Guardrails — это не фильтры безопасности, а механический слой надёжности: Forge перехватывает неправильные ответы модели, восстанавливает сломанные вызовы инструментов и «подталкивает» модель к правильному шагу через повторные запросы.

Как устроен Forge


graph TD
    A[Запрос пользователя] --> B[WorkflowRunner]
    B --> C[Guardrails middleware]
    C --> D{Ответ корректен?}
    D -->|Да| E[Выполнить tool call]
    D -->|Нет| F[Rescue parsing / Retry nudge]
    F --> C
    E --> G[Context Manager]
    G --> H[Ответ пользователю]

Forge предлагает четыре способа использования:

  • WorkflowRunner — определяешь инструменты, выбираешь бэкенд, запускаешь структурированные агентные циклы. Forge управляет всем жизненным циклом: системными промптами, выполнением инструментов, сжатием контекста и guardrails.

  • SlotWorker — добавляет доступ с приоритетной очередью к общему inference-слоту с авто-вытеснением — для мультиагентных архитектур, где специализированные воркфлоу делят GPU-слот.

  • Guardrails middleware — используй стек надёжности Forge внутри собственного цикла оркестрации через composable middleware (составные компоненты промежуточного ПО).

  • Proxy server — дроп-ин замена для локального сервера: любой OpenAI-совместимый клиент (opencode, Continue, aider) получает guardrails «прозрачно».

Ключевой трюк прокси

Прокси автоматически подставляет синтетический инструмент respond, когда в запросе есть tools. Модель вызывает respond(message="...") вместо того, чтобы генерировать голый текст, оставаясь в режиме tool-calling, где работает весь стек guardrails. Вызов respond удаляется из исходящего ответа — клиент видит обычный текстовый ответ и ничего не знает о существовании инструмента.

Это принципиально для небольших локальных моделей (~8B), которым нельзя доверять самостоятельный выбор между текстом и вызовом инструментов.


Поддерживаемые бэкенды

БэкендЛучше всего дляNative tool calling
llama-serverМаксимальная производительность, полный контрольДа (с --jinja)
OllamaПростейшая установка, встроенное управление моделямиДа
LlamafileОдин бинарник, ноль зависимостейНет (через промпт)
AnthropicFrontier-baseline, гибридные воркфлоуДа
💡 Рекомендованная конфигурация
Все топ-10 конфигураций в eval-таблице работают на llama-server с моделью Ministral-3 8B Instruct Q8_0. Если важна простота — используй Ollama, но на сложных задачах результат будет немного ниже.

Быстрый старт

Установка одной командой:

pip install forge-guardrails

Запуск бэкенда (llama-server — рекомендуется):

llama-server -m path/to/Ministral-3-8B-Instruct-2512-Q8_0.gguf --jinja -ngl 999 --port 8080

Простейший пример агента на Python:

import asyncio
from pydantic import BaseModel, Field
from forge import (
    Workflow, ToolDef, ToolSpec, WorkflowRunner,
    OllamaClient, ContextManager, TieredCompact,
)

def get_weather(city: str) -> str:
    return f"72°F and sunny in {city}"

class GetWeatherParams(BaseModel):
    city: str = Field(description="City name")

workflow = Workflow(
    name="weather",
    description="Look up weather for a city.",
    tools={
        "get_weather": ToolDef(
            spec=ToolSpec(name="get_weather", description="Get current weather", parameters=GetWeatherParams),
            callable=get_weather,
        ),
    },
    required_steps=[],
    terminal_tool="get_weather",
    system_prompt_template="You are a helpful assistant. Use the available tools to answer the user.",
)

async def main():
    client = OllamaClient(model="ministral-3:8b-instruct-2512-q4_K_M", recommended_sampling=True)
    ctx = ContextManager(strategy=TieredCompact(keep_recent=2), budget_tokens=8192)
    runner = WorkflowRunner(client=client, context_manager=ctx)
    await runner.run(workflow, "What's the weather in Paris?")

asyncio.run(main())

Eval-харнесс: как измеряется качество

26 сценариев измеряют, насколько надёжно пара модель+бэкенд проходит многошаговые воркфлоу с вызовом инструментов — разбитые на базовый уровень OG-18 и продвинутый. Eval поддерживает пакетный режим с JSONL-выводом и автоматическим продолжением с места остановки, а отчёты генерируются в форматах ASCII, HTML и Markdown.

⚠ Важно для долгих сессий
Если вы строите долгоживущую сессию (CLI, chat-сервер, голосовой ассистент), в документации Forge есть отдельный раздел о фильтрации транзитных сообщений — его стоит изучить перед деплоем.

Почему это важно для рынка

Логика накопленных ошибок — принципиальная проблема: 90% точности на шаг звучит хорошо, но на 5-шаговом воркфлоу это уже 40% отказов. И ни один существующий фреймворк не решал эту механическую проблему надёжности — все они созданы под облачные frontier-модели.

Forge переворачивает подход: вместо того чтобы брать более мощную (и дорогую) модель, он делает надёжной ту, что уже есть. Это открывает реальную возможность строить production-агентов на локальном железе — без абонентской платы за API и без отправки данных в облако.

Проект доступен на GitHub: github.com/antoinezambelli/forge