massgen 0.0.3__py3-none-any.whl → 0.1.0__py3-none-any.whl

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.

Potentially problematic release.


This version of massgen might be problematic. Click here for more details.

Files changed (268) hide show
  1. massgen/__init__.py +142 -8
  2. massgen/adapters/__init__.py +29 -0
  3. massgen/adapters/ag2_adapter.py +483 -0
  4. massgen/adapters/base.py +183 -0
  5. massgen/adapters/tests/__init__.py +0 -0
  6. massgen/adapters/tests/test_ag2_adapter.py +439 -0
  7. massgen/adapters/tests/test_agent_adapter.py +128 -0
  8. massgen/adapters/utils/__init__.py +2 -0
  9. massgen/adapters/utils/ag2_utils.py +236 -0
  10. massgen/adapters/utils/tests/__init__.py +0 -0
  11. massgen/adapters/utils/tests/test_ag2_utils.py +138 -0
  12. massgen/agent_config.py +329 -55
  13. massgen/api_params_handler/__init__.py +10 -0
  14. massgen/api_params_handler/_api_params_handler_base.py +99 -0
  15. massgen/api_params_handler/_chat_completions_api_params_handler.py +176 -0
  16. massgen/api_params_handler/_claude_api_params_handler.py +113 -0
  17. massgen/api_params_handler/_response_api_params_handler.py +130 -0
  18. massgen/backend/__init__.py +39 -4
  19. massgen/backend/azure_openai.py +385 -0
  20. massgen/backend/base.py +341 -69
  21. massgen/backend/base_with_mcp.py +1102 -0
  22. massgen/backend/capabilities.py +386 -0
  23. massgen/backend/chat_completions.py +577 -130
  24. massgen/backend/claude.py +1033 -537
  25. massgen/backend/claude_code.py +1203 -0
  26. massgen/backend/cli_base.py +209 -0
  27. massgen/backend/docs/BACKEND_ARCHITECTURE.md +126 -0
  28. massgen/backend/{CLAUDE_API_RESEARCH.md → docs/CLAUDE_API_RESEARCH.md} +18 -18
  29. massgen/backend/{GEMINI_API_DOCUMENTATION.md → docs/GEMINI_API_DOCUMENTATION.md} +9 -9
  30. massgen/backend/docs/Gemini MCP Integration Analysis.md +1050 -0
  31. massgen/backend/docs/MCP_IMPLEMENTATION_CLAUDE_BACKEND.md +177 -0
  32. massgen/backend/docs/MCP_INTEGRATION_RESPONSE_BACKEND.md +352 -0
  33. massgen/backend/docs/OPENAI_GPT5_MODELS.md +211 -0
  34. massgen/backend/{OPENAI_RESPONSES_API_FORMAT.md → docs/OPENAI_RESPONSE_API_TOOL_CALLS.md} +3 -3
  35. massgen/backend/docs/OPENAI_response_streaming.md +20654 -0
  36. massgen/backend/docs/inference_backend.md +257 -0
  37. massgen/backend/docs/permissions_and_context_files.md +1085 -0
  38. massgen/backend/external.py +126 -0
  39. massgen/backend/gemini.py +1850 -241
  40. massgen/backend/grok.py +40 -156
  41. massgen/backend/inference.py +156 -0
  42. massgen/backend/lmstudio.py +171 -0
  43. massgen/backend/response.py +1095 -322
  44. massgen/chat_agent.py +131 -113
  45. massgen/cli.py +1560 -275
  46. massgen/config_builder.py +2396 -0
  47. massgen/configs/BACKEND_CONFIGURATION.md +458 -0
  48. massgen/configs/README.md +559 -216
  49. massgen/configs/ag2/ag2_case_study.yaml +27 -0
  50. massgen/configs/ag2/ag2_coder.yaml +34 -0
  51. massgen/configs/ag2/ag2_coder_case_study.yaml +36 -0
  52. massgen/configs/ag2/ag2_gemini.yaml +27 -0
  53. massgen/configs/ag2/ag2_groupchat.yaml +108 -0
  54. massgen/configs/ag2/ag2_groupchat_gpt.yaml +118 -0
  55. massgen/configs/ag2/ag2_single_agent.yaml +21 -0
  56. massgen/configs/basic/multi/fast_timeout_example.yaml +37 -0
  57. massgen/configs/basic/multi/gemini_4o_claude.yaml +31 -0
  58. massgen/configs/basic/multi/gemini_gpt5nano_claude.yaml +36 -0
  59. massgen/configs/{gemini_4o_claude.yaml → basic/multi/geminicode_4o_claude.yaml} +3 -3
  60. massgen/configs/basic/multi/geminicode_gpt5nano_claude.yaml +36 -0
  61. massgen/configs/basic/multi/glm_gemini_claude.yaml +25 -0
  62. massgen/configs/basic/multi/gpt4o_audio_generation.yaml +30 -0
  63. massgen/configs/basic/multi/gpt4o_image_generation.yaml +31 -0
  64. massgen/configs/basic/multi/gpt5nano_glm_qwen.yaml +26 -0
  65. massgen/configs/basic/multi/gpt5nano_image_understanding.yaml +26 -0
  66. massgen/configs/{three_agents_default.yaml → basic/multi/three_agents_default.yaml} +8 -4
  67. massgen/configs/basic/multi/three_agents_opensource.yaml +27 -0
  68. massgen/configs/basic/multi/three_agents_vllm.yaml +20 -0
  69. massgen/configs/basic/multi/two_agents_gemini.yaml +19 -0
  70. massgen/configs/{two_agents.yaml → basic/multi/two_agents_gpt5.yaml} +14 -6
  71. massgen/configs/basic/multi/two_agents_opensource_lmstudio.yaml +31 -0
  72. massgen/configs/basic/multi/two_qwen_vllm_sglang.yaml +28 -0
  73. massgen/configs/{single_agent.yaml → basic/single/single_agent.yaml} +1 -1
  74. massgen/configs/{single_flash2.5.yaml → basic/single/single_flash2.5.yaml} +1 -2
  75. massgen/configs/basic/single/single_gemini2.5pro.yaml +16 -0
  76. massgen/configs/basic/single/single_gpt4o_audio_generation.yaml +22 -0
  77. massgen/configs/basic/single/single_gpt4o_image_generation.yaml +22 -0
  78. massgen/configs/basic/single/single_gpt4o_video_generation.yaml +24 -0
  79. massgen/configs/basic/single/single_gpt5nano.yaml +20 -0
  80. massgen/configs/basic/single/single_gpt5nano_file_search.yaml +18 -0
  81. massgen/configs/basic/single/single_gpt5nano_image_understanding.yaml +17 -0
  82. massgen/configs/basic/single/single_gptoss120b.yaml +15 -0
  83. massgen/configs/basic/single/single_openrouter_audio_understanding.yaml +15 -0
  84. massgen/configs/basic/single/single_qwen_video_understanding.yaml +15 -0
  85. massgen/configs/debug/code_execution/command_filtering_blacklist.yaml +29 -0
  86. massgen/configs/debug/code_execution/command_filtering_whitelist.yaml +28 -0
  87. massgen/configs/debug/code_execution/docker_verification.yaml +29 -0
  88. massgen/configs/debug/skip_coordination_test.yaml +27 -0
  89. massgen/configs/debug/test_sdk_migration.yaml +17 -0
  90. massgen/configs/docs/DISCORD_MCP_SETUP.md +208 -0
  91. massgen/configs/docs/TWITTER_MCP_ENESCINAR_SETUP.md +82 -0
  92. massgen/configs/providers/azure/azure_openai_multi.yaml +21 -0
  93. massgen/configs/providers/azure/azure_openai_single.yaml +19 -0
  94. massgen/configs/providers/claude/claude.yaml +14 -0
  95. massgen/configs/providers/gemini/gemini_gpt5nano.yaml +28 -0
  96. massgen/configs/providers/local/lmstudio.yaml +11 -0
  97. massgen/configs/providers/openai/gpt5.yaml +46 -0
  98. massgen/configs/providers/openai/gpt5_nano.yaml +46 -0
  99. massgen/configs/providers/others/grok_single_agent.yaml +19 -0
  100. massgen/configs/providers/others/zai_coding_team.yaml +108 -0
  101. massgen/configs/providers/others/zai_glm45.yaml +12 -0
  102. massgen/configs/{creative_team.yaml → teams/creative/creative_team.yaml} +16 -6
  103. massgen/configs/{travel_planning.yaml → teams/creative/travel_planning.yaml} +16 -6
  104. massgen/configs/{news_analysis.yaml → teams/research/news_analysis.yaml} +16 -6
  105. massgen/configs/{research_team.yaml → teams/research/research_team.yaml} +15 -7
  106. massgen/configs/{technical_analysis.yaml → teams/research/technical_analysis.yaml} +16 -6
  107. massgen/configs/tools/code-execution/basic_command_execution.yaml +25 -0
  108. massgen/configs/tools/code-execution/code_execution_use_case_simple.yaml +41 -0
  109. massgen/configs/tools/code-execution/docker_claude_code.yaml +32 -0
  110. massgen/configs/tools/code-execution/docker_multi_agent.yaml +32 -0
  111. massgen/configs/tools/code-execution/docker_simple.yaml +29 -0
  112. massgen/configs/tools/code-execution/docker_with_resource_limits.yaml +32 -0
  113. massgen/configs/tools/code-execution/multi_agent_playwright_automation.yaml +57 -0
  114. massgen/configs/tools/filesystem/cc_gpt5_gemini_filesystem.yaml +34 -0
  115. massgen/configs/tools/filesystem/claude_code_context_sharing.yaml +68 -0
  116. massgen/configs/tools/filesystem/claude_code_flash2.5.yaml +43 -0
  117. massgen/configs/tools/filesystem/claude_code_flash2.5_gptoss.yaml +49 -0
  118. massgen/configs/tools/filesystem/claude_code_gpt5nano.yaml +31 -0
  119. massgen/configs/tools/filesystem/claude_code_single.yaml +40 -0
  120. massgen/configs/tools/filesystem/fs_permissions_test.yaml +87 -0
  121. massgen/configs/tools/filesystem/gemini_gemini_workspace_cleanup.yaml +54 -0
  122. massgen/configs/tools/filesystem/gemini_gpt5_filesystem_casestudy.yaml +30 -0
  123. massgen/configs/tools/filesystem/gemini_gpt5nano_file_context_path.yaml +43 -0
  124. massgen/configs/tools/filesystem/gemini_gpt5nano_protected_paths.yaml +45 -0
  125. massgen/configs/tools/filesystem/gpt5mini_cc_fs_context_path.yaml +31 -0
  126. massgen/configs/tools/filesystem/grok4_gpt5_gemini_filesystem.yaml +32 -0
  127. massgen/configs/tools/filesystem/multiturn/grok4_gpt5_claude_code_filesystem_multiturn.yaml +58 -0
  128. massgen/configs/tools/filesystem/multiturn/grok4_gpt5_gemini_filesystem_multiturn.yaml +58 -0
  129. massgen/configs/tools/filesystem/multiturn/two_claude_code_filesystem_multiturn.yaml +47 -0
  130. massgen/configs/tools/filesystem/multiturn/two_gemini_flash_filesystem_multiturn.yaml +48 -0
  131. massgen/configs/tools/mcp/claude_code_discord_mcp_example.yaml +27 -0
  132. massgen/configs/tools/mcp/claude_code_simple_mcp.yaml +35 -0
  133. massgen/configs/tools/mcp/claude_code_twitter_mcp_example.yaml +32 -0
  134. massgen/configs/tools/mcp/claude_mcp_example.yaml +24 -0
  135. massgen/configs/tools/mcp/claude_mcp_test.yaml +27 -0
  136. massgen/configs/tools/mcp/five_agents_travel_mcp_test.yaml +157 -0
  137. massgen/configs/tools/mcp/five_agents_weather_mcp_test.yaml +103 -0
  138. massgen/configs/tools/mcp/gemini_mcp_example.yaml +24 -0
  139. massgen/configs/tools/mcp/gemini_mcp_filesystem_test.yaml +23 -0
  140. massgen/configs/tools/mcp/gemini_mcp_filesystem_test_sharing.yaml +23 -0
  141. massgen/configs/tools/mcp/gemini_mcp_filesystem_test_single_agent.yaml +17 -0
  142. massgen/configs/tools/mcp/gemini_mcp_filesystem_test_with_claude_code.yaml +24 -0
  143. massgen/configs/tools/mcp/gemini_mcp_test.yaml +27 -0
  144. massgen/configs/tools/mcp/gemini_notion_mcp.yaml +52 -0
  145. massgen/configs/tools/mcp/gpt5_nano_mcp_example.yaml +24 -0
  146. massgen/configs/tools/mcp/gpt5_nano_mcp_test.yaml +27 -0
  147. massgen/configs/tools/mcp/gpt5mini_claude_code_discord_mcp_example.yaml +38 -0
  148. massgen/configs/tools/mcp/gpt_oss_mcp_example.yaml +25 -0
  149. massgen/configs/tools/mcp/gpt_oss_mcp_test.yaml +28 -0
  150. massgen/configs/tools/mcp/grok3_mini_mcp_example.yaml +24 -0
  151. massgen/configs/tools/mcp/grok3_mini_mcp_test.yaml +27 -0
  152. massgen/configs/tools/mcp/multimcp_gemini.yaml +111 -0
  153. massgen/configs/tools/mcp/qwen_api_mcp_example.yaml +25 -0
  154. massgen/configs/tools/mcp/qwen_api_mcp_test.yaml +28 -0
  155. massgen/configs/tools/mcp/qwen_local_mcp_example.yaml +24 -0
  156. massgen/configs/tools/mcp/qwen_local_mcp_test.yaml +27 -0
  157. massgen/configs/tools/planning/five_agents_discord_mcp_planning_mode.yaml +140 -0
  158. massgen/configs/tools/planning/five_agents_filesystem_mcp_planning_mode.yaml +151 -0
  159. massgen/configs/tools/planning/five_agents_notion_mcp_planning_mode.yaml +151 -0
  160. massgen/configs/tools/planning/five_agents_twitter_mcp_planning_mode.yaml +155 -0
  161. massgen/configs/tools/planning/gpt5_mini_case_study_mcp_planning_mode.yaml +73 -0
  162. massgen/configs/tools/web-search/claude_streamable_http_test.yaml +43 -0
  163. massgen/configs/tools/web-search/gemini_streamable_http_test.yaml +43 -0
  164. massgen/configs/tools/web-search/gpt5_mini_streamable_http_test.yaml +43 -0
  165. massgen/configs/tools/web-search/gpt_oss_streamable_http_test.yaml +44 -0
  166. massgen/configs/tools/web-search/grok3_mini_streamable_http_test.yaml +43 -0
  167. massgen/configs/tools/web-search/qwen_api_streamable_http_test.yaml +44 -0
  168. massgen/configs/tools/web-search/qwen_local_streamable_http_test.yaml +43 -0
  169. massgen/coordination_tracker.py +708 -0
  170. massgen/docker/README.md +462 -0
  171. massgen/filesystem_manager/__init__.py +21 -0
  172. massgen/filesystem_manager/_base.py +9 -0
  173. massgen/filesystem_manager/_code_execution_server.py +545 -0
  174. massgen/filesystem_manager/_docker_manager.py +477 -0
  175. massgen/filesystem_manager/_file_operation_tracker.py +248 -0
  176. massgen/filesystem_manager/_filesystem_manager.py +813 -0
  177. massgen/filesystem_manager/_path_permission_manager.py +1261 -0
  178. massgen/filesystem_manager/_workspace_tools_server.py +1815 -0
  179. massgen/formatter/__init__.py +10 -0
  180. massgen/formatter/_chat_completions_formatter.py +284 -0
  181. massgen/formatter/_claude_formatter.py +235 -0
  182. massgen/formatter/_formatter_base.py +156 -0
  183. massgen/formatter/_response_formatter.py +263 -0
  184. massgen/frontend/__init__.py +1 -2
  185. massgen/frontend/coordination_ui.py +471 -286
  186. massgen/frontend/displays/base_display.py +56 -11
  187. massgen/frontend/displays/create_coordination_table.py +1956 -0
  188. massgen/frontend/displays/rich_terminal_display.py +1259 -619
  189. massgen/frontend/displays/simple_display.py +9 -4
  190. massgen/frontend/displays/terminal_display.py +27 -68
  191. massgen/logger_config.py +681 -0
  192. massgen/mcp_tools/README.md +232 -0
  193. massgen/mcp_tools/__init__.py +105 -0
  194. massgen/mcp_tools/backend_utils.py +1035 -0
  195. massgen/mcp_tools/circuit_breaker.py +195 -0
  196. massgen/mcp_tools/client.py +894 -0
  197. massgen/mcp_tools/config_validator.py +138 -0
  198. massgen/mcp_tools/docs/circuit_breaker.md +646 -0
  199. massgen/mcp_tools/docs/client.md +950 -0
  200. massgen/mcp_tools/docs/config_validator.md +478 -0
  201. massgen/mcp_tools/docs/exceptions.md +1165 -0
  202. massgen/mcp_tools/docs/security.md +854 -0
  203. massgen/mcp_tools/exceptions.py +338 -0
  204. massgen/mcp_tools/hooks.py +212 -0
  205. massgen/mcp_tools/security.py +780 -0
  206. massgen/message_templates.py +342 -64
  207. massgen/orchestrator.py +1515 -241
  208. massgen/stream_chunk/__init__.py +35 -0
  209. massgen/stream_chunk/base.py +92 -0
  210. massgen/stream_chunk/multimodal.py +237 -0
  211. massgen/stream_chunk/text.py +162 -0
  212. massgen/tests/mcp_test_server.py +150 -0
  213. massgen/tests/multi_turn_conversation_design.md +0 -8
  214. massgen/tests/test_azure_openai_backend.py +156 -0
  215. massgen/tests/test_backend_capabilities.py +262 -0
  216. massgen/tests/test_backend_event_loop_all.py +179 -0
  217. massgen/tests/test_chat_completions_refactor.py +142 -0
  218. massgen/tests/test_claude_backend.py +15 -28
  219. massgen/tests/test_claude_code.py +268 -0
  220. massgen/tests/test_claude_code_context_sharing.py +233 -0
  221. massgen/tests/test_claude_code_orchestrator.py +175 -0
  222. massgen/tests/test_cli_backends.py +180 -0
  223. massgen/tests/test_code_execution.py +679 -0
  224. massgen/tests/test_external_agent_backend.py +134 -0
  225. massgen/tests/test_final_presentation_fallback.py +237 -0
  226. massgen/tests/test_gemini_planning_mode.py +351 -0
  227. massgen/tests/test_grok_backend.py +7 -10
  228. massgen/tests/test_http_mcp_server.py +42 -0
  229. massgen/tests/test_integration_simple.py +198 -0
  230. massgen/tests/test_mcp_blocking.py +125 -0
  231. massgen/tests/test_message_context_building.py +29 -47
  232. massgen/tests/test_orchestrator_final_presentation.py +48 -0
  233. massgen/tests/test_path_permission_manager.py +2087 -0
  234. massgen/tests/test_rich_terminal_display.py +14 -13
  235. massgen/tests/test_timeout.py +133 -0
  236. massgen/tests/test_v3_3agents.py +11 -12
  237. massgen/tests/test_v3_simple.py +8 -13
  238. massgen/tests/test_v3_three_agents.py +11 -18
  239. massgen/tests/test_v3_two_agents.py +8 -13
  240. massgen/token_manager/__init__.py +7 -0
  241. massgen/token_manager/token_manager.py +400 -0
  242. massgen/utils.py +52 -16
  243. massgen/v1/agent.py +45 -91
  244. massgen/v1/agents.py +18 -53
  245. massgen/v1/backends/gemini.py +50 -153
  246. massgen/v1/backends/grok.py +21 -54
  247. massgen/v1/backends/oai.py +39 -111
  248. massgen/v1/cli.py +36 -93
  249. massgen/v1/config.py +8 -12
  250. massgen/v1/logging.py +43 -127
  251. massgen/v1/main.py +18 -32
  252. massgen/v1/orchestrator.py +68 -209
  253. massgen/v1/streaming_display.py +62 -163
  254. massgen/v1/tools.py +8 -12
  255. massgen/v1/types.py +9 -23
  256. massgen/v1/utils.py +5 -23
  257. massgen-0.1.0.dist-info/METADATA +1245 -0
  258. massgen-0.1.0.dist-info/RECORD +273 -0
  259. massgen-0.1.0.dist-info/entry_points.txt +2 -0
  260. massgen/frontend/logging/__init__.py +0 -9
  261. massgen/frontend/logging/realtime_logger.py +0 -197
  262. massgen-0.0.3.dist-info/METADATA +0 -568
  263. massgen-0.0.3.dist-info/RECORD +0 -76
  264. massgen-0.0.3.dist-info/entry_points.txt +0 -2
  265. /massgen/backend/{Function calling openai responses.md → docs/Function calling openai responses.md} +0 -0
  266. {massgen-0.0.3.dist-info → massgen-0.1.0.dist-info}/WHEEL +0 -0
  267. {massgen-0.0.3.dist-info → massgen-0.1.0.dist-info}/licenses/LICENSE +0 -0
  268. {massgen-0.0.3.dist-info → massgen-0.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,386 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Single source of truth for backend capabilities.
4
+ All documentation and UI should pull from this registry.
5
+
6
+ This module defines what each backend supports in terms of:
7
+ - Built-in tools (web search, code execution, etc.)
8
+ - Filesystem support (none, native, or via MCP)
9
+ - Model Context Protocol (MCP) support
10
+ - Multimodal capabilities (vision, image generation)
11
+ - Available models
12
+
13
+ Usage:
14
+ from massgen.backend.capabilities import BACKEND_CAPABILITIES, get_capabilities
15
+
16
+ # Get capabilities for a backend
17
+ caps = get_capabilities("openai")
18
+ if "web_search" in caps.builtin_tools:
19
+ print("Backend supports web search")
20
+
21
+ IMPORTANT - Maintaining This Registry:
22
+ ===========================================
23
+
24
+ When adding a NEW BACKEND:
25
+ 1. Add a new entry to BACKEND_CAPABILITIES with all fields filled
26
+ 2. Ensure the backend_type matches the backend's type string
27
+ 3. Run tests: `uv run pytest massgen/tests/test_backend_capabilities.py`
28
+ 4. Regenerate docs: `uv run python docs/scripts/generate_backend_tables.py`
29
+ 5. Commit both the capabilities.py and generated docs
30
+
31
+ When adding a NEW FEATURE to an existing backend:
32
+ 1. Update the backend's entry in BACKEND_CAPABILITIES
33
+ 2. Add to supported_capabilities or builtin_tools as appropriate
34
+ 3. Run tests: `uv run pytest massgen/tests/test_backend_capabilities.py`
35
+ 4. Regenerate docs: `uv run python docs/scripts/generate_backend_tables.py`
36
+ 5. Update the backend implementation to actually support the feature
37
+ 6. Verify capability validation works: `validate_backend_config(backend_type, config)`
38
+
39
+ Why This Matters:
40
+ - Config wizard reads from here to show available features
41
+ - Documentation is auto-generated from here
42
+ - Backend validation uses this to prevent invalid configurations
43
+ - If this is out of sync with actual backends, users will experience errors
44
+
45
+ Testing:
46
+ Run the capabilities test suite to verify consistency:
47
+ uv run pytest massgen/tests/test_backend_capabilities.py -v
48
+
49
+ This will verify:
50
+ - All backends in BACKEND_CAPABILITIES have valid configurations
51
+ - Required fields are present
52
+ - Model lists are not empty
53
+ - Default models exist in model lists
54
+ """
55
+
56
+ from dataclasses import dataclass
57
+ from enum import Enum
58
+ from typing import Dict, List, Optional, Set
59
+
60
+
61
+ class Capability(Enum):
62
+ """Enumeration of all possible backend capabilities."""
63
+
64
+ WEB_SEARCH = "web_search"
65
+ CODE_EXECUTION = "code_execution"
66
+ BASH = "bash"
67
+ MULTIMODAL = "multimodal" # Legacy - being phased out
68
+ VISION = "vision" # Legacy - use image_understanding
69
+ MCP = "mcp"
70
+ FILESYSTEM_NATIVE = "filesystem_native"
71
+ FILESYSTEM_MCP = "filesystem_mcp"
72
+ REASONING = "reasoning"
73
+ IMAGE_GENERATION = "image_generation"
74
+ IMAGE_UNDERSTANDING = "image_understanding"
75
+ AUDIO_GENERATION = "audio_generation"
76
+ AUDIO_UNDERSTANDING = "audio_understanding"
77
+ VIDEO_GENERATION = "video_generation"
78
+ VIDEO_UNDERSTANDING = "video_understanding"
79
+
80
+
81
+ @dataclass
82
+ class BackendCapabilities:
83
+ """Capabilities for a specific backend."""
84
+
85
+ backend_type: str
86
+ provider_name: str
87
+ supported_capabilities: Set[str] # Set of capability strings (e.g., "web_search")
88
+ builtin_tools: List[str] # Tools native to the backend
89
+ filesystem_support: str # "none", "native", or "mcp"
90
+ models: List[str] # Available models
91
+ default_model: str # Default model for this backend
92
+ env_var: Optional[str] = None # Required environment variable (e.g., "OPENAI_API_KEY")
93
+ notes: str = "" # Additional notes about the backend
94
+
95
+
96
+ # THE REGISTRY - Single source of truth for all backend capabilities
97
+ BACKEND_CAPABILITIES: Dict[str, BackendCapabilities] = {
98
+ "openai": BackendCapabilities(
99
+ backend_type="openai",
100
+ provider_name="OpenAI",
101
+ supported_capabilities={
102
+ "web_search",
103
+ "code_execution",
104
+ "mcp",
105
+ "reasoning",
106
+ "image_generation",
107
+ "image_understanding",
108
+ "audio_generation",
109
+ "audio_understanding",
110
+ "video_generation",
111
+ },
112
+ builtin_tools=["web_search", "code_interpreter"],
113
+ filesystem_support="mcp",
114
+ models=[
115
+ "gpt-5",
116
+ "gpt-5-mini",
117
+ "gpt-5-nano",
118
+ "gpt-4o",
119
+ "gpt-4o-mini",
120
+ "o4",
121
+ "o4-mini",
122
+ ],
123
+ default_model="gpt-4o",
124
+ env_var="OPENAI_API_KEY",
125
+ notes="Reasoning support in GPT-5 and o-series models. Audio/video generation (v0.0.30+). Video generation via Sora-2 API (v0.0.31).",
126
+ ),
127
+ "claude": BackendCapabilities(
128
+ backend_type="claude",
129
+ provider_name="Claude",
130
+ supported_capabilities={
131
+ "web_search",
132
+ "code_execution",
133
+ "mcp",
134
+ "audio_understanding",
135
+ "video_understanding",
136
+ },
137
+ builtin_tools=["web_search", "code_execution"],
138
+ filesystem_support="mcp",
139
+ models=[
140
+ "claude-sonnet-4-5-20250929",
141
+ "claude-sonnet-4-20250514",
142
+ "claude-opus-4-20250514",
143
+ "claude-3-5-sonnet-latest",
144
+ "claude-3-5-haiku-latest",
145
+ ],
146
+ default_model="claude-sonnet-4-20250514",
147
+ env_var="ANTHROPIC_API_KEY",
148
+ notes="Web search and code execution are built-in tools. Audio/video understanding support (v0.0.30+).",
149
+ ),
150
+ "claude_code": BackendCapabilities(
151
+ backend_type="claude_code",
152
+ provider_name="Claude Code",
153
+ supported_capabilities={
154
+ "bash",
155
+ "mcp",
156
+ "filesystem_native",
157
+ "image_understanding",
158
+ },
159
+ builtin_tools=[
160
+ "Read",
161
+ "Write",
162
+ "Edit",
163
+ "MultiEdit",
164
+ "Bash",
165
+ "Grep",
166
+ "Glob",
167
+ "LS",
168
+ "WebSearch",
169
+ "WebFetch",
170
+ "Task",
171
+ "TodoWrite",
172
+ "NotebookEdit",
173
+ "NotebookRead",
174
+ ],
175
+ filesystem_support="native",
176
+ models=[
177
+ "claude-sonnet-4-5-20250929",
178
+ "claude-sonnet-4-20250514",
179
+ "claude-opus-4-20250514",
180
+ ],
181
+ default_model="claude-sonnet-4-5-20250929",
182
+ env_var="ANTHROPIC_API_KEY",
183
+ notes=(
184
+ "⚠️ Works with local Claude Code CLI login (`claude login`) or ANTHROPIC_API_KEY. "
185
+ "Native filesystem access via SDK. Extensive built-in tooling for code operations. "
186
+ "Image understanding support."
187
+ ),
188
+ ),
189
+ "gemini": BackendCapabilities(
190
+ backend_type="gemini",
191
+ provider_name="Gemini",
192
+ supported_capabilities={
193
+ "web_search",
194
+ "code_execution",
195
+ "mcp",
196
+ "image_understanding",
197
+ },
198
+ builtin_tools=["google_search_retrieval", "code_execution"],
199
+ filesystem_support="mcp",
200
+ models=[
201
+ "gemini-2.5-flash",
202
+ "gemini-2.5-pro",
203
+ "gemini-2.0-flash-exp",
204
+ "gemini-exp-1206",
205
+ ],
206
+ default_model="gemini-2.5-flash",
207
+ env_var="GEMINI_API_KEY",
208
+ notes="Google Search Retrieval provides web search. Image understanding capabilities.",
209
+ ),
210
+ "grok": BackendCapabilities(
211
+ backend_type="grok",
212
+ provider_name="Grok",
213
+ supported_capabilities={
214
+ "web_search",
215
+ "mcp",
216
+ },
217
+ builtin_tools=["web_search"],
218
+ filesystem_support="mcp",
219
+ models=[
220
+ "grok-4",
221
+ "grok-3",
222
+ "grok-3-mini",
223
+ "grok-beta",
224
+ "grok-vision-beta",
225
+ ],
226
+ default_model="grok-beta",
227
+ env_var="XAI_API_KEY",
228
+ notes="Web search includes real-time data access.",
229
+ ),
230
+ "azure_openai": BackendCapabilities(
231
+ backend_type="azure_openai",
232
+ provider_name="Azure OpenAI",
233
+ supported_capabilities={
234
+ "web_search",
235
+ "code_execution",
236
+ "mcp",
237
+ "image_generation",
238
+ "image_understanding",
239
+ },
240
+ builtin_tools=["web_search", "code_execution"],
241
+ filesystem_support="mcp",
242
+ models=["gpt-4", "gpt-4o", "gpt-35-turbo"],
243
+ default_model="gpt-4o",
244
+ env_var="AZURE_OPENAI_API_KEY",
245
+ notes="Capabilities depend on Azure deployment configuration. Image understanding and generation via gpt-4o.",
246
+ ),
247
+ "chatcompletion": BackendCapabilities(
248
+ backend_type="chatcompletion",
249
+ provider_name="Chat Completions (Generic)",
250
+ supported_capabilities={
251
+ "mcp",
252
+ "audio_understanding",
253
+ "video_understanding",
254
+ },
255
+ builtin_tools=[],
256
+ filesystem_support="mcp",
257
+ models=["custom"],
258
+ default_model="custom",
259
+ env_var=None,
260
+ notes="Generic OpenAI-compatible API. Audio/video understanding via providers like OpenRouter, Qwen (v0.0.30+). Capabilities vary by provider.",
261
+ ),
262
+ "lmstudio": BackendCapabilities(
263
+ backend_type="lmstudio",
264
+ provider_name="LM Studio",
265
+ supported_capabilities={
266
+ "mcp",
267
+ },
268
+ builtin_tools=[],
269
+ filesystem_support="mcp",
270
+ models=["custom"],
271
+ default_model="custom",
272
+ env_var=None,
273
+ notes="Local model hosting. Capabilities depend on loaded model.",
274
+ ),
275
+ "inference": BackendCapabilities(
276
+ backend_type="inference",
277
+ provider_name="Inference (vLLM/SGLang)",
278
+ supported_capabilities={
279
+ "mcp",
280
+ },
281
+ builtin_tools=[],
282
+ filesystem_support="mcp",
283
+ models=["custom"],
284
+ default_model="custom",
285
+ env_var=None,
286
+ notes="Unified backend for vLLM, SGLang, and custom inference servers.",
287
+ ),
288
+ "ag2": BackendCapabilities(
289
+ backend_type="ag2",
290
+ provider_name="AG2 (AutoGen)",
291
+ supported_capabilities={
292
+ "code_execution",
293
+ },
294
+ builtin_tools=[],
295
+ filesystem_support="none", # MCP support planned for future
296
+ models=["custom"], # AG2 uses any OpenAI-compatible backend
297
+ default_model="custom",
298
+ env_var=None, # Depends on underlying LLM backend
299
+ notes="AutoGen framework integration. Supports code execution with multiple executor types (Local, Docker, Jupyter). Uses any OpenAI-compatible LLM backend. MCP support planned.",
300
+ ),
301
+ }
302
+
303
+
304
+ def get_capabilities(backend_type: str) -> Optional[BackendCapabilities]:
305
+ """Get capabilities for a backend type.
306
+
307
+ Args:
308
+ backend_type: The backend type (e.g., "openai", "claude")
309
+
310
+ Returns:
311
+ BackendCapabilities object if found, None otherwise
312
+ """
313
+ return BACKEND_CAPABILITIES.get(backend_type)
314
+
315
+
316
+ def has_capability(backend_type: str, capability: str) -> bool:
317
+ """Check if backend supports a capability.
318
+
319
+ Args:
320
+ backend_type: The backend type (e.g., "openai", "claude")
321
+ capability: The capability to check (e.g., "web_search")
322
+
323
+ Returns:
324
+ True if backend supports the capability, False otherwise
325
+ """
326
+ caps = get_capabilities(backend_type)
327
+ return capability in caps.supported_capabilities if caps else False
328
+
329
+
330
+ def get_all_backend_types() -> List[str]:
331
+ """Get list of all registered backend types.
332
+
333
+ Returns:
334
+ List of backend type strings
335
+ """
336
+ return list(BACKEND_CAPABILITIES.keys())
337
+
338
+
339
+ def get_backends_with_capability(capability: str) -> List[str]:
340
+ """Get all backends that support a given capability.
341
+
342
+ Args:
343
+ capability: The capability to search for (e.g., "web_search")
344
+
345
+ Returns:
346
+ List of backend types that support the capability
347
+ """
348
+ return [backend_type for backend_type, caps in BACKEND_CAPABILITIES.items() if capability in caps.supported_capabilities]
349
+
350
+
351
+ def validate_backend_config(backend_type: str, config: Dict) -> List[str]:
352
+ """Validate a backend configuration against its capabilities.
353
+
354
+ Args:
355
+ backend_type: The backend type
356
+ config: The backend configuration dict
357
+
358
+ Returns:
359
+ List of validation error messages (empty if valid)
360
+ """
361
+ errors = []
362
+ caps = get_capabilities(backend_type)
363
+
364
+ if not caps:
365
+ errors.append(f"Unknown backend type: {backend_type}")
366
+ return errors
367
+
368
+ # Check if requested tools are supported
369
+ if "enable_web_search" in config and config["enable_web_search"]:
370
+ if "web_search" not in caps.supported_capabilities:
371
+ errors.append(f"{backend_type} does not support web_search")
372
+
373
+ if "enable_code_execution" in config and config["enable_code_execution"]:
374
+ if "code_execution" not in caps.supported_capabilities:
375
+ errors.append(f"{backend_type} does not support code_execution")
376
+
377
+ if "enable_code_interpreter" in config and config["enable_code_interpreter"]:
378
+ if "code_execution" not in caps.supported_capabilities:
379
+ errors.append(f"{backend_type} does not support code_execution/interpreter")
380
+
381
+ # Check MCP configuration
382
+ if "mcp_servers" in config and config["mcp_servers"]:
383
+ if "mcp" not in caps.supported_capabilities:
384
+ errors.append(f"{backend_type} does not support MCP")
385
+
386
+ return errors