Replace all print()/stderr logging with Python logging module using
logger = logging.getLogger(__name__) pattern for consistent log levels
and formatting. Extract score conversion to shared score_utils module.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Extract images from PDFs using pymupdf, generate descriptions via
Qwen3-VL-8B, store in ChromaDB alongside text chunks, and render
images in chat answers. Includes image proxy rewrite, force re-process
endpoint, and VLM API timeout.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add DeepSeek provider routing: deepseek-chat/deepseek-reasoner use
api.deepseek.com, other models use SiliconFlow
- Add stream_with_reasoning() using raw OpenAI SDK to capture
reasoning_content (langchain_openai strips this field)
- RAG chain and conversation chain both use stream_with_reasoning
for proper reasoning display in thinking models
- Frontend model selector: grouped by provider (DeepSeek official +
SiliconFlow), default changed to deepseek-chat
- Regenerate message converted to streaming with reasoning capture
- Minor UI: globals.css additions, chat store refactoring
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>