pycoze 0.1.340__py3-none-any.whl → 0.1.342__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.
pycoze/bot/chat.py CHANGED
@@ -1,100 +1,130 @@
1
- import json
2
- from .chat_base import handle_user_inputs
3
- from .lib import get_abilities, get_system_prompt
4
- from .message import INPUT_MESSAGE, output, CHAT_DATA, clear_chat_data
5
- import os
6
- import asyncio
7
- from pycoze import utils
8
- import tempfile
9
-
10
-
11
- async def check_interrupt_file(interval, interrupt_file, chat_task):
12
- while True:
13
- await asyncio.sleep(interval)
14
- if os.path.exists(interrupt_file):
15
- os.remove(interrupt_file)
16
- chat_task.cancel()
17
- break
18
-
19
-
20
- async def run_with_interrupt_check(conversation_history, user_input, cwd: str, abilities, has_any_tool, bot_setting, interrupt_file):
21
- clear_chat_data()
22
- try:
23
- chat_task = asyncio.create_task(
24
- handle_user_inputs(conversation_history, user_input, cwd, abilities, has_any_tool, bot_setting)
25
- )
26
- check_task = asyncio.create_task(
27
- check_interrupt_file(0.5, interrupt_file, chat_task)
28
- )
29
- result = await chat_task
30
- return result
31
- except asyncio.CancelledError:
32
- return CHAT_DATA["info"]
33
- except Exception as e:
34
- import traceback
35
-
36
- print(traceback.format_exc())
37
- return None # 返回 None 或者处理异常后的结果
38
- finally:
39
- if not chat_task.done():
40
- chat_task.cancel()
41
- # 确保即使发生异常也会取消检查任务
42
- if not check_task.done():
43
- check_task.cancel()
44
- try:
45
- await check_task
46
- except asyncio.CancelledError:
47
- pass # 忽略取消错误
48
-
49
-
50
- def chat(bot_setting_file: str):
51
- with open(bot_setting_file, encoding="utf-8") as f:
52
- bot_setting = json.load(f)
53
- abilities = get_abilities(bot_setting)
54
- cwd = tempfile.mkdtemp()
55
- system_prompt, has_any_tool = get_system_prompt(abilities, bot_setting)
56
- conversation_history = [
57
- {
58
- "role": "system",
59
- "content": system_prompt,
60
- }
61
- ]
62
- while True:
63
- clear_chat_data()
64
- input_text = input()
65
- if not input_text.startswith(INPUT_MESSAGE):
66
- raise ValueError("Invalid message")
67
- message = json.loads(input_text[len(INPUT_MESSAGE) :])
68
- user_input = message["content"]
69
- params = utils.params
70
- if "interruptFile" in params:
71
- asyncio.run(
72
- run_with_interrupt_check(
73
- conversation_history, user_input, cwd, abilities, has_any_tool, bot_setting, params["interruptFile"]
74
- )
75
- )
76
- else:
77
- asyncio.run(
78
- handle_user_inputs(conversation_history, user_input, cwd, abilities, has_any_tool, bot_setting)
79
- )
80
-
81
- output("assistant", CHAT_DATA["info"])
82
-
83
-
84
- def get_chat_response(bot_setting_file: str, user_input: str):
85
- with open(bot_setting_file, encoding="utf-8") as f:
86
- bot_setting = json.load(f)
87
- abilities = get_abilities(bot_setting)
88
- cwd = tempfile.mkdtemp()
89
- system_prompt, has_any_tool = get_system_prompt(abilities, bot_setting)
90
- conversation_history = [
91
- {
92
- "role": "system",
93
- "content": system_prompt,
94
- }
95
- ]
96
- asyncio.run(
97
- handle_user_inputs(conversation_history, user_input, cwd, abilities, has_any_tool, bot_setting)
98
- )
99
-
100
- return CHAT_DATA["info"]
1
+ import json
2
+ from .chat_base import handle_user_inputs
3
+ from .lib import get_abilities, get_system_prompt
4
+ from .message import INPUT_MESSAGE, output, CHAT_DATA, clear_chat_data
5
+ import os
6
+ import asyncio
7
+ from pycoze import utils
8
+ import tempfile
9
+
10
+
11
+ async def check_interrupt_file(interval, interrupt_file, chat_task):
12
+ while True:
13
+ await asyncio.sleep(interval)
14
+ if os.path.exists(interrupt_file):
15
+ os.remove(interrupt_file)
16
+ chat_task.cancel()
17
+ break
18
+
19
+
20
+ async def run_with_interrupt_check(
21
+ conversation_history,
22
+ user_input,
23
+ cwd: str,
24
+ abilities,
25
+ has_any_tool,
26
+ bot_setting,
27
+ interrupt_file,
28
+ ):
29
+ clear_chat_data()
30
+ try:
31
+ chat_task = asyncio.create_task(
32
+ handle_user_inputs(
33
+ conversation_history,
34
+ user_input,
35
+ cwd,
36
+ abilities,
37
+ has_any_tool,
38
+ bot_setting,
39
+ )
40
+ )
41
+ check_task = asyncio.create_task(
42
+ check_interrupt_file(0.5, interrupt_file, chat_task)
43
+ )
44
+ result = await chat_task
45
+ return result
46
+ except asyncio.CancelledError:
47
+ return CHAT_DATA["info"]
48
+ except Exception as e:
49
+ import traceback
50
+
51
+ print(traceback.format_exc())
52
+ return None # 返回 None 或者处理异常后的结果
53
+ finally:
54
+ if not chat_task.done():
55
+ chat_task.cancel()
56
+ # 确保即使发生异常也会取消检查任务
57
+ if not check_task.done():
58
+ check_task.cancel()
59
+ try:
60
+ await check_task
61
+ except asyncio.CancelledError:
62
+ pass # 忽略取消错误
63
+
64
+
65
+ def chat(bot_setting_file: str):
66
+ with open(bot_setting_file, encoding="utf-8") as f:
67
+ bot_setting = json.load(f)
68
+ abilities = get_abilities(bot_setting)
69
+ cwd = tempfile.mkdtemp()
70
+ system_prompt, has_any_tool = get_system_prompt(abilities, bot_setting)
71
+ conversation_history = [
72
+ {
73
+ "role": "system",
74
+ "content": system_prompt,
75
+ }
76
+ ]
77
+ while True:
78
+ clear_chat_data()
79
+ input_text = input()
80
+ if not input_text.startswith(INPUT_MESSAGE):
81
+ raise ValueError("Invalid message")
82
+ message = json.loads(input_text[len(INPUT_MESSAGE) :])
83
+ user_input = message["content"]
84
+ params = utils.params
85
+ if "interruptFile" in params:
86
+ asyncio.run(
87
+ run_with_interrupt_check(
88
+ conversation_history,
89
+ user_input,
90
+ cwd,
91
+ abilities,
92
+ has_any_tool,
93
+ bot_setting,
94
+ params["interruptFile"],
95
+ )
96
+ )
97
+ else:
98
+ asyncio.run(
99
+ handle_user_inputs(
100
+ conversation_history,
101
+ user_input,
102
+ cwd,
103
+ abilities,
104
+ has_any_tool,
105
+ bot_setting,
106
+ )
107
+ )
108
+ print("has_output")
109
+ output("assistant", CHAT_DATA["info"])
110
+
111
+
112
+ def get_chat_response(bot_setting_file: str, user_input: str):
113
+ with open(bot_setting_file, encoding="utf-8") as f:
114
+ bot_setting = json.load(f)
115
+ abilities = get_abilities(bot_setting)
116
+ cwd = tempfile.mkdtemp()
117
+ system_prompt, has_any_tool = get_system_prompt(abilities, bot_setting)
118
+ conversation_history = [
119
+ {
120
+ "role": "system",
121
+ "content": system_prompt,
122
+ }
123
+ ]
124
+ asyncio.run(
125
+ handle_user_inputs(
126
+ conversation_history, user_input, cwd, abilities, has_any_tool, bot_setting
127
+ )
128
+ )
129
+
130
+ return CHAT_DATA["info"]
pycoze/bot/chat_base.py CHANGED
@@ -7,10 +7,13 @@ from .tools import ToolExecutor
7
7
  from typing import List
8
8
 
9
9
 
10
- def guess_files_in_message(cwd:str, user_message: str) -> List[str]:
10
+ def guess_files_in_message(cwd: str, user_message: str) -> List[str]:
11
11
 
12
- value = extract({"includedFiles": ['relative path format', 'relative path format', '...']},
13
- 'Please find the files mentioned in the text. If none, return {"includedFiles": []}:\n' + user_message)
12
+ value = extract(
13
+ {"includedFiles": ["relative path format", "relative path format", "..."]},
14
+ 'Please find the files mentioned in the text. If none, return {"includedFiles": []}:\n'
15
+ + user_message,
16
+ )
14
17
  return [resolve_relative_path(cwd, p) for p in value["includedFiles"]]
15
18
 
16
19
 
@@ -25,9 +28,15 @@ def user_task_prompt(conversation_history, cwd, user_input: str, programmer_mode
25
28
  if os.path.isfile(file_path):
26
29
  file_marker = f"[[{file_path}]]'"
27
30
  file_content = read_local_file(file_path)
28
- if not any(file_marker in msg["content"] for msg in conversation_history):
31
+ if not any(
32
+ file_marker in msg["content"] for msg in conversation_history
33
+ ):
29
34
  content.append(f"{file_marker}\n{file_content}")
30
- content_str = "Partial contents of files are as follows:" + "\n".join(content) if content else ""
35
+ content_str = (
36
+ "Partial contents of files are as follows:" + "\n".join(content)
37
+ if content
38
+ else ""
39
+ )
31
40
  return f"""
32
41
  <task>
33
42
  {user_input}
@@ -145,9 +154,11 @@ async def stream_openai_response(conversation_history, start_new_stream):
145
154
  yield ("text", text_content.strip())
146
155
 
147
156
 
148
- async def handle_user_inputs(conversation_history, user_input, cwd, abilities, has_any_tool, bot_setting):
149
- no_exit_if_incomplete = bot_setting["systemAbility"]['no_exit_if_incomplete']
150
- programmer_mode = bot_setting["systemAbility"]['programmer_mode']
157
+ async def handle_user_inputs(
158
+ conversation_history, user_input, cwd, abilities, has_any_tool, bot_setting
159
+ ):
160
+ no_exit_if_incomplete = bot_setting["systemAbility"]["no_exit_if_incomplete"]
161
+ programmer_mode = bot_setting["systemAbility"]["programmer_mode"]
151
162
 
152
163
  start_new_stream = {
153
164
  "value": False
@@ -160,7 +171,9 @@ async def handle_user_inputs(conversation_history, user_input, cwd, abilities, h
160
171
  conversation_history.append(
161
172
  {
162
173
  "role": "user",
163
- "content": user_task_prompt(conversation_history, cwd, user_input, programmer_mode),
174
+ "content": user_task_prompt(
175
+ conversation_history, cwd, user_input, programmer_mode
176
+ ),
164
177
  }
165
178
  )
166
179
  need_break = False
@@ -174,7 +187,11 @@ async def handle_user_inputs(conversation_history, user_input, cwd, abilities, h
174
187
  conversation_history, start_new_stream
175
188
  ):
176
189
  if len(response) == 2:
177
- if response[0] == "text" and response[1].strip() != "" or (response[0] == "json" and not has_any_tool):
190
+ if (
191
+ response[0] == "text"
192
+ and response[1].strip() != ""
193
+ or (response[0] == "json" and not has_any_tool)
194
+ ):
178
195
  conversation_history.append(
179
196
  {"role": "assistant", "content": response[1]}
180
197
  )
@@ -206,7 +223,9 @@ async def handle_user_inputs(conversation_history, user_input, cwd, abilities, h
206
223
  )
207
224
  continue
208
225
 
209
- ok, is_json_dumps, result = ToolExecutor.execute_tool(cwd, tool_request, abilities)
226
+ ok, is_json_dumps, result = ToolExecutor.execute_tool(
227
+ cwd, tool_request, abilities
228
+ )
210
229
  if ok:
211
230
  info("assistant", "✅\n")
212
231
  else:
@@ -218,13 +237,14 @@ async def handle_user_inputs(conversation_history, user_input, cwd, abilities, h
218
237
  + result
219
238
  )
220
239
  if is_json_dumps:
221
- info("assistant", "```json\n" + result + "\n```\n\n")
240
+ info("assistant", "\n```json\n" + result + "\n```\n\n")
222
241
  else:
223
- info("assistant", "```text\n" + result + "\n```\n\n")
242
+ info("assistant", "\n```text\n" + result + "\n```\n\n")
224
243
  conversation_history.append(
225
244
  {"role": "assistant", "content": assistant_content}
226
245
  )
227
- if tool_name in ["complete_all_tasks", 'ask_follow_up_question']:
246
+ if tool_name in ["complete_all_tasks", "ask_follow_up_question"]:
247
+ print("need_break", need_break)
228
248
  need_break = True
229
249
  break
230
250
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycoze
3
- Version: 0.1.340
3
+ Version: 0.1.342
4
4
  Summary: Package for pycoze only!
5
5
  Home-page: UNKNOWN
6
6
  Author: Yuan Jie Xiong
@@ -12,8 +12,8 @@ pycoze/api/lib/view.py,sha256=_PIpTfeuTPPlMDKshMGsqFQYMq7ZiO4Hg5XwHwDoU60,7357
12
12
  pycoze/api/lib/web.py,sha256=GWgtiTJOolKOX2drXcwuyqTcbo5FQVxa1NuBGcNyjyc,223
13
13
  pycoze/api/lib/window.py,sha256=bTkQCzQZ7i3pYXB70bUSTBNJ9C4TW_X3yMae1VkquGk,1944
14
14
  pycoze/bot/__init__.py,sha256=rL3Q-ycczRpSFfKn84fg3QBl5k22WpyeIU5qOEjEby8,79
15
- pycoze/bot/chat.py,sha256=s12X8iOZa8MK-5VUd9JfzIA-gLxY80FJfphcfEx3b_s,3414
16
- pycoze/bot/chat_base.py,sha256=7x1PhprjImWfzItm-1r3pwJyPEvXaQv8OKfqCPUwodw,9403
15
+ pycoze/bot/chat.py,sha256=DB0fUb4B0EVRWWEavCzIa-cSXOpiZrxIusJnQYGPKG8,3765
16
+ pycoze/bot/chat_base.py,sha256=d7rsp_E1woC8UFBsqPExicNfwMHAB0e50vsodL8ISGA,9722
17
17
  pycoze/bot/lib.py,sha256=smigeWuhl8esHE-Y5l_9bpjJkEJ5OqrxTyPcO8JIubM,7224
18
18
  pycoze/bot/message.py,sha256=Zq-_k8HztBMOUIs3hbOvWvwHBNopn4UJJBliCROIGcc,718
19
19
  pycoze/bot/prompt.md,sha256=OBxwUY6yiwEmusnUHhwixWYByrWX3BpwfxG_Gfas8UM,15783
@@ -33,8 +33,8 @@ pycoze/utils/arg.py,sha256=jop1tBfe5hYkHW1NSpCeaZBEznkgguBscj_7M2dWfrs,503
33
33
  pycoze/utils/env.py,sha256=5pWlXfM1F5ZU9hhv1rHlDEanjEW5wf0nbyez9bNRqqA,559
34
34
  pycoze/utils/socket.py,sha256=bZbFFRH4mfThzRqt55BAAGQ6eICx_ja4x8UGGrUdAm8,2428
35
35
  pycoze/utils/text_or_file.py,sha256=gpxZVWt2DW6YiEg_MnMuwg36VNf3TX383QD_1oZNB0Y,551
36
- pycoze-0.1.340.dist-info/LICENSE,sha256=QStd_Qsd0-kAam_-sOesCIp_uKrGWeoKwt9M49NVkNU,1090
37
- pycoze-0.1.340.dist-info/METADATA,sha256=kLgmkro5V7i3b8aqOjUUmVG0moAiUX8TVKcp3r_OXIU,755
38
- pycoze-0.1.340.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92
39
- pycoze-0.1.340.dist-info/top_level.txt,sha256=76dPeDhKvOCleL3ZC5gl1-y4vdS1tT_U1hxWVAn7sFo,7
40
- pycoze-0.1.340.dist-info/RECORD,,
36
+ pycoze-0.1.342.dist-info/LICENSE,sha256=QStd_Qsd0-kAam_-sOesCIp_uKrGWeoKwt9M49NVkNU,1090
37
+ pycoze-0.1.342.dist-info/METADATA,sha256=n0QSg_AqHoz9DnUvyQOYb6qErvMiKX1lcq4mAWjLfwo,755
38
+ pycoze-0.1.342.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92
39
+ pycoze-0.1.342.dist-info/top_level.txt,sha256=76dPeDhKvOCleL3ZC5gl1-y4vdS1tT_U1hxWVAn7sFo,7
40
+ pycoze-0.1.342.dist-info/RECORD,,