From 107ddbe308901713aa18d767c920e41e5e473e66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Mon, 4 Sep 2023 22:38:58 +0800 Subject: [PATCH 01/15] refactor: talk prompt --- metagpt/actions/talk_action.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/metagpt/actions/talk_action.py b/metagpt/actions/talk_action.py index 83504b62d..a4cd78121 100644 --- a/metagpt/actions/talk_action.py +++ b/metagpt/actions/talk_action.py @@ -26,7 +26,7 @@ class TalkAction(Action): self._rsp = None @property - def prompt(self): + def prompt_old(self): prompt = "" if CONFIG.agent_description: prompt = ( @@ -46,7 +46,7 @@ class TalkAction(Action): return prompt @property - def formation_prompt(self): + def prompt(self): kvs = { "{role}": CONFIG.agent_description or "", "{history}": self._history_summary or "", From 972337776de1d00f8997cdd73ab2c24df982cd96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Mon, 4 Sep 2023 22:56:16 +0800 Subject: [PATCH 02/15] refactor: talk prompt --- metagpt/utils/redis.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/metagpt/utils/redis.py b/metagpt/utils/redis.py index b94eee8e2..48a18e7c9 100644 --- a/metagpt/utils/redis.py +++ b/metagpt/utils/redis.py @@ -4,6 +4,7 @@ # @Desc: { redis client } # @Date: 2022/11/28 10:12 import json +import traceback from datetime import timedelta from enum import Enum from typing import Awaitable, Callable, Dict, Optional, Union @@ -203,12 +204,19 @@ class Redis: async def get(self, key: str) -> str: if not self.is_valid() or not key: return None - v = await RedisManager.get_with_cache_info(redis_cache_info=RedisCacheInfo(key=key)) - return v + try: + v = await RedisManager.get_with_cache_info(redis_cache_info=RedisCacheInfo(key=key)) + return v + except Exception as e: + logger.exception(f"{e}, stack:{traceback.format_exc()}") + return None async def set(self, key: str, data: str, timeout_sec: int): if not self.is_valid() or not key: return - await RedisManager.set_with_cache_info( - redis_cache_info=RedisCacheInfo(key=key, timeout=timeout_sec), value=data - ) + try: + await RedisManager.set_with_cache_info( + redis_cache_info=RedisCacheInfo(key=key, timeout=timeout_sec), value=data + ) + except Exception as e: + logger.exception(f"{e}, stack:{traceback.format_exc()}") From 557e82d8ef050466b3e465c17ccee695ff2d08ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Mon, 4 Sep 2023 23:07:31 +0800 Subject: [PATCH 03/15] refactor: talk prompt --- metagpt/actions/talk_action.py | 1 + 1 file changed, 1 insertion(+) diff --git a/metagpt/actions/talk_action.py b/metagpt/actions/talk_action.py index a4cd78121..54c004602 100644 --- a/metagpt/actions/talk_action.py +++ b/metagpt/actions/talk_action.py @@ -57,6 +57,7 @@ class TalkAction(Action): prompt = TalkAction.__FORMATION_LOOSE__ for k, v in kvs.items(): prompt = prompt.replace(k, v) + logger.info(f"PROMPT: {prompt}") return prompt async def run(self, *args, **kwargs) -> ActionOutput: From 06c24c0eb4fc604ad1eff4980736e8ccc1b221ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Mon, 4 Sep 2023 23:26:25 +0800 Subject: [PATCH 04/15] refactor: talk prompt --- metagpt/memory/brain_memory.py | 1 - 1 file changed, 1 deletion(-) diff --git a/metagpt/memory/brain_memory.py b/metagpt/memory/brain_memory.py index 22af67236..0c1ae024d 100644 --- a/metagpt/memory/brain_memory.py +++ b/metagpt/memory/brain_memory.py @@ -117,7 +117,6 @@ class BrainMemory(pydantic.BaseModel): if msg.id: if self.to_int(msg.id, 0) < self.to_int(self.last_history_id, -1): return - self.last_history_id = str(self.to_int(msg.id, 0)) self.history.append(msg.dict()) self.is_dirty = True From d79a0638f2bc8f16b038327c39894add919669b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Mon, 4 Sep 2023 23:34:54 +0800 Subject: [PATCH 05/15] fixbug: last_talk --- metagpt/memory/brain_memory.py | 1 + 1 file changed, 1 insertion(+) diff --git a/metagpt/memory/brain_memory.py b/metagpt/memory/brain_memory.py index 0c1ae024d..e2d9ad5ff 100644 --- a/metagpt/memory/brain_memory.py +++ b/metagpt/memory/brain_memory.py @@ -34,6 +34,7 @@ class BrainMemory(pydantic.BaseModel): historical_summary: str = "" last_history_id: str = "" is_dirty: bool = False + last_talk: str = "" def add_talk(self, msg: Message): msg.add_tag(MessageType.Talk.value) From b0966ca54133f9667a4ff173d17c5051b7993542 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Mon, 4 Sep 2023 23:38:43 +0800 Subject: [PATCH 06/15] fixbug: last_talk --- metagpt/memory/brain_memory.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/metagpt/memory/brain_memory.py b/metagpt/memory/brain_memory.py index e2d9ad5ff..60c563ed4 100644 --- a/metagpt/memory/brain_memory.py +++ b/metagpt/memory/brain_memory.py @@ -66,15 +66,6 @@ class BrainMemory(pydantic.BaseModel): return "\n".join(texts) - @property - def last_talk(self): - if len(self.history) == 0: - return None - last_msg = Message(**self.history[-1]) - if not last_msg.is_contain(MessageType.Talk.value): - return None - return last_msg.content - @staticmethod async def loads(redis_key: str, redis_conf: Dict = None) -> "BrainMemory": redis = Redis(conf=redis_conf) From 8075154a8db000c52f1db270b1907cb3f79d72f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Mon, 4 Sep 2023 23:46:12 +0800 Subject: [PATCH 07/15] fixbug: last_talk --- metagpt/roles/assistant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metagpt/roles/assistant.py b/metagpt/roles/assistant.py index 9c80593f6..018a1fb01 100644 --- a/metagpt/roles/assistant.py +++ b/metagpt/roles/assistant.py @@ -125,7 +125,7 @@ class Assistant(Role): return None if history_text == "": return last_talk - history_summary = await self._llm.get_summary(history_text, max_words=500) + history_summary = await self._llm.get_summary(history_text, max_words=800) await self.memory.set_history_summary( history_summary=history_summary, redis_key=CONFIG.REDIS_KEY, redis_conf=CONFIG.REDIS ) From 327e5fc9871cff1693fef512bd9a09645c69a7c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Tue, 5 Sep 2023 00:02:21 +0800 Subject: [PATCH 08/15] fixbug: last_talk --- metagpt/provider/openai_api.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/metagpt/provider/openai_api.py b/metagpt/provider/openai_api.py index d0dd5b9d8..9f65dd905 100644 --- a/metagpt/provider/openai_api.py +++ b/metagpt/provider/openai_api.py @@ -226,15 +226,17 @@ class OpenAIGPTAPI(BaseGPTAPI, RateLimiter): async def get_summary(self, text: str, max_words=200, keep_language: bool = False): max_token_count = DEFAULT_MAX_TOKENS max_count = 100 + text_length = len(text) while max_count > 0: - if len(text) < max_token_count: + if text_length < max_token_count: return await self._get_summary(text=text, max_words=max_words, keep_language=keep_language) padding_size = 20 if max_token_count > 20 else 0 text_windows = self.split_texts(text, window_size=max_token_count - padding_size) + part_max_words = int(max_words / len(text_windows)) + 1 summaries = [] for ws in text_windows: - response = await self._get_summary(text=ws, max_words=max_words, keep_language=keep_language) + response = await self._get_summary(text=ws, max_words=part_max_words, keep_language=keep_language) summaries.append(response) if len(summaries) == 1: return summaries[0] From bc52a674e773416e6d4616ad2b2d13b6d27f404c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Tue, 5 Sep 2023 00:20:34 +0800 Subject: [PATCH 09/15] fixbug: last_talk --- metagpt/provider/openai_api.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/metagpt/provider/openai_api.py b/metagpt/provider/openai_api.py index 9f65dd905..2539c5b70 100644 --- a/metagpt/provider/openai_api.py +++ b/metagpt/provider/openai_api.py @@ -233,10 +233,9 @@ class OpenAIGPTAPI(BaseGPTAPI, RateLimiter): padding_size = 20 if max_token_count > 20 else 0 text_windows = self.split_texts(text, window_size=max_token_count - padding_size) - part_max_words = int(max_words / len(text_windows)) + 1 summaries = [] for ws in text_windows: - response = await self._get_summary(text=ws, max_words=part_max_words, keep_language=keep_language) + response = await self._get_summary(text=ws, max_words=200, keep_language=keep_language) summaries.append(response) if len(summaries) == 1: return summaries[0] From dfc189510eb51928b732ebbcdfaa143a94252136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Tue, 5 Sep 2023 00:23:36 +0800 Subject: [PATCH 10/15] fixbug: last_talk --- metagpt/provider/openai_api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/metagpt/provider/openai_api.py b/metagpt/provider/openai_api.py index 2539c5b70..9406346ac 100644 --- a/metagpt/provider/openai_api.py +++ b/metagpt/provider/openai_api.py @@ -233,9 +233,10 @@ class OpenAIGPTAPI(BaseGPTAPI, RateLimiter): padding_size = 20 if max_token_count > 20 else 0 text_windows = self.split_texts(text, window_size=max_token_count - padding_size) + part_max_words = min(int(max_words / len(text_windows)) + 1, 200) summaries = [] for ws in text_windows: - response = await self._get_summary(text=ws, max_words=200, keep_language=keep_language) + response = await self._get_summary(text=ws, max_words=part_max_words, keep_language=keep_language) summaries.append(response) if len(summaries) == 1: return summaries[0] From 8e1034afffcd3fbde4754ed64e49187f27beb672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Tue, 5 Sep 2023 00:27:37 +0800 Subject: [PATCH 11/15] fixbug: last_talk --- metagpt/provider/openai_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metagpt/provider/openai_api.py b/metagpt/provider/openai_api.py index 9406346ac..157c353a8 100644 --- a/metagpt/provider/openai_api.py +++ b/metagpt/provider/openai_api.py @@ -233,7 +233,7 @@ class OpenAIGPTAPI(BaseGPTAPI, RateLimiter): padding_size = 20 if max_token_count > 20 else 0 text_windows = self.split_texts(text, window_size=max_token_count - padding_size) - part_max_words = min(int(max_words / len(text_windows)) + 1, 200) + part_max_words = min(int(max_words / len(text_windows)) + 1, 100) summaries = [] for ws in text_windows: response = await self._get_summary(text=ws, max_words=part_max_words, keep_language=keep_language) From 998411a125e45a6265af7054081a2885e8a8d479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Tue, 5 Sep 2023 00:35:03 +0800 Subject: [PATCH 12/15] fixbug: last_talk --- metagpt/provider/openai_api.py | 2 +- metagpt/roles/assistant.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/metagpt/provider/openai_api.py b/metagpt/provider/openai_api.py index 157c353a8..2722491d0 100644 --- a/metagpt/provider/openai_api.py +++ b/metagpt/provider/openai_api.py @@ -233,7 +233,7 @@ class OpenAIGPTAPI(BaseGPTAPI, RateLimiter): padding_size = 20 if max_token_count > 20 else 0 text_windows = self.split_texts(text, window_size=max_token_count - padding_size) - part_max_words = min(int(max_words / len(text_windows)) + 1, 100) + part_max_words = min(int(max_words / len(text_windows)) + 1, 60) summaries = [] for ws in text_windows: response = await self._get_summary(text=ws, max_words=part_max_words, keep_language=keep_language) diff --git a/metagpt/roles/assistant.py b/metagpt/roles/assistant.py index 018a1fb01..4b2bfdab5 100644 --- a/metagpt/roles/assistant.py +++ b/metagpt/roles/assistant.py @@ -125,7 +125,7 @@ class Assistant(Role): return None if history_text == "": return last_talk - history_summary = await self._llm.get_summary(history_text, max_words=800) + history_summary = await self._llm.get_summary(history_text, max_words=800, keep_language=True) await self.memory.set_history_summary( history_summary=history_summary, redis_key=CONFIG.REDIS_KEY, redis_conf=CONFIG.REDIS ) From 18a65470f031c65de06834c0651dd3574cda1c6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Tue, 5 Sep 2023 00:37:32 +0800 Subject: [PATCH 13/15] fixbug: last_talk --- metagpt/memory/brain_memory.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/metagpt/memory/brain_memory.py b/metagpt/memory/brain_memory.py index 60c563ed4..92a71f69a 100644 --- a/metagpt/memory/brain_memory.py +++ b/metagpt/memory/brain_memory.py @@ -124,3 +124,8 @@ class BrainMemory(pydantic.BaseModel): return int(v) except: return default_value + + def pop_last_talk(self): + v = self.last_talk + self.last_talk = "" + return v From 22dbe3b224e8f7f0a8eedef942068deab4980ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Tue, 5 Sep 2023 00:38:31 +0800 Subject: [PATCH 14/15] fixbug: last_talk --- metagpt/memory/brain_memory.py | 4 ++-- metagpt/roles/assistant.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/metagpt/memory/brain_memory.py b/metagpt/memory/brain_memory.py index 92a71f69a..2195da566 100644 --- a/metagpt/memory/brain_memory.py +++ b/metagpt/memory/brain_memory.py @@ -34,7 +34,7 @@ class BrainMemory(pydantic.BaseModel): historical_summary: str = "" last_history_id: str = "" is_dirty: bool = False - last_talk: str = "" + last_talk: str = None def add_talk(self, msg: Message): msg.add_tag(MessageType.Talk.value) @@ -127,5 +127,5 @@ class BrainMemory(pydantic.BaseModel): def pop_last_talk(self): v = self.last_talk - self.last_talk = "" + self.last_talk = None return v diff --git a/metagpt/roles/assistant.py b/metagpt/roles/assistant.py index 4b2bfdab5..87127cbab 100644 --- a/metagpt/roles/assistant.py +++ b/metagpt/roles/assistant.py @@ -120,7 +120,7 @@ class Assistant(Role): async def refine_memory(self) -> str: history_text = self.memory.history_text - last_talk = self.memory.last_talk + last_talk = self.memory.pop_last_talk() if last_talk is None: # No user feedback, unsure if past conversation is finished. return None if history_text == "": From 9b2d6e492241493d3c5d4ef2c71152afc652acfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Tue, 5 Sep 2023 00:41:47 +0800 Subject: [PATCH 15/15] fixbug: last_talk --- metagpt/provider/openai_api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/metagpt/provider/openai_api.py b/metagpt/provider/openai_api.py index 2722491d0..bf2ca7f14 100644 --- a/metagpt/provider/openai_api.py +++ b/metagpt/provider/openai_api.py @@ -233,7 +233,7 @@ class OpenAIGPTAPI(BaseGPTAPI, RateLimiter): padding_size = 20 if max_token_count > 20 else 0 text_windows = self.split_texts(text, window_size=max_token_count - padding_size) - part_max_words = min(int(max_words / len(text_windows)) + 1, 60) + part_max_words = min(int(max_words / len(text_windows)) + 1, 100) summaries = [] for ws in text_windows: response = await self._get_summary(text=ws, max_words=part_max_words, keep_language=keep_language) @@ -243,6 +243,7 @@ class OpenAIGPTAPI(BaseGPTAPI, RateLimiter): # Merged and retry text = "\n".join(summaries) + text_length = len(text) max_count -= 1 # safeguard raise openai.error.InvalidRequestError("text too long")