xiaogpt 1.80__py3-none-any.whl → 1.81__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.
xiaogpt/bot/bard_bot.py CHANGED
@@ -1,14 +1,15 @@
1
1
  """ChatGLM bot"""
2
2
  from __future__ import annotations
3
+
3
4
  from typing import Any
4
5
 
5
6
  from bardapi import BardAsync
6
7
  from rich import print
7
8
 
8
- from xiaogpt.bot.base_bot import BaseBot
9
+ from xiaogpt.bot.base_bot import BaseBot, ChatHistoryMixin
9
10
 
10
11
 
11
- class BardBot(BaseBot):
12
+ class BardBot(ChatHistoryMixin, BaseBot):
12
13
  def __init__(
13
14
  self,
14
15
  bard_token: str,
xiaogpt/bot/base_bot.py CHANGED
@@ -9,8 +9,6 @@ T = TypeVar("T", bound="BaseBot")
9
9
 
10
10
 
11
11
  class BaseBot(ABC):
12
- history: list
13
-
14
12
  @abstractmethod
15
13
  async def ask(self, query: str, **options: Any) -> str:
16
14
  pass
@@ -23,3 +21,36 @@ class BaseBot(ABC):
23
21
  @abstractmethod
24
22
  def from_config(cls: type[T], config: Config) -> T:
25
23
  pass
24
+
25
+ @abstractmethod
26
+ def has_history(self) -> bool:
27
+ pass
28
+
29
+ @abstractmethod
30
+ def change_prompt(self, new_prompt: str) -> None:
31
+ pass
32
+
33
+
34
+ class ChatHistoryMixin:
35
+ history: list[tuple[str, str]]
36
+
37
+ def has_history(self) -> bool:
38
+ return bool(self.history)
39
+
40
+ def change_prompt(self, new_prompt: str) -> None:
41
+ if self.history:
42
+ print(self.history)
43
+ self.history[0][0] = new_prompt
44
+
45
+ def get_messages(self) -> list[dict]:
46
+ ms = []
47
+ for h in self.history:
48
+ ms.append({"role": "user", "content": h[0]})
49
+ ms.append({"role": "assistant", "content": h[1]})
50
+ return ms
51
+
52
+ def add_message(self, query: str, message: str) -> None:
53
+ self.history.append([f"{query}", message])
54
+ # only keep 5 history
55
+ first_history = self.history.pop(0)
56
+ self.history = [first_history] + self.history[-5:]
@@ -3,11 +3,11 @@ from __future__ import annotations
3
3
  import openai
4
4
  from rich import print
5
5
 
6
- from xiaogpt.bot.base_bot import BaseBot
6
+ from xiaogpt.bot.base_bot import BaseBot, ChatHistoryMixin
7
7
  from xiaogpt.utils import split_sentences
8
8
 
9
9
 
10
- class ChatGPTBot(BaseBot):
10
+ class ChatGPTBot(ChatHistoryMixin, BaseBot):
11
11
  default_options = {"model": "gpt-3.5-turbo-0613"}
12
12
 
13
13
  def __init__(
@@ -42,10 +42,7 @@ class ChatGPTBot(BaseBot):
42
42
  )
43
43
 
44
44
  async def ask(self, query, **options):
45
- ms = []
46
- for h in self.history:
47
- ms.append({"role": "user", "content": h[0]})
48
- ms.append({"role": "assistant", "content": h[1]})
45
+ ms = self.get_messages()
49
46
  ms.append({"role": "user", "content": f"{query}"})
50
47
  kwargs = {**self.default_options, **options}
51
48
  try:
@@ -60,18 +57,12 @@ class ChatGPTBot(BaseBot):
60
57
  .encode("utf8")
61
58
  .decode()
62
59
  )
63
- self.history.append([f"{query}", message])
64
- # only keep 5 history
65
- first_history = self.history.pop(0)
66
- self.history = [first_history] + self.history[-5:]
60
+ self.add_message(query, message)
67
61
  print(message)
68
62
  return message
69
63
 
70
64
  async def ask_stream(self, query, **options):
71
- ms = []
72
- for h in self.history:
73
- ms.append({"role": "user", "content": h[0]})
74
- ms.append({"role": "assistant", "content": h[1]})
65
+ ms = self.get_messages()
75
66
  ms.append({"role": "user", "content": f"{query}"})
76
67
  kwargs = {"model": "gpt-3.5-turbo", **options}
77
68
  if openai.api_type == "azure":
@@ -99,6 +90,4 @@ class ChatGPTBot(BaseBot):
99
90
  yield sentence
100
91
  finally:
101
92
  print()
102
- self.history.append([f"{query}", message])
103
- first_history = self.history.pop(0)
104
- self.history = [first_history] + self.history[-5:]
93
+ self.add_message(query, message)
xiaogpt/bot/glm_bot.py CHANGED
@@ -1,21 +1,18 @@
1
1
  """ChatGLM bot"""
2
2
  from __future__ import annotations
3
3
 
4
- from typing import Any, AsyncGenerator
4
+ from typing import Any
5
5
 
6
6
  import zhipuai
7
7
  from rich import print
8
8
 
9
- from xiaogpt.bot.base_bot import BaseBot
9
+ from xiaogpt.bot.base_bot import BaseBot, ChatHistoryMixin
10
10
 
11
11
 
12
- class GLMBot(BaseBot):
12
+ class GLMBot(ChatHistoryMixin, BaseBot):
13
13
  default_options = {"model": "chatglm_130b"}
14
14
 
15
- def __init__(
16
- self,
17
- glm_key: str,
18
- ) -> None:
15
+ def __init__(self, glm_key: str) -> None:
19
16
  self.history = []
20
17
  zhipuai.api_key = glm_key
21
18
 
@@ -24,10 +21,7 @@ class GLMBot(BaseBot):
24
21
  return cls(glm_key=config.glm_key)
25
22
 
26
23
  def ask(self, query, **options):
27
- ms = []
28
- for h in self.history:
29
- ms.append({"role": "user", "content": h[0]})
30
- ms.append({"role": "assistant", "content": h[1]})
24
+ ms = self.get_messages()
31
25
  kwargs = {**self.default_options, **options}
32
26
  kwargs["prompt"] = ms
33
27
  ms.append({"role": "user", "content": f"{query}"})
@@ -40,10 +34,7 @@ class GLMBot(BaseBot):
40
34
  for i in r.events():
41
35
  message += str(i.data)
42
36
 
43
- self.history.append([f"{query}", message])
44
- # only keep 5 history
45
- first_history = self.history.pop(0)
46
- self.history = [first_history] + self.history[-5:]
37
+ self.add_message(query, message)
47
38
  print(message)
48
39
  return message
49
40
 
xiaogpt/bot/gpt3_bot.py CHANGED
@@ -1,11 +1,11 @@
1
1
  import openai
2
2
  from rich import print
3
3
 
4
- from xiaogpt.bot.base_bot import BaseBot
4
+ from xiaogpt.bot.base_bot import BaseBot, ChatHistoryMixin
5
5
  from xiaogpt.utils import split_sentences
6
6
 
7
7
 
8
- class GPT3Bot(BaseBot):
8
+ class GPT3Bot(ChatHistoryMixin, BaseBot):
9
9
  def __init__(self, openai_key, api_base=None, proxy=None):
10
10
  openai.api_key = openai_key
11
11
  if api_base:
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import asyncio
4
4
  import os
5
5
 
6
+ from langchain.memory import ConversationBufferWindowMemory
6
7
  from rich import print
7
8
 
8
9
  from xiaogpt.bot.base_bot import BaseBot
@@ -26,8 +27,14 @@ class LangChainBot(BaseBot):
26
27
  os.environ["OPENAI_API_BASE"] = api_base
27
28
  if proxy:
28
29
  os.environ["OPENAI_PROXY"] = proxy
29
- # Todo,Plan to implement within langchain
30
- self.history = []
30
+ self.memory = ConversationBufferWindowMemory(return_messages=True)
31
+
32
+ def has_history(self) -> bool:
33
+ return len(self.memory.chat_memory.messages) > 0
34
+
35
+ def change_prompt(self, new_prompt: str) -> None:
36
+ self.memory.clear()
37
+ self.memory.chat_memory.add_user_message(new_prompt)
31
38
 
32
39
  @classmethod
33
40
  def from_config(cls, config):
@@ -39,14 +46,11 @@ class LangChainBot(BaseBot):
39
46
  )
40
47
 
41
48
  async def ask(self, query, **options):
42
- # Todo,Currently only supports stream
43
- raise Exception(
44
- "The bot does not support it. Please use 'ask_stream, add: --stream'"
45
- )
49
+ return await agent_search(query, self.memory)
46
50
 
47
51
  async def ask_stream(self, query, **options):
48
52
  callback = AsyncIteratorCallbackHandler()
49
- task = asyncio.create_task(agent_search(query, callback))
53
+ task = asyncio.create_task(agent_search(query, self.memory, callback))
50
54
  try:
51
55
  async for message in split_sentences(callback.aiter()):
52
56
  yield message
@@ -4,13 +4,13 @@ import re
4
4
 
5
5
  from EdgeGPT import Chatbot, ConversationStyle
6
6
 
7
- from xiaogpt.bot.base_bot import BaseBot
7
+ from xiaogpt.bot.base_bot import BaseBot, ChatHistoryMixin
8
8
  from xiaogpt.utils import split_sentences
9
9
 
10
10
  _reference_link_re = re.compile(r"\[\d+\]: .+?\n+")
11
11
 
12
12
 
13
- class NewBingBot(BaseBot):
13
+ class NewBingBot(ChatHistoryMixin, BaseBot):
14
14
  def __init__(
15
15
  self,
16
16
  bing_cookie_path: str = "",
@@ -52,7 +52,7 @@ class NewBingBot(BaseBot):
52
52
  kwargs = {"conversation_style": ConversationStyle.balanced, **options}
53
53
  try:
54
54
  completion = self._bot.ask_stream(prompt=query, **kwargs)
55
- except Exception as e:
55
+ except Exception:
56
56
  return
57
57
 
58
58
  async def text_gen():
@@ -33,7 +33,7 @@ class AsyncIteratorCallbackHandler(AsyncCallbackHandler):
33
33
 
34
34
  async def on_llm_new_token(self, token: str, **kwargs: Any) -> None:
35
35
  if token is not None and token != "":
36
- print(token, end="")
36
+ print(token, end="", flush=True)
37
37
  self.queue.put_nowait(token)
38
38
 
39
39
  async def on_chain_end(
@@ -1,11 +1,16 @@
1
+ from __future__ import annotations
2
+
1
3
  from langchain.agents import AgentType, Tool, initialize_agent
2
4
  from langchain.callbacks.base import BaseCallbackHandler
3
5
  from langchain.chains import LLMMathChain
4
6
  from langchain.chat_models import ChatOpenAI
7
+ from langchain.schema.memory import BaseMemory
5
8
  from langchain.utilities import SerpAPIWrapper
6
9
 
7
10
 
8
- async def agent_search(query: str, callback: BaseCallbackHandler) -> None:
11
+ async def agent_search(
12
+ query: str, memeory: BaseMemory, callback: BaseCallbackHandler | None = None
13
+ ) -> str:
9
14
  llm = ChatOpenAI(
10
15
  streaming=True,
11
16
  temperature=0,
@@ -23,8 +28,8 @@ async def agent_search(query: str, callback: BaseCallbackHandler) -> None:
23
28
  ]
24
29
 
25
30
  agent = initialize_agent(
26
- tools, llm, agent=AgentType.OPENAI_FUNCTIONS, verbose=False
31
+ tools, llm, agent=AgentType.OPENAI_FUNCTIONS, verbose=False, memory=memeory
27
32
  )
28
-
33
+ callbacks = [callback] if callback else None
29
34
  # query eg:'杭州亚运会中国队获得了多少枚金牌?' // '计算3的2次方'
30
- await agent.arun(query, callbacks=[callback])
35
+ return await agent.arun(query, callbacks=callbacks)
xiaogpt/xiaogpt.py CHANGED
@@ -231,9 +231,7 @@ class MiGPT:
231
231
  new_prompt = "以下都" + new_prompt
232
232
  print(f"Prompt from {self.config.prompt} change to {new_prompt}")
233
233
  self.config.prompt = new_prompt
234
- if self.chatbot.history:
235
- print(self.chatbot.history)
236
- self.chatbot.history[0][0] = new_prompt
234
+ self.chatbot.change_prompt(new_prompt)
237
235
 
238
236
  async def get_latest_ask_from_xiaoai(self, session: ClientSession) -> dict | None:
239
237
  retries = 3
@@ -489,7 +487,7 @@ class MiGPT:
489
487
 
490
488
  print("-" * 20)
491
489
  print("问题:" + query + "?")
492
- if not self.chatbot.history:
490
+ if not self.chatbot.has_history():
493
491
  query = f"{query},{self.config.prompt}"
494
492
  if self.config.mute_xiaoai:
495
493
  await self.stop_if_xiaoai_is_playing()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xiaogpt
3
- Version: 1.80
3
+ Version: 1.81
4
4
  Summary: Play ChatGPT or other LLM with xiaomi AI speaker
5
5
  Author-Email: yihong0618 <zouzou0208@gmail.com>
6
6
  License: MIT
@@ -0,0 +1,23 @@
1
+ xiaogpt-1.81.dist-info/METADATA,sha256=GxxsqfbaekP1hfO5djLz3qVw9HcuhRn7TGN3Vq8eyZg,14306
2
+ xiaogpt-1.81.dist-info/WHEEL,sha256=C8f_gqhOWmHrh81n3Ukx5iURrqMhsHla81fuY1yuwvs,90
3
+ xiaogpt-1.81.dist-info/entry_points.txt,sha256=zLFzA72qQ_eWBepdA2YU5vdXFqORH8wXhv2Ox1vnYP8,46
4
+ xiaogpt-1.81.dist-info/licenses/LICENSE,sha256=XdClh516MvlnOf9749JZHCxSB7y6_fyXcWmLDz6IkZY,1063
5
+ xiaogpt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ xiaogpt/__main__.py,sha256=MSmt_5Xg84uHqzTN38JwgseJK8rsJn_11A8WD99VtEo,61
7
+ xiaogpt/bot/__init__.py,sha256=raXM63RFkZFQWLwT0sz8NY0jAkCQip9TmIShpEU4wIA,909
8
+ xiaogpt/bot/bard_bot.py,sha256=_OX8UVyksdxQb5E9xPkX2V0yIC24PUL8xUTONe5sR3c,811
9
+ xiaogpt/bot/base_bot.py,sha256=YmFoNK4-_D-3bXSbt6cfPsm5rZiaoVyaEps5bNih6OE,1452
10
+ xiaogpt/bot/chatgptapi_bot.py,sha256=rDhtQ-YCv27_3MyLU0sMnr4VDrHAu7hI5AdJUoij3yE,2983
11
+ xiaogpt/bot/glm_bot.py,sha256=7VZJGRYU1Xlo6N7gICIsGMV5JkNgAbfBQKvhoO8ren4,1107
12
+ xiaogpt/bot/gpt3_bot.py,sha256=IoMhsfmQ-ITy6V1nRrdm755vyEsS0Bb0bOLIv-F-fr8,1863
13
+ xiaogpt/bot/langchain_bot.py,sha256=Kc4qXWIR1GBucxWmm1Y5YpAB3UzTVZmUpaEZSQIoaYY,1919
14
+ xiaogpt/bot/newbing_bot.py,sha256=8VONq_2VAK66zUnjCacM9jg_4oHlYHTuKLAHob48Q2I,2187
15
+ xiaogpt/cli.py,sha256=L0nmhSj6C931ya4KHIBktltnYTOGgPJNMavyXefTGpY,4478
16
+ xiaogpt/config.py,sha256=B3AiG4WZjMGuwJrR2yMe9TiaVEoLN7N6D7CUYTpcsPc,5863
17
+ xiaogpt/langchain/callbacks.py,sha256=yR9AXQt9OHVYBWC47Q1I_BUT4Xg9iM44vnW2vv0BLpE,2616
18
+ xiaogpt/langchain/chain.py,sha256=rcbXzCV6H_r2r-Mi7mA__X8UZctDMl7nHloy3SAXXvw,1381
19
+ xiaogpt/langchain/examples/email/mail_box.py,sha256=kpAZmfl5clbDBOkvHaaWZ_QY-VLBBvV1dsuegEptClw,6360
20
+ xiaogpt/langchain/examples/email/mail_summary_tools.py,sha256=6cWvBJUaA7iaywcHdbUoww8WiCtaNw3TmwyxyF4DY7E,1561
21
+ xiaogpt/utils.py,sha256=B7NCH7g19hcwHDXsnBJPTU6UcWnXoEntKWm-pgcet2I,2072
22
+ xiaogpt/xiaogpt.py,sha256=Ojq0Pw3SVsVzwgImpWS87XrKqCAHIfddqgmoA5_kMf0,19885
23
+ xiaogpt-1.81.dist-info/RECORD,,
@@ -1,23 +0,0 @@
1
- xiaogpt-1.80.dist-info/METADATA,sha256=c18I0m_IQ9BrjSkuL_q_gt-TUuBNNAhpxdPclkvneYM,14306
2
- xiaogpt-1.80.dist-info/WHEEL,sha256=C8f_gqhOWmHrh81n3Ukx5iURrqMhsHla81fuY1yuwvs,90
3
- xiaogpt-1.80.dist-info/entry_points.txt,sha256=zLFzA72qQ_eWBepdA2YU5vdXFqORH8wXhv2Ox1vnYP8,46
4
- xiaogpt-1.80.dist-info/licenses/LICENSE,sha256=XdClh516MvlnOf9749JZHCxSB7y6_fyXcWmLDz6IkZY,1063
5
- xiaogpt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- xiaogpt/__main__.py,sha256=MSmt_5Xg84uHqzTN38JwgseJK8rsJn_11A8WD99VtEo,61
7
- xiaogpt/bot/__init__.py,sha256=raXM63RFkZFQWLwT0sz8NY0jAkCQip9TmIShpEU4wIA,909
8
- xiaogpt/bot/bard_bot.py,sha256=UKgfLLKwte8XBZFl7H7bAQRZM17qbI8Sa2AUrtzBrwM,774
9
- xiaogpt/bot/base_bot.py,sha256=kzbUw1eQrgFqkE_eZZrWmcbPdwFrQezJBLm7cJAM8qw,554
10
- xiaogpt/bot/chatgptapi_bot.py,sha256=cq0CwXD6ynNw7hB-bYubP0Nsz7pT49JYKp0_UjRoIps,3477
11
- xiaogpt/bot/glm_bot.py,sha256=bCJnwo4J6746kkRNq_OTrUgT-XZvV5KTndCz1ftiHIg,1386
12
- xiaogpt/bot/gpt3_bot.py,sha256=Ju_c9izW09XbCCSgZTp-3Rjz1zBMeBGj19zH0UwqGFw,1827
13
- xiaogpt/bot/langchain_bot.py,sha256=jnnXCDPkuZQYt83mhkeHpdJ_zdQBV51G5ABeL1ppf3k,1723
14
- xiaogpt/bot/newbing_bot.py,sha256=fRRrNnnw6xVFlkp4aQ37XRrOCnZmc2tCyMmW7BFgrOE,2156
15
- xiaogpt/cli.py,sha256=L0nmhSj6C931ya4KHIBktltnYTOGgPJNMavyXefTGpY,4478
16
- xiaogpt/config.py,sha256=B3AiG4WZjMGuwJrR2yMe9TiaVEoLN7N6D7CUYTpcsPc,5863
17
- xiaogpt/langchain/callbacks.py,sha256=gKWXAX2miB-FWu-h60J7kQ6FWTx0lxoj75ILNkPlwjU,2604
18
- xiaogpt/langchain/chain.py,sha256=50YcgWOtVeNS5X0TfwzDVeKBLz7eLntqL5H57sAiQ7k,1188
19
- xiaogpt/langchain/examples/email/mail_box.py,sha256=kpAZmfl5clbDBOkvHaaWZ_QY-VLBBvV1dsuegEptClw,6360
20
- xiaogpt/langchain/examples/email/mail_summary_tools.py,sha256=6cWvBJUaA7iaywcHdbUoww8WiCtaNw3TmwyxyF4DY7E,1561
21
- xiaogpt/utils.py,sha256=B7NCH7g19hcwHDXsnBJPTU6UcWnXoEntKWm-pgcet2I,2072
22
- xiaogpt/xiaogpt.py,sha256=jtZy6Qylhgh3_RGeKJnlQVBHCsYZTvEB37YHA6o_nmg,19957
23
- xiaogpt-1.80.dist-info/RECORD,,
File without changes