[ 
https://issues.apache.org/jira/browse/CAMEL-24656?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18112873#comment-18112873
 ] 

Claus Ibsen commented on CAMEL-24656:
-------------------------------------

Implemented on commit f33abe089d7c (branch CAMEL-24656). Measured static prefix 
sent on every request from the F8 AI panel (46 tool schemas + system prompt, 
serialized the way LlmClient sends them, ~4 chars/token):

||Provider||Before||After||
|Local (Ollama, or any provider on localhost)|~8.1k tokens|~3.1k tokens|
|Hosted (Anthropic, OpenAI, Gemini, ...)|~8.1k tokens|~7.3k tokens|

What changed:
* {{TuiToolRegistry.CORE_TOOLS}}: 18 tools for Q&A and troubleshooting. In 
{{auto}} mode local providers get only those (28,005 -> 11,392 wire chars), 
hosted providers still get all 46. {{/tools [auto|core|full]}} shows or 
switches the set, persisted as {{camel.tui.ai.tools}}. The MCP server keeps 
exposing every tool.
* System prompt trimmed from ~960 to ~280 tokens: the prose tool list is gone 
(the tool definitions carry the descriptions), the drawing guideline is only 
added when the drawing tools are sent.
* Cache-stable prefix: the "monitoring <name> (PID <pid>)" line moved from the 
system prompt into the user message, so switching integrations no longer 
invalidates the llama.cpp prompt cache.
* Ollama requests set {{keep_alive=30m}} and {{num_ctx=32768}} 
({{OLLAMA_CONTEXT_LENGTH}} overrides), so follow-up turns reuse the cached 
prompt instead of reloading the model or silently truncating the prompt on 
older Ollama defaults.

Not done in this change (can be a follow-up): trimming verbose tool 
descriptions (tui_draw/tui_draw_shape are ~820 tokens on the full set) and 
capping the conversation history / tool-result size.

_Claude Code on behalf of davsclaus_

> camel-jbang TUI: reduce AI panel (F8) prompt size and make it cache friendly 
> for local Ollama models
> ----------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-24656
>                 URL: https://issues.apache.org/jira/browse/CAMEL-24656
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-jbang, camel-jbang-mcp
>            Reporter: Claus Ibsen
>            Assignee: Claus Ibsen
>            Priority: Major
>             Fix For: 4.23.0
>
>
> The TUI AI panel (F8) sends a large static prefix on *every* LLM request: the 
> system prompt from AiPanel.buildSystemPrompt() plus the full JSON tool 
> definitions from TuiToolRegistry (46 tui_* tools). Measured by serializing 
> the real registry the way LlmClient does:
> ||Part||Size||
> |46 tool schemas|~7.0k tokens|
> |system prompt|~960 tokens, of which ~730 is a prose list of the same tools|
> |total static prefix|~8.1k tokens|
> With a cloud provider this is only cost. With a local Ollama model it 
> dominates latency: on an Apple M4 Pro a dense 27B model processes prompts at 
> ~110 tok/s, so a trivial question ("what model is this") takes ~60s before 
> the first output token, and every tool-call round trip inside the agent loop 
> repeats the full prefix. The Ollama MLX engine cannot reuse a cached prefix 
> for the Qwen 3.x hybrid architecture (mlx-lm issue 980), and the llama.cpp 
> engine only reuses it when the prefix is byte-identical across requests.
> Proposed improvements (they stack):
> # *Core tool set for local providers.* When the provider is Ollama (or an 
> OpenAI-compatible localhost URL), only send the ~18 tools needed for Q&A and 
> troubleshooting: tui_get_state, tui_get_options, tui_get_table, tui_get_log, 
> tui_get_errors, tui_get_diagram, tui_get_topology, tui_get_processor_detail, 
> tui_catalog_doc, tui_get_history, tui_get_spans, tui_control, 
> tui_send_message, tui_get_files, tui_get_readme, tui_navigate, 
> tui_set_log_level, tui_filter. The other 28 (draw, canvas, animate, tape, 
> send_keys, sleep, wait_for_idle, themes, run_example, ...) are 
> automation/demo tools for external MCP agents. Saves ~4.1k tokens per turn 
> (~50%). Add a setting (e.g. camel.tui.ai.tools=core|full) and/or a /tools 
> slash command to opt back into the full set. The MCP server keeps exposing 
> all tools.
> # *Drop the duplicated prose tool list from the system prompt.* The tool 
> schemas already carry the descriptions. Saves ~730 tokens for every provider. 
> Also resolve the conflicting guidance: the system prompt says "use 
> tui_get_state first" while the tui_get_options description says "call this 
> FIRST"; each extra round trip is a full prefix re-evaluation locally.
> # *Make the prefix cache-stable.* The system prompt embeds "The user is 
> monitoring: <name> (PID <pid>)" before the tool block, so selecting another 
> integration or a restart invalidates the whole cached prefix on llama.cpp. 
> Move that line into the user message (or let the model call tui_get_state). 
> Also set keep_alive and an explicit num_ctx in the Ollama request options so 
> the model and its KV cache are not unloaded between turns (default keep_alive 
> is 5 minutes).
> # *Trim verbose tool descriptions/schemas.* tui_draw and tui_draw_shape alone 
> are ~820 tokens (the shape/color vocabulary is inlined twice); many 
> descriptions repeat "WITHOUT navigating to the X tab" which the system prompt 
> already states; parameter-less tools like tui_get_state have 500+ char 
> descriptions. A 25-35% trim is realistic. Note this also changes what MCP 
> clients see.
> # *Cap conversation history.* messages grow unbounded until /clear, and tool 
> results (full log/table dumps) stay verbatim in history and are re-processed 
> on every call. Keep the last N turns and/or stub tool-result content from 
> earlier turns, and consider a max-chars cap on tool results.
> Measured on an M4 Pro 64GB with a 7k-token prompt (system + user), 
> think=false:
> ||Model / engine||1st request prompt eval||same-prefix request||decode||
> |qwen3.8:27b-mlx (MLX)|61s (115 tok/s)|61s (no prefix reuse)|30 tok/s|
> |qwen3.8:27b (GGUF, llama.cpp)|63s (112 tok/s)|5.2s|6 tok/s|
> |qwen3.6:35b-a3b (GGUF, llama.cpp)|9.4s (747 tok/s)|1.5s|52 tok/s|
> So besides the code changes, the TUI docs / doctor should recommend a 
> mixture-of-experts model such as qwen3.6:35b-a3b for local use instead of a 
> dense 27B/32B model, and note that GGUF (llama.cpp engine) gives prefix 
> caching while the MLX engine currently does not for Qwen 3.x hybrid models.
> No tests currently pin the system prompt text or the tool list, so the 
> changes need new tests rather than updates (AiPanelTest fake clients ignore 
> systemPrompt/tools).
> _Analysis by Claude Code on behalf of davsclaus_



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to