- app.py: image_input gr.Image component, respond() accepts image_path,
all yields updated to 7 outputs
- api_client.py: chat(image_path=None), base64-encodes image for API
- services/chat.py: chat(image_path=None) passes through to api_client
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add source_box gr.HTML component below chatbot
- Add _sources_html() helper rendering <details> expand/collapse
- Handle __sources token in respond(): update source_box independently of thinking_box
- Reset both thinking_box and source_box on each new message
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
During streaming: _live_html (plain div) shows only the current line —
no DOM reset, no closing issue. __thinking shows last non-empty line,
__meta shows the full trimmed message.
On completion: _thinking_html (<details>) shows all accumulated content
collapsed, expands on click.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
__status tokens show immediately in the thinking box but do not
accumulate in thinking_acc. When real content (__meta/__thinking)
arrives it overwrites the status message naturally.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
gr.Markdown visible toggling is unreliable in Gradio streaming generators.
Switched to gr.HTML with inline styles — empty string hides the element,
HTML string shows the styled box. No visibility state needed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Both __meta (LangGraph/search progress) and __thinking (LLM reasoning)
tokens now stream into the thinking box instead of the chatbot.
Chatbot shows only the final answer. Thinking box shows the full
analysis pipeline: [LangGraph → ...], 문서 검색 중, thinking content.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Show thinking progress in a separate animated box above chatbot
(🤔 사고 중... while streaming, 💭 사고 완료 when answer starts)
- Fix ValueError: add missing 5th yield value (thinking_box) to all
respond() yield statements
- Fix [Reset] and other sync handlers: replace asyncio.get_event_loop()
.run_until_complete() with asyncio.run() for AnyIO thread compatibility
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Introduced "thinking box" UI to display intermediate thought processes.
- Added CSS styling for the thinking box with scrollable and formatted design.
- Updated response handling to show thinking progress and completion dynamically.
- Enhanced Gradio outputs to include the new thinking box component.
Filter __meta dict tokens from TTS accumulator so progress messages
([LangGraph], thinking blocks, source references) are displayed in chat
but not read aloud. Answer tokens continue to accumulate in tts_text.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>