Skip to main content

OpenJet

Self-hosted local AI coding agent for Ollama, LM Studio, and llama.cpp

Use your existing local LLM server, or let OpenJet provision and host the right GGUF model for your hardware. Then use the same runtime through the terminal agent or Python SDK.

OpenJet is an open-source, private AI coding assistant that reads and edits files, runs approved shell commands, uses tools, and keeps sessions on your machine. It connects to Ollama, LM Studio, llama.cpp, and other OpenAI-compatible local servers. If you do not already have a local AI stack, openjet setup downloads, configures, and serves one for you.

RTX 3090 + Qwen 27B: 33 tok/s -> 70 tok/s with MTP. Open source.

Discord

In your terminal, OpenJet is a self-hosted coding agent:

files -> tools -> shell approval -> workflows -> local model

In your code, it is a way to ship an on-device model inside your own application — an in-app assistant, an NPC that talks, a classifier, an extraction pipeline. Run openjet project in your project at build time and the model is chosen for your target device, downloaded into the project, and bundled with your build. The SDK never downloads at runtime, so your users never fetch a file or see a config.

No hosted API is required. With a local profile, no code or prompt data leaves your machine.

RTX 3090 + Qwen 27B: 33 tok/s -> 70 tok/s with MTP.

Open source.

If you are new to local LLMs, OpenJet is the fastest way to get started without spending hours figuring out models, runtimes, and config. If you have already tried local LLMs and got frustrated piecing together a model backend, a frontend, and an actual agent workflow, OpenJet removes that setup tax.

This is the PyPI package for OpenJet. Install it with:

pip install open-jet

The package installs:

  • CLI + chat TUI — interactive local agent work in the terminal
  • Python SDK — embed sessions, profile hardware, and automate workflows
  • Benchmarking tools — measure prompt and generation performance on your hardware

Quick Start

pip install open-jet
openjet setup
openjet

openjet setup detects your hardware, picks a model that fits your RAM, downloads it, and gets everything running. Already have a .gguf? It finds that too.

Recommended hardware: Apple silicon with 24GB+ unified memory, or a GPU with 14GB+ VRAM.

CLI

The primary entrypoint is the openjet command:

openjet                     # start interactive session
openjet setup               # provision a coding model for this machine
openjet project             # provision the model your application ships with
openjet benchmark --sweep   # run a hardware benchmark sweep

The CLI is a full terminal agent that can:

  • Work with local files — search, read, create, and update files in your projects
  • Run shell commands — with explicit approval before execution
  • Run workflows and checks — inspect results, update files, and try again against the local model
  • Resume sessions — close the terminal and pick up where you left off
  • Work on constrained hardware — automatic context condensing and model unload/reload around heavy tasks
  • Connect to devices — cameras, microphones, GPIO, and remote devices for edge and embedded workflows
  • Connect tools — trusted MCP servers are exposed through the normal OpenJet tool registry

Embed a local LLM in your own application

Provision the model once, at build time, in the project that will ship it:

cd your-project
openjet project --use-case dialogue --target handheld --budget 4

Selection is driven by what the model is for, the device you ship to (declared, not detected — the machine you build on is not the machine your users have), and the memory your application can concede. The weights land in .openjet/models/ so your build can bundle them, and .openjet/config.yaml pins them for the SDK.

import asyncio

from openjet.sdk import create_inference_session


async def main() -> None:
    session = await create_inference_session()
    try:
        result = await session.run("Summarise this support ticket in one line.")
        print(result.text)
    finally:
        await session.close()


asyncio.run(main())

create_inference_session() refuses every tool — text in, text out — so an embedded model cannot reach the shell or the filesystem no matter what it generates. Use create_agent() when you do want the full agent surface.

Nothing downloads at runtime. A missing model raises immediately rather than reaching for the network on a user's machine, so your users never fetch a file, see a config, or need an internet connection.

Python SDK

Use openjet.sdk to embed the same runtime in your own Python application.

from openjet.sdk import OpenJetSession, create_inference_session, recommend_hardware_config

Session API

Run agent sessions programmatically:

import asyncio
from openjet.sdk import OpenJetSession


async def main() -> None:
    session = await OpenJetSession.create()
    try:
        result = await session.run("Summarize the current README")
        print(result.text)
    finally:
        await session.close()


asyncio.run(main())

The session API exposes:

  • OpenJetSession.create(...) — create a session
  • session.run(...) — run a prompt and get the result
  • session.stream(...) — stream events as they arrive
  • session.set_airgapped(...) — toggle air-gapped mode
  • session.add_turn_context(...) / session.clear_turn_context(...) — manage turn context
  • create_agent(...) — construct an agent instance

Hardware Recommendation API

Get model and runtime recommendations for your hardware:

from openjet.sdk import recommend_hardware_config

result = recommend_hardware_config(
    {
        "total_ram_gb": 16,
        "gpu": "cuda",
        "vram_mb": 24576,
        "label": "RTX 4090 box",
    }
)

print(result.model.label)
print(result.model.target_path)
print(result.llama.device)
print(result.llama.gpu_layers)
print(result.llama.context_window_tokens)

Typed input is also supported:

from openjet.sdk import HardwareRecommendationInput, recommend_hardware_config

result = recommend_hardware_config(
    HardwareRecommendationInput(
        total_ram_gb=8.0,
        gpu="cpu",
        hardware_profile="other",
        hardware_override="desktop_8",
    )
)

SDK Surface

The supported public SDK surface:

from openjet.sdk import (
    HardwareRecommendation,
    HardwareRecommendationInput,
    OpenJetSession,
    RecommendedLlamaConfig,
    RecommendedModel,
    SDKEvent,
    SDKEventKind,
    SDKResponse,
    ToolResult,
    create_agent,
    create_inference_session,
    recommend_hardware_config,
)

Package Contents

This wheel includes the full OpenJet package:

  • openjet.sdk — Python integrations
  • CLI entrypoint openjet (installed as open-jet on PyPI)
  • Benchmark entrypoints via openjet benchmark
  • The local/session runtime shared by the SDK and CLI

Repository

License

OpenJet core is licensed under AGPL-3.0-only.

This package covers the AGPL-licensed core SDK and CLI. Future hosted, team, or enterprise offerings may be licensed separately.

External contributions are accepted under the contributor terms in the repository's CONTRIBUTING.md and CLA.md.

Metadata

Release files for open-jet 0.4.32

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for open-jet 0.4.32
File
open_jet-0.4.32-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
open_jet-0.4.32-py3-none-manylinux_2_17_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64 Details
open_jet-0.4.32-py3-none-manylinux_2_17_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details
open_jet-0.4.32-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details
open_jet-0.4.32-py3-none-macosx_10_15_x86_64.whl Python 3 none macOS 10.15+ x86-64 Details

Total release size: 184.4 MB

Release files / open_jet-0.4.32-py3-none-win_amd64.whl

Download URL open_jet-0.4.32-py3-none-win_amd64.whl
Size 44.1 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
9fe1ae085f7f1ae87cccaceccb18e96c5713dec93799e3988ef815d9b4ab4a5c
BLAKE2b-256 checksum
How to use checksums
f81b9292eec5ae2087087ad5801644b3f34194aad2b69f927b61a40a719d8f8f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / open_jet-0.4.32-py3-none-manylinux_2_17_x86_64.whl

Download URL open_jet-0.4.32-py3-none-manylinux_2_17_x86_64.whl
Size 42.4 MB
Tags Linux glibc 2.17+ x86-64 Python 3
SHA-256 checksum
How to use checksums
19f1437c64256cb0650b88af7bdee9bbb676c970e3f7f042cc661d8a355e4953
BLAKE2b-256 checksum
How to use checksums
d62bad74f4a64ddfa566a928e12acb47dd03ef939c73c905ad5d649bb95a3268
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / open_jet-0.4.32-py3-none-manylinux_2_17_aarch64.whl

Download URL open_jet-0.4.32-py3-none-manylinux_2_17_aarch64.whl
Size 41.9 MB
Tags Linux glibc 2.17+ ARM64 Python 3
SHA-256 checksum
How to use checksums
1304aca9b8cd892cc37124cd5bbc77643e315b7df8747f0aa2095b084f324a70
BLAKE2b-256 checksum
How to use checksums
bf6ade0e427856d36f26683a2eb5c5be85740e1baf3df50f6a75b47c708ebca1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / open_jet-0.4.32-py3-none-macosx_11_0_arm64.whl

Download URL open_jet-0.4.32-py3-none-macosx_11_0_arm64.whl
Size 26.9 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
50fbd45692851b27dbc05f0ffb6db8f177c2fdd6e50f50ec61f752496adba9f7
BLAKE2b-256 checksum
How to use checksums
72af96ef96688b0bca4237ebf2f67a1025125e0945692f5ee81a5d03508c99c8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / open_jet-0.4.32-py3-none-macosx_10_15_x86_64.whl

Download URL open_jet-0.4.32-py3-none-macosx_10_15_x86_64.whl
Size 29.1 MB
Tags Python 3 macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
a03b30058cbc7adb2d601f30ccf5c7c18a999562d395dd0d34a6eda95aa3422d
BLAKE2b-256 checksum
How to use checksums
a7e2fc8db0e3854a769ca19d35901a86b783b05e503a611926efbc62c90244c8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

0.5.1

5 release files

0.5.0

5 release files

0.4.33

5 release files

This release

0.4.32 This release

5 release files

0.4.31

1 release file

0.4.30

1 release file

0.4.29

1 release file

0.4.28

1 release file

0.4.27

1 release file

0.4.26

1 release file

0.4.25

1 release file

0.4.24

1 release file

0.4.23

1 release file

0.4.22

1 release file

0.4.21

1 release file

0.4.20

1 release file

0.4.19

1 release file

0.4.18

1 release file

0.4.17

1 release file

0.4.16

1 release file

0.4.15

1 release file

0.4.14

1 release file

0.4.13

1 release file

0.4.12

1 release file

0.4.11

1 release file

0.4.10

1 release file

0.4.9

1 release file

0.4.8

1 release file

0.4.7

1 release file

0.4.6

1 release file

0.4.5

1 release file

0.4.4

1 release file

0.4.2

1 release file

0.4.1

1 release file

0.3.13

1 release file

0.3.12

1 release file

0.3.11

1 release file

0.3.10

1 release file

0.3.9

1 release file

0.3.8

1 release file

0.3.7

1 release file

0.3.6

1 release file

0.3.5

1 release file

0.3.3

1 release file

0.1.16

1 release file

0.1.14

1 release file

0.1.13

1 release file

0.1.12

1 release file

0.1.10

1 release file

0.1.8

1 release file

0.1.5

1 release file

0.1.4

1 release file

0.1.3

1 release file

0.1.2

1 release file

0.1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page