Skip to content

Commit 00aa193

Browse files
authored
Merge pull request #4 from Sanotsu/ai_tools_new_design
全面简化了“AI智能助手模块”
2 parents fe8a04d + a474a81 commit 00aa193

File tree

127 files changed

+14238
-1656
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

127 files changed

+14238
-1656
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -157,3 +157,4 @@ linux
157157
**/*bak*
158158
**/*demo*
159159
**/*bugreport*
160+
.aider*

CHANGELOG.md

+27
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,33 @@
22

33
一些较大变更、新功能、bug 修复等记录放在此处,仅做参看的提交更新.
44

5+
## 0.4.0-beta.1
6+
7+
- refactor:
8+
- 重构了主页和“AI 智能助手”模块,尽量简洁化:
9+
- 进入 App 首页即“助手”模块,可以选择不同平台的模型进行对话
10+
- 原本“AI 智能助手”模块中工具,简化为“AI 助手”、“AI 绘图”、“AI 视频”。
11+
- 大模型 API 调用**只保留兼容 openAI API 结构的**平台和模型,不再兼容其他平台自定义 API 结构。
12+
- 涉及到阿里云、腾讯等平台,API 升级到 V2;移除了讯飞的大模型、阿里云的创意文字锦书模型。
13+
- 支持的平台和大模型 API 不在追求多,更加选择能用和代码编写兼容好:
14+
- 对话模型继续保留
15+
- [百度](https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Fm2vrveyu)
16+
- [阿里](https://help.aliyun.com/zh/model-studio/developer-reference/compatibility-of-openai-with-dashscope)
17+
- [腾讯](https://console.cloud.tencent.com/hunyuan/start)
18+
- [智谱](https://open.bigmodel.cn/dev/api/normal-model/glm-4)
19+
- [零一万物](https://platform.lingyiwanwu.com/docs/api-reference)
20+
- [无问芯穹](https://docs.infini-ai.com/gen-studio/api/maas.html#/operations/chatCompletions)
21+
- [硅基流动](https://docs.siliconflow.cn/cn/api-reference/chat-completions/chat-completions)
22+
- 图片生成只保留了:
23+
- 阿里云:[图像生成-通义万相 文生图 V2 版](https://help.aliyun.com/zh/model-studio/developer-reference/text-to-image-v2-api-reference)[文生图 FLUX](https://help.aliyun.com/zh/model-studio/developer-reference/flux/)
24+
- 智谱 AI: [CogView](https://open.bigmodel.cn/dev/api/image-model/cogview)
25+
- 硅基流动: [创建图片生成请求](https://docs.siliconflow.cn/cn/api-reference/images/images-generations)
26+
- 视频生成只保留了:
27+
- 阿里云: [视频生成-通义万相](https://help.aliyun.com/zh/model-studio/developer-reference/video-generation-wanx/)
28+
- 智谱 AI: [CogVideoX](https://open.bigmodel.cn/dev/api/videomodel/cogvideox)
29+
- 硅基流动: [创建视频生成请求](https://docs.siliconflow.cn/cn/api-reference/videos/videos_submit)
30+
- DeepSeek 官方平台暂时不能充值,可以使用其他平台部署的,比如硅基流动。
31+
532
## 0.3.0-beta.1
633

734
- chore:

README.md

+174-174
Large diffs are not rendered by default.
Loading
Loading
Loading
Loading

assets/images/covers/ai_assistant.jpg

25.3 KB
Loading

assets/images/covers/ai_image.jpg

48.5 KB
Loading

assets/images/covers/ai_video.jpg

56.1 KB
Loading
+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import 'dart:async';
2+
3+
import '../../common/utils/tools.dart';
4+
5+
///
6+
/// dio 中处理SSE的解析器
7+
/// 来源: https://github.com/cfug/dio/issues/1279#issuecomment-1326121953
8+
///
9+
class SseTransformer extends StreamTransformerBase<String, SseMessage> {
10+
const SseTransformer();
11+
@override
12+
Stream<SseMessage> bind(Stream<String> stream) {
13+
return Stream.eventTransformed(stream, (sink) => SseEventSink(sink));
14+
}
15+
}
16+
17+
class SseEventSink implements EventSink<String> {
18+
final EventSink<SseMessage> _eventSink;
19+
20+
String? _id;
21+
String _event = "message";
22+
String _data = "";
23+
int? _retry;
24+
25+
SseEventSink(this._eventSink);
26+
27+
@override
28+
void add(String event) {
29+
if (event.startsWith("id:")) {
30+
_id = event.substring(3);
31+
return;
32+
}
33+
if (event.startsWith("event:")) {
34+
_event = event.substring(6);
35+
return;
36+
}
37+
if (event.startsWith("data:")) {
38+
_data = event.substring(5);
39+
return;
40+
}
41+
if (event.startsWith("retry:")) {
42+
_retry = int.tryParse(event.substring(6));
43+
return;
44+
}
45+
if (event.isEmpty) {
46+
_eventSink.add(
47+
SseMessage(id: _id, event: _event, data: _data, retry: _retry),
48+
);
49+
_id = null;
50+
_event = "message";
51+
_data = "";
52+
_retry = null;
53+
}
54+
55+
// 自己加的,请求报错时不是一个正常的流的结构,是个json,直接添加即可
56+
if (isJsonString(event)) {
57+
_eventSink.add(
58+
SseMessage(id: _id, event: _event, data: event, retry: _retry),
59+
);
60+
61+
_id = null;
62+
_event = "message";
63+
_data = "";
64+
_retry = null;
65+
}
66+
}
67+
68+
@override
69+
void addError(Object error, [StackTrace? stackTrace]) {
70+
_eventSink.addError(error, stackTrace);
71+
}
72+
73+
@override
74+
void close() {
75+
_eventSink.close();
76+
}
77+
}
78+
79+
class SseMessage {
80+
final String? id;
81+
final String event;
82+
final String data;
83+
final int? retry;
84+
85+
const SseMessage({
86+
this.id,
87+
required this.event,
88+
required this.data,
89+
this.retry,
90+
});
91+
}

lib/apis/chat_completion/common_cc_apis.dart

+8-93
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import 'dart:typed_data';
55
import 'package:dio/dio.dart';
66
import 'package:proste_logger/proste_logger.dart';
77

8-
import '../../common/utils/db_tools/db_helper.dart';
9-
import '../../common/utils/tools.dart';
8+
import '../../common/utils/db_tools/db_ai_tool_helper.dart';
109
import '../../models/chat_competion/com_cc_req.dart';
1110
import '../../models/chat_competion/com_cc_resp.dart';
1211
import '../../common/llm_spec/cus_llm_spec.dart';
@@ -18,9 +17,10 @@ import '../gen_access_token/tencent_signature_v3.dart';
1817
import '../gen_access_token/zhipu_signature.dart';
1918
import '../get_app_key_helper.dart';
2019
import '../platform_keys.dart';
20+
import 'chat_helper.dart';
2121

2222
final l = ProsteLogger();
23-
final DBHelper _dbHelper = DBHelper();
23+
final DBAIToolHelper _dbHelper = DBAIToolHelper();
2424

2525
enum PlatUrl {
2626
tencentCCUrl,
@@ -56,94 +56,6 @@ const Map<PlatUrl, String> platUrls = {
5656
String infiniCCUrl(String model) =>
5757
"https://cloud.infini-ai.com/maas/$model/nvidia/chat/completions";
5858

59-
///
60-
/// dio 中处理SSE的解析器
61-
/// 来源: https://github.com/cfug/dio/issues/1279#issuecomment-1326121953
62-
///
63-
class SseTransformer extends StreamTransformerBase<String, SseMessage> {
64-
const SseTransformer();
65-
@override
66-
Stream<SseMessage> bind(Stream<String> stream) {
67-
return Stream.eventTransformed(stream, (sink) => SseEventSink(sink));
68-
}
69-
}
70-
71-
class SseEventSink implements EventSink<String> {
72-
final EventSink<SseMessage> _eventSink;
73-
74-
String? _id;
75-
String _event = "message";
76-
String _data = "";
77-
int? _retry;
78-
79-
SseEventSink(this._eventSink);
80-
81-
@override
82-
void add(String event) {
83-
if (event.startsWith("id:")) {
84-
_id = event.substring(3);
85-
return;
86-
}
87-
if (event.startsWith("event:")) {
88-
_event = event.substring(6);
89-
return;
90-
}
91-
if (event.startsWith("data:")) {
92-
_data = event.substring(5);
93-
return;
94-
}
95-
if (event.startsWith("retry:")) {
96-
_retry = int.tryParse(event.substring(6));
97-
return;
98-
}
99-
if (event.isEmpty) {
100-
_eventSink.add(
101-
SseMessage(id: _id, event: _event, data: _data, retry: _retry),
102-
);
103-
_id = null;
104-
_event = "message";
105-
_data = "";
106-
_retry = null;
107-
}
108-
109-
// 自己加的,请求报错时不是一个正常的流的结构,是个json,直接添加即可
110-
if (isJsonString(event)) {
111-
_eventSink.add(
112-
SseMessage(id: _id, event: _event, data: event, retry: _retry),
113-
);
114-
115-
_id = null;
116-
_event = "message";
117-
_data = "";
118-
_retry = null;
119-
}
120-
}
121-
122-
@override
123-
void addError(Object error, [StackTrace? stackTrace]) {
124-
_eventSink.addError(error, stackTrace);
125-
}
126-
127-
@override
128-
void close() {
129-
_eventSink.close();
130-
}
131-
}
132-
133-
class SseMessage {
134-
final String? id;
135-
final String event;
136-
final String data;
137-
final int? retry;
138-
139-
const SseMessage({
140-
this.id,
141-
required this.event,
142-
required this.data,
143-
this.retry,
144-
});
145-
}
146-
14759
///
14860
///===========可以取消流的写法
14961
///
@@ -275,8 +187,11 @@ Future<StreamWithCancel<ComCCResp>> getSseCcResponse(
275187
final streamController = StreamController<ComCCResp>();
276188
streamController.add(
277189
ComCCResp(
278-
cusText:
279-
"HTTP请求响应异常:\n\n错误代码: ${e.cusCode}\n\n错误信息: ${e.cusMsg}\n\n\n\n原始信息: ${e.errRespString}",
190+
cusText: """HTTP请求响应异常:\n\n错误代码: ${e.cusCode}
191+
\n\n错误信息: ${e.cusMsg}
192+
\n\n错误原文: ${e.errMessage}
193+
\n\n原始信息: ${e.errRespString}
194+
\n\n""",
280195
),
281196
);
282197
streamController.add(ComCCResp(cusText: '[DONE]-后台响应错误'));

0 commit comments

Comments
 (0)