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.
- massgen/__init__.py +142 -8
- massgen/adapters/__init__.py +29 -0
- massgen/adapters/ag2_adapter.py +483 -0
- massgen/adapters/base.py +183 -0
- massgen/adapters/tests/__init__.py +0 -0
- massgen/adapters/tests/test_ag2_adapter.py +439 -0
- massgen/adapters/tests/test_agent_adapter.py +128 -0
- massgen/adapters/utils/__init__.py +2 -0
- massgen/adapters/utils/ag2_utils.py +236 -0
- massgen/adapters/utils/tests/__init__.py +0 -0
- massgen/adapters/utils/tests/test_ag2_utils.py +138 -0
- massgen/agent_config.py +329 -55
- massgen/api_params_handler/__init__.py +10 -0
- massgen/api_params_handler/_api_params_handler_base.py +99 -0
- massgen/api_params_handler/_chat_completions_api_params_handler.py +176 -0
- massgen/api_params_handler/_claude_api_params_handler.py +113 -0
- massgen/api_params_handler/_response_api_params_handler.py +130 -0
- massgen/backend/__init__.py +39 -4
- massgen/backend/azure_openai.py +385 -0
- massgen/backend/base.py +341 -69
- massgen/backend/base_with_mcp.py +1102 -0
- massgen/backend/capabilities.py +386 -0
- massgen/backend/chat_completions.py +577 -130
- massgen/backend/claude.py +1033 -537
- massgen/backend/claude_code.py +1203 -0
- massgen/backend/cli_base.py +209 -0
- massgen/backend/docs/BACKEND_ARCHITECTURE.md +126 -0
- massgen/backend/{CLAUDE_API_RESEARCH.md → docs/CLAUDE_API_RESEARCH.md} +18 -18
- massgen/backend/{GEMINI_API_DOCUMENTATION.md → docs/GEMINI_API_DOCUMENTATION.md} +9 -9
- massgen/backend/docs/Gemini MCP Integration Analysis.md +1050 -0
- massgen/backend/docs/MCP_IMPLEMENTATION_CLAUDE_BACKEND.md +177 -0
- massgen/backend/docs/MCP_INTEGRATION_RESPONSE_BACKEND.md +352 -0
- massgen/backend/docs/OPENAI_GPT5_MODELS.md +211 -0
- massgen/backend/{OPENAI_RESPONSES_API_FORMAT.md → docs/OPENAI_RESPONSE_API_TOOL_CALLS.md} +3 -3
- massgen/backend/docs/OPENAI_response_streaming.md +20654 -0
- massgen/backend/docs/inference_backend.md +257 -0
- massgen/backend/docs/permissions_and_context_files.md +1085 -0
- massgen/backend/external.py +126 -0
- massgen/backend/gemini.py +1850 -241
- massgen/backend/grok.py +40 -156
- massgen/backend/inference.py +156 -0
- massgen/backend/lmstudio.py +171 -0
- massgen/backend/response.py +1095 -322
- massgen/chat_agent.py +131 -113
- massgen/cli.py +1560 -275
- massgen/config_builder.py +2396 -0
- massgen/configs/BACKEND_CONFIGURATION.md +458 -0
- massgen/configs/README.md +559 -216
- massgen/configs/ag2/ag2_case_study.yaml +27 -0
- massgen/configs/ag2/ag2_coder.yaml +34 -0
- massgen/configs/ag2/ag2_coder_case_study.yaml +36 -0
- massgen/configs/ag2/ag2_gemini.yaml +27 -0
- massgen/configs/ag2/ag2_groupchat.yaml +108 -0
- massgen/configs/ag2/ag2_groupchat_gpt.yaml +118 -0
- massgen/configs/ag2/ag2_single_agent.yaml +21 -0
- massgen/configs/basic/multi/fast_timeout_example.yaml +37 -0
- massgen/configs/basic/multi/gemini_4o_claude.yaml +31 -0
- massgen/configs/basic/multi/gemini_gpt5nano_claude.yaml +36 -0
- massgen/configs/{gemini_4o_claude.yaml → basic/multi/geminicode_4o_claude.yaml} +3 -3
- massgen/configs/basic/multi/geminicode_gpt5nano_claude.yaml +36 -0
- massgen/configs/basic/multi/glm_gemini_claude.yaml +25 -0
- massgen/configs/basic/multi/gpt4o_audio_generation.yaml +30 -0
- massgen/configs/basic/multi/gpt4o_image_generation.yaml +31 -0
- massgen/configs/basic/multi/gpt5nano_glm_qwen.yaml +26 -0
- massgen/configs/basic/multi/gpt5nano_image_understanding.yaml +26 -0
- massgen/configs/{three_agents_default.yaml → basic/multi/three_agents_default.yaml} +8 -4
- massgen/configs/basic/multi/three_agents_opensource.yaml +27 -0
- massgen/configs/basic/multi/three_agents_vllm.yaml +20 -0
- massgen/configs/basic/multi/two_agents_gemini.yaml +19 -0
- massgen/configs/{two_agents.yaml → basic/multi/two_agents_gpt5.yaml} +14 -6
- massgen/configs/basic/multi/two_agents_opensource_lmstudio.yaml +31 -0
- massgen/configs/basic/multi/two_qwen_vllm_sglang.yaml +28 -0
- massgen/configs/{single_agent.yaml → basic/single/single_agent.yaml} +1 -1
- massgen/configs/{single_flash2.5.yaml → basic/single/single_flash2.5.yaml} +1 -2
- massgen/configs/basic/single/single_gemini2.5pro.yaml +16 -0
- massgen/configs/basic/single/single_gpt4o_audio_generation.yaml +22 -0
- massgen/configs/basic/single/single_gpt4o_image_generation.yaml +22 -0
- massgen/configs/basic/single/single_gpt4o_video_generation.yaml +24 -0
- massgen/configs/basic/single/single_gpt5nano.yaml +20 -0
- massgen/configs/basic/single/single_gpt5nano_file_search.yaml +18 -0
- massgen/configs/basic/single/single_gpt5nano_image_understanding.yaml +17 -0
- massgen/configs/basic/single/single_gptoss120b.yaml +15 -0
- massgen/configs/basic/single/single_openrouter_audio_understanding.yaml +15 -0
- massgen/configs/basic/single/single_qwen_video_understanding.yaml +15 -0
- massgen/configs/debug/code_execution/command_filtering_blacklist.yaml +29 -0
- massgen/configs/debug/code_execution/command_filtering_whitelist.yaml +28 -0
- massgen/configs/debug/code_execution/docker_verification.yaml +29 -0
- massgen/configs/debug/skip_coordination_test.yaml +27 -0
- massgen/configs/debug/test_sdk_migration.yaml +17 -0
- massgen/configs/docs/DISCORD_MCP_SETUP.md +208 -0
- massgen/configs/docs/TWITTER_MCP_ENESCINAR_SETUP.md +82 -0
- massgen/configs/providers/azure/azure_openai_multi.yaml +21 -0
- massgen/configs/providers/azure/azure_openai_single.yaml +19 -0
- massgen/configs/providers/claude/claude.yaml +14 -0
- massgen/configs/providers/gemini/gemini_gpt5nano.yaml +28 -0
- massgen/configs/providers/local/lmstudio.yaml +11 -0
- massgen/configs/providers/openai/gpt5.yaml +46 -0
- massgen/configs/providers/openai/gpt5_nano.yaml +46 -0
- massgen/configs/providers/others/grok_single_agent.yaml +19 -0
- massgen/configs/providers/others/zai_coding_team.yaml +108 -0
- massgen/configs/providers/others/zai_glm45.yaml +12 -0
- massgen/configs/{creative_team.yaml → teams/creative/creative_team.yaml} +16 -6
- massgen/configs/{travel_planning.yaml → teams/creative/travel_planning.yaml} +16 -6
- massgen/configs/{news_analysis.yaml → teams/research/news_analysis.yaml} +16 -6
- massgen/configs/{research_team.yaml → teams/research/research_team.yaml} +15 -7
- massgen/configs/{technical_analysis.yaml → teams/research/technical_analysis.yaml} +16 -6
- massgen/configs/tools/code-execution/basic_command_execution.yaml +25 -0
- massgen/configs/tools/code-execution/code_execution_use_case_simple.yaml +41 -0
- massgen/configs/tools/code-execution/docker_claude_code.yaml +32 -0
- massgen/configs/tools/code-execution/docker_multi_agent.yaml +32 -0
- massgen/configs/tools/code-execution/docker_simple.yaml +29 -0
- massgen/configs/tools/code-execution/docker_with_resource_limits.yaml +32 -0
- massgen/configs/tools/code-execution/multi_agent_playwright_automation.yaml +57 -0
- massgen/configs/tools/filesystem/cc_gpt5_gemini_filesystem.yaml +34 -0
- massgen/configs/tools/filesystem/claude_code_context_sharing.yaml +68 -0
- massgen/configs/tools/filesystem/claude_code_flash2.5.yaml +43 -0
- massgen/configs/tools/filesystem/claude_code_flash2.5_gptoss.yaml +49 -0
- massgen/configs/tools/filesystem/claude_code_gpt5nano.yaml +31 -0
- massgen/configs/tools/filesystem/claude_code_single.yaml +40 -0
- massgen/configs/tools/filesystem/fs_permissions_test.yaml +87 -0
- massgen/configs/tools/filesystem/gemini_gemini_workspace_cleanup.yaml +54 -0
- massgen/configs/tools/filesystem/gemini_gpt5_filesystem_casestudy.yaml +30 -0
- massgen/configs/tools/filesystem/gemini_gpt5nano_file_context_path.yaml +43 -0
- massgen/configs/tools/filesystem/gemini_gpt5nano_protected_paths.yaml +45 -0
- massgen/configs/tools/filesystem/gpt5mini_cc_fs_context_path.yaml +31 -0
- massgen/configs/tools/filesystem/grok4_gpt5_gemini_filesystem.yaml +32 -0
- massgen/configs/tools/filesystem/multiturn/grok4_gpt5_claude_code_filesystem_multiturn.yaml +58 -0
- massgen/configs/tools/filesystem/multiturn/grok4_gpt5_gemini_filesystem_multiturn.yaml +58 -0
- massgen/configs/tools/filesystem/multiturn/two_claude_code_filesystem_multiturn.yaml +47 -0
- massgen/configs/tools/filesystem/multiturn/two_gemini_flash_filesystem_multiturn.yaml +48 -0
- massgen/configs/tools/mcp/claude_code_discord_mcp_example.yaml +27 -0
- massgen/configs/tools/mcp/claude_code_simple_mcp.yaml +35 -0
- massgen/configs/tools/mcp/claude_code_twitter_mcp_example.yaml +32 -0
- massgen/configs/tools/mcp/claude_mcp_example.yaml +24 -0
- massgen/configs/tools/mcp/claude_mcp_test.yaml +27 -0
- massgen/configs/tools/mcp/five_agents_travel_mcp_test.yaml +157 -0
- massgen/configs/tools/mcp/five_agents_weather_mcp_test.yaml +103 -0
- massgen/configs/tools/mcp/gemini_mcp_example.yaml +24 -0
- massgen/configs/tools/mcp/gemini_mcp_filesystem_test.yaml +23 -0
- massgen/configs/tools/mcp/gemini_mcp_filesystem_test_sharing.yaml +23 -0
- massgen/configs/tools/mcp/gemini_mcp_filesystem_test_single_agent.yaml +17 -0
- massgen/configs/tools/mcp/gemini_mcp_filesystem_test_with_claude_code.yaml +24 -0
- massgen/configs/tools/mcp/gemini_mcp_test.yaml +27 -0
- massgen/configs/tools/mcp/gemini_notion_mcp.yaml +52 -0
- massgen/configs/tools/mcp/gpt5_nano_mcp_example.yaml +24 -0
- massgen/configs/tools/mcp/gpt5_nano_mcp_test.yaml +27 -0
- massgen/configs/tools/mcp/gpt5mini_claude_code_discord_mcp_example.yaml +38 -0
- massgen/configs/tools/mcp/gpt_oss_mcp_example.yaml +25 -0
- massgen/configs/tools/mcp/gpt_oss_mcp_test.yaml +28 -0
- massgen/configs/tools/mcp/grok3_mini_mcp_example.yaml +24 -0
- massgen/configs/tools/mcp/grok3_mini_mcp_test.yaml +27 -0
- massgen/configs/tools/mcp/multimcp_gemini.yaml +111 -0
- massgen/configs/tools/mcp/qwen_api_mcp_example.yaml +25 -0
- massgen/configs/tools/mcp/qwen_api_mcp_test.yaml +28 -0
- massgen/configs/tools/mcp/qwen_local_mcp_example.yaml +24 -0
- massgen/configs/tools/mcp/qwen_local_mcp_test.yaml +27 -0
- massgen/configs/tools/planning/five_agents_discord_mcp_planning_mode.yaml +140 -0
- massgen/configs/tools/planning/five_agents_filesystem_mcp_planning_mode.yaml +151 -0
- massgen/configs/tools/planning/five_agents_notion_mcp_planning_mode.yaml +151 -0
- massgen/configs/tools/planning/five_agents_twitter_mcp_planning_mode.yaml +155 -0
- massgen/configs/tools/planning/gpt5_mini_case_study_mcp_planning_mode.yaml +73 -0
- massgen/configs/tools/web-search/claude_streamable_http_test.yaml +43 -0
- massgen/configs/tools/web-search/gemini_streamable_http_test.yaml +43 -0
- massgen/configs/tools/web-search/gpt5_mini_streamable_http_test.yaml +43 -0
- massgen/configs/tools/web-search/gpt_oss_streamable_http_test.yaml +44 -0
- massgen/configs/tools/web-search/grok3_mini_streamable_http_test.yaml +43 -0
- massgen/configs/tools/web-search/qwen_api_streamable_http_test.yaml +44 -0
- massgen/configs/tools/web-search/qwen_local_streamable_http_test.yaml +43 -0
- massgen/coordination_tracker.py +708 -0
- massgen/docker/README.md +462 -0
- massgen/filesystem_manager/__init__.py +21 -0
- massgen/filesystem_manager/_base.py +9 -0
- massgen/filesystem_manager/_code_execution_server.py +545 -0
- massgen/filesystem_manager/_docker_manager.py +477 -0
- massgen/filesystem_manager/_file_operation_tracker.py +248 -0
- massgen/filesystem_manager/_filesystem_manager.py +813 -0
- massgen/filesystem_manager/_path_permission_manager.py +1261 -0
- massgen/filesystem_manager/_workspace_tools_server.py +1815 -0
- massgen/formatter/__init__.py +10 -0
- massgen/formatter/_chat_completions_formatter.py +284 -0
- massgen/formatter/_claude_formatter.py +235 -0
- massgen/formatter/_formatter_base.py +156 -0
- massgen/formatter/_response_formatter.py +263 -0
- massgen/frontend/__init__.py +1 -2
- massgen/frontend/coordination_ui.py +471 -286
- massgen/frontend/displays/base_display.py +56 -11
- massgen/frontend/displays/create_coordination_table.py +1956 -0
- massgen/frontend/displays/rich_terminal_display.py +1259 -619
- massgen/frontend/displays/simple_display.py +9 -4
- massgen/frontend/displays/terminal_display.py +27 -68
- massgen/logger_config.py +681 -0
- massgen/mcp_tools/README.md +232 -0
- massgen/mcp_tools/__init__.py +105 -0
- massgen/mcp_tools/backend_utils.py +1035 -0
- massgen/mcp_tools/circuit_breaker.py +195 -0
- massgen/mcp_tools/client.py +894 -0
- massgen/mcp_tools/config_validator.py +138 -0
- massgen/mcp_tools/docs/circuit_breaker.md +646 -0
- massgen/mcp_tools/docs/client.md +950 -0
- massgen/mcp_tools/docs/config_validator.md +478 -0
- massgen/mcp_tools/docs/exceptions.md +1165 -0
- massgen/mcp_tools/docs/security.md +854 -0
- massgen/mcp_tools/exceptions.py +338 -0
- massgen/mcp_tools/hooks.py +212 -0
- massgen/mcp_tools/security.py +780 -0
- massgen/message_templates.py +342 -64
- massgen/orchestrator.py +1515 -241
- massgen/stream_chunk/__init__.py +35 -0
- massgen/stream_chunk/base.py +92 -0
- massgen/stream_chunk/multimodal.py +237 -0
- massgen/stream_chunk/text.py +162 -0
- massgen/tests/mcp_test_server.py +150 -0
- massgen/tests/multi_turn_conversation_design.md +0 -8
- massgen/tests/test_azure_openai_backend.py +156 -0
- massgen/tests/test_backend_capabilities.py +262 -0
- massgen/tests/test_backend_event_loop_all.py +179 -0
- massgen/tests/test_chat_completions_refactor.py +142 -0
- massgen/tests/test_claude_backend.py +15 -28
- massgen/tests/test_claude_code.py +268 -0
- massgen/tests/test_claude_code_context_sharing.py +233 -0
- massgen/tests/test_claude_code_orchestrator.py +175 -0
- massgen/tests/test_cli_backends.py +180 -0
- massgen/tests/test_code_execution.py +679 -0
- massgen/tests/test_external_agent_backend.py +134 -0
- massgen/tests/test_final_presentation_fallback.py +237 -0
- massgen/tests/test_gemini_planning_mode.py +351 -0
- massgen/tests/test_grok_backend.py +7 -10
- massgen/tests/test_http_mcp_server.py +42 -0
- massgen/tests/test_integration_simple.py +198 -0
- massgen/tests/test_mcp_blocking.py +125 -0
- massgen/tests/test_message_context_building.py +29 -47
- massgen/tests/test_orchestrator_final_presentation.py +48 -0
- massgen/tests/test_path_permission_manager.py +2087 -0
- massgen/tests/test_rich_terminal_display.py +14 -13
- massgen/tests/test_timeout.py +133 -0
- massgen/tests/test_v3_3agents.py +11 -12
- massgen/tests/test_v3_simple.py +8 -13
- massgen/tests/test_v3_three_agents.py +11 -18
- massgen/tests/test_v3_two_agents.py +8 -13
- massgen/token_manager/__init__.py +7 -0
- massgen/token_manager/token_manager.py +400 -0
- massgen/utils.py +52 -16
- massgen/v1/agent.py +45 -91
- massgen/v1/agents.py +18 -53
- massgen/v1/backends/gemini.py +50 -153
- massgen/v1/backends/grok.py +21 -54
- massgen/v1/backends/oai.py +39 -111
- massgen/v1/cli.py +36 -93
- massgen/v1/config.py +8 -12
- massgen/v1/logging.py +43 -127
- massgen/v1/main.py +18 -32
- massgen/v1/orchestrator.py +68 -209
- massgen/v1/streaming_display.py +62 -163
- massgen/v1/tools.py +8 -12
- massgen/v1/types.py +9 -23
- massgen/v1/utils.py +5 -23
- massgen-0.1.0.dist-info/METADATA +1245 -0
- massgen-0.1.0.dist-info/RECORD +273 -0
- massgen-0.1.0.dist-info/entry_points.txt +2 -0
- massgen/frontend/logging/__init__.py +0 -9
- massgen/frontend/logging/realtime_logger.py +0 -197
- massgen-0.0.3.dist-info/METADATA +0 -568
- massgen-0.0.3.dist-info/RECORD +0 -76
- massgen-0.0.3.dist-info/entry_points.txt +0 -2
- /massgen/backend/{Function calling openai responses.md → docs/Function calling openai responses.md} +0 -0
- {massgen-0.0.3.dist-info → massgen-0.1.0.dist-info}/WHEEL +0 -0
- {massgen-0.0.3.dist-info → massgen-0.1.0.dist-info}/licenses/LICENSE +0 -0
- {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
|