Releases: iamgadgetman/jarvis
Release list
Jarvis 0.17.0
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 inconfig/jarvis/rather thanplugins/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 inmods/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.mdwith 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|testmirror it for
the console, with tab completion.- Config writes keep the file's comments:
YamlConfigsaves 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-materialis retired. - Custom build on the Building page of the bell menu asks for a
description in chat and runs/jarvis buildwith 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: serverfor 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 voicereports 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 benchhas 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 aClass.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
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.ymlbeside 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 portalslists what he knows in this world, nearest first, with
distance and bearing.
Added — he does the arithmetic
/jarvis portal whereanswers 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 / 8is -153 where the game floors to -154 — eight
blocks out, in the wrong chunk, for every base west or north of spawn.
Math.floorDivthroughout, and a test that pins exactly that case.
Added — he leads the way
/jarvis portalescorts 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.takeHomeis now one caller of a general
escortTo(player, destination, departure, arrival, wrongWorld). The walk
never cared where it was going.DepositManagergains a portal registry beside the home and patrol ones, and
aportalssection indata.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
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
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
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
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: wallputs torches on walls - Skips spots already bright enough (
lighting.skip-light-level) - Underwater: grid points in shallow water get sea lanterns (
lighting.underwater,sea_lanterndefault orskip). 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 stopactually 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
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
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 newbuild_experiencestable. - 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 debugnow 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 fromplugin.yml, which already takes its value from the pom, so it cannot drift again. databases.ymlwas never written to the data folder.onEnablecalled onlysaveDefaultConfig(), which coversconfig.ymlalone. 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
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(wasclaude-opus-5).
config.ymldocumentsclaude-sonnet-5andclaude-opus-5if you want to
trade cost for capability. ollamais now first inprovider-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
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.