mirror of
https://github.com/FoundationAgents/MetaGPT.git
synced 2026-06-20 15:38:09 +02:00
fix_bug_for_config_model
This commit is contained in:
parent
ba2868974b
commit
46feec4a45
10 changed files with 37 additions and 88 deletions
|
|
@ -15,6 +15,7 @@ mock_llm_config = LLMConfig(
|
|||
app_id="mock_app_id",
|
||||
api_secret="mock_api_secret",
|
||||
domain="mock_domain",
|
||||
model="mock_model",
|
||||
)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
|
||||
import pytest
|
||||
|
||||
from metagpt.configs.compress_msg_config import CompressType
|
||||
from metagpt.configs.llm_config import LLMConfig
|
||||
from metagpt.const import IMAGES
|
||||
from metagpt.provider.base_llm import BaseLLM
|
||||
|
|
@ -26,6 +25,7 @@ name = "GPT"
|
|||
class MockBaseLLM(BaseLLM):
|
||||
def __init__(self, config: LLMConfig = None):
|
||||
self.config = config or mock_llm_config
|
||||
self.model = mock_llm_config.model
|
||||
|
||||
def completion(self, messages: list[dict], timeout=3):
|
||||
return get_part_chat_completion(name)
|
||||
|
|
@ -108,64 +108,6 @@ async def test_async_base_llm():
|
|||
# assert resp == default_resp_cont
|
||||
|
||||
|
||||
@pytest.mark.parametrize("compress_type", list(CompressType))
|
||||
def test_compress_messages_no_effect(compress_type):
|
||||
base_llm = MockBaseLLM()
|
||||
messages = [
|
||||
{"role": "system", "content": "first system msg"},
|
||||
{"role": "system", "content": "second system msg"},
|
||||
]
|
||||
for i in range(5):
|
||||
messages.append({"role": "user", "content": f"u{i}"})
|
||||
messages.append({"role": "assistant", "content": f"a{i}"})
|
||||
compressed = base_llm.compress_messages(messages, compress_type=compress_type)
|
||||
# should take no effect for short context
|
||||
assert compressed == messages
|
||||
|
||||
|
||||
@pytest.mark.parametrize("compress_type", CompressType.cut_types())
|
||||
def test_compress_messages_long(compress_type):
|
||||
base_llm = MockBaseLLM()
|
||||
base_llm.config.model = "test_llm"
|
||||
max_token_limit = 100
|
||||
|
||||
messages = [
|
||||
{"role": "system", "content": "first system msg"},
|
||||
{"role": "system", "content": "second system msg"},
|
||||
]
|
||||
for i in range(100):
|
||||
messages.append({"role": "user", "content": f"u{i}" * 10}) # ~2x10x0.5 = 10 tokens
|
||||
messages.append({"role": "assistant", "content": f"a{i}" * 10})
|
||||
compressed = base_llm.compress_messages(messages, compress_type=compress_type, max_token=max_token_limit)
|
||||
|
||||
print(compressed)
|
||||
print(len(compressed))
|
||||
assert 3 <= len(compressed) < len(messages)
|
||||
assert compressed[0]["role"] == "system" and compressed[1]["role"] == "system"
|
||||
assert compressed[2]["role"] != "system"
|
||||
|
||||
|
||||
def test_long_messages_no_compress():
|
||||
base_llm = MockBaseLLM()
|
||||
messages = [{"role": "user", "content": "1" * 10000}] * 10000
|
||||
compressed = base_llm.compress_messages(messages)
|
||||
assert len(compressed) == len(messages)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("compress_type", CompressType.cut_types())
|
||||
def test_compress_messages_long_no_sys_msg(compress_type):
|
||||
base_llm = MockBaseLLM()
|
||||
base_llm.config.model = "test_llm"
|
||||
max_token_limit = 100
|
||||
|
||||
messages = [{"role": "user", "content": "1" * 10000}]
|
||||
compressed = base_llm.compress_messages(messages, compress_type=compress_type, max_token=max_token_limit)
|
||||
|
||||
print(compressed)
|
||||
assert compressed
|
||||
assert len(compressed[0]["content"]) < len(messages[0]["content"])
|
||||
|
||||
|
||||
def test_format_msg(mocker):
|
||||
base_llm = MockBaseLLM()
|
||||
messages = [UserMessage(content="req"), AIMessage(content="rsp")]
|
||||
|
|
@ -175,7 +117,7 @@ def test_format_msg(mocker):
|
|||
|
||||
def test_format_msg_w_images(mocker):
|
||||
base_llm = MockBaseLLM()
|
||||
base_llm.config.model = "gpt-4o"
|
||||
base_llm.model = "gpt-4o"
|
||||
msg_w_images = UserMessage(content="req1")
|
||||
msg_w_images.add_metadata(IMAGES, ["base64 string 1", "base64 string 2"])
|
||||
msg_w_empty_images = UserMessage(content="req2")
|
||||
|
|
|
|||
|
|
@ -22,13 +22,13 @@ usage = {
|
|||
}
|
||||
|
||||
|
||||
def mock_invoke_model(self: BedrockLLM, *args, **kwargs) -> dict:
|
||||
async def mock_invoke_model(self: BedrockLLM, *args, **kwargs) -> dict:
|
||||
provider = self.config.model.split(".")[0]
|
||||
self._update_costs(usage, self.config.model)
|
||||
return BEDROCK_PROVIDER_RESPONSE_BODY[provider]
|
||||
|
||||
|
||||
def mock_invoke_model_stream(self: BedrockLLM, *args, **kwargs) -> dict:
|
||||
async def mock_invoke_model_stream(self: BedrockLLM, *args, **kwargs) -> dict:
|
||||
# use json object to mock EventStream
|
||||
def dict2bytes(x):
|
||||
return json.dumps(x).encode("utf-8")
|
||||
|
|
|
|||
|
|
@ -169,7 +169,7 @@ async def test_openai_acompletion(mocker):
|
|||
|
||||
def test_count_tokens():
|
||||
llm = LLM()
|
||||
llm.config.model = "gpt-4o"
|
||||
llm.model = "gpt-4o"
|
||||
messages = [
|
||||
llm._system_msg("some system msg"),
|
||||
llm._system_msg("some system message 2"),
|
||||
|
|
@ -184,7 +184,7 @@ def test_count_tokens():
|
|||
|
||||
def test_count_tokens_long():
|
||||
llm = LLM()
|
||||
llm.config.model = "gpt-4-0613"
|
||||
llm.model = "gpt-4-0613"
|
||||
test_msg_content = " ".join([str(i) for i in range(100000)])
|
||||
messages = [
|
||||
llm._system_msg("You are a helpful assistant"),
|
||||
|
|
@ -193,7 +193,7 @@ def test_count_tokens_long():
|
|||
cnt = llm.count_tokens(messages) # 299023, ~300k
|
||||
assert 290000 <= cnt <= 300000
|
||||
|
||||
llm.config.model = "test_llm" # a non-openai model, will use heuristics base count_tokens
|
||||
llm.model = "test_llm" # a non-openai model, will use heuristics base count_tokens
|
||||
cnt = llm.count_tokens(messages) # 294474, ~300k, ~2% difference
|
||||
assert 290000 <= cnt <= 300000
|
||||
|
||||
|
|
@ -202,7 +202,7 @@ def test_count_tokens_long():
|
|||
@pytest.mark.asyncio
|
||||
async def test_aask_long():
|
||||
llm = LLM()
|
||||
llm.config.model = "deepseek-ai/DeepSeek-Coder-V2-Instruct" # deepseek-coder on siliconflow, limit 32k
|
||||
llm.model = "deepseek-ai/DeepSeek-Coder-V2-Instruct" # deepseek-coder on siliconflow, limit 32k
|
||||
llm.config.compress_type = CompressType.POST_CUT_BY_TOKEN
|
||||
test_msg_content = " ".join([str(i) for i in range(100000)]) # corresponds to ~300k tokens
|
||||
messages = [
|
||||
|
|
@ -216,7 +216,7 @@ async def test_aask_long():
|
|||
@pytest.mark.asyncio
|
||||
async def test_aask_long_no_compress():
|
||||
llm = LLM()
|
||||
llm.config.model = "deepseek-ai/DeepSeek-Coder-V2-Instruct" # deepseek-coder on siliconflow, limit 32k
|
||||
llm.model = "deepseek-ai/DeepSeek-Coder-V2-Instruct" # deepseek-coder on siliconflow, limit 32k
|
||||
# Not specifying llm.config.compress_type will use default "", no compress
|
||||
test_msg_content = " ".join([str(i) for i in range(100000)]) # corresponds to ~300k tokens
|
||||
messages = [
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue