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.

On NVIDIA RTX 30, 40 and 50-series GPUs with 24 GB+, OpenJet serves Qwen3.8-27B through its own CUDA engine at 1.5x the speed of llama.cpp (measured on an RTX 3090). 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.

On NVIDIA RTX 30, 40 and 50-series GPUs with 24 GB+, OpenJet serves Qwen3.8-27B through its own CUDA engine at 1.5x the speed of llama.cpp (measured on an RTX 3090).

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.

Qwen3.8-27B megakernel (NVIDIA RTX, 24GB+)

For Qwen3.8-27B Q4_K_M on Linux with an RTX 30, 40 or 50-series GPU that has 24GB or more, OpenJet serves the model through its own CUDA engine instead of llama-server. On an RTX 3090 it decodes at 1.5x llama.cpp's speed in the agent's reasoning mode (78 vs 51 tok/s) and up to 1.9x when writing code (140 vs 73 tok/s).

The engine ships in this package as source, from version 0.4.32. openjet setup compiles it for your GPU:

pip install --upgrade open-jet
openjet setup        # choose "Qwen3.8 27B Q4_K_M MTP"
openjet

You need the CUDA toolkit installed, for nvcc (CUDA 12 or newer; 12.8 or newer for RTX 50). The compile takes about 2 minutes and ends with Megakernel built: OpenJet will serve Qwen3.8-27B with it. If you set OpenJet up before 0.4.32, upgrade and run openjet setup again.

If setup can't build it, it prints Skipping the Qwen3.8-27B megakernel (...) with the reason and OpenJet uses llama-server instead, so setup still finishes. While OpenJet is running, pgrep -af mk_server.py prints a line when the megakernel is serving.

It has been benchmarked on an RTX 3090 only. Benchmarks and details: megakernel README.

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
  • Source for the Qwen3.8-27B megakernel (megakernel/), compiled by openjet setup

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

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.33
File
open_jet-0.4.33-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
open_jet-0.4.33-py3-none-manylinux_2_17_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64 Details
open_jet-0.4.33-py3-none-manylinux_2_17_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details
open_jet-0.4.33-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details
open_jet-0.4.33-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.33-py3-none-win_amd64.whl

Download URL open_jet-0.4.33-py3-none-win_amd64.whl
Size 44.1 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
422feb35bee073e51e3dd5707e538d1d5e3b209be41c43b2dbea4a5f549c8582
BLAKE2b-256 checksum
How to use checksums
be6c5e8710b524f0157ac9e913ba31e28eb33dc352d1b92f5e00f22e8df6b915
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.33-py3-none-manylinux_2_17_x86_64.whl

Download URL open_jet-0.4.33-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
1f9e40d54941c833af0389453ee278a8641b43bd50bf025becdeabc784746006
BLAKE2b-256 checksum
How to use checksums
8687c32e07d92368e338783971317e59762fbdefa795579027fabffe32591a92
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.33-py3-none-manylinux_2_17_aarch64.whl

Download URL open_jet-0.4.33-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
81692ade7ad16604d1b7264e9ec397b2c3b04a27baf410bd05558e743fb9c36b
BLAKE2b-256 checksum
How to use checksums
6384900889813bf0ec8d30109a8ffdb16afd892529aceab016e1e3d24dc13bdd
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.33-py3-none-macosx_11_0_arm64.whl

Download URL open_jet-0.4.33-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
77ee388bc411eee87879364197f41fcff4737bd75586c41db81d59d6a4c567d1
BLAKE2b-256 checksum
How to use checksums
bc0f62d4d96b19ad61afc8e485a9cea660510afe3de5617f563a08fafb933159
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.33-py3-none-macosx_10_15_x86_64.whl

Download URL open_jet-0.4.33-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
f5e3a19df2febad14f93e0404cd0e12afc0b718f9d6688e378737412ec9372c5
BLAKE2b-256 checksum
How to use checksums
f700a294a60877179ff72d6f9996de0f6e0a5479fdee4c643f9f36105f88a56d
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

This release

0.4.33 This release

5 release files

0.4.32

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