Независимый гид по железу для локального ИИЗнакомимся с проектом
НЕ МАГИЯ — ОБМЕН ДАННЫМИ

Как ИИ-агент выполняет задачу: интерактивная схема

Три задачи, одна карта системы. Проследите запрос от пользователя до модели, инструментов и ответа — с контекстом, MCP и памятью GPU на каждом шаге.

Учебная симуляция. Реальные модели, MCP-серверы, файлы и сеть не запускаются. Схема не делает fetch/XHR. Здесь наблюдаемые запросы и результаты, а не внутренние мысли модели.

В области схемы: ← / → — шаги, пробел — пуск/пауза. Enter или пробел на узле — описание. Ожидание подтверждается кнопкой «Дальше».

  • Запрос к модели
  • Ответ / tool call
  • Вызов MCP
  • Встроенный инструмент
  • Embedding-модель
  • Поиск по индексу
  • Чтение / запись диска
  • Сеть
  • Ожидание пользователя
  • Субагент
  • Пользователь / контекст

Карта системы

Обмен → результат → контекст
Участники агентного цикла: модель, харнесс, инструменты и данные ПользовательЦель и ответПриложение-агентХарнесс · MCPЯзыковаямодельOllamaGPU / VRAMВеса + KVEmbedding-модельНа CPUСубагентОбщая LLMMCP: Файлыstdio · локальноMCP: КаталогGPUstdio · учебныйВстроенныеинструментыShell / правкаДискФайлы и кодВекторнаябазаГотовый индексСеть /интернетGit / HTTPMCP: GitHubHTTP · удалённо Участники агентного цикла: модель, харнесс, инструменты и данные ПользовательЦель и ответПриложение-агентХарнесс · MCPЯзыковаямодельOllamaGPU / VRAMВеса + KVEmbedding-модельНа CPUСубагентОбщая LLMMCP: Файлыstdio · локальноMCP: КаталогGPUstdio · учебныйВстроенныеинструментыShell / правкаДискФайлы и кодВекторнаябазаГотовый индексСеть /интернетGit / HTTPMCP: GitHubHTTP · удалённо
GPU / VRAM · рабочая Qwen3 8B

Общие веса: 4,678 ГиБ. Оценки KV-кэша приведены у каждого шага.

Расчёт хранения, не измерение нагрузки.

Светлые линии — возможные связи. Цветные стрелки — маршрут шага; номера задают порядок, движущийся пунктир и пакет выделяют текущую связь. Подписи объясняют тип обмена. Активные узлы имеют зелёный фон, неиспользуемые — пунктирную рамку.

Подбери видеокарту под Qwen3.8-27B с контекстом 32K

Рабочая LLM агента — Qwen3 8B. Qwen3.8-27B здесь только предмет расчёта: она не загружается. Чтение заметки разрешено заранее; поиск после оценки памяти — фиксированный workflow харнесса. Настройки на весь сценарий: num_ctx=8192, OLLAMA_NUM_PARALLEL=1; модель уже загружена, KV-буферы выделены заранее.

  1. Пользователь / контекстЛокально
    ШАГ 1 / 14

    Задача приходит в приложение

    Пользователь задаёт модель и длину контекста. Харнесс пока не знает конфигурацию компьютера.

    Пользователь → Приложение-агент

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Сообщение пользователя

    {
      "role": "user",
      "content": "Подбери видеокарту под Qwen3.8-27B с контекстом 32K"
    }
  2. Вызов MCPЛокально
    ШАГ 2 / 14

    Харнесс узнаёт доступные инструменты

    Клиенты могут сначала вызвать server/discover, затем tools/list. Каждый запрос самодостаточен: версия и возможности клиента находятся в params._meta; inputSchema преобразуется в tools API модели.

    Приложение-агент → MCP: Файлы → Приложение-агент → MCP: Каталог GPU → Приложение-агент

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Файлы: обнаружение сервера

    {
      "jsonrpc": "2.0",
      "id": 10,
      "method": "server/discover",
      "params": {
        "_meta": {
          "io.modelcontextprotocol/protocolVersion": "2026-07-28",
          "io.modelcontextprotocol/clientCapabilities": {},
          "io.modelcontextprotocol/clientInfo": {
            "name": "videokarty-demo",
            "version": "1.0.0"
          }
        }
      }
    }

    Файлы: возможности

    {
      "jsonrpc": "2.0",
      "id": 10,
      "result": {
        "resultType": "complete",
        "_meta": {
          "io.modelcontextprotocol/serverInfo": {
            "name": "demo-mcp",
            "version": "1.0.0"
          }
        },
        "ttlMs": 0,
        "cacheScope": "private",
        "supportedVersions": [
          "2026-07-28"
        ],
        "capabilities": {
          "tools": {},
          "resources": {}
        }
      }
    }

    Файлы: запрос

    {
      "jsonrpc": "2.0",
      "id": 1,
      "method": "tools/list",
      "params": {
        "_meta": {
          "io.modelcontextprotocol/protocolVersion": "2026-07-28",
          "io.modelcontextprotocol/clientCapabilities": {},
          "io.modelcontextprotocol/clientInfo": {
            "name": "videokarty-demo",
            "version": "1.0.0"
          }
        }
      }
    }

    Файлы: ответ

    {
      "jsonrpc": "2.0",
      "id": 1,
      "result": {
        "resultType": "complete",
        "_meta": {
          "io.modelcontextprotocol/serverInfo": {
            "name": "demo-mcp",
            "version": "1.0.0"
          }
        },
        "ttlMs": 0,
        "cacheScope": "private",
        "tools": [
          {
            "name": "read_file",
            "description": "Прочитать разрешённую заметку",
            "inputSchema": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                }
              },
              "required": [
                "path"
              ]
            }
          }
        ]
      }
    }

    Каталог GPU: обнаружение сервера

    {
      "jsonrpc": "2.0",
      "id": 11,
      "method": "server/discover",
      "params": {
        "_meta": {
          "io.modelcontextprotocol/protocolVersion": "2026-07-28",
          "io.modelcontextprotocol/clientCapabilities": {},
          "io.modelcontextprotocol/clientInfo": {
            "name": "videokarty-demo",
            "version": "1.0.0"
          }
        }
      }
    }

    Каталог GPU: возможности

    {
      "jsonrpc": "2.0",
      "id": 11,
      "result": {
        "resultType": "complete",
        "_meta": {
          "io.modelcontextprotocol/serverInfo": {
            "name": "demo-mcp",
            "version": "1.0.0"
          }
        },
        "ttlMs": 0,
        "cacheScope": "private",
        "supportedVersions": [
          "2026-07-28"
        ],
        "capabilities": {
          "tools": {}
        }
      }
    }

    Каталог GPU: запрос

    {
      "jsonrpc": "2.0",
      "id": 2,
      "method": "tools/list",
      "params": {
        "_meta": {
          "io.modelcontextprotocol/protocolVersion": "2026-07-28",
          "io.modelcontextprotocol/clientCapabilities": {},
          "io.modelcontextprotocol/clientInfo": {
            "name": "videokarty-demo",
            "version": "1.0.0"
          }
        }
      }
    }

    Каталог GPU: ответ

    {
      "jsonrpc": "2.0",
      "id": 2,
      "result": {
        "resultType": "complete",
        "_meta": {
          "io.modelcontextprotocol/serverInfo": {
            "name": "demo-mcp",
            "version": "1.0.0"
          }
        },
        "ttlMs": 0,
        "cacheScope": "private",
        "tools": [
          {
            "name": "memory_estimate",
            "description": "Оценить бюджет памяти языковой модели",
            "inputSchema": {
              "type": "object",
              "properties": {
                "model": {
                  "type": "string"
                },
                "quant": {
                  "type": "string"
                },
                "context": {
                  "type": "integer"
                },
                "kv": {
                  "type": "string"
                }
              },
              "required": [
                "model",
                "quant",
                "context",
                "kv"
              ]
            }
          },
          {
            "name": "search_gpus",
            "description": "Найти настольные карты по памяти и мощности",
            "inputSchema": {
              "type": "object",
              "properties": {
                "min_vram_gb": {
                  "type": "number"
                },
                "max_power_w": {
                  "type": "number"
                }
              },
              "required": [
                "min_vram_gb",
                "max_power_w"
              ]
            }
          }
        ]
      }
    }
  3. Запрос к моделиЛокально
    ШАГ 3 / 14

    Вызов модели №1: вопрос и tools

    Во вход уходят системная инструкция, задача и схемы функций. Содержимого заметки здесь ещё нет.

    Приложение-агент → Языковая модель

    ▣ GPU: инференс языковой модели

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    POST /api/chat · тело запроса

    {
      "model": "local-agent",
      "stream": false,
      "options": {
        "num_ctx": 8192
      },
      "messages": [
        {
          "role": "system",
          "content": "Отвечай по наблюдаемым данным. Запрашивай нужные инструменты; не выдумывай их результаты."
        },
        {
          "role": "user",
          "content": "Подбери видеокарту под Qwen3.8-27B с контекстом 32K"
        }
      ],
      "tools": [
        {
          "type": "function",
          "function": {
            "name": "read_file",
            "description": "Прочитать разрешённую заметку",
            "parameters": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                }
              },
              "required": [
                "path"
              ]
            }
          }
        },
        {
          "type": "function",
          "function": {
            "name": "memory_estimate",
            "description": "Оценить бюджет памяти языковой модели",
            "parameters": {
              "type": "object",
              "properties": {
                "model": {
                  "type": "string"
                },
                "quant": {
                  "type": "string"
                },
                "context": {
                  "type": "integer"
                },
                "kv": {
                  "type": "string"
                }
              },
              "required": [
                "model",
                "quant",
                "context",
                "kv"
              ]
            }
          }
        },
        {
          "type": "function",
          "function": {
            "name": "search_gpus",
            "description": "Найти настольные карты по памяти и мощности",
            "parameters": {
              "type": "object",
              "properties": {
                "min_vram_gb": {
                  "type": "number"
                },
                "max_power_w": {
                  "type": "number"
                }
              },
              "required": [
                "min_vram_gb",
                "max_power_w"
              ]
            }
          }
        }
      ]
    }
  4. Ответ / tool callЛокально
    ШАГ 4 / 14

    Модель запрашивает read_file

    Модель возвращает tool call. Это только запрос на действие; файл ещё не прочитан.

    Языковая модель → Приложение-агент

    ▣ GPU: инференс языковой модели

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Ответ Ollama · фрагмент

    {
      "message": {
        "role": "assistant",
        "content": "",
        "tool_calls": [
          {
            "function": {
              "name": "read_file",
              "arguments": {
                "path": "Документы/мой-пк.md"
              }
            }
          }
        ]
      }
    }
  5. Вызов MCPЛокально
    ШАГ 5 / 14

    MCP-клиент отправляет вызов

    Харнесс проверяет разрешённый путь и отправляет JSON-RPC локальному серверу «Файлы». На этой границе работает протокол, а не GPU.

    Приложение-агент → MCP: Файлы

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    stdio · tools/call

    {
      "jsonrpc": "2.0",
      "id": 7,
      "method": "tools/call",
      "params": {
        "name": "read_file",
        "arguments": {
          "path": "Документы/мой-пк.md"
        },
        "_meta": {
          "io.modelcontextprotocol/protocolVersion": "2026-07-28",
          "io.modelcontextprotocol/clientCapabilities": {},
          "io.modelcontextprotocol/clientInfo": {
            "name": "videokarty-demo",
            "version": "1.0.0"
          }
        }
      }
    }
  6. Чтение / запись дискаЛокально
    ШАГ 6 / 14

    Сервер читает заметку с диска

    Файловый сервер читает условный мой-пк.md. Лимит 450 Вт — заданный владельцем бюджет GPU, а не универсальный вывод из мощности БП.

    MCP: Файлы → Диск

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Наблюдение инструмента

    {
      "path": "Документы/мой-пк.md",
      "content": {
        "psu_w": 850,
        "gpu_power_budget_w": 450,
        "case_gpu_clearance_mm": 340,
        "current_gpu": "RTX 3060 12 ГБ"
      }
    }
  7. Вызов MCPЛокально
    ШАГ 7 / 14

    Результат возвращается в контекст

    Ответ MCP превращается в сообщение role: tool. Следующий вызов модели увидит характеристики компьютера.

    MCP: Файлы → Приложение-агент

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Ответ на id=7

    {
      "jsonrpc": "2.0",
      "id": 7,
      "result": {
        "resultType": "complete",
        "_meta": {
          "io.modelcontextprotocol/serverInfo": {
            "name": "demo-mcp",
            "version": "1.0.0"
          }
        },
        "content": [
          {
            "type": "text",
            "text": "{\n  \"psu_w\": 850,\n  \"gpu_power_budget_w\": 450,\n  \"case_gpu_clearance_mm\": 340,\n  \"current_gpu\": \"RTX 3060 12 ГБ\"\n}"
          }
        ],
        "isError": false
      }
    }

    Добавленное сообщение

    {
      "role": "tool",
      "tool_name": "read_file",
      "content": "{\n  \"psu_w\": 850,\n  \"gpu_power_budget_w\": 450,\n  \"case_gpu_clearance_mm\": 340,\n  \"current_gpu\": \"RTX 3060 12 ГБ\"\n}"
    }
  8. Запрос к моделиЛокально
    ШАГ 8 / 14

    Вызов модели №2: учитываем ПК

    Харнесс передаёт прежнюю историю, tool call и результат чтения. Веса модели не меняются, но вход стал длиннее.

    Приложение-агент → Языковая модель

    ▣ GPU: инференс языковой модели

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    POST /api/chat · тело запроса

    {
      "model": "local-agent",
      "stream": false,
      "options": {
        "num_ctx": 8192
      },
      "messages": [
        {
          "role": "system",
          "content": "Отвечай по наблюдаемым данным. Запрашивай нужные инструменты; не выдумывай их результаты."
        },
        {
          "role": "user",
          "content": "Подбери видеокарту под Qwen3.8-27B с контекстом 32K"
        },
        {
          "role": "assistant",
          "content": "",
          "tool_calls": [
            {
              "function": {
                "name": "read_file",
                "arguments": {
                  "path": "Документы/мой-пк.md"
                }
              }
            }
          ]
        },
        {
          "role": "tool",
          "tool_name": "read_file",
          "content": "{\n  \"psu_w\": 850,\n  \"gpu_power_budget_w\": 450,\n  \"case_gpu_clearance_mm\": 340,\n  \"current_gpu\": \"RTX 3060 12 ГБ\"\n}"
        }
      ],
      "tools": [
        {
          "type": "function",
          "function": {
            "name": "read_file",
            "description": "Прочитать разрешённую заметку",
            "parameters": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                }
              },
              "required": [
                "path"
              ]
            }
          }
        },
        {
          "type": "function",
          "function": {
            "name": "memory_estimate",
            "description": "Оценить бюджет памяти языковой модели",
            "parameters": {
              "type": "object",
              "properties": {
                "model": {
                  "type": "string"
                },
                "quant": {
                  "type": "string"
                },
                "context": {
                  "type": "integer"
                },
                "kv": {
                  "type": "string"
                }
              },
              "required": [
                "model",
                "quant",
                "context",
                "kv"
              ]
            }
          }
        },
        {
          "type": "function",
          "function": {
            "name": "search_gpus",
            "description": "Найти настольные карты по памяти и мощности",
            "parameters": {
              "type": "object",
              "properties": {
                "min_vram_gb": {
                  "type": "number"
                },
                "max_power_w": {
                  "type": "number"
                }
              },
              "required": [
                "min_vram_gb",
                "max_power_w"
              ]
            }
          }
        }
      ]
    }
  9. Ответ / tool callЛокально
    ШАГ 9 / 14

    Модель запрашивает оценку VRAM

    Модель выбирает memory_estimate с конкретными параметрами Qwen3.8. Оценку выполнит программная формула сервера.

    Языковая модель → Приложение-агент

    ▣ GPU: инференс языковой модели

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Ответ Ollama · фрагмент

    {
      "message": {
        "role": "assistant",
        "content": "",
        "tool_calls": [
          {
            "function": {
              "name": "memory_estimate",
              "arguments": {
                "model": "qwen38-27",
                "quant": "Q4_K_M",
                "context": 32768,
                "kv": "FP16"
              }
            }
          }
        ]
      }
    }
  10. Вызов MCPЛокально
    ШАГ 10 / 14

    Вызов memory_estimate через MCP

    Харнесс передаёт Q4_K_M, 32K и FP16 KV. Сервер считает веса, обычный KV, состояния DeltaNet и резерв отдельно.

    Приложение-агент → MCP: Каталог GPU

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    stdio · tools/call

    {
      "jsonrpc": "2.0",
      "id": 8,
      "method": "tools/call",
      "params": {
        "name": "memory_estimate",
        "arguments": {
          "model": "qwen38-27",
          "quant": "Q4_K_M",
          "context": 32768,
          "kv": "FP16"
        },
        "_meta": {
          "io.modelcontextprotocol/protocolVersion": "2026-07-28",
          "io.modelcontextprotocol/clientCapabilities": {},
          "io.modelcontextprotocol/clientInfo": {
            "name": "videokarty-demo",
            "version": "1.0.0"
          }
        }
      }
    }
  11. Вызов MCPЛокально
    ШАГ 11 / 14

    Получен бюджет памяти Qwen3.8

    Все числа вычислены при сборке сайта из memory.mjs. Это текстовый сценарий без vision и пика prefill; результат добавляется к истории инструмента.

    MCP: Каталог GPU → Приложение-агент

    ○ CPU / приложение; GPU не участвует

    Бюджет запрошенной Qwen3.8-27B

    Q4_K_M · 32K · KV FP16 · без vision

    Веса
    15,402 ГиБ
    Обычный KV
    2 ГиБ
    Состояния DeltaNet
    0,144 ГиБ
    Резерв
    1,5 ГиБ
    Всего
    19,046 ГиБ
    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Ответ на id=8 · единицы: ГиБ

    {
      "jsonrpc": "2.0",
      "id": 8,
      "result": {
        "resultType": "complete",
        "_meta": {
          "io.modelcontextprotocol/serverInfo": {
            "name": "demo-mcp",
            "version": "1.0.0"
          }
        },
        "content": [
          {
            "type": "text",
            "text": "{\n  \"weights\": 15.401747077703478,\n  \"kv\": 2,\n  \"state\": 0.144287109375,\n  \"extraWeights\": 0,\n  \"reserve\": 1.5,\n  \"total\": 19.046034187078476\n}"
          }
        ],
        "isError": false
      }
    }

    Сообщение модели

    {
      "role": "tool",
      "tool_name": "memory_estimate",
      "content": "{\n  \"weights\": 15.401747077703478,\n  \"kv\": 2,\n  \"state\": 0.144287109375,\n  \"extraWeights\": 0,\n  \"reserve\": 1.5,\n  \"total\": 19.046034187078476\n}"
    }
  12. Вызов MCPЛокально
    ШАГ 12 / 14

    Харнесс подбирает кандидатов

    Заранее заданный шаг workflow использует результат расчёта и бюджет БП. Это tools/call от MCP-клиента, а не выдуманный дополнительный ответ LLM; проверка разъёмов и размеров остаётся отдельной.

    Приложение-агент → MCP: Каталог GPU → Приложение-агент

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    stdio · tools/call

    {
      "jsonrpc": "2.0",
      "id": 9,
      "method": "tools/call",
      "params": {
        "name": "search_gpus",
        "arguments": {
          "min_vram_gb": 24,
          "max_power_w": 450
        },
        "_meta": {
          "io.modelcontextprotocol/protocolVersion": "2026-07-28",
          "io.modelcontextprotocol/clientCapabilities": {},
          "io.modelcontextprotocol/clientInfo": {
            "name": "videokarty-demo",
            "version": "1.0.0"
          }
        }
      }
    }

    Ответ на id=9

    {
      "jsonrpc": "2.0",
      "id": 9,
      "result": {
        "resultType": "complete",
        "_meta": {
          "io.modelcontextprotocol/serverInfo": {
            "name": "demo-mcp",
            "version": "1.0.0"
          }
        },
        "content": [
          {
            "type": "text",
            "text": "{\n  \"candidates\": [\n    {\n      \"name\": \"GeForce RTX 4090\",\n      \"vram_gb\": 24,\n      \"spec_power_w\": 450\n    },\n    {\n      \"name\": \"GeForce RTX 3090\",\n      \"vram_gb\": 24,\n      \"spec_power_w\": 350\n    },\n    {\n      \"name\": \"Radeon RX 7900 XTX\",\n      \"vram_gb\": 24,\n      \"spec_power_w\": 355\n    }\n  ],\n  \"note\": \"По памяти и заявленной мощности; совместимость конкретной платы не подтверждена.\"\n}"
          }
        ],
        "isError": false
      }
    }
  13. Запрос к моделиЛокально
    ШАГ 13 / 14

    Вызов модели №3: собрать вывод

    Модель получает результат memory_estimate и сведения из фиксированного поиска харнесса. Для последнего не подставляется фиктивный assistant tool call.

    Приложение-агент → Языковая модель

    ▣ GPU: инференс языковой модели

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    POST /api/chat · тело запроса

    {
      "model": "local-agent",
      "stream": false,
      "options": {
        "num_ctx": 8192
      },
      "messages": [
        {
          "role": "system",
          "content": "Отвечай по наблюдаемым данным. Запрашивай нужные инструменты; не выдумывай их результаты."
        },
        {
          "role": "user",
          "content": "Подбери видеокарту под Qwen3.8-27B с контекстом 32K"
        },
        {
          "role": "assistant",
          "content": "",
          "tool_calls": [
            {
              "function": {
                "name": "read_file",
                "arguments": {
                  "path": "Документы/мой-пк.md"
                }
              }
            }
          ]
        },
        {
          "role": "tool",
          "tool_name": "read_file",
          "content": "{\n  \"psu_w\": 850,\n  \"gpu_power_budget_w\": 450,\n  \"case_gpu_clearance_mm\": 340,\n  \"current_gpu\": \"RTX 3060 12 ГБ\"\n}"
        },
        {
          "role": "assistant",
          "content": "",
          "tool_calls": [
            {
              "function": {
                "name": "memory_estimate",
                "arguments": {
                  "model": "qwen38-27",
                  "quant": "Q4_K_M",
                  "context": 32768,
                  "kv": "FP16"
                }
              }
            }
          ]
        },
        {
          "role": "tool",
          "tool_name": "memory_estimate",
          "content": "{\n  \"weights\": 15.401747077703478,\n  \"kv\": 2,\n  \"state\": 0.144287109375,\n  \"extraWeights\": 0,\n  \"reserve\": 1.5,\n  \"total\": 19.046034187078476\n}"
        },
        {
          "role": "user",
          "content": "Наблюдение workflow харнесса search_gpus: [\n  {\n    \"name\": \"GeForce RTX 4090\",\n    \"vram_gb\": 24,\n    \"spec_power_w\": 450\n  },\n  {\n    \"name\": \"GeForce RTX 3090\",\n    \"vram_gb\": 24,\n    \"spec_power_w\": 350\n  },\n  {\n    \"name\": \"Radeon RX 7900 XTX\",\n    \"vram_gb\": 24,\n    \"spec_power_w\": 355\n  }\n]"
        }
      ],
      "tools": [
        {
          "type": "function",
          "function": {
            "name": "read_file",
            "description": "Прочитать разрешённую заметку",
            "parameters": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                }
              },
              "required": [
                "path"
              ]
            }
          }
        },
        {
          "type": "function",
          "function": {
            "name": "memory_estimate",
            "description": "Оценить бюджет памяти языковой модели",
            "parameters": {
              "type": "object",
              "properties": {
                "model": {
                  "type": "string"
                },
                "quant": {
                  "type": "string"
                },
                "context": {
                  "type": "integer"
                },
                "kv": {
                  "type": "string"
                }
              },
              "required": [
                "model",
                "quant",
                "context",
                "kv"
              ]
            }
          }
        },
        {
          "type": "function",
          "function": {
            "name": "search_gpus",
            "description": "Найти настольные карты по памяти и мощности",
            "parameters": {
              "type": "object",
              "properties": {
                "min_vram_gb": {
                  "type": "number"
                },
                "max_power_w": {
                  "type": "number"
                }
              },
              "required": [
                "min_vram_gb",
                "max_power_w"
              ]
            }
          }
        }
      ]
    }
  14. Ответ / tool callЛокально
    ШАГ 14 / 14

    Ответ с проверяемыми ссылками

    Приложение показывает итог. Карты — кандидаты по двум фильтрам, а не гарантия запуска или совместимости корпуса и блока питания.

    Языковая модель → Приложение-агент → Пользователь

    ▣ GPU: инференс языковой модели

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Ответ Ollama · фрагмент

    {
      "message": {
        "role": "assistant",
        "content": "Расчётный бюджет: 19.05 ГиБ. Начните с карт от 24 ГБ. Проверьте движок, свободную память, питание, разъёмы и габариты конкретной платы."
      }
    }

Найди в моих договорах сроки оплаты

Индекс создан заранее; извлечённый текст и номера страниц сохранены вместе. Документы вымышлены. Embedding-модель и векторный поиск в этой конфигурации работают на CPU. Настройки на весь сценарий: num_ctx=8192, OLLAMA_NUM_PARALLEL=2; модель уже загружена, KV-буферы выделены заранее.

  1. Пользователь / контекстЛокально
    ШАГ 1 / 13

    Вопрос становится задачей поиска

    Харнесс принимает вопрос и запускает заранее настроенный RAG-маршрут. Пока в контексте нет договоров.

    Пользователь → Приложение-агент

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=2. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    1,125 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    8,428 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Задача

    {
      "role": "user",
      "content": "Найди в моих договорах сроки оплаты"
    }
  2. Embedding-модельЛокально
    ШАГ 2 / 13

    Отдельная модель кодирует вопрос

    Embedding-модель создаёт вектор запроса на CPU. Это отдельный вызов модели, не shell и не обращение к MCP.

    Приложение-агент → Embedding-модель

    ○ CPU: embedding-модель; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=2. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    1,125 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    8,428 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Вход embedding-модели

    Текст: «сроки оплаты по договорам»
    Устройство: CPU
    Модель и параметры индекса согласованы заранее.
  3. Embedding-модельЛокально
    ШАГ 3 / 13

    Вектор возвращается приложению

    Полученный вектор нужен для поиска близких фрагментов. Он не добавляется к текстовому контексту LLM как набор чисел.

    Embedding-модель → Приложение-агент

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=2. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    1,125 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    8,428 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Сокращённый вектор

    embedding = [0.12, -0.08, 0.31, …]
    … — остальные компоненты не показаны.
  4. Поиск по индексуЛокально
    ШАГ 4 / 13

    Поиск в локальном индексе

    Харнесс запускает поиск в уже подготовленной векторной базе на CPU. Это операция поиска по индексу, а не вызов embedding-модели.

    Приложение-агент → Векторная база

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=2. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    1,125 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    8,428 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Поиск харнесса

    vector_search(index="contracts", query_vector=embedding, top_k=2)
    Режим: локально, CPU. Индекс создан заранее.
  5. Поиск по индексуЛокально
    ШАГ 5 / 13

    Найдены URI и номера страниц

    Поиск возвращает адреса страниц учебных договоров, а не готовый ответ. contracts://alpha/page/3 означает страницу 3 документа «Альфа» в учебном MCP-сервере; харнесс отдельно запрашивает её текст.

    Векторная база → Приложение-агент

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=2. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    1,125 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    8,428 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Результат поиска

    [
      {
        "uri": "contracts://alpha/page/3",
        "file": "Альфа.pdf",
        "page": 3
      },
      {
        "uri": "contracts://beta/page/5",
        "file": "Бета.pdf",
        "page": 5
      }
    ]
  6. Вызов MCPЛокально
    ШАГ 6 / 13

    Харнесс запрашивает ресурсы MCP

    Ресурс выбирает приложение: resources/read передаёт серверу адрес-URI конкретной страницы. Сервер понимает собственную схему contracts:// и возвращает извлечённый текст; это не tools/call.

    Приложение-агент → MCP: Файлы

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=2. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    1,125 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    8,428 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    stdio · запрос 21

    {
      "jsonrpc": "2.0",
      "id": 21,
      "method": "resources/read",
      "params": {
        "uri": "contracts://alpha/page/3",
        "_meta": {
          "io.modelcontextprotocol/protocolVersion": "2026-07-28",
          "io.modelcontextprotocol/clientCapabilities": {},
          "io.modelcontextprotocol/clientInfo": {
            "name": "videokarty-demo",
            "version": "1.0.0"
          }
        }
      }
    }

    stdio · запрос 22

    {
      "jsonrpc": "2.0",
      "id": 22,
      "method": "resources/read",
      "params": {
        "uri": "contracts://beta/page/5",
        "_meta": {
          "io.modelcontextprotocol/protocolVersion": "2026-07-28",
          "io.modelcontextprotocol/clientCapabilities": {},
          "io.modelcontextprotocol/clientInfo": {
            "name": "videokarty-demo",
            "version": "1.0.0"
          }
        }
      }
    }
  7. Чтение / запись дискаЛокально
    ШАГ 7 / 13

    Сервер читает извлечённые страницы

    Локальный сервер читает сохранённые текстовые фрагменты PDF. Номер страницы и имя исходного файла сохраняются для ссылок.

    MCP: Файлы → Диск

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=2. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    1,125 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    8,428 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Чтение диска

    Из кэша извлечённого текста:
    Альфа.pdf → страница 3
    Бета.pdf → страница 5
    Сам бинарный PDF не отправляется в текстовый messages.
  8. Вызов MCPЛокально
    ШАГ 8 / 13

    Фрагменты включены в контекст

    Ответы resources/read содержат result.contents, resultType и подсказки кэширования ttlMs/cacheScope. Приложение добавляет тексты как данные с указанием источников.

    MCP: Файлы → Приложение-агент

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=2. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    1,125 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    8,428 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Ответ на id=21

    {
      "jsonrpc": "2.0",
      "id": 21,
      "result": {
        "resultType": "complete",
        "_meta": {
          "io.modelcontextprotocol/serverInfo": {
            "name": "demo-mcp",
            "version": "1.0.0"
          }
        },
        "ttlMs": 0,
        "cacheScope": "private",
        "contents": [
          {
            "uri": "contracts://alpha/page/3",
            "mimeType": "text/plain",
            "text": "Альфа.pdf, страница 3: Счёт оплачивается в течение 10 рабочих дней с даты подписания акта обеими сторонами."
          }
        ]
      }
    }

    Ответ на id=22

    {
      "jsonrpc": "2.0",
      "id": 22,
      "result": {
        "resultType": "complete",
        "_meta": {
          "io.modelcontextprotocol/serverInfo": {
            "name": "demo-mcp",
            "version": "1.0.0"
          }
        },
        "ttlMs": 0,
        "cacheScope": "private",
        "contents": [
          {
            "uri": "contracts://beta/page/5",
            "mimeType": "text/plain",
            "text": "Бета.pdf, страница 5: Оплата производится не позднее 25 ноября 2026 года."
          }
        ]
      }
    }
  9. СубагентЛокально
    ШАГ 9 / 13

    Отдельное задание субагенту

    Харнесс создаёт отдельный короткий контекст: проверить только даты и условия оплаты. Субагент не получает всю историю основного агента.

    Приложение-агент → Субагент

    ○ CPU / приложение; GPU не участвует

    Слот субагента отдельно: ≈ 900 из 8192 токенов, условно.

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=2. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    1,125 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    8,428 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Переданный контекст

    {
      "instruction": "Проверь сроки в этих фрагментах. Не вычисляй дату без даты события.",
      "fragments": [
        {
          "uri": "contracts://alpha/page/3",
          "file": "Альфа.pdf",
          "page": 3,
          "text": "Счёт оплачивается в течение 10 рабочих дней с даты подписания акта обеими сторонами."
        },
        {
          "uri": "contracts://beta/page/5",
          "file": "Бета.pdf",
          "page": 5,
          "text": "Оплата производится не позднее 25 ноября 2026 года."
        }
      ]
    }
  10. Запрос к моделиЛокально
    ШАГ 10 / 13

    Два запроса — одна копия весов

    Субагент проверяет сроки, пока основной запрос готовит структуру ответа. OLLAMA_NUM_PARALLEL=2 настроен заранее: каждый слот имеет окно 8192 и свой KV-буфер; веса общие, VRAM на этом шаге не увеличивается.

    Субагент → Языковая модель
    Приложение-агент → Языковая модель

    ▣ GPU: два занятых слота общей LLM; KV выделен заранее

    Слот субагента отдельно: ≈ 900 из 8192 токенов, условно.

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=2. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    1,125 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    8,428 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Субагент · POST /api/chat

    {
      "model": "local-agent",
      "stream": false,
      "options": {
        "num_ctx": 8192
      },
      "messages": [
        {
          "role": "system",
          "content": "Проверь сроки, не придумывай недостающие даты."
        },
        {
          "role": "user",
          "content": "[\n  {\n    \"uri\": \"contracts://alpha/page/3\",\n    \"file\": \"Альфа.pdf\",\n    \"page\": 3,\n    \"text\": \"Счёт оплачивается в течение 10 рабочих дней с даты подписания акта обеими сторонами.\"\n  },\n  {\n    \"uri\": \"contracts://beta/page/5\",\n    \"file\": \"Бета.pdf\",\n    \"page\": 5,\n    \"text\": \"Оплата производится не позднее 25 ноября 2026 года.\"\n  }\n]"
        }
      ],
      "tools": []
    }

    Основной запрос · POST /api/chat

    {
      "model": "local-agent",
      "stream": false,
      "options": {
        "num_ctx": 8192
      },
      "messages": [
        {
          "role": "system",
          "content": "Подготовь структуру ответа. Даты будут проверены отдельным запросом."
        },
        {
          "role": "user",
          "content": "Нужны файл, страница, срок и оговорка для каждого договора."
        }
      ],
      "tools": []
    }
  11. СубагентЛокально
    ШАГ 11 / 13

    Субагент возвращает короткий итог

    Отдельный цикл завершён; в основной контекст возвращается краткий результат. Второй слот становится свободным, но в выбранном профиле его KV-буфер остаётся выделенным до выгрузки или перенастройки движка.

    Субагент → Приложение-агент

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=2. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    1,125 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    8,428 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Результат субагента

    Альфа.pdf, с. 3: 10 рабочих дней после подписания акта; даты акта нет, точный день оплаты не вычислен. Бета.pdf, с. 5: не позднее 25.11.2026.
  12. Запрос к моделиЛокально
    ШАГ 12 / 13

    Основной агент сверяет итог

    Модель получает исходные фрагменты и заключение субагента. В запросе есть основания для ссылок на страницы, но нет даты подписания акта «Альфа».

    Приложение-агент → Языковая модель

    ▣ GPU: инференс языковой модели

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=2. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    1,125 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    8,428 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    POST /api/chat

    {
      "model": "local-agent",
      "stream": false,
      "options": {
        "num_ctx": 8192
      },
      "messages": [
        {
          "role": "system",
          "content": "Отвечай по наблюдаемым данным. Запрашивай нужные инструменты; не выдумывай их результаты."
        },
        {
          "role": "user",
          "content": "Сроки оплаты. Фрагменты: [\n  {\n    \"uri\": \"contracts://alpha/page/3\",\n    \"file\": \"Альфа.pdf\",\n    \"page\": 3,\n    \"text\": \"Счёт оплачивается в течение 10 рабочих дней с даты подписания акта обеими сторонами.\"\n  },\n  {\n    \"uri\": \"contracts://beta/page/5\",\n    \"file\": \"Бета.pdf\",\n    \"page\": 5,\n    \"text\": \"Оплата производится не позднее 25 ноября 2026 года.\"\n  }\n]"
        },
        {
          "role": "user",
          "content": "Проверка субагента: Альфа.pdf, с. 3: 10 рабочих дней после подписания акта; даты акта нет, точный день оплаты не вычислен. Бета.pdf, с. 5: не позднее 25.11.2026."
        }
      ],
      "tools": []
    }
  13. Ответ / tool callЛокально
    ШАГ 13 / 13

    Ответ с файлами и страницами

    Модель различает фиксированную дату и относительный срок. Ссылки ниже открывают учебные выдержки на этой странице, а не ваши реальные файлы.

    Языковая модель → Приложение-агент → Пользователь

    ▣ GPU: инференс языковой модели

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=2. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    1,125 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    8,428 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Ответ Ollama · фрагмент

    {
      "message": {
        "role": "assistant",
        "content": "Альфа.pdf, с. 3: 10 рабочих дней после подписания акта; даты акта нет, точный день оплаты не вычислен. Бета.pdf, с. 5: не позднее 25.11.2026."
      }
    }

Что лежит в демонстрационных документах

Документы вымышленные; ссылки ведут к этим выдержкам, ваши файлы не читаются.

Альфа.pdf · страница 3

Счёт оплачивается в течение 10 рабочих дней с даты подписания акта обеими сторонами.

Адрес страницы для MCP-сервера: contracts://alpha/page/3

Бета.pdf · страница 5

Оплата производится не позднее 25 ноября 2026 года.

Адрес страницы для MCP-сервера: contracts://beta/page/5

Почини падающий тест и открой pull request

Условный репозиторий example/demo; обычные CPU-тесты. Разрешения, git-команды и PR — записанные события. Никакие файлы не изменяются и запросы не отправляются. Настройки на весь сценарий: num_ctx=8192, OLLAMA_NUM_PARALLEL=1; модель уже загружена, KV-буферы выделены заранее.

  1. Пользователь / контекстЛокально
    ШАГ 1 / 14

    Пользователь задаёт результат

    Задача — исправить тест и подготовить PR. В этом учебном харнессе чтение и тесты разрешены, запись и отправка требуют отдельных подтверждений.

    Пользователь → Приложение-агент

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Задача

    {
      "role": "user",
      "content": "Почини падающий тест и открой pull request"
    }
  2. Запрос к моделиЛокально
    ШАГ 2 / 14

    Модель получает встроенные tools

    Харнесс описывает shell, read_file и edit_file как собственные функции. Эти определения не получены от MCP-сервера.

    Приложение-агент → Языковая модель

    ▣ GPU: инференс языковой модели

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    POST /api/chat

    {
      "model": "local-agent",
      "stream": false,
      "options": {
        "num_ctx": 8192
      },
      "messages": [
        {
          "role": "system",
          "content": "Отвечай по наблюдаемым данным. Запрашивай нужные инструменты; не выдумывай их результаты."
        },
        {
          "role": "user",
          "content": "Почини падающий тест и открой pull request"
        }
      ],
      "tools": [
        {
          "type": "function",
          "function": {
            "name": "shell",
            "description": "Запустить тесты в рабочем каталоге",
            "parameters": {
              "type": "object",
              "properties": {
                "command": {
                  "type": "string"
                }
              },
              "required": [
                "command"
              ]
            }
          }
        },
        {
          "type": "function",
          "function": {
            "name": "read_file",
            "description": "Прочитать исходник",
            "parameters": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                }
              },
              "required": [
                "path"
              ]
            }
          }
        },
        {
          "type": "function",
          "function": {
            "name": "edit_file",
            "description": "Заменить фрагмент после подтверждения",
            "parameters": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                },
                "before": {
                  "type": "string"
                },
                "after": {
                  "type": "string"
                }
              },
              "required": [
                "path",
                "before",
                "after"
              ]
            }
          }
        }
      ]
    }
  3. Ответ / tool callЛокально
    ШАГ 3 / 14

    Модель запрашивает тест и исходник

    Ответ содержит два независимых tool call. Харнесс может выполнить их последовательно; в примере сначала показан тест.

    Языковая модель → Приложение-агент

    ▣ GPU: инференс языковой модели

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Ответ Ollama · фрагмент

    {
      "message": {
        "role": "assistant",
        "content": "",
        "tool_calls": [
          {
            "function": {
              "name": "shell",
              "arguments": {
                "command": "node --test test/total.test.mjs"
              }
            }
          },
          {
            "function": {
              "name": "read_file",
              "arguments": {
                "path": "src/total.mjs"
              }
            }
          }
        ]
      }
    }
  4. Встроенный инструментЛокально
    ШАГ 4 / 14

    Shell показывает одно падение

    Встроенный shell запускает тесты на CPU. Ошибка сообщает о reduce без начального значения для пустого массива.

    Приложение-агент → Встроенные tools

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Команда и сокращённый вывод

    node --test test/total.test.mjs
    ✗ total([]) equals 0
    TypeError: Reduce of empty array with no initial value
    Итог: 1 passed, 1 failed
  5. Чтение / запись дискаЛокально
    ШАГ 5 / 14

    Встроенный инструмент читает файл

    read_file реализован самим харнессом и читает src/total.mjs. Здесь нет MCP, хотя имя функции похоже на инструмент первого сценария.

    Встроенные tools → Диск → Приложение-агент

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Прочитанный файл

    src/total.mjs
    export const total = items => items.reduce((sum, n) => sum + n);
  6. Запрос к моделиЛокально
    ШАГ 6 / 14

    Модель получает ошибку и исходник

    Результаты обоих tool call добавлены в историю. Теперь у модели есть конкретное основание предложить изменение.

    Приложение-агент → Языковая модель

    ▣ GPU: инференс языковой модели

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    POST /api/chat

    {
      "model": "local-agent",
      "stream": false,
      "options": {
        "num_ctx": 8192
      },
      "messages": [
        {
          "role": "system",
          "content": "Отвечай по наблюдаемым данным. Запрашивай нужные инструменты; не выдумывай их результаты."
        },
        {
          "role": "user",
          "content": "Почини падающий тест и открой pull request"
        },
        {
          "role": "assistant",
          "content": "",
          "tool_calls": [
            {
              "function": {
                "name": "shell",
                "arguments": {
                  "command": "node --test test/total.test.mjs"
                }
              }
            },
            {
              "function": {
                "name": "read_file",
                "arguments": {
                  "path": "src/total.mjs"
                }
              }
            }
          ]
        },
        {
          "role": "tool",
          "tool_name": "shell",
          "content": "node --test test/total.test.mjs\n✗ total([]) equals 0\nTypeError: Reduce of empty array with no initial value\nИтог: 1 passed, 1 failed"
        },
        {
          "role": "tool",
          "tool_name": "read_file",
          "content": "export const total = items => items.reduce((sum, n) => sum + n);"
        }
      ],
      "tools": [
        {
          "type": "function",
          "function": {
            "name": "shell",
            "description": "Запустить тесты в рабочем каталоге",
            "parameters": {
              "type": "object",
              "properties": {
                "command": {
                  "type": "string"
                }
              },
              "required": [
                "command"
              ]
            }
          }
        },
        {
          "type": "function",
          "function": {
            "name": "read_file",
            "description": "Прочитать исходник",
            "parameters": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                }
              },
              "required": [
                "path"
              ]
            }
          }
        },
        {
          "type": "function",
          "function": {
            "name": "edit_file",
            "description": "Заменить фрагмент после подтверждения",
            "parameters": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                },
                "before": {
                  "type": "string"
                },
                "after": {
                  "type": "string"
                }
              },
              "required": [
                "path",
                "before",
                "after"
              ]
            }
          }
        }
      ]
    }
  7. Ответ / tool callЛокально
    ШАГ 7 / 14

    Модель предлагает правку

    Запрос edit_file добавляет начальное значение 0. Предложенная правка ещё не применена: харнесс сначала запрашивает разрешение.

    Языковая модель → Приложение-агент

    ▣ GPU: инференс языковой модели

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Ответ Ollama · фрагмент

    {
      "message": {
        "role": "assistant",
        "content": "",
        "tool_calls": [
          {
            "function": {
              "name": "edit_file",
              "arguments": {
                "path": "src/total.mjs",
                "before": "export const total = items => items.reduce((sum, n) => sum + n);",
                "after": "export const total = items => items.reduce((sum, n) => sum + n, 0);"
              }
            }
          }
        ]
      }
    }
  8. Ожидание пользователяЛокально
    ШАГ 8 / 14

    Ожидает подтверждения правки

    Можно посмотреть точную замену до записи. Автопроигрывание остановлено; «Дальше» изображает согласие на эту правку.

    Приложение-агент → Пользователь

    ○ CPU / приложение; GPU не участвует

    Ожидает подтверждения. Для учебного согласия нажмите «Дальше». Это не разрешение на реальную операцию.

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Запрос разрешения

    {
      "operation": "edit_file",
      "path": "src/total.mjs",
      "before": "export const total = items => items.reduce((sum, n) => sum + n);",
      "after": "export const total = items => items.reduce((sum, n) => sum + n, 0);",
      "status": "awaiting_confirmation"
    }
  9. Встроенный инструментЛокально
    ШАГ 9 / 14

    После согласия применяется правка

    В учебной записи пользователь согласился. Встроенный инструмент записывает только согласованную замену и возвращает результат.

    Пользователь → Приложение-агент → Встроенные tools → Диск

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Наблюдаемое действие

    {
      "permission": "approved",
      "tool": "edit_file",
      "path": "src/total.mjs",
      "before": "export const total = items => items.reduce((sum, n) => sum + n);",
      "after": "export const total = items => items.reduce((sum, n) => sum + n, 0);",
      "result": "1 replacement"
    }
  10. Встроенный инструментЛокально
    ШАГ 10 / 14

    Повторный запуск тестов

    После записи фиксированный шаг workflow запускает тот же набор тестов. GPU не участвует; успех тестов не доказывает отсутствие всех возможных ошибок.

    Приложение-агент → Встроенные tools

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Команда и вывод

    node --test test/total.test.mjs
    ✓ total([2, 3]) equals 5
    ✓ total([]) equals 0
    Итог: 2 passed, 0 failed
  11. Ожидание пользователяЛокально
    ШАГ 11 / 14

    Ожидает разрешения на отправку

    Перед выходом в сеть харнесс показывает репозиторий, ветку и состав изменений. Подтверждение охватывает git push и создание PR; без «Дальше» воспроизведение не продолжится.

    Приложение-агент → Пользователь

    ○ CPU / приложение; GPU не участвует

    Ожидает подтверждения. Для учебного согласия нажмите «Дальше». Это не разрешение на реальную операцию.

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Запрос разрешения

    {
      "operations": [
        "git push",
        "create_pull_request"
      ],
      "repository": "example/demo",
      "branch": "fix/total",
      "files": [
        "src/total.mjs"
      ],
      "status": "awaiting_confirmation"
    }
  12. СетьПо сети · Git; локальный коммит на CPU
    ШАГ 12 / 14

    Ветка отправляется по сети

    После согласия харнесс запускает shell: Git читает и записывает локальный коммит на диске, затем сам отправляет ветку по сети. Диск не отправляет запросы; существование удалённой ветки нужно для PR.

    Приложение-агент → Встроенные tools → Сеть / интернет
    Встроенные tools → Диск → Встроенные tools

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Учебный shell · сокращённый вывод

    git switch -c fix/total
    git add src/total.mjs
    git commit -m "Fix empty total"
    git push -u origin fix/total
    …
    Ветка fix/total отправлена в example/demo.
  13. Вызов MCPПо сети · Streamable HTTP
    ШАГ 13 / 14

    MCP GitHub создаёт pull request

    MCP-клиент отправляет JSON-RPC удалённому серверу. Версия в HTTP-заголовке совпадает с params._meta, а Mcp-Method и Mcp-Name — с методом и именем инструмента в теле.

    Приложение-агент → Сеть / интернет → MCP: GitHub

    ○ CPU / приложение; GPU не участвует

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    Streamable HTTP · сокращённый конверт

    POST https://mcp.example.invalid/github
    Content-Type: application/json
    Accept: application/json, text/event-stream
    MCP-Protocol-Version: 2026-07-28
    Mcp-Method: tools/call
    Mcp-Name: create_pull_request
    … данные авторизации не показаны

    Тело запроса

    {
      "jsonrpc": "2.0",
      "id": 31,
      "method": "tools/call",
      "params": {
        "name": "create_pull_request",
        "arguments": {
          "owner": "example",
          "repo": "demo",
          "head": "fix/total",
          "base": "main",
          "title": "Fix empty total",
          "body": "Добавлен начальный аккумулятор; 2 теста прошли."
        },
        "_meta": {
          "io.modelcontextprotocol/protocolVersion": "2026-07-28",
          "io.modelcontextprotocol/clientCapabilities": {},
          "io.modelcontextprotocol/clientInfo": {
            "name": "videokarty-demo",
            "version": "1.0.0"
          }
        }
      }
    }

    Ответ сервера

    {
      "jsonrpc": "2.0",
      "id": 31,
      "result": {
        "resultType": "complete",
        "_meta": {
          "io.modelcontextprotocol/serverInfo": {
            "name": "demo-mcp",
            "version": "1.0.0"
          }
        },
        "content": [
          {
            "type": "text",
            "text": "{\n  \"number\": 42,\n  \"url\": \"https://github.com/example/demo/pull/42\",\n  \"note\": \"Вымышленный PR учебного сценария\"\n}"
          }
        ],
        "isError": false
      }
    }
  14. Ответ / tool callЛокально
    ШАГ 14 / 14

    Итог основан на результатах

    Последний вызов модели суммирует применённую правку, тесты и ответ GitHub. PR не означает автоматическое слияние изменений.

    Языковая модель → Приложение-агент → Пользователь

    ▣ GPU: инференс языковой модели

    VRAM рабочей LLM · фиксированный бюджет

    Qwen3 8B · Q4_K_M · KV FP16. num_ctx=8192, OLLAMA_NUM_PARALLEL=1. Модель уже загружена; KV выделен под полное окно каждого слота и не растёт по шагам.

    Общие веса
    4,678 ГиБ
    KV первого слота
    1,125 ГиБ
    KV второго слота
    0 ГиБ
    Рабочий резерв
    1,5 ГиБ
    Сумма
    7,303 ГиБ

    Второй KV нужен при наличии второго параллельного слота, а не из-за самого названия «субагент». Заполнение и очистка токенов не равны освобождению буфера. Это оценка выбранного профиля без пика prefill и дополнительных рабочих буферов; другие движки могут выделять память иначе.

    POST /api/chat · сокращённая история

    {
      "model": "local-agent",
      "stream": false,
      "options": {
        "num_ctx": 8192
      },
      "messages": [
        {
          "role": "system",
          "content": "Отвечай по наблюдаемым данным. Запрашивай нужные инструменты; не выдумывай их результаты."
        },
        {
          "role": "user",
          "content": "… предыдущая история сокращена. Наблюдения харнесса: edit_file — 1 replacement; тесты — 2 passed; push выполнен; create_pull_request — учебный PR #42."
        }
      ],
      "tools": []
    }

    Ответ Ollama · фрагмент

    {
      "message": {
        "role": "assistant",
        "content": "Добавлено начальное значение reduce. Два теста прошли. Создан учебный PR #42; слияние не выполнялось."
      }
    }
Описание всех участников схемы
Пользователь
Задаёт цель, читает ответ и подтверждает операции. Кнопка «Дальше» на шаге ожидания изображает согласие только в учебной записи.
Приложение-агент
Собирает контекст и держит цикл. Внутри хоста — MCP-клиенты, по одному подключению к серверу. Проверки разрешений и встроенные инструменты тоже организует харнесс.
Языковая модель
Обрабатывает messages и описания tools; выдаёт текст или tool call. Здесь условный локальный alias local-agent означает Qwen3 8B в Q4_K_M. Запрос не даёт модели прямого доступа к диску.
GPU / VRAM
LLM загружена на GPU с num_ctx=8192 на слот. Буфер KV резервируется под настроенное окно и число слотов, а не растёт при каждом шаге. Числа — расчёт хранения из memory.mjs, не показания датчика.
Embedding-модель
Отдельная модель превращает вопрос в вектор для поиска. В этом сценарии она выполняется на CPU. В реальном приложении её можно разместить на GPU, тогда нужен отдельный бюджет VRAM.
Субагент
Отдельный цикл со своим контекстом использует общую LLM. Для параллельного запроса здесь заранее настроены два слота: OLLAMA_NUM_PARALLEL=2. Второй KV-буфер зарезервирован и до запуска субагента; второй копии весов нет.
MCP: Файлы
Учебный локальный сервер получает JSON-RPC через stdio. Предоставляет read_file и текстовые ресурсы извлечённых страниц. Имена функций и URI — пример реализации, не обязательные имена MCP.
MCP: Каталог GPU
Учебный локальный сервер с memory_estimate и search_gpus. Числа заранее рассчитаны при сборке сайта общей формулой, кандидаты взяты из редакционного каталога.
Встроенные tools
Shell, чтение и правка файла реализованы самим харнессом. Tool calling может запрашивать их, но это не превращает их в MCP. В сценарии запускаются обычные CPU-тесты, не GPU-задачи.
Диск
Хранит заметки, документы и код. Читает или пишет инструмент; содержимое не попадает в LLM, пока приложение не добавит его в сообщения.
Векторная база
Индекс документов подготовлен заранее: текст извлечён из PDF, разбит на фрагменты, посчитаны embeddings. Здесь поиск на CPU возвращает URI и страницы; он не обучает LLM.
Сеть / интернет
По сети уходят git push и запрос к удалённому MCP-серверу GitHub. Локальность LLM не означает отсутствие сети у инструментов. В этой демонстрации никакой отправки нет.
MCP: GitHub
Учебное удалённое подключение: MCP-клиент отправляет JSON-RPC по Streamable HTTP. Сервер создаёт PR через GitHub API. Ветка должна быть отправлена до создания PR; URL и репозиторий здесь вымышлены.

Что важно заметить

  • Модель не исполняет инструменты сама: она возвращает запрос, а харнесс проверяет его и организует выполнение.
  • MCP — способ подключить внешние инструменты и данные. Встроенный shell и правка файла не обязаны использовать MCP.
  • Результаты инструментов и фрагменты документов занимают контекст следующего вызова. Они не меняют обученные веса.
  • В этой конфигурации GPU вычисляет только на шагах LLM. Диск, сеть и обычные тесты работают без него; embedding-модель здесь на CPU.
  • В выбранном профиле KV-буферы выделены заранее под num_ctx × число слотов. В RAG настроены два слота по 8192: второй KV зарезервирован до запуска субагента и сохраняется после его ответа. При одном слоте запросы выполнялись бы последовательно; отдельные процессы могут дублировать и веса.
  • Разрешения пользователя — часть харнесса. Остановка воспроизведения помогает увидеть момент ожидания человека.

Это практическое разделение ролей, не единственный стандарт терминологии. Модель, агент и харнесс → · Контекст, память и RAG →

Форматы и первоисточники

Проверено . Примеры используют MCP 2026-07-28; поля сверены с официальной schema.ts. Каждый запрос передаёт версию и возможности клиента в params._meta. Возможности сервера можно узнать через server/discover; отдельного рукопожатия и протокольных сессий здесь нет. Результаты содержат resultType; ответы tools/list, server/discover и resources/read также содержат ttlMs и cacheScope.

Имена инструментов, URI, alias модели и результаты — учебные. Данные авторизации и часть истории сокращены с пометкой «…». HTTP-заголовки Mcp-Method/Mcp-Name соответствуют методу и имени инструмента; MCP-Protocol-Version совпадает с версией в теле. Roots, Sampling и Logging в этой редакции объявлены устаревшими и в примерах не используются.

JSON отформатирован для чтения: в stdio каждое сообщение передаётся одной строкой. Для бинарного PDF ресурс использовал бы blob; здесь возвращается извлечённый текст с mimeType text/plain. Поддержка конкретной модели и tool calling зависит от движка и шаблона чата. VRAM оценивается для заранее выделенных окон; заполнение контекста не является измерителем выделенной памяти. Контекст и KV-кэш → · Почему не хватает памяти →

Что будем искать?

Например: RTX 5090, память, Ollama