import 'package:flutter/foundation.dart'; import 'package:manager_api_new/api.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart'; import 'package:mymuseum_visitapp/Services/assistantService.dart'; import 'package:mymuseum_visitapp/Services/Glasses/engines/llm_client.dart'; /// Client LLM via backend MyInfoMate (.NET + Gemini Flash). /// /// Utilise AppType.Voice pour signaler au backend : /// - Pas de navigation UI (pas de navigate_to_section / navigate_to_configuration) /// - Pas de show_cards /// - Prompt audio-friendly : réponses courtes, sans markdown, max 30s à l'oral class MyInfoMateLlmClient implements LlmClient { final VisitAppContext visitAppContext; /// ⚠️ La conversation est **partagée** avec le chat écrit et le mode proactif — /// une conversation, plusieurs surfaces. Ce client construisait la sienne /// (`maxHistory: 6`), si bien que poser une question aux lunettes puis ouvrir le /// chat donnait un guide qui ne savait rien de ce qui venait d'être demandé. AssistantService get _service => visitAppContext.assistant; MyInfoMateLlmClient({required this.visitAppContext}); @override Future<({String reply, bool expectsReply})> chat( String message, { String? configurationId, String languageCode = 'FR', }) async { final cfgId = configurationId ?? visitAppContext.configuration?.id; debugPrint('[MyInfoMateLlmClient] chat Voice — instanceId=${visitAppContext.instanceId} ' 'configId=$cfgId lang=$languageCode apiKey=${visitAppContext.apiKey != null ? "set" : "null"}'); try { final response = await _service.chatWithAppType( message: message, configurationId: cfgId, appType: AppType.Mobile, isVoice: true, ); return (reply: response.reply, expectsReply: response.expectsReply); } catch (e) { debugPrint('[MyInfoMateLlmClient] error: $e'); rethrow; } } @override void clearHistory() => _service.clearHistory(); }