From eaa30918cc9b43df9c1ec6e183c46ad944698125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Poizat?= Date: Thu, 4 Dec 2025 16:52:00 +0100 Subject: [PATCH] Add AI API request, AI API response and AI message model --- .../scribe/ai/data/model/ai_api_request.dart | 16 ++++++++++ .../scribe/ai/data/model/ai_api_response.dart | 31 +++++++++++++++++++ .../lib/scribe/ai/data/model/ai_message.dart | 16 ++++++++++ .../scribe/ai/domain/model/ai_response.dart | 17 ++++++++++ 4 files changed, 80 insertions(+) create mode 100644 scribe/lib/scribe/ai/data/model/ai_api_request.dart create mode 100644 scribe/lib/scribe/ai/data/model/ai_api_response.dart create mode 100644 scribe/lib/scribe/ai/data/model/ai_message.dart create mode 100644 scribe/lib/scribe/ai/domain/model/ai_response.dart diff --git a/scribe/lib/scribe/ai/data/model/ai_api_request.dart b/scribe/lib/scribe/ai/data/model/ai_api_request.dart new file mode 100644 index 000000000..84c171bb1 --- /dev/null +++ b/scribe/lib/scribe/ai/data/model/ai_api_request.dart @@ -0,0 +1,16 @@ +import 'ai_message.dart'; + +class AIAPIRequest { + final List messages; + + const AIAPIRequest({ + required this.messages, + }); + + Map toJson() { + return { + 'model': 'gpt-oss-120b', + 'messages': messages.map((m) => m.toJson()).toList(), + }; + } +} diff --git a/scribe/lib/scribe/ai/data/model/ai_api_response.dart b/scribe/lib/scribe/ai/data/model/ai_api_response.dart new file mode 100644 index 000000000..c479a60ad --- /dev/null +++ b/scribe/lib/scribe/ai/data/model/ai_api_response.dart @@ -0,0 +1,31 @@ +class AIApiResponse { + final String content; + + const AIApiResponse({ + required this.content + }); + + static AIApiResponse? parse(Map json) { + final choices = json['choices'] as List?; + if (choices == null || choices.isEmpty) { + return null; + } + + final firstChoice = choices[0] as Map?; + if (firstChoice == null) { + return null; + } + + final message = firstChoice['message'] as Map?; + if (message == null) { + return null; + } + + final content = message['content'] as String?; + if (content == null || content.isEmpty) { + return null; + } + + return AIApiResponse(content: content); + } +} diff --git a/scribe/lib/scribe/ai/data/model/ai_message.dart b/scribe/lib/scribe/ai/data/model/ai_message.dart new file mode 100644 index 000000000..01684fd4c --- /dev/null +++ b/scribe/lib/scribe/ai/data/model/ai_message.dart @@ -0,0 +1,16 @@ +class AIMessage { + final String role; + final String content; + + const AIMessage({ + required this.role, + required this.content, + }); + + Map toJson() { + return { + 'role': role, + 'content': content, + }; + } +} diff --git a/scribe/lib/scribe/ai/domain/model/ai_response.dart b/scribe/lib/scribe/ai/domain/model/ai_response.dart new file mode 100644 index 000000000..2f73960f2 --- /dev/null +++ b/scribe/lib/scribe/ai/domain/model/ai_response.dart @@ -0,0 +1,17 @@ +class AIResponse { + final String result; + + const AIResponse({required this.result}); + + factory AIResponse.fromJson(Map json) { + return AIResponse( + result: json['result'] as String? ?? json['text'] as String? ?? '', + ); + } + + Map toJson() { + return { + 'result': result, + }; + } +}