Skip to main content
Glama

openlocal

Открытые инструменты. Локальный интеллект. Никакого облака.

Набор инструментов, с которым действительно могут работать маленькие локальные модели — и доказательства этому.

CI PyPI Python Зависимости Лицензия


pip install openlocal
openlocal quickstart

Вот и всё. quickstart находит сервер модели, который у вас уже запущен — ollama, LM Studio, llama.cpp, vLLM — записывает вашу конфигурацию, измеряет, какой протокол вызова инструментов ваша модель действительно может использовать, и запускает реальную задачу, чтобы вы увидели, как это работает:

$ openlocal quickstart
openlocal quickstart - looking for a model server...
found ollama at http://127.0.0.1:11434/v1 with 6 model(s)
wrote ~/.openlocal/models.toml
default model: qwen3-4b  (served as qwen3:4b)
measuring which tool protocol this model can drive...
  -> native tool calling

demo: Read notes.md and tell me how many lines it has.
  tool     file_read
  final

  The file notes.md has 3 lines.

You are set up. Try:
  openlocal run "list the files here and summarise what this project is"
  openlocal eval          # score this model on 15 deterministic tool tasks
  openlocal mcp           # serve these tools to Claude Code over MCP

Зачем нужен openlocal

🪶 Ноль зависимостей

Чистая стандартная библиотека. Устанавливается за секунды, работает на Raspberry Pi и не может быть сломана чьим-то релизом.

🔌 Работает с тем, что у вас есть

Всё, что говорит на API OpenAI /v1. Один URL, никаких адаптеров, никаких аккаунтов.

📊 Измерено, не заявлено

10 моделей от 9 вендоров, оценённых по 17 детерминированным задачам. Никакого LLM-судьи — каждая проверка это diff файлов или регулярное выражение.

🧰 Один реестр, два интерфейса

Те же 8 инструментов работают как MCP-сервер (Claude Code, любой MCP-клиент) и как агентский цикл для локальной модели.

🩹 Настроено на реальных ошибках

Каждое эргономическое правило здесь оплачено сбоем модели. Таблица уроков — то, чего вы больше нигде не найдёте.

🧩 Добавьте вендора, отредактировав TOML

Новая семья моделей? Отредактируйте families.toml, запустите openlocal probe, отправьте PR. Python не нужен.

Related MCP server: Hermes MCP Server

Таблица лидеров

Одни и те же задачи, одни и те же инструменты, по одной модели за раз, по два запуска каждая. tools — это протокол, который измерено использует модель — не тот, что заявлен в её документации.

модель

вендор

инструменты

пройдено

процент прохождения

плохой json

ток/с

qwen3.8-4b

Alibaba

нативные

17/17

100%

0

40.4

glm-4.7-flash

z.ai

нативные

17/17

100%

0

39.9

qwen3.8-27b

Alibaba

нативные

17/17

100%

0

16.6

nemotron-nano-4b

NVIDIA

нативные

16/17

94%

0

54.9

gemma-4-e4b

Google

нативные

16/17

94%

0

50.3

gpt-oss-20b

OpenAI

нативные

16/17

94%

2¹

45.3

granite-4.1-3b

IBM

нативные

15/17

88%

4

66.0

llama-3.1-8b

Meta

нативные

14/17

85%

2

33.4

mistral-small-3.2

Mistral

нативные

14/17

82%

0

11.1

phi-4-mini

Microsoft

нативные

13/17

79%

0

61.5

¹ Парсер гармонии gpt-oss отклоняет некоторые из его собственных вызовов инструментов (llama.cpp отвечает 500). Лестница повторных попыток клиента восстанавливает каждый из них — столбец retries в RESULTS.md отражает это честно.

Воспроизведите: openlocal leaderboard --repeat 2

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

Модель на 3B параметров терпит неудачу не потому, что она глупая. Она терпит неудачу, потому что вывод инструмента — это промпт, а большинство выводов инструментов написаны для людей. Всё ниже было измерено — оставлено, когда оценка росла, и отменено, когда нет.

что сломалось

исправление

измеренный эффект

«Что в строке 300?» → модель ответила про строку 311

нумеровать каждую строку: 300| row 300

исправлено за один раз, на всех моделях

Модель проходила файл на 500 строк по одной строке за шаг

нижние колонтитулы сообщают факты, а не команды («файл продолжается» ≠ «вызови снова…»)

phi: 12 потраченных шагов → 2

Проза вместо вызова инструмента

проза без инструмента = окончательный ответ (только нативные)

phi: 51 некорректных ответов → 5

…но «Конечно, я использую file_grep» — это план

обнаружение намерений: планы подталкиваются, ответы принимаются

запуски перестали заканчиваться на намерениях

file_read(notes.md) введён как текст

синтаксис прозаического вызова разбирается и выполняется

устранены потраченные впустую ходы

{"limit": None}, хвостовой мусор, разделённые объекты

восстановление JSON: поиск скобок, закрытие хвоста, литералы Python, слияние фрагментов

phi плохой_json 5 → 0

Модель записала файл до того, как прочитала исходник

обнаружение устаревшей записи в момент завершения

llama: 13 → 15 / 15

Модель угадала «44» и повторяла это при подсказке

один ход tool_choice: "required"

granite восстановил задачу

Идеально прочитала CSV из 4 строк, сказала, что сумма равна 40

инструмент calc — и защита, чтобы его нельзя было использовать до чтения

granite: +2 задачи

Записала выходной файл, ни разу не прочитав исходник

обнаружение записи «из воздуха» в момент завершения

qwen-4b через MCP восстановлен

Скопировала префиксы ссылок N| в цели редактирования

file_edit удаляет их, если необработанный текст не совпадает

edit_code: 10/10 моделей проходят

Один и тот же вызов, бесконечно (A→B→A→B)

защита от повтора воспроизводит кэшированный результат

пагинационный цикл llama исчез

Сервер выдаёт 500 на свой же синтаксис вызова инструментов

лестница повторных попыток: как запрошено → теплее → тот же ход без tools

gpt-oss: 11/15 → 14/15

Отменено: ещё одно правило в системном промпте

—

granite 12/15 → 11/15. Меньше правил — лучше.

MCP — полноправный участник, а не обёртка

openlocal eval --via-mcp перезапускает весь набор тестов с инструментами, предоставляемыми через реальный stdio MCP-сервер — схемы, передаваемые по проводу, результаты в виде блоков контента, подпроцесс на задачу. Результаты совпадают с внутрипроцессными числами, в этом и суть: то, что видит Claude Code, было измерено.

Используйте из Claude Code (или любого MCP-клиента)

pip install "openlocal[mcp]"
claude mcp add openlocal -- openlocal mcp

Те же 10 инструментов, которые использует ваша локальная модель, теперь в Claude Code. finish остаётся позади — это управление циклом, а не возможность.

Команды

openlocal quickstart              # find a server, configure, probe, demo
openlocal run "goal"              # agent loop over your tools
openlocal run "goal" --url http://host:1234/v1     # no config at all
openlocal chat "hello"            # one plain turn, no tools
openlocal tools                   # what the model can call
openlocal probe                   # measure native vs JSON tool calling
openlocal eval                    # 17 deterministic tasks, pass/fail
openlocal eval --via-mcp          # same tasks, tools served over a REAL MCP server
openlocal leaderboard --repeat 2  # every configured model, one table
openlocal mcp                     # stdio MCP server
openlocal models / serve / stop / status / pull    # local llama-server management

smol — более короткий псевдоним для той же CLI.

Конфигурация

Ваша рабочая область — ~/.openlocal (или любая директория, содержащая models.toml, или $OPENLOCAL_HOME). Она содержит models.toml, state.json, логи, загрузки и результаты тестов — никогда не устанавливаемый пакет.

[engine.ollama]
type = "external"
base_url = "http://127.0.0.1:11434/v1"

[[model]]
id = "qwen"
engine = "ollama"
family = "qwen"              # tells openlocal this vendor's tool-calling quirks
served_model = "qwen3:4b"    # the exact name the backend knows
default = true

переменная окружения

значение по умолчанию

значение

OPENLOCAL_HOME

~/.openlocal

рабочая директория

OPENLOCAL_BASE_URL

–

направить каждую команду на один сервер /v1

SMOL_ROOT

текущая рабочая директория

корневая песочница для файловых и шелл-инструментов

SMOL_MAX_CHARS

8000

жёсткое ограничение на один результат инструмента

SMOL_SHELL_ALLOW

команды разработчика

список через запятую, или *

SMOL_TOOL_TIMEOUT

120

секунд до отмены вызова MCP-инструмента

Инструменты

file_list(path=".")                       list files and folders
file_read(path, start_line=1, limit=200)  read a file, one page at a time
file_write(path, content)                 write a file
file_edit(path, find, replace)            replace text exactly, leave the rest alone
file_append(path, content)                add to the end without touching what exists
file_grep(pattern, path=".")              search files
web_search(query, limit=5)                search the web (DuckDuckGo, or Tavily via key)
web_read(url, offset=0, max_chars=4000)   read a page as text
shell_run(command, timeout=60)            run one allowlisted command
calc(expression)                          exact arithmetic - models cannot count
finish(answer)                            agent loop only: end the task

Внутренние правила, подкреплённые тестами: плоские аргументы со значениями по умолчанию, пример вызова в каждом описании, однострочные заголовки результатов, вывод с жёстким ограничением и правдивой подсказкой о продолжении, и ошибки, которые называют следующий шаг — нет такого файла: x - вызовите file_list("."), чтобы увидеть существующие файлы.

Архитектура

tools/          one registry  →  mcp_server.py   (Claude Code speaks MCP to it)
                              →  agent.py        (a local model calls the same tools)
_http.py        the entire network layer, on urllib (this is why deps = 0)
runner.py       external servers, or llama-server processes it starts and owns
protocol.py     native tool_calls → loose JSON → repair → symptom-specific nudge
families.toml   per-vendor quirks as DATA - the file contributors edit
evals/          17 deterministic tasks + a leaderboard across models

Участие в разработке

Добавление семейства моделей не требует Python: отредактируйте families.toml, добавьте свою модель в models.toml, затем

openlocal probe --model your-model
openlocal eval  --model your-model

и вставьте полученную строку в PR. См. CONTRIBUTING.md.

Запуск локальных моделей GGUF на оборудовании AMD (ROCmFP4 + MTP спекулятивное декодирование) описан в docs/ENGINE.md — опционально и не требуется для всего вышеперечисленного.

Лицензия

MIT © DevXV3

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    A lightweight and fast MCP server that enables AI agents to efficiently discover and execute tools through progressive disclosure, minimizing context consumption while supporting safe code execution in external environments.
    9 npm
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    A lightweight Node.js MCP server with zero dependencies offering 9 built-in tools for system info, web fetching, GitHub search, file operations, shell execution, and key-value memory, enabling AI agents to perform these tasks via the Model Context Protocol.
    -