Skip to main content
Glama

openlocal

Offene Werkzeuge. Lokale Köpfe. Keine Cloud.

Ein Werkzeuggürtel, den kleine lokale Modelle tatsächlich nutzen können – und die Belege, um es zu beweisen.

CI PyPI Python Dependencies License


pip install openlocal
openlocal quickstart

Das ist alles. quickstart findet den Modellserver, den Sie bereits ausführen – ollama, LM Studio, llama.cpp, vLLM – schreibt Ihre Konfiguration, misst, welches Tool-Calling-Protokoll Ihr Modell tatsächlich nutzen kann, und führt eine echte Aufgabe aus, damit Sie es in Aktion sehen:

$ 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

Warum openlocal

🪶 Null Abhängigkeiten

Reine Standardbibliothek. Installiert in Sekunden, läuft auf einem Raspberry Pi und kann nicht durch die Veröffentlichung eines anderen kaputt gemacht werden.

🔌 Funktioniert mit dem, was Sie haben

Alles, was die OpenAI /v1 API spricht. Eine URL, keine Adapter, keine Konten.

📊 Gemessen, nicht behauptet

10 Modelle von 9 Anbietern, bewertet anhand von 17 deterministischen Aufgaben. Kein LLM-Richter – jede Prüfung ist ein Datei-Diff oder ein Regex.

🧰 Ein Register, zwei Oberflächen

Die gleichen 8 Werkzeuge betreiben einen MCP-Server (Claude Code, jeder MCP-Client) und eine lokale Modell-Agentenschleife.

🩹 Abgestimmt auf echte Fehler

Jede ergonomische Regel hier wurde durch ein Modell bezahlt, das kaputt ging. Die Lektionentabelle ist der Teil, den Sie sonst nirgendwo bekommen.

🧩 Einen Anbieter durch Bearbeiten von TOML hinzufügen

Neue Modellfamilie? Bearbeiten Sie families.toml, führen Sie openlocal probe aus, senden Sie einen PR. Kein Python nötig.

Related MCP server: Hermes MCP Server

Die Bestenliste

Gleiche Aufgaben, gleiche Werkzeuge, ein Modell nach dem anderen, zwei Durchläufe pro Modell. tools ist das Protokoll, das jedes Modell gemessen verwendet hat – nicht das, was seine Dokumentation behauptet.

Modell

Anbieter

Werkzeuge

Bestanden

Bestehensquote

Fehlerhafte JSON

Tok/s

qwen3.8-4b

Alibaba

native

17/17

100%

0

40.4

glm-4.7-flash

z.ai

native

17/17

100%

0

39.9

qwen3.8-27b

Alibaba

native

17/17

100%

0

16.6

nemotron-nano-4b

NVIDIA

native

16/17

94%

0

54.9

gemma-4-e4b

Google

native

16/17

94%

0

50.3

gpt-oss-20b

OpenAI

native

16/17

94%

2¹

45.3

granite-4.1-3b

IBM

native

15/17

88%

4

66.0

llama-3.1-8b

Meta

native

14/17

85%

2

33.4

mistral-small-3.2

Mistral

native

14/17

82%

0

11.1

phi-4-mini

Microsoft

native

13/17

79%

0

61.5

¹ Der Harmony-Parser von gpt-oss lehnt einige seiner eigenen Tool-Aufrufe ab (llama.cpp antwortet 500). Die Wiederholungsleiter des Clients stellt jeden wieder her – die Spalte retries in RESULTS.md hält das ehrlich.

Reproduzieren Sie es: openlocal leaderboard --repeat 2

Warum Ihr kleines Modell bei Werkzeugen versagt

Ein 3B-Modell versagt nicht, weil es dumm ist. Es versagt, weil Tool-Ausgabe ein Prompt ist und die meisten Tool-Ausgaben für Menschen geschrieben sind. Alles unten wurde gemessen – behalten, wenn die Punktzahl stieg, rückgängig gemacht, wenn nicht.

Was kaputt ging

Die Lösung

Gemessener Effekt

"Was ist Zeile 300?" → Modell antwortete Zeile 311

jede Zeile nummerieren: 300| row 300

in einem Durchgang behoben, modellübergreifend

Modell durchlief eine 500-zeilige Datei eine Zeile pro Durchgang

Fußzeilen geben Fakten an, keine Befehle ("Datei wird fortgesetzt" ≠ "erneut aufrufen mit…")

phi: 12 verschwendete Schritte → 2

Prosa statt eines Tool-Aufrufs

Prosa ohne Tool = die endgültige Antwort (nur nativ)

phi: 51 fehlerhafte Antworten → 5

…aber "Klar, ich verwende file_grep" ist ein Plan

Absichtserkennung: Pläne werden angestoßen, Antworten werden akzeptiert

Läufe hörten auf, bei Absichten zu enden

file_read(notes.md) als Text eingegeben

Prosa-Aufrufsyntax wird geparst und ausgeführt

verschwendete Durchgänge beseitigt

{"limit": None}, nachgestellter Müll, geteilte Objekte

JSON-Reparatur: Klammer-Scan, Enden schließen, Python-Literale, Fragment-Zusammenführung

phi bad_json 5 → 0

Modell schrieb die Datei bevor es die Quelle las

Erkennung von veralteten Schreibvorgängen zum Abschlusszeitpunkt

llama: 13 → 15 / 15

Modell riet "44" und wiederholte es, wenn es angestoßen wurde

ein Durchgang von tool_choice: "required"

granite erholte die Aufgabe

Las eine 4-zeilige CSV perfekt, sagte die Summe sei 40

ein calc-Tool – und eine Wache, damit es nicht vor dem Lesen verwendet werden kann

granite: +2 Aufgaben

Schrieb die Ausgabedatei, ohne jemals die Quelle zu lesen

Erkennung von aus der Luft gegriffenen Schreibvorgängen zum Abschlusszeitpunkt

qwen-4b über MCP erholte sich

Kopierte die N|-Referenzpräfixe in Bearbeitungsziele

file_edit entfernt sie, wenn der Rohtext nicht übereinstimmt

edit_code: 10/10 Modelle bestehen

Gleicher Aufruf, für immer (A→B→A→B)

Wiederholungswächter spielt das zwischengespeicherte Ergebnis erneut ab

llama-Paginierungsschleife verschwunden

Server 500 auf eigener Tool-Aufruf-Syntax

Wiederholungsleiter: wie angefragt → wärmer → gleicher Durchgang ohne tools

gpt-oss: 11/15 → 14/15

Rückgängig gemacht: eine weitere System-Prompt-Regel

—

granite 12/15 → 11/15. Weniger Regeln gewinnen.

MCP ist ein erstklassiger Bürger, kein Wrapper

openlocal eval --via-mcp führt die gesamte Evaluierungssuite erneut aus, wobei die Werkzeuge über einen echten stdio-MCP-Server bereitgestellt werden – Schemas über die Leitung, Ergebnisse als Inhaltsblöcke, ein Unterprozess pro Aufgabe. Die Ergebnisse stimmen mit den prozessinternen Zahlen überein, und das ist der Punkt: Was Claude Code erlebt, wurde gemessen.

Verwenden Sie es von Claude Code (oder einem beliebigen MCP-Client)

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

Die gleichen 10 Werkzeuge, die Ihr lokales Modell verwendet, jetzt in Claude Code. finish bleibt zurück – es ist Schleifensteuerung, keine Fähigkeit.

Befehle

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 ist ein kürzerer Alias für dieselbe CLI.

Konfiguration

Ihr Arbeitsbereich ist ~/.openlocal (oder ein beliebiges Verzeichnis, das models.toml oder $OPENLOCAL_HOME enthält). Es enthält models.toml, state.json, Protokolle, Downloads und Evaluierungsergebnisse – niemals das installierte Paket.

[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

Umgebungsvariable

Standard

Bedeutung

OPENLOCAL_HOME

~/.openlocal

Arbeitsbereichsverzeichnis

OPENLOCAL_BASE_URL

–

jeden Befehl auf einen /v1-Server ausrichten

SMOL_ROOT

cwd

Sandbox-Root für die Datei- und Shell-Werkzeuge

SMOL_MAX_CHARS

8000

harte Obergrenze für ein Tool-Ergebnis

SMOL_SHELL_ALLOW

dev-Befehle

Komma-Liste oder *

SMOL_TOOL_TIMEOUT

120

Sekunden, bevor ein MCP-Tool-Aufruf abgebrochen wird

Die Werkzeuge

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

Hausregeln, durch Tests erzwungen: flache Argumente mit Standardwerten, ein Beispielaufruf in jeder Beschreibung, einzeilige Ergebnisüberschriften, hart begrenzte Ausgabe mit einem wahrheitsgemäßen Fortsetzungshinweis und Fehler, die den nächsten Schritt nennen – no such file: x - call file_list(".") to see the files that exist.

Architektur

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

Mitwirken

Das Hinzufügen einer Modellfamilie erfordert kein Python: Bearbeiten Sie families.toml, fügen Sie Ihr Modell zu models.toml hinzu, dann

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

und fügen Sie die resultierende Zeile in den PR ein. Siehe CONTRIBUTING.md.

Das Ausführen lokaler GGUF-Modelle auf AMD-Hardware (ROCmFP4 + MTP spekulative Dekodierung) ist in docs/ENGINE.md dokumentiert – optional und für nichts oben Genanntes erforderlich.

Lizenz

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.
    -