Environment: open-notebook 1.14.0 (v1-latest-single), esperanto 2.25.1, provider openai_compatible (vLLM, served model Qwen3.8, 256K context window).
Problem
Source insights (transformations) are silently cut off mid-sentence / mid-word. The truncation correlates directly with the transcript length — long sources get cut, short ones complete cleanly:
| full_text (chars) |
insight (chars) |
result |
| 13431 |
1228 / 2002 |
truncated (e.g. ends …Eine form) |
| 16581 |
11333 |
truncated (mid list item) |
| 325 |
3832 |
complete (ends with .) |
| 715 |
3021 |
complete |
| 451 |
2449 |
complete |
Root cause
Transformations provision the language model via provision_langchain_model() (open_notebook/ai/provision.py) -> model.to_langchain(). No explicit max_tokens is passed anywhere in this path.
Esperanto's LanguageModel base default is max_tokens = 850 (esperanto/providers/llm/base.py:19). The OpenAI provider only skips this default cap for reasoning models (_is_reasoning_model() = name starts with o1/o3/o4/gpt-5, esperanto/providers/llm/openai.py:316). An openai_compatible model such as Qwen3.8 is not detected as reasoning, so every transformation request is sent with max_tokens=850.
There is no way to override this from Open Notebook:
ModelCreate / ModelResponse have no max_tokens field.
Credential.to_esperanto_config() only emits known keys (api_key, base_url, endpoint*, num_ctx, ...) — arbitrary keys like max_tokens are dropped.
- No relevant env var / setting exists.
Verified live in the container:
m = await model_manager.get_default_model("transformation") # OpenAICompatibleLanguageModel "Qwen3.8"
m.max_tokens # -> 850
m.to_langchain().max_tokens # -> 850 (ChatOpenAI)
The backend model itself is not the limit — a direct request to the same endpoint with max_tokens=3000 returns a complete 2852-token answer (finish_reason=stop). So the cap is imposed solely by Open Notebook/Esperanto.
Suggested fix
Analogous to the Ask fix in #1241 (OPEN_NOTEBOOK_ASK_MAX_TOKENS): make the transformation output budget configurable — e.g. an OPEN_NOTEBOOK_TRANSFORMATION_MAX_TOKENS env var and/or a per-model max_tokens in the model/credential config — and/or stop silently falling back to Esperanto's 850 default for non-reasoning openai_compatible models.
Related
#1221, #1247, #1241 (Ask/Q&A truncation), #1200 (provider-declared tunable params), #947 (model & provider advanced config).
Environment: open-notebook 1.14.0 (
v1-latest-single), esperanto 2.25.1, provideropenai_compatible(vLLM, served modelQwen3.8, 256K context window).Problem
Source insights (transformations) are silently cut off mid-sentence / mid-word. The truncation correlates directly with the transcript length — long sources get cut, short ones complete cleanly:
…Eine form).)Root cause
Transformations provision the language model via
provision_langchain_model()(open_notebook/ai/provision.py) ->model.to_langchain(). No explicitmax_tokensis passed anywhere in this path.Esperanto's
LanguageModelbase default ismax_tokens = 850(esperanto/providers/llm/base.py:19). The OpenAI provider only skips this default cap for reasoning models (_is_reasoning_model()= name starts witho1/o3/o4/gpt-5,esperanto/providers/llm/openai.py:316). Anopenai_compatiblemodel such asQwen3.8is not detected as reasoning, so every transformation request is sent withmax_tokens=850.There is no way to override this from Open Notebook:
ModelCreate/ModelResponsehave nomax_tokensfield.Credential.to_esperanto_config()only emits known keys (api_key,base_url,endpoint*,num_ctx, ...) — arbitrary keys likemax_tokensare dropped.Verified live in the container:
The backend model itself is not the limit — a direct request to the same endpoint with
max_tokens=3000returns a complete 2852-token answer (finish_reason=stop). So the cap is imposed solely by Open Notebook/Esperanto.Suggested fix
Analogous to the Ask fix in #1241 (
OPEN_NOTEBOOK_ASK_MAX_TOKENS): make the transformation output budget configurable — e.g. anOPEN_NOTEBOOK_TRANSFORMATION_MAX_TOKENSenv var and/or a per-modelmax_tokensin the model/credential config — and/or stop silently falling back to Esperanto's 850 default for non-reasoningopenai_compatiblemodels.Related
#1221, #1247, #1241 (Ask/Q&A truncation), #1200 (provider-declared tunable params), #947 (model & provider advanced config).