mymuseum-visitapp/lib/Services/Glasses/engines/impl/myinfomate_llm_client.dart

51 lines
1.8 KiB
Dart

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;
late final AssistantService _service;
MyInfoMateLlmClient({required this.visitAppContext}) {
_service = AssistantService(visitAppContext: visitAppContext);
}
@override
Future<String> 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 {
// AppType.Mobile + isVoice:true → backend adapte le prompt (audio-friendly)
// sans navigation, sans markdown, dates en toutes lettres
final response = await _service.chatWithAppType(
message: message,
configurationId: cfgId,
appType: AppType.Mobile,
isVoice: true,
);
return response.reply;
} catch (e) {
debugPrint('[MyInfoMateLlmClient] error: $e');
rethrow;
}
}
@override
void clearHistory() => _service.clearHistory();
}