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…
ollama; a GPU makes it quickhttps://ninja-portal.com/v1kannaka-brain-v3, 14B) and the fleet tier (kannaka-brain-7b-v1)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.
| Alias | |
|---|---|
| Spend | |
| Models | |
| Limits | |
| Expires |
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 environmentList 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.
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?"
| Repo | What |
|---|---|
| kannaka-brain-v2-GGUF | merged Qwen2.5-14B + adapter, q4_K_M, Modelfile |
| kannaka-brain-v2-lora | the adapter alone (PEFT), for GPUs and your own merges |
| kannaka-brain-v1-GGUF · v1-lora | the 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.