diff --git a/apps/lib/features/chat/data/models/ag_ui_event.dart b/apps/lib/features/chat/data/models/ag_ui_event.dart new file mode 100644 index 0000000..9d62e64 --- /dev/null +++ b/apps/lib/features/chat/data/models/ag_ui_event.dart @@ -0,0 +1,320 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'tool_result.dart'; + +part 'ag_ui_event.g.dart'; + +class AgUiEventTypeWire { + static const runStarted = 'RUN_STARTED'; + static const runFinished = 'RUN_FINISHED'; + static const runError = 'RUN_ERROR'; + static const textMessageStart = 'TEXT_MESSAGE_START'; + static const textMessageContent = 'TEXT_MESSAGE_CONTENT'; + static const textMessageEnd = 'TEXT_MESSAGE_END'; + static const toolCallStart = 'TOOL_CALL_START'; + static const toolCallArgs = 'TOOL_CALL_ARGS'; + static const toolCallEnd = 'TOOL_CALL_END'; + static const toolCallResult = 'TOOL_CALL_RESULT'; + static const toolCallError = 'TOOL_CALL_ERROR'; +} + +enum AgUiEventType { + runStarted, + runFinished, + runError, + textMessageStart, + textMessageContent, + textMessageEnd, + toolCallStart, + toolCallArgs, + toolCallEnd, + toolCallResult, + toolCallError, + unknown, +} + +AgUiEventType agUiEventTypeFromWire(String wire) { + switch (wire) { + case AgUiEventTypeWire.runStarted: + return AgUiEventType.runStarted; + case AgUiEventTypeWire.runFinished: + return AgUiEventType.runFinished; + case AgUiEventTypeWire.runError: + return AgUiEventType.runError; + case AgUiEventTypeWire.textMessageStart: + return AgUiEventType.textMessageStart; + case AgUiEventTypeWire.textMessageContent: + return AgUiEventType.textMessageContent; + case AgUiEventTypeWire.textMessageEnd: + return AgUiEventType.textMessageEnd; + case AgUiEventTypeWire.toolCallStart: + return AgUiEventType.toolCallStart; + case AgUiEventTypeWire.toolCallArgs: + return AgUiEventType.toolCallArgs; + case AgUiEventTypeWire.toolCallEnd: + return AgUiEventType.toolCallEnd; + case AgUiEventTypeWire.toolCallResult: + return AgUiEventType.toolCallResult; + case AgUiEventTypeWire.toolCallError: + return AgUiEventType.toolCallError; + default: + return AgUiEventType.unknown; + } +} + +String agUiEventTypeToWire(AgUiEventType type) { + switch (type) { + case AgUiEventType.runStarted: + return AgUiEventTypeWire.runStarted; + case AgUiEventType.runFinished: + return AgUiEventTypeWire.runFinished; + case AgUiEventType.runError: + return AgUiEventTypeWire.runError; + case AgUiEventType.textMessageStart: + return AgUiEventTypeWire.textMessageStart; + case AgUiEventType.textMessageContent: + return AgUiEventTypeWire.textMessageContent; + case AgUiEventType.textMessageEnd: + return AgUiEventTypeWire.textMessageEnd; + case AgUiEventType.toolCallStart: + return AgUiEventTypeWire.toolCallStart; + case AgUiEventType.toolCallArgs: + return AgUiEventTypeWire.toolCallArgs; + case AgUiEventType.toolCallEnd: + return AgUiEventTypeWire.toolCallEnd; + case AgUiEventType.toolCallResult: + return AgUiEventTypeWire.toolCallResult; + case AgUiEventType.toolCallError: + return AgUiEventTypeWire.toolCallError; + case AgUiEventType.unknown: + return ''; + } +} + +@JsonSerializable() +class AgUiEvent { + final AgUiEventType type; + + AgUiEvent({required this.type}); + + factory AgUiEvent.fromJson(Map json) { + final typeStr = json['type'] as String? ?? ''; + final type = agUiEventTypeFromWire(typeStr); + + switch (type) { + case AgUiEventType.runStarted: + return RunStartedEvent.fromJson(json); + case AgUiEventType.runFinished: + return RunFinishedEvent.fromJson(json); + case AgUiEventType.runError: + return RunErrorEvent.fromJson(json); + case AgUiEventType.textMessageStart: + return TextMessageStartEvent.fromJson(json); + case AgUiEventType.textMessageContent: + return TextMessageContentEvent.fromJson(json); + case AgUiEventType.textMessageEnd: + return TextMessageEndEvent.fromJson(json); + case AgUiEventType.toolCallStart: + return ToolCallStartEvent.fromJson(json); + case AgUiEventType.toolCallArgs: + return ToolCallArgsEvent.fromJson(json); + case AgUiEventType.toolCallEnd: + return ToolCallEndEvent.fromJson(json); + case AgUiEventType.toolCallResult: + return ToolCallResultEvent.fromJson(json); + case AgUiEventType.toolCallError: + return ToolCallErrorEvent.fromJson(json); + case AgUiEventType.unknown: + return UnknownAgUiEvent.fromJson(json); + } + } + + Map toJson() => _$AgUiEventToJson(this); +} + +@JsonSerializable() +class UnknownAgUiEvent extends AgUiEvent { + final Map rawJson; + + UnknownAgUiEvent({required this.rawJson}) + : super(type: AgUiEventType.unknown); + + factory UnknownAgUiEvent.fromJson(Map json) => + UnknownAgUiEvent(rawJson: json); + + @override + Map toJson() => rawJson; +} + +@JsonSerializable() +class RunStartedEvent extends AgUiEvent { + final String threadId; + final String runId; + + RunStartedEvent({required this.threadId, required this.runId}) + : super(type: AgUiEventType.runStarted); + + factory RunStartedEvent.fromJson(Map json) => + _$RunStartedEventFromJson(json); + + @override + Map toJson() => _$RunStartedEventToJson(this); +} + +@JsonSerializable() +class RunFinishedEvent extends AgUiEvent { + final String threadId; + final String runId; + + RunFinishedEvent({required this.threadId, required this.runId}) + : super(type: AgUiEventType.runFinished); + + factory RunFinishedEvent.fromJson(Map json) => + _$RunFinishedEventFromJson(json); + + @override + Map toJson() => _$RunFinishedEventToJson(this); +} + +@JsonSerializable() +class RunErrorEvent extends AgUiEvent { + final String message; + final String? code; + + RunErrorEvent({required this.message, this.code}) + : super(type: AgUiEventType.runError); + + factory RunErrorEvent.fromJson(Map json) => + _$RunErrorEventFromJson(json); + + @override + Map toJson() => _$RunErrorEventToJson(this); +} + +@JsonSerializable() +class TextMessageStartEvent extends AgUiEvent { + final String messageId; + final String role; + + TextMessageStartEvent({required this.messageId, required this.role}) + : super(type: AgUiEventType.textMessageStart); + + factory TextMessageStartEvent.fromJson(Map json) => + _$TextMessageStartEventFromJson(json); + + @override + Map toJson() => _$TextMessageStartEventToJson(this); +} + +@JsonSerializable() +class TextMessageContentEvent extends AgUiEvent { + final String messageId; + final String delta; + + TextMessageContentEvent({required this.messageId, required this.delta}) + : super(type: AgUiEventType.textMessageContent); + + factory TextMessageContentEvent.fromJson(Map json) => + _$TextMessageContentEventFromJson(json); + + @override + Map toJson() => _$TextMessageContentEventToJson(this); +} + +@JsonSerializable() +class TextMessageEndEvent extends AgUiEvent { + final String messageId; + + TextMessageEndEvent({required this.messageId}) + : super(type: AgUiEventType.textMessageEnd); + + factory TextMessageEndEvent.fromJson(Map json) => + _$TextMessageEndEventFromJson(json); + + @override + Map toJson() => _$TextMessageEndEventToJson(this); +} + +@JsonSerializable() +class ToolCallStartEvent extends AgUiEvent { + final String toolCallId; + final String toolCallName; + final String? parentMessageId; + + ToolCallStartEvent({ + required this.toolCallId, + required this.toolCallName, + this.parentMessageId, + }) : super(type: AgUiEventType.toolCallStart); + + factory ToolCallStartEvent.fromJson(Map json) => + _$ToolCallStartEventFromJson(json); + + @override + Map toJson() => _$ToolCallStartEventToJson(this); +} + +@JsonSerializable() +class ToolCallArgsEvent extends AgUiEvent { + final String toolCallId; + final String delta; + + ToolCallArgsEvent({required this.toolCallId, required this.delta}) + : super(type: AgUiEventType.toolCallArgs); + + factory ToolCallArgsEvent.fromJson(Map json) => + _$ToolCallArgsEventFromJson(json); + + @override + Map toJson() => _$ToolCallArgsEventToJson(this); +} + +@JsonSerializable() +class ToolCallEndEvent extends AgUiEvent { + final String toolCallId; + + ToolCallEndEvent({required this.toolCallId}) + : super(type: AgUiEventType.toolCallEnd); + + factory ToolCallEndEvent.fromJson(Map json) => + _$ToolCallEndEventFromJson(json); + + @override + Map toJson() => _$ToolCallEndEventToJson(this); +} + +@JsonSerializable() +class ToolCallResultEvent extends AgUiEvent { + final String messageId; + final String toolCallId; + final Map result; + final UiCard? ui; + + ToolCallResultEvent({ + required this.messageId, + required this.toolCallId, + required this.result, + this.ui, + }) : super(type: AgUiEventType.toolCallResult); + + factory ToolCallResultEvent.fromJson(Map json) => + _$ToolCallResultEventFromJson(json); + + @override + Map toJson() => _$ToolCallResultEventToJson(this); +} + +@JsonSerializable() +class ToolCallErrorEvent extends AgUiEvent { + final String toolCallId; + final String error; + final String? code; + + ToolCallErrorEvent({required this.toolCallId, required this.error, this.code}) + : super(type: AgUiEventType.toolCallError); + + factory ToolCallErrorEvent.fromJson(Map json) => + _$ToolCallErrorEventFromJson(json); + + @override + Map toJson() => _$ToolCallErrorEventToJson(this); +} diff --git a/apps/lib/features/chat/data/models/ag_ui_event.g.dart b/apps/lib/features/chat/data/models/ag_ui_event.g.dart new file mode 100644 index 0000000..09a764b --- /dev/null +++ b/apps/lib/features/chat/data/models/ag_ui_event.g.dart @@ -0,0 +1,159 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'ag_ui_event.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +AgUiEvent _$AgUiEventFromJson(Map json) => + AgUiEvent(type: $enumDecode(_$AgUiEventTypeEnumMap, json['type'])); + +Map _$AgUiEventToJson(AgUiEvent instance) => { + 'type': _$AgUiEventTypeEnumMap[instance.type]!, +}; + +const _$AgUiEventTypeEnumMap = { + AgUiEventType.runStarted: 'runStarted', + AgUiEventType.runFinished: 'runFinished', + AgUiEventType.runError: 'runError', + AgUiEventType.textMessageStart: 'textMessageStart', + AgUiEventType.textMessageContent: 'textMessageContent', + AgUiEventType.textMessageEnd: 'textMessageEnd', + AgUiEventType.toolCallStart: 'toolCallStart', + AgUiEventType.toolCallArgs: 'toolCallArgs', + AgUiEventType.toolCallEnd: 'toolCallEnd', + AgUiEventType.toolCallResult: 'toolCallResult', + AgUiEventType.toolCallError: 'toolCallError', + AgUiEventType.unknown: 'unknown', +}; + +UnknownAgUiEvent _$UnknownAgUiEventFromJson(Map json) => + UnknownAgUiEvent(rawJson: json['rawJson'] as Map); + +Map _$UnknownAgUiEventToJson(UnknownAgUiEvent instance) => + {'rawJson': instance.rawJson}; + +RunStartedEvent _$RunStartedEventFromJson(Map json) => + RunStartedEvent( + threadId: json['threadId'] as String, + runId: json['runId'] as String, + ); + +Map _$RunStartedEventToJson(RunStartedEvent instance) => + {'threadId': instance.threadId, 'runId': instance.runId}; + +RunFinishedEvent _$RunFinishedEventFromJson(Map json) => + RunFinishedEvent( + threadId: json['threadId'] as String, + runId: json['runId'] as String, + ); + +Map _$RunFinishedEventToJson(RunFinishedEvent instance) => + {'threadId': instance.threadId, 'runId': instance.runId}; + +RunErrorEvent _$RunErrorEventFromJson(Map json) => + RunErrorEvent( + message: json['message'] as String, + code: json['code'] as String?, + ); + +Map _$RunErrorEventToJson(RunErrorEvent instance) => + {'message': instance.message, 'code': instance.code}; + +TextMessageStartEvent _$TextMessageStartEventFromJson( + Map json, +) => TextMessageStartEvent( + messageId: json['messageId'] as String, + role: json['role'] as String, +); + +Map _$TextMessageStartEventToJson( + TextMessageStartEvent instance, +) => {'messageId': instance.messageId, 'role': instance.role}; + +TextMessageContentEvent _$TextMessageContentEventFromJson( + Map json, +) => TextMessageContentEvent( + messageId: json['messageId'] as String, + delta: json['delta'] as String, +); + +Map _$TextMessageContentEventToJson( + TextMessageContentEvent instance, +) => { + 'messageId': instance.messageId, + 'delta': instance.delta, +}; + +TextMessageEndEvent _$TextMessageEndEventFromJson(Map json) => + TextMessageEndEvent(messageId: json['messageId'] as String); + +Map _$TextMessageEndEventToJson( + TextMessageEndEvent instance, +) => {'messageId': instance.messageId}; + +ToolCallStartEvent _$ToolCallStartEventFromJson(Map json) => + ToolCallStartEvent( + toolCallId: json['toolCallId'] as String, + toolCallName: json['toolCallName'] as String, + parentMessageId: json['parentMessageId'] as String?, + ); + +Map _$ToolCallStartEventToJson(ToolCallStartEvent instance) => + { + 'toolCallId': instance.toolCallId, + 'toolCallName': instance.toolCallName, + 'parentMessageId': instance.parentMessageId, + }; + +ToolCallArgsEvent _$ToolCallArgsEventFromJson(Map json) => + ToolCallArgsEvent( + toolCallId: json['toolCallId'] as String, + delta: json['delta'] as String, + ); + +Map _$ToolCallArgsEventToJson(ToolCallArgsEvent instance) => + { + 'toolCallId': instance.toolCallId, + 'delta': instance.delta, + }; + +ToolCallEndEvent _$ToolCallEndEventFromJson(Map json) => + ToolCallEndEvent(toolCallId: json['toolCallId'] as String); + +Map _$ToolCallEndEventToJson(ToolCallEndEvent instance) => + {'toolCallId': instance.toolCallId}; + +ToolCallResultEvent _$ToolCallResultEventFromJson(Map json) => + ToolCallResultEvent( + messageId: json['messageId'] as String, + toolCallId: json['toolCallId'] as String, + result: json['result'] as Map, + ui: json['ui'] == null + ? null + : UiCard.fromJson(json['ui'] as Map), + ); + +Map _$ToolCallResultEventToJson( + ToolCallResultEvent instance, +) => { + 'messageId': instance.messageId, + 'toolCallId': instance.toolCallId, + 'result': instance.result, + 'ui': instance.ui, +}; + +ToolCallErrorEvent _$ToolCallErrorEventFromJson(Map json) => + ToolCallErrorEvent( + toolCallId: json['toolCallId'] as String, + error: json['error'] as String, + code: json['code'] as String?, + ); + +Map _$ToolCallErrorEventToJson(ToolCallErrorEvent instance) => + { + 'toolCallId': instance.toolCallId, + 'error': instance.error, + 'code': instance.code, + };