pycoze 0.1.199__tar.gz → 0.1.201__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. {pycoze-0.1.199 → pycoze-0.1.201}/PKG-INFO +1 -1
  2. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/bot/agent/agent.py +1 -0
  3. pycoze-0.1.201/pycoze/bot/bot.py +107 -0
  4. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze.egg-info/PKG-INFO +1 -1
  5. {pycoze-0.1.199 → pycoze-0.1.201}/setup.py +1 -1
  6. pycoze-0.1.199/pycoze/bot/bot.py +0 -86
  7. {pycoze-0.1.199 → pycoze-0.1.201}/LICENSE +0 -0
  8. {pycoze-0.1.199 → pycoze-0.1.201}/README.md +0 -0
  9. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/__init__.py +0 -0
  10. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/ai/__init__.py +0 -0
  11. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/ai/vram_reserve.py +0 -0
  12. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/automation/__init__.py +0 -0
  13. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/automation/browser/__init__.py +0 -0
  14. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/automation/browser/edge_driver_manager.py +0 -0
  15. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/bot/__init__.py +0 -0
  16. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/bot/agent/__init__.py +0 -0
  17. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/bot/agent/agent_types/__init__.py +0 -0
  18. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/bot/agent/agent_types/const.py +0 -0
  19. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/bot/agent/agent_types/openai_func_call_agent.py +0 -0
  20. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/bot/agent/assistant.py +0 -0
  21. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/bot/agent/chat.py +0 -0
  22. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/bot/agent_chat.py +0 -0
  23. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/reference/__init__.py +0 -0
  24. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/reference/bot.py +0 -0
  25. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/reference/lib.py +0 -0
  26. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/reference/tool.py +0 -0
  27. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/reference/workflow.py +0 -0
  28. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/ui/__init__.py +0 -0
  29. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/ui/base.py +0 -0
  30. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/ui/color.py +0 -0
  31. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/ui/typ.py +0 -0
  32. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/ui/ui_def.py +0 -0
  33. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/utils/__init__.py +0 -0
  34. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/utils/arg.py +0 -0
  35. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/utils/env.py +0 -0
  36. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze/utils/text_or_file.py +0 -0
  37. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze.egg-info/SOURCES.txt +0 -0
  38. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze.egg-info/dependency_links.txt +0 -0
  39. {pycoze-0.1.199 → pycoze-0.1.201}/pycoze.egg-info/top_level.txt +0 -0
  40. {pycoze-0.1.199 → pycoze-0.1.201}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycoze
3
- Version: 0.1.199
3
+ Version: 0.1.201
4
4
  Summary: Package for pycoze only!
5
5
  Author: Yuan Jie Xiong
6
6
  Author-email: aiqqqqqqq@qq.com
@@ -70,6 +70,7 @@ async def run_agent(agent, inputs: list, tool_compatibility_mode: bool, should_e
70
70
 
71
71
  if __name__ == "__main__":
72
72
  from langchain_experimental.tools import PythonREPLTool
73
+ import threading
73
74
 
74
75
  llm_file = r"C:\Users\aiqqq\AppData\Roaming\pycoze\JsonStorage\llm.json"
75
76
  with open(llm_file, "r", encoding="utf-8") as f:
@@ -0,0 +1,107 @@
1
+ from langchain_core.messages import HumanMessage, AIMessage
2
+ from .agent import INPUT_MESSAGE, INTERRUPT_MESSAGE, output, CHAT_DATA, clear_chat_data
3
+ from .agent_chat import agent_chat
4
+ import json
5
+ import threading
6
+ import queue
7
+ import time
8
+ import asyncio
9
+ import multiprocessing
10
+ from multiprocessing import Queue, Event
11
+
12
+ # 假设 PeekableQueue 类已经定义好了,如果没有,请自行实现或使用其他方式
13
+ class PeekableQueue:
14
+ def __init__(self, maxsize=0):
15
+ self.queue = Queue(maxsize=maxsize)
16
+
17
+ def put(self, item):
18
+ self.queue.put(item)
19
+
20
+ def get(self):
21
+ return self.queue.get()
22
+
23
+ def peek(self):
24
+ with self.queue.mutex:
25
+ if self.queue.empty():
26
+ return None
27
+ return self.queue.queue[0]
28
+
29
+ def empty(self):
30
+ return self.queue.empty()
31
+
32
+ def input_process(input_queue: Queue, interrupt_event: Event):
33
+ while not interrupt_event.is_set():
34
+ input_text = input()
35
+ if input_text == INTERRUPT_MESSAGE or input_text.startswith(INPUT_MESSAGE):
36
+ input_queue.put(input_text)
37
+ else:
38
+ raise ValueError("Invalid message")
39
+
40
+ async def handle_input_queue(input_queue: Queue, should_exit: asyncio.Event, history):
41
+ while not should_exit.is_set():
42
+ try:
43
+ next_input_text = input_queue.get_nowait()
44
+ if next_input_text == INTERRUPT_MESSAGE:
45
+ history.append(AIMessage(content=CHAT_DATA["info"]))
46
+ should_exit.set() # 设置退出标志
47
+ break
48
+ except queue.Empty:
49
+ pass
50
+ await asyncio.sleep(0.1) # 非阻塞地等待一段时间
51
+
52
+ def chat(bot_setting_file: str):
53
+ history = []
54
+ input_queue = PeekableQueue()
55
+ interrupt_event = Event() # 用于中断输入进程的事件
56
+
57
+ # 创建并启动输入进程
58
+ input_process_instance = multiprocessing.Process(target=input_process, args=(input_queue, interrupt_event))
59
+ input_process_instance.start()
60
+
61
+ try:
62
+ loop = asyncio.new_event_loop()
63
+ asyncio.set_event_loop(loop)
64
+
65
+ while True:
66
+ if not input_queue.empty():
67
+ input_text = input_queue.get()
68
+ if input_text == INTERRUPT_MESSAGE:
69
+ continue
70
+ try:
71
+ message = json.loads(input_text[len(INPUT_MESSAGE):])
72
+ history.append(HumanMessage(message["content"]))
73
+ clear_chat_data()
74
+
75
+ # 创建一个 Event 对象用于中断
76
+ should_exit = asyncio.Event()
77
+
78
+ # 并发运行 agent_chat 和 handle_input_queue
79
+ agent_chat_task = loop.create_task(agent_chat(bot_setting_file, history, should_exit))
80
+ input_handler_task = loop.create_task(handle_input_queue(input_queue, should_exit, history))
81
+
82
+ # 运行所有任务
83
+ loop.run_until_complete(asyncio.gather(agent_chat_task, input_handler_task))
84
+
85
+ # 如果没有中断,则添加 AI 的响应到历史记录
86
+ if not should_exit.is_set():
87
+ history.append(AIMessage(content=CHAT_DATA["output"]))
88
+
89
+ except json.JSONDecodeError:
90
+ print("Invalid JSON format in input message.")
91
+ except KeyError:
92
+ print("Missing 'content' key in input message.")
93
+ except Exception as e:
94
+ print(f"An error occurred: {e}")
95
+ finally:
96
+ # 设置中断事件以停止输入进程
97
+ interrupt_event.set()
98
+ input_process_instance.join()
99
+
100
+
101
+
102
+ def get_chat_response(bot_setting_file: str, input_text: str):
103
+ history = [HumanMessage(input_text)]
104
+ clear_chat_data()
105
+ should_exit = threading.Event()
106
+ asyncio.run(agent_chat(bot_setting_file, history, should_exit))
107
+ return CHAT_DATA["output"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycoze
3
- Version: 0.1.199
3
+ Version: 0.1.201
4
4
  Summary: Package for pycoze only!
5
5
  Author: Yuan Jie Xiong
6
6
  Author-email: aiqqqqqqq@qq.com
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name="pycoze",
5
- version="0.1.199",
5
+ version="0.1.201",
6
6
  packages=find_packages(),
7
7
  install_requires=[],
8
8
  author="Yuan Jie Xiong",
@@ -1,86 +0,0 @@
1
- from langchain_core.messages import HumanMessage, AIMessage
2
- from .agent import INPUT_MESSAGE, INTERRUPT_MESSAGE, output, CHAT_DATA, clear_chat_data
3
- from .agent_chat import agent_chat
4
- import json
5
- import threading
6
- import queue
7
- import time
8
- import asyncio
9
- import multiprocessing
10
-
11
-
12
- class PeekableQueue(queue.Queue):
13
- def peek(self):
14
- try:
15
- return self._get()
16
- except queue.Empty:
17
- return None
18
-
19
-
20
- def run_agent_chat(bot_setting_file, history, should_exit):
21
- loop = asyncio.new_event_loop()
22
- asyncio.set_event_loop(loop)
23
- loop.run_until_complete(agent_chat(bot_setting_file, history, should_exit))
24
- loop.close()
25
-
26
-
27
- def chat(bot_setting_file: str):
28
- history = []
29
- input_queue = PeekableQueue()
30
-
31
- def input_thread(input_queue: PeekableQueue):
32
- while True:
33
- input_text = input()
34
- if input_text == INTERRUPT_MESSAGE or input_text.startswith(INPUT_MESSAGE):
35
- input_queue.put(input_text)
36
- else:
37
- raise ValueError("Invalid message")
38
-
39
-
40
- input_thread_instance = threading.Thread(target=input_thread, args=(input_queue,))
41
- input_thread_instance.start()
42
-
43
- try:
44
- while True:
45
- if not input_queue.empty():
46
- input_text = input_queue.get()
47
- if input_text == INTERRUPT_MESSAGE:
48
- continue
49
- try:
50
- message = json.loads(input_text[len(INPUT_MESSAGE):])
51
- history.append(HumanMessage(message["content"]))
52
- clear_chat_data()
53
-
54
- # 创建进程退出标志
55
- should_exit = multiprocessing.Event()
56
- agent_chat_process = multiprocessing.Process(target=run_agent_chat, args=(bot_setting_file, history, should_exit)) # 需要是独立进程,不然无法创建新进程
57
- agent_chat_process.start()
58
-
59
- next_input_text = ""
60
- while agent_chat_process.is_alive():
61
- if not input_queue.empty():
62
- next_input_text = input_queue.peek()
63
- if next_input_text == INTERRUPT_MESSAGE:
64
- history.append(AIMessage(content=CHAT_DATA["info"]))
65
- should_exit.set() # 设置退出标志
66
- break
67
- time.sleep(0.1) # 每隔 0.1 秒检查一次
68
- if next_input_text != INTERRUPT_MESSAGE:
69
- history.append(AIMessage(content=CHAT_DATA["output"]))
70
- except json.JSONDecodeError:
71
- print("Invalid JSON format in input message.")
72
- except KeyError:
73
- print("Missing 'content' key in input message.")
74
- except Exception as e:
75
- print(f"An error occurred: {e}")
76
- finally:
77
- input_thread_instance.join()
78
-
79
-
80
-
81
- def get_chat_response(bot_setting_file: str, input_text: str):
82
- history = [HumanMessage(input_text)]
83
- clear_chat_data()
84
- should_exit = multiprocessing.Event()
85
- asyncio.run(agent_chat(bot_setting_file, history, should_exit))
86
- return CHAT_DATA["output"]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes