mirror of
https://github.com/Mintplex-Labs/anything-llm.git
synced 2026-07-19 14:13:35 -04:00
[GH-ISSUE #5219] [FEAT]: Use Native LM Studio /api/v1/chat for chat history optimization #4975
Closed
opened 2026-06-05 14:51:14 -04:00 by yindo
·
3 comments
No Branch/Tag Specified
master
5846-bug-when-scrolling-up-scrolling-jumps
refactor-remove-workspace-pfp
5969-bug-stopgenerationbutton-disappears-on-the-first-prompt-that-initiates-an-agent-session
2235-bug-how-to-upload-a-folder-with-subfolders-with-files-to-anythingllm
5990-workspace-update-fails-with-unknown-argument-router_id-v1130v1150-intel-mac
opencomputer-examples
pg
feat/image-generation-translations
feat/image-generation
5924-bug-meeting-summary-fails-with-sincludes-is-not-a-function-when-default-llm-is-anthropic-claude
render
feat/uniform-modal-component
5883-bug-unescaped-content-in-json-strings-being-passed-to-document-generator-tools
5901-bug-api-update-embeddings-fails-prisma-argument-filename-is-missing-on-workspace_documentscreate-desktop-windows-v1141
hybrid-search
1981-translations
5752-bug-prompts-to-local-jan-endpoint-unresponsive
feat-disable-native-tool-calling-env-var
5676-bug-non-ollama-agent-providers-do-not-parse-and-present-reasoning-content
feat/markdown-web-scraping
5717-bug-apiv1documentupload-silently-drops-metadata-field-in-desktop-1130-arg-count-mismatch-nested-payload-key
fix/aibitat-context-overflow
5711-bug-erratic-deepseek-v4-flash-the-agent-model-failed-to-respond-400-the-reasoning_content
5631-feat-custom-api-request-timeouts-for-ai-providers
feat-reasoning-control
feat-agent-clarifying-questions-translations
5583-bug-lm-studio-provider-does-not-present-reasoning-output
5313-normalize-translations
feat/memory-translations
5305-lemonade-embedding-engine-swallows-errors-falsely-reports-documents-as-embedded
5060-bug-agent-interactions-agent-are-not-persisted-to-thread-history-via-api
pptx-subagent
feat-render-images-from-mcp-tool-results
stt-provider-expansion-openai-api-compatible
feat-file-search-agent-tool
feat-native-embedder-job-queue
5189-normalize-translations
feat-file-search-agent-tool-translations
i18n-eslint
5140-auto-migration
5112-bug-openrouter-failed-message-bug
3506-feat-parameters-for-openrouter-models
4992-feat-preserve-scroll-position
4973-bug-markdown-numbered-list-display-in-reasoning-pane
desktop
4938-bug-pending-chat-rerendering-ui-bug
quickstart-env
node-llama-cpp-in-container-cuda
node-llama-cpp-in-container
ollama-in-container
4817-feat-set-cooldown-per-mcp-server
4845-keyboard-shortcuts-to-navigate-in-chat
4844-feat-reorder-threads-by-latest-interaction
standardize-username-constraints-normalize-translations
4792-feat-refactor-workspacepfp-image
1382-embed-ip-improvements
1382-bug-embed-api-improvements
refactor-eslint-frontend
4687-feat-refactor-vector-db-providers
4615-feat-disable-apidocs-with-environment-variable
4559-feat-agent-web-search-enable-ordering-of-results
4599-bug-ollama-race-condition-bug
4572-bug-lmstudio-provided-llm-stopped-working-with-anything-llm-after-upgrading-to-190
4508-agent-youtube-transcript-analysis
4497-feat-workspace-names
frontend-eslint
ollama-lmstudio-auto-context-window
4431-validate-vector-database-connectioN
2019-slash-command-keyboard-selection
microsoft-foundry-provider
4431-validate-vector-database-connection
4325-sys-prompt-var-improvements
3209-feat-apiv1workspacestream-chat-sources-citations
4210-bug-voice-to-text-overwrite
4136-feat-jan-as-a-backend-server-option
4172-feat-openai-o3-support
1.8.3-rerelease
web-push-notifications-service
tasks
3955-feat-jinaai-embedder-provider-support
3921-feat-agent-skills-uiux-improvements
3901-bug-validfunccall-checks-optional-arguments
keyboard-dev
1787-custom-roles-and-permissions
add-jira-slack-data-connector
office-extension-wip
lightmode-dropdown-color-update
3586-bug-agent-flow-function-description-provided-by-user-is-not-seen-in-the-llm-query
3463-bug-agent-continues-to-run-if-request-failed-even-after-exit
3439-feat-call-variables-within-the-flow-api-block-url-field
3282-manager-view-models-workspace
3280-token-counting-server-side-truncation-improvements
3147-bug-embedded-chat-widget---not-considering-query-mode-option-always-working-in-chat-mode
2995-feat-disable-temperature-setting-for-deepseek-r1-deepseek-reasoner-model
2827-feat-perplexity-citations
2866-feat-finally-a-gemini-models-endpoint
2647-feat-hpp-header-for-a-c++-code-file-mime-addition
lancedb-revert
1656-feat-implement-tooltip-ui-designs
2011-feat-bump-perplexity-models
1873-feat-auto-add-and-watch-folder-for-document-uploads
1297-feat-gemini-agent-support
1759-bug-ui-bug-fixes
1686-feat-implement-winston-for-logging
1536-bug-toggling-on-users-can-delete-workspaces-does-not-take-effect
agent-ui-mobile-styles
1522-feat-chromadb-support
1595-bug-unable-to-get-live-web-search-and-browsing-agent-working-using-google-custom-search-engine-error-getaddrinfo-enotfound-http-errno-3008
1582-bug-lm-studio-does-not-allow-for-different-model-selection
1312-bug-usernames-should-not-be-case-sensitive-when-logging-in
1029-feat-hf-serverless-inference-api
1086-feat-implement-normalized-input-fields
knowledge-graph-support
644-bug-uploaded-file-name-does-not-match-the-displayed-file-name-after-the-upload
v1.15.0
v1.14.2
v1.14.1
v1.14.0
v1.13.0
v1.12.1
v1.12.0
v1.11.2
v1.11.1
v1.11.0
v1.10.0
v1.9.1
v1.9.0
v1.8.5
v1.8.4
v1.8.3
v1.8.2
v1.8.1
v1.8.0
v1.7.8
v1.7.6
v1.7.5
v1.7.4
v1.4.0
v1.3.0
v1.2.4
v1.2.3
v1.2.2
v1.2.1
v1.2.0
v1.1.1
v1.1.0
v1.0.0
Labels
Clear labels
Desktop
Docker
Integration Request
Integration Request
OS: Linux
OS: Mobile
OS: Windows
UI/UX
blocked
bug
bug
core-team-only
documentation
duplicate
embed-widget
enhancement
feature request
github_actions
good first issue
investigating
needs info / can't replicate
possible bug
pull-request
question
stage: specifications
wontfix
Mirrored from GitHub Pull Request
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: Mintplex-Labs/anything-llm#4975
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @raucodes on GitHub (Mar 16, 2026).
Original GitHub issue: https://github.com/Mintplex-Labs/anything-llm/issues/5219
How are you running AnythingLLM?
Docker (local)
What happened?
Hi team,
I believe there is an issue — or at least a major missed optimization — in the native LM Studio connector.
Summary
When using the native LM Studio provider in AnythingLLM (Docker version), the app appears to use:
GET /api/v0/modelsfor model discoveryPOST /v1/chat/completionsfor inferenceinstead of LM Studio’s stateful chat endpoint:
POST /api/v1/chatThis means chat requests are effectively handled in a stateless OpenAI-compatible mode, so the full conversation history is sent again on every turn instead of reusing LM Studio’s server-side conversation state.
For short chats this is fine, but for long conversations this becomes a major performance problem.
Environment
lms log stream --source serverThinking3.5:latestWhat I observed
From LM Studio logs, AnythingLLM does the following:
Example from the LM Studio server log:
LM Studio then logs:
So the native LM Studio connector is not actually using LM Studio’s stateful chat flow for inference.
Why this matters
LM Studio provides a stateful chat API (
/api/v1/chat) specifically to avoid resending the entire message history every turn.Using
/v1/chat/completionsinstead means:This is especially noticeable with large local models and long technical conversations.
Additional concern
In my logs, the
assistantmessages being resent also appear to include internal reasoning content such as:If AnythingLLM is resending hidden reasoning / chain-of-thought-style content back into history, this makes the problem much worse because the effective prompt size grows far faster than the visible conversation would suggest.
Even a relatively small number of turns can become very expensive if each assistant turn contains large hidden reasoning blocks.
Expected behavior
When the user selects the native LM Studio connector, I would expect AnythingLLM to use LM Studio’s native stateful chat API for inference as well, not only for model discovery.
At minimum, I would expect this to be available as an optional mode.
Actual behavior
/v1/chat/completionsSuggested improvement
Option 1: Support LM Studio stateful chat API
When using the LM Studio provider, add support for:
and store the LM Studio conversation reference (
response_id/previous_response_id) per AnythingLLM chat session.This would allow:
Option 2: Add a provider setting / toggle
Example:
/v1/chat/completionsif disabled or unsupportedOption 3: Strip hidden reasoning before resending history
If AnythingLLM must continue using stateless chat completions, it would still help significantly to:
<think>...</think>or hidden reasoning blocks from assistant historyThat alone could reduce prompt bloat a lot.
Reproduction steps
Send a few messages in AnythingLLM
Observe that:
/api/v0/models/v1/chat/completionsClosing note
The current behavior makes the native LM Studio connector feel only partially native:
For local large-model users, especially those running long chats, proper support for LM Studio’s stateful chat API would be a very meaningful improvement.
Thanks.
Are there known steps to reproduce?
No response
@timothycarambat commented on GitHub (Mar 17, 2026):
The /v1/chat API does not support passed in tool calling only its built in MCP managed tools. This would make every tool you add or use in AnythingLLM unusable in LM Studio - this would functionally make LM Studio with AnythingLLM much less useful?
@timothycarambat commented on GitHub (Mar 17, 2026):
I also checked all over the LM Studio docs. I dont see any information about chat being more performant than the OpenAI compatible API. This would make sense because the KV would already be present from the previous inference since the model is loaded - using /chat just seems to have LM Studio store the chat, which they then re-inject for your on your behalf.
Since we are sending the same history over and over + the new message the KV should remain. I know llama.cpp does have some form of prompt caching but I didnt find anything about KV cache or prompt-caching via that endpoint besides the
storeparam which just keeps history in LMstudio so you dont need to do it elsewhere@raucodes commented on GitHub (Mar 17, 2026):
Thanks for the clarification — the tool-calling concern makes sense, and I agree that replacing the current inference path globally with LM Studio’s native /api/v1/chat endpoint would likely break important AnythingLLM functionality.
That said, my main point was not necessarily that /api/v1/chat must replace the current default behavior for all LM Studio users.
My concern is more about long-chat efficiency and state handling.
Right now, the LM Studio provider feels only partially native:
• native for model discovery
• but effectively stateless/OpenAI-compatible for inference
In practice, that means the full visible history is resent every turn, and with some model/backend combinations this does not appear to result in stable or efficient reuse in real-world long chats.
From my testing and LM Studio server logs, “sending the same history again” does not always translate into consistently cheap follow-up turns. In some cases prompt processing still grows significantly over time, especially with large local models and long technical conversations.
I think there are still a few worthwhile improvements here, even if /api/v1/chat cannot be used as the universal default:
1. Optional stateful mode where possible
Even if it cannot support all AnythingLLM tooling features, an optional LM Studio native/stateful mode could still be useful for users who prioritize long-chat performance over tool compatibility.
2. Use response IDs / continuation semantics when supported
Serving conversation state via response IDs or continuation references is cleaner than resending the full transcript on every turn. Even if this cannot be done in every path, it would be a more native and more efficient model for providers that support it.
3. Do not resend hidden reasoning / content
If AnythingLLM continues using stateless history replay, it would still help a lot to strip hidden reasoning blocks before re-injecting assistant history. Re-sending internal thinking content makes prompt growth much worse without improving the visible conversation.
So I completely understand the tooling limitation, but I still think there is room for improvement here:
• either through an optional mode
• or through better history compaction / reasoning stripping
• or through cleaner continuation handling where LM Studio supports it
At minimum, documenting that the current LM Studio provider uses native discovery but stateless OpenAI-style inference would already help set expectations correctly for users running long local chats.