Skip to main content
With XYNTHIS_JSPACE=1, the model server reports the concepts the model weighed while generating each reply. Every chat completion then carries an additive xynthis_jspace block: the reply’s dominant concepts, with weights and how many generated positions were captured. The block is an extension field (standard OpenAI clients ignore it), so turning it on never breaks an existing integration.
XYNTHIS_JSPACE=1 xynthis-llm-serve
GET /status reports "jspace": true when capture is on.

What it looks like

Ask the model to name one color:
curl http://127.0.0.1:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model": "xynthis-local", "messages": [{"role": "user", "content": "Name one color, one word only."}]}'
{
  "id": "chatcmpl-6f4c9a2e-...",
  "object": "chat.completion",
  "created": 1783980000,
  "model": "xynthis-local",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "Blue." },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 7, "completion_tokens": 1, "total_tokens": 8 },
  "xynthis_jspace": {
    "concepts": [
      { "label": "blue", "weight": 0.41, "rank": 1 },
      { "label": "color", "weight": 0.19, "rank": 2 },
      { "label": "green", "weight": 0.14, "rank": 3 },
      { "label": "red", "weight": 0.11, "rank": 4 },
      { "label": ".", "weight": 0.08, "rank": 5 }
    ],
    "generated_positions": 3
  }
}
The reply is “Blue.” The workspace shows the model was also weighing “green” and “red” while it generated. weight is each concept’s share of the captured activation mass across the whole reply, so the weights sum to 1. Up to 10 concepts are reported, rank 1 first. generated_positions is the number of generated tokens the readout aggregates over. On streaming requests ("stream": true), the block arrives on the final SSE chunk (the one with "finish_reason": "stop"), after all the token deltas. Capture reads the token distributions the generation loop already computes, so the cost is one top-k softmax per generated token. XYNTHIS_JSPACE_TOPK sets how many candidate tokens are read per position (default 5). When XYNTHIS_JSPACE is unset, none of this code runs.

What a readout is, and is not

The readout is a logit lens: at each generated token, it records the top few tokens the model’s output distribution assigned probability to, and aggregates those across the reply into concepts. It answers “what was the model disposed to say at each step”: the alternatives it weighed, not just the one it picked. It is not a proof of reasoning. A logit lens reads dispositions in the output vocabulary; it does not trace the causal path that produced the answer, and a concept appearing with low weight does not mean the model “considered and rejected” it in any deliberate sense. Treat it as a transparency signal, useful for spotting what a reply was competing against, not as an explanation you can cite as ground truth.

Feeding readouts to the brain

Set XYNTHIS_JSPACE_TO_BRAIN=1 (on top of XYNTHIS_JSPACE=1; it does nothing alone) and the server additionally submits each reply’s dominant concepts to the brain as a perception line:
model workspace while replying: blue, color, green, red
These land in the brain’s session-only working memory. They give in-session context (the brain can see what its model was weighing), but they never become durable facts: the brain excludes them from every process that produces stored memories or training data, and they expire with the session. Submission runs on a background thread, so it never delays the HTTP response, and a brain that is down is silently skipped.