hjxdl 0.2.68__py3-none-any.whl → 0.2.70__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
hdl/_version.py CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.2.68'
16
- __version_tuple__ = version_tuple = (0, 2, 68)
15
+ __version__ = version = '0.2.70'
16
+ __version_tuple__ = version_tuple = (0, 2, 70)
@@ -5,20 +5,14 @@ TOOL_DESC = {
5
5
  ## 函数名:get_weather
6
6
  描述:用户询问一个城市的天气时,调用此工具获得此城市的天气信息
7
7
  参数:
8
- # city (str): 城市名
8
+ - city (str): 城市名
9
9
  返回值 (str):天气信息
10
10
  """,
11
- "json": """
12
- 需要返回的json
13
- {
14
- "function_name": "get_weather",
15
- "params":
16
- {
17
- "city": <city_name>
18
- }
19
- }
20
-
21
- """
11
+ "md": """
12
+ 需要返回的markdown:
13
+ - function_name: get_weather
14
+ - city: <city_name>
15
+ """
22
16
  },
23
17
 
24
18
  "get_datetime_by_cityname": {
@@ -26,19 +20,14 @@ TOOL_DESC = {
26
20
  ## 函数名:get_datetime_by_cityname
27
21
  描述:用户询问一个城市当前的日期或时间时,调用此工具可以获得此城市当前的日期和时间
28
22
  参数:
29
- # city (str): 城市名
23
+ - city (str): 城市名
30
24
  返回值 (str):这个城市当前所在时区的日期和时间
31
25
  """,
32
- "json": """
33
- 需要给出的json
34
- {
35
- "function_name": "get_datetime_by_cityname",
36
- "params":
37
- {
38
- "city": <city_name>
39
- }
40
- }
41
- """
26
+ "md": """
27
+ 需要给出的markdown:
28
+ - function_name: get_datetime_by_cityname
29
+ - city: <city_name>
30
+ """
42
31
  },
43
32
 
44
33
  "execute_code": {
@@ -46,19 +35,14 @@ TOOL_DESC = {
46
35
  ## 函数名:execute_code,
47
36
  描述:当用户明确要求执行一段代码时,调用此工具,执行这段代码,返回执行结果。
48
37
  参数:
49
- # code (str): 用户要求执行的代码
38
+ - code (str): 用户要求执行的代码
50
39
  返回值 (str): 执行结果
51
40
  """,
52
- "json": """
53
- 需要返回的json
54
- {
55
- "function_name": "execute_code",
56
- "params":
57
- {
58
- "code": <code>
59
- }
60
- }
61
- """
41
+ "md": """
42
+ 需要返回的markdown
43
+ - function_name: execute_code
44
+ - code: <code>
45
+ """
62
46
  },
63
47
 
64
48
  "calculate": {
@@ -66,19 +50,14 @@ TOOL_DESC = {
66
50
  ## 函数名:calculate,
67
51
  描述:当需要计算一个直接的在 python 中可交互的数据学算式,调用此工具,计算这个表达式,返回计算结果。
68
52
  参数:
69
- # expression (str): 用户要求的数学表达式
53
+ - expression (str): 用户要求的数学表达式
70
54
  返回值 (str): 计算结果
71
55
  """,
72
- "json": """
73
- 需要返回的json
74
- {
75
- "function_name": "calculate",
76
- "params":
77
- {
78
- "expression": <expression>
79
- }
80
- }
81
- """
56
+ "md": """
57
+ 需要返回的markdown
58
+ - function_name: calculate
59
+ - expression: <expression>
60
+ """
82
61
  },
83
62
 
84
63
  "fetch_baidu_results": {
@@ -86,21 +65,16 @@ TOOL_DESC = {
86
65
  ## 函数名:fetch_baidu_results,
87
66
  描述:在用户提的问题需要联网搜索才能得到结果或者问题中有联网搜索的需求时,调用此工具,返回查询结果。
88
67
  参数:
89
- # query (str): 用户要求的查询内容
90
- # max_n_links (int, optional): 搜索条目的最大数目,若用户指定了数目,则使用用户指定的数目,若用户提问中没有指定,你需要在下面的json中"max_n_links"这一项指定为数值3。
68
+ - query (str): 用户要求的查询内容
69
+ - max_n_links (int, optional): 搜索条目的最大数目,若用户指定了数目,则使用用户指定的数目,默认数值为3。
91
70
  返回值 (str): 联网搜索到的信息
92
71
  """,
93
- "json": """
94
- 需要返回的json
95
- {
96
- "function_name": "fetch_baidu_results",
97
- "params":
98
- {
99
- "query": <query from user question>,
100
- "max_n_links": <num of max results, 如果用户没有要求,这一项则指定为3>
101
- }
102
- }
103
- """
72
+ "md": """
73
+ 需要返回的markdown
74
+ - function_name: fetch_baidu_results
75
+ - query: <query from user question>
76
+ - max_n_links: <num of max results, 如果用户没有要求,这一项则指定为3>
77
+ """
104
78
  },
105
79
 
106
80
  "wolfram_alpha_calculate": {
@@ -108,19 +82,14 @@ TOOL_DESC = {
108
82
  ## 函数名:wolfram_alpha_calculate
109
83
  描述:当用户要求计算一个明确用数学语言描述的表达式时,调用此工具,返回计算结果。注意不能描述物理、化学、应用题等非数学表达式。
110
84
  参数:
111
- # query (str): 用户要求的数学表达式,需要转换为英文,比如"integrate sin(x)"
85
+ - query (str): 用户要求的数学表达式,需要转换为英文,比如"integrate sin(x)"
112
86
  返回值 (str): 计算结果
113
87
  """,
114
- "json": """
115
- 需要返回的json
116
- {
117
- "function_name": "wolfram_alpha_calculate",
118
- "params":
119
- {
120
- "query": <expression>
121
- }
122
- }
123
- """
88
+ "md": """
89
+ 需要返回的markdown:
90
+ - function_name: wolfram_alpha_calculate
91
+ - query: <expression>
92
+ """
124
93
  },
125
94
 
126
95
  "count_character_occurrences": {
@@ -128,20 +97,15 @@ TOOL_DESC = {
128
97
  ## 函数名:count_character_occurrences
129
98
  描述:当用户要求计算一段文本中某个字符出现的次数时,调用此工具,返回计算结果。
130
99
  参数:
131
- # text (str): 输入的单词或句子
132
- # char (str): 要统计的字符
100
+ - text (str): 输入的单词或句子
101
+ - char (str): 要统计的字符
133
102
  返回值 (str): 字符在文本中出现的次数
134
103
  """,
135
- "json": """
136
- 需要返回的json
137
- {
138
- "function_name": "count_character_occurrences",
139
- "params":
140
- {
141
- "text": <str>,
142
- "char": <str>
143
- }
144
- }
104
+ "md": """
105
+ 需要返回的markdown:
106
+ - function_name: count_character_occurrences
107
+ - text: <str>
108
+ - char: <str>
145
109
  """
146
110
  },
147
111
 
@@ -1,18 +1,17 @@
1
1
  FN_TEMPLATE = """
2
2
 
3
3
  你是一个可以调用函数来执行任务的人工智能助手,根据用户最后的问题来决定是否调用函数
4
- 你的回答格式是固定的:若要调用函数,需要使用包含两个字段的JSON对象进行响应,并且不应包含其他多余文字,避免出现格式化问题:
4
+ 你的回答格式是固定的:若要调用函数,需要使用包含如下信息 markdown 进行响应,并且不应包含其他多余文字,避免出现格式化问题:
5
5
 
6
- "function_name":需要要调用的函数的名称。
7
- "params":函数所需的参数,一般为字符串,注意字符串要在双引号 "" 之间。
6
+ - function_name: 需要要调用的函数的名称。
7
+ - <param1>: 函数所需的参数1,<>中为具体的参数名。
8
+ - <param2>: 函数所需的参数2,后面更多的参数也依照同样的规则。
8
9
 
9
- 若不需要调用函数,或没达到如下函数的触发条件时,则返回如下的json,并且不应包含其他多余文字,避免出现格式化问题:
10
- {
11
- "function_name": null
12
- }
10
+ 若不需要调用函数,或没达到如下函数的触发条件时,则返回如下的 markdown 字符串,并且不应包含其他多余文字,避免出现格式化问题:
11
+ - function_name: None
13
12
 
14
13
  ### 函数:
15
- 以下是可用于与系统交互的函数列表,每个函数以 “##” 作为标记开始,并带有“触发条件”说明,每个参数名会以 “#” 作为标记。
14
+ 以下是可用于与系统交互的函数列表,每个函数以 “##” 作为标记开始,并带有“触发条件”说明,每个参数名会以 “-” 作为标记。
16
15
  每个函数都有特定的参数和要求说明,确保仔细遵循每个功能的说明。根据最后用户的问题和函数的触发条件判断要执行的任务选择合适的一个函数。请严格遵守每个函数的触发条件,以说明中的JSON格式提供函数调用所需要的参数,其中参数的具体值从用户的提问中获取,并且不能带“<>”符号:
17
16
 
18
17
  """
@@ -20,9 +19,22 @@ FN_TEMPLATE = """
20
19
  COT_TEMPLATE = """
21
20
  你是一个专家级AI助手,有能针对一个问题和当前解决到的步骤给出下一步该进行操作的能力。
22
21
  以JSON格式回复,该步骤对应的 json 包括'title'、'tool', 'content'和'stop_thinking',
23
- 若已有的信息可以回答用户问题,则'stop_thinking'键的值为 true 并把答案写在'content'键的值中,若还需要下一步操作,'stop_thinking'键的则为 false 并在 'title' 键对应的值中给出该进行的操作;
22
+ 若已有的信息不合理或者针对用户的问题提供的信息有错误,则'stop_thinking'键的值为 false 并且继续思考过程。
23
+ 若还需要下一步操作,'stop_thinking'键的则为 false 并在 'title' 键对应的值中给出该进行的操作;
24
+ 若已有的信息足够回答用户问题,则'stop_thinking'键的值为 true 并把答案写在'content'键的值中。
24
25
  若本步骤的操作不需要调用下文中提到的工具或信息足够回答用户问题,而不必包含'tool'键,若需要调用下文中的工具,则必须包含'tool'键,并且其值是工具函数名称。
25
26
  你的回答中应只能是 json 格式,且不能包含其他多余文字不能有格式错误。
26
27
 
28
+ 你是一个专家级 AI 助手,有能力针对一个问题和当前解决到的步骤,给出下一步的操作建议。
29
+
30
+ 以 Markdown 格式回复,该步骤对应的 Markdown 包括以下部分:
31
+ ## <title> 用二级标题(##)标记步骤名称,且不包含<>组合符号。
32
+ - tool<可选>: <若需要调用工具,列出工具名称;如果不需要,则忽略该部分>
33
+ - content: <描述详细内容或答案>
34
+ - stop_thinking: <true/false>
35
+ 若已有的信息不合理或者针对用户的问题提供的信息有错误,则需要进一步思考,并说明原因。若还需要下一步操作,给出具体建议。
36
+ 若已有的信息足够回答用户问题,则直接回答用户问题。
37
+
38
+ 你的回答中应只能是 Markdown 格式,且不能包含其他多余文字或格式错误。
27
39
  以下是可用的工具:
28
40
  """
hdl/utils/llm/chat.py CHANGED
@@ -4,6 +4,7 @@ import os
4
4
  from concurrent.futures import ProcessPoolExecutor
5
5
  import subprocess
6
6
  from typing import Generator
7
+ import re
7
8
 
8
9
 
9
10
  from openai import OpenAI
@@ -12,6 +13,53 @@ from ..desc.func_desc import TOOL_DESC
12
13
  import json
13
14
  # import traceback
14
15
 
16
+ def parse_fn_markdown(markdown_text, params_key="params"):
17
+ lines = markdown_text.strip().split("\n")
18
+ result = {}
19
+ params = {}
20
+
21
+ for line in lines:
22
+ # 使用正则提取 key 和 value
23
+ match = re.match(r"-\s*(\w+):\s*(.+)", line.strip())
24
+ if match:
25
+ key, value = match.groups()
26
+ if key == "function_name":
27
+ result[key] = value # 固定的 function_name
28
+ else:
29
+ params[key] = value # 其他的进入 params(或替代键名)
30
+
31
+ # 将提取的参数嵌套到指定的键名下
32
+ result[params_key] = params
33
+ return result
34
+
35
+ def parse_cot_markdown(markdown_text):
36
+ # 提取标题
37
+ title_match = re.search(r"##\s*(.+)", markdown_text)
38
+ title = title_match.group(1) if title_match else None
39
+ title = title.replace(":", "").replace(":", "").replace(" ", "")
40
+
41
+ # 提取工具
42
+ tool_match = re.search(r"tool\s*(.+)", markdown_text)
43
+ tool = tool_match.group(1) if tool_match else None
44
+ tool = tool.replace(":", "").replace(":", "").replace(" ", "")
45
+
46
+ # 提取内容
47
+ content_match = re.search(r"content\s*(.+)", markdown_text)
48
+ content = content_match.group(1) if content_match else None
49
+ content = content.replace(":", "").replace(":", "").replace(" ", "")
50
+
51
+ # 提取停止思考
52
+ stop_thinking_match = re.search(r"stop_thinking\s*(.+)", markdown_text)
53
+ stop_thinking = stop_thinking_match.group(1) == "true" or stop_thinking_match.group(1) == "True" if stop_thinking_match else None
54
+
55
+
56
+ # 组装为字典
57
+ return {
58
+ "title": title,
59
+ "tool": tool,
60
+ "content": content,
61
+ "stop_thinking": stop_thinking
62
+ }
15
63
 
16
64
  def chat_oai_stream(
17
65
  base_url="http://127.0.0.1:8000/v1",
@@ -202,7 +250,7 @@ class OpenAI_M():
202
250
 
203
251
  try:
204
252
  # 将思考结果解析为JSON格式,以便后续处理
205
- step_json = json.loads(resp)
253
+ step_json = parse_cot_markdown(resp)
206
254
  # print(step_json)
207
255
  # 将当前思考步骤添加到步骤列表中
208
256
  steps.append(step_json)
@@ -473,7 +521,8 @@ class OpenAI_M():
473
521
  **kwargs
474
522
  )
475
523
  try:
476
- decision_dict = json.loads(decision_dict_str)
524
+ decision_dict = parse_fn_markdown(decision_dict_str)
525
+ # decision_dict = json.loads(decision_dict_str)
477
526
  except Exception as e:
478
527
  print(e)
479
528
  return ""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hjxdl
3
- Version: 0.2.68
3
+ Version: 0.2.70
4
4
  Summary: A collection of functions for Jupyter notebooks
5
5
  Home-page: https://github.com/huluxiaohuowa/hdl
6
6
  Author: Jianxing Hu
@@ -1,5 +1,5 @@
1
1
  hdl/__init__.py,sha256=GffnD0jLJdhkd-vo989v40N90sQbofkayRBwxc6TVhQ,72
2
- hdl/_version.py,sha256=TD22ilmsCxAfrwjbRrqwKGfjPxJbditO0KzSuHXXUJU,413
2
+ hdl/_version.py,sha256=LRulaxMCVBJJM9jsOgQlfsrR1gcTZooiLo_gZ7p0U70,413
3
3
  hdl/args/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  hdl/args/loss_args.py,sha256=s7YzSdd7IjD24rZvvOrxLLFqMZQb9YylxKeyelSdrTk,70
5
5
  hdl/controllers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -122,13 +122,13 @@ hdl/utils/database_tools/connect.py,sha256=xCacGucKxlQUXs6AsNddpeECvdqT1180V1ZWq
122
122
  hdl/utils/database_tools/datetime.py,sha256=xqE2xNiOpADzX-R8_bM0bioJRF3Ay9Jp1CAG6dy6uVI,1202
123
123
  hdl/utils/database_tools/web.py,sha256=PJ7R1chUD-vz-Up0orfFqdrZq3CFOlwiO9gIjFSb-R8,5224
124
124
  hdl/utils/desc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
- hdl/utils/desc/func_desc.py,sha256=DDbcLIW-2Hk_WSRg2NO8PF7S338PmbssGcjvMa_P8Dk,3905
126
- hdl/utils/desc/template.py,sha256=WcoyRDfLzYCwhV9MGnisjdjAeiFr0z8iZ7dSrol7Je0,2121
125
+ hdl/utils/desc/func_desc.py,sha256=DPcYH1xDSlY5kkxzyE3a1QK0s71P2Hrn52vLd9j-q-I,3362
126
+ hdl/utils/desc/template.py,sha256=3DlJK4-n3_nDrK8hO6XHyNmwmMeKHwxb9dqzOxUC8uM,3137
127
127
  hdl/utils/general/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
128
  hdl/utils/general/glob.py,sha256=8-RCnt6L297wMIfn34ZAMCsGCZUjHG3MGglGZI1cX0g,491
129
129
  hdl/utils/general/runners.py,sha256=EFTk9PeVnqc51yU4b-HxsLwJyMA7dFMZBsdAa-VZ-sQ,2880
130
130
  hdl/utils/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
- hdl/utils/llm/chat.py,sha256=f4hxeZG9stwO9pmlCW6ki-R3V-NOCJF7dgn0mTHCeCo,20126
131
+ hdl/utils/llm/chat.py,sha256=4waDVnCFesL2tO0SC7D1padknwFywd8J-v3KmmatmJ8,21902
132
132
  hdl/utils/llm/chatgr.py,sha256=A9SCWAvQulgO2x0ArIqcmgd_iVWVbSi1Oj15Diwb3Ok,3743
133
133
  hdl/utils/llm/embs.py,sha256=Tf0FOYrOFZp7qQpEPiSCXzlgyHH0X9HVTUtsup74a9E,7174
134
134
  hdl/utils/llm/extract.py,sha256=2sK_WJzmYIc8iuWaM9DA6Nw3_6q1O4lJ5pKpcZo-bBA,6512
@@ -139,7 +139,7 @@ hdl/utils/schedulers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
139
139
  hdl/utils/schedulers/norm_lr.py,sha256=bDwCmdEK-WkgxQMFBiMuchv8Mm7C0-GZJ6usm-PQk14,4461
140
140
  hdl/utils/weather/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
141
  hdl/utils/weather/weather.py,sha256=k11o6wM15kF8b9NMlEfrg68ak-SfSYLN3nOOflFUv-I,4381
142
- hjxdl-0.2.68.dist-info/METADATA,sha256=xa-GC1TfYXJAhm-MPNwACg6tvOYfGxMHw71alslSNZk,836
143
- hjxdl-0.2.68.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
144
- hjxdl-0.2.68.dist-info/top_level.txt,sha256=-kxwTM5JPhylp06z3zAVO3w6_h7wtBfBo2zgM6YZoTk,4
145
- hjxdl-0.2.68.dist-info/RECORD,,
142
+ hjxdl-0.2.70.dist-info/METADATA,sha256=CE8I8hb5F7ETz8ba9kVF2ZmnoV8KG3Zogd-a-PpMB_E,836
143
+ hjxdl-0.2.70.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
144
+ hjxdl-0.2.70.dist-info/top_level.txt,sha256=-kxwTM5JPhylp06z3zAVO3w6_h7wtBfBo2zgM6YZoTk,4
145
+ hjxdl-0.2.70.dist-info/RECORD,,
File without changes