shinalok
7f50333bdb
Phase 17: Add image upload to chat UI
...
- 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 >
2026-06-02 13:52:21 +09:00
shinalok
974bab7cd8
Phase 28: P3 — Pydantic Settings, dependency-injector IoC, tenacity retry
...
- config.py: dataclasses → pydantic-settings BaseSettings (flat AppConfig,
env vars auto-loaded from .env, type-safe validation)
- api_client.py: HTTPAPIClient takes AppConfig directly (APIConfig removed);
tenacity retry on 5 methods (reset/ingest/list/delete/feedback) —
retries on 5xx + TransportError, 3 attempts, exponential backoff 1-8s
- container.py: manual DI → dependency_injector DeclarativeContainer with
providers.Singleton; Container() needs no args
- app.py: container.X → container.X() calls, remove AppConfig import
- requirements.txt: add pydantic-settings, tenacity, dependency-injector
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 05:59:23 +09:00
shinalok
148211e236
Phase 27: P2 quality improvements — logging, httpx pooling, validation, tests
...
- app.py: replace print() with logging, basicConfig with LOG_LEVEL env var
- api_client.py: shared AsyncClient instance (connection pooling), URL-encode
delete_document path parameter, aclose() for cleanup
- services/document.py: validate file exists and extension before ingest
- tests/: ChatService (4) + DocumentService (6) unit tests via pytest-asyncio
- pyproject.toml: asyncio_mode = auto
- requirements-dev.txt: pytest, pytest-asyncio
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-01 17:52:43 +09:00
shinalok
d81a2f5888
Phase 26: P1 architecture refactor — DI container, service layer, async callbacks
...
- config.py: APIConfig + AppConfig dataclasses, env vars centralized
- api_client.py: APIClientProtocol (Protocol) + HTTPAPIClient class, remove module-level globals
- services.py: ChatService, DocumentService, TTSService (TTS moved from app.py)
- container.py: manual DI container with lazy singleton properties
- app.py: all callbacks converted to async, asyncio.run() fully removed, container wired in
- .env.example: add TTS_EDGE_VOICE entry
- ROADMAP.md: P0/P1 checklist updated to reflect completed work
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-01 17:36:35 +09:00
shinalok
cf68e19f38
Add cross-platform TTS support and update dependencies
2026-05-30 23:54:41 +09:00
shinalok
9455b591de
Add initial implementation of Youlbot WebUI with Gradio frontend
2026-05-30 22:09:53 +09:00