beswarm 0.3.13__tar.gz → 0.3.14__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 (138) hide show
  1. {beswarm-0.3.13 → beswarm-0.3.14}/PKG-INFO +1 -1
  2. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/architext/architext/core.py +9 -1
  3. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/architext/test/test.py +26 -0
  4. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/core/request.py +10 -7
  5. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/core/utils.py +1 -1
  6. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/models/chatgpt.py +17 -0
  7. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm.egg-info/PKG-INFO +1 -1
  8. {beswarm-0.3.13 → beswarm-0.3.14}/pyproject.toml +1 -1
  9. {beswarm-0.3.13 → beswarm-0.3.14}/MANIFEST.in +0 -0
  10. {beswarm-0.3.13 → beswarm-0.3.14}/README.md +0 -0
  11. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/__init__.py +0 -0
  12. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/agents/chatgroup.py +0 -0
  13. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/agents/planact.py +0 -0
  14. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/__init__.py +0 -0
  15. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/architext/architext/__init__.py +0 -0
  16. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/architext/test/openai_client.py +0 -0
  17. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/architext/test/test_save_load.py +0 -0
  18. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/core/__init__.py +0 -0
  19. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/core/log_config.py +0 -0
  20. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/core/models.py +0 -0
  21. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/core/response.py +0 -0
  22. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/core/test/test_base_api.py +0 -0
  23. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/core/test/test_geminimask.py +0 -0
  24. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/core/test/test_image.py +0 -0
  25. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/core/test/test_payload.py +0 -0
  26. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/models/__init__.py +0 -0
  27. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/models/audio.py +0 -0
  28. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/models/base.py +0 -0
  29. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/plugins/__init__.py +0 -0
  30. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/plugins/arXiv.py +0 -0
  31. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/plugins/config.py +0 -0
  32. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/plugins/excute_command.py +0 -0
  33. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/plugins/get_time.py +0 -0
  34. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/plugins/image.py +0 -0
  35. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/plugins/list_directory.py +0 -0
  36. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/plugins/read_image.py +0 -0
  37. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/plugins/readonly.py +0 -0
  38. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/plugins/registry.py +0 -0
  39. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/plugins/run_python.py +0 -0
  40. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/plugins/websearch.py +0 -0
  41. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/utils/__init__.py +0 -0
  42. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/utils/prompt.py +0 -0
  43. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/aient/utils/scripts.py +0 -0
  44. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/test/test_Web_crawler.py +0 -0
  45. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/test/test_ddg_search.py +0 -0
  46. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/test/test_google_search.py +0 -0
  47. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/test/test_ollama.py +0 -0
  48. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/test/test_plugin.py +0 -0
  49. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/test/test_url.py +0 -0
  50. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/aient/test/test_whisper.py +0 -0
  51. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/bemcp/bemcp/__init__.py +0 -0
  52. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/bemcp/bemcp/decorator.py +0 -0
  53. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/bemcp/bemcp/main.py +0 -0
  54. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/bemcp/bemcp/utils.py +0 -0
  55. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/bemcp/test/client.py +0 -0
  56. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/bemcp/test/server.py +0 -0
  57. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/broker.py +0 -0
  58. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/cli.py +0 -0
  59. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/core.py +0 -0
  60. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/knowledge_graph.py +0 -0
  61. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/prompt.py +0 -0
  62. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/README.md +0 -0
  63. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
  64. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/c-tags.scm +0 -0
  65. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
  66. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
  67. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
  68. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
  69. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/d-tags.scm +0 -0
  70. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
  71. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
  72. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
  73. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
  74. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
  75. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/go-tags.scm +0 -0
  76. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/java-tags.scm +0 -0
  77. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
  78. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
  79. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
  80. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
  81. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/python-tags.scm +0 -0
  82. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/r-tags.scm +0 -0
  83. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
  84. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
  85. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
  86. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
  87. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
  88. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
  89. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/README.md +0 -0
  90. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/c-tags.scm +0 -0
  91. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
  92. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/cpp-tags.scm +0 -0
  93. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/dart-tags.scm +0 -0
  94. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/elisp-tags.scm +0 -0
  95. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/elixir-tags.scm +0 -0
  96. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/elm-tags.scm +0 -0
  97. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/go-tags.scm +0 -0
  98. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/hcl-tags.scm +0 -0
  99. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/java-tags.scm +0 -0
  100. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/javascript-tags.scm +0 -0
  101. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
  102. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
  103. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/php-tags.scm +0 -0
  104. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/python-tags.scm +0 -0
  105. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/ql-tags.scm +0 -0
  106. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/ruby-tags.scm +0 -0
  107. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/rust-tags.scm +0 -0
  108. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/scala-tags.scm +0 -0
  109. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/queries/tree-sitter-languages/typescript-tags.scm +0 -0
  110. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/taskmanager.py +0 -0
  111. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/__init__.py +0 -0
  112. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/click.py +0 -0
  113. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/completion.py +0 -0
  114. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/deep_search.py +0 -0
  115. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/edit_file.py +0 -0
  116. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/graph.py +0 -0
  117. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/planner.py +0 -0
  118. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/read_file.py +0 -0
  119. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/repomap.py +0 -0
  120. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/request_input.py +0 -0
  121. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/screenshot.py +0 -0
  122. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/search_arxiv.py +0 -0
  123. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/search_web.py +0 -0
  124. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/subtasks.py +0 -0
  125. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/worker.py +0 -0
  126. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/write_csv.py +0 -0
  127. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/tools/write_file.py +0 -0
  128. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm/utils.py +0 -0
  129. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm.egg-info/SOURCES.txt +0 -0
  130. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm.egg-info/dependency_links.txt +0 -0
  131. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm.egg-info/entry_points.txt +0 -0
  132. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm.egg-info/requires.txt +0 -0
  133. {beswarm-0.3.13 → beswarm-0.3.14}/beswarm.egg-info/top_level.txt +0 -0
  134. {beswarm-0.3.13 → beswarm-0.3.14}/setup.cfg +0 -0
  135. {beswarm-0.3.13 → beswarm-0.3.14}/test/test_TaskManager.py +0 -0
  136. {beswarm-0.3.13 → beswarm-0.3.14}/test/test_broker.py +0 -0
  137. {beswarm-0.3.13 → beswarm-0.3.14}/test/test_graph.py +0 -0
  138. {beswarm-0.3.13 → beswarm-0.3.14}/test/test_new_TaskManager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.3.13
3
+ Version: 0.3.14
4
4
  Summary: MAS
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -423,8 +423,16 @@ class Message(ABC):
423
423
  processed_items.append(Images(url=image_url))
424
424
  else:
425
425
  raise ValueError(f"Unsupported item type in list: {item_type}")
426
+ elif isinstance(item, dict):
427
+ item_type = item.get('type')
428
+ if item_type == 'image_url':
429
+ image_url = item.get('image_url', {}).get('url')
430
+ if image_url:
431
+ processed_items.append(Images(url=image_url))
432
+ else:
433
+ raise ValueError(f"Unsupported dict item type: {item_type}")
426
434
  else:
427
- raise TypeError(f"Unsupported item type: {type(item)}. Must be str, ContextProvider, or list.")
435
+ raise TypeError(f"Unsupported item type: {type(item)}. Must be str, ContextProvider, list, or dict.")
428
436
  self._items: List[ContextProvider] = processed_items
429
437
  self._parent_messages: Optional['Messages'] = None
430
438
 
@@ -1884,6 +1884,32 @@ Files: {Files(visible=True, name="files")}
1884
1884
  if os.path.exists(non_existent_file):
1885
1885
  os.remove(non_existent_file)
1886
1886
 
1887
+ async def test_auto_convert_image_dict_to_image_provider(self):
1888
+ """测试 UserMessage 是否能自动转换 image_url 字典为 Images provider"""
1889
+ base64_image_data = "/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKAP/2Q=="
1890
+ image_dict = {
1891
+ 'type': 'image_url',
1892
+ 'image_url': {
1893
+ 'url': f'data:image/jpeg;base64,{base64_image_data}'
1894
+ }
1895
+ }
1896
+
1897
+ # This is the functionality we are testing.
1898
+ # The UserMessage should be able to take this dictionary directly.
1899
+ message = UserMessage(image_dict)
1900
+
1901
+ # 1. Verify that the message contains exactly one provider.
1902
+ self.assertEqual(len(message.provider()), 1)
1903
+
1904
+ # 2. Verify that the provider is an instance of the Images class.
1905
+ image_provider = message.provider()[0]
1906
+ self.assertIsInstance(image_provider, Images)
1907
+
1908
+ # 3. Verify that the content of the Images provider is correct.
1909
+ rendered = await message.render_latest()
1910
+ self.assertEqual(rendered['content'][0]['image_url']['url'], image_dict['image_url']['url'])
1911
+
1912
+
1887
1913
  # ==============================================================================
1888
1914
  # 6. 演示
1889
1915
  # ==============================================================================
@@ -295,7 +295,7 @@ async def get_gemini_payload(request, engine, provider, api_key=None):
295
295
  if key == request.model:
296
296
  for k, v in value.items():
297
297
  payload[k] = v
298
- elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key:
298
+ elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key and " " not in key:
299
299
  payload[key] = value
300
300
 
301
301
  return url, headers, payload
@@ -591,7 +591,7 @@ async def get_vertex_gemini_payload(request, engine, provider, api_key=None):
591
591
  if key == request.model:
592
592
  for k, v in value.items():
593
593
  payload[k] = v
594
- elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key:
594
+ elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key and " " not in key:
595
595
  payload[key] = value
596
596
 
597
597
  return url, headers, payload
@@ -1116,6 +1116,9 @@ async def get_gpt_payload(request, engine, provider, api_key=None):
1116
1116
  if "temperature" in payload:
1117
1117
  payload.pop("temperature")
1118
1118
 
1119
+ if "v1/responses" in url:
1120
+ payload.pop("stream_options", None)
1121
+
1119
1122
  # 代码生成/数学解题  0.0
1120
1123
  # 数据抽取/分析 1.0
1121
1124
  # 通用对话 1.3
@@ -1149,7 +1152,7 @@ async def get_gpt_payload(request, engine, provider, api_key=None):
1149
1152
  if key == request.model:
1150
1153
  for k, v in value.items():
1151
1154
  payload[k] = v
1152
- elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key:
1155
+ elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key and " " not in key:
1153
1156
  payload[key] = value
1154
1157
 
1155
1158
  return url, headers, payload
@@ -1247,7 +1250,7 @@ async def get_azure_payload(request, engine, provider, api_key=None):
1247
1250
  if key == request.model:
1248
1251
  for k, v in value.items():
1249
1252
  payload[k] = v
1250
- elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key:
1253
+ elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key and " " not in key:
1251
1254
  payload[key] = value
1252
1255
 
1253
1256
  return url, headers, payload
@@ -1367,7 +1370,7 @@ async def get_azure_databricks_payload(request, engine, provider, api_key=None):
1367
1370
  if key == request.model:
1368
1371
  for k, v in value.items():
1369
1372
  payload[k] = v
1370
- elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key:
1373
+ elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key and " " not in key:
1371
1374
  payload[key] = value
1372
1375
 
1373
1376
  return url, headers, payload
@@ -1454,7 +1457,7 @@ async def get_openrouter_payload(request, engine, provider, api_key=None):
1454
1457
  if key == request.model:
1455
1458
  for k, v in value.items():
1456
1459
  payload[k] = v
1457
- elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key:
1460
+ elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key and " " not in key:
1458
1461
  payload[key] = value
1459
1462
 
1460
1463
  return url, headers, payload
@@ -1820,7 +1823,7 @@ async def get_claude_payload(request, engine, provider, api_key=None):
1820
1823
  if key == request.model:
1821
1824
  for k, v in value.items():
1822
1825
  payload[k] = v
1823
- elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key:
1826
+ elif all(_model not in request.model.lower() for _model in model_dict.keys()) and "-" not in key and " " not in key:
1824
1827
  payload[key] = value
1825
1828
 
1826
1829
  return url, headers, payload
@@ -52,7 +52,7 @@ class BaseAPI:
52
52
  self.v1_models: str = urlunparse(parsed_url[:2] + (before_v1 + "models",) + ("",) * 3)
53
53
 
54
54
  if "v1/responses" in parsed_url.path:
55
- self.chat_url: str = urlunparse(parsed_url[:2] + ("v1/responses",) + ("",) * 3)
55
+ self.chat_url: str = api_url
56
56
  else:
57
57
  self.chat_url: str = urlunparse(parsed_url[:2] + (before_v1 + "chat/completions",) + ("",) * 3)
58
58
  self.image_url: str = urlunparse(parsed_url[:2] + (before_v1 + "images/generations",) + ("",) * 3)
@@ -89,6 +89,13 @@ class RepetitiveResponseError(Exception):
89
89
  self.count = count
90
90
 
91
91
 
92
+ class AllToolsMissingParametersError(Exception):
93
+ """Custom exception for when all tools are missing required parameters."""
94
+ def __init__(self, message, response_text):
95
+ super().__init__(message)
96
+ self.response_text = response_text
97
+
98
+
92
99
  class chatgpt(BaseLLM):
93
100
  """
94
101
  Official ChatGPT API
@@ -500,6 +507,9 @@ class chatgpt(BaseLLM):
500
507
  missing_required_params.append(f"Error: {tool_name} missing required parameters: {missing_required_params}")
501
508
  function_parameter = valid_function_parameters
502
509
 
510
+ if not function_parameter and missing_required_params:
511
+ raise AllToolsMissingParametersError("\n\n".join(missing_required_params), response_text=full_response)
512
+
503
513
  # 删除 task_complete 跟其他工具一起调用的情况,因为 task_complete 必须单独调用
504
514
  if len(function_parameter) > 1:
505
515
  function_parameter = [tool_dict for tool_dict in function_parameter if tool_dict.get("function_name", "") != "task_complete"]
@@ -810,6 +820,13 @@ class chatgpt(BaseLLM):
810
820
  {"role": "user", "content": "你的消息没有以[done]结尾,请重新输出"}
811
821
  ]
812
822
  continue
823
+ except AllToolsMissingParametersError as e:
824
+ self.logger.warning(f"All tools are missing required parameters: {e}. Retrying with corrective prompt.")
825
+ need_done_prompt = [
826
+ {"role": "assistant", "content": e.response_text},
827
+ {"role": "user", "content": f"{e.message},请重新输出"}
828
+ ]
829
+ continue
813
830
  except EmptyResponseError as e:
814
831
  self.logger.warning(f"{e}, retrying...")
815
832
  continue
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beswarm
3
- Version: 0.3.13
3
+ Version: 0.3.14
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.3.13"
3
+ version = "0.3.14"
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
File without changes
File without changes
File without changes
File without changes