|
- import 'dart:convert';
- import 'dart:io';
-
- class Deepseek {
- final String apiKey;
- Deepseek({required this.apiKey});
-
- Stream<String> chat(String prompt) async* {
- final client = HttpClient();
- try {
- final request = await client
- .postUrl(Uri.parse('https://api.deepseek.com/chat/completions'));
-
- // 设置流式请求头
- request.headers
- ..set('Content-Type', 'application/json')
- ..set('Authorization', 'Bearer $apiKey')
- ..set('Accept', 'text/event-stream');
-
- // 构建请求体
- final requestBody = jsonEncode({
- 'model': 'deepseek-chat',
- 'stream': true,
- 'messages': [
- {'role': 'user', 'content': prompt}
- ]
- });
-
- // 写入请求体
- request.add(utf8.encode(requestBody));
- final response = await request.close();
-
- // 检查状态码
- if (response.statusCode != 200) {
- throw Exception('API请求失败: ${response.statusCode}');
- }
-
- // 处理流数据
- String buffer = '';
- await for (final chunk in response.transform(utf8.decoder)) {
- buffer += chunk;
-
- // 分割完整事件(假设使用SSE格式)
- while (buffer.contains('\n\n')) {
- final eventEnd = buffer.indexOf('\n\n');
- final event = buffer.substring(0, eventEnd);
- buffer = buffer.substring(eventEnd + 2);
-
- if (event.startsWith('data: ')) {
- final dataContent = event.substring(6);
- // 增加有效性检查
- if (dataContent == '[DONE]') {
- // print('流式传输结束');
- continue; // 跳过特殊结束标记
- }
- final jsonData = jsonDecode(event.substring(6));
- yield jsonData['choices'][0]['delta']['content'];
- }
- }
- }
- } finally {
- client.close();
- }
- }
- }
|