beswarm 0.2.7__tar.gz → 0.2.9__tar.gz

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.
Files changed (146) hide show
  1. {beswarm-0.2.7 → beswarm-0.2.9}/PKG-INFO +1 -1
  2. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/setup.py +1 -1
  3. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/core/request.py +3 -17
  4. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/core/utils.py +1 -0
  5. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/tools/worker.py +33 -22
  6. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/utils.py +2 -2
  7. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm.egg-info/PKG-INFO +1 -1
  8. {beswarm-0.2.7 → beswarm-0.2.9}/pyproject.toml +1 -1
  9. {beswarm-0.2.7 → beswarm-0.2.9}/MANIFEST.in +0 -0
  10. {beswarm-0.2.7 → beswarm-0.2.9}/README.md +0 -0
  11. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/__init__.py +0 -0
  12. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/main.py +0 -0
  13. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/__init__.py +0 -0
  14. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/core/__init__.py +0 -0
  15. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/core/log_config.py +0 -0
  16. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/core/models.py +0 -0
  17. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/core/response.py +0 -0
  18. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/core/test/test_base_api.py +0 -0
  19. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/core/test/test_geminimask.py +0 -0
  20. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/core/test/test_image.py +0 -0
  21. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/core/test/test_payload.py +0 -0
  22. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/models/__init__.py +0 -0
  23. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/models/audio.py +0 -0
  24. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/models/base.py +0 -0
  25. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/models/chatgpt.py +0 -0
  26. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/models/claude.py +0 -0
  27. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/models/duckduckgo.py +0 -0
  28. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/models/gemini.py +0 -0
  29. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/models/groq.py +0 -0
  30. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/models/vertex.py +0 -0
  31. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/plugins/__init__.py +0 -0
  32. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/plugins/arXiv.py +0 -0
  33. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/plugins/config.py +0 -0
  34. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/plugins/excute_command.py +0 -0
  35. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/plugins/get_time.py +0 -0
  36. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/plugins/image.py +0 -0
  37. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/plugins/list_directory.py +0 -0
  38. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/plugins/read_file.py +0 -0
  39. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/plugins/read_image.py +0 -0
  40. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/plugins/readonly.py +0 -0
  41. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/plugins/registry.py +0 -0
  42. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/plugins/run_python.py +0 -0
  43. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/plugins/websearch.py +0 -0
  44. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/plugins/write_file.py +0 -0
  45. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/utils/__init__.py +0 -0
  46. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/utils/prompt.py +0 -0
  47. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/src/aient/utils/scripts.py +0 -0
  48. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/chatgpt.py +0 -0
  49. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/claude.py +0 -0
  50. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test.py +0 -0
  51. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_API.py +0 -0
  52. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_Deepbricks.py +0 -0
  53. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_Web_crawler.py +0 -0
  54. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_aiwaves.py +0 -0
  55. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_aiwaves_arxiv.py +0 -0
  56. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_ask_gemini.py +0 -0
  57. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_class.py +0 -0
  58. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_claude.py +0 -0
  59. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_claude_zh_char.py +0 -0
  60. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_ddg_search.py +0 -0
  61. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_download_pdf.py +0 -0
  62. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_gemini.py +0 -0
  63. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_get_token_dict.py +0 -0
  64. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_google_search.py +0 -0
  65. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_jieba.py +0 -0
  66. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_json.py +0 -0
  67. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_logging.py +0 -0
  68. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_ollama.py +0 -0
  69. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_plugin.py +0 -0
  70. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_py_run.py +0 -0
  71. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_requests.py +0 -0
  72. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_search.py +0 -0
  73. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_tikitoken.py +0 -0
  74. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_token.py +0 -0
  75. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_url.py +0 -0
  76. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_whisper.py +0 -0
  77. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_wildcard.py +0 -0
  78. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/aient/test/test_yjh.py +0 -0
  79. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/bemcp/bemcp/__init__.py +0 -0
  80. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/bemcp/bemcp/decorator.py +0 -0
  81. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/bemcp/bemcp/main.py +0 -0
  82. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/bemcp/bemcp/utils.py +0 -0
  83. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/bemcp/test/client.py +0 -0
  84. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/bemcp/test/server.py +0 -0
  85. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/prompt.py +0 -0
  86. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/README.md +0 -0
  87. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
  88. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/c-tags.scm +0 -0
  89. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
  90. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
  91. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
  92. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
  93. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/d-tags.scm +0 -0
  94. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
  95. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
  96. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
  97. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
  98. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
  99. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/go-tags.scm +0 -0
  100. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/java-tags.scm +0 -0
  101. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
  102. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
  103. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
  104. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
  105. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/python-tags.scm +0 -0
  106. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/r-tags.scm +0 -0
  107. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
  108. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
  109. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
  110. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
  111. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
  112. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
  113. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/README.md +0 -0
  114. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/c-tags.scm +0 -0
  115. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
  116. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/cpp-tags.scm +0 -0
  117. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/dart-tags.scm +0 -0
  118. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/elisp-tags.scm +0 -0
  119. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/elixir-tags.scm +0 -0
  120. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/elm-tags.scm +0 -0
  121. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/go-tags.scm +0 -0
  122. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/hcl-tags.scm +0 -0
  123. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/java-tags.scm +0 -0
  124. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/javascript-tags.scm +0 -0
  125. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
  126. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
  127. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/php-tags.scm +0 -0
  128. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/python-tags.scm +0 -0
  129. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/ql-tags.scm +0 -0
  130. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/ruby-tags.scm +0 -0
  131. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/rust-tags.scm +0 -0
  132. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/scala-tags.scm +0 -0
  133. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/queries/tree-sitter-languages/typescript-tags.scm +0 -0
  134. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/tools/__init__.py +0 -0
  135. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/tools/click.py +0 -0
  136. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/tools/edit_file.py +0 -0
  137. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/tools/planner.py +0 -0
  138. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/tools/repomap.py +0 -0
  139. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/tools/screenshot.py +0 -0
  140. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/tools/search_arxiv.py +0 -0
  141. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm/tools/search_web.py +0 -0
  142. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm.egg-info/SOURCES.txt +0 -0
  143. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm.egg-info/dependency_links.txt +0 -0
  144. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm.egg-info/requires.txt +0 -0
  145. {beswarm-0.2.7 → beswarm-0.2.9}/beswarm.egg-info/top_level.txt +0 -0
  146. {beswarm-0.2.7 → beswarm-0.2.9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.2.7
3
+ Version: 0.2.9
4
4
  Summary: MAS
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -4,7 +4,7 @@ from setuptools import setup, find_packages
4
4
 
5
5
  setup(
6
6
  name="aient",
7
- version="1.1.40",
7
+ version="1.1.41",
8
8
  description="Aient: The Awakening of Agent.",
9
9
  long_description=Path.open(Path("README.md"), encoding="utf-8").read(),
10
10
  long_description_content_type="text/markdown",
@@ -10,6 +10,7 @@ from .utils import (
10
10
  c3o,
11
11
  c3h,
12
12
  c35s,
13
+ c4,
13
14
  gemini1,
14
15
  gemini2,
15
16
  gemini2_5_pro_exp,
@@ -576,6 +577,8 @@ async def get_vertex_claude_payload(request, engine, provider, api_key=None):
576
577
  location = c35s
577
578
  elif "claude-3-opus" in original_model:
578
579
  location = c3o
580
+ elif "claude-sonnet-4" in original_model or "claude-opus-4" in original_model:
581
+ location = c4
579
582
  elif "claude-3-sonnet" in original_model:
580
583
  location = c3s
581
584
  elif "claude-3-haiku" in original_model:
@@ -798,23 +801,6 @@ async def get_aws_payload(request, engine, provider, api_key=None):
798
801
  # url = f"{base_url}/model/{original_model}/invoke"
799
802
  url = f"{base_url}/model/{original_model}/invoke-with-response-stream"
800
803
 
801
- # if "claude-3-5-sonnet" in original_model or "claude-3-7-sonnet" in original_model:
802
- # location = c35s
803
- # elif "claude-3-opus" in original_model:
804
- # location = c3o
805
- # elif "claude-3-sonnet" in original_model:
806
- # location = c3s
807
- # elif "claude-3-haiku" in original_model:
808
- # location = c3h
809
-
810
- # claude_stream = "streamRawPredict"
811
- # url = "https://{LOCATION}-aiplatform.googleapis.com/v1/projects/{PROJECT_ID}/locations/{LOCATION}/publishers/anthropic/models/{MODEL}:{stream}".format(
812
- # LOCATION=await location.next(),
813
- # PROJECT_ID=project_id,
814
- # MODEL=original_model,
815
- # stream=claude_stream
816
- # )
817
-
818
804
  messages = []
819
805
  system_prompt = None
820
806
  tool_id = None
@@ -436,6 +436,7 @@ provider_api_circular_list = defaultdict(ThreadSafeCircularList)
436
436
  c35s = ThreadSafeCircularList(["us-east5", "europe-west1"])
437
437
  c3s = ThreadSafeCircularList(["us-east5", "us-central1", "asia-southeast1"])
438
438
  c3o = ThreadSafeCircularList(["us-east5"])
439
+ c4 = ThreadSafeCircularList(["us-east5", "us-central1", "europe-west4", "asia-southeast1"])
439
440
  c3h = ThreadSafeCircularList(["us-east5", "us-central1", "europe-west1", "europe-west4"])
440
441
  gemini1 = ThreadSafeCircularList(["us-central1", "us-east4", "us-west1", "us-west4", "europe-west1", "europe-west2"])
441
442
  gemini2 = ThreadSafeCircularList(["us-central1"])
@@ -2,6 +2,7 @@ import os
2
2
  import re
3
3
  import copy
4
4
  import json
5
+ import difflib
5
6
  import platform
6
7
  from pathlib import Path
7
8
  from datetime import datetime
@@ -34,6 +35,7 @@ async def worker(goal, tools, work_dir, cache_messages=None):
34
35
  start_time = datetime.now()
35
36
  os.chdir(Path(work_dir).absolute())
36
37
  finish_flag = 0
38
+ goal_diff = None
37
39
 
38
40
  mcp_list = [item for item in tools if isinstance(item, dict)]
39
41
  if mcp_list:
@@ -75,6 +77,14 @@ async def worker(goal, tools, work_dir, cache_messages=None):
75
77
  with cache_file_path.open("r", encoding="utf-8") as f:
76
78
  cache_messages = json.load(f)
77
79
  if cache_messages and isinstance(cache_messages, list) and len(cache_messages) > 1:
80
+ old_goal = extract_xml_content(cache_messages[1]["content"], "goal")
81
+ if old_goal.strip() != goal.strip():
82
+ diff_generator = difflib.ndiff(old_goal.splitlines(), goal.splitlines())
83
+ changed_lines = []
84
+ for line in diff_generator:
85
+ if (line.startswith('+ ') or line.startswith('- ')) and line[2:].strip():
86
+ changed_lines.append(line)
87
+ goal_diff = '\n'.join(changed_lines).strip()
78
88
  first_user_message = replace_xml_content(cache_messages[1]["content"], "goal", goal)
79
89
  work_agent_config["cache_messages"] = cache_messages[0:1] + [{"role": "user", "content": first_user_message}] + cache_messages[2:]
80
90
 
@@ -94,15 +104,13 @@ async def worker(goal, tools, work_dir, cache_messages=None):
94
104
  async def instruction_agent_task():
95
105
  last_instruction = None
96
106
  while True:
97
-
98
- instruction_prompt = f"""
99
- </work_agent_conversation_end>
100
- 任务目标: {goal}
101
-
102
- 在 tag <work_agent_conversation_start>...</work_agent_conversation_end> 之前的对话历史都是工作智能体的对话历史。
103
-
104
- 根据以上对话历史和目标,请生成下一步指令。如果任务已完成,请回复"任务已完成"。
105
- """
107
+ instruction_prompt = "".join([
108
+ "</work_agent_conversation_end>\n\n",
109
+ f"任务目标: {goal}\n\n",
110
+ f"任务目标新变化:\n{goal_diff}\n\n" if goal_diff else "",
111
+ "在 tag <work_agent_conversation_start>...</work_agent_conversation_end> 之前的对话历史都是工作智能体的对话历史。\n\n",
112
+ "根据以上对话历史和目标,请生成下一步指令。如果任务已完成,请回复'任务已完成'。\n\n",
113
+ ])
106
114
  if last_instruction:
107
115
  instruction_prompt = (
108
116
  f"{instruction_prompt}\n\n"
@@ -156,8 +164,6 @@ async def worker(goal, tools, work_dir, cache_messages=None):
156
164
  raise Exception(f"The request body is too long, please try again.")
157
165
  if "任务已完成" == next_instruction.strip():
158
166
  break
159
- if "<instructions>" in next_instruction and "</instructions>" not in next_instruction:
160
- next_instruction = next_instruction + "\n</instructions>"
161
167
  last_instruction = next_instruction
162
168
  next_instruction = extract_xml_content(next_instruction, "instructions")
163
169
  if not next_instruction:
@@ -222,6 +228,7 @@ async def worker_gen(goal, tools, work_dir, cache_messages=None):
222
228
  start_time = datetime.now()
223
229
  os.chdir(Path(work_dir).absolute())
224
230
  finish_flag = 0
231
+ goal_diff = None
225
232
 
226
233
  mcp_list = [item for item in tools if isinstance(item, dict)]
227
234
  if mcp_list:
@@ -263,6 +270,14 @@ async def worker_gen(goal, tools, work_dir, cache_messages=None):
263
270
  with cache_file_path.open("r", encoding="utf-8") as f:
264
271
  cache_messages = json.load(f)
265
272
  if cache_messages and isinstance(cache_messages, list) and len(cache_messages) > 1:
273
+ old_goal = extract_xml_content(cache_messages[1]["content"], "goal")
274
+ if old_goal.strip() != goal.strip():
275
+ diff_generator = difflib.ndiff(old_goal.splitlines(), goal.splitlines())
276
+ changed_lines = []
277
+ for line in diff_generator:
278
+ if (line.startswith('+ ') or line.startswith('- ')) and line[2:].strip():
279
+ changed_lines.append(line)
280
+ goal_diff = '\n'.join(changed_lines).strip()
266
281
  first_user_message = replace_xml_content(cache_messages[1]["content"], "goal", goal)
267
282
  work_agent_config["cache_messages"] = cache_messages[0:1] + [{"role": "user", "content": first_user_message}] + cache_messages[2:]
268
283
 
@@ -282,15 +297,13 @@ async def worker_gen(goal, tools, work_dir, cache_messages=None):
282
297
  async def instruction_agent_task():
283
298
  last_instruction = None
284
299
  while True:
285
-
286
- instruction_prompt = f"""
287
- </work_agent_conversation_end>
288
- 任务目标: {goal}
289
-
290
- 在 tag <work_agent_conversation_start>...</work_agent_conversation_end> 之前的对话历史都是工作智能体的对话历史。
291
-
292
- 根据以上对话历史和目标,请生成下一步指令。如果任务已完成,请回复"任务已完成"。
293
- """
300
+ instruction_prompt = "".join([
301
+ "</work_agent_conversation_end>\n\n",
302
+ f"任务目标: {goal}\n\n",
303
+ f"任务目标新变化:\n{goal_diff}\n\n" if goal_diff else "",
304
+ "在 tag <work_agent_conversation_start>...</work_agent_conversation_end> 之前的对话历史都是工作智能体的对话历史。\n\n",
305
+ "根据以上对话历史和目标,请生成下一步指令。如果任务已完成,请回复'任务已完成'。\n\n",
306
+ ])
294
307
  if last_instruction:
295
308
  instruction_prompt = (
296
309
  f"{instruction_prompt}\n\n"
@@ -344,8 +357,6 @@ async def worker_gen(goal, tools, work_dir, cache_messages=None):
344
357
  raise Exception(f"The request body is too long, please try again.")
345
358
  if "任务已完成" == next_instruction.strip():
346
359
  break
347
- if "<instructions>" in next_instruction and "</instructions>" not in next_instruction:
348
- next_instruction = next_instruction + "\n</instructions>"
349
360
  last_instruction = next_instruction
350
361
  next_instruction = extract_xml_content(next_instruction, "instructions")
351
362
  if not next_instruction:
@@ -2,13 +2,13 @@ import re
2
2
 
3
3
  def extract_xml_content(text, xml_tag):
4
4
  result = ''
5
- pattern = rf'^<{xml_tag}>$\n*([\D\d\s]+?)\n*^<\/{xml_tag}>$'
5
+ pattern = rf'^<{xml_tag}>([\D\d\s]+?)<\/{xml_tag}>$'
6
6
  match = re.search(pattern, text, re.MULTILINE)
7
7
  if match:
8
8
  result = match.group(1)
9
9
  if not result:
10
10
  return ''
11
- return result
11
+ return result.strip()
12
12
 
13
13
  def replace_xml_content(original_string: str, tag_name: str, replacement_content: str) -> str:
14
14
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.2.7
3
+ Version: 0.2.9
4
4
  Summary: MAS
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "beswarm"
3
- version = "0.2.7"
3
+ version = "0.2.9"
4
4
  description = "MAS"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes