2 changed files with 85 additions and 6 deletions
@ -0,0 +1,71 @@ |
|||
import 'dart:convert'; |
|||
|
|||
import 'package:get_storage/get_storage.dart'; |
|||
import 'package:http/http.dart' as http; |
|||
|
|||
import '../../core/utils/logger.dart'; |
|||
import 'ai_service.dart'; |
|||
|
|||
class DeapsoundAIService implements AiService { |
|||
late final String apiKey; |
|||
|
|||
DeapsoundAIService() { |
|||
final GetStorage storage = GetStorage(); |
|||
apiKey = storage.read('logintoken'); |
|||
} |
|||
|
|||
@override |
|||
Stream<String> sendMessageStream({ |
|||
required List<Map<String, String>> messages, |
|||
required String systemPrompt, |
|||
}) async* { |
|||
final client = http.Client(); |
|||
final url = Uri.parse('https://www.deapsound.com/ai/chat'); |
|||
|
|||
final headers = { |
|||
'Content-Type': 'application/json', |
|||
'Authorization': apiKey, |
|||
}; |
|||
|
|||
final requestBody = { |
|||
"msg": messages.last['content'], |
|||
}; |
|||
|
|||
try { |
|||
final request = http.Request('POST', url) |
|||
..headers.addAll(headers) |
|||
..body = jsonEncode(requestBody); |
|||
final response = await client.send(request); |
|||
|
|||
//流式处理响应数据 |
|||
await for (final chunk in response.stream |
|||
.transform(utf8.decoder) |
|||
.transform(const LineSplitter())) { |
|||
if (chunk.isEmpty) continue; |
|||
|
|||
if (chunk.startsWith('data:')) { |
|||
final jsonStr = chunk.substring(5).trim(); |
|||
|
|||
try { |
|||
final data = jsonDecode(jsonStr); |
|||
if (data['event'] == 'workflow_finished') { |
|||
break; |
|||
} |
|||
if (data['event'] == 'text_chunk') { |
|||
String content = data['data']['text'] ?? ''; |
|||
if (content.isNotEmpty) { |
|||
yield content; |
|||
} |
|||
} |
|||
} catch (e) { |
|||
Logger.error('JSON解析错误: $e'); |
|||
} |
|||
} |
|||
} |
|||
} catch (e) { |
|||
Logger.error('请求异常: $e'); |
|||
} finally { |
|||
client.close(); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue