Skip to content

Releases: iamgadgetman/jarvis

Jarvis 0.17.0

Choose a tag to compare

@github-actions github-actions released this 20 Sep 20:46
b9da7d7

One release, three files: jarvis-paper-0.17.0.jar for Paper and Purpur,
jarvis-fabric-0.17.0.jar for Fabric, jarvis-neoforge-0.17.0.jar for
NeoForge. The plugin jar has a new name; everything a Paper server had
still works, and the config file is the same on all three.

Added — Jarvis as a mod

  • Fabric and NeoForge adapters. Minecraft 26.3; Fabric Loader 0.19.5 and
    Fabric API, or NeoForge 26.3.0.x. One jar each, with the libraries nested
    inside, and the config in config/jarvis/ rather than plugins/Jarvis/.
  • A fake player for a body. There is no Citizens on a mod, so the butler is
    a server-side player: a real entity that other mods and the game itself
    treat as a player, dressed in the skin of the Mojang account named Jarvis.
    He walks on Jarvis's own A* pathfinder (jarvis-nav), opens doors, swims,
    climbs ladders, and breaks blocks at tool speed through the game's own
    game-mode code, so protection mods see an ordinary player breaking a block.
  • Admin is operator on the mods, where there are no permission nodes.
  • What the mods do not have: WorldEdit, so the schematic library is
    Paper-only; the JavaScript build planner, so freeform builds use the JSON
    planner (see below), which turned out to be the better one anyway.
  • A NeoForge smoke test in CI installs a real dedicated server, drops the
    built jar in mods/ and waits for Jarvis to come up, because the nested jars,
    the mixins and the module graph only show their problems at runtime.

Added — the core/adapter split

  • Everything that is not a loader API now lives in jarvis-core, which the
    build refuses to let import Bukkit, Citizens, Fabric or Minecraft. The Paper
    plugin and the two mods are thin adapters over one interface (Platform,
    Butler, World, Owner, Scheduler, Ui, Events), documented in
    docs/dev/platform-interface.md with the reasoning for each seam.
  • Core is tested on a fake platform: a world in a map, a butler that walks in
    straight lines, a scheduler that runs when told. 180-odd tests, each moved
    task class with its own, every build.

Added — AI setup from the bell menu

  • Admin > AI setup: a row of providers, right-click to switch one on or
    off, left-click for its page: the key or address (typed in chat, kept out
    of chat and the chat log), the model (picked from what the Ollama server
    offers, or typed) and a connection test that goes past the routing.
  • /jarvis ai enable|disable|key|endpoint|model|models|test mirror it for
    the console, with tab completion.
  • Config writes keep the file's comments: YamlConfig saves changed values
    into the existing text instead of dumping the whole document.

Added — freeform builds that come out whole, and furnished

  • Shapes, not blocks. The planner asks the model for a short list of
    shapes (fill, walls, hollow, clear, set, door, bed, roof) and expands them
    in core, so a wall is whole by construction, a door has both halves, a bed
    has its head, and a pitched roof of stairs steps in to a ridge with its
    gables closed. The old block-by-block plan is still read, because remembered
    plans use it.
  • Furnished by requirement. A dwelling has a bed, a chest, a crafting
    table, light and something on the walls; a larger building has rooms
    furnished for their purpose. The first house built by the old prompt had no
    door and one wall short, which is why this is in the prompt rather than
    left to taste.
  • Doors and windows snap into the wall when the model places them one
    block off its line, and the log says so.
  • Blocks that are not blocks are left out. A painting or an item frame,
    which are entities, used to become dirt; now a spec the registry rejects is
    retried as its bare id, and anything still unknown is skipped and named in
    one warning line. build.fallback-material is retired.
  • Custom build on the Building page of the bell menu asks for a
    description in chat and runs /jarvis build with it.

Added — voice on every platform, inside the server

  • One Simple Voice Chat plugin for all three, since its API is the same
    everywhere: Paper registers it through Bukkit's service, Fabric through an
    entrypoint, NeoForge through the annotation. He speaks from the butler's
    body when he is beside you and into your ear when he is away.
  • Speech inside the server. whisper.cpp listens and Piper speaks, through
    JNI bindings whose native libraries ride in the jar (Linux x86_64 and arm64,
    Windows, macOS). The two model files, about 200 MB, are fetched the first
    time voice is turned on, with progress in the log and in /jarvis voice.
    No container, no second service. The HTTP client stays as
    voice.engine: server for anyone who wants the work off the game host.
  • Set up from the menu or the console. Admin > Voice setup, and
    /jarvis voice enable|disable|engine|endpoint|gate|speak|threads|bench|test;
    every change takes effect at once, no restart.
  • /jarvis voice reports every link of the chain: whether voice chat took
    the plugin and its voice server is up (a singleplayer world has none until
    opened to LAN), the gate, when the last packet came in, the last transcript,
    whether the engine is ready, and how long the last order took at each
    stage: hearing, understanding, speaking.
  • /jarvis voice bench has Piper say a sentence and times whisper on it
    at several thread counts, then names the fastest; voice.whisper-threads
    keeps it.

Changed

  • The Paper jar is jarvis-paper-<version>.jar, so the three files of a
    release tell you which is which.
  • Recognition does less work. whisper's audio context is cut to the clip
    instead of a thirty-second window, decoding is one greedy pass with no
    temperature fallbacks, and the models load on their own thread. Four
    threads by default; more is slower on a machine that is also running the
    game, because the workers spin while they wait for each other.
  • Issued gear stays his. Kit items carry a marker; a dismissal hands over
    everything except them, and his inventory screen (Paper and the mods)
    refuses to let the owner take them.
  • He is summoned two blocks away, facing you, rather than on your head.
  • The build planner's request uses the build-script token ceiling, so a
    plan no longer stops mid-object at the default 2,000 tokens.

Fixed

  • "Failed to generate build plan" when the reply was cut short: the JSON is
    now unfenced, de-prosed and, if still broken, salvaged for the complete
    blocks so the build goes ahead with what arrived.
  • Core failed to start on a server without GraalJS because the availability
    check itself linked a polyglot class. The probe is now a Class.forName
    and nothing else.
  • The mods' first start failed on a missing databases.yml, which the
    repository ignores by name; the default is now written from code.
  • Menu filler items on Fabric no longer show a blank tooltip.

Deliberately not done

  • Not one jar for all three. A Paper plugin and a mod cannot share a
    file, and a Fabric jar that is also a NeoForge jar is possible but fragile.
    Three files, one version, one changelog.
  • Not classic Forge. NeoForge is where 26.x modding is; nothing here is
    Forge-specific enough to be worth a fourth build.
Server File
Paper / Purpur jarvis-paper-0.17.0.jar (needs Citizens)
Fabric jarvis-fabric-0.17.0.jar (needs Fabric API)
NeoForge, Minecraft 26.3 jarvis-neoforge-0.17.0.jar
NeoForge, Minecraft 26.2 jarvis-neoforge-0.17.0-mc26.2.jar (NeoForge 26.2.0.x)
NeoForge, Minecraft 26.1.2 jarvis-neoforge-0.17.0-mc26.1.2.jar (NeoForge 26.1.2.x)

The 26.2 and 26.1.2 NeoForge jars were added after release, built from the same 0.17.0 code with a four-call compatibility shim (#7). Each loads only on its own game version.

2026-09-26: all three NeoForge jars were rebuilt with a fix for /jarvis summon failing when another mod sends players a packet on login (for example Apothic Attributes: "Payload ... may not be sent to the client!"). If you downloaded a NeoForge jar before this date, download it again. The Paper and Fabric jars are unchanged.

v0.16.0 — he can find you a portal

Choose a tag to compare

@iamgadgetman iamgadgetman released this 08 Sep 18:22

Three separate abilities, deliberately kept apart, because only one of them
costs anything and only one of them works at any distance.

Added — he notices portals

  • A sweep for portal blocks while he is out with you, reusing the ore
    search's trick of snapshotting chunks on the main thread and reading them off
    it. Wide and shallow rather than the ore search's cube — a portal is a
    landmark you walk past, not a vein you dig down to.
  • Skipped entirely when you have not moved. A sweep from a spot he has
    already swept finds what it found last time, so the loop's usual outcome is
    no work at all.
  • Walking into one counts as a sighting, via PlayerPortalEvent. Nothing
    beats being told.
  • He cannot see into unloaded chunks — no plugin can without forcing terrain to
    load, which would hitch the server — so a sweep reaches about as far as you
    can see. He says "none nearby", never "there are none".

Added — he remembers them

  • Sightings persist in data.yml beside your home, deposit chest and patrol
    routes.
  • A frame is one portal, not six. Every block of the purple qualifies as a
    sighting, so anything within eight blocks of a known portal merges into it —
    and a merge keeps the original coordinates rather than letting a remembered
    portal wander a metre at a time.
  • The list is bounded at twelve per player, oldest dropped, because this is
    a file that grows every time you walk past something and is read at every
    startup. Re-seeing a portal refreshes it, so the one you use daily outlives
    the one you glanced at once.
  • /jarvis portals lists what he knows in this world, nearest first, with
    distance and bearing.

Added — he does the arithmetic

  • /jarvis portal where answers where a portal comes out on the other side.
    This needs no scan, no memory and no loaded chunks: the Overworld runs at
    eight times the Nether's scale, and the game links to any existing portal
    within 128 blocks of the scaled position before building a new one — which is
    why two portals close together in the Nether end up sharing an exit.
  • Standing at a portal he knows, it describes that one; standing anywhere else,
    it answers "a portal here would come out at…", which is the same question
    asked before you have built it.
  • Negative coordinates are the whole difficulty. Java's / truncates
    toward zero, so -1227 / 8 is -153 where the game floors to -154 — eight
    blocks out, in the wrong chunk, for every base west or north of spawn.
    Math.floorDiv throughout, and a test that pins exactly that case.

Added — he leads the way

  • /jarvis portal escorts you to the nearest one he knows, on the same legs,
    waiting and torch-lighting as /jarvis home.
  • He leads you to a portal and no further. Citizens NPCs do not change
    dimension with you, so he says as much and waits on this side.

Changed

  • EscortService.takeHome is now one caller of a general
    escortTo(player, destination, departure, arrival, wrongWorld). The walk
    never cared where it was going.
  • DepositManager gains a portal registry beside the home and patrol ones, and
    a portals section in data.yml. A sighting that merely refreshes a
    timestamp does not trigger a disk write; a new portal does.

Built against Purpur 26.2 (Java 17 bytecode; 26.x servers run Java 25). Requires Citizens 2; WorldEdit optional.

Full history in CHANGELOG.md.

Jarvis v0.8.6 — build plans that are actually buildings

Choose a tag to compare

@iamgadgetman iamgadgetman released this 01 Sep 23:41

The plumbing was right by 0.8.5; the output was not. A local 7B returned 13 blocks for "a small oak cottage". That turned out to be the prompt, not the model.

Changed

The build-planning prompt now describes what a structure is. It was one line — "Generate a Minecraft structure as JSON for: X" — which produced flat, corner-only shapes: a 14×8×3 "cottage" against a declared 7×8×7, and a watchtower request that ran past 180s without finishing.

It now specifies a minimum footprint, that every block must be listed rather than just corners, that a building needs walls/floor/roof/door/windows, that only real placeable block ids are acceptable (never item ids such as minecraft:brick), and that coordinates are relative with y upward.

Measured on qwen2.5:7b, the same model already in use:

request before after
a small oak cottage 14×8×3, declared 7×8×7 7×4×7, declared 8×4×8
a stone watchtower timed out past 180s 4×13×6 in 92s
a storage shed — 8×5×5, 168 blocks

Declared dimensions and actual extents now agree, which they never did before. A request that genuinely asks for something small ("a tiny 3×3 pillar") is still allowed to be small.

ai.ollama.timeout-seconds default raised 60 → 240. Local build planning measured 47–163s depending on how much the model decides to build, so the old default was cutting plans off mid-generation. Build calls are async and the player is told to wait.

ai.ollama.keep-alive default raised 5m → 30m. Reloading a 7B costs ~13s, so a short window meant the first build after any idle period stalled.

Not changed, deliberately

qwen2.5-coder:7b was evaluated as a possible upgrade and is worse for this task — it produced flat single-plane walls in three of four runs (spans of 3×8×1, 10×7×1, 9×12×1) and in one run emitted 16 item-only materials. It's a code model; spatial layout isn't the same skill. Stay on qwen2.5:7b.

A 7B still varies run to run, including the occasional item id. That is what 0.8.5's isBlock() substitution is for.

Requires: Paper/Purpur 1.21+ (Java 25 for 26.x servers), Citizens 2, WorldEdit optional. For experience memory: ollama pull nomic-embed-text.

Jarvis v0.8.5 — three fixes from the first real build

Choose a tag to compare

@iamgadgetman iamgadgetman released this 01 Sep 06:59

v0.8.4 made the AI builder reachable for the first time. The first live build on a real server promptly found three defects, all in the path that had never run.

Fixed

A non-block material killed the build mid-placement. parseBuildPlan validated that a material name resolved, but not that the material can actually be placed. A model asking for minecraft:brick gets Material.BRICK — the clay brick item; the block is BRICKS — and setType() then threw, aborting the build part-way through:

java.lang.IllegalArgumentException: Provided material must be a block
  at BuildingAssistant.java:315   block.setType(placement.material)

Non-block materials are now substituted with the configured fallback. The check runs in executeBuild rather than in the parse, deliberately: Material#isBlock resolves through Paper's registry, and the parse runs off the main thread.

The old fallback only caught unknown names — which is why minecraft:planks and minecraft:wood, not real material names, degraded to dirt harmlessly while brick slipped through and crashed the task.

A build that crashed could still be recorded as a success. The placement loop is now wrapped, and a build that throws goes to a new failBuild path recording the plan as FAILED rather than reaching completeBuild. A plan that crashes the placer is the clearest possible example of a plan that does not work; recording it as a success would teach the memory to produce more like it. Whatever was placed before the failure stays undoable.

Undo demoted the newest success, not the build actually reverted. markRecentBuildUndone searched by player and recency, so undoing an older build out of order demoted the wrong row. Undo entries now carry the experience they produced — by reference, so the id filled in by the async insert is visible — and markUndone(experience) targets it directly.

Field notes

Verified on a live 26.2 server: situation capture works ({"dimension":"NORMAL","biome":"desert","y":67,"underground":false}), embeddings store 768 dimensions, hand-built shapes are correctly excluded from memory, and undo demotes only AI builds.

Local-model build quality is a separate matter: qwen2.5:7b returned 13 blocks for "a small oak cottage" and 4 for "a long wall". That is exactly what memory.min-successes-for-reduced-mode-builds (default 20) exists to gate — lowering it trades build quality for getting the memory started.

Requires: Paper/Purpur 1.21+ (Java 25 for 26.x servers), Citizens 2, WorldEdit optional. For experience memory: ollama pull nomic-embed-text.

Jarvis v0.8.4 — /jarvis build actually builds

Choose a tag to compare

@iamgadgetman iamgadgetman released this 01 Sep 03:55

Field report: "I tried /jarvis build oak cottage and it built the same fan each time, no matter what I asked for, even when I asked for a panic shelter."

Four separate defects, and the AI builder turned out to be reachable from almost nowhere.

Fixed

/jarvis build read only the first word. It took args[1] and threw the rest away, so /jarvis build a panic shelter searched the library for a schematic called "a", and /jarvis build oak cottage searched for "oak".

Schematic matching returned the first arbitrary hit, not the best one. findSchematic walked the map and returned the first entry whose name merely contained the query. A one-character query is a substring of nearly every name, so it returned whatever HashMap iteration happened to yield first — the same schematic every time, regardless of the request. That is the fan.

Matching is now scored: an exact name wins outright, otherwise the score is the fraction of the requested words that the name accounts for, with ties broken toward the shorter, more specific name. Keying on the request rather than the name stops a long schematic name from matching everything.

/jarvis build never reached the AI builder. It was purely a schematic-paste command. BuildingAssistant.startBuild had exactly one caller — in ChatListener, and only when the library returned no match at all. With a library of any size that branch effectively never fired, which made experience memory unreachable in practice. /jarvis build <description> now uses the library when it genuinely matches (score ≥ 50) and hands off to the AI builder when it does not.

/jarvis build undo did not exist, even though a finished build prints "Use /jarvis build undo to revert". undoLastBuild and buildSimpleStructure had no callers at all. Both are now wired, along with /jarvis build cancel and /jarvis build wall|floor|pillar|cube [size]. Undo being unreachable also meant experience memory's undo signal could never fire.

/jarvis paste <name> stays literal — name in, schematic out, no AI — so exact schematic use and /jarvis paste <name> rotate <degrees> are unchanged.

Added

memory.embedding-endpoint — the embedding model no longer has to live on the same host as the chat model. Blank keeps the previous behaviour of following ai.ollama.endpoint. A 274 MB embedder need not be pulled onto the box running a large chat model.

Verified against a real library

Scored against the 68 schematics on a live server:

Request Result
castle, mansion, redstone door, fan resolve exactly as before
a panic shelter now finds the panic shelter schematic (score 90) — previously unreachable
oak cottage, somewhere to store my loot score 0, go to the AI builder

Requires: Paper/Purpur 1.21+ (Java 25 for 26.x servers), Citizens 2, WorldEdit optional. For experience memory: ollama pull nomic-embed-text.

Jarvis v0.8.3 — the Lamplighter merge

Choose a tag to compare

@iamgadgetman iamgadgetman released this 01 Sep 02:55

Merges a line of work that was built outside this repository on 2026-08-29 and deployed to a live server as "0.8.2", but never pushed here. It had forked from v0.7.1, so it predated the whole provider/cost line, and the two histories had to be reconciled rather than one replacing the other.

Numbering: that line used 0.8.0, 0.8.1 and 0.8.2 locally. None were ever published, and 0.8.0 here already means Experience Memory, so the merged result is 0.8.3.

Added — the Lamplighter

/jarvis light [radius] [type] [spacing], and "jarvis, light this place up" from chat.

  • Grid-based area lighting built on the actual spawn rule — hostile mobs spawn at block light 0, so the placer targets that rather than guessing
  • Types: torch (default), end_rod, lantern, per command or via config
  • Ground placement by default; lighting.placement: wall puts torches on walls
  • Skips spots already bright enough (lighting.skip-light-level)
  • Underwater: grid points in shallow water get sea lanterns (lighting.underwater, sea_lantern default or skip). Works from the surface, and the placer hard-guards against setting a light into a cell that is not air or water

Added — he swims

Citizens' swim behaviour is enabled on the NPC, plus a lifeguard monitor that checks once a second for a Jarvis with his head underwater.

Fixed

  • Item stacks no longer vanish when picking up more than his bags could hold
  • Full-chest infinite loop when the deposit chest filled mid-job
  • /jarvis stop actually stops a dig — the block-breaker kept chewing
  • Finished tasks unregister themselves; a completed task used to linger
  • Chat-parsing thread safety — natural-language handling read world state off the main thread
  • Summon after a failed spawn no longer leaks a dead NPC registry entry
  • Plus the sky-stare after a summon, follow-mode wedging, the 1-block stair squeeze in ore tunnels, the fishing wedge, death-recovery stalls, guard-post confusion, and the "kit tool" filter claiming your own tools

Not merged — read this if you run the old 0.8.2 build

That line's provider configuration was left behind deliberately. It still had claude-sonnet-4-20250514 as the Claude default with claude first in provider-priority — the exact retired model ID that v0.7.2 was cut to remove, and the opposite of the ollama-first posture restored in v0.7.4.

Anything running that build has been failing its first AI call on every request and silently falling through to the next provider, or to nothing. This release keeps claude-haiku-4-5 and ollama first. Upgrading is the fix.

Also carries everything from v0.8.0 and v0.8.0.1 (experience memory and its retrieval fixes).

Requires: Paper/Purpur 1.21+ (Java 25 for 26.x servers), Citizens 2, WorldEdit optional. For experience memory: ollama pull nomic-embed-text.

Jarvis v0.8.0.1 — retrieval fixes

Choose a tag to compare

@iamgadgetman iamgadgetman released this 01 Sep 02:40

Two defects in v0.8.0's experience memory, both found by running it against a real Ollama box rather than a mock. Neither breaks anything outright — memory records and retrieves either way — but the first made retrieval close to noise, which is the whole point of the feature.

Fixed

The relevance floor could never reject anything. nomic-embed-text has a high similarity baseline. Measured against "build me a cozy oak cottage":

Candidate Cosine
make a small oak cottage please 0.859
a cosy little wooden house with oak walls 0.721
build a stone watchtower 0.470
the weather today is quite cold 0.418
a nether portal out of obsidian 0.345
kubernetes ingress controller config 0.337

Unrelated text sits at 0.34–0.42, not near zero. The floor was 0.25 applied to 0.7 × text + 0.3 × situation, so for any same-situation match the minimum possible score was 0.54 — double the floor. Every stored build passed, and a strip-mine plan could be injected as a "similar example" for a cottage request.

The floor is now checked against the request-similarity score alone, before the situation match is blended in, because the situation term is a large constant offset that would otherwise rescue irrelevant matches. The two retrieval paths are on different scales and now have their own thresholds: memory.min-text-relevance (0.55, cosine) and memory.min-keyword-relevance (0.15, Jaccard fallback). memory.min-relevance is gone.

Cold-start stall on the first build after an idle period. The embedding client never sent keep_alive, so Ollama unloaded the model on its default timer. Measured: 14.3 s cold, 16 ms warm — the 20 s read timeout survived it only barely. It now sends memory.embedding-keep-alive (default 30m; the model is 274 MB, so keeping it resident is cheap) and the default timeout is raised to 30 s.

Upgrading

Unchanged setup from v0.8.0 — ollama pull nomic-embed-text. If you hand-wrote a memory: block for v0.8.0, replace min-relevance with the two new keys. The built-in defaults apply if you do nothing.

Requires: Paper/Purpur 1.21+ (Java 25 for 26.x servers), Citizens 2, WorldEdit optional.

Jarvis v0.8.0 — Experience Memory

Choose a tag to compare

@iamgadgetman iamgadgetman released this 01 Sep 02:27

Jarvis now remembers how builds turned out and shows the AI the plans that worked for similar requests. The labels are free: a build you let finish is a success, one you cancel or undo inside the negative-signal window is not — no rating prompt, no extra command.

Added

  • Experience memory (com.gadgetman.jarvis.memory) backed by a new build_experiences table.
  • Two-stage retrieval. Requests are matched on embedding similarity, then re-ranked on how much the world matched. "Build me a house" underground at y=12 and the same words on a plains surface retrieve different examples.
  • Embeddings are local-only. The embedding client talks to Ollama directly and deliberately does not route through the provider failover chain, so a call made on every build request can never fall through to a paid provider. If Ollama is down, retrieval degrades to keyword matching instead of failing.
  • Reduced-mode unlock. Ollama-only servers have freeform build planning disabled. Once 20 successful builds are stored (memory.min-successes-for-reduced-mode-builds), the retrieved examples carry enough of the load and it turns on by itself.
  • /jarvis debug now reports the stored success count, whether the unlock has fired, and embedding health.

Setup

Run ollama pull nomic-embed-text on your Ollama box. Without it the feature still works, but on the weaker keyword-matching path.

An existing plugins/Jarvis/config.yml is not overwritten on update, so add the memory: block by hand or the built-in defaults apply.

Fixed

  • The plugin reported the wrong version. The version constant was hardcoded and left at 0.7.0, so every v0.7.x release announced itself as v0.7.0 in the server log and in /jarvis debug. It now reads from plugin.yml, which already takes its value from the pom, so it cannot drift again.
  • databases.yml was never written to the data folder. onEnable called only saveDefaultConfig(), which covers config.yml alone. Servers that have been running a while already have the file, so this bit fresh installs only — which is why it went unnoticed. It would have taken experience memory down with it.
  • The README's configuration example named keys that do not exist (ollama-url, openai-api-key, fallback-order). The real keys are nested: ai.ollama.endpoint, ai.openai.api-key, ai.provider-priority.

Not recorded, on purpose

Two cases look like negative signals but are not, and recording them would poison retrieval: a build aborted because the NPC despawned or the player logged out (infrastructure, not a bad plan), and undoing a hand-built shape — /jarvis build wall|floor|pillar|cube shares the undo stack with AI builds, so undo entries are tagged and only AI-planned builds can be recorded or demoted.

Requires: Paper/Purpur 1.21+ (Java 25 for 26.x servers), Citizens 2, WorldEdit optional.

Jarvis v0.7.4 — cheap by default again

Choose a tag to compare

@iamgadgetman iamgadgetman released this 28 Aug 01:25

Restores the cost posture this project had already settled on.

Download

Jarvis-0.7.4.jar below. Drop it in your server's plugins/ folder and restart.

  • Requires Citizens; WorldEdit / WorldGuard are optional.
  • Paper/Purpur API 1.21, built for Java 17.

Changed

v0.7.2 correctly replaced a retired Claude model ID, but picked the most
capable tier as the replacement — the wrong default for a plugin that calls a
model on every chat line.

  • Claude default is now claude-haiku-4-5 (was claude-opus-5).
    config.yml documents claude-sonnet-5 and claude-opus-5 if you want to
    trade cost for capability.
  • ollama is now first in provider-priority. It is free and local, so a
    server running it pays nothing for routine chat parsing. If it is not
    installed, the call fails fast (connection refused) and the provider goes on
    an exponential cooldown capped at 5 minutes — so servers without it are
    barely affected, and anything needing an API key is still tried in order.

Changed in both the shipped config.yml and the code defaults, so a fresh
install and a config-less install agree.

Known gap

The larger cost work — a local fast path that resolves literal commands with no
model call at all, and cache_control on the system prompt — lives on a branch
that is not merged into main and is in no release yet.

⚠️ Existing servers need a manual edit

Your plugins/Jarvis/config.yml is not overwritten on update. To pick these
defaults up on a running server, edit ai.claude.model and reorder
ai.provider-priority by hand.

Jarvis v0.7.3 — all provider defaults current

Choose a tag to compare

@iamgadgetman iamgadgetman released this 28 Aug 00:57

Finishes what v0.7.2 started. Every provider default has now been checked
against its vendor's current model list.

Download

Jarvis-0.7.3.jar below. Drop it in your server's plugins/ folder and restart.

  • Requires Citizens; WorldEdit / WorldGuard are optional.
  • Paper/Purpur API 1.21, built for Java 17.

Fixed

Provider Was Now Status
Gemini gemini-1.5-flash gemini-3.7-flash was broken — retired, gone from Google's list
Grok grok-4 grok-4.6 was broken — never a valid ID; xAI ships versioned variants only
OpenAI gpt-4o-mini gpt-5.6-terra legacy — still answers, but no longer in the current lineup
Claude (fixed in v0.7.2) claude-opus-5 —

config.yml now documents a cheaper alternative for each provider, since a
server parsing chat can make a lot of calls:

  • gpt-5.6-luna · claude-haiku-4-5 · grok-4.3 · gemini-3.5-flash-lite

Endpoints were verified and left alone — Chat Completions (/v1/chat/completions)
is not deprecated, and Gemini still serves v1beta/models/{model}:generateContent.
Only the model IDs were ever wrong.

⚠️ Existing servers need a manual edit

Your plugins/Jarvis/config.yml is not overwritten on update. If it still
names any of the old IDs above, change them by hand — dropping in the new jar
alone will not fix an existing install.