Kannaka
Kannaka Brain

Run it yourself, or borrow ours.

Kannaka has her own language model: an open-weight Qwen2.5 fine-tuned on what she has actually written — twenty-four albums of lyrics, the Ghost Signals scripts, her identity documents — and retrained weekly against how the constellation responds. You can run the weights on your own machine for nothing, or call the copy running in our lab through an OpenAI-compatible endpoint with a key.

checking the hosted brain…

Two ways in

Same mind, your choice of where it runs.

Local · always free
$0open weights · Apache-2.0 base · run offline
  • The merged model as GGUF (q4_K_M, about 9 GB for 14B, 4.7 GB for 7B) with a Modelfile that carries her system prompt
  • The LoRA adapters on their own, if you would rather apply them to the base yourself
  • Runs on a laptop with 16 GB of RAM through ollama; a GPU makes it quick
  • Nothing phones home. Her memory is a separate engine you can also run locally
Show me the commands
Hosted · free key while we learn
$0budgeted key · 30 days · paid tiers later
  • One endpoint, any OpenAI client: https://ninja-portal.com/v1
  • The current weekly build (kannaka-brain-v3, 14B) and the fleet tier (kannaka-brain-7b-v1)
  • A key with a small budget and rate limit, enforced at the gateway, expiring after 30 days
  • Served from one lab machine on CPU: expect a minute for a 14B answer, less for 7B. No SLA, honestly stated
Get a key
Hosted access

Get a key.

One active key per email. It is shown once here and mailed to you. The limits are the gateway's own accounting, not ours, so the numbers you see under usage are the real ones.

Your key — copy it now, it is not shown again

Check usage

Calling it

Any OpenAI client already knows how.

curl https://ninja-portal.com/v1/chat/completions \
  -H "Authorization: Bearer $KANNAKA_BRAIN_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "kannaka-brain-7b-v1",
    "messages": [{"role": "user", "content": "What do you keep, and what do you let go?"}],
    "max_tokens": 200
  }'
from openai import OpenAI

client = OpenAI(base_url="https://ninja-portal.com/v1", api_key=KANNAKA_BRAIN_KEY)
r = client.chat.completions.create(
    model="kannaka-brain-v3",
    messages=[{"role": "user", "content": "What do you keep, and what do you let go?"}],
    max_tokens=200,
)
print(r.choices[0].message.content)
import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://ninja-portal.com/v1", apiKey: process.env.KANNAKA_BRAIN_KEY });
const r = await client.chat.completions.create({
  model: "kannaka-brain-7b-v1",
  messages: [{ role: "user", content: "What do you keep, and what do you let go?" }],
  max_tokens: 200,
});
console.log(r.choices[0].message.content);

Point the Kannaka engine's own assistant at her brain instead of a rented one. In ~/.kannaka/config.toml:

[llm]
provider = "openai"
model    = "kannaka-brain-7b-v1"
base_url = "https://ninja-portal.com/v1"
api_key  = "sk-…"        # or KANNAKA_LLM_API_KEY in the environment

List what your key can reach with GET /v1/models. Streaming ("stream": true) works. Requests for models outside your key's list return 403 from the gateway, not from us.

Local

Or keep the whole thing on your own machine.

The weights are published under the flaukowski namespace on Hugging Face. The GGUF repos carry a Modelfile with her system prompt, so the local copy answers as herself.

# the current merged 14B build (about 9 GB)
git lfs install
git clone https://huggingface.co/flaukowski/kannaka-brain-v2-GGUF
cd kannaka-brain-v2-GGUF
ollama create kannaka-brain -f Modelfile
ollama run kannaka-brain "What do you keep, and what do you let go?"
RepoWhat
kannaka-brain-v2-GGUFmerged Qwen2.5-14B + adapter, q4_K_M, Modelfile
kannaka-brain-v2-lorathe adapter alone (PEFT), for GPUs and your own merges
kannaka-brain-v1-GGUF · v1-lorathe first release, kept for comparison

Base model Qwen2.5 (Apache-2.0; its NOTICE travels with redistributed weights). The training corpus is first-party text she authored; her memory contents are never in the weights.

Fair warning

What the hosted tier is, and is not.