Skip to main content

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:

  1. 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.

  2. 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 IDMatch ruleDefaults applied
gpt-ossModel ID or name matches gpt-oss-20b or gpt-oss-120breasoningWrapper = harmony, supportsReasoningEffort = true
phi-4-reasoningModel ID or name contains phi-4-reasoningreasoningWrapper = 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 sets reasoningWrapper = think-tag and 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):

  1. Built-in family rules
  2. Provider model capabilities (if provided by the API)
  3. Runtime detection from streaming output
  4. User overrides (always win)

This means you can always force the exact behavior you need.

Tips & troubleshooting

  • Thinking shows in final output:
    Set reasoningWrapper = think-tag and specify the correct tags, or force harmony if 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:
    Enable supportsReasoningEffort in overrides (if your provider accepts it).

  • Model uses tools or vision but UI hides controls:
    Set supportsTools or supportsVision to 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.