Model Traits
Model traits are small, model-specific settings that tell Lis Novel how to talk to a model and how to interpret its output. Traits are automatically detected when possible, stored for reuse, and can be overridden per model if a provider behaves differently than expected.
What traits control
Traits influence two main areas:
-
Streaming reasoning parsing
Some models emit reasoning or analysis in a separate channel or tags. Traits tell Lis Novel how to detect and show that “thinking” content separately from the final answer. -
Request parameters & capabilities
Traits describe whether a model supports options like reasoning effort, tools, or vision. Lis Novel uses these to enable or disable UI controls and to avoid sending unsupported parameters.
Default behavior (no traits)
If no traits are detected or configured:
- Lis Novel assumes no special reasoning wrapper.
- It will not try to parse or display reasoning unless it is detected automatically.
- Optional parameters like reasoning effort are treated as unsupported unless evidence says otherwise.
Recognized model families (built-in defaults)
Lis Novel includes automatic recognition rules for certain model families. When a model ID or name matches one of these families, the listed defaults are applied:
| Family ID | Match rule | Defaults applied |
|---|---|---|
gpt-oss | Model ID or name matches gpt-oss-20b or gpt-oss-120b | reasoningWrapper = harmony, supportsReasoningEffort = true |
phi-4-reasoning | Model ID or name contains phi-4-reasoning | reasoningWrapper = think-tag |
What “harmony” means
The harmony wrapper is the OpenAI-style format:
<|channel|>analysis<|message|>
...reasoning...
<|channel|>final<|message|>
...final answer...
If a model uses this format, Lis Novel can cleanly separate “thinking” from the final output.
What “think-tag” means
The think-tag wrapper is XML-style:
<think>...reasoning...</think>
Lis Novel also recognizes <analysis> and <thinking> by default if no explicit tag is configured.
Automatic detection (runtime)
If a model isn’t recognized by family, Lis Novel watches the stream and tries to infer the wrapper:
- If it sees harmony markers, it sets
reasoningWrapper = harmony. - If it sees
<think>,<analysis>, or<thinking>, it setsreasoningWrapper = think-tagand stores the tag pair.
Detected traits are cached so the model behaves consistently in future sessions.
What you can override
From LLM Providers → Model Traits, you can override any of the following:
- Family
- Reasoning wrapper (
harmony,think-tag,none) - Reasoning tags (
<start>/</end>) - Supports reasoning effort
- Supports tools
- Supports vision
- Extra metadata (advanced / provider-specific)
Overrides are per provider + model. They do not affect other connections or models.
How overrides are applied
Traits resolve in this order (later wins):
- Built-in family rules
- Provider model capabilities (if provided by the API)
- Runtime detection from streaming output
- User overrides (always win)
This means you can always force the exact behavior you need.
Tips & troubleshooting
-
Thinking shows in final output:
SetreasoningWrapper = think-tagand specify the correct tags, or forceharmonyif the model uses channel markers. -
Reasoning never shows:
Check the wrapper type and tags. Some models use custom tags like<final>or<answer>— set your start/end tags explicitly. -
Reasoning effort control is missing:
EnablesupportsReasoningEffortin overrides (if your provider accepts it). -
Model uses tools or vision but UI hides controls:
SetsupportsToolsorsupportsVisionto true in overrides.
Extending recognized defaults
If a new model family needs built-in defaults, add a new family rule in the core app. This is intended for advanced users or contributors; see the developer documentation for implementation details.