jinhai-2012 commited on
Commit
760686a
·
1 Parent(s): d2bd1d1

Format: dos2unix (#4467)

Browse files

### What problem does this PR solve?

Format the code

### Type of change

- [x] Refactoring

Signed-off-by: Jin Hai <haijin.chn@gmail.com>

agent/component/akshare.py CHANGED
@@ -1,56 +1,56 @@
1
- #
2
- # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- #
16
- from abc import ABC
17
- import pandas as pd
18
- import akshare as ak
19
- from agent.component.base import ComponentBase, ComponentParamBase
20
-
21
-
22
- class AkShareParam(ComponentParamBase):
23
- """
24
- Define the AkShare component parameters.
25
- """
26
-
27
- def __init__(self):
28
- super().__init__()
29
- self.top_n = 10
30
-
31
- def check(self):
32
- self.check_positive_integer(self.top_n, "Top N")
33
-
34
-
35
- class AkShare(ComponentBase, ABC):
36
- component_name = "AkShare"
37
-
38
- def _run(self, history, **kwargs):
39
- ans = self.get_input()
40
- ans = ",".join(ans["content"]) if "content" in ans else ""
41
- if not ans:
42
- return AkShare.be_output("")
43
-
44
- try:
45
- ak_res = []
46
- stock_news_em_df = ak.stock_news_em(symbol=ans)
47
- stock_news_em_df = stock_news_em_df.head(self._param.top_n)
48
- ak_res = [{"content": '<a href="' + i["新闻链接"] + '">' + i["新闻标题"] + '</a>\n 新闻内容: ' + i[
49
- "新闻内容"] + " \n发布时间:" + i["发布时间"] + " \n文章来源: " + i["文章来源"]} for index, i in stock_news_em_df.iterrows()]
50
- except Exception as e:
51
- return AkShare.be_output("**ERROR**: " + str(e))
52
-
53
- if not ak_res:
54
- return AkShare.be_output("")
55
-
56
- return pd.DataFrame(ak_res)
 
1
+ #
2
+ # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ from abc import ABC
17
+ import pandas as pd
18
+ import akshare as ak
19
+ from agent.component.base import ComponentBase, ComponentParamBase
20
+
21
+
22
+ class AkShareParam(ComponentParamBase):
23
+ """
24
+ Define the AkShare component parameters.
25
+ """
26
+
27
+ def __init__(self):
28
+ super().__init__()
29
+ self.top_n = 10
30
+
31
+ def check(self):
32
+ self.check_positive_integer(self.top_n, "Top N")
33
+
34
+
35
+ class AkShare(ComponentBase, ABC):
36
+ component_name = "AkShare"
37
+
38
+ def _run(self, history, **kwargs):
39
+ ans = self.get_input()
40
+ ans = ",".join(ans["content"]) if "content" in ans else ""
41
+ if not ans:
42
+ return AkShare.be_output("")
43
+
44
+ try:
45
+ ak_res = []
46
+ stock_news_em_df = ak.stock_news_em(symbol=ans)
47
+ stock_news_em_df = stock_news_em_df.head(self._param.top_n)
48
+ ak_res = [{"content": '<a href="' + i["新闻链接"] + '">' + i["新闻标题"] + '</a>\n 新闻内容: ' + i[
49
+ "新闻内容"] + " \n发布时间:" + i["发布时间"] + " \n文章来源: " + i["文章来源"]} for index, i in stock_news_em_df.iterrows()]
50
+ except Exception as e:
51
+ return AkShare.be_output("**ERROR**: " + str(e))
52
+
53
+ if not ak_res:
54
+ return AkShare.be_output("")
55
+
56
+ return pd.DataFrame(ak_res)
agent/component/concentrator.py CHANGED
@@ -1,36 +1,36 @@
1
- #
2
- # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- #
16
- from abc import ABC
17
- from agent.component.base import ComponentBase, ComponentParamBase
18
-
19
-
20
- class ConcentratorParam(ComponentParamBase):
21
- """
22
- Define the Concentrator component parameters.
23
- """
24
-
25
- def __init__(self):
26
- super().__init__()
27
-
28
- def check(self):
29
- return True
30
-
31
-
32
- class Concentrator(ComponentBase, ABC):
33
- component_name = "Concentrator"
34
-
35
- def _run(self, history, **kwargs):
36
  return Concentrator.be_output("")
 
1
+ #
2
+ # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ from abc import ABC
17
+ from agent.component.base import ComponentBase, ComponentParamBase
18
+
19
+
20
+ class ConcentratorParam(ComponentParamBase):
21
+ """
22
+ Define the Concentrator component parameters.
23
+ """
24
+
25
+ def __init__(self):
26
+ super().__init__()
27
+
28
+ def check(self):
29
+ return True
30
+
31
+
32
+ class Concentrator(ComponentBase, ABC):
33
+ component_name = "Concentrator"
34
+
35
+ def _run(self, history, **kwargs):
36
  return Concentrator.be_output("")
agent/component/jin10.py CHANGED
@@ -1,130 +1,130 @@
1
- #
2
- # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- #
16
- import json
17
- from abc import ABC
18
- import pandas as pd
19
- import requests
20
- from agent.component.base import ComponentBase, ComponentParamBase
21
-
22
-
23
- class Jin10Param(ComponentParamBase):
24
- """
25
- Define the Jin10 component parameters.
26
- """
27
-
28
- def __init__(self):
29
- super().__init__()
30
- self.type = "flash"
31
- self.secret_key = "xxx"
32
- self.flash_type = '1'
33
- self.calendar_type = 'cj'
34
- self.calendar_datatype = 'data'
35
- self.symbols_type = 'GOODS'
36
- self.symbols_datatype = 'symbols'
37
- self.contain = ""
38
- self.filter = ""
39
-
40
- def check(self):
41
- self.check_valid_value(self.type, "Type", ['flash', 'calendar', 'symbols', 'news'])
42
- self.check_valid_value(self.flash_type, "Flash Type", ['1', '2', '3', '4', '5'])
43
- self.check_valid_value(self.calendar_type, "Calendar Type", ['cj', 'qh', 'hk', 'us'])
44
- self.check_valid_value(self.calendar_datatype, "Calendar DataType", ['data', 'event', 'holiday'])
45
- self.check_valid_value(self.symbols_type, "Symbols Type", ['GOODS', 'FOREX', 'FUTURE', 'CRYPTO'])
46
- self.check_valid_value(self.symbols_datatype, 'Symbols DataType', ['symbols', 'quotes'])
47
-
48
-
49
- class Jin10(ComponentBase, ABC):
50
- component_name = "Jin10"
51
-
52
- def _run(self, history, **kwargs):
53
- ans = self.get_input()
54
- ans = " - ".join(ans["content"]) if "content" in ans else ""
55
- if not ans:
56
- return Jin10.be_output("")
57
-
58
- jin10_res = []
59
- headers = {'secret-key': self._param.secret_key}
60
- try:
61
- if self._param.type == "flash":
62
- params = {
63
- 'category': self._param.flash_type,
64
- 'contain': self._param.contain,
65
- 'filter': self._param.filter
66
- }
67
- response = requests.get(
68
- url='https://open-data-api.jin10.com/data-api/flash?category=' + self._param.flash_type,
69
- headers=headers, data=json.dumps(params))
70
- response = response.json()
71
- for i in response['data']:
72
- jin10_res.append({"content": i['data']['content']})
73
- if self._param.type == "calendar":
74
- params = {
75
- 'category': self._param.calendar_type
76
- }
77
- response = requests.get(
78
- url='https://open-data-api.jin10.com/data-api/calendar/' + self._param.calendar_datatype + '?category=' + self._param.calendar_type,
79
- headers=headers, data=json.dumps(params))
80
-
81
- response = response.json()
82
- jin10_res.append({"content": pd.DataFrame(response['data']).to_markdown()})
83
- if self._param.type == "symbols":
84
- params = {
85
- 'type': self._param.symbols_type
86
- }
87
- if self._param.symbols_datatype == "quotes":
88
- params['codes'] = 'BTCUSD'
89
- response = requests.get(
90
- url='https://open-data-api.jin10.com/data-api/' + self._param.symbols_datatype + '?type=' + self._param.symbols_type,
91
- headers=headers, data=json.dumps(params))
92
- response = response.json()
93
- if self._param.symbols_datatype == "symbols":
94
- for i in response['data']:
95
- i['Commodity Code'] = i['c']
96
- i['Stock Exchange'] = i['e']
97
- i['Commodity Name'] = i['n']
98
- i['Commodity Type'] = i['t']
99
- del i['c'], i['e'], i['n'], i['t']
100
- if self._param.symbols_datatype == "quotes":
101
- for i in response['data']:
102
- i['Selling Price'] = i['a']
103
- i['Buying Price'] = i['b']
104
- i['Commodity Code'] = i['c']
105
- i['Stock Exchange'] = i['e']
106
- i['Highest Price'] = i['h']
107
- i['Yesterday’s Closing Price'] = i['hc']
108
- i['Lowest Price'] = i['l']
109
- i['Opening Price'] = i['o']
110
- i['Latest Price'] = i['p']
111
- i['Market Quote Time'] = i['t']
112
- del i['a'], i['b'], i['c'], i['e'], i['h'], i['hc'], i['l'], i['o'], i['p'], i['t']
113
- jin10_res.append({"content": pd.DataFrame(response['data']).to_markdown()})
114
- if self._param.type == "news":
115
- params = {
116
- 'contain': self._param.contain,
117
- 'filter': self._param.filter
118
- }
119
- response = requests.get(
120
- url='https://open-data-api.jin10.com/data-api/news',
121
- headers=headers, data=json.dumps(params))
122
- response = response.json()
123
- jin10_res.append({"content": pd.DataFrame(response['data']).to_markdown()})
124
- except Exception as e:
125
- return Jin10.be_output("**ERROR**: " + str(e))
126
-
127
- if not jin10_res:
128
- return Jin10.be_output("")
129
-
130
- return pd.DataFrame(jin10_res)
 
1
+ #
2
+ # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ import json
17
+ from abc import ABC
18
+ import pandas as pd
19
+ import requests
20
+ from agent.component.base import ComponentBase, ComponentParamBase
21
+
22
+
23
+ class Jin10Param(ComponentParamBase):
24
+ """
25
+ Define the Jin10 component parameters.
26
+ """
27
+
28
+ def __init__(self):
29
+ super().__init__()
30
+ self.type = "flash"
31
+ self.secret_key = "xxx"
32
+ self.flash_type = '1'
33
+ self.calendar_type = 'cj'
34
+ self.calendar_datatype = 'data'
35
+ self.symbols_type = 'GOODS'
36
+ self.symbols_datatype = 'symbols'
37
+ self.contain = ""
38
+ self.filter = ""
39
+
40
+ def check(self):
41
+ self.check_valid_value(self.type, "Type", ['flash', 'calendar', 'symbols', 'news'])
42
+ self.check_valid_value(self.flash_type, "Flash Type", ['1', '2', '3', '4', '5'])
43
+ self.check_valid_value(self.calendar_type, "Calendar Type", ['cj', 'qh', 'hk', 'us'])
44
+ self.check_valid_value(self.calendar_datatype, "Calendar DataType", ['data', 'event', 'holiday'])
45
+ self.check_valid_value(self.symbols_type, "Symbols Type", ['GOODS', 'FOREX', 'FUTURE', 'CRYPTO'])
46
+ self.check_valid_value(self.symbols_datatype, 'Symbols DataType', ['symbols', 'quotes'])
47
+
48
+
49
+ class Jin10(ComponentBase, ABC):
50
+ component_name = "Jin10"
51
+
52
+ def _run(self, history, **kwargs):
53
+ ans = self.get_input()
54
+ ans = " - ".join(ans["content"]) if "content" in ans else ""
55
+ if not ans:
56
+ return Jin10.be_output("")
57
+
58
+ jin10_res = []
59
+ headers = {'secret-key': self._param.secret_key}
60
+ try:
61
+ if self._param.type == "flash":
62
+ params = {
63
+ 'category': self._param.flash_type,
64
+ 'contain': self._param.contain,
65
+ 'filter': self._param.filter
66
+ }
67
+ response = requests.get(
68
+ url='https://open-data-api.jin10.com/data-api/flash?category=' + self._param.flash_type,
69
+ headers=headers, data=json.dumps(params))
70
+ response = response.json()
71
+ for i in response['data']:
72
+ jin10_res.append({"content": i['data']['content']})
73
+ if self._param.type == "calendar":
74
+ params = {
75
+ 'category': self._param.calendar_type
76
+ }
77
+ response = requests.get(
78
+ url='https://open-data-api.jin10.com/data-api/calendar/' + self._param.calendar_datatype + '?category=' + self._param.calendar_type,
79
+ headers=headers, data=json.dumps(params))
80
+
81
+ response = response.json()
82
+ jin10_res.append({"content": pd.DataFrame(response['data']).to_markdown()})
83
+ if self._param.type == "symbols":
84
+ params = {
85
+ 'type': self._param.symbols_type
86
+ }
87
+ if self._param.symbols_datatype == "quotes":
88
+ params['codes'] = 'BTCUSD'
89
+ response = requests.get(
90
+ url='https://open-data-api.jin10.com/data-api/' + self._param.symbols_datatype + '?type=' + self._param.symbols_type,
91
+ headers=headers, data=json.dumps(params))
92
+ response = response.json()
93
+ if self._param.symbols_datatype == "symbols":
94
+ for i in response['data']:
95
+ i['Commodity Code'] = i['c']
96
+ i['Stock Exchange'] = i['e']
97
+ i['Commodity Name'] = i['n']
98
+ i['Commodity Type'] = i['t']
99
+ del i['c'], i['e'], i['n'], i['t']
100
+ if self._param.symbols_datatype == "quotes":
101
+ for i in response['data']:
102
+ i['Selling Price'] = i['a']
103
+ i['Buying Price'] = i['b']
104
+ i['Commodity Code'] = i['c']
105
+ i['Stock Exchange'] = i['e']
106
+ i['Highest Price'] = i['h']
107
+ i['Yesterday’s Closing Price'] = i['hc']
108
+ i['Lowest Price'] = i['l']
109
+ i['Opening Price'] = i['o']
110
+ i['Latest Price'] = i['p']
111
+ i['Market Quote Time'] = i['t']
112
+ del i['a'], i['b'], i['c'], i['e'], i['h'], i['hc'], i['l'], i['o'], i['p'], i['t']
113
+ jin10_res.append({"content": pd.DataFrame(response['data']).to_markdown()})
114
+ if self._param.type == "news":
115
+ params = {
116
+ 'contain': self._param.contain,
117
+ 'filter': self._param.filter
118
+ }
119
+ response = requests.get(
120
+ url='https://open-data-api.jin10.com/data-api/news',
121
+ headers=headers, data=json.dumps(params))
122
+ response = response.json()
123
+ jin10_res.append({"content": pd.DataFrame(response['data']).to_markdown()})
124
+ except Exception as e:
125
+ return Jin10.be_output("**ERROR**: " + str(e))
126
+
127
+ if not jin10_res:
128
+ return Jin10.be_output("")
129
+
130
+ return pd.DataFrame(jin10_res)
agent/component/tushare.py CHANGED
@@ -1,72 +1,72 @@
1
- #
2
- # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- #
16
- import json
17
- from abc import ABC
18
- import pandas as pd
19
- import time
20
- import requests
21
- from agent.component.base import ComponentBase, ComponentParamBase
22
-
23
-
24
- class TuShareParam(ComponentParamBase):
25
- """
26
- Define the TuShare component parameters.
27
- """
28
-
29
- def __init__(self):
30
- super().__init__()
31
- self.token = "xxx"
32
- self.src = "eastmoney"
33
- self.start_date = "2024-01-01 09:00:00"
34
- self.end_date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
35
- self.keyword = ""
36
-
37
- def check(self):
38
- self.check_valid_value(self.src, "Quick News Source",
39
- ["sina", "wallstreetcn", "10jqka", "eastmoney", "yuncaijing", "fenghuang", "jinrongjie"])
40
-
41
-
42
- class TuShare(ComponentBase, ABC):
43
- component_name = "TuShare"
44
-
45
- def _run(self, history, **kwargs):
46
- ans = self.get_input()
47
- ans = ",".join(ans["content"]) if "content" in ans else ""
48
- if not ans:
49
- return TuShare.be_output("")
50
-
51
- try:
52
- tus_res = []
53
- params = {
54
- "api_name": "news",
55
- "token": self._param.token,
56
- "params": {"src": self._param.src, "start_date": self._param.start_date,
57
- "end_date": self._param.end_date}
58
- }
59
- response = requests.post(url="http://api.tushare.pro", data=json.dumps(params).encode('utf-8'))
60
- response = response.json()
61
- if response['code'] != 0:
62
- return TuShare.be_output(response['msg'])
63
- df = pd.DataFrame(response['data']['items'])
64
- df.columns = response['data']['fields']
65
- tus_res.append({"content": (df[df['content'].str.contains(self._param.keyword, case=False)]).to_markdown()})
66
- except Exception as e:
67
- return TuShare.be_output("**ERROR**: " + str(e))
68
-
69
- if not tus_res:
70
- return TuShare.be_output("")
71
-
72
- return pd.DataFrame(tus_res)
 
1
+ #
2
+ # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ import json
17
+ from abc import ABC
18
+ import pandas as pd
19
+ import time
20
+ import requests
21
+ from agent.component.base import ComponentBase, ComponentParamBase
22
+
23
+
24
+ class TuShareParam(ComponentParamBase):
25
+ """
26
+ Define the TuShare component parameters.
27
+ """
28
+
29
+ def __init__(self):
30
+ super().__init__()
31
+ self.token = "xxx"
32
+ self.src = "eastmoney"
33
+ self.start_date = "2024-01-01 09:00:00"
34
+ self.end_date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
35
+ self.keyword = ""
36
+
37
+ def check(self):
38
+ self.check_valid_value(self.src, "Quick News Source",
39
+ ["sina", "wallstreetcn", "10jqka", "eastmoney", "yuncaijing", "fenghuang", "jinrongjie"])
40
+
41
+
42
+ class TuShare(ComponentBase, ABC):
43
+ component_name = "TuShare"
44
+
45
+ def _run(self, history, **kwargs):
46
+ ans = self.get_input()
47
+ ans = ",".join(ans["content"]) if "content" in ans else ""
48
+ if not ans:
49
+ return TuShare.be_output("")
50
+
51
+ try:
52
+ tus_res = []
53
+ params = {
54
+ "api_name": "news",
55
+ "token": self._param.token,
56
+ "params": {"src": self._param.src, "start_date": self._param.start_date,
57
+ "end_date": self._param.end_date}
58
+ }
59
+ response = requests.post(url="http://api.tushare.pro", data=json.dumps(params).encode('utf-8'))
60
+ response = response.json()
61
+ if response['code'] != 0:
62
+ return TuShare.be_output(response['msg'])
63
+ df = pd.DataFrame(response['data']['items'])
64
+ df.columns = response['data']['fields']
65
+ tus_res.append({"content": (df[df['content'].str.contains(self._param.keyword, case=False)]).to_markdown()})
66
+ except Exception as e:
67
+ return TuShare.be_output("**ERROR**: " + str(e))
68
+
69
+ if not tus_res:
70
+ return TuShare.be_output("")
71
+
72
+ return pd.DataFrame(tus_res)
agent/component/wencai.py CHANGED
@@ -1,80 +1,80 @@
1
- #
2
- # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- #
16
- from abc import ABC
17
- import pandas as pd
18
- import pywencai
19
- from agent.component.base import ComponentBase, ComponentParamBase
20
-
21
-
22
- class WenCaiParam(ComponentParamBase):
23
- """
24
- Define the WenCai component parameters.
25
- """
26
-
27
- def __init__(self):
28
- super().__init__()
29
- self.top_n = 10
30
- self.query_type = "stock"
31
-
32
- def check(self):
33
- self.check_positive_integer(self.top_n, "Top N")
34
- self.check_valid_value(self.query_type, "Query type",
35
- ['stock', 'zhishu', 'fund', 'hkstock', 'usstock', 'threeboard', 'conbond', 'insurance',
36
- 'futures', 'lccp',
37
- 'foreign_exchange'])
38
-
39
-
40
- class WenCai(ComponentBase, ABC):
41
- component_name = "WenCai"
42
-
43
- def _run(self, history, **kwargs):
44
- ans = self.get_input()
45
- ans = ",".join(ans["content"]) if "content" in ans else ""
46
- if not ans:
47
- return WenCai.be_output("")
48
-
49
- try:
50
- wencai_res = []
51
- res = pywencai.get(query=ans, query_type=self._param.query_type, perpage=self._param.top_n)
52
- if isinstance(res, pd.DataFrame):
53
- wencai_res.append({"content": res.to_markdown()})
54
- if isinstance(res, dict):
55
- for item in res.items():
56
- if isinstance(item[1], list):
57
- wencai_res.append({"content": item[0] + "\n" + pd.DataFrame(item[1]).to_markdown()})
58
- continue
59
- if isinstance(item[1], str):
60
- wencai_res.append({"content": item[0] + "\n" + item[1]})
61
- continue
62
- if isinstance(item[1], dict):
63
- if "meta" in item[1].keys():
64
- continue
65
- wencai_res.append({"content": pd.DataFrame.from_dict(item[1], orient='index').to_markdown()})
66
- continue
67
- if isinstance(item[1], pd.DataFrame):
68
- if "image_url" in item[1].columns:
69
- continue
70
- wencai_res.append({"content": item[1].to_markdown()})
71
- continue
72
-
73
- wencai_res.append({"content": item[0] + "\n" + str(item[1])})
74
- except Exception as e:
75
- return WenCai.be_output("**ERROR**: " + str(e))
76
-
77
- if not wencai_res:
78
- return WenCai.be_output("")
79
-
80
- return pd.DataFrame(wencai_res)
 
1
+ #
2
+ # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ from abc import ABC
17
+ import pandas as pd
18
+ import pywencai
19
+ from agent.component.base import ComponentBase, ComponentParamBase
20
+
21
+
22
+ class WenCaiParam(ComponentParamBase):
23
+ """
24
+ Define the WenCai component parameters.
25
+ """
26
+
27
+ def __init__(self):
28
+ super().__init__()
29
+ self.top_n = 10
30
+ self.query_type = "stock"
31
+
32
+ def check(self):
33
+ self.check_positive_integer(self.top_n, "Top N")
34
+ self.check_valid_value(self.query_type, "Query type",
35
+ ['stock', 'zhishu', 'fund', 'hkstock', 'usstock', 'threeboard', 'conbond', 'insurance',
36
+ 'futures', 'lccp',
37
+ 'foreign_exchange'])
38
+
39
+
40
+ class WenCai(ComponentBase, ABC):
41
+ component_name = "WenCai"
42
+
43
+ def _run(self, history, **kwargs):
44
+ ans = self.get_input()
45
+ ans = ",".join(ans["content"]) if "content" in ans else ""
46
+ if not ans:
47
+ return WenCai.be_output("")
48
+
49
+ try:
50
+ wencai_res = []
51
+ res = pywencai.get(query=ans, query_type=self._param.query_type, perpage=self._param.top_n)
52
+ if isinstance(res, pd.DataFrame):
53
+ wencai_res.append({"content": res.to_markdown()})
54
+ if isinstance(res, dict):
55
+ for item in res.items():
56
+ if isinstance(item[1], list):
57
+ wencai_res.append({"content": item[0] + "\n" + pd.DataFrame(item[1]).to_markdown()})
58
+ continue
59
+ if isinstance(item[1], str):
60
+ wencai_res.append({"content": item[0] + "\n" + item[1]})
61
+ continue
62
+ if isinstance(item[1], dict):
63
+ if "meta" in item[1].keys():
64
+ continue
65
+ wencai_res.append({"content": pd.DataFrame.from_dict(item[1], orient='index').to_markdown()})
66
+ continue
67
+ if isinstance(item[1], pd.DataFrame):
68
+ if "image_url" in item[1].columns:
69
+ continue
70
+ wencai_res.append({"content": item[1].to_markdown()})
71
+ continue
72
+
73
+ wencai_res.append({"content": item[0] + "\n" + str(item[1])})
74
+ except Exception as e:
75
+ return WenCai.be_output("**ERROR**: " + str(e))
76
+
77
+ if not wencai_res:
78
+ return WenCai.be_output("")
79
+
80
+ return pd.DataFrame(wencai_res)
agent/component/yahoofinance.py CHANGED
@@ -1,84 +1,84 @@
1
- #
2
- # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- #
16
- import logging
17
- from abc import ABC
18
- import pandas as pd
19
- from agent.component.base import ComponentBase, ComponentParamBase
20
- import yfinance as yf
21
-
22
-
23
- class YahooFinanceParam(ComponentParamBase):
24
- """
25
- Define the YahooFinance component parameters.
26
- """
27
-
28
- def __init__(self):
29
- super().__init__()
30
- self.info = True
31
- self.history = False
32
- self.count = False
33
- self.financials = False
34
- self.income_stmt = False
35
- self.balance_sheet = False
36
- self.cash_flow_statement = False
37
- self.news = True
38
-
39
- def check(self):
40
- self.check_boolean(self.info, "get all stock info")
41
- self.check_boolean(self.history, "get historical market data")
42
- self.check_boolean(self.count, "show share count")
43
- self.check_boolean(self.financials, "show financials")
44
- self.check_boolean(self.income_stmt, "income statement")
45
- self.check_boolean(self.balance_sheet, "balance sheet")
46
- self.check_boolean(self.cash_flow_statement, "cash flow statement")
47
- self.check_boolean(self.news, "show news")
48
-
49
-
50
- class YahooFinance(ComponentBase, ABC):
51
- component_name = "YahooFinance"
52
-
53
- def _run(self, history, **kwargs):
54
- ans = self.get_input()
55
- ans = "".join(ans["content"]) if "content" in ans else ""
56
- if not ans:
57
- return YahooFinance.be_output("")
58
-
59
- yohoo_res = []
60
- try:
61
- msft = yf.Ticker(ans)
62
- if self._param.info:
63
- yohoo_res.append({"content": "info:\n" + pd.Series(msft.info).to_markdown() + "\n"})
64
- if self._param.history:
65
- yohoo_res.append({"content": "history:\n" + msft.history().to_markdown() + "\n"})
66
- if self._param.financials:
67
- yohoo_res.append({"content": "calendar:\n" + pd.DataFrame(msft.calendar).to_markdown() + "\n"})
68
- if self._param.balance_sheet:
69
- yohoo_res.append({"content": "balance sheet:\n" + msft.balance_sheet.to_markdown() + "\n"})
70
- yohoo_res.append(
71
- {"content": "quarterly balance sheet:\n" + msft.quarterly_balance_sheet.to_markdown() + "\n"})
72
- if self._param.cash_flow_statement:
73
- yohoo_res.append({"content": "cash flow statement:\n" + msft.cashflow.to_markdown() + "\n"})
74
- yohoo_res.append(
75
- {"content": "quarterly cash flow statement:\n" + msft.quarterly_cashflow.to_markdown() + "\n"})
76
- if self._param.news:
77
- yohoo_res.append({"content": "news:\n" + pd.DataFrame(msft.news).to_markdown() + "\n"})
78
- except Exception:
79
- logging.exception("YahooFinance got exception")
80
-
81
- if not yohoo_res:
82
- return YahooFinance.be_output("")
83
-
84
- return pd.DataFrame(yohoo_res)
 
1
+ #
2
+ # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ import logging
17
+ from abc import ABC
18
+ import pandas as pd
19
+ from agent.component.base import ComponentBase, ComponentParamBase
20
+ import yfinance as yf
21
+
22
+
23
+ class YahooFinanceParam(ComponentParamBase):
24
+ """
25
+ Define the YahooFinance component parameters.
26
+ """
27
+
28
+ def __init__(self):
29
+ super().__init__()
30
+ self.info = True
31
+ self.history = False
32
+ self.count = False
33
+ self.financials = False
34
+ self.income_stmt = False
35
+ self.balance_sheet = False
36
+ self.cash_flow_statement = False
37
+ self.news = True
38
+
39
+ def check(self):
40
+ self.check_boolean(self.info, "get all stock info")
41
+ self.check_boolean(self.history, "get historical market data")
42
+ self.check_boolean(self.count, "show share count")
43
+ self.check_boolean(self.financials, "show financials")
44
+ self.check_boolean(self.income_stmt, "income statement")
45
+ self.check_boolean(self.balance_sheet, "balance sheet")
46
+ self.check_boolean(self.cash_flow_statement, "cash flow statement")
47
+ self.check_boolean(self.news, "show news")
48
+
49
+
50
+ class YahooFinance(ComponentBase, ABC):
51
+ component_name = "YahooFinance"
52
+
53
+ def _run(self, history, **kwargs):
54
+ ans = self.get_input()
55
+ ans = "".join(ans["content"]) if "content" in ans else ""
56
+ if not ans:
57
+ return YahooFinance.be_output("")
58
+
59
+ yohoo_res = []
60
+ try:
61
+ msft = yf.Ticker(ans)
62
+ if self._param.info:
63
+ yohoo_res.append({"content": "info:\n" + pd.Series(msft.info).to_markdown() + "\n"})
64
+ if self._param.history:
65
+ yohoo_res.append({"content": "history:\n" + msft.history().to_markdown() + "\n"})
66
+ if self._param.financials:
67
+ yohoo_res.append({"content": "calendar:\n" + pd.DataFrame(msft.calendar).to_markdown() + "\n"})
68
+ if self._param.balance_sheet:
69
+ yohoo_res.append({"content": "balance sheet:\n" + msft.balance_sheet.to_markdown() + "\n"})
70
+ yohoo_res.append(
71
+ {"content": "quarterly balance sheet:\n" + msft.quarterly_balance_sheet.to_markdown() + "\n"})
72
+ if self._param.cash_flow_statement:
73
+ yohoo_res.append({"content": "cash flow statement:\n" + msft.cashflow.to_markdown() + "\n"})
74
+ yohoo_res.append(
75
+ {"content": "quarterly cash flow statement:\n" + msft.quarterly_cashflow.to_markdown() + "\n"})
76
+ if self._param.news:
77
+ yohoo_res.append({"content": "news:\n" + pd.DataFrame(msft.news).to_markdown() + "\n"})
78
+ except Exception:
79
+ logging.exception("YahooFinance got exception")
80
+
81
+ if not yohoo_res:
82
+ return YahooFinance.be_output("")
83
+
84
+ return pd.DataFrame(yohoo_res)
agent/templates/investment_advisor.json CHANGED
@@ -1,571 +1,571 @@
1
- {
2
- "id": 8,
3
- "title": "Intelligent investment advisor",
4
- "description": "An intelligent investment advisor that answers your financial questions using real-time domestic financial data.",
5
- "canvas_type": "chatbot",
6
- "dsl": {
7
- "answer": [],
8
- "components": {
9
- "begin": {
10
- "obj": {
11
- "component_name": "Begin",
12
- "params": {
13
- "prologue": "Hi there!"
14
- }
15
- },
16
- "downstream": [
17
- "Answer:NeatLandsWave"
18
- ],
19
- "upstream": []
20
- },
21
- "WenCai:TenParksOpen": {
22
- "obj": {
23
- "component_name": "WenCai",
24
- "params": {
25
- "query_type": "stock",
26
- "top_n": 5
27
- }
28
- },
29
- "downstream": [
30
- "Generate:RottenPianosUnite"
31
- ],
32
- "upstream": [
33
- "Answer:NeatLandsWave"
34
- ]
35
- },
36
- "AkShare:CalmHotelsKnow": {
37
- "obj": {
38
- "component_name": "AkShare",
39
- "params": {
40
- "top_n": 10
41
- }
42
- },
43
- "downstream": [
44
- "Generate:RottenPianosUnite"
45
- ],
46
- "upstream": [
47
- "KeywordExtract:BreezyGoatsRead"
48
- ]
49
- },
50
- "Answer:NeatLandsWave": {
51
- "obj": {
52
- "component_name": "Answer",
53
- "params": {}
54
- },
55
- "downstream": [
56
- "WenCai:TenParksOpen",
57
- "KeywordExtract:BreezyGoatsRead"
58
- ],
59
- "upstream": [
60
- "begin",
61
- "Generate:RottenPianosUnite"
62
- ]
63
- },
64
- "Generate:RottenPianosUnite": {
65
- "obj": {
66
- "component_name": "Generate",
67
- "params": {
68
- "cite": true,
69
- "frequency_penalty": 0.7,
70
- "llm_id": "deepseek-chat@DeepSeek",
71
- "max_tokens": 256,
72
- "message_history_window_size": 0,
73
- "parameters": [
74
- {
75
- "component_id": "WenCai:TenParksOpen",
76
- "id": "d35f331b-2787-4ae7-ab81-a7ea15970843",
77
- "key": "wencai_input"
78
- },
79
- {
80
- "component_id": "AkShare:CalmHotelsKnow",
81
- "id": "36c4db0b-c80d-4119-a2a6-05ed9f7efbc9",
82
- "key": "ak_input"
83
- }
84
- ],
85
- "presence_penalty": 0.4,
86
- "prompt": "Role: You are a professional financial counseling assistant.\n\nTask: Answer user's question based on content provided by Wencai and AkShare.\n\nNotice:\n- Output no more than 5 news items from AkShare if there's content provided by Wencai.\n- Items from AkShare MUST have a corresponding URL link.\n\n############\nContent provided by Wencai: \n{wencai_input}\n\n################\nContent provided by AkShare: \n{ak_input}",
87
- "temperature": 0.1,
88
- "top_p": 0.3
89
- }
90
- },
91
- "downstream": [
92
- "Answer:NeatLandsWave"
93
- ],
94
- "upstream": [
95
- "WenCai:TenParksOpen",
96
- "AkShare:CalmHotelsKnow"
97
- ]
98
- },
99
- "KeywordExtract:BreezyGoatsRead": {
100
- "obj": {
101
- "component_name": "KeywordExtract",
102
- "params": {
103
- "frequencyPenaltyEnabled": true,
104
- "frequency_penalty": 0.7,
105
- "llm_id": "deepseek-chat@DeepSeek",
106
- "maxTokensEnabled": true,
107
- "max_tokens": 256,
108
- "parameter": "Precise",
109
- "presencePenaltyEnabled": true,
110
- "presence_penalty": 0.4,
111
- "temperature": 0.1,
112
- "temperatureEnabled": true,
113
- "topPEnabled": true,
114
- "top_n": 2,
115
- "top_p": 0.3
116
- }
117
- },
118
- "downstream": [
119
- "AkShare:CalmHotelsKnow"
120
- ],
121
- "upstream": [
122
- "Answer:NeatLandsWave"
123
- ]
124
- }
125
- },
126
- "graph": {
127
- "nodes": [
128
- {
129
- "data": {
130
- "form": {
131
- "prologue": "Hi there!"
132
- },
133
- "label": "Begin",
134
- "name": "Opening"
135
- },
136
- "dragging": false,
137
- "height": 44,
138
- "id": "begin",
139
- "position": {
140
- "x": -521.8118264317484,
141
- "y": -27.999467037576665
142
- },
143
- "positionAbsolute": {
144
- "x": -521.8118264317484,
145
- "y": -27.999467037576665
146
- },
147
- "selected": false,
148
- "sourcePosition": "left",
149
- "targetPosition": "right",
150
- "type": "beginNode",
151
- "width": 100
152
- },
153
- {
154
- "data": {
155
- "form": {
156
- "query_type": "stock",
157
- "top_n": 5
158
- },
159
- "label": "WenCai",
160
- "name": "Wencai"
161
- },
162
- "dragging": false,
163
- "height": 44,
164
- "id": "WenCai:TenParksOpen",
165
- "position": {
166
- "x": -13.030801663267397,
167
- "y": -30.557141660610256
168
- },
169
- "positionAbsolute": {
170
- "x": -13.030801663267397,
171
- "y": -30.557141660610256
172
- },
173
- "selected": false,
174
- "sourcePosition": "right",
175
- "targetPosition": "left",
176
- "type": "ragNode",
177
- "width": 200
178
- },
179
- {
180
- "data": {
181
- "form": {
182
- "top_n": 10
183
- },
184
- "label": "AkShare",
185
- "name": "AKShare"
186
- },
187
- "dragging": false,
188
- "height": 44,
189
- "id": "AkShare:CalmHotelsKnow",
190
- "position": {
191
- "x": 267.17349571786156,
192
- "y": 100.01281266803943
193
- },
194
- "positionAbsolute": {
195
- "x": 267.17349571786156,
196
- "y": 100.01281266803943
197
- },
198
- "selected": false,
199
- "sourcePosition": "right",
200
- "targetPosition": "left",
201
- "type": "ragNode",
202
- "width": 200
203
- },
204
- {
205
- "data": {
206
- "form": {},
207
- "label": "Answer",
208
- "name": "Interact"
209
- },
210
- "dragging": false,
211
- "height": 44,
212
- "id": "Answer:NeatLandsWave",
213
- "position": {
214
- "x": -304.0612563145512,
215
- "y": -29.054278091837944
216
- },
217
- "positionAbsolute": {
218
- "x": -304.0612563145512,
219
- "y": -29.054278091837944
220
- },
221
- "selected": false,
222
- "sourcePosition": "right",
223
- "targetPosition": "left",
224
- "type": "logicNode",
225
- "width": 200
226
- },
227
- {
228
- "data": {
229
- "form": {
230
- "cite": true,
231
- "frequencyPenaltyEnabled": true,
232
- "frequency_penalty": 0.7,
233
- "llm_id": "deepseek-chat@DeepSeek",
234
- "maxTokensEnabled": true,
235
- "max_tokens": 256,
236
- "message_history_window_size": 0,
237
- "parameter": "Precise",
238
- "parameters": [
239
- {
240
- "component_id": "WenCai:TenParksOpen",
241
- "id": "d35f331b-2787-4ae7-ab81-a7ea15970843",
242
- "key": "wencai_input"
243
- },
244
- {
245
- "component_id": "AkShare:CalmHotelsKnow",
246
- "id": "36c4db0b-c80d-4119-a2a6-05ed9f7efbc9",
247
- "key": "ak_input"
248
- }
249
- ],
250
- "presencePenaltyEnabled": true,
251
- "presence_penalty": 0.4,
252
- "prompt": "Role: You are a professional financial counseling assistant.\n\nTask: Answer user's question based on content provided by Wencai and AkShare.\n\nNotice:\n- Output no more than 5 news items from AkShare if there's content provided by Wencai.\n- Items from AkShare MUST have a corresponding URL link.\n\n############\nContent provided by Wencai: \n{wencai_input}\n\n################\nContent provided by AkShare: \n{ak_input}",
253
- "temperature": 0.1,
254
- "temperatureEnabled": true,
255
- "topPEnabled": true,
256
- "top_p": 0.3
257
- },
258
- "label": "Generate",
259
- "name": "LLM"
260
- },
261
- "dragging": false,
262
- "height": 170,
263
- "id": "Generate:RottenPianosUnite",
264
- "position": {
265
- "x": -16.477598988611703,
266
- "y": -251.90091743639417
267
- },
268
- "positionAbsolute": {
269
- "x": -16.477598988611703,
270
- "y": -251.90091743639417
271
- },
272
- "selected": false,
273
- "sourcePosition": "right",
274
- "targetPosition": "left",
275
- "type": "generateNode",
276
- "width": 200
277
- },
278
- {
279
- "data": {
280
- "form": {
281
- "frequencyPenaltyEnabled": true,
282
- "frequency_penalty": 0.7,
283
- "llm_id": "deepseek-chat@DeepSeek",
284
- "maxTokensEnabled": true,
285
- "max_tokens": 256,
286
- "parameter": "Precise",
287
- "presencePenaltyEnabled": true,
288
- "presence_penalty": 0.4,
289
- "temperature": 0.1,
290
- "temperatureEnabled": true,
291
- "topPEnabled": true,
292
- "top_n": 2,
293
- "top_p": 0.3
294
- },
295
- "label": "KeywordExtract",
296
- "name": "Keywords"
297
- },
298
- "dragging": false,
299
- "height": 86,
300
- "id": "KeywordExtract:BreezyGoatsRead",
301
- "position": {
302
- "x": -17.690374759999543,
303
- "y": 80.39964392387697
304
- },
305
- "positionAbsolute": {
306
- "x": -17.690374759999543,
307
- "y": 80.39964392387697
308
- },
309
- "selected": false,
310
- "sourcePosition": "right",
311
- "targetPosition": "left",
312
- "type": "keywordNode",
313
- "width": 200
314
- },
315
- {
316
- "data": {
317
- "form": {
318
- "text": "Receives the user's financial inquiries and displays the large model's response to financial questions."
319
- },
320
- "label": "Note",
321
- "name": "N: Interact"
322
- },
323
- "dragging": false,
324
- "height": 162,
325
- "id": "Note:FuzzyPoetsLearn",
326
- "position": {
327
- "x": -296.5982116419186,
328
- "y": 38.77567426067935
329
- },
330
- "positionAbsolute": {
331
- "x": -296.5982116419186,
332
- "y": 38.77567426067935
333
- },
334
- "resizing": false,
335
- "selected": false,
336
- "sourcePosition": "right",
337
- "style": {
338
- "height": 162,
339
- "width": 214
340
- },
341
- "targetPosition": "left",
342
- "type": "noteNode",
343
- "width": 214,
344
- "dragHandle": ".note-drag-handle"
345
- },
346
- {
347
- "data": {
348
- "form": {
349
- "text": "Extracts keywords based on the user's financial questions for better retrieval."
350
- },
351
- "label": "Note",
352
- "name": "N: Keywords"
353
- },
354
- "dragging": false,
355
- "height": 155,
356
- "id": "Note:FlatBagsRun",
357
- "position": {
358
- "x": -14.82895160277127,
359
- "y": 186.52508153680787
360
- },
361
- "positionAbsolute": {
362
- "x": -14.82895160277127,
363
- "y": 186.52508153680787
364
- },
365
- "resizing": false,
366
- "selected": false,
367
- "sourcePosition": "right",
368
- "style": {
369
- "height": 155,
370
- "width": 213
371
- },
372
- "targetPosition": "left",
373
- "type": "noteNode",
374
- "width": 213,
375
- "dragHandle": ".note-drag-handle"
376
- },
377
- {
378
- "data": {
379
- "form": {
380
- "text": "Searches on akshare for the latest news about economics based on the keywords and returns the results."
381
- },
382
- "label": "Note",
383
- "name": "N: AKShare"
384
- },
385
- "dragging": false,
386
- "height": 128,
387
- "id": "Note:WarmClothsSort",
388
- "position": {
389
- "x": 573.7653319987893,
390
- "y": 102.64512355369035
391
- },
392
- "positionAbsolute": {
393
- "x": 573.7653319987893,
394
- "y": 102.64512355369035
395
- },
396
- "resizing": false,
397
- "selected": false,
398
- "sourcePosition": "right",
399
- "style": {
400
- "height": 128,
401
- "width": 283
402
- },
403
- "targetPosition": "left",
404
- "type": "noteNode",
405
- "width": 283,
406
- "dragHandle": ".note-drag-handle"
407
- },
408
- {
409
- "data": {
410
- "form": {
411
- "text": "Searches by Wencai to select stocks that satisfy user mentioned conditions."
412
- },
413
- "label": "Note",
414
- "name": "N: Wencai"
415
- },
416
- "dragging": false,
417
- "height": 128,
418
- "id": "Note:TiredReadersWash",
419
- "position": {
420
- "x": 571.4274792499875,
421
- "y": -37.07105560150117
422
- },
423
- "positionAbsolute": {
424
- "x": 571.4274792499875,
425
- "y": -37.07105560150117
426
- },
427
- "resizing": false,
428
- "selected": false,
429
- "sourcePosition": "right",
430
- "style": {
431
- "height": 128,
432
- "width": 285
433
- },
434
- "targetPosition": "left",
435
- "type": "noteNode",
436
- "width": 285,
437
- "dragHandle": ".note-drag-handle"
438
- },
439
- {
440
- "data": {
441
- "form": {
442
- "text": "The large model answers the user's medical health questions based on the searched and retrieved content."
443
- },
444
- "label": "Note",
445
- "name": "N: LLM"
446
- },
447
- "dragging": false,
448
- "height": 163,
449
- "id": "Note:TameBoatsType",
450
- "position": {
451
- "x": -7.849538042569293,
452
- "y": -427.90526378748035
453
- },
454
- "positionAbsolute": {
455
- "x": -7.849538042569293,
456
- "y": -427.90526378748035
457
- },
458
- "resizing": false,
459
- "selected": false,
460
- "sourcePosition": "right",
461
- "style": {
462
- "height": 163,
463
- "width": 212
464
- },
465
- "targetPosition": "left",
466
- "type": "noteNode",
467
- "width": 212,
468
- "dragHandle": ".note-drag-handle"
469
- }
470
- ],
471
- "edges": [
472
- {
473
- "id": "reactflow__edge-begin-Answer:NeatLandsWavec",
474
- "markerEnd": "logo",
475
- "source": "begin",
476
- "sourceHandle": null,
477
- "style": {
478
- "stroke": "rgb(202 197 245)",
479
- "strokeWidth": 2
480
- },
481
- "target": "Answer:NeatLandsWave",
482
- "targetHandle": "c",
483
- "type": "buttonEdge"
484
- },
485
- {
486
- "id": "reactflow__edge-Answer:NeatLandsWaveb-WenCai:TenParksOpenc",
487
- "markerEnd": "logo",
488
- "source": "Answer:NeatLandsWave",
489
- "sourceHandle": "b",
490
- "style": {
491
- "stroke": "rgb(202 197 245)",
492
- "strokeWidth": 2
493
- },
494
- "target": "WenCai:TenParksOpen",
495
- "targetHandle": "c",
496
- "type": "buttonEdge"
497
- },
498
- {
499
- "id": "reactflow__edge-KeywordExtract:BreezyGoatsReadb-AkShare:CalmHotelsKnowc",
500
- "markerEnd": "logo",
501
- "source": "KeywordExtract:BreezyGoatsRead",
502
- "sourceHandle": "b",
503
- "style": {
504
- "stroke": "rgb(202 197 245)",
505
- "strokeWidth": 2
506
- },
507
- "target": "AkShare:CalmHotelsKnow",
508
- "targetHandle": "c",
509
- "type": "buttonEdge"
510
- },
511
- {
512
- "id": "reactflow__edge-WenCai:TenParksOpenb-Generate:RottenPianosUniteb",
513
- "markerEnd": "logo",
514
- "source": "WenCai:TenParksOpen",
515
- "sourceHandle": "b",
516
- "style": {
517
- "stroke": "rgb(202 197 245)",
518
- "strokeWidth": 2
519
- },
520
- "target": "Generate:RottenPianosUnite",
521
- "targetHandle": "b",
522
- "type": "buttonEdge"
523
- },
524
- {
525
- "id": "reactflow__edge-AkShare:CalmHotelsKnowb-Generate:RottenPianosUniteb",
526
- "markerEnd": "logo",
527
- "source": "AkShare:CalmHotelsKnow",
528
- "sourceHandle": "b",
529
- "style": {
530
- "stroke": "rgb(202 197 245)",
531
- "strokeWidth": 2
532
- },
533
- "target": "Generate:RottenPianosUnite",
534
- "targetHandle": "b",
535
- "type": "buttonEdge"
536
- },
537
- {
538
- "id": "reactflow__edge-Generate:RottenPianosUnitec-Answer:NeatLandsWavec",
539
- "markerEnd": "logo",
540
- "source": "Generate:RottenPianosUnite",
541
- "sourceHandle": "c",
542
- "style": {
543
- "stroke": "rgb(202 197 245)",
544
- "strokeWidth": 2
545
- },
546
- "target": "Answer:NeatLandsWave",
547
- "targetHandle": "c",
548
- "type": "buttonEdge"
549
- },
550
- {
551
- "id": "reactflow__edge-Answer:NeatLandsWaveb-KeywordExtract:BreezyGoatsReadc",
552
- "markerEnd": "logo",
553
- "source": "Answer:NeatLandsWave",
554
- "sourceHandle": "b",
555
- "style": {
556
- "stroke": "rgb(202 197 245)",
557
- "strokeWidth": 2
558
- },
559
- "target": "KeywordExtract:BreezyGoatsRead",
560
- "targetHandle": "c",
561
- "type": "buttonEdge"
562
- }
563
- ]
564
- },
565
- "history": [],
566
- "messages": [],
567
- "path": [],
568
- "reference": []
569
- },
570
- "avatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACEwAAAhMAfPPw2UAAE5xSURBVHhe7b15tC3XXR741ZnHOw/v3fvmUfMs2ZI8ISwLYwabBSYEN8RmNSE0hBWg6QR6BXcW0EPyT3qtzlrdIU1CDLEDqzGebVmyZCRkzbP05vm9O89nnqq/71dV59Y5976n93QlCOZ89+6zd+3atcevfvv327VPHccl0EMPbxMR3++hh7eFHoF62BJ6BOphS+gRqIctoUegHraEHoF62BJ6BOphS+gRqIctoUegHraEHoF62BJ6BOphS+gRqIctoUegHraEHoF62BJ6BOphS+gRqIctoUegHraEHoF62BJ6BOphS+gRqIctoUegHraEv1PfynBbDTjNBtCqAc063GaNx3W0Ggy7Td4NjqVrsUlOJAonGgOicSCWYDjB2yUBl3FOhPE9vCP4b5dAjQpQK6JVXoVTXwWqy8DaApxGgfE8rqzBLS3TraFeXkNMXHE8gdpqtVCvkzfpDCLpPrh0kVQ/kMjDjdNlhuBkBoBkP5w0/UQWiKfs2h6uDf9tEYgkcQvzcJfPwV27gEh5DigvkjBrcGol1pYEcVpkCNM2We1my8jSZLjVcimFlAmlDz8j/IhGIubbh66N6rQDt96Ek8qQTDkgO4JWegTo34nI0B44+VEgPaiM3nV84QtfwMmTJ/Hbv/3bfszfPfytE8itSLJchLt4HFg5B6cwDRTnOeVo0EUSujqJQtcgWUQYckT/3ofS2AHR9oMAIWLRU5TDLCP8iJJQsSgnPDqKLYks5s/zeZIpP4HI8F5g9ICRysm8e2T6gz/4A/zO7/wO6xaq798x/O0QiLqMu3oBWDgCLB6DU5oCCpQ2UYqIBge83kCjwUGVhFH1KDUEESBMDi+o83YY8tfTBOEgyjxJMLvO9QjFfGMxSqsYy1chJB3yw5RM2+BsvxHYdgOcwV1kX0936sbfKIHcehXu0gk4My8CyyROZYGRHM1ak3qxSEPfJIbTSZZwDUPV9YL8CKLa/nqaIByO8tLxw4+zLvDjWDLJFEUi4Usnl6TKjsIdPQTseQ8l02FPIe/B8DdDIFpLrfk3SZwX4CwdowK8xEgSpdJEQ+ThFKJKeKTxx1IIqhauoeKUzuBfECAItgmhoD/lmdTxYefW07TLIexSO2xROkWQIIliUUYkqGTvuhOt8ZuBQepKfdvhxJJ2zd9nvLsEYtauCDP1NDD7Ki2oNZuimtUGmpQ2HYNq0OjZvw8v5IhZ9r/OMFeSStwQ+TTl6N+SU4rI5zV2WYQHxkw5pfHS6mIr38L68LAe9PLXcoETTyM5cRCxkZ1eXpRArf4JYOgQIoOTTOTl/fcR7xqBXCnDM0/DnXoGEU1VUoJFHCnFGpjNlF8GRBJXxpYsJ1ZN5GgFpCtRYlXqNNsptapNCrYG9SQvzXoeGk4eiEBUkqMx+nH6iShiySiiyRgd9R3FsQxX6URGlWXl+ZmoklpzimUQHT0I9I2yyi3Oai5ikkbMz42l4Q7vgzN8gMr2sH/d3y+84wRyG1Vg7iW4F/8KkeXTHAcOdImDTqXY7lN9WIldg87BNCudCnOTynO91EBtpYraag3VlQqJQ9LQ/DZuMF1E5CAJHBJEYTnFGyH8vNW0gGAuSSj9KigrQjIl0jHEcwkkMiQW85LOYwRS+ibbESV5xg7SOhtjHE+4Kp/nWIKWCOJZEom+28fzg9SNhmi9xeJWxt8XvLMEotRxzz8KZ+55SpwyzXERhxYXT3WUYmF/MDXwIhUHulasoTJfQWm+bKRpUsrYWg4lRiIT54BxwCVFePebVJGSK0mlf8tEIIH8oDVNYXoihojZos7VqFIaVqi0U5IpLsI8Yqko4nmSiWXEqEBHUlmPEGlKliaJAzlmpmrL87OOU+GOZEikaBzuIKXROK227BDP/P3AO0Mgjo47/wZw/mE4KyfMqqqXaiGe8K4NSpHPno/4g68BrZAwhUtFlOnXObAxnktyMJP9dDlOOSk6Shqll4RSFpIDFvBC9Hje+/c/fEgiiVGKk6dj5qNmS6BIiW9QQtYKdZNyeiSSyKWQ2X89kpMkBBVot67HJpzObDnByyvca4pNpqlQpyh9cttosd1Es1/6EqXa9zm2TqBGBa2LT9HCehxOaR7uWhV1TTXqVSEYZL8USRyRp1luoDRTxOr5VSOOkOxLIjOYRLovQdJQyogwvNZmHg24/LakIdpBL9A+FUpiB+HjdhqPWDZtshzVs8lprsr619YoNSNpxAZGkRwfR3JogDoTdR5JU5NGnLYsE6uQhVQ5SaNoX9ZWuJ2R62ny0/SPf39balsikFtZAc5R6sw8xSmLespqlYPd1kI9MHcVYXoHp51mrYXSVAErp1dQmSubDpMd5h0/kuKdH+e05A2OZ2Ux1B58P9A+JizsRYR5FY6/XHoDg+0j1Y/TpXyZ/o0Cp9FVTnPNJKL9Y0hN7kRiqM+oo4VOW+A0pcvvPlWA9ZWXJImoqaM1SOV68mY4qbyX5vsQb59A5QW0znwVkblnOWVR1+EUYDmFrSuB4QhJoqjqQgVLJ5dQuFCwjs6NpZAdy1LvoLTRYHAAAkXXEIxumB2hoA42EkdgoCMdYcd+ZPfpjkx4KMlHIqvyjVIVlbU61SBKpKEJpCcnEcvR+tIOAOpPnTl5U6Nam2IaSR9Xz9cm7qQu1een+f7C2yKQW5gCTn8VWHoZTpn6Q7nG2KAjmZ2fo6YIkzqcrpZOL2Pl+BKa1DOyo2nkt2UocWJK5Ema8Fi0x4SBzvEJPgztcW9H+YH1JH54Pb59qos0oRO+T0gqSVejRGqWq6gWXDQj/Uhs24Xk2BilkR63UDcyKJ18fihvdmsilYKTpF40uBvYdQ8lUb+l/H7CNRPILc7CPfVFRBZfASoiDzsw6POgA/kficmsdsyqWnhjHmuctpK0cPonc0gPJWX9mmVsxBGCPAJfgXaYCMfrc8M5PyIcL4QSdl4TOniL+EDxFpEaRRKpEkOkbxKp7Tupq8U9EqkbTckOulPpSSJtKUnSWHBJpEMPIjK0wz///YFrIpDLacs9+UU4Cy/C0YIeLaaOPjOfIlyLd/xbO7OKhdfmaZHVTeL0TWTNXLbnXf5UZRZSgFCwc7SJ9uG7MG21g12JwodKTxeJcJqlVVYvkUyxYSTG99L8z7M9dZuCOyDTnlNddPUcEsUZtCbuAu79FCJaV/o+wdUTqLoK9/Rfwpl9hvqPRx71LqnQQaBIgndbtYWlY4tYOrJoU8Dg7jzSVJRFFj1hF0Sw9dEh1kfq8vH63HDOj7hCfPjU1RLH89qBdSgp82BLvFXxZg6xYZJoYJDNZ9tatNJ0V2knJEnVnDmF1sI5JJNRxNPUi/a9H7jrH3gb2q4BGibdeCpb3a21K6/fvbi/LVwdgdgR7umvAZcepeSpoU4CBQgTKEpTVwt086/MYfXUMhL5OAb35JHKJzqljo2CBT20w13xgh17kVdFHiGUsPOa0MHl4gUeejHtgId2mAFOwQ4NBkmjRo03x8AekmiEkWojT1LyNOdOorV0gf3DQY9GkbHHKSm0rv8IInd+kh12+af6us+qeoTTpCLfckjUpj0/tAVxnteSgZwIG420kGTeCW1JEbH+BiFT48rgvN+6RDN95kk46izedR2d6kOrww3qQ3MvzmDlxBIylDgjBweQpGmu1d6APIbLDUp3vB17ke0xbseHoKUZCTYVIaewXBjdJGmjK56HXkw74KEd9uNZjsuBdRIJxFM0ItbOoLE8xxM0DJoiz3G4yxd5zC4meXRJudqEW6vBOfYImkceZcxGkDMosT1rtRbWqg7KrQgarHujFUO1GUOtEUXTjaHRjKLKoSjVXVQaEcaDJBPh2NfdSynvIt5SArUWjwLH/hSR6gKaa1rn8ZMHHo8jPnnmRZ5TK8htT2Nodx+ivCPUoADvqOTx40x8B+eDc77HxvnVDBIQ7aAS+MEA7aiucxb2I8LxAsuXJNKydquVgpue4Kguw10ReZRPlHVY7zPVN5eKwU1m4Xzol4Gdd4JcwdT0Ik6fvoizZy+hUinTOKkiFk+gf2gQ2ycnML5tHKkMLdeoawveSeqZWjNTH8cZDiSBJJQMlCYD6m/rno4OfGdxRQK5lSW0jvxnRNdOwF2rkPUhZvtXOWyAHnJ6kmcZOSrLg7tztrsv0HeEDY1oH6qFflAIx+szOO6KDxAbjSE2wLs+VDVLok5cpZ4yLwvJjwtfGq6PH/Q8fganQkk64gU/3L4p5LErtZrdKlRZOMVIhFMMy14nkJYsWog3CkiPbEP9rp/Dq5EDePzhp/Dq8y/j2JGjWJibR6lcYt+5JAenvTQl+fg4brrtJtz7gffhnvfeje3b++Ewf4ek1ejpprZhJFnj8RhStPo429kXDbRJL0ZGaefBu4HLE0jbTs98Fc7F79D6qtpWjDZrBNWX5JHlMf/qHBZfn0d2LI3BvZI8UpY7s+0gULgtl4vnQQfn2mEGFBZhWHxiZxLxcd6SKi5ois47FP3zdVTPc8pQWo7lOvw8ArQPN8Z76IoX7HiTOtLZk/9ijdMVR5EJAgJpGo/Vi0iN78OZiR/C147U8PWvPIw3XnwJpVIR8USMBEhQsmhrrZojQjZRr7H/SZihkWEj0U/8w0/itjtuZZM4h3G6tLxJzoBI0hYSnFr78knbUq4Fzwy7KK4dB+8wLk+ghdfhHv8TONUVNNbYGZbKT0rPHk2QQEvHFzH73LQpykMH+6kkUiJpIifad2eAdvgK8frccM6PCMerCCZMTFIHoRSyY796lo6usdBA9VKdjeSx+i6ccUeW/AydWg93xQt23EUcwY83X6ShVG6uVjh4LFxxlDyxZgXJicN4oe8B/J9/+Toe/dKX0eB0l83lkEgmeRmv80lgufmFyJMkKZfKqFYqOHTDYfz8L/0ifvCjH0aEUkhxggiqe8VIxID8dDaDLKc+LTNkEy0MkFTvJDYlkEvSuEc+h8jaUbQ4ddkmMDvhN4x/WmEuzRYx9eRFG6DhwwO2FaLVWJ9LrkrqCO3D0MC0i1TAjww8W3ziOSZO7iSBxroJxACTaPqqnmfn6paUtGR6q5PEucJ+8o76rEeGwj7s2L8ufK47QkGW0SpRmS5QQshSInnSo7vw7MBH8Ad/8gye/MbXaZU5yORzakibNFeCntXV6w2sLC9RJ9qGf/zPfgU//PEfQbFYRrnMdjIL631lZWERqUlplMLg0BAlYxWj/VEM9r1ze7o3yjRp8HMvIVI4aSvNTXV+GOwcJ06zkqa8pq5WpYmB3XmSRyuyHnnUxW3yyLOgH+gerNC59qmgSEpyETWSpsvS5aOI9lPnGaQbprini6R5kd9hHnTr0UWziPRPIjY2iqiepucyZjFZUdJPpCRs0ragLl44BCOcX8fwuXBE17kI5w0nGUWkWUU6348j/ffh33zhefz1t76BPM9l8n1W1ashj6C947E4CUAyzM3O4f/5t/8O3/32d5DOpNn8CMo0xbQToq5pT2Y/x0NTW4USam5ujsZqDPMrLayK1O8QNkggtzQLHPlPcArnefdUbF5tDw7DwQawBZJn4bU59O/I0eWZhH8cEHVyuBPXw13xgh17kTYOVhSVRxIlNsTOJ1HtoaZUgkBqaI+zXeA5I2q7BT554nkgM8kRzPJQegL1N31NSPt6qpxWOBW0CiW4vHMV50kllmO3kzK1zNZhUX5k+JyFQxFB0BpDqM61OuLFElbH78fvPwF87o//K9LRJlJpDnq73tcG1Ve7HpYXl3HdDdfjf/5fP4td+/Zjdm6JNzyV66B8HzrSMEepVff3DyHmNLBnexLpJCX3FtEpgbSKOv8KnPIlNtzfshAGK6aV5fJsySyuVF+SJnuGuXjk8dJ4nqEdZqA73o69yI72MptojtJlPEESxYxM0Szv4hQlEK0LI5URS2QKXxiQZwBI6ztcrBfvOUdrMAnqF9k0ogN5xMZHEN8zicShvYgf2ofY5DiQSvBStj3QVwIobJWj8702gngLrwfDjdFe60SCN9WOA/j6pX58+SuPIk7FdyvkEUQGfWMk35fH0SNH8Gd/8nkq2mVkKIm0YKtZQ37g7Jjl1UjmldUV6PHl1ELZFPOtopNAetY19wLHomEb1ruhfcf6hujS8WUq/030TWZt9VkWl+7QDua3gwyEotfhRbYvkW/OjyAXzGlQpZTLN6e40HlGWUBaY3yQkmcHGZhiPBMpTtLHJBAlUUNhL95hvaODVF73TCB53V7Eto2YnuRqahOsGmqVHwxj03YSYfIw6LCikXgc56N78eePvI6VuWkb5M6L3h5EojjzTlL5/qtHH8cLTz+LfD5lepK3Yt1JIjmRVgp3rVrD8hol2NrWp7I2gSRB3KUjiOhbolVWYIP04T+nkuKlAt0qsiNp23J6TdOWwnbsRXaQx+AHVHTg3gqmRNAlhjzyRKjnaNqy+nc5xYlUrLOnBzEdj7WnObF3EvG9E9SpaKXYnemRxz7a9SOukjwqLkoSN9MjePRoA6+8/DoFnfY9SWFW/qzHVUF1V1r5cusQiWSury6v4ttfe5hWWhFpSrfNyNN21ItKhQJzilAfqnOG3SgorgXrEqi+BnfxNRoEJI9ZUuHe4RGnjAaJtXx62Z635MZTWmrpblNXp/q+0Jldxzh42BDx1tBAiBRJSo+cJE+ckYxTVma7EzpvZLKDLkewU00y8Tg2Moj47m02pRmJuqsUPr5MddejW4hSgV5ytuOx586juLrKwWb9eBc6uhMd6R/qwMtkpHOUJk6EuqDv7KvV1unrwyaJE+M0/eqLL+P4G8eQy3G65kzhKdCSOl2O19QooZZpXS+sNrC8RYV6vSaFc3DWzsLh1LSp9OGIl2ZKtg1VG8JkdQVj0Ea7L+wCP0xYUB+ea58KovTRDl8l7C4m+rYDehlChjoP9SSk2MlpOq2cZehr3V+bwkSU8J2sNlo75dPT1EXSSE+Kbx/ldMZBlrQKYJX2Kxiup+L9Bq0n0aMFZprJ4ehqFm+emEI8Rp0uqXWyQUQpLSOxPF2GTusyLKsN9g+J4kSTvB/yJOEgheoI3RCv097srJ33iKQyHVpmcSzOL+CVF14wvT1BZTl4Y4nUCzk7Jqlq9DV1nT1PI2i5jqn56kZL+xrg1YKD4eqZV6tsHSmmhiFlVaurxXNrvMBBZjhtFdfM0YbXhwQD7TARDhN+X4fQncB3V4LIow5MjaJWyKB4ZAarL53G6gtnsfLCGay8eA6F1y6idHoOtVW2SSuwIpUKD0jTRnBMZ9MbTeUhDlxfxksqhOtzmbp1RPPCKA2LZnIAb15sYHGhgGRmGPEMp8jEHqpy+ziY29GqkQxIkkQkeTsHESjOdDn6g0w3yewO0x1keJwEyVN/ox4lKeZDjzyaJP/R14+guLaGJI0GjaEePYkcnlJNK5SjVyzV8eJTf42//OP/G9/52hdx6twiVovhgbw2RD9LuNVF4PyjiNSX7Ws2XfyxClaXylh6cwGp/jiyY7zbw2k6Orirh9uHIckjhOI7rieiOSq4eQ640FUXjzy8IDeBVnQUc995AwuPv0ayzNBNm18+PUuf7uQMiiLRUhHRNCUAlUxPCCnToNPkBxVgvM5pCqjSCqWpb3X273ZDkFQn/AbZZxDvI87qV1Lb8RfPN/HK6xcpjMYpTQ5Tcb8D299/O8bfexBOMoXy1BybVGNWbJfaFo2ZZEKrn3Xeh5F73ofJH7gXQzcfpjWZ5wywCrfGekW1B53pCd3MWmCMRKK4+773ID8whNW1kpFGLRWZNNVJcr3+4oskzx/izRefxbkTR9A3OIp9Bw9idIhTn+V2bbCecdYuUnGepwj3xF4Y9k0FRhVpuuuhaWaImj6nBJtNVWLQe6EONdg5+7AGtk+F4s3fLL4d2QXrMEke6SnbTDS7ZU6pNPmHDuQxfLAfI4f7zR/cm0Mf41ORGmrHzmHpsddROjsPN8a87em58iN5rLkikcIWaUW42tukx+TqD/VSu2q63qtfcNiurn/Ons6ThGu1OC7NF9hfnKoS+6ljfQg3fPpBfOBffAD3/tZDuOf3fg4TH3uA1aDEUDm6nNm4jRhi/ZM4/Jkfxvt+9yO4/9fvwL2/8R7c/69+DAc+9TFEM6NmJwTlytOT+dWVZSzMzbWfeQWKswgkqVYqFvHCE49hYXYG/UPDqJQreP7Jx3Di5BlwaN8WPHYULjCg9w6qI7vA2ukbouXZon23PE7dp73mY/BbHUBhO/Yi/b4OxfvYEPYjutMFMMlDsZ2mzpMYVwTrUUcsl6D+3I/8ZB8y41mkRugoITPjOYvvPzCIoeuGkU41UTszhWaxwnxYQKBkq/0ijh3qg+eYr4MCGpUqB0DxPtqN8YPtw44DL8gbr1iPYXmV0iUyQGlzKyYfuBW3/UQOQyOcuJIRbDswiut/+ceRv/4gmtoeTEJ7z86y2PuJ9+O2T9+N8V1ppKgm6cuv2/b14dZ/8kHs+NH72XaOg406+4GVEYGqlRpWlpYtThXU1CXyGDd5vLQwj0sXziFOy016k56/zU1P4cK5c1SsNxn7qwBlNUWhTHcOkPc1lRCsI6i1F6qordSQ7GPBem+O19sEE4T6bR1eZKi/fSii6xoLr0eET7Xh0kqS1aK9NtR7PAnimZ/qIHWk97IFrTbT0W9yKtZala1R0fpJjWWRjPM6TktGGO/qTqepSi/wrCzCaZX8PFpsB+NDjelsFw90HMSZzw8SSBu9KlVNI6OIj+zHnvvi6KP6EvSy/MH94xh7361ME2HRDSsvu3cn9n78LqSz1G28pJatwpm+JHZ/4l6kJrfZNOuRX/WPUOdpmJSx5hCyxAJlWo8PK8VVVEqc/jSrEPJrNZJucZnX+hddIyJurUATfsla0z19URizMg6qyzWOV4sEIusV5Z+1VgVQ2I69yHYnd8UHnqErfiPhCCMPzWqRJznMY1bUyKNaBPX1Lw6ulx+EmUQ3hin8egyiRUUjYOC8ZHZ9q8q7hfqgW7RTkrw2a4by25Q8ATrO8Xpm4hWRQXIwyynVi1cyDaF8GYjZ3VSOtRpuC50uciRVZtcQ1EpB6YKs1Yzs7u3I7mJ/WP5eA+w8ww3lIUnGsdR4amOZ6UJMZnX30xtUN8tDjz9C8deAiKtXr+g9hV3kMbCVqkh1uWx7fBI0i71K0AUtEsJhorOTQ7hcPNE+ZQF9sBA9XnAkv3d4C4WaT2xEfagzgrpsmjcjg3NKqrSyc9udKJ/OJA/JU2VfNCmheGc2y000iuxYpdf1hO/56Dxax3p6beLSIwe4VUYxf8Z3ldyuk6xb76RWyaljqkp25EWHfdXPlhkUY9d4nuqq512a0ow4zFzD2hCZGO7r70cyneKYWi68pkVlP47RkUFKZ+b5NkAZq1fnasuDx9IwJIE0DTQK1DVSUdj3w1V2mCEW1Ifn2qeCqCAQxAsWtR6/nl1woI7hnRQVeSZJnn4eizhyqiQrYZX1KyyxKMizoB/wowU969JdHslyDtG11hCBiUQaWaJN9gMtGZeDXp6uoFWh4Utdxc8tlB8D7Ujft7AfL7CMVMylSc1gY5HdfB6FRUoInpKTDuz5DiqzS5y+SDIjBVA6N43yIqWgnV93Sq9al+cWUJ2i2kF4BopWtyXNYsho7w/Dmr7MdGc7Fa7X6hgdG8PE5KTpSk1KKj3SGBwewv4De5HUdpe3gUik5r1uzp4zBY33oXHRPKv9zrFU3NuBuD7aG9KHT3nwIy4XT2w4JWhwIxzoNMkT72OviTjqOtbRBt9SEQoEbhMore423gROPIH4tiFmqxENk6dMCawpXBKCA8ibpFlsoHCCRkM6znb7ywlt8JpwpdvhrnjWN5toYEB7b1wS6OLLuPTcOZRZtFojMqjWxaUC5p99BXpZeoTKrfp49c0TuPTI80Ya1TQgkK7TxvmpR59H8fRZmvusm6/P2L4fjtHA4IDpPTW22aYnSh9JnFKpimy+Dx988AHqVmnMTM/a1o/7PngfrrtxX2fVrwERV/qPX1AH/BylnEr/kQTyhMPmg9VBnsuFhSuls3mYXRYNyJNneWHJE0BhOibViw6Ct2aonmYIKCwn8rCDI/0ZJHaPITrk5xdk1aDCKcnDKcbuFhoILuuw/OISavM1ZCe1t1t3d7jszdDVSHWGdJlEHdvHcsyzQFK+ibNfeQTHv0MSkT0iRmGtglN/+k0sPvMSogm9Qd+T8s3iMk780Rdx8usvoFystQlUZPqTX3wCp//TFykdqQzra9MsSvVrUrfrI3mGR0dR1U0vY8K6QroQr6eyvLBcwP0PfBCf/qVP4/a7bsNPfeqT+MlP/SSGBtnfbxPRf/kLH/qsU5n3BqGrn/T0vbpUoTgvIDOUtDvSOtMGWym8wEby+Ak64nW8Hm+H3pn1eOVNFx3SJjBaW8YQOSUKKiefjjeerK/awpq9fMoWCWmaqlMjnDci2RRiAznExgYQG6fkyWtxLiAPy2qSPDXpfhwa7UGWpKEOsfzyMua/t4C+nX3o360NX0H5qrCcwt6hF/bjgnhCUz+1KESzGZwuDuGp50+xnCJaK0uYf/0CSitrWJmex8k/+zbO/gnJQMJI7/FoxWupj9RmFzH//HGsTa9SSpUx98ZZnPzCt3Hyj/4Clalztr1FX24UtApdJUFuuvkmPPixj2Kl0MDyStHr1hCKRX3TI4b33n83HnjoAfzAQx9hWSkknRbSGyTt1cFpPvm7boQEanGOtGdg3r91giznlVPLWH59HkN780jkvC8IevBq11FJC/sRXZUPJ+y8JnTA8u1bC7t22DYL61BNrd4I+vA6TXFaM2lWKfoZ1uzjpWJYeZL8pgAHz8HYyd5pHos8VUperf7yzgf1nGahicXnF7HwzKKttI/eMWoDqUc4hnA920EGQtFCkCxCHS460Icnlm/Gr//rJzF78SJyuTz7WbWlpGGxzdIKE2rqYrVkHfqwZ2Hs/AZ1MLTiiFKvEVkapQLbSV1OktIkqdemer1u+synf+kz+OlP/yO8fmyKBCrY5vxw9aRYa6YZHu7DtvFBdgmlc6uCu24cReptbi6jFbZi08CGB6gCo9SBsiS0ZuDpqvrwpE67Ty3Ki/dPewjiza0HDeEDeRZkgbbmwo5rSx4RRgH5fpwvqZQ0lk9SuqTgpOlTv9F2DEkh28modNquEJBH0JtiZapTQrhkXa3UxOobq7j45QuYf2oe2e1ZjN5GCZjUC6VU2Gb19OP8aMFrjiK8c3ru5JQLODxQxnUHtnEKKaGu9aXIMvOdplQ5jkpjjjeppt1Q/Qgp/C3qZNGEyFIi0aaoh84yXKUTCSg1ffIIUpCHR4Zw652325cXV9fKds9IiRZpAhfUbWZ2BW8cncb5C/MYH069bfIIEb3LcNOnsX7nmG7Eu9vb/edFWj9ZwHdB4iBeCMcT4VPrGRDtIANiRAdUL9/5pGkTyo4ZFkHktLenHRZp6ExZVjq/kDrJU9dKLeOpgNZX61j43jymvjaF6qUaRm4awRglj16p16rxOtUzqF9HPf0gYUns2I8PzrEtsmCHI9P4wF07kMpmOdC07Jo19mcTJVpm04vHWU1aX+H+MHjtc20NjDewLOCEBkFN8tvkw0jC9t50283Yf/1hzMytmA6k7tFs0elkaetNajGk0xmMDKaoo2X9nN4edJuuN3oz6LTIYwRi+HJpr5THlc4FaKdR54SdPN/vOA7HBWGh+5wyFtFW6ThlGKnYbHaoXveb302Jc+8IJh+YwMCBAZ7xdl1ujqtpiA92VMvh9EP14MM3JKmfXMeB1QCqK6PIZ8cwNrSHOj4lXbt93fDLC26ATVCrVpHv66Pu8xCnxTSmZlbaU5UU6G6n5kdjCej7BYeo4+VklW4B3i1/hfpr85j3Z33iwQ5CgSBeUCJL6MXbYTjezunYd0EiH+306tTABaSw4/AdGIoPwuE4CzJ9g+SpkTwiUiDleF4Eyu3PY+ieIWQOpWit6RJepCJUibDTRztMT4fteDmL9qAw41xXjyfq2J2+iJ/84duRGRxBuaxHKQ6SiSxJNMJkqo8qeo1gGdq6Wq1U8b4H3o+73vsenLuwgEKxYtXZKH08p26JJZLIkDjZjPYibQ0RLZp5HdGFoE0yY3WwoY3+RZtd6+Oyp8InusN0KnG9QN9vkyQAw4qj2WsWlOZxinpzphjT19Te0tvx6awcnzwBlB2nGVAy6CDa7yC+jTKIBpuRqA2r1CbYJN6O/UgW1ySJImsX8CM3u/joxz6EWjNqX7PRg1Ot3bxdaHPY2uoa9h86gJ/+uZ+x525nz9Oa9m8c+d3OEI1h6sIZnDp+Ei8dW8GRMyv2pcW3CzPjo5prgwJ8qAukONf1ou/FMlIDVFL1INWS+R0U7jy7YD2ig5TdDA0Ow/EM2hHzj/TlOJg57yBQ/ryCfTDsP8+qrZRZvxI5UrWXfMpvlmqchqQTrfFKmrMykTUFX2EqCLLnrMN28rBBGteZPqhj6FIvamO8F+6KZ2JZWNnICvZcfxuOziU4eCd4X3qb4sOtuhrYqjP7ZG1lDcNjw/jV3/o13HjHnXjhlbNYXS3T+PRuEg1n4CR5dF0yk8Pi7Ay++V//I5557FuIp/to4Y2T5w4G+2mA+GrKtSD6v/zyxz4L/QqgHjj6kQHUUXqdS3WubE/io0agrg4SrEfX4+0wQPignawrkQ7lWwUc2w0YJYksonvKCogek67SxNzjJ7Dw5CkUjs+icFRujuE5FI/Po3hmAZVZKq68P2RVSRk1BNl1QcaETdckXISOFq4niUKCy6u2X2EL+wjiQ57BLmDZ1TWM5avYddN9OD7j4vTJkzQ2G4gnaDF2dNjmUBq5Bm+MlZUV+578//Abv4If+KGH8PJrF3Dh0qJt6RC6yROh1EmmRZ5pPP6lL+D4ay9geWEeF8+ewq6DN6AVG4C+SzDYd+1TWvR3/9lPfxblebNcNvSr+EJrpDRXRCIdR5xThaXp6KD2h6GjL8IHV4j3jtbj9K5lORvpgDBWcuAIdpYes5RInCTbnR3P2G4Be0G53mgvsrcoQVcaKJ8vozxTMVLEBxI2EEE2YQTCTnek1sCstKqdsip71VbAojwoHMSHPMEGXRH0W1ScI+UF7Bqq48AdH8BsJYfTp8+gvLZqUiOiNZtA39R1XU6LhdqqUSwUbNqS5Hngh34Ir7x5EcdPz1B6aKnFn/zZZ8GaXpydk0imMX3uFB774n/BsddetO+laSN+i3nuPXQjxnbsxcJiESPsmwzH+VoQ/d3f+PRnUToPRwQiW9tgUPqdBEBlrsQG6ml8gtGhNOGOE9RXfpCt9gM+1k+EwkT7cD3SI1AggYLyFPaDCrA+2j9TnVpBdiyF3I4+JPqTSA6kkKR5mhpJIzOaQXZbFqnBtPewXSRKkET9uuu9bMJQG70/gh863SpRKtmvvyjWr6PvGYLEIc/AsJ+TF8/rW5JExRnsHKzgtvs/hNjoQcwsFGwXYbVcpNnfIIm9h6CypBo81n6dcrFE5buMHPvkwx99EL/6P/5T3HTnPZy2zuHYyWkjj/1wjCnJnotGYrzp2W7OLMdfeZ6S5/M4d/JNSiIpeBzTUgEHbroVd7zvASNeUT+9RSttWP2nJYOrhNM6+6jrnP8KQOugIYUyGCd+aHVXX/FZfHme2nYT+Ql9VVgV1JV2uT46uXI54mwS78W0AyxTebcQnxxFfMeYHWtq9Wvk+344FuXMW8HiE6eQYp8YSXQD6LSfn+5c6T5aVJRqoE1xemaU3p9CLMvGscM6oOuCKAmwhovqhRoiLeoHtNjs5gnOB3VuF+Z5gpUbIBS0PmD7YpEmnOQYlqM34ZnCdnz7+TN48bmXMXX2LCXSEiVr2fpBUknf8xodHcH1N12P+x/4AG69+24Uqw5eeuUMZufXEOdULgKJNCo3Sr0qnkjZ9QszF/HGc0/gzeeeRImSLp3LoUGrsFhcw+59h/Ajn/oFTO49gArHPpPtQ76/DzvG+rB9AJgYTbanxCvBaU2/5OLY5+DUS2hS31H/WB/xw/qBeSwfW0J9voT+XZQKPNar3dpgMNxH3kU+2sGuRO3DrngjEMXu5IiRyA5sXrEaeb7iBO1Z7iaQzgVJw3kzTtJUHa27OzbMO7aPJ5W2nb4LOk1Ft3iGilAxisQg58kgf8vXzzwoQ2C4LXWEjnNBeg50kgN5aR7O3AJiu27C8thdONUcx8nFFs7PFcy6SlABy2dTGBodxfjEdirM28yCO3VuHqfPzlAyNTl1x61NWkvSPiARrlGvYWluCmfefBknXn0OcxfPMT5ipBJR9EriQzffjgc/8dOYJIm0Q1FbXJfnZ3H+5AmMjE3g4PXX4ebrhnFoV1/HcG4Gp7Vy3nXf/EPvFXbFaruPvI6iAkaG64dQCicWva8ySw/SnWud5aO7lPUToTDhhztEe9iXdKMX3z7sEUhHgakbEMernSnRjWKdBDrpEWgoLIHWC+2omn8uOhBBTL+lq2M/uw3gdS6ntOLZIurTLeS2572bx+rhZxrOm+EN7QoQrgQlIkig6oVFtGbnEHVr1FNSiA5OojG4F4XcTswm9mA6tgONSJqDH0OZut7c/ArdKqrVuv0kp15t5/00lp68Vym5VjBPiTN16igunj5GJXmaErTB6+O2S1HKt950dtf7P4R7PvQg+odGqE+VbG/07KXz+NLn/gOKy/O449778OCPfxKjE9twcCKNbVQFJOUuB6dVWXVx9I/grJ6wV7PZYpPO+B9653O90MDSa3NI69dzaI2ZuNTpAOEOCp/YJN7z+NmRzv9gvsrbI9AI41iJQAK1K2UBbwrjnbr45Bl7uZU3hflasI8gWw/K3wtFBxzEhvxjP24DWHd9g6N4uoDK2Rr6dg/QOuNUIZLaec8zMPyWksfAfuPd3kIK1ZOX9NZN0+Wo/FAHLZOfnL4pUU5lbsK3Ix/E9148joXpefQNDVP/pC6X0mBKu29RAlVQLfHGXl3G2tIcVihB1pZpdXJ68t7QIWnL8pjf8NgYbrz9Ttx+7/uxc/8hq1NhTUsc3hrgU498jdJ8AT/4sY9ibFJfD48jkdB31hz00zCZGE7aY4/N4LSadRcn/gzO/PcAEki/lmxd5H9IRGpgF99coBLR8L4TZmswOk90dBARHHbFrx8yED5lYT9CBOKfNn7FJ/1fADQdSFCBDNsyguajChpLC1h8eh6p/gwlUKotgcJZeuCBjv06x0co9vXTFeHZsRussAhUOLaG0tkqBg4Osl+jbekb4LL6jhCcC+LZvgiJUF9ronb6IqOVF9uidKx7RBv6Ofgv5d+PVxK3468e/jYe+erXKW2iVKD7KHmo/EuCMa2ssmZDOp2+ONBk1nom5u1AjCeSln5i1y5cd/OtuP7W27Btxx7qRwlbxJRCrrTqx3iU6d0CDh3ej9zAEArFMtbWirZrMRpPs7vj5HgLu8eT2DOR26AX2fuB3AvfhXvq/0OE86fehWh9GnywvlJCSxcLdKvI01y2hTm72YOeIdpBXeAHBT+8qXi3cCg+kEABgVQHm8KsMr7HhNp6ilXeNWUsPrtKCRQQSARjinAZSh8cMysnTWtylBFapfaz3RSUDNpbvPTyEmozDQxdP2L94D3M9GFZhwoLBTf2DQuTQp8eQO3CEhqcvmzHQHARBz7aaqAUy+PpkY9jPrkLxYUZPPmdx/Hy889jdWWV5NXNTanCS/T9ei38Sf+xnRLMfmBoCHsPHsCu/fvpH8L2XbuR6x+0Pq3otz4qeteirDzXdiOq6P27hrFjYsisvmq5ggp1q5LW/qhs1ylbmtR340kZTw0c3pXFgZ39Hol9eARaPum9VEp6UMnf2mGd6/WwvVih1MTKkQWk8/plP/+LcAHW81PL/AChhvrBjR0q+IHgOEwgNsrK90nhgQlbJe/BKO8cbXpffFbvKSKBKGI7BtcQKlOn4uQNp65oTvl40ZcF26y9xHOPywKNY+iGYVaDf367r0nyCLzMSWoZJMPp6zxcvZJO0t2Hfo9V71CczR7CSxM/iQKSiFEiVas1XDp/ERfOnsPi/DxKpbLt/VEtRBxB223GJiZwz/33Y/91hzn98GZiAr15o8K09ao3syhOG+z1DK1GnWh4MIeDe0eRpGQ1LrPvVws1rOj3QLSrke3XO4VEpHgqb9Lq1sOD2LWN+qAP7w1ljRLcN/8YzvJraFExte0dqqH3wX5gT7CAtTMr9q5oTWO6zD+tBD4YCHda+3BjvIeueCMQx3nbIAnka7mBqa1B0RZUkUd7YWSFFRtY+N4Sp7As0pRAEuPtOiljhm3Go4vQiJLuE83w4K3IIySjqMyUMf3tWQzsG0Jud972B1m7mcWmElW4LLFcErcPtYUaamc5fdnYryegLmFT2LntP4iTEz9sW1BbVVrGKo9oNOqoUYKUKUk0BVUY1nSkodL7Eg9ed71921Q7E+tUtOtUN+w1d0ygKc6exos8dFWe069CHto7ggFO/5lUFClOk8VyHUsc31USSFaevSpPa20Ma40omckjl47gvltH0Z/zVq09CuuFTIOHGaBZuInGrTtPbU2MZFhh3pmVhncHqv3mFPaPhfbhxngv7AeCeIHplKeSm44l+J6l0+OWgDxe71u6aIomeYKiXGtfiqazH3vhNOuwWbE8RfAI3RjTiTxBnleCpiomXaH+g4aD1DAz4nXqB6tjUHHfa8MqL993gh/nUH9pUao0loMtJZ1wXN7xHIf64D4aaXmk0zQM0ml7JYyXndoo6yuKRIo6DtPs2LUTd95zN26/5x70DQygTJNc05D2BxnRN4EZSTwn4uSyKSRoGOS0+sx+U61U3bbTBQxoBiIN7f1Dc0sVHD+74s1ShDcSGpD+A2jp9XC8s/02r0Odx4L1Spd4f8r/iScW151O2CxO6I4PH29SnokiA32Rp0bymBLjVVlvLdPb0fpv6kd6TxJRWv3xUSqFJEqMOk58jG6cYZInShLp0YT1UJDt5aD5naQs0XzXTsWsfmFow9e5iQ3t6Y4QvDh1v5POeu+cpIJqOkRHeuYtczwzgtbIQaRpbWVSKaQy2i2YRJJhvYlMm8AGhwaxc9cO3HDLTbjl9tuxc/cu5hfhlKMlGOazWTU6wOmI/TbIcZSfS8UpjTwdSi3UtG0B5SPyyClb+pKCwqkLq1hc9n6m1B8NJsiOwxm+Dq4UM29C9E4EsEyAtEmhiH2N2KTQJjX2Yvi58RSxWbzuLx8WUGG+b5KHksBGv11dg8qPD9BKyNMcTbHelDDmqCjr+4hGGkGXyl0Jaq4GNhNFdbaCmcdmEKPOkt/Xb3XR4IRq2QnrBx/hJApT2nhvh02gMaPvnvEmCOk+Bpt6qdj27UJkYILkiZMsHmGylDQDlC6j42PYRbLoOdieffswMjZi0kjEkcSxorzcrghJIL1cM0sJpy8TBi/a1LXSk4JfI/DG1kcQVB1rFZTKLs5NrVmfrLckkoAzdDPFt94kscmzEJYgJTWW4V0+kEadmRhtlbnvVKZ1shfwIN/CXfECj43hQRo5zR2KUN4ijvbyWDldnR5AuwelJwUk6XY8dUXovJwevmZiKE+VMfWNS9T1mhi5bdR+V16me5s8QT0Fa8/l403y8PaV9GksUZ9ZXfUtr07YTxZwiqsO7mc9MvZKa0mdbC7LqakPg8ODGBoesnCSZJQ01D5omfDXgmBaS6cSnLpi9so9++l01lMWrH2XjIdauvGkjpza4LVevLdlA4YvzpZsgbOzNX17gfwhuGykvW6/GxLjvFvStJKcbL8vhVgIT8nZpxfwYGH/bHe8X6mOeB2YicgqahehpI/arELeaXh9yXmPXZCNmeRdfW0FF//yImpLDYzfsx2ZbZS2IqjVwXcBgjp1xDPgx9M6sb5yqMe4rQTq0zTblVG39FEc0zUTedQG99rSgR67atA0BvbNCoY1+A1KGg1gQIRQwVcFXSZypCnh4hxj6T+BSV6nStAgiYKXuFtTLH/WV57VgQGmaTbrWFzVizqrXQSKp+GM30UCZWm1eBVvQ6WrLyO8Q/L9SG3fRo2E5jznbi8ZP0LJvbAfEY43bEIehZmRsV3rPLK41LnhOmwVykodRiXbdi5yutJgFM8UMfX1S7hEx1sH2++fRG5Xn/etjG7dR7hcnfxoz+OdyylG6z716SVat7wZNpCH0KDSAmvltqOen+QAqpO9MlW3sNsqrNrMh2YQq8LpX6KOx62WliyYP/+t/5nORkj/nuc5P2Bfi6bwmF/S6nk3hg7BGbiOZIrZFgEPXuUdilf9cKwepsZzVL5GRlkwB0LrL0FSv5B2RBAv2LnLkMePsH6Sgq4pxban0peU0OKlBj5wEr1y/N8Uykf11/VJPy/5nPJb+o0t6jmLLyzi4lcu4cKXLqJ4qoSBA0OY+MAksttzJnlMcVb+4TKsF+X7zsCA3y4vyrvOyQ7R6qJZPTO7ieLsQVIpyvhK/x40ktS3bOH0XQCLFnXq9YpZrBkq6DE9FiFEzkB5VhXVdVZ/7+T6gTw6LSrqYK1MfVNpOhBLA9vuRTOaJ1liTMYMlElcTyylUFJj19xLs9N+R71fJOJ1unO6YTXwYWE/IhxvWI/Xnpz6atOkQmWqghoHQOs9zUrLBt7eSubfpEFDNwXj9VVnXV+5VEbheAFLLyxh5tEZXPjyBVz44gXMPbGA2mIDA3sHMfHBHRi5w9N59H6hNnnC2IQAlqgjWhVrIZLto/BKoHb+Ity6vsrDUesGr0tEWpirR3E8sgMtvVhTysc7DOWoZ2OavvS22OnzF6i/lLyt41SibYpUQr99QTPlKWzOPw7a2qLedvr0BU3VRrFOcI5rnf4qIlOPwi1V0GzRpEnp4RH5puTKRB4r1GpFUJvnHVZcsGNvQYbwCwp8X+6sxwsWDsXTqZHV1SoWjy7a9/IdSg1b1yGx7JeglT2LUX66q/sO55HdRXL7ItigFvOawokCZr83h1ZZOoVXd728QGa5Np6lRlJIDNKc1aZ8XUPStM11v1qGoEeFcLwOvH8PCvBucvRNUprklZMX0JydZV1YaeUR1M/v8qRulkoRXzgTR+6jv4Pbbr8TDR57D4U3hyctqK9QYtjCIMuT8NDGMVtllo7E85ZG+koQR/2Fsg6njx/B+WOvYLAvgxtv2Iv3ffC9GNs+jvO0qpZX9cM6LVs4rHOaqlMKB2Ep2HLaM6bnY3Mz0zjy7HcvQyDCLc7APfo5ROqzHIAY+1Yd0B4hz9Mx7yyRqLkwAxSWeCwS0QWwpD59/Mva2Gxg5LOs+hpFf5FE1vOYBnUETSmSPmygqux98Q8YvKMf+YM5G3xzQR4kSvlsBatHivYV5XguZm/aiGZo9tP60BcE7M5TXkY+CXi/EkFdhHAdhfYhA96/BwUo2p1ECk7/OCXPPOrnz3v9EeThV09ladrSr/V845Xz+JPF/fjMb/1r7Bofhn6t8DJDYtC5t0MgVbDGvjx/+jgmxrK2DnT0lVexsryCj/7YQ9h36AZcmltFrVpHjXnpWVmD5NGKdJV6bl0+nbpYr8PTuxa1t+iyBBLcuVdor30LDufNZkEN808YvE7R4wNHP2/NO7xFErXWFj0CySm933nd4+Bd7keGz/kJtd+lPcH6lgHp4+dJx5ZoyO3ZVp4R3c1Q8UUqh6siCsN6O5n+zZLgtZoqghudUW3yCKFgR8U3iW9HcbD0rCsyMIba9Arqp88ykmVQIlu9hcBj+fl0FFNLa/iVPz+KiQ//In7zN36T0ojTbUUPij1Y3l0d97YJxHbrBeOnjh3BdYd24AMfuAu5RBPf+uq38VePP4Of+NlPYnzHXiwuse6SNiIPfZM+flhOi2uLC4t4+tFv4oa77ttEBwrBGbkR7uCtZuJG9ZZ1GyQ6+UGYDTRLjESKjozD6Ru2zjTHc2p+Vx/4EX5k+FwooTrE3ncopzBde3qRJ6WUTusULNzLJ+wIDVyLnaZ3HUqvkTSzV8Co7puRJ3StIVzxdpCBoF1eBPNi+33y1OcLqJ05p8jN9R4iRenHYcbnXljF9y7FcejAfmTSEVv36e/vNz+h/Pw1I9U3cNb2twHdN3pyL0LNzy2SBGuMiOPHPv4QbrjxMB4mkZq1GlJJPVP0+tOarwvVXvOoRlAwFJcX2fUR7JyY8N4T7RWxCaQwp4apB80h4q7C4WDYE2/LWY6wwhim9WDvt6HyKLQoinm1am3Hbdhl/rW+Z7A8PYSTWCCcLgAbpqLtnL7DVWYUb1571Q91VnMKS3oLQf7hvCzrUETHuSvHt0/z7jadp98jT/3UGa8vop6FE4aqK4MyRYvwkWMl/O+PL6PS4pRXbeDU8XPUK+Y4VVQpfWNIM89MJms/ziIy2XqQbhpmErwsQc+jpC/ZfcUP3RMByeTpvB3ah1oaIXE4tVKB3r13l21e01ebt0+M4cknnkaBs8yB6w+zSTQ+qjUjm25alSGJpjZpJfvVZ59Crn8I933wnrcgEOHE2EC93LI4xQw4IjU9qPNPBlBvqkMp7qyauT5bA2mViz6x2GuWRonk1j1DMChBsH2OgXaYsPB6An26dZGVvshSJZHk61jOszbpvPT+ZQZb7wgiLI0XNITTt+MZCOopz0aI01YuR6lL8sysoBaQxzePu6Hxz6ZjeGOmhv/pS+fx4tlZ/MAP3o/33PNenD5xFi8++zyee/pZvPjM83jj5ddwnpJscXHBNndJGul5mD0Xo9MremP2nTKt13n9y9rYYBuZ5FhHIxHjPKuShsXaqm0L2bd/tz0qiVB6Dw33IZPL4OFvPMohbGLHnr3QL0Z737FnU0m8GHU7ba997dmncfHsGdx27wdxy/UTV9aBwnAX3oR7/puINNbQWvFeH6I+ZfX44XWsQSVSNDrpFFqlAvWiKZKOo6k7coM08gek/RGAB+HjcIJQvDeQ+icVNqQXGFA4dE7EaSMUNATnOuJ54P17UECDpFJ5FyLZh9qFOTQuXLS2B+85VL0C3/qIyJE855eq+M0vX8CfPXOehmIV//Jf/Sv8i9/8p5hbqeD40dM4eewszpKIM1PTVHApocqU5JQ+evdhf/8AhkaH7C1kg8Mj9mgjw5s1nc0hHqelzP41Xvv6jynCvKn1dSFtzRARZqan8fqLz+Oee27Bve+9E/FYEwN9SegLjo8+8hS+9qVvYduOnbjx9jvQr5/JbDkoV+qYn1/EGy+9iDPHj+L2+38Qh2+4CfffNnT1BFLntGZegDP9GEVu0fYF6UJTRoMcbL5UC+g4nTmpLOMoCqlcu8UVnuN5mfkdox0+9APh01c45123Md4Lbx7fIXUCdNVn/Zxd4IXkq53Sd2J6bjjK6TGG6tmLnqnOwdMU3u6MwDPfRS4VwRLvo99/ZB6PzUQpTRxkU0k89NBH8amf/0fI9WVtJSLO+4xCHkuLJcxPL1JfmcP09AxmL01jfnYOyyTV2moB1bLX/9oUr5+8THO6y/f127aOTD5vpEqm07a9Ncb6SnropQraR/S9xx/H6tx5/JNf+yVM7tqBSKuKnF60wDQvvPAGvvvIE1haWkKKeUoSaSejdkRqCjt8y53Yd90tGMq2cO+tI9dAIIGd584+B8w8aS9Psu0J1gy/l/3OsmPLltNZKgOXIt0tzKO1vEBFts6KeCSyq/xLLdAOE+H4sBdOc6VrOtLxMHxhxzWXiffzaEfZPiS2J5vnPDRo38Ovnz1Hq9PrWJOu7fave+oH7bdZqzv4/W9eQOvwg/jZn/kJ5PL6dmgcKUrqAW07RdR+V0+mtvZeF0uSGrw2H7d7jnaKbUtdXS1Sj+E0tLDAqWiJkmEei3MLJq00PVVKFVSrFZM+nNDthtX0F+VUp++MSZpdPHcWF8+cxn/33/88Pv3L/5h1pERt1Eg2LdfEMDu/jLNnzmOaUrBUpHLJKVKSbnB0G/oGx2wB8sa9Gezclr9GAgkkUWv6WURmnmBrS5REnM6Cbrac+CFfAxPkrM7Xl+nYmCaJ5xZ83Si8RtIxWkQ73Bm/Pt6d8QY73jz+7UgeGwDrHrZQ6zuyMLW6PD2LxhSlar3m6TtBPtZev9H0FCudx0334UTuLnztXBKf+NEPY9euSS/NJvAUXwdvnFzAV7/8KEorM9izby927tuFUU5dOU5jIp1Ipe05VVqpUnhLxRIKxSJJVESJrsjjYrFgBNDPhcvpW656I4gU6e89Kqurgl/957+OH/2JH7cbQLsg9aMt/Kc09H4hWl8jqmo7rGZtqiary2tItxbx0Y/cgaR0sGsmkMDbwZ19Hph+gpYZJRGnM5nZXpcxO+VonUqCNMq0kJZ4vklplIXDO1izXLNIM9LelcPrTAkMrvFhQf84HH2Z+MulV7hNHiEIXo48ileX0BmBEhT/tCzdRA7N5SIaFy95D0aVTvUOQ+3226+HlXoHj8jTvPnjcPd/kDdMgtNJ1zWXwYkLRfzRf34YX//8f8DC1FmMbpvA+MQ2jG2n27YN49vG7UuH0oVyeoG4vvIjxZpTjuPyRpUlRVfXFyWo/0gHsm9ikHmFQgHf+vPP4ztf+UtM7t6JX/z1X8N77r0LKRJCW2ZLVNq1n9qe0NNpEblBN0U979EvfxEjWRe/93/8c9PL3h6BBDK5Nf+qkShSW6JUqdjKpQ2E6UJ09QqtIW3hlOXG4ZCSKZGazoGTNBxp+ZRIrSrFJBto19rAWMA79mFRhs54gx37keFzlnSTeGE9Q+9cuxtMJbd1HSeThxvP0RiomsRpUi8wyakpOcgw3H0K8lgkSWmbaG4MrVs+AWff/dbua8HF2QIe/t60Ka7f+Py/x6UzJ0nAuFleUU6Z+qnLTDbNKS5PAnF6GRy2zWY/9Q8+QYKN24umZuaWcerUea+KrHOE05gWfFX3ualLOPHmG2aej2zfYYuKu3eO4OAN1yPN6Uo3f7FUsylRX148ffwY/uJPP49TR47gjrtuxr/79/8bRkaHt0AgH82Fo8DUXyFaprVF5jbKdZvSHNrWbnnVOlyDtT4+DEgeshOcTI5kyiiSRKOk0k9y68GjzgcDLNtX+dkhP/zoNoL4kGewpKGIjnP+gVWKTr4WJfW9K05VIrf2ibfYeY1Z6m4ijuYL0908CdLRnnUP6WSUg8yBGtwL5/afAiZv9U5cI+aXSiTQJZTrMZw7/gqefvjLOPHGq/aiBa8t1kDjrPpLb3Y9fN0+/Nv/6/dw0y3XW/zZs5fw2d/+N3j1tSPW5KhuXmrpeltHnlJLVtaOvfuwi2b7U5zSvvuNr+PA4cP4yI99BDfdfCO+9Y3HsER9qJ9W2o3X78F//MP/QiXcxQMP3ovf/b1fx8BA/1uvA70VIpkRILOdynGJbFyjokaGl9c88gTTUxhqieJ4zuUUJieJJWXbCEVRrLtFg6+VDXURWU7PHyGvyzzYsoD1ZtsTNqzxtK+RH+RFp6pQsXRYdjTfz3b0w41mOEVR4tDqCaYrW8DzFf/NoOy09UWLcnpLbGvb7XDu/odwxq/zU1w7dA/pAefKWoXK6ygO0Gwem5i0t9GrQL3mV2s71jeEFgmHhgfwQz/yAMbHR63ZGVpWT373Kbzy4mvUf+qc3pIYGB7mtLUX1918C2654w7s2b8HY6NDSFBxP3H0KGZp8d1z9404dGg7/vT//TyOvvYmJidG8Jlf/Blcd8NhHDy8Dx//yYdMj7N+3qoECqBf/WlNP4fI3NNw1i5wSitRKWMv2HSmBvsJBQvzQ76mMc7VUqgdzuFm+qeosMosVifRatPd7zbpM53tRVHvWhZ+pjau64PrWVzBOYbFM00hypNEkKRxpStQJ3Ei1FNUFZqqzdU1NPQFvhJJDSn9obWroKzA0zUK8yNNiaOXsCM9ZLoODnzI9gJtBdqf/J1nzuPE+SLbXrU90plcmopvGctz05ibvmQvRCisrtr3vvTtjZ07tuHnP/MJ7Nq53fKQHvSVbzyDx//6GPI07weGBzFIqZPP59jF2pXIrtTOC1pg2tq6tDDHfljDgw/czXR9+M6jf43zZy7ZlHXr7TdYnt14xwhkEBkWXrOfz3RWTqgFVLC1JK5FrPUB9gZBI2BHnq9qGDn4LwmUSCKSJJGkxGrANcVYUpFSieQ4PRqZFA6I44MdYu9/JHFckUZkMGmoxTYSmmauy45v0TqRVWjSUMsUPO8tMzBpUD8h6Cbf00qvXgyV0Y/7slx37Do41/8w3MlbrMytQnV89rVpPPf6AqtCMlOPTFLC5TLaK50xCyiuLS5suKo7xAHPZ6IYzsc6fnnn9FQRjz8/a81pNSussxYMHAl525GoPdaJOBX+bMoU87F+B32bfw1+U7yzBPKhZ2eYeQbO7LNAcdZWxmxrhorSIFuJ/AhKbtfAi7PleJGE6W2ZXvoSSUQZbFOO/EiMxJBE0Xn1DvM1iil75WfX0xepJbm0EkszVa5F4tD29SSbEqscX0LZtQbF+0HBP6FsNaPp5dxar0F+FO7u+4C976OZv83SvBNQvU5eWMFjz07ZdhbHrSNOSRePOSZtUtRltDler3iRNNGLxrNpB8NUKZUmwMJKGQ8/eR6rxQYJVDYFP8k+TDAvTVvaXK8XSomUebrJ0TQGsupXP4O3wLtCIIOkw8opuBdp6ksq6SeVyg37Tpn3WCY0QO0aeHHrhzqgtNAUx1ib8xWvaUV3vSSMfM1RRiAP1iQSx6w83xmR5BuYUv/qJREw1AXrQZXtBwmVzZQecejcSBruBKXNwR8ARg9RavGWfocxz8H/5pPnaA1J0tYQp6SwQSeBEryB9JXkGMmSTMTsWxt5SsOxwSjJpZp6qFQbePzZizg3QwOFBNLSm0gTECjph/N9OZNceydy6M/xJr1KrJf0TkN39OBB4NAn4R7+Wbgjt8OldZPoTyOlTV0avNAAXRYihmS0pJCkT3t64cVaj6LV5tbYOXqrlyy5wClOlhOnJVHMs7K8PMy3fK6u+ZwpbEEwQ9keoaKPHXfAfc8vIHLPz8PZdsO7Qh5BK9iDuRSbrAemavRGKF4u4p/vTiWyDPez3rxh9ThjI7xB0Ap1jITSFHctePcI5MPRe2a23QEc/hm415NI4+z8VB9iWYrfnOZfmpa+fnNVUEdp4CWFRFJ1ru+MXO1jdpaO/anJrrnMIHRDqVQn3eHZTIKE15oQrbTd98C95zPA3Z9BZM890Iui3k2ob8aGvZ9i0j4cr2bdUJz6RE7HnQTQZdvGsvYdsJhuwq4+UGrF6VyWinrwi89Xi2tLvQU4yTwi2++Gc8PPArd+Bu7eD8PNT9pzMv2Qb1T7MmRpScn4W4EsRU6RlFiqi/0Ul/SsvglK0Ifg3vdLwF2fgbPnvZzHvD1P7zYkVYb7k7alOiqL0Y+/LFh/27bRhUHmMZCnMcKbyXRGH0F+tt2GR1GnSf2JhV0DrlkHsk6+yjv5itDzscIMsHiMmt5RtGaOwl2jwq2XJsn0l/TQ6rXKkh80N1Rbr+b8CJoQnAs3yU8TjpL6pTg2nrnKl5IqPYuxetzQPwZn+2FgjKYr9RuQROvd/TeLUqWJR56+gIXlKutYNZ0nrAOZJZVMYJgmupTo8QFPKQ5DFuMLb8zj9VP6fbSaTWfSe6T/SOJkc2nksllMjCSwfZiW7zWM7zURKEi6VQKFC9Qdo3WO1spFtOaPw50/gcbiGUQri4jYa9+kQOoKlslyvW8X6FAWkx8OMmz7XsBqaRKNxyKLT5iIztvalAzkKBpOHLV4H5p9O9AcPoDkxA1IjOygBGJnGpFD+bTh9UFHT2zoFn9q7krUHWcxXcesmkkgWWDPvDaLV48vkTyukUaLiQGBTBEmGdJ6qt8Xx+7xrFlhdqObauBlfPbiKr7112dQrTdt3UrXSPmWZaev9kjfuvnAmOURFhLh8Ga4agK9VUbdUHr1udZtRBKZ5orzdsrRpGZYm73104yVep2WvktHC61GBbg4D2dtCvHyNBLVeSRrK0g0C4jJitAdpPUiZs4S2AArJNz/Xl2tVaKLAiJKhOVGUUcMVTeOkpvEqpvGCvpQiPWjkhhGIzlACaTX2/LOpjKZ0DqLFjjVFmWn8lSS/v2pQH2iss2XfU/fFFqel6Fgg+gPpHYPasHOSxuxdNJtWALJap/esaYUZqG3ZkgXuzRbwPELNdoRki4RSg8OPMMij164meC1Ms/zuSS2DSWNXJY/r1VeSru8WsJTL13ECs35LM1/SR7lozxUv75sEjfsH9kgvd4KV0UgDb41Wh3zdsAS7NsCGggRh/kFWy0lXZokgZ7ma+XUHvZFYjaN2a/yNaqURBWSp4B4Y42uhChdjE4boex1d9oso2UDK0vNoSNZWsqH0qURSaCGJKpO0ohTRgLlJl0rBr0ewAScSEkdzPsxN9XTy8uo4/0brAeMJwGBdMjB12AZMUQDS2ADqD6zH+yzc7JygjQcYJFJ19n13oB7+XjpdWzfj+d1+nE8Xa9iozrPsHhmhGNab8+0lFrVVNf6xgnP672GylMb1vRA3n6OXGmt7lvDNU1hwjUm74RdakMSBIMPDwx6Z70D3e/qkiYbr2Lt9dQ6TSepID1KK7Ra4/HFnYEhhil12EvKQ51vepXCvE6xEaaPUGmUjLL1Il1jUMjr1vW4jVjveKbSyBEWF5xoZyOyhMP8Y1iHViX/eN0P4B8re/oacJFKzfaTe+HgwIfXZ4qhvx5t18pdCTa27Xp34nLXXjOBeughDO/W6aGHt4kegXrYEnoE6mFL6BGohy2hR6AetoQegXrYEnoE6mFL6BGohy2hR6AetoQegXrYEnoE6mFL6BGohy2hR6AetoQegXrYEnoE6mFL6BGohy2hR6AetoQegXrYEnoE6mFL6BGohy2hR6AetoQegXrYEnoE6mFL6BGohy2hR6AetgDg/wcjLgwY8u5DYQAAAABJRU5ErkJggg=="
571
- }
 
1
+ {
2
+ "id": 8,
3
+ "title": "Intelligent investment advisor",
4
+ "description": "An intelligent investment advisor that answers your financial questions using real-time domestic financial data.",
5
+ "canvas_type": "chatbot",
6
+ "dsl": {
7
+ "answer": [],
8
+ "components": {
9
+ "begin": {
10
+ "obj": {
11
+ "component_name": "Begin",
12
+ "params": {
13
+ "prologue": "Hi there!"
14
+ }
15
+ },
16
+ "downstream": [
17
+ "Answer:NeatLandsWave"
18
+ ],
19
+ "upstream": []
20
+ },
21
+ "WenCai:TenParksOpen": {
22
+ "obj": {
23
+ "component_name": "WenCai",
24
+ "params": {
25
+ "query_type": "stock",
26
+ "top_n": 5
27
+ }
28
+ },
29
+ "downstream": [
30
+ "Generate:RottenPianosUnite"
31
+ ],
32
+ "upstream": [
33
+ "Answer:NeatLandsWave"
34
+ ]
35
+ },
36
+ "AkShare:CalmHotelsKnow": {
37
+ "obj": {
38
+ "component_name": "AkShare",
39
+ "params": {
40
+ "top_n": 10
41
+ }
42
+ },
43
+ "downstream": [
44
+ "Generate:RottenPianosUnite"
45
+ ],
46
+ "upstream": [
47
+ "KeywordExtract:BreezyGoatsRead"
48
+ ]
49
+ },
50
+ "Answer:NeatLandsWave": {
51
+ "obj": {
52
+ "component_name": "Answer",
53
+ "params": {}
54
+ },
55
+ "downstream": [
56
+ "WenCai:TenParksOpen",
57
+ "KeywordExtract:BreezyGoatsRead"
58
+ ],
59
+ "upstream": [
60
+ "begin",
61
+ "Generate:RottenPianosUnite"
62
+ ]
63
+ },
64
+ "Generate:RottenPianosUnite": {
65
+ "obj": {
66
+ "component_name": "Generate",
67
+ "params": {
68
+ "cite": true,
69
+ "frequency_penalty": 0.7,
70
+ "llm_id": "deepseek-chat@DeepSeek",
71
+ "max_tokens": 256,
72
+ "message_history_window_size": 0,
73
+ "parameters": [
74
+ {
75
+ "component_id": "WenCai:TenParksOpen",
76
+ "id": "d35f331b-2787-4ae7-ab81-a7ea15970843",
77
+ "key": "wencai_input"
78
+ },
79
+ {
80
+ "component_id": "AkShare:CalmHotelsKnow",
81
+ "id": "36c4db0b-c80d-4119-a2a6-05ed9f7efbc9",
82
+ "key": "ak_input"
83
+ }
84
+ ],
85
+ "presence_penalty": 0.4,
86
+ "prompt": "Role: You are a professional financial counseling assistant.\n\nTask: Answer user's question based on content provided by Wencai and AkShare.\n\nNotice:\n- Output no more than 5 news items from AkShare if there's content provided by Wencai.\n- Items from AkShare MUST have a corresponding URL link.\n\n############\nContent provided by Wencai: \n{wencai_input}\n\n################\nContent provided by AkShare: \n{ak_input}",
87
+ "temperature": 0.1,
88
+ "top_p": 0.3
89
+ }
90
+ },
91
+ "downstream": [
92
+ "Answer:NeatLandsWave"
93
+ ],
94
+ "upstream": [
95
+ "WenCai:TenParksOpen",
96
+ "AkShare:CalmHotelsKnow"
97
+ ]
98
+ },
99
+ "KeywordExtract:BreezyGoatsRead": {
100
+ "obj": {
101
+ "component_name": "KeywordExtract",
102
+ "params": {
103
+ "frequencyPenaltyEnabled": true,
104
+ "frequency_penalty": 0.7,
105
+ "llm_id": "deepseek-chat@DeepSeek",
106
+ "maxTokensEnabled": true,
107
+ "max_tokens": 256,
108
+ "parameter": "Precise",
109
+ "presencePenaltyEnabled": true,
110
+ "presence_penalty": 0.4,
111
+ "temperature": 0.1,
112
+ "temperatureEnabled": true,
113
+ "topPEnabled": true,
114
+ "top_n": 2,
115
+ "top_p": 0.3
116
+ }
117
+ },
118
+ "downstream": [
119
+ "AkShare:CalmHotelsKnow"
120
+ ],
121
+ "upstream": [
122
+ "Answer:NeatLandsWave"
123
+ ]
124
+ }
125
+ },
126
+ "graph": {
127
+ "nodes": [
128
+ {
129
+ "data": {
130
+ "form": {
131
+ "prologue": "Hi there!"
132
+ },
133
+ "label": "Begin",
134
+ "name": "Opening"
135
+ },
136
+ "dragging": false,
137
+ "height": 44,
138
+ "id": "begin",
139
+ "position": {
140
+ "x": -521.8118264317484,
141
+ "y": -27.999467037576665
142
+ },
143
+ "positionAbsolute": {
144
+ "x": -521.8118264317484,
145
+ "y": -27.999467037576665
146
+ },
147
+ "selected": false,
148
+ "sourcePosition": "left",
149
+ "targetPosition": "right",
150
+ "type": "beginNode",
151
+ "width": 100
152
+ },
153
+ {
154
+ "data": {
155
+ "form": {
156
+ "query_type": "stock",
157
+ "top_n": 5
158
+ },
159
+ "label": "WenCai",
160
+ "name": "Wencai"
161
+ },
162
+ "dragging": false,
163
+ "height": 44,
164
+ "id": "WenCai:TenParksOpen",
165
+ "position": {
166
+ "x": -13.030801663267397,
167
+ "y": -30.557141660610256
168
+ },
169
+ "positionAbsolute": {
170
+ "x": -13.030801663267397,
171
+ "y": -30.557141660610256
172
+ },
173
+ "selected": false,
174
+ "sourcePosition": "right",
175
+ "targetPosition": "left",
176
+ "type": "ragNode",
177
+ "width": 200
178
+ },
179
+ {
180
+ "data": {
181
+ "form": {
182
+ "top_n": 10
183
+ },
184
+ "label": "AkShare",
185
+ "name": "AKShare"
186
+ },
187
+ "dragging": false,
188
+ "height": 44,
189
+ "id": "AkShare:CalmHotelsKnow",
190
+ "position": {
191
+ "x": 267.17349571786156,
192
+ "y": 100.01281266803943
193
+ },
194
+ "positionAbsolute": {
195
+ "x": 267.17349571786156,
196
+ "y": 100.01281266803943
197
+ },
198
+ "selected": false,
199
+ "sourcePosition": "right",
200
+ "targetPosition": "left",
201
+ "type": "ragNode",
202
+ "width": 200
203
+ },
204
+ {
205
+ "data": {
206
+ "form": {},
207
+ "label": "Answer",
208
+ "name": "Interact"
209
+ },
210
+ "dragging": false,
211
+ "height": 44,
212
+ "id": "Answer:NeatLandsWave",
213
+ "position": {
214
+ "x": -304.0612563145512,
215
+ "y": -29.054278091837944
216
+ },
217
+ "positionAbsolute": {
218
+ "x": -304.0612563145512,
219
+ "y": -29.054278091837944
220
+ },
221
+ "selected": false,
222
+ "sourcePosition": "right",
223
+ "targetPosition": "left",
224
+ "type": "logicNode",
225
+ "width": 200
226
+ },
227
+ {
228
+ "data": {
229
+ "form": {
230
+ "cite": true,
231
+ "frequencyPenaltyEnabled": true,
232
+ "frequency_penalty": 0.7,
233
+ "llm_id": "deepseek-chat@DeepSeek",
234
+ "maxTokensEnabled": true,
235
+ "max_tokens": 256,
236
+ "message_history_window_size": 0,
237
+ "parameter": "Precise",
238
+ "parameters": [
239
+ {
240
+ "component_id": "WenCai:TenParksOpen",
241
+ "id": "d35f331b-2787-4ae7-ab81-a7ea15970843",
242
+ "key": "wencai_input"
243
+ },
244
+ {
245
+ "component_id": "AkShare:CalmHotelsKnow",
246
+ "id": "36c4db0b-c80d-4119-a2a6-05ed9f7efbc9",
247
+ "key": "ak_input"
248
+ }
249
+ ],
250
+ "presencePenaltyEnabled": true,
251
+ "presence_penalty": 0.4,
252
+ "prompt": "Role: You are a professional financial counseling assistant.\n\nTask: Answer user's question based on content provided by Wencai and AkShare.\n\nNotice:\n- Output no more than 5 news items from AkShare if there's content provided by Wencai.\n- Items from AkShare MUST have a corresponding URL link.\n\n############\nContent provided by Wencai: \n{wencai_input}\n\n################\nContent provided by AkShare: \n{ak_input}",
253
+ "temperature": 0.1,
254
+ "temperatureEnabled": true,
255
+ "topPEnabled": true,
256
+ "top_p": 0.3
257
+ },
258
+ "label": "Generate",
259
+ "name": "LLM"
260
+ },
261
+ "dragging": false,
262
+ "height": 170,
263
+ "id": "Generate:RottenPianosUnite",
264
+ "position": {
265
+ "x": -16.477598988611703,
266
+ "y": -251.90091743639417
267
+ },
268
+ "positionAbsolute": {
269
+ "x": -16.477598988611703,
270
+ "y": -251.90091743639417
271
+ },
272
+ "selected": false,
273
+ "sourcePosition": "right",
274
+ "targetPosition": "left",
275
+ "type": "generateNode",
276
+ "width": 200
277
+ },
278
+ {
279
+ "data": {
280
+ "form": {
281
+ "frequencyPenaltyEnabled": true,
282
+ "frequency_penalty": 0.7,
283
+ "llm_id": "deepseek-chat@DeepSeek",
284
+ "maxTokensEnabled": true,
285
+ "max_tokens": 256,
286
+ "parameter": "Precise",
287
+ "presencePenaltyEnabled": true,
288
+ "presence_penalty": 0.4,
289
+ "temperature": 0.1,
290
+ "temperatureEnabled": true,
291
+ "topPEnabled": true,
292
+ "top_n": 2,
293
+ "top_p": 0.3
294
+ },
295
+ "label": "KeywordExtract",
296
+ "name": "Keywords"
297
+ },
298
+ "dragging": false,
299
+ "height": 86,
300
+ "id": "KeywordExtract:BreezyGoatsRead",
301
+ "position": {
302
+ "x": -17.690374759999543,
303
+ "y": 80.39964392387697
304
+ },
305
+ "positionAbsolute": {
306
+ "x": -17.690374759999543,
307
+ "y": 80.39964392387697
308
+ },
309
+ "selected": false,
310
+ "sourcePosition": "right",
311
+ "targetPosition": "left",
312
+ "type": "keywordNode",
313
+ "width": 200
314
+ },
315
+ {
316
+ "data": {
317
+ "form": {
318
+ "text": "Receives the user's financial inquiries and displays the large model's response to financial questions."
319
+ },
320
+ "label": "Note",
321
+ "name": "N: Interact"
322
+ },
323
+ "dragging": false,
324
+ "height": 162,
325
+ "id": "Note:FuzzyPoetsLearn",
326
+ "position": {
327
+ "x": -296.5982116419186,
328
+ "y": 38.77567426067935
329
+ },
330
+ "positionAbsolute": {
331
+ "x": -296.5982116419186,
332
+ "y": 38.77567426067935
333
+ },
334
+ "resizing": false,
335
+ "selected": false,
336
+ "sourcePosition": "right",
337
+ "style": {
338
+ "height": 162,
339
+ "width": 214
340
+ },
341
+ "targetPosition": "left",
342
+ "type": "noteNode",
343
+ "width": 214,
344
+ "dragHandle": ".note-drag-handle"
345
+ },
346
+ {
347
+ "data": {
348
+ "form": {
349
+ "text": "Extracts keywords based on the user's financial questions for better retrieval."
350
+ },
351
+ "label": "Note",
352
+ "name": "N: Keywords"
353
+ },
354
+ "dragging": false,
355
+ "height": 155,
356
+ "id": "Note:FlatBagsRun",
357
+ "position": {
358
+ "x": -14.82895160277127,
359
+ "y": 186.52508153680787
360
+ },
361
+ "positionAbsolute": {
362
+ "x": -14.82895160277127,
363
+ "y": 186.52508153680787
364
+ },
365
+ "resizing": false,
366
+ "selected": false,
367
+ "sourcePosition": "right",
368
+ "style": {
369
+ "height": 155,
370
+ "width": 213
371
+ },
372
+ "targetPosition": "left",
373
+ "type": "noteNode",
374
+ "width": 213,
375
+ "dragHandle": ".note-drag-handle"
376
+ },
377
+ {
378
+ "data": {
379
+ "form": {
380
+ "text": "Searches on akshare for the latest news about economics based on the keywords and returns the results."
381
+ },
382
+ "label": "Note",
383
+ "name": "N: AKShare"
384
+ },
385
+ "dragging": false,
386
+ "height": 128,
387
+ "id": "Note:WarmClothsSort",
388
+ "position": {
389
+ "x": 573.7653319987893,
390
+ "y": 102.64512355369035
391
+ },
392
+ "positionAbsolute": {
393
+ "x": 573.7653319987893,
394
+ "y": 102.64512355369035
395
+ },
396
+ "resizing": false,
397
+ "selected": false,
398
+ "sourcePosition": "right",
399
+ "style": {
400
+ "height": 128,
401
+ "width": 283
402
+ },
403
+ "targetPosition": "left",
404
+ "type": "noteNode",
405
+ "width": 283,
406
+ "dragHandle": ".note-drag-handle"
407
+ },
408
+ {
409
+ "data": {
410
+ "form": {
411
+ "text": "Searches by Wencai to select stocks that satisfy user mentioned conditions."
412
+ },
413
+ "label": "Note",
414
+ "name": "N: Wencai"
415
+ },
416
+ "dragging": false,
417
+ "height": 128,
418
+ "id": "Note:TiredReadersWash",
419
+ "position": {
420
+ "x": 571.4274792499875,
421
+ "y": -37.07105560150117
422
+ },
423
+ "positionAbsolute": {
424
+ "x": 571.4274792499875,
425
+ "y": -37.07105560150117
426
+ },
427
+ "resizing": false,
428
+ "selected": false,
429
+ "sourcePosition": "right",
430
+ "style": {
431
+ "height": 128,
432
+ "width": 285
433
+ },
434
+ "targetPosition": "left",
435
+ "type": "noteNode",
436
+ "width": 285,
437
+ "dragHandle": ".note-drag-handle"
438
+ },
439
+ {
440
+ "data": {
441
+ "form": {
442
+ "text": "The large model answers the user's medical health questions based on the searched and retrieved content."
443
+ },
444
+ "label": "Note",
445
+ "name": "N: LLM"
446
+ },
447
+ "dragging": false,
448
+ "height": 163,
449
+ "id": "Note:TameBoatsType",
450
+ "position": {
451
+ "x": -7.849538042569293,
452
+ "y": -427.90526378748035
453
+ },
454
+ "positionAbsolute": {
455
+ "x": -7.849538042569293,
456
+ "y": -427.90526378748035
457
+ },
458
+ "resizing": false,
459
+ "selected": false,
460
+ "sourcePosition": "right",
461
+ "style": {
462
+ "height": 163,
463
+ "width": 212
464
+ },
465
+ "targetPosition": "left",
466
+ "type": "noteNode",
467
+ "width": 212,
468
+ "dragHandle": ".note-drag-handle"
469
+ }
470
+ ],
471
+ "edges": [
472
+ {
473
+ "id": "reactflow__edge-begin-Answer:NeatLandsWavec",
474
+ "markerEnd": "logo",
475
+ "source": "begin",
476
+ "sourceHandle": null,
477
+ "style": {
478
+ "stroke": "rgb(202 197 245)",
479
+ "strokeWidth": 2
480
+ },
481
+ "target": "Answer:NeatLandsWave",
482
+ "targetHandle": "c",
483
+ "type": "buttonEdge"
484
+ },
485
+ {
486
+ "id": "reactflow__edge-Answer:NeatLandsWaveb-WenCai:TenParksOpenc",
487
+ "markerEnd": "logo",
488
+ "source": "Answer:NeatLandsWave",
489
+ "sourceHandle": "b",
490
+ "style": {
491
+ "stroke": "rgb(202 197 245)",
492
+ "strokeWidth": 2
493
+ },
494
+ "target": "WenCai:TenParksOpen",
495
+ "targetHandle": "c",
496
+ "type": "buttonEdge"
497
+ },
498
+ {
499
+ "id": "reactflow__edge-KeywordExtract:BreezyGoatsReadb-AkShare:CalmHotelsKnowc",
500
+ "markerEnd": "logo",
501
+ "source": "KeywordExtract:BreezyGoatsRead",
502
+ "sourceHandle": "b",
503
+ "style": {
504
+ "stroke": "rgb(202 197 245)",
505
+ "strokeWidth": 2
506
+ },
507
+ "target": "AkShare:CalmHotelsKnow",
508
+ "targetHandle": "c",
509
+ "type": "buttonEdge"
510
+ },
511
+ {
512
+ "id": "reactflow__edge-WenCai:TenParksOpenb-Generate:RottenPianosUniteb",
513
+ "markerEnd": "logo",
514
+ "source": "WenCai:TenParksOpen",
515
+ "sourceHandle": "b",
516
+ "style": {
517
+ "stroke": "rgb(202 197 245)",
518
+ "strokeWidth": 2
519
+ },
520
+ "target": "Generate:RottenPianosUnite",
521
+ "targetHandle": "b",
522
+ "type": "buttonEdge"
523
+ },
524
+ {
525
+ "id": "reactflow__edge-AkShare:CalmHotelsKnowb-Generate:RottenPianosUniteb",
526
+ "markerEnd": "logo",
527
+ "source": "AkShare:CalmHotelsKnow",
528
+ "sourceHandle": "b",
529
+ "style": {
530
+ "stroke": "rgb(202 197 245)",
531
+ "strokeWidth": 2
532
+ },
533
+ "target": "Generate:RottenPianosUnite",
534
+ "targetHandle": "b",
535
+ "type": "buttonEdge"
536
+ },
537
+ {
538
+ "id": "reactflow__edge-Generate:RottenPianosUnitec-Answer:NeatLandsWavec",
539
+ "markerEnd": "logo",
540
+ "source": "Generate:RottenPianosUnite",
541
+ "sourceHandle": "c",
542
+ "style": {
543
+ "stroke": "rgb(202 197 245)",
544
+ "strokeWidth": 2
545
+ },
546
+ "target": "Answer:NeatLandsWave",
547
+ "targetHandle": "c",
548
+ "type": "buttonEdge"
549
+ },
550
+ {
551
+ "id": "reactflow__edge-Answer:NeatLandsWaveb-KeywordExtract:BreezyGoatsReadc",
552
+ "markerEnd": "logo",
553
+ "source": "Answer:NeatLandsWave",
554
+ "sourceHandle": "b",
555
+ "style": {
556
+ "stroke": "rgb(202 197 245)",
557
+ "strokeWidth": 2
558
+ },
559
+ "target": "KeywordExtract:BreezyGoatsRead",
560
+ "targetHandle": "c",
561
+ "type": "buttonEdge"
562
+ }
563
+ ]
564
+ },
565
+ "history": [],
566
+ "messages": [],
567
+ "path": [],
568
+ "reference": []
569
+ },
570
+ "avatar": "data:image/png;base64,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"
571
+ }
agent/templates/text2sql.json CHANGED
@@ -1,585 +1,585 @@
1
- {
2
- "id": 5,
3
- "title": "Text To SQL",
4
- "description": "An agent that converts user queries into SQL statements. You must prepare three knowledge bases: 1: DDL for your database; 2: Examples of user queries converted to SQL statements; 3: A comprehensive description of your database, including but not limited to tables and records.",
5
- "canvas_type": "chatbot",
6
- "dsl": {
7
- "answer": [],
8
- "components": {
9
- "begin": {
10
- "obj": {
11
- "component_name": "Begin",
12
- "params": {}
13
- },
14
- "downstream": [
15
- "Answer:SocialAdsWonder"
16
- ],
17
- "upstream": []
18
- },
19
- "Answer:SocialAdsWonder": {
20
- "obj": {
21
- "component_name": "Answer",
22
- "params": {}
23
- },
24
- "downstream": [
25
- "Retrieval:TrueCornersJam",
26
- "Retrieval:EasyDryersShop",
27
- "Retrieval:LazyChefsWatch"
28
- ],
29
- "upstream": [
30
- "begin",
31
- "Generate:RareSymbolsGrin"
32
- ]
33
- },
34
- "Retrieval:TrueCornersJam": {
35
- "obj": {
36
- "component_name": "Retrieval",
37
- "params": {
38
- "empty_response": "Nothing found in DDL!",
39
- "kb_ids": [],
40
- "keywords_similarity_weight": 0.3,
41
- "similarity_threshold": 0.02,
42
- "top_n": 8
43
- }
44
- },
45
- "downstream": [
46
- "Generate:RareSymbolsGrin"
47
- ],
48
- "upstream": [
49
- "Answer:SocialAdsWonder"
50
- ]
51
- },
52
- "Retrieval:EasyDryersShop": {
53
- "obj": {
54
- "component_name": "Retrieval",
55
- "params": {
56
- "empty_response": "Nothing found in Q-SQL!",
57
- "kb_ids": [],
58
- "keywords_similarity_weight": 0.3,
59
- "similarity_threshold": 0.2,
60
- "top_n": 8
61
- }
62
- },
63
- "downstream": [
64
- "Generate:RareSymbolsGrin"
65
- ],
66
- "upstream": [
67
- "Answer:SocialAdsWonder"
68
- ]
69
- },
70
- "Retrieval:LazyChefsWatch": {
71
- "obj": {
72
- "component_name": "Retrieval",
73
- "params": {
74
- "empty_response": "Nothing found in DB-Description!",
75
- "kb_ids": [],
76
- "keywords_similarity_weight": 0.3,
77
- "similarity_threshold": 0.2,
78
- "top_n": 8
79
- }
80
- },
81
- "downstream": [
82
- "Generate:RareSymbolsGrin"
83
- ],
84
- "upstream": [
85
- "Answer:SocialAdsWonder"
86
- ]
87
- },
88
- "Generate:RareSymbolsGrin": {
89
- "obj": {
90
- "component_name": "Generate",
91
- "params": {
92
- "cite": true,
93
- "frequency_penalty": 0.7,
94
- "llm_id": "deepseek-chat@DeepSeek",
95
- "max_tokens": 256,
96
- "message_history_window_size": 12,
97
- "parameters": [
98
- {
99
- "component_id": "Retrieval:TrueCornersJam",
100
- "id": "78644673-9236-4605-8110-59705fc38784",
101
- "key": "ddl_input"
102
- },
103
- {
104
- "component_id": "Retrieval:LazyChefsWatch",
105
- "id": "afbf91ce-6f58-4573-b02d-9a4973f124f4",
106
- "key": "db_input"
107
- },
108
- {
109
- "component_id": "Retrieval:EasyDryersShop",
110
- "id": "ee2b84f4-1cf5-43be-80e6-60bfaea3d834",
111
- "key": "sql_input"
112
- }
113
- ],
114
- "presence_penalty": 0.4,
115
- "prompt": "##The user provides a question and you provide SQL. You will only respond with SQL code and not with any explanations.\n\n##Respond with only SQL code. Do not answer with any explanations -- just the code.\n\n##You may use the following DDL statements as a reference for what tables might be available. Use responses to past questions also to guide you: {ddl_input}.\n\n##You may use the following documentation as a reference for what tables might be available. Use responses to past questions also to guide you: {db_input}.\n\n##You may use the following SQL statements as a reference for what tables might be available. Use responses to past questions also to guide you: {sql_input}.",
116
- "temperature": 0.1,
117
- "top_p": 0.3
118
- }
119
- },
120
- "downstream": [
121
- "Answer:SocialAdsWonder"
122
- ],
123
- "upstream": [
124
- "Retrieval:TrueCornersJam",
125
- "Retrieval:EasyDryersShop",
126
- "Retrieval:LazyChefsWatch"
127
- ]
128
- }
129
- },
130
- "embed_id": "",
131
- "graph": {
132
- "nodes": [
133
- {
134
- "data": {
135
- "label": "Begin",
136
- "name": "begin"
137
- },
138
- "dragging": false,
139
- "height": 44,
140
- "id": "begin",
141
- "position": {
142
- "x": -520.486587527275,
143
- "y": 117.87988995940702
144
- },
145
- "positionAbsolute": {
146
- "x": -520.486587527275,
147
- "y": 117.87988995940702
148
- },
149
- "selected": false,
150
- "sourcePosition": "left",
151
- "targetPosition": "right",
152
- "type": "beginNode",
153
- "width": 100
154
- },
155
- {
156
- "data": {
157
- "form": {},
158
- "label": "Answer",
159
- "name": "interface"
160
- },
161
- "dragging": false,
162
- "height": 44,
163
- "id": "Answer:SocialAdsWonder",
164
- "position": {
165
- "x": -284.9289105495367,
166
- "y": 119.9282206409824
167
- },
168
- "positionAbsolute": {
169
- "x": -284.9289105495367,
170
- "y": 119.9282206409824
171
- },
172
- "selected": false,
173
- "sourcePosition": "right",
174
- "targetPosition": "left",
175
- "type": "logicNode",
176
- "width": 200
177
- },
178
- {
179
- "data": {
180
- "form": {
181
- "empty_response": "Nothing found in DDL!",
182
- "kb_ids": [],
183
- "keywords_similarity_weight": 0.3,
184
- "similarity_threshold": 0.02,
185
- "top_n": 8
186
- },
187
- "label": "Retrieval",
188
- "name": "DDL"
189
- },
190
- "dragging": false,
191
- "height": 44,
192
- "id": "Retrieval:TrueCornersJam",
193
- "position": {
194
- "x": 119.61927071085717,
195
- "y": -40.184181873335746
196
- },
197
- "positionAbsolute": {
198
- "x": 119.61927071085717,
199
- "y": -40.184181873335746
200
- },
201
- "selected": false,
202
- "sourcePosition": "right",
203
- "targetPosition": "left",
204
- "type": "retrievalNode",
205
- "width": 200
206
- },
207
- {
208
- "data": {
209
- "form": {
210
- "empty_response": "Nothing found in Q-SQL!",
211
- "kb_ids": [],
212
- "keywords_similarity_weight": 0.3,
213
- "similarity_threshold": 0.2,
214
- "top_n": 8
215
- },
216
- "label": "Retrieval",
217
- "name": "Q->SQL"
218
- },
219
- "dragging": false,
220
- "height": 44,
221
- "id": "Retrieval:EasyDryersShop",
222
- "position": {
223
- "x": 81.2024576603057,
224
- "y": 94.16303322180948
225
- },
226
- "positionAbsolute": {
227
- "x": 81.2024576603057,
228
- "y": 94.16303322180948
229
- },
230
- "selected": false,
231
- "sourcePosition": "right",
232
- "targetPosition": "left",
233
- "type": "retrievalNode",
234
- "width": 200
235
- },
236
- {
237
- "data": {
238
- "form": {
239
- "empty_response": "Nothing found in DB-Description!",
240
- "kb_ids": [],
241
- "keywords_similarity_weight": 0.3,
242
- "similarity_threshold": 0.2,
243
- "top_n": 8
244
- },
245
- "label": "Retrieval",
246
- "name": "DB Description"
247
- },
248
- "dragging": false,
249
- "height": 44,
250
- "id": "Retrieval:LazyChefsWatch",
251
- "position": {
252
- "x": 51.228157704293324,
253
- "y": 252.77721891325103
254
- },
255
- "positionAbsolute": {
256
- "x": 51.228157704293324,
257
- "y": 252.77721891325103
258
- },
259
- "selected": false,
260
- "sourcePosition": "right",
261
- "targetPosition": "left",
262
- "type": "retrievalNode",
263
- "width": 200
264
- },
265
- {
266
- "data": {
267
- "form": {
268
- "cite": true,
269
- "frequencyPenaltyEnabled": true,
270
- "frequency_penalty": 0.7,
271
- "llm_id": "deepseek-chat@DeepSeek",
272
- "maxTokensEnabled": true,
273
- "max_tokens": 256,
274
- "message_history_window_size": 12,
275
- "parameter": "Precise",
276
- "parameters": [
277
- {
278
- "component_id": "Retrieval:TrueCornersJam",
279
- "id": "78644673-9236-4605-8110-59705fc38784",
280
- "key": "ddl_input"
281
- },
282
- {
283
- "component_id": "Retrieval:LazyChefsWatch",
284
- "id": "afbf91ce-6f58-4573-b02d-9a4973f124f4",
285
- "key": "db_input"
286
- },
287
- {
288
- "component_id": "Retrieval:EasyDryersShop",
289
- "id": "ee2b84f4-1cf5-43be-80e6-60bfaea3d834",
290
- "key": "sql_input"
291
- }
292
- ],
293
- "presencePenaltyEnabled": true,
294
- "presence_penalty": 0.4,
295
- "prompt": "##The user provides a question and you provide SQL. You will only respond with SQL code and not with any explanations.\n\n##Respond with only SQL code. Do not answer with any explanations -- just the code.\n\n##You may use the following DDL statements as a reference for what tables might be available. Use responses to past questions also to guide you: {ddl_input}.\n\n##You may use the following documentation as a reference for what tables might be available. Use responses to past questions also to guide you: {db_input}.\n\n##You may use the following SQL statements as a reference for what tables might be available. Use responses to past questions also to guide you: {sql_input}.",
296
- "temperature": 0.1,
297
- "temperatureEnabled": true,
298
- "topPEnabled": true,
299
- "top_p": 0.3
300
- },
301
- "label": "Generate",
302
- "name": "LLM"
303
- },
304
- "dragging": false,
305
- "height": 212,
306
- "id": "Generate:RareSymbolsGrin",
307
- "position": {
308
- "x": 6.6098512156750076,
309
- "y": 405.0105548561454
310
- },
311
- "positionAbsolute": {
312
- "x": 6.6098512156750076,
313
- "y": 405.0105548561454
314
- },
315
- "selected": false,
316
- "sourcePosition": "right",
317
- "targetPosition": "left",
318
- "type": "generateNode",
319
- "width": 200
320
- },
321
- {
322
- "data": {
323
- "form": {
324
- "text": "Receives a sentence that the user wants to convert into SQL and displays the result of the large model's SQL conversion."
325
- },
326
- "label": "Note",
327
- "name": "N: Interface"
328
- },
329
- "dragging": false,
330
- "height": 132,
331
- "id": "Note:GentleRabbitsWonder",
332
- "position": {
333
- "x": -287.3066094433631,
334
- "y": -30.808189185380513
335
- },
336
- "positionAbsolute": {
337
- "x": -287.3066094433631,
338
- "y": -30.808189185380513
339
- },
340
- "resizing": false,
341
- "selected": false,
342
- "sourcePosition": "right",
343
- "style": {
344
- "height": 132,
345
- "width": 324
346
- },
347
- "targetPosition": "left",
348
- "type": "noteNode",
349
- "width": 324,
350
- "dragHandle": ".note-drag-handle"
351
- },
352
- {
353
- "data": {
354
- "form": {
355
- "text": "The large model learns which tables may be available based on the responses from three knowledge bases and converts the user's input into SQL statements."
356
- },
357
- "label": "Note",
358
- "name": "N: LLM"
359
- },
360
- "dragging": false,
361
- "height": 147,
362
- "id": "Note:SixCitiesJoke",
363
- "position": {
364
- "x": 5.12121582244032,
365
- "y": 637.6539219843564
366
- },
367
- "positionAbsolute": {
368
- "x": 5.12121582244032,
369
- "y": 637.6539219843564
370
- },
371
- "resizing": false,
372
- "selected": false,
373
- "sourcePosition": "right",
374
- "style": {
375
- "height": 147,
376
- "width": 326
377
- },
378
- "targetPosition": "left",
379
- "type": "noteNode",
380
- "width": 326,
381
- "dragHandle": ".note-drag-handle"
382
- },
383
- {
384
- "data": {
385
- "form": {
386
- "text": "Searches for description about meanings of tables and fields."
387
- },
388
- "label": "Note",
389
- "name": "N: DB description"
390
- },
391
- "dragging": false,
392
- "height": 128,
393
- "id": "Note:FamousCarpetsTaste",
394
- "position": {
395
- "x": 399.9267065852242,
396
- "y": 250.0329701879931
397
- },
398
- "positionAbsolute": {
399
- "x": 399.9267065852242,
400
- "y": 250.0329701879931
401
- },
402
- "selected": false,
403
- "sourcePosition": "right",
404
- "targetPosition": "left",
405
- "type": "noteNode",
406
- "width": 269,
407
- "dragHandle": ".note-drag-handle"
408
- },
409
- {
410
- "data": {
411
- "form": {
412
- "text": "Searches for samples about question to SQL.\nPlease check this dataset: https://huggingface.co/datasets/InfiniFlow/text2sql"
413
- },
414
- "label": "Note",
415
- "name": "N: Q->SQL"
416
- },
417
- "dragging": false,
418
- "height": 130,
419
- "id": "Note:PoliteBeesArrive",
420
- "position": {
421
- "x": 489.0393427986917,
422
- "y": 96.58232093146341
423
- },
424
- "positionAbsolute": {
425
- "x": 489.0393427986917,
426
- "y": 96.58232093146341
427
- },
428
- "resizing": false,
429
- "selected": false,
430
- "sourcePosition": "right",
431
- "style": {
432
- "height": 130,
433
- "width": 451
434
- },
435
- "targetPosition": "left",
436
- "type": "noteNode",
437
- "width": 451,
438
- "dragHandle": ".note-drag-handle"
439
- },
440
- {
441
- "data": {
442
- "form": {
443
- "text": "DDL(Data Definition Language).\n\nSearches for relevant database creation statements.\n\nIt should bind with a KB to which DDL is dumped in.\nYou could use 'General' as parsing method and ';' as delimiter."
444
- },
445
- "label": "Note",
446
- "name": "N: DDL"
447
- },
448
- "dragging": false,
449
- "height": 258,
450
- "id": "Note:SmartWingsDouble",
451
- "position": {
452
- "x": 404.1930553966363,
453
- "y": -208.84980249039137
454
- },
455
- "positionAbsolute": {
456
- "x": 404.1930553966363,
457
- "y": -208.84980249039137
458
- },
459
- "resizing": false,
460
- "selected": false,
461
- "sourcePosition": "right",
462
- "style": {
463
- "height": 258,
464
- "width": 283
465
- },
466
- "targetPosition": "left",
467
- "type": "noteNode",
468
- "width": 283,
469
- "dragHandle": ".note-drag-handle"
470
- }
471
- ],
472
- "edges": [
473
- {
474
- "id": "reactflow__edge-begin-Answer:SocialAdsWonderc",
475
- "markerEnd": "logo",
476
- "source": "begin",
477
- "sourceHandle": null,
478
- "style": {
479
- "stroke": "rgb(202 197 245)",
480
- "strokeWidth": 2
481
- },
482
- "target": "Answer:SocialAdsWonder",
483
- "targetHandle": "c",
484
- "type": "buttonEdge"
485
- },
486
- {
487
- "id": "reactflow__edge-Answer:SocialAdsWonderb-Retrieval:TrueCornersJamc",
488
- "markerEnd": "logo",
489
- "source": "Answer:SocialAdsWonder",
490
- "sourceHandle": "b",
491
- "style": {
492
- "stroke": "rgb(202 197 245)",
493
- "strokeWidth": 2
494
- },
495
- "target": "Retrieval:TrueCornersJam",
496
- "targetHandle": "c",
497
- "type": "buttonEdge"
498
- },
499
- {
500
- "id": "reactflow__edge-Answer:SocialAdsWonderb-Retrieval:EasyDryersShopc",
501
- "markerEnd": "logo",
502
- "source": "Answer:SocialAdsWonder",
503
- "sourceHandle": "b",
504
- "style": {
505
- "stroke": "rgb(202 197 245)",
506
- "strokeWidth": 2
507
- },
508
- "target": "Retrieval:EasyDryersShop",
509
- "targetHandle": "c",
510
- "type": "buttonEdge"
511
- },
512
- {
513
- "id": "reactflow__edge-Answer:SocialAdsWonderb-Retrieval:LazyChefsWatchc",
514
- "markerEnd": "logo",
515
- "source": "Answer:SocialAdsWonder",
516
- "sourceHandle": "b",
517
- "style": {
518
- "stroke": "rgb(202 197 245)",
519
- "strokeWidth": 2
520
- },
521
- "target": "Retrieval:LazyChefsWatch",
522
- "targetHandle": "c",
523
- "type": "buttonEdge"
524
- },
525
- {
526
- "id": "reactflow__edge-Retrieval:TrueCornersJamb-Generate:RareSymbolsGrinb",
527
- "markerEnd": "logo",
528
- "source": "Retrieval:TrueCornersJam",
529
- "sourceHandle": "b",
530
- "style": {
531
- "stroke": "rgb(202 197 245)",
532
- "strokeWidth": 2
533
- },
534
- "target": "Generate:RareSymbolsGrin",
535
- "targetHandle": "b",
536
- "type": "buttonEdge"
537
- },
538
- {
539
- "id": "reactflow__edge-Retrieval:EasyDryersShopb-Generate:RareSymbolsGrinb",
540
- "markerEnd": "logo",
541
- "source": "Retrieval:EasyDryersShop",
542
- "sourceHandle": "b",
543
- "style": {
544
- "stroke": "rgb(202 197 245)",
545
- "strokeWidth": 2
546
- },
547
- "target": "Generate:RareSymbolsGrin",
548
- "targetHandle": "b",
549
- "type": "buttonEdge"
550
- },
551
- {
552
- "id": "reactflow__edge-Retrieval:LazyChefsWatchb-Generate:RareSymbolsGrinb",
553
- "markerEnd": "logo",
554
- "source": "Retrieval:LazyChefsWatch",
555
- "sourceHandle": "b",
556
- "style": {
557
- "stroke": "rgb(202 197 245)",
558
- "strokeWidth": 2
559
- },
560
- "target": "Generate:RareSymbolsGrin",
561
- "targetHandle": "b",
562
- "type": "buttonEdge"
563
- },
564
- {
565
- "id": "reactflow__edge-Generate:RareSymbolsGrinc-Answer:SocialAdsWonderc",
566
- "markerEnd": "logo",
567
- "source": "Generate:RareSymbolsGrin",
568
- "sourceHandle": "c",
569
- "style": {
570
- "stroke": "rgb(202 197 245)",
571
- "strokeWidth": 2
572
- },
573
- "target": "Answer:SocialAdsWonder",
574
- "targetHandle": "c",
575
- "type": "buttonEdge"
576
- }
577
- ]
578
- },
579
- "history": [],
580
- "messages": [],
581
- "path": [],
582
- "reference": []
583
- },
584
- "avatar": "data:image/png;base64,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"
585
- }
 
1
+ {
2
+ "id": 5,
3
+ "title": "Text To SQL",
4
+ "description": "An agent that converts user queries into SQL statements. You must prepare three knowledge bases: 1: DDL for your database; 2: Examples of user queries converted to SQL statements; 3: A comprehensive description of your database, including but not limited to tables and records.",
5
+ "canvas_type": "chatbot",
6
+ "dsl": {
7
+ "answer": [],
8
+ "components": {
9
+ "begin": {
10
+ "obj": {
11
+ "component_name": "Begin",
12
+ "params": {}
13
+ },
14
+ "downstream": [
15
+ "Answer:SocialAdsWonder"
16
+ ],
17
+ "upstream": []
18
+ },
19
+ "Answer:SocialAdsWonder": {
20
+ "obj": {
21
+ "component_name": "Answer",
22
+ "params": {}
23
+ },
24
+ "downstream": [
25
+ "Retrieval:TrueCornersJam",
26
+ "Retrieval:EasyDryersShop",
27
+ "Retrieval:LazyChefsWatch"
28
+ ],
29
+ "upstream": [
30
+ "begin",
31
+ "Generate:RareSymbolsGrin"
32
+ ]
33
+ },
34
+ "Retrieval:TrueCornersJam": {
35
+ "obj": {
36
+ "component_name": "Retrieval",
37
+ "params": {
38
+ "empty_response": "Nothing found in DDL!",
39
+ "kb_ids": [],
40
+ "keywords_similarity_weight": 0.3,
41
+ "similarity_threshold": 0.02,
42
+ "top_n": 8
43
+ }
44
+ },
45
+ "downstream": [
46
+ "Generate:RareSymbolsGrin"
47
+ ],
48
+ "upstream": [
49
+ "Answer:SocialAdsWonder"
50
+ ]
51
+ },
52
+ "Retrieval:EasyDryersShop": {
53
+ "obj": {
54
+ "component_name": "Retrieval",
55
+ "params": {
56
+ "empty_response": "Nothing found in Q-SQL!",
57
+ "kb_ids": [],
58
+ "keywords_similarity_weight": 0.3,
59
+ "similarity_threshold": 0.2,
60
+ "top_n": 8
61
+ }
62
+ },
63
+ "downstream": [
64
+ "Generate:RareSymbolsGrin"
65
+ ],
66
+ "upstream": [
67
+ "Answer:SocialAdsWonder"
68
+ ]
69
+ },
70
+ "Retrieval:LazyChefsWatch": {
71
+ "obj": {
72
+ "component_name": "Retrieval",
73
+ "params": {
74
+ "empty_response": "Nothing found in DB-Description!",
75
+ "kb_ids": [],
76
+ "keywords_similarity_weight": 0.3,
77
+ "similarity_threshold": 0.2,
78
+ "top_n": 8
79
+ }
80
+ },
81
+ "downstream": [
82
+ "Generate:RareSymbolsGrin"
83
+ ],
84
+ "upstream": [
85
+ "Answer:SocialAdsWonder"
86
+ ]
87
+ },
88
+ "Generate:RareSymbolsGrin": {
89
+ "obj": {
90
+ "component_name": "Generate",
91
+ "params": {
92
+ "cite": true,
93
+ "frequency_penalty": 0.7,
94
+ "llm_id": "deepseek-chat@DeepSeek",
95
+ "max_tokens": 256,
96
+ "message_history_window_size": 12,
97
+ "parameters": [
98
+ {
99
+ "component_id": "Retrieval:TrueCornersJam",
100
+ "id": "78644673-9236-4605-8110-59705fc38784",
101
+ "key": "ddl_input"
102
+ },
103
+ {
104
+ "component_id": "Retrieval:LazyChefsWatch",
105
+ "id": "afbf91ce-6f58-4573-b02d-9a4973f124f4",
106
+ "key": "db_input"
107
+ },
108
+ {
109
+ "component_id": "Retrieval:EasyDryersShop",
110
+ "id": "ee2b84f4-1cf5-43be-80e6-60bfaea3d834",
111
+ "key": "sql_input"
112
+ }
113
+ ],
114
+ "presence_penalty": 0.4,
115
+ "prompt": "##The user provides a question and you provide SQL. You will only respond with SQL code and not with any explanations.\n\n##Respond with only SQL code. Do not answer with any explanations -- just the code.\n\n##You may use the following DDL statements as a reference for what tables might be available. Use responses to past questions also to guide you: {ddl_input}.\n\n##You may use the following documentation as a reference for what tables might be available. Use responses to past questions also to guide you: {db_input}.\n\n##You may use the following SQL statements as a reference for what tables might be available. Use responses to past questions also to guide you: {sql_input}.",
116
+ "temperature": 0.1,
117
+ "top_p": 0.3
118
+ }
119
+ },
120
+ "downstream": [
121
+ "Answer:SocialAdsWonder"
122
+ ],
123
+ "upstream": [
124
+ "Retrieval:TrueCornersJam",
125
+ "Retrieval:EasyDryersShop",
126
+ "Retrieval:LazyChefsWatch"
127
+ ]
128
+ }
129
+ },
130
+ "embed_id": "",
131
+ "graph": {
132
+ "nodes": [
133
+ {
134
+ "data": {
135
+ "label": "Begin",
136
+ "name": "begin"
137
+ },
138
+ "dragging": false,
139
+ "height": 44,
140
+ "id": "begin",
141
+ "position": {
142
+ "x": -520.486587527275,
143
+ "y": 117.87988995940702
144
+ },
145
+ "positionAbsolute": {
146
+ "x": -520.486587527275,
147
+ "y": 117.87988995940702
148
+ },
149
+ "selected": false,
150
+ "sourcePosition": "left",
151
+ "targetPosition": "right",
152
+ "type": "beginNode",
153
+ "width": 100
154
+ },
155
+ {
156
+ "data": {
157
+ "form": {},
158
+ "label": "Answer",
159
+ "name": "interface"
160
+ },
161
+ "dragging": false,
162
+ "height": 44,
163
+ "id": "Answer:SocialAdsWonder",
164
+ "position": {
165
+ "x": -284.9289105495367,
166
+ "y": 119.9282206409824
167
+ },
168
+ "positionAbsolute": {
169
+ "x": -284.9289105495367,
170
+ "y": 119.9282206409824
171
+ },
172
+ "selected": false,
173
+ "sourcePosition": "right",
174
+ "targetPosition": "left",
175
+ "type": "logicNode",
176
+ "width": 200
177
+ },
178
+ {
179
+ "data": {
180
+ "form": {
181
+ "empty_response": "Nothing found in DDL!",
182
+ "kb_ids": [],
183
+ "keywords_similarity_weight": 0.3,
184
+ "similarity_threshold": 0.02,
185
+ "top_n": 8
186
+ },
187
+ "label": "Retrieval",
188
+ "name": "DDL"
189
+ },
190
+ "dragging": false,
191
+ "height": 44,
192
+ "id": "Retrieval:TrueCornersJam",
193
+ "position": {
194
+ "x": 119.61927071085717,
195
+ "y": -40.184181873335746
196
+ },
197
+ "positionAbsolute": {
198
+ "x": 119.61927071085717,
199
+ "y": -40.184181873335746
200
+ },
201
+ "selected": false,
202
+ "sourcePosition": "right",
203
+ "targetPosition": "left",
204
+ "type": "retrievalNode",
205
+ "width": 200
206
+ },
207
+ {
208
+ "data": {
209
+ "form": {
210
+ "empty_response": "Nothing found in Q-SQL!",
211
+ "kb_ids": [],
212
+ "keywords_similarity_weight": 0.3,
213
+ "similarity_threshold": 0.2,
214
+ "top_n": 8
215
+ },
216
+ "label": "Retrieval",
217
+ "name": "Q->SQL"
218
+ },
219
+ "dragging": false,
220
+ "height": 44,
221
+ "id": "Retrieval:EasyDryersShop",
222
+ "position": {
223
+ "x": 81.2024576603057,
224
+ "y": 94.16303322180948
225
+ },
226
+ "positionAbsolute": {
227
+ "x": 81.2024576603057,
228
+ "y": 94.16303322180948
229
+ },
230
+ "selected": false,
231
+ "sourcePosition": "right",
232
+ "targetPosition": "left",
233
+ "type": "retrievalNode",
234
+ "width": 200
235
+ },
236
+ {
237
+ "data": {
238
+ "form": {
239
+ "empty_response": "Nothing found in DB-Description!",
240
+ "kb_ids": [],
241
+ "keywords_similarity_weight": 0.3,
242
+ "similarity_threshold": 0.2,
243
+ "top_n": 8
244
+ },
245
+ "label": "Retrieval",
246
+ "name": "DB Description"
247
+ },
248
+ "dragging": false,
249
+ "height": 44,
250
+ "id": "Retrieval:LazyChefsWatch",
251
+ "position": {
252
+ "x": 51.228157704293324,
253
+ "y": 252.77721891325103
254
+ },
255
+ "positionAbsolute": {
256
+ "x": 51.228157704293324,
257
+ "y": 252.77721891325103
258
+ },
259
+ "selected": false,
260
+ "sourcePosition": "right",
261
+ "targetPosition": "left",
262
+ "type": "retrievalNode",
263
+ "width": 200
264
+ },
265
+ {
266
+ "data": {
267
+ "form": {
268
+ "cite": true,
269
+ "frequencyPenaltyEnabled": true,
270
+ "frequency_penalty": 0.7,
271
+ "llm_id": "deepseek-chat@DeepSeek",
272
+ "maxTokensEnabled": true,
273
+ "max_tokens": 256,
274
+ "message_history_window_size": 12,
275
+ "parameter": "Precise",
276
+ "parameters": [
277
+ {
278
+ "component_id": "Retrieval:TrueCornersJam",
279
+ "id": "78644673-9236-4605-8110-59705fc38784",
280
+ "key": "ddl_input"
281
+ },
282
+ {
283
+ "component_id": "Retrieval:LazyChefsWatch",
284
+ "id": "afbf91ce-6f58-4573-b02d-9a4973f124f4",
285
+ "key": "db_input"
286
+ },
287
+ {
288
+ "component_id": "Retrieval:EasyDryersShop",
289
+ "id": "ee2b84f4-1cf5-43be-80e6-60bfaea3d834",
290
+ "key": "sql_input"
291
+ }
292
+ ],
293
+ "presencePenaltyEnabled": true,
294
+ "presence_penalty": 0.4,
295
+ "prompt": "##The user provides a question and you provide SQL. You will only respond with SQL code and not with any explanations.\n\n##Respond with only SQL code. Do not answer with any explanations -- just the code.\n\n##You may use the following DDL statements as a reference for what tables might be available. Use responses to past questions also to guide you: {ddl_input}.\n\n##You may use the following documentation as a reference for what tables might be available. Use responses to past questions also to guide you: {db_input}.\n\n##You may use the following SQL statements as a reference for what tables might be available. Use responses to past questions also to guide you: {sql_input}.",
296
+ "temperature": 0.1,
297
+ "temperatureEnabled": true,
298
+ "topPEnabled": true,
299
+ "top_p": 0.3
300
+ },
301
+ "label": "Generate",
302
+ "name": "LLM"
303
+ },
304
+ "dragging": false,
305
+ "height": 212,
306
+ "id": "Generate:RareSymbolsGrin",
307
+ "position": {
308
+ "x": 6.6098512156750076,
309
+ "y": 405.0105548561454
310
+ },
311
+ "positionAbsolute": {
312
+ "x": 6.6098512156750076,
313
+ "y": 405.0105548561454
314
+ },
315
+ "selected": false,
316
+ "sourcePosition": "right",
317
+ "targetPosition": "left",
318
+ "type": "generateNode",
319
+ "width": 200
320
+ },
321
+ {
322
+ "data": {
323
+ "form": {
324
+ "text": "Receives a sentence that the user wants to convert into SQL and displays the result of the large model's SQL conversion."
325
+ },
326
+ "label": "Note",
327
+ "name": "N: Interface"
328
+ },
329
+ "dragging": false,
330
+ "height": 132,
331
+ "id": "Note:GentleRabbitsWonder",
332
+ "position": {
333
+ "x": -287.3066094433631,
334
+ "y": -30.808189185380513
335
+ },
336
+ "positionAbsolute": {
337
+ "x": -287.3066094433631,
338
+ "y": -30.808189185380513
339
+ },
340
+ "resizing": false,
341
+ "selected": false,
342
+ "sourcePosition": "right",
343
+ "style": {
344
+ "height": 132,
345
+ "width": 324
346
+ },
347
+ "targetPosition": "left",
348
+ "type": "noteNode",
349
+ "width": 324,
350
+ "dragHandle": ".note-drag-handle"
351
+ },
352
+ {
353
+ "data": {
354
+ "form": {
355
+ "text": "The large model learns which tables may be available based on the responses from three knowledge bases and converts the user's input into SQL statements."
356
+ },
357
+ "label": "Note",
358
+ "name": "N: LLM"
359
+ },
360
+ "dragging": false,
361
+ "height": 147,
362
+ "id": "Note:SixCitiesJoke",
363
+ "position": {
364
+ "x": 5.12121582244032,
365
+ "y": 637.6539219843564
366
+ },
367
+ "positionAbsolute": {
368
+ "x": 5.12121582244032,
369
+ "y": 637.6539219843564
370
+ },
371
+ "resizing": false,
372
+ "selected": false,
373
+ "sourcePosition": "right",
374
+ "style": {
375
+ "height": 147,
376
+ "width": 326
377
+ },
378
+ "targetPosition": "left",
379
+ "type": "noteNode",
380
+ "width": 326,
381
+ "dragHandle": ".note-drag-handle"
382
+ },
383
+ {
384
+ "data": {
385
+ "form": {
386
+ "text": "Searches for description about meanings of tables and fields."
387
+ },
388
+ "label": "Note",
389
+ "name": "N: DB description"
390
+ },
391
+ "dragging": false,
392
+ "height": 128,
393
+ "id": "Note:FamousCarpetsTaste",
394
+ "position": {
395
+ "x": 399.9267065852242,
396
+ "y": 250.0329701879931
397
+ },
398
+ "positionAbsolute": {
399
+ "x": 399.9267065852242,
400
+ "y": 250.0329701879931
401
+ },
402
+ "selected": false,
403
+ "sourcePosition": "right",
404
+ "targetPosition": "left",
405
+ "type": "noteNode",
406
+ "width": 269,
407
+ "dragHandle": ".note-drag-handle"
408
+ },
409
+ {
410
+ "data": {
411
+ "form": {
412
+ "text": "Searches for samples about question to SQL.\nPlease check this dataset: https://huggingface.co/datasets/InfiniFlow/text2sql"
413
+ },
414
+ "label": "Note",
415
+ "name": "N: Q->SQL"
416
+ },
417
+ "dragging": false,
418
+ "height": 130,
419
+ "id": "Note:PoliteBeesArrive",
420
+ "position": {
421
+ "x": 489.0393427986917,
422
+ "y": 96.58232093146341
423
+ },
424
+ "positionAbsolute": {
425
+ "x": 489.0393427986917,
426
+ "y": 96.58232093146341
427
+ },
428
+ "resizing": false,
429
+ "selected": false,
430
+ "sourcePosition": "right",
431
+ "style": {
432
+ "height": 130,
433
+ "width": 451
434
+ },
435
+ "targetPosition": "left",
436
+ "type": "noteNode",
437
+ "width": 451,
438
+ "dragHandle": ".note-drag-handle"
439
+ },
440
+ {
441
+ "data": {
442
+ "form": {
443
+ "text": "DDL(Data Definition Language).\n\nSearches for relevant database creation statements.\n\nIt should bind with a KB to which DDL is dumped in.\nYou could use 'General' as parsing method and ';' as delimiter."
444
+ },
445
+ "label": "Note",
446
+ "name": "N: DDL"
447
+ },
448
+ "dragging": false,
449
+ "height": 258,
450
+ "id": "Note:SmartWingsDouble",
451
+ "position": {
452
+ "x": 404.1930553966363,
453
+ "y": -208.84980249039137
454
+ },
455
+ "positionAbsolute": {
456
+ "x": 404.1930553966363,
457
+ "y": -208.84980249039137
458
+ },
459
+ "resizing": false,
460
+ "selected": false,
461
+ "sourcePosition": "right",
462
+ "style": {
463
+ "height": 258,
464
+ "width": 283
465
+ },
466
+ "targetPosition": "left",
467
+ "type": "noteNode",
468
+ "width": 283,
469
+ "dragHandle": ".note-drag-handle"
470
+ }
471
+ ],
472
+ "edges": [
473
+ {
474
+ "id": "reactflow__edge-begin-Answer:SocialAdsWonderc",
475
+ "markerEnd": "logo",
476
+ "source": "begin",
477
+ "sourceHandle": null,
478
+ "style": {
479
+ "stroke": "rgb(202 197 245)",
480
+ "strokeWidth": 2
481
+ },
482
+ "target": "Answer:SocialAdsWonder",
483
+ "targetHandle": "c",
484
+ "type": "buttonEdge"
485
+ },
486
+ {
487
+ "id": "reactflow__edge-Answer:SocialAdsWonderb-Retrieval:TrueCornersJamc",
488
+ "markerEnd": "logo",
489
+ "source": "Answer:SocialAdsWonder",
490
+ "sourceHandle": "b",
491
+ "style": {
492
+ "stroke": "rgb(202 197 245)",
493
+ "strokeWidth": 2
494
+ },
495
+ "target": "Retrieval:TrueCornersJam",
496
+ "targetHandle": "c",
497
+ "type": "buttonEdge"
498
+ },
499
+ {
500
+ "id": "reactflow__edge-Answer:SocialAdsWonderb-Retrieval:EasyDryersShopc",
501
+ "markerEnd": "logo",
502
+ "source": "Answer:SocialAdsWonder",
503
+ "sourceHandle": "b",
504
+ "style": {
505
+ "stroke": "rgb(202 197 245)",
506
+ "strokeWidth": 2
507
+ },
508
+ "target": "Retrieval:EasyDryersShop",
509
+ "targetHandle": "c",
510
+ "type": "buttonEdge"
511
+ },
512
+ {
513
+ "id": "reactflow__edge-Answer:SocialAdsWonderb-Retrieval:LazyChefsWatchc",
514
+ "markerEnd": "logo",
515
+ "source": "Answer:SocialAdsWonder",
516
+ "sourceHandle": "b",
517
+ "style": {
518
+ "stroke": "rgb(202 197 245)",
519
+ "strokeWidth": 2
520
+ },
521
+ "target": "Retrieval:LazyChefsWatch",
522
+ "targetHandle": "c",
523
+ "type": "buttonEdge"
524
+ },
525
+ {
526
+ "id": "reactflow__edge-Retrieval:TrueCornersJamb-Generate:RareSymbolsGrinb",
527
+ "markerEnd": "logo",
528
+ "source": "Retrieval:TrueCornersJam",
529
+ "sourceHandle": "b",
530
+ "style": {
531
+ "stroke": "rgb(202 197 245)",
532
+ "strokeWidth": 2
533
+ },
534
+ "target": "Generate:RareSymbolsGrin",
535
+ "targetHandle": "b",
536
+ "type": "buttonEdge"
537
+ },
538
+ {
539
+ "id": "reactflow__edge-Retrieval:EasyDryersShopb-Generate:RareSymbolsGrinb",
540
+ "markerEnd": "logo",
541
+ "source": "Retrieval:EasyDryersShop",
542
+ "sourceHandle": "b",
543
+ "style": {
544
+ "stroke": "rgb(202 197 245)",
545
+ "strokeWidth": 2
546
+ },
547
+ "target": "Generate:RareSymbolsGrin",
548
+ "targetHandle": "b",
549
+ "type": "buttonEdge"
550
+ },
551
+ {
552
+ "id": "reactflow__edge-Retrieval:LazyChefsWatchb-Generate:RareSymbolsGrinb",
553
+ "markerEnd": "logo",
554
+ "source": "Retrieval:LazyChefsWatch",
555
+ "sourceHandle": "b",
556
+ "style": {
557
+ "stroke": "rgb(202 197 245)",
558
+ "strokeWidth": 2
559
+ },
560
+ "target": "Generate:RareSymbolsGrin",
561
+ "targetHandle": "b",
562
+ "type": "buttonEdge"
563
+ },
564
+ {
565
+ "id": "reactflow__edge-Generate:RareSymbolsGrinc-Answer:SocialAdsWonderc",
566
+ "markerEnd": "logo",
567
+ "source": "Generate:RareSymbolsGrin",
568
+ "sourceHandle": "c",
569
+ "style": {
570
+ "stroke": "rgb(202 197 245)",
571
+ "strokeWidth": 2
572
+ },
573
+ "target": "Answer:SocialAdsWonder",
574
+ "targetHandle": "c",
575
+ "type": "buttonEdge"
576
+ }
577
+ ]
578
+ },
579
+ "history": [],
580
+ "messages": [],
581
+ "path": [],
582
+ "reference": []
583
+ },
584
+ "avatar": "data:image/png;base64,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"
585
+ }
agent/test/dsl_examples/concentrator_message.json CHANGED
@@ -1,113 +1,113 @@
1
- {
2
- "components": {
3
- "begin": {
4
- "obj":{
5
- "component_name": "Begin",
6
- "params": {
7
- "prologue": "Hi there!"
8
- }
9
- },
10
- "downstream": ["answer:0"],
11
- "upstream": []
12
- },
13
- "answer:0": {
14
- "obj": {
15
- "component_name": "Answer",
16
- "params": {}
17
- },
18
- "downstream": ["categorize:0"],
19
- "upstream": ["begin"]
20
- },
21
- "categorize:0": {
22
- "obj": {
23
- "component_name": "Categorize",
24
- "params": {
25
- "llm_id": "deepseek-chat",
26
- "category_description": {
27
- "product_related": {
28
- "description": "The question is about the product usage, appearance and how it works.",
29
- "examples": "Why it always beaming?\nHow to install it onto the wall?\nIt leaks, what to do?",
30
- "to": "concentrator:0"
31
- },
32
- "others": {
33
- "description": "The question is not about the product usage, appearance and how it works.",
34
- "examples": "How are you doing?\nWhat is your name?\nAre you a robot?\nWhat's the weather?\nWill it rain?",
35
- "to": "concentrator:1"
36
- }
37
- }
38
- }
39
- },
40
- "downstream": ["concentrator:0","concentrator:1"],
41
- "upstream": ["answer:0"]
42
- },
43
- "concentrator:0": {
44
- "obj": {
45
- "component_name": "Concentrator",
46
- "params": {}
47
- },
48
- "downstream": ["message:0"],
49
- "upstream": ["categorize:0"]
50
- },
51
- "concentrator:1": {
52
- "obj": {
53
- "component_name": "Concentrator",
54
- "params": {}
55
- },
56
- "downstream": ["message:1_0","message:1_1","message:1_2"],
57
- "upstream": ["categorize:0"]
58
- },
59
- "message:0": {
60
- "obj": {
61
- "component_name": "Message",
62
- "params": {
63
- "messages": [
64
- "Message 0_0!!!!!!!"
65
- ]
66
- }
67
- },
68
- "downstream": ["answer:0"],
69
- "upstream": ["concentrator:0"]
70
- },
71
- "message:1_0": {
72
- "obj": {
73
- "component_name": "Message",
74
- "params": {
75
- "messages": [
76
- "Message 1_0!!!!!!!"
77
- ]
78
- }
79
- },
80
- "downstream": ["answer:0"],
81
- "upstream": ["concentrator:1"]
82
- },
83
- "message:1_1": {
84
- "obj": {
85
- "component_name": "Message",
86
- "params": {
87
- "messages": [
88
- "Message 1_1!!!!!!!"
89
- ]
90
- }
91
- },
92
- "downstream": ["answer:0"],
93
- "upstream": ["concentrator:1"]
94
- },
95
- "message:1_2": {
96
- "obj": {
97
- "component_name": "Message",
98
- "params": {
99
- "messages": [
100
- "Message 1_2!!!!!!!"
101
- ]
102
- }
103
- },
104
- "downstream": ["answer:0"],
105
- "upstream": ["concentrator:1"]
106
- }
107
- },
108
- "history": [],
109
- "messages": [],
110
- "path": [],
111
- "reference": [],
112
- "answer": []
113
  }
 
1
+ {
2
+ "components": {
3
+ "begin": {
4
+ "obj":{
5
+ "component_name": "Begin",
6
+ "params": {
7
+ "prologue": "Hi there!"
8
+ }
9
+ },
10
+ "downstream": ["answer:0"],
11
+ "upstream": []
12
+ },
13
+ "answer:0": {
14
+ "obj": {
15
+ "component_name": "Answer",
16
+ "params": {}
17
+ },
18
+ "downstream": ["categorize:0"],
19
+ "upstream": ["begin"]
20
+ },
21
+ "categorize:0": {
22
+ "obj": {
23
+ "component_name": "Categorize",
24
+ "params": {
25
+ "llm_id": "deepseek-chat",
26
+ "category_description": {
27
+ "product_related": {
28
+ "description": "The question is about the product usage, appearance and how it works.",
29
+ "examples": "Why it always beaming?\nHow to install it onto the wall?\nIt leaks, what to do?",
30
+ "to": "concentrator:0"
31
+ },
32
+ "others": {
33
+ "description": "The question is not about the product usage, appearance and how it works.",
34
+ "examples": "How are you doing?\nWhat is your name?\nAre you a robot?\nWhat's the weather?\nWill it rain?",
35
+ "to": "concentrator:1"
36
+ }
37
+ }
38
+ }
39
+ },
40
+ "downstream": ["concentrator:0","concentrator:1"],
41
+ "upstream": ["answer:0"]
42
+ },
43
+ "concentrator:0": {
44
+ "obj": {
45
+ "component_name": "Concentrator",
46
+ "params": {}
47
+ },
48
+ "downstream": ["message:0"],
49
+ "upstream": ["categorize:0"]
50
+ },
51
+ "concentrator:1": {
52
+ "obj": {
53
+ "component_name": "Concentrator",
54
+ "params": {}
55
+ },
56
+ "downstream": ["message:1_0","message:1_1","message:1_2"],
57
+ "upstream": ["categorize:0"]
58
+ },
59
+ "message:0": {
60
+ "obj": {
61
+ "component_name": "Message",
62
+ "params": {
63
+ "messages": [
64
+ "Message 0_0!!!!!!!"
65
+ ]
66
+ }
67
+ },
68
+ "downstream": ["answer:0"],
69
+ "upstream": ["concentrator:0"]
70
+ },
71
+ "message:1_0": {
72
+ "obj": {
73
+ "component_name": "Message",
74
+ "params": {
75
+ "messages": [
76
+ "Message 1_0!!!!!!!"
77
+ ]
78
+ }
79
+ },
80
+ "downstream": ["answer:0"],
81
+ "upstream": ["concentrator:1"]
82
+ },
83
+ "message:1_1": {
84
+ "obj": {
85
+ "component_name": "Message",
86
+ "params": {
87
+ "messages": [
88
+ "Message 1_1!!!!!!!"
89
+ ]
90
+ }
91
+ },
92
+ "downstream": ["answer:0"],
93
+ "upstream": ["concentrator:1"]
94
+ },
95
+ "message:1_2": {
96
+ "obj": {
97
+ "component_name": "Message",
98
+ "params": {
99
+ "messages": [
100
+ "Message 1_2!!!!!!!"
101
+ ]
102
+ }
103
+ },
104
+ "downstream": ["answer:0"],
105
+ "upstream": ["concentrator:1"]
106
+ }
107
+ },
108
+ "history": [],
109
+ "messages": [],
110
+ "path": [],
111
+ "reference": [],
112
+ "answer": []
113
  }
rag/svr/cache_file_svr.py CHANGED
@@ -1,60 +1,60 @@
1
- #
2
- # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- #
16
- import logging
17
- import time
18
- import traceback
19
-
20
- from api.db.db_models import close_connection
21
- from api.db.services.task_service import TaskService
22
- from rag.utils.storage_factory import STORAGE_IMPL
23
- from rag.utils.redis_conn import REDIS_CONN
24
-
25
-
26
- def collect():
27
- doc_locations = TaskService.get_ongoing_doc_name()
28
- logging.debug(doc_locations)
29
- if len(doc_locations) == 0:
30
- time.sleep(1)
31
- return
32
- return doc_locations
33
-
34
-
35
- def main():
36
- locations = collect()
37
- if not locations:
38
- return
39
- logging.info(f"TASKS: {len(locations)}")
40
- for kb_id, loc in locations:
41
- try:
42
- if REDIS_CONN.is_alive():
43
- try:
44
- key = "{}/{}".format(kb_id, loc)
45
- if REDIS_CONN.exist(key):
46
- continue
47
- file_bin = STORAGE_IMPL.get(kb_id, loc)
48
- REDIS_CONN.transaction(key, file_bin, 12 * 60)
49
- logging.info("CACHE: {}".format(loc))
50
- except Exception as e:
51
- traceback.print_stack(e)
52
- except Exception as e:
53
- traceback.print_stack(e)
54
-
55
-
56
- if __name__ == "__main__":
57
- while True:
58
- main()
59
- close_connection()
60
  time.sleep(1)
 
1
+ #
2
+ # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ import logging
17
+ import time
18
+ import traceback
19
+
20
+ from api.db.db_models import close_connection
21
+ from api.db.services.task_service import TaskService
22
+ from rag.utils.storage_factory import STORAGE_IMPL
23
+ from rag.utils.redis_conn import REDIS_CONN
24
+
25
+
26
+ def collect():
27
+ doc_locations = TaskService.get_ongoing_doc_name()
28
+ logging.debug(doc_locations)
29
+ if len(doc_locations) == 0:
30
+ time.sleep(1)
31
+ return
32
+ return doc_locations
33
+
34
+
35
+ def main():
36
+ locations = collect()
37
+ if not locations:
38
+ return
39
+ logging.info(f"TASKS: {len(locations)}")
40
+ for kb_id, loc in locations:
41
+ try:
42
+ if REDIS_CONN.is_alive():
43
+ try:
44
+ key = "{}/{}".format(kb_id, loc)
45
+ if REDIS_CONN.exist(key):
46
+ continue
47
+ file_bin = STORAGE_IMPL.get(kb_id, loc)
48
+ REDIS_CONN.transaction(key, file_bin, 12 * 60)
49
+ logging.info("CACHE: {}".format(loc))
50
+ except Exception as e:
51
+ traceback.print_stack(e)
52
+ except Exception as e:
53
+ traceback.print_stack(e)
54
+
55
+
56
+ if __name__ == "__main__":
57
+ while True:
58
+ main()
59
+ close_connection()
60
  time.sleep(1)
sdk/python/ragflow_sdk/modules/base.py CHANGED
@@ -1,38 +1,38 @@
1
- class Base(object):
2
- def __init__(self, rag, res_dict):
3
- self.rag = rag
4
- for k, v in res_dict.items():
5
- if isinstance(v, dict):
6
- self.__dict__[k] = Base(rag, v)
7
- else:
8
- self.__dict__[k] = v
9
-
10
- def to_json(self):
11
- pr = {}
12
- for name in dir(self):
13
- value = getattr(self, name)
14
- if not name.startswith('__') and not callable(value) and name != "rag":
15
- if isinstance(value, Base):
16
- pr[name] = value.to_json()
17
- else:
18
- pr[name] = value
19
- return pr
20
-
21
- def post(self, path, json=None, stream=False, files=None):
22
- res = self.rag.post(path, json, stream=stream,files=files)
23
- return res
24
-
25
- def get(self, path, params=None):
26
- res = self.rag.get(path, params)
27
- return res
28
-
29
- def rm(self, path, json):
30
- res = self.rag.delete(path, json)
31
- return res
32
-
33
- def put(self,path, json):
34
- res = self.rag.put(path,json)
35
- return res
36
-
37
- def __str__(self):
38
- return str(self.to_json())
 
1
+ class Base(object):
2
+ def __init__(self, rag, res_dict):
3
+ self.rag = rag
4
+ for k, v in res_dict.items():
5
+ if isinstance(v, dict):
6
+ self.__dict__[k] = Base(rag, v)
7
+ else:
8
+ self.__dict__[k] = v
9
+
10
+ def to_json(self):
11
+ pr = {}
12
+ for name in dir(self):
13
+ value = getattr(self, name)
14
+ if not name.startswith('__') and not callable(value) and name != "rag":
15
+ if isinstance(value, Base):
16
+ pr[name] = value.to_json()
17
+ else:
18
+ pr[name] = value
19
+ return pr
20
+
21
+ def post(self, path, json=None, stream=False, files=None):
22
+ res = self.rag.post(path, json, stream=stream,files=files)
23
+ return res
24
+
25
+ def get(self, path, params=None):
26
+ res = self.rag.get(path, params)
27
+ return res
28
+
29
+ def rm(self, path, json):
30
+ res = self.rag.delete(path, json)
31
+ return res
32
+
33
+ def put(self,path, json):
34
+ res = self.rag.put(path,json)
35
+ return res
36
+
37
+ def __str__(self):
38
+ return str(self.to_json())
sdk/python/ragflow_sdk/modules/session.py CHANGED
@@ -1,73 +1,73 @@
1
- import json
2
-
3
- from .base import Base
4
-
5
-
6
- class Session(Base):
7
- def __init__(self, rag, res_dict):
8
- self.id = None
9
- self.name = "New session"
10
- self.messages = [{"role": "assistant", "content": "Hi! I am your assistant,can I help you?"}]
11
- for key,value in res_dict.items():
12
- if key =="chat_id" and value is not None:
13
- self.chat_id = None
14
- self.__session_type = "chat"
15
- if key == "agent_id" and value is not None:
16
- self.agent_id = None
17
- self.__session_type = "agent"
18
- super().__init__(rag, res_dict)
19
-
20
- def ask(self, question="",stream=True,**kwargs):
21
- if self.__session_type == "agent":
22
- res=self._ask_agent(question,stream)
23
- elif self.__session_type == "chat":
24
- res=self._ask_chat(question,stream,**kwargs)
25
- for line in res.iter_lines():
26
- line = line.decode("utf-8")
27
- if line.startswith("{"):
28
- json_data = json.loads(line)
29
- raise Exception(json_data["message"])
30
- if not line.startswith("data:"):
31
- continue
32
- json_data = json.loads(line[5:])
33
- if json_data["data"] is True or json_data["data"].get("running_status"):
34
- continue
35
- answer = json_data["data"]["answer"]
36
- reference = json_data["data"].get("reference", {})
37
- temp_dict = {
38
- "content": answer,
39
- "role": "assistant"
40
- }
41
- if reference and "chunks" in reference:
42
- chunks = reference["chunks"]
43
- temp_dict["reference"] = chunks
44
- message = Message(self.rag, temp_dict)
45
- yield message
46
-
47
- def _ask_chat(self, question: str, stream: bool,**kwargs):
48
- json_data={"question": question, "stream": True,"session_id":self.id}
49
- json_data.update(kwargs)
50
- res = self.post(f"/chats/{self.chat_id}/completions",
51
- json_data, stream=stream)
52
- return res
53
-
54
- def _ask_agent(self,question:str,stream:bool):
55
- res = self.post(f"/agents/{self.agent_id}/completions",
56
- {"question": question, "stream": True,"session_id":self.id}, stream=stream)
57
- return res
58
-
59
- def update(self,update_message):
60
- res = self.put(f"/chats/{self.chat_id}/sessions/{self.id}",
61
- update_message)
62
- res = res.json()
63
- if res.get("code") != 0:
64
- raise Exception(res.get("message"))
65
-
66
- class Message(Base):
67
- def __init__(self, rag, res_dict):
68
- self.content = "Hi! I am your assistant,can I help you?"
69
- self.reference = None
70
- self.role = "assistant"
71
- self.prompt = None
72
- self.id = None
73
- super().__init__(rag, res_dict)
 
1
+ import json
2
+
3
+ from .base import Base
4
+
5
+
6
+ class Session(Base):
7
+ def __init__(self, rag, res_dict):
8
+ self.id = None
9
+ self.name = "New session"
10
+ self.messages = [{"role": "assistant", "content": "Hi! I am your assistant,can I help you?"}]
11
+ for key,value in res_dict.items():
12
+ if key =="chat_id" and value is not None:
13
+ self.chat_id = None
14
+ self.__session_type = "chat"
15
+ if key == "agent_id" and value is not None:
16
+ self.agent_id = None
17
+ self.__session_type = "agent"
18
+ super().__init__(rag, res_dict)
19
+
20
+ def ask(self, question="",stream=True,**kwargs):
21
+ if self.__session_type == "agent":
22
+ res=self._ask_agent(question,stream)
23
+ elif self.__session_type == "chat":
24
+ res=self._ask_chat(question,stream,**kwargs)
25
+ for line in res.iter_lines():
26
+ line = line.decode("utf-8")
27
+ if line.startswith("{"):
28
+ json_data = json.loads(line)
29
+ raise Exception(json_data["message"])
30
+ if not line.startswith("data:"):
31
+ continue
32
+ json_data = json.loads(line[5:])
33
+ if json_data["data"] is True or json_data["data"].get("running_status"):
34
+ continue
35
+ answer = json_data["data"]["answer"]
36
+ reference = json_data["data"].get("reference", {})
37
+ temp_dict = {
38
+ "content": answer,
39
+ "role": "assistant"
40
+ }
41
+ if reference and "chunks" in reference:
42
+ chunks = reference["chunks"]
43
+ temp_dict["reference"] = chunks
44
+ message = Message(self.rag, temp_dict)
45
+ yield message
46
+
47
+ def _ask_chat(self, question: str, stream: bool,**kwargs):
48
+ json_data={"question": question, "stream": True,"session_id":self.id}
49
+ json_data.update(kwargs)
50
+ res = self.post(f"/chats/{self.chat_id}/completions",
51
+ json_data, stream=stream)
52
+ return res
53
+
54
+ def _ask_agent(self,question:str,stream:bool):
55
+ res = self.post(f"/agents/{self.agent_id}/completions",
56
+ {"question": question, "stream": True,"session_id":self.id}, stream=stream)
57
+ return res
58
+
59
+ def update(self,update_message):
60
+ res = self.put(f"/chats/{self.chat_id}/sessions/{self.id}",
61
+ update_message)
62
+ res = res.json()
63
+ if res.get("code") != 0:
64
+ raise Exception(res.get("message"))
65
+
66
+ class Message(Base):
67
+ def __init__(self, rag, res_dict):
68
+ self.content = "Hi! I am your assistant,can I help you?"
69
+ self.reference = None
70
+ self.role = "assistant"
71
+ self.prompt = None
72
+ self.id = None
73
+ super().__init__(rag, res_dict)