{"message":"J4rvis Backend API avec PostgreSQL + ChromaDB + Service Vocal + Recherche Web + Stockage Images + Vision Service + Génération Podcasts","version":"2.4.0","status":"running","timestamp":"2026-05-13T19:45:30.734034+02:00","features":{"postgresql_integration":true,"chromadb_integration":true,"ollama_integration":true,"sse_streaming":true,"websocket_collaboration":true,"voice_chat":true,"whisper_speech_recognition":true,"xtts_text_to_speech":true,"thinking_capture":true,"user_management":true,"conversation_persistence":true,"real_time_interruption":true,"web_search":true,"auto_search_intelligence":true,"image_storage":true,"image_thumbnails":true,"image_optimization":true,"file_based_images":true,"vision_service":true,"image_recognition":true,"auto_unload_vision":true,"podcast_generation":true,"multi_voice_synthesis":true,"document_to_audio":true,"debate_mode":true,"story_mode":true,"education_mode":true,"kid_friendly_content":true,"audio_storage":true,"video_slides_generation":true,"playwright_web_to_video":true,"vue_js_rendering":true,"pillow_fallback":true},"endpoints":{"health":"/health","chat":"/chat","websocket":"/ws/{room_id}","voice_websocket":"/voice/ws","voice_status":"/voice/status","voice_initialize":"/voice/initialize","voice_reload":"/voice/reload","documents":"/documents","images_save":"/images/save","images_gallery":"/images/gallery/{user_id}","images_file":"/images/file/{image_id}","images_thumbnail":"/images/file/{image_id}/thumbnail","images_stats":"/images/stats/{user_id}","images_cleanup":"/images/maintenance/cleanup-orphaned","vision_analyze":"/api/vision/analyze","vision_analyze_base64":"/api/vision/analyze-base64","vision_analyze_gallery":"/api/vision/analyze-gallery/{image_id}","vision_status":"/api/vision/status","vision_warmup":"/api/vision/warmup","vision_unload":"/api/vision/unload","podcast_generate":"/podcast/generate","podcast_list":"/podcast/list/{user_id}","podcast_details":"/podcast/details/{podcast_id}","podcast_audio":"/podcast/audio/{podcast_id}/{filename}","podcast_delete":"/podcast/delete/{podcast_id}","podcast_modes":"/podcast/modes","podcast_status":"/podcast/status","podcast_test":"/podcast/test","slides_preview":"/slides/preview/{slide_index}","slides_generate_batch":"/slides/generate-batch","slides_health":"/slides/health","demo":"/demo","rooms":"/rooms","test_search":null,"docs":null},"database":{"type":"PostgreSQL","host":"postgres","database":"j4rvis","pool_size":20},"storage":{"images_path":"/app/uploads/images","uploads_path":"/app/uploads","max_image_size_mb":20.0,"allowed_image_formats":["png","jpg","jpeg","webp"],"thumbnail_size":300,"audio_path":"/app/audio","podcast_storage":"/app/audio/podcasts","audio_temp_path":"/app/audio/temp","supported_audio_formats":["wav","mp3"],"max_podcast_duration_minutes":30},"ai_models":{"default_model":"","voice_model":"","vision_model":"","ollama_url":"http://host.docker.internal:1234","podcast_llm_model":"","tts_engine":"xtts","available_voices":["male","female"],"voice_languages":["fr"],"thinking_cleanup":true},"podcast_modes":{"debate":{"name":"Débat","description":"Deux voix débattent du contenu du document","voices":2,"target_audience":"général","icon":"🎭"},"story":{"name":"Histoire","description":"Narration du contenu sous forme d'histoire","voices":1,"target_audience":"général","icon":"📚"},"education":{"name":"Éducatif","description":"Version adaptée pour enfants de 8-12 ans","voices":1,"target_audience":"enfants 8-12 ans","icon":"🎓"}}}