feat: add Ollama integration example (closes #118)#238
Merged
LarFii merged 3 commits intoHKUDS:mainfrom Apr 7, 2026
Merged
Conversation
HKUDS#159) Reasoning models (DeepSeek-R1, Qwen2.5-think, etc.) wrap their chain-of-thought in <think>…</think> blocks before emitting the final answer. When _robust_json_parse fails to extract a valid JSON object from the response, the four modal-processor parse methods (_parse_response, _parse_table_response, _parse_equation_response, _parse_generic_response) were returning the **raw** LLM response as the fallback caption and summary. This caused internal model reasoning to be stored in the knowledge graph instead of the actual content description. Fix: add a static helper `BaseModalProcessor._strip_thinking_tags` that removes <think>/<thinking> blocks (case-insensitive, multiline) and apply it in every fallback branch so only the final-answer text is stored or returned. The helper is tested in tests/test_strip_thinking_tags.py with 13 unit tests covering: tag variants, multiline blocks, multiple blocks, case-insensitivity, and the full fallback path for all four processor classes.
HKUDS#230) On systems where only 'soffice' is on PATH (common on macOS), the existing fallback loop logged a WARNING for the 'libreoffice' candidate before successfully converting via 'soffice'. This caused users to see: WARNING: LibreOffice command 'libreoffice' not found INFO: Successfully converted file.pptx to PDF using soffice …and conclude that something was broken, even though the conversion succeeded. Fix: log FileNotFoundError at DEBUG level for any non-final candidate so that routine 'libreoffice' → 'soffice' fallback stays silent in normal logs. The WARNING is preserved only when the last candidate in the list is not found (meaning no usable LibreOffice binary exists at all and the conversion is about to fail).
Ollama uses a different embedding API (/api/embed via the native ollama Python client) compared to the OpenAI-compatible /v1/embeddings endpoint assumed by the existing openai_embed helper. Pointing that helper at an Ollama host causes embedding failures for most models. Add examples/ollama_integration_example.py that: - Uses openai_complete_if_cache against Ollama's /v1 chat endpoint (works out of the box — Ollama exposes OpenAI-compatible chat) - Calls ollama.AsyncClient.embed() for embeddings so every model in the Ollama registry is supported without extra configuration - Follows the same structure as lmstudio_integration_example.py: connection check, embedding sanity-check, chat sanity-check, RAG init, sample insert + query - Supports OLLAMA_HOST / OLLAMA_LLM_MODEL / OLLAMA_EMBEDDING_MODEL / OLLAMA_EMBEDDING_DIM env vars with sensible defaults (llama3.2 + nomic-embed-text / 768-dim)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Ollama does not expose the
/v1/embeddingsendpoint that the existingopenai_embedhelper targets. Its embedding API is/api/embedand mustbe called via the native
ollamaPython client:As reported in #118, this caused silent embedding failures when users
followed the existing example and pointed it at an Ollama host.
Solution
Add
examples/ollama_integration_example.pymodelled after the existinglmstudio_integration_example.py. Key differences:/v1/chat/completions/v1/chat/completions✅ same/v1/embeddings/api/embed(native client)"ollama"(ignored)The example includes:
ollama pullcommandollama.AsyncClient.embed()and validates the vector dimension againstOLLAMA_EMBEDDING_DIMopenai_complete_if_cacheEnvironment variables (all optional, defaults shown):
Quick start
Checklist
ruff check --ignore=E402+ruff format --checkpass (E402 is ignored in pre-commit config)lmstudio_integration_example.pyollamais already an optional extra)