Update ui/tabs.py
Browse files- ui/tabs.py +74 -15
    	
        ui/tabs.py
    CHANGED
    
    | @@ -333,22 +333,81 @@ def create_streaming_voice_tab(streaming_service: StreamingVoiceService): | |
| 333 |  | 
| 334 | 
             
                return streaming_tab
         | 
| 335 | 
             
            def create_image_tab(image_service: ImageService):
         | 
| 336 | 
            -
                 | 
| 337 | 
            -
                 | 
| 338 | 
            -
             | 
| 339 | 
            -
             | 
| 340 | 
            -
                     | 
| 341 | 
            -
             | 
| 342 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 343 | 
             
                    )
         | 
| 344 | 
            -
             | 
| 345 | 
            -
                     | 
| 346 | 
            -
             | 
| 347 | 
            -
             | 
| 348 | 
            -
                     | 
| 349 | 
            -
             | 
| 350 | 
            -
             | 
| 351 | 
            -
                )
         | 
| 352 | 
             
            def create_chat_tab(chat_service: ChatService):
         | 
| 353 | 
             
                gr.Markdown("## Trò chuyện với AI Assistant (Đa ngôn ngữ)")
         | 
| 354 |  | 
|  | |
| 333 |  | 
| 334 | 
             
                return streaming_tab
         | 
| 335 | 
             
            def create_image_tab(image_service: ImageService):
         | 
| 336 | 
            +
                """Tạo tab phân tích hình ảnh với OCR và LLM"""
         | 
| 337 | 
            +
                
         | 
| 338 | 
            +
                with gr.Blocks() as image_tab:
         | 
| 339 | 
            +
                    gr.Markdown("## 🖼️ Phân tích hình ảnh & Trích xuất văn bản")
         | 
| 340 | 
            +
                    gr.Markdown("""
         | 
| 341 | 
            +
                    ### 🔍 Chức năng:
         | 
| 342 | 
            +
                    - **OCR đa ngôn ngữ**: Trích xuất văn bản từ ảnh (Tiếng Việt, Anh, Nhật, Hàn, Trung, ...)
         | 
| 343 | 
            +
                    - **Phân tích AI**: Sử dụng LLM để phân tích nội dung và ngữ cảnh
         | 
| 344 | 
            +
                    - **Hỗ trợ nhiều định dạng**: Tài liệu, ảnh chụp, meme, screenshot
         | 
| 345 | 
            +
                    
         | 
| 346 | 
            +
                    ### 📝 Hướng dẫn:
         | 
| 347 | 
            +
                    1. Tải lên hình ảnh có chứa văn bản
         | 
| 348 | 
            +
                    2. (Tùy chọn) Mô tả hình ảnh để AI phân tích chính xác hơn
         | 
| 349 | 
            +
                    3. Nhấn "Phân tích hình ảnh" để xem kết quả
         | 
| 350 | 
            +
                    """)
         | 
| 351 | 
            +
                    
         | 
| 352 | 
            +
                    with gr.Row():
         | 
| 353 | 
            +
                        with gr.Column(scale=1):
         | 
| 354 | 
            +
                            # Image input
         | 
| 355 | 
            +
                            image_input = gr.Image(
         | 
| 356 | 
            +
                                type="numpy", 
         | 
| 357 | 
            +
                                label="🖼️ Tải lên hình ảnh",
         | 
| 358 | 
            +
                                height=300
         | 
| 359 | 
            +
                            )
         | 
| 360 | 
            +
                            
         | 
| 361 | 
            +
                            # User description
         | 
| 362 | 
            +
                            image_description = gr.Textbox(
         | 
| 363 | 
            +
                                label="📝 Mô tả hình ảnh (tùy chọn)",
         | 
| 364 | 
            +
                                placeholder="Ví dụ: Đây là hóa đơn mua hàng, ảnh chụp menu nhà hàng, văn bản tiếng Việt...",
         | 
| 365 | 
            +
                                lines=3
         | 
| 366 | 
            +
                            )
         | 
| 367 | 
            +
                            
         | 
| 368 | 
            +
                            # Analyze button
         | 
| 369 | 
            +
                            analyze_button = gr.Button(
         | 
| 370 | 
            +
                                "🔍 Phân tích hình ảnh", 
         | 
| 371 | 
            +
                                variant="primary",
         | 
| 372 | 
            +
                                size="lg"
         | 
| 373 | 
            +
                            )
         | 
| 374 | 
            +
                            
         | 
| 375 | 
            +
                            # Clear button
         | 
| 376 | 
            +
                            clear_button = gr.Button("🗑️ Xóa", variant="secondary")
         | 
| 377 | 
            +
                        
         | 
| 378 | 
            +
                        with gr.Column(scale=2):
         | 
| 379 | 
            +
                            # Results output
         | 
| 380 | 
            +
                            image_output = gr.Textbox(
         | 
| 381 | 
            +
                                label="📊 Kết quả phân tích",
         | 
| 382 | 
            +
                                lines=15,
         | 
| 383 | 
            +
                                max_lines=20,
         | 
| 384 | 
            +
                                show_copy_button=True
         | 
| 385 | 
            +
                            )
         | 
| 386 | 
            +
                    
         | 
| 387 | 
            +
                    def analyze_image(image, description):
         | 
| 388 | 
            +
                        """Xử lý phân tích ảnh"""
         | 
| 389 | 
            +
                        if image is None:
         | 
| 390 | 
            +
                            return "❌ Vui lòng tải lên hình ảnh trước khi phân tích."
         | 
| 391 | 
            +
                        
         | 
| 392 | 
            +
                        return image_service.analyze_image_with_description(image, description)
         | 
| 393 | 
            +
                    
         | 
| 394 | 
            +
                    def clear_all():
         | 
| 395 | 
            +
                        """Xóa tất cả input và output"""
         | 
| 396 | 
            +
                        return None, "", ""
         | 
| 397 | 
            +
                    
         | 
| 398 | 
            +
                    # Event handlers
         | 
| 399 | 
            +
                    analyze_button.click(
         | 
| 400 | 
            +
                        analyze_image,
         | 
| 401 | 
            +
                        inputs=[image_input, image_description],
         | 
| 402 | 
            +
                        outputs=[image_output]
         | 
| 403 | 
             
                    )
         | 
| 404 | 
            +
                    
         | 
| 405 | 
            +
                    clear_button.click(
         | 
| 406 | 
            +
                        clear_all,
         | 
| 407 | 
            +
                        outputs=[image_input, image_description, image_output]
         | 
| 408 | 
            +
                    )
         | 
| 409 | 
            +
                
         | 
| 410 | 
            +
                return image_tab
         | 
|  | |
| 411 | 
             
            def create_chat_tab(chat_service: ChatService):
         | 
| 412 | 
             
                gr.Markdown("## Trò chuyện với AI Assistant (Đa ngôn ngữ)")
         | 
| 413 |  | 
