Skaldic Laya

Split-second NPC reflexes. Skaldic Laya is a 0.4B decision model for ArcDirector. Given a situation, a goal and a few options (fight or flee, heal or strike, drink the potion or keep swinging), it picks one, with calibrated odds, in a single pass without generating text. It makes a decision in about 55 ms on average, in LM Studio on an RTX 5090.

Made by Daniel Sigurdsson for ArcDirector.

Results

The ArcSelector Bench (v2, part of ArcDirector library) asks for 14 quick decisions from real game moments, like whether to finish off a wounded enemy, guard a hurt ally, or drink a potion. The best choice earns full points, and a choice that still helps earns some. Each decision is asked twice, the second time with the options in reverse order, and the worse of the two answers counts, so always picking the first option doesn't pay off. Tested on a RTX 5090 GPU with 32GB of VRAM.

Skaldic Laya Laya (base) Skaldic Gemma 4 E4B Gemma 4 E4B Jev (hosted)¹
Total 51% 31% 65% 63% 93%
Easy 75% 30% 75% 75% 100%
Medium 60% 42% 62% 56% 80%
Hard 22% 22% 60% 60% 100%
Tactics 50% 30% 75% 68% 75%
Survival 70% 37% 100% 100% 100%
Social 67% 3% 37% 37% 100%
Puzzle 25% 50% 50% 50% 100%
Time/decision 55 ms 79 ms 244 ms 261 ms 454 ms

¹ 2 runs per situation.

In short: Skaldic Laya scores 20 points higher than the Laya it was trained from, and answers a little faster. The bigger Gemma models choose better but take about 4.5 times as long, and the hosted Jev chooses best at about 8 times as long. With only 14 decisions, each one is worth about 7 points, so small differences between rows don't mean much.

Use it

In ArcDirector

The ArcDirector library knows Skaldic Laya by name: it runs it as a System One, on its own small engine beside the main model, so NPCs make their quick choices in a fraction of a second while the main model writes their plans.

This is the simplest way to use it:

import { ArcDirector, BrowserProvider, Skaldic } from 'arc-director';

import wasm from '@wllama/wllama/esm/wasm/wllama.wasm?url'; // vite
// const wasm = new URL('@wllama/wllama/esm/wasm/wllama.wasm', import.meta.url).href; // webpack

BrowserProvider.shared = new BrowserProvider({ wasm });

const director = new ArcDirector()
  .withLoadingBar() // Shows a loading bar on screen while it downloads
  .addBrowserModel('main', Skaldic.Gemma4E4B)
  .addBrowserModel('local', Skaldic.Laya);
director.setDefaultSystemOne('local'); // Every NPC makes its quick choices with Skaldic Laya
await director.start();

Prefer LM Studio? Download skaldic-laya-Q8_0.gguf into it, and add it the same way:

const director = new ArcDirector()
  .addLMStudioInference()
  .addModel('local', { decision: true, id: 'skaldic-laya' });
director.setDefaultSystemOne('local');

Anywhere else

  • llama.cpp's server answers the System One API (POST /v1/systemone):
    curl localhost:8080/v1/systemone -H 'Content-Type: application/json' -d '{
      "state": "You are Nell, 2/28 hp (badly hurt).",
      "questions": { "pick": { "type": "choice", "instructions": "stay alive",
        "criteria": { "attack": "cleave(Lena), Lena 20/20 hp, 1 away", "drink": "use(Elixir), Elixir carried", "wait": "wait(seconds=3)" } } }
    }'
    
  • The laya Python package loads the native checkpoint in this repo:
    import laya
    agent = laya.load("arc-director/Skaldic-Laya")
    

Files

File Size For
skaldic-laya-Q8_0.gguf 449 MB everyday use, and the browser
skaldic-laya-BF16.gguf 844 MB full precision
model.safetensors, rl_agent_config.json, encoder/, tokenizer/ 843 MB the laya package, further fine-tuning

How it was made

Fine-tuned from convaiinnovations/laya (ModernBERT-large with a decision head) on quick decisions from ArcDirector's game situations, with its confidence calibrated afterwards.

Questions and issues: ArcDirector on GitHub.

License

Apache 2.0, as Laya.

Downloads last month
59
Safetensors
Model size
0.4B params
Tensor type
F16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for arc-director/Skaldic-Laya

Quantized
(85)
this model