refine code: gloabl context to CONTEXT

This commit is contained in:
geekan 2024-01-10 13:56:02 +08:00
parent ba6793383f
commit f5bb850f25
18 changed files with 85 additions and 85 deletions

View file

@ -12,7 +12,7 @@ import pytest
from metagpt.actions.debug_error import DebugError
from metagpt.const import TEST_CODES_FILE_REPO, TEST_OUTPUTS_FILE_REPO
from metagpt.context import context
from metagpt.context import CONTEXT
from metagpt.schema import RunCodeContext, RunCodeResult
CODE_CONTENT = '''
@ -117,7 +117,7 @@ if __name__ == '__main__':
@pytest.mark.asyncio
async def test_debug_error():
context.src_workspace = context.git_repo.workdir / uuid.uuid4().hex
CONTEXT.src_workspace = CONTEXT.git_repo.workdir / uuid.uuid4().hex
ctx = RunCodeContext(
code_filename="player.py",
test_filename="test_player.py",
@ -125,8 +125,8 @@ async def test_debug_error():
output_filename="output.log",
)
repo = context.file_repo
await repo.save_file(filename=ctx.code_filename, content=CODE_CONTENT, relative_path=context.src_workspace)
repo = CONTEXT.file_repo
await repo.save_file(filename=ctx.code_filename, content=CODE_CONTENT, relative_path=CONTEXT.src_workspace)
await repo.save_file(filename=ctx.test_filename, content=TEST_CONTENT, relative_path=TEST_CODES_FILE_REPO)
output_data = RunCodeResult(
stdout=";",

View file

@ -10,7 +10,7 @@ import pytest
from metagpt.actions.design_api import WriteDesign
from metagpt.const import PRDS_FILE_REPO
from metagpt.context import context
from metagpt.context import CONTEXT
from metagpt.logs import logger
from metagpt.schema import Message
@ -18,7 +18,7 @@ from metagpt.schema import Message
@pytest.mark.asyncio
async def test_design_api():
inputs = ["我们需要一个音乐播放器,它应该有播放、暂停、上一曲、下一曲等功能。"] # PRD_SAMPLE
repo = context.file_repo
repo = CONTEXT.file_repo
for prd in inputs:
await repo.save_file("new_prd.txt", content=prd, relative_path=PRDS_FILE_REPO)

View file

@ -10,7 +10,7 @@ import pytest
from metagpt.actions.prepare_documents import PrepareDocuments
from metagpt.const import DOCS_FILE_REPO, REQUIREMENT_FILENAME
from metagpt.context import context
from metagpt.context import CONTEXT
from metagpt.schema import Message
@ -18,12 +18,12 @@ from metagpt.schema import Message
async def test_prepare_documents():
msg = Message(content="New user requirements balabala...")
if context.git_repo:
context.git_repo.delete_repository()
context.git_repo = None
if CONTEXT.git_repo:
CONTEXT.git_repo.delete_repository()
CONTEXT.git_repo = None
await PrepareDocuments(g_context=context).run(with_messages=[msg])
assert context.git_repo
doc = await context.file_repo.get_file(filename=REQUIREMENT_FILENAME, relative_path=DOCS_FILE_REPO)
await PrepareDocuments(g_context=CONTEXT).run(with_messages=[msg])
assert CONTEXT.git_repo
doc = await CONTEXT.file_repo.get_file(filename=REQUIREMENT_FILENAME, relative_path=DOCS_FILE_REPO)
assert doc
assert doc.content == msg.content

View file

@ -10,7 +10,7 @@ import pytest
from metagpt.actions.project_management import WriteTasks
from metagpt.const import PRDS_FILE_REPO, SYSTEM_DESIGN_FILE_REPO
from metagpt.context import context
from metagpt.context import CONTEXT
from metagpt.logs import logger
from metagpt.schema import Message
from tests.metagpt.actions.mock_json import DESIGN, PRD
@ -18,9 +18,9 @@ from tests.metagpt.actions.mock_json import DESIGN, PRD
@pytest.mark.asyncio
async def test_design_api():
await context.file_repo.save_file("1.txt", content=str(PRD), relative_path=PRDS_FILE_REPO)
await context.file_repo.save_file("1.txt", content=str(DESIGN), relative_path=SYSTEM_DESIGN_FILE_REPO)
logger.info(context.git_repo)
await CONTEXT.file_repo.save_file("1.txt", content=str(PRD), relative_path=PRDS_FILE_REPO)
await CONTEXT.file_repo.save_file("1.txt", content=str(DESIGN), relative_path=SYSTEM_DESIGN_FILE_REPO)
logger.info(CONTEXT.git_repo)
action = WriteTasks()

View file

@ -11,7 +11,7 @@ import pytest
from metagpt.actions.summarize_code import SummarizeCode
from metagpt.config import CONFIG
from metagpt.const import SYSTEM_DESIGN_FILE_REPO, TASK_FILE_REPO
from metagpt.context import context
from metagpt.context import CONTEXT
from metagpt.logs import logger
from metagpt.schema import CodeSummarizeContext
@ -178,15 +178,15 @@ class Snake:
@pytest.mark.asyncio
async def test_summarize_code():
context.src_workspace = context.git_repo.workdir / "src"
await context.file_repo.save_file(filename="1.json", relative_path=SYSTEM_DESIGN_FILE_REPO, content=DESIGN_CONTENT)
await context.file_repo.save_file(filename="1.json", relative_path=TASK_FILE_REPO, content=TASK_CONTENT)
await context.file_repo.save_file(filename="food.py", relative_path=CONFIG.src_workspace, content=FOOD_PY)
await context.file_repo.save_file(filename="game.py", relative_path=CONFIG.src_workspace, content=GAME_PY)
await context.file_repo.save_file(filename="main.py", relative_path=CONFIG.src_workspace, content=MAIN_PY)
await context.file_repo.save_file(filename="snake.py", relative_path=CONFIG.src_workspace, content=SNAKE_PY)
CONTEXT.src_workspace = CONTEXT.git_repo.workdir / "src"
await CONTEXT.file_repo.save_file(filename="1.json", relative_path=SYSTEM_DESIGN_FILE_REPO, content=DESIGN_CONTENT)
await CONTEXT.file_repo.save_file(filename="1.json", relative_path=TASK_FILE_REPO, content=TASK_CONTENT)
await CONTEXT.file_repo.save_file(filename="food.py", relative_path=CONFIG.src_workspace, content=FOOD_PY)
await CONTEXT.file_repo.save_file(filename="game.py", relative_path=CONFIG.src_workspace, content=GAME_PY)
await CONTEXT.file_repo.save_file(filename="main.py", relative_path=CONFIG.src_workspace, content=MAIN_PY)
await CONTEXT.file_repo.save_file(filename="snake.py", relative_path=CONFIG.src_workspace, content=SNAKE_PY)
src_file_repo = context.git_repo.new_file_repository(relative_path=CONFIG.src_workspace)
src_file_repo = CONTEXT.git_repo.new_file_repository(relative_path=CONFIG.src_workspace)
all_files = src_file_repo.all_files
ctx = CodeSummarizeContext(design_filename="1.json", task_filename="1.json", codes_filenames=all_files)
action = SummarizeCode(context=ctx)

View file

@ -18,7 +18,7 @@ from metagpt.const import (
TASK_FILE_REPO,
TEST_OUTPUTS_FILE_REPO,
)
from metagpt.context import context
from metagpt.context import CONTEXT
from metagpt.logs import logger
from metagpt.provider.openai_api import OpenAILLM as LLM
from metagpt.schema import CodingContext, Document
@ -53,35 +53,35 @@ async def test_write_code_directly():
@pytest.mark.asyncio
async def test_write_code_deps():
# Prerequisites
context.src_workspace = context.git_repo.workdir / "snake1/snake1"
CONTEXT.src_workspace = CONTEXT.git_repo.workdir / "snake1/snake1"
demo_path = Path(__file__).parent / "../../data/demo_project"
await context.file_repo.save_file(
await CONTEXT.file_repo.save_file(
filename="test_game.py.json",
content=await aread(str(demo_path / "test_game.py.json")),
relative_path=TEST_OUTPUTS_FILE_REPO,
)
await context.file_repo.save_file(
await CONTEXT.file_repo.save_file(
filename="20231221155954.json",
content=await aread(str(demo_path / "code_summaries.json")),
relative_path=CODE_SUMMARIES_FILE_REPO,
)
await context.file_repo.save_file(
await CONTEXT.file_repo.save_file(
filename="20231221155954.json",
content=await aread(str(demo_path / "system_design.json")),
relative_path=SYSTEM_DESIGN_FILE_REPO,
)
await context.file_repo.save_file(
await CONTEXT.file_repo.save_file(
filename="20231221155954.json", content=await aread(str(demo_path / "tasks.json")), relative_path=TASK_FILE_REPO
)
await context.file_repo.save_file(
filename="main.py", content='if __name__ == "__main__":\nmain()', relative_path=context.src_workspace
await CONTEXT.file_repo.save_file(
filename="main.py", content='if __name__ == "__main__":\nmain()', relative_path=CONTEXT.src_workspace
)
ccontext = CodingContext(
filename="game.py",
design_doc=await context.file_repo.get_file(
design_doc=await CONTEXT.file_repo.get_file(
filename="20231221155954.json", relative_path=SYSTEM_DESIGN_FILE_REPO
),
task_doc=await context.file_repo.get_file(filename="20231221155954.json", relative_path=TASK_FILE_REPO),
task_doc=await CONTEXT.file_repo.get_file(filename="20231221155954.json", relative_path=TASK_FILE_REPO),
code_doc=Document(filename="game.py", content="", root_path="snake1"),
)
coding_doc = Document(root_path="snake1", filename="game.py", content=ccontext.json())

View file

@ -10,7 +10,7 @@ import pytest
from metagpt.actions import UserRequirement, WritePRD
from metagpt.const import DOCS_FILE_REPO, PRDS_FILE_REPO, REQUIREMENT_FILENAME
from metagpt.context import context
from metagpt.context import CONTEXT
from metagpt.logs import logger
from metagpt.roles.product_manager import ProductManager
from metagpt.roles.role import RoleReactMode
@ -33,7 +33,7 @@ async def test_write_prd(new_filename):
# Assert the prd is not None or empty
assert prd is not None
assert prd.content != ""
assert context.git_repo.new_file_repository(relative_path=PRDS_FILE_REPO).changed_files
assert CONTEXT.git_repo.new_file_repository(relative_path=PRDS_FILE_REPO).changed_files
if __name__ == "__main__":

View file

@ -13,7 +13,7 @@ import pytest
from metagpt.actions import WriteDesign, WritePRD
from metagpt.const import PRDS_FILE_REPO
from metagpt.context import context
from metagpt.context import CONTEXT
from metagpt.logs import logger
from metagpt.roles import Architect
from metagpt.schema import Message
@ -25,7 +25,7 @@ from tests.metagpt.roles.mock import MockMessages
async def test_architect():
# Prerequisites
filename = uuid.uuid4().hex + ".json"
await awrite(context.git_repo.workdir / PRDS_FILE_REPO / filename, data=MockMessages.prd.content)
await awrite(CONTEXT.git_repo.workdir / PRDS_FILE_REPO / filename, data=MockMessages.prd.content)
role = Architect()
rsp = await role.run(with_message=Message(content="", cause_by=WritePRD))

View file

@ -12,7 +12,7 @@ from pydantic import BaseModel
from metagpt.actions.skill_action import SkillAction
from metagpt.actions.talk_action import TalkAction
from metagpt.context import context
from metagpt.context import CONTEXT
from metagpt.memory.brain_memory import BrainMemory
from metagpt.roles.assistant import Assistant
from metagpt.schema import Message
@ -21,7 +21,7 @@ from metagpt.utils.common import any_to_str
@pytest.mark.asyncio
async def test_run():
context.kwargs.language = "Chinese"
CONTEXT.kwargs.language = "Chinese"
class Input(BaseModel):
memory: BrainMemory
@ -65,7 +65,7 @@ async def test_run():
"cause_by": any_to_str(SkillAction),
},
]
context.kwargs.agent_skills = [
CONTEXT.kwargs.agent_skills = [
{"id": 1, "name": "text_to_speech", "type": "builtin", "config": {}, "enabled": True},
{"id": 2, "name": "text_to_image", "type": "builtin", "config": {}, "enabled": True},
{"id": 3, "name": "ai_call", "type": "builtin", "config": {}, "enabled": True},
@ -77,8 +77,8 @@ async def test_run():
for i in inputs:
seed = Input(**i)
context.kwargs.language = seed.language
context.kwargs.agent_description = seed.agent_description
CONTEXT.kwargs.language = seed.language
CONTEXT.kwargs.agent_description = seed.agent_description
role = Assistant(language="Chinese")
role.memory = seed.memory # Restore historical conversation content.
while True:

View file

@ -19,7 +19,7 @@ from metagpt.const import (
SYSTEM_DESIGN_FILE_REPO,
TASK_FILE_REPO,
)
from metagpt.context import context
from metagpt.context import CONTEXT
from metagpt.logs import logger
from metagpt.roles.engineer import Engineer
from metagpt.schema import CodingContext, Message
@ -32,19 +32,19 @@ from tests.metagpt.roles.mock import STRS_FOR_PARSING, TASKS, MockMessages
async def test_engineer():
# Prerequisites
rqno = "20231221155954.json"
await context.file_repo.save_file(REQUIREMENT_FILENAME, content=MockMessages.req.content)
await context.file_repo.save_file(rqno, relative_path=PRDS_FILE_REPO, content=MockMessages.prd.content)
await context.file_repo.save_file(
await CONTEXT.file_repo.save_file(REQUIREMENT_FILENAME, content=MockMessages.req.content)
await CONTEXT.file_repo.save_file(rqno, relative_path=PRDS_FILE_REPO, content=MockMessages.prd.content)
await CONTEXT.file_repo.save_file(
rqno, relative_path=SYSTEM_DESIGN_FILE_REPO, content=MockMessages.system_design.content
)
await context.file_repo.save_file(rqno, relative_path=TASK_FILE_REPO, content=MockMessages.json_tasks.content)
await CONTEXT.file_repo.save_file(rqno, relative_path=TASK_FILE_REPO, content=MockMessages.json_tasks.content)
engineer = Engineer()
rsp = await engineer.run(Message(content="", cause_by=WriteTasks))
logger.info(rsp)
assert rsp.cause_by == any_to_str(WriteCode)
src_file_repo = context.git_repo.new_file_repository(context.src_workspace)
src_file_repo = CONTEXT.git_repo.new_file_repository(CONTEXT.src_workspace)
assert src_file_repo.changed_files
@ -116,19 +116,19 @@ async def test_new_coding_context():
# Prerequisites
demo_path = Path(__file__).parent / "../../data/demo_project"
deps = json.loads(await aread(demo_path / "dependencies.json"))
dependency = await context.git_repo.get_dependency()
dependency = await CONTEXT.git_repo.get_dependency()
for k, v in deps.items():
await dependency.update(k, set(v))
data = await aread(demo_path / "system_design.json")
rqno = "20231221155954.json"
await awrite(context.git_repo.workdir / SYSTEM_DESIGN_FILE_REPO / rqno, data)
await awrite(CONTEXT.git_repo.workdir / SYSTEM_DESIGN_FILE_REPO / rqno, data)
data = await aread(demo_path / "tasks.json")
await awrite(context.git_repo.workdir / TASK_FILE_REPO / rqno, data)
await awrite(CONTEXT.git_repo.workdir / TASK_FILE_REPO / rqno, data)
context.src_workspace = Path(context.git_repo.workdir) / "game_2048"
src_file_repo = context.git_repo.new_file_repository(relative_path=context.src_workspace)
task_file_repo = context.git_repo.new_file_repository(relative_path=TASK_FILE_REPO)
design_file_repo = context.git_repo.new_file_repository(relative_path=SYSTEM_DESIGN_FILE_REPO)
CONTEXT.src_workspace = Path(CONTEXT.git_repo.workdir) / "game_2048"
src_file_repo = CONTEXT.git_repo.new_file_repository(relative_path=CONTEXT.src_workspace)
task_file_repo = CONTEXT.git_repo.new_file_repository(relative_path=TASK_FILE_REPO)
design_file_repo = CONTEXT.git_repo.new_file_repository(relative_path=SYSTEM_DESIGN_FILE_REPO)
filename = "game.py"
ctx_doc = await Engineer._new_coding_doc(
@ -149,8 +149,8 @@ async def test_new_coding_context():
assert ctx.task_doc.content
assert ctx.code_doc
context.git_repo.add_change({f"{TASK_FILE_REPO}/{rqno}": ChangeType.UNTRACTED})
context.git_repo.commit("mock env")
CONTEXT.git_repo.add_change({f"{TASK_FILE_REPO}/{rqno}": ChangeType.UNTRACTED})
CONTEXT.git_repo.commit("mock env")
await src_file_repo.save(filename=filename, content="content")
role = Engineer()
assert not role.code_todos

View file

@ -13,7 +13,7 @@ from pydantic import Field
from metagpt.actions import DebugError, RunCode, WriteTest
from metagpt.actions.summarize_code import SummarizeCode
from metagpt.context import context
from metagpt.context import CONTEXT
from metagpt.environment import Environment
from metagpt.roles import QaEngineer
from metagpt.schema import Message
@ -23,10 +23,10 @@ from metagpt.utils.common import any_to_str, aread, awrite
async def test_qa():
# Prerequisites
demo_path = Path(__file__).parent / "../../data/demo_project"
context.src_workspace = Path(context.git_repo.workdir) / "qa/game_2048"
CONTEXT.src_workspace = Path(CONTEXT.git_repo.workdir) / "qa/game_2048"
data = await aread(filename=demo_path / "game.py", encoding="utf-8")
await awrite(filename=context.src_workspace / "game.py", data=data, encoding="utf-8")
await awrite(filename=Path(context.git_repo.workdir) / "requirements.txt", data="")
await awrite(filename=CONTEXT.src_workspace / "game.py", data=data, encoding="utf-8")
await awrite(filename=Path(CONTEXT.git_repo.workdir) / "requirements.txt", data="")
class MockEnv(Environment):
msgs: List[Message] = Field(default_factory=list)

View file

@ -10,7 +10,7 @@ from typing import Dict, Optional
import pytest
from pydantic import BaseModel
from metagpt.context import context
from metagpt.context import CONTEXT
from metagpt.roles.teacher import Teacher
from metagpt.schema import Message
@ -97,8 +97,8 @@ async def test_new_file_name():
@pytest.mark.asyncio
async def test_run():
context.kwargs.language = "Chinese"
context.kwargs.teaching_language = "English"
CONTEXT.kwargs.language = "Chinese"
CONTEXT.kwargs.teaching_language = "English"
lesson = """
UNIT 1 Making New Friends
TOPIC 1 Welcome to China!

View file

@ -6,7 +6,7 @@
@File : test_context.py
"""
from metagpt.configs.llm_config import LLMType
from metagpt.context import AttrDict, Context, context
from metagpt.context import CONTEXT, AttrDict, Context
def test_attr_dict_1():
@ -52,11 +52,11 @@ def test_context_1():
def test_context_2():
llm = context.config.get_openai_llm()
llm = CONTEXT.config.get_openai_llm()
assert llm is not None
assert llm.api_type == LLMType.OPENAI
kwargs = context.kwargs
kwargs = CONTEXT.kwargs
assert kwargs is not None
kwargs.test_key = "test_value"

View file

@ -13,7 +13,7 @@ from pathlib import Path
import pytest
from metagpt.actions import UserRequirement
from metagpt.context import context
from metagpt.context import CONTEXT
from metagpt.environment import Environment
from metagpt.logs import logger
from metagpt.roles import Architect, ProductManager, Role
@ -46,9 +46,9 @@ def test_get_roles(env: Environment):
@pytest.mark.asyncio
async def test_publish_and_process_message(env: Environment):
if context.git_repo:
context.git_repo.delete_repository()
context.git_repo = None
if CONTEXT.git_repo:
CONTEXT.git_repo.delete_repository()
CONTEXT.git_repo = None
product_manager = ProductManager(name="Alice", profile="Product Manager", goal="做AI Native产品", constraints="资源有限")
architect = Architect(