sendMessage static method

Future<OrchestratorResponse> sendMessage({
  1. required String message,
  2. String? sessionId,
})

发送消息到购物助手

Implementation

static Future<OrchestratorResponse> sendMessage({
  required String message,
  String? sessionId,
}) async {
  final url = '$baseUrl$orchestratorPath';

  try {
    final requestBody = {
      'message': message,
      if (sessionId != null) 'session_id': sessionId,
    };

    final language = _getLanguageCode();

    final response = await NetworkUtil.post(
      url,
      headers: {
        'Content-Type': 'application/json',
        'x-language': language,
      },
      body: json.encode(requestBody),
      timeout: Duration(seconds: EnvironmentConfig.apiTimeout),
    );

    // 使用 NetworkUtil 解析响应,自动处理404等错误
    final jsonData = NetworkUtil.parseJsonResponse(response);
    print('📊 JSON数据结构: ${jsonData.keys}');

    // 检查是否有嵌套的 response 字段
    final actualData = jsonData['response'] ?? jsonData;
    print('🔍 实际数据字段: ${actualData.keys}');

    final msgContent = actualData['message']?.toString() ?? '';
    print('💬 消息内容: ${msgContent.length > 50 ? "${msgContent.substring(0, 50)}..." : msgContent}');
    print('🔄 状态: ${actualData['state']}');
    print('➡️ 下一步: ${actualData['next_action']}');

    // 如果有 session_id 在外层,使用外层的
    if (jsonData['session_id'] != null) {
      actualData['session_id'] = jsonData['session_id'];
    }

    final result = OrchestratorResponse.fromJson(actualData);
    print('✅ 响应解析成功 - message: ${result.message.length} chars, quickReplies: ${result.quickReplies.length}');
    return result;
  } on NetworkException catch (e) {
    // 网络异常,使用友好的错误消息
    print('❌ 网络请求失败: ${e.getUserFriendlyMessage()}');
    throw Exception(e.getUserFriendlyMessage());
  } catch (e) {
    print('❌ 发送消息失败: $e');
    rethrow;
  }
}