massgen 0.1.0a1__tar.gz → 0.1.0a2__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.
Potentially problematic release.
This version of massgen might be problematic. Click here for more details.
- {massgen-0.1.0a1 → massgen-0.1.0a2}/PKG-INFO +16 -12
- {massgen-0.1.0a1 → massgen-0.1.0a2}/README.md +15 -11
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/__init__.py +1 -1
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/cli.py +28 -4
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/config_builder.py +238 -7
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen.egg-info/PKG-INFO +16 -12
- {massgen-0.1.0a1 → massgen-0.1.0a2}/.env.example +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/CHANGELOG.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/CONTRIBUTING.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/LICENSE +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/MANIFEST.in +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/ag2_adapter.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/base.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/tests/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/tests/test_ag2_adapter.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/tests/test_agent_adapter.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/utils/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/utils/ag2_utils.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/utils/tests/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/utils/tests/test_ag2_utils.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/agent_config.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/api_params_handler/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/api_params_handler/_api_params_handler_base.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/api_params_handler/_chat_completions_api_params_handler.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/api_params_handler/_claude_api_params_handler.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/api_params_handler/_response_api_params_handler.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/azure_openai.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/base.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/base_with_mcp.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/capabilities.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/chat_completions.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/claude.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/claude_code.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/cli_base.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/BACKEND_ARCHITECTURE.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/CLAUDE_API_RESEARCH.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/Function calling openai responses.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/GEMINI_API_DOCUMENTATION.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/Gemini MCP Integration Analysis.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/MCP_IMPLEMENTATION_CLAUDE_BACKEND.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/MCP_INTEGRATION_RESPONSE_BACKEND.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/OPENAI_GPT5_MODELS.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/OPENAI_RESPONSE_API_TOOL_CALLS.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/OPENAI_response_streaming.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/inference_backend.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/permissions_and_context_files.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/external.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/gemini.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/grok.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/inference.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/lmstudio.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/response.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/chat_agent.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/BACKEND_CONFIGURATION.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/README.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/ag2/ag2_case_study.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/ag2/ag2_coder.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/ag2/ag2_coder_case_study.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/ag2/ag2_gemini.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/ag2/ag2_groupchat.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/ag2/ag2_groupchat_gpt.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/ag2/ag2_single_agent.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/fast_timeout_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/gemini_4o_claude.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/gemini_gpt5nano_claude.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/geminicode_4o_claude.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/geminicode_gpt5nano_claude.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/glm_gemini_claude.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/gpt4o_audio_generation.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/gpt4o_image_generation.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/gpt5nano_glm_qwen.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/gpt5nano_image_understanding.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/three_agents_default.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/three_agents_opensource.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/three_agents_vllm.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/two_agents_gemini.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/two_agents_gpt5.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/two_agents_opensource_lmstudio.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/two_qwen_vllm_sglang.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_agent.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_flash2.5.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gemini2.5pro.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gpt4o_audio_generation.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gpt4o_image_generation.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gpt4o_video_generation.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gpt5nano.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gpt5nano_file_search.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gpt5nano_image_understanding.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gptoss120b.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_openrouter_audio_understanding.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_qwen_video_understanding.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/debug/code_execution/command_filtering_blacklist.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/debug/code_execution/command_filtering_whitelist.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/debug/code_execution/docker_verification.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/debug/skip_coordination_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/debug/test_sdk_migration.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/docs/DISCORD_MCP_SETUP.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/docs/TWITTER_MCP_ENESCINAR_SETUP.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/azure/azure_openai_multi.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/azure/azure_openai_single.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/claude/claude.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/gemini/gemini_gpt5nano.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/local/lmstudio.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/openai/gpt5.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/openai/gpt5_nano.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/others/grok_single_agent.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/others/zai_coding_team.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/others/zai_glm45.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/teams/creative/creative_team.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/teams/creative/travel_planning.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/teams/research/news_analysis.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/teams/research/research_team.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/teams/research/technical_analysis.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/code-execution/basic_command_execution.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/code-execution/code_execution_use_case_simple.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/code-execution/docker_claude_code.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/code-execution/docker_multi_agent.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/code-execution/docker_simple.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/code-execution/docker_with_resource_limits.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/code-execution/multi_agent_playwright_automation.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/cc_gpt5_gemini_filesystem.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/claude_code_context_sharing.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/claude_code_flash2.5.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/claude_code_flash2.5_gptoss.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/claude_code_gpt5nano.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/claude_code_single.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/fs_permissions_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/gemini_gemini_workspace_cleanup.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/gemini_gpt5_filesystem_casestudy.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/gemini_gpt5nano_file_context_path.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/gemini_gpt5nano_protected_paths.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/gpt5mini_cc_fs_context_path.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/grok4_gpt5_gemini_filesystem.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/multiturn/grok4_gpt5_claude_code_filesystem_multiturn.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/multiturn/grok4_gpt5_gemini_filesystem_multiturn.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/multiturn/two_claude_code_filesystem_multiturn.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/multiturn/two_gemini_flash_filesystem_multiturn.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/claude_code_discord_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/claude_code_simple_mcp.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/claude_code_twitter_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/claude_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/claude_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/five_agents_travel_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/five_agents_weather_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gemini_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gemini_mcp_filesystem_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gemini_mcp_filesystem_test_sharing.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gemini_mcp_filesystem_test_single_agent.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gemini_mcp_filesystem_test_with_claude_code.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gemini_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gemini_notion_mcp.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gpt5_nano_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gpt5_nano_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gpt5mini_claude_code_discord_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gpt_oss_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gpt_oss_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/grok3_mini_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/grok3_mini_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/multimcp_gemini.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/qwen_api_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/qwen_api_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/qwen_local_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/qwen_local_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/planning/five_agents_discord_mcp_planning_mode.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/planning/five_agents_filesystem_mcp_planning_mode.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/planning/five_agents_notion_mcp_planning_mode.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/planning/five_agents_twitter_mcp_planning_mode.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/planning/gpt5_mini_case_study_mcp_planning_mode.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/web-search/claude_streamable_http_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/web-search/gemini_streamable_http_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/web-search/gpt5_mini_streamable_http_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/web-search/gpt_oss_streamable_http_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/web-search/grok3_mini_streamable_http_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/web-search/qwen_api_streamable_http_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/web-search/qwen_local_streamable_http_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/coordination_tracker.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/docker/README.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/_base.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/_code_execution_server.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/_docker_manager.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/_file_operation_tracker.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/_filesystem_manager.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/_path_permission_manager.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/_workspace_tools_server.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/formatter/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/formatter/_chat_completions_formatter.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/formatter/_claude_formatter.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/formatter/_formatter_base.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/formatter/_response_formatter.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/coordination_ui.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/displays/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/displays/base_display.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/displays/create_coordination_table.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/displays/rich_terminal_display.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/displays/simple_display.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/displays/terminal_display.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/logger_config.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/README.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/backend_utils.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/circuit_breaker.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/client.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/config_validator.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/docs/circuit_breaker.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/docs/client.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/docs/config_validator.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/docs/exceptions.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/docs/security.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/exceptions.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/hooks.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/security.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/message_templates.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/orchestrator.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/stream_chunk/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/stream_chunk/base.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/stream_chunk/multimodal.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/stream_chunk/text.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/mcp_test_server.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/multi_turn_conversation_design.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/multiturn_llm_input_analysis.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_azure_openai_backend.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_backend_capabilities.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_backend_event_loop_all.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_case_studies.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_chat_completions_refactor.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_claude_backend.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_claude_code.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_claude_code_context_sharing.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_claude_code_orchestrator.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_cli_backends.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_code_execution.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_external_agent_backend.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_final_presentation_fallback.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_gemini_planning_mode.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_grok_backend.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_http_mcp_server.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_integration_simple.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_mcp_blocking.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_message_context_building.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_orchestrator_final_presentation.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_path_permission_manager.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_rich_terminal_display.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_timeout.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_v3_3agents.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_v3_simple.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_v3_three_agents.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_v3_two_agents.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/token_manager/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/token_manager/token_manager.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/utils.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/README.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/agent.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/agents.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/backends/gemini.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/backends/grok.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/backends/oai.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/cli.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/config.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/examples/fast-4o-mini-config.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/examples/fast_config.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/examples/production.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/examples/single_agent.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/logging.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/main.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/orchestrator.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/streaming_display.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/tools.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/types.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/utils.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen.egg-info/SOURCES.txt +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen.egg-info/dependency_links.txt +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen.egg-info/entry_points.txt +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen.egg-info/not-zip-safe +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen.egg-info/requires.txt +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen.egg-info/top_level.txt +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/pyproject.toml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/requirements.txt +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: massgen
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.0a2
|
|
4
4
|
Summary: Multi-Agent Scaling System - A powerful framework for collaborative AI
|
|
5
5
|
Author-email: MassGen Team <contact@massgen.dev>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -393,21 +393,25 @@ cmd /c %USERPROFILE%\.lmstudio\bin\lms.exe bootstrap
|
|
|
393
393
|
|
|
394
394
|
### 2. 🔐 API Configuration
|
|
395
395
|
|
|
396
|
-
**
|
|
397
|
-
|
|
398
|
-
For development installations or manual configuration:
|
|
396
|
+
**Create a `.env` file in your working directory with your API keys:**
|
|
399
397
|
|
|
400
398
|
```bash
|
|
401
|
-
# Copy
|
|
402
|
-
|
|
399
|
+
# Copy this template to .env and add your API keys
|
|
400
|
+
OPENAI_API_KEY=sk-...
|
|
401
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
402
|
+
GOOGLE_API_KEY=...
|
|
403
|
+
XAI_API_KEY=...
|
|
404
|
+
|
|
405
|
+
# Optional: Additional providers
|
|
406
|
+
CEREBRAS_API_KEY=...
|
|
407
|
+
TOGETHER_API_KEY=...
|
|
408
|
+
GROQ_API_KEY=...
|
|
409
|
+
OPENROUTER_API_KEY=...
|
|
403
410
|
```
|
|
404
411
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
export ANTHROPIC_API_KEY="your-key"
|
|
409
|
-
export GOOGLE_API_KEY="your-key"
|
|
410
|
-
```
|
|
412
|
+
MassGen automatically loads API keys from `.env` in your current directory.
|
|
413
|
+
|
|
414
|
+
→ **Complete setup guide with all providers:** See [API Key Configuration](https://massgen.readthedocs.io/en/latest/quickstart/installation.html#api-key-configuration) in the docs
|
|
411
415
|
|
|
412
416
|
**Get API keys:**
|
|
413
417
|
- [OpenAI](https://platform.openai.com/api-keys) | [Claude](https://docs.anthropic.com/en/api/overview) | [Gemini](https://ai.google.dev/gemini-api/docs) | [Grok](https://docs.x.ai/docs/overview)
|
|
@@ -310,21 +310,25 @@ cmd /c %USERPROFILE%\.lmstudio\bin\lms.exe bootstrap
|
|
|
310
310
|
|
|
311
311
|
### 2. 🔐 API Configuration
|
|
312
312
|
|
|
313
|
-
**
|
|
314
|
-
|
|
315
|
-
For development installations or manual configuration:
|
|
313
|
+
**Create a `.env` file in your working directory with your API keys:**
|
|
316
314
|
|
|
317
315
|
```bash
|
|
318
|
-
# Copy
|
|
319
|
-
|
|
316
|
+
# Copy this template to .env and add your API keys
|
|
317
|
+
OPENAI_API_KEY=sk-...
|
|
318
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
319
|
+
GOOGLE_API_KEY=...
|
|
320
|
+
XAI_API_KEY=...
|
|
321
|
+
|
|
322
|
+
# Optional: Additional providers
|
|
323
|
+
CEREBRAS_API_KEY=...
|
|
324
|
+
TOGETHER_API_KEY=...
|
|
325
|
+
GROQ_API_KEY=...
|
|
326
|
+
OPENROUTER_API_KEY=...
|
|
320
327
|
```
|
|
321
328
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
export ANTHROPIC_API_KEY="your-key"
|
|
326
|
-
export GOOGLE_API_KEY="your-key"
|
|
327
|
-
```
|
|
329
|
+
MassGen automatically loads API keys from `.env` in your current directory.
|
|
330
|
+
|
|
331
|
+
→ **Complete setup guide with all providers:** See [API Key Configuration](https://massgen.readthedocs.io/en/latest/quickstart/installation.html#api-key-configuration) in the docs
|
|
328
332
|
|
|
329
333
|
**Get API keys:**
|
|
330
334
|
- [OpenAI](https://platform.openai.com/api-keys) | [Claude](https://docs.anthropic.com/en/api/overview) | [Gemini](https://ai.google.dev/gemini-api/docs) | [Grok](https://docs.x.ai/docs/overview)
|
|
@@ -291,25 +291,29 @@ def create_backend(backend_type: str, **kwargs) -> Any:
|
|
|
291
291
|
if backend_type == "openai":
|
|
292
292
|
api_key = kwargs.get("api_key") or os.getenv("OPENAI_API_KEY")
|
|
293
293
|
if not api_key:
|
|
294
|
-
|
|
294
|
+
print("⚠️ Warning: OpenAI API key not found. Set OPENAI_API_KEY environment variable or add to .env file.", flush=True)
|
|
295
|
+
print(" .env file locations: current directory, or ~/.massgen/.env", flush=True)
|
|
295
296
|
return ResponseBackend(api_key=api_key, **kwargs)
|
|
296
297
|
|
|
297
298
|
elif backend_type == "grok":
|
|
298
299
|
api_key = kwargs.get("api_key") or os.getenv("XAI_API_KEY")
|
|
299
300
|
if not api_key:
|
|
300
|
-
|
|
301
|
+
print("⚠️ Warning: Grok API key not found. Set XAI_API_KEY environment variable or add to .env file.", flush=True)
|
|
302
|
+
print(" .env file locations: current directory, or ~/.massgen/.env", flush=True)
|
|
301
303
|
return GrokBackend(api_key=api_key, **kwargs)
|
|
302
304
|
|
|
303
305
|
elif backend_type == "claude":
|
|
304
306
|
api_key = kwargs.get("api_key") or os.getenv("ANTHROPIC_API_KEY")
|
|
305
307
|
if not api_key:
|
|
306
|
-
|
|
308
|
+
print("⚠️ Warning: Claude API key not found. Set ANTHROPIC_API_KEY environment variable or add to .env file.", flush=True)
|
|
309
|
+
print(" .env file locations: current directory, or ~/.massgen/.env", flush=True)
|
|
307
310
|
return ClaudeBackend(api_key=api_key, **kwargs)
|
|
308
311
|
|
|
309
312
|
elif backend_type == "gemini":
|
|
310
313
|
api_key = kwargs.get("api_key") or os.getenv("GOOGLE_API_KEY") or os.getenv("GEMINI_API_KEY")
|
|
311
314
|
if not api_key:
|
|
312
|
-
|
|
315
|
+
print("⚠️ Warning: Gemini API key not found. Set GOOGLE_API_KEY environment variable or add to .env file.", flush=True)
|
|
316
|
+
print(" .env file locations: current directory, or ~/.massgen/.env", flush=True)
|
|
313
317
|
return GeminiBackend(api_key=api_key, **kwargs)
|
|
314
318
|
|
|
315
319
|
elif backend_type == "chatcompletion":
|
|
@@ -1776,6 +1780,11 @@ Environment Variables:
|
|
|
1776
1780
|
action="store_true",
|
|
1777
1781
|
help="Launch interactive configuration builder to create config file",
|
|
1778
1782
|
)
|
|
1783
|
+
parser.add_argument(
|
|
1784
|
+
"--setup-keys",
|
|
1785
|
+
action="store_true",
|
|
1786
|
+
help="Launch interactive API key setup wizard to configure credentials",
|
|
1787
|
+
)
|
|
1779
1788
|
parser.add_argument(
|
|
1780
1789
|
"--list-examples",
|
|
1781
1790
|
action="store_true",
|
|
@@ -1834,6 +1843,21 @@ Environment Variables:
|
|
|
1834
1843
|
show_schema(backend=args.schema_backend, show_examples=args.with_examples)
|
|
1835
1844
|
return
|
|
1836
1845
|
|
|
1846
|
+
# Launch interactive API key setup if requested
|
|
1847
|
+
if args.setup_keys:
|
|
1848
|
+
from .config_builder import ConfigBuilder
|
|
1849
|
+
|
|
1850
|
+
builder = ConfigBuilder()
|
|
1851
|
+
api_keys = builder.interactive_api_key_setup()
|
|
1852
|
+
|
|
1853
|
+
if any(api_keys.values()):
|
|
1854
|
+
print(f"\n{BRIGHT_GREEN}✅ API key setup complete!{RESET}")
|
|
1855
|
+
print(f"{BRIGHT_CYAN}💡 You can now use MassGen with these providers{RESET}\n")
|
|
1856
|
+
else:
|
|
1857
|
+
print(f"\n{BRIGHT_YELLOW}⚠️ No API keys configured{RESET}")
|
|
1858
|
+
print(f"{BRIGHT_CYAN}💡 You can run 'massgen --setup-keys' anytime to set them up{RESET}\n")
|
|
1859
|
+
return
|
|
1860
|
+
|
|
1837
1861
|
# Launch interactive config builder if requested
|
|
1838
1862
|
if args.init:
|
|
1839
1863
|
from .config_builder import ConfigBuilder
|
|
@@ -320,6 +320,202 @@ class ConfigBuilder:
|
|
|
320
320
|
# Return empty dict to allow continue with manual input
|
|
321
321
|
return {provider_id: False for provider_id in self.PROVIDERS.keys()}
|
|
322
322
|
|
|
323
|
+
def interactive_api_key_setup(self) -> Dict[str, bool]:
|
|
324
|
+
"""Interactive API key setup wizard.
|
|
325
|
+
|
|
326
|
+
Prompts user to enter API keys for providers and saves them to .env file.
|
|
327
|
+
Follows CLI tool patterns (AWS CLI, Stripe CLI) for API key management.
|
|
328
|
+
|
|
329
|
+
Returns:
|
|
330
|
+
Updated api_keys dict after setup
|
|
331
|
+
"""
|
|
332
|
+
try:
|
|
333
|
+
console.print("\n[bold cyan]API Key Setup[/bold cyan]\n")
|
|
334
|
+
console.print("[dim]Configure API keys for cloud AI providers.[/dim]")
|
|
335
|
+
console.print("[dim](Alternatively, you can use local models like vLLM/Ollama - no keys needed)[/dim]\n")
|
|
336
|
+
|
|
337
|
+
# Collect API keys from user
|
|
338
|
+
collected_keys = {}
|
|
339
|
+
|
|
340
|
+
# Complete list of all API key providers (includes main backends + chatcompletion variants)
|
|
341
|
+
# This is the complete set from cli.py create_backend()
|
|
342
|
+
all_providers = [
|
|
343
|
+
# Main backends (high priority)
|
|
344
|
+
("openai", "OpenAI", "OPENAI_API_KEY"),
|
|
345
|
+
("anthropic", "Anthropic (Claude)", "ANTHROPIC_API_KEY"),
|
|
346
|
+
("gemini", "Google Gemini", "GOOGLE_API_KEY"),
|
|
347
|
+
("grok", "xAI (Grok)", "XAI_API_KEY"),
|
|
348
|
+
# Azure
|
|
349
|
+
("azure_openai", "Azure OpenAI", "AZURE_OPENAI_API_KEY"),
|
|
350
|
+
# ChatCompletion providers
|
|
351
|
+
("cerebras", "Cerebras AI", "CEREBRAS_API_KEY"),
|
|
352
|
+
("together", "Together AI", "TOGETHER_API_KEY"),
|
|
353
|
+
("fireworks", "Fireworks AI", "FIREWORKS_API_KEY"),
|
|
354
|
+
("groq", "Groq", "GROQ_API_KEY"),
|
|
355
|
+
("nebius", "Nebius AI Studio", "NEBIUS_API_KEY"),
|
|
356
|
+
("openrouter", "OpenRouter", "OPENROUTER_API_KEY"),
|
|
357
|
+
("zai", "ZAI (Zhipu.ai)", "ZAI_API_KEY"),
|
|
358
|
+
("moonshot", "Kimi/Moonshot AI", "MOONSHOT_API_KEY"),
|
|
359
|
+
("poe", "POE", "POE_API_KEY"),
|
|
360
|
+
("qwen", "Qwen (Alibaba)", "QWEN_API_KEY"),
|
|
361
|
+
]
|
|
362
|
+
|
|
363
|
+
# Create checkbox choices for provider selection (nothing pre-checked)
|
|
364
|
+
provider_choices = []
|
|
365
|
+
for provider_id, name, env_var in all_providers:
|
|
366
|
+
provider_choices.append(
|
|
367
|
+
questionary.Choice(
|
|
368
|
+
f"{name:<25} [{env_var}]",
|
|
369
|
+
value=(provider_id, name, env_var),
|
|
370
|
+
checked=False,
|
|
371
|
+
),
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
console.print("[dim]Select which providers you want to configure (Space to toggle, Enter to confirm):[/dim]")
|
|
375
|
+
console.print("[dim]Or skip all to use local models (vLLM, Ollama, etc.)[/dim]\n")
|
|
376
|
+
|
|
377
|
+
selected_providers = questionary.checkbox(
|
|
378
|
+
"Select cloud providers to configure:",
|
|
379
|
+
choices=provider_choices,
|
|
380
|
+
style=questionary.Style(
|
|
381
|
+
[
|
|
382
|
+
("selected", "fg:cyan"),
|
|
383
|
+
("pointer", "fg:cyan bold"),
|
|
384
|
+
("highlighted", "fg:cyan"),
|
|
385
|
+
],
|
|
386
|
+
),
|
|
387
|
+
use_arrow_keys=True,
|
|
388
|
+
).ask()
|
|
389
|
+
|
|
390
|
+
if selected_providers is None:
|
|
391
|
+
raise KeyboardInterrupt
|
|
392
|
+
|
|
393
|
+
if not selected_providers:
|
|
394
|
+
console.print("\n[yellow]⚠️ No providers selected[/yellow]")
|
|
395
|
+
console.print("[dim]Skipping API key setup. You can use local models (vLLM, Ollama) without API keys.[/dim]\n")
|
|
396
|
+
return {}
|
|
397
|
+
|
|
398
|
+
# Now prompt for API keys only for selected providers
|
|
399
|
+
console.print(f"\n[cyan]Configuring {len(selected_providers)} provider(s)[/cyan]\n")
|
|
400
|
+
|
|
401
|
+
for provider_id, name, env_var in selected_providers:
|
|
402
|
+
# Prompt for API key (with password-style input)
|
|
403
|
+
console.print(f"[bold cyan]{name}[/bold cyan]")
|
|
404
|
+
console.print(f"[dim]Environment variable: {env_var}[/dim]")
|
|
405
|
+
|
|
406
|
+
api_key = Prompt.ask(
|
|
407
|
+
f"Enter your {name} API key",
|
|
408
|
+
password=True, # Hide input
|
|
409
|
+
)
|
|
410
|
+
|
|
411
|
+
if api_key is None:
|
|
412
|
+
raise KeyboardInterrupt
|
|
413
|
+
|
|
414
|
+
if api_key and api_key.strip():
|
|
415
|
+
collected_keys[env_var] = api_key.strip()
|
|
416
|
+
console.print(f"✅ {name} API key saved")
|
|
417
|
+
else:
|
|
418
|
+
console.print(f"[yellow]⚠️ Skipped {name} (empty input)[/yellow]")
|
|
419
|
+
console.print()
|
|
420
|
+
|
|
421
|
+
if not collected_keys:
|
|
422
|
+
console.print("[error]❌ No API keys were configured.[/error]")
|
|
423
|
+
console.print("[info]At least one API key is required to use MassGen.[/info]")
|
|
424
|
+
return {}
|
|
425
|
+
|
|
426
|
+
# Ask where to save
|
|
427
|
+
console.print("\n[bold cyan]Where to Save API Keys[/bold cyan]\n")
|
|
428
|
+
console.print("[dim]Choose where to save your API keys:[/dim]\n")
|
|
429
|
+
console.print(" [1] ~/.massgen/.env (recommended - available globally)")
|
|
430
|
+
console.print(" [2] ./.env (current directory only)")
|
|
431
|
+
console.print()
|
|
432
|
+
|
|
433
|
+
save_location = Prompt.ask(
|
|
434
|
+
"[prompt]Choose location[/prompt]",
|
|
435
|
+
choices=["1", "2"],
|
|
436
|
+
default="1",
|
|
437
|
+
)
|
|
438
|
+
|
|
439
|
+
if save_location is None:
|
|
440
|
+
raise KeyboardInterrupt
|
|
441
|
+
|
|
442
|
+
# Determine target path
|
|
443
|
+
if save_location == "1":
|
|
444
|
+
env_dir = Path.home() / ".massgen"
|
|
445
|
+
env_dir.mkdir(parents=True, exist_ok=True)
|
|
446
|
+
env_path = env_dir / ".env"
|
|
447
|
+
else:
|
|
448
|
+
env_path = Path(".env")
|
|
449
|
+
|
|
450
|
+
# Check if .env already exists
|
|
451
|
+
existing_content = {}
|
|
452
|
+
if env_path.exists():
|
|
453
|
+
console.print(f"\n[yellow]⚠️ {env_path} already exists[/yellow]")
|
|
454
|
+
|
|
455
|
+
# Parse existing .env file
|
|
456
|
+
try:
|
|
457
|
+
with open(env_path, "r") as f:
|
|
458
|
+
for line in f:
|
|
459
|
+
line = line.strip()
|
|
460
|
+
if line and not line.startswith("#") and "=" in line:
|
|
461
|
+
key, value = line.split("=", 1)
|
|
462
|
+
existing_content[key.strip()] = value.strip()
|
|
463
|
+
except Exception as e:
|
|
464
|
+
console.print(f"[warning]⚠️ Could not read existing .env: {e}[/warning]")
|
|
465
|
+
|
|
466
|
+
merge = Confirm.ask("Merge with existing keys (recommended)?", default=True)
|
|
467
|
+
if merge is None:
|
|
468
|
+
raise KeyboardInterrupt
|
|
469
|
+
|
|
470
|
+
if merge:
|
|
471
|
+
# Merge: existing keys + new keys (new keys overwrite)
|
|
472
|
+
existing_content.update(collected_keys)
|
|
473
|
+
collected_keys = existing_content
|
|
474
|
+
else:
|
|
475
|
+
# User chose to overwrite completely
|
|
476
|
+
pass
|
|
477
|
+
|
|
478
|
+
# Write .env file
|
|
479
|
+
try:
|
|
480
|
+
with open(env_path, "w") as f:
|
|
481
|
+
f.write("# MassGen API Keys\n")
|
|
482
|
+
f.write("# Generated by MassGen Interactive Setup\n\n")
|
|
483
|
+
|
|
484
|
+
for env_var, api_key in sorted(collected_keys.items()):
|
|
485
|
+
f.write(f"{env_var}={api_key}\n")
|
|
486
|
+
|
|
487
|
+
console.print(f"\n✅ [success]API keys saved to: {env_path.absolute()}[/success]")
|
|
488
|
+
|
|
489
|
+
# Security reminder
|
|
490
|
+
if env_path == Path(".env"):
|
|
491
|
+
console.print("\n[yellow]⚠️ Security reminder:[/yellow]")
|
|
492
|
+
console.print("[yellow] Add .env to your .gitignore to avoid committing API keys![/yellow]")
|
|
493
|
+
|
|
494
|
+
except Exception as e:
|
|
495
|
+
console.print(f"\n[error]❌ Failed to save .env file: {e}[/error]")
|
|
496
|
+
return {}
|
|
497
|
+
|
|
498
|
+
# Reload environment variables
|
|
499
|
+
console.print("\n[dim]Reloading environment variables...[/dim]")
|
|
500
|
+
load_dotenv(env_path, override=True)
|
|
501
|
+
|
|
502
|
+
# Re-detect API keys
|
|
503
|
+
console.print("[dim]Verifying API keys...[/dim]\n")
|
|
504
|
+
updated_api_keys = self.detect_api_keys()
|
|
505
|
+
|
|
506
|
+
# Show what was detected
|
|
507
|
+
available_count = sum(1 for has_key in updated_api_keys.values() if has_key)
|
|
508
|
+
console.print(f"[success]✅ {available_count} provider(s) available[/success]\n")
|
|
509
|
+
|
|
510
|
+
return updated_api_keys
|
|
511
|
+
|
|
512
|
+
except (KeyboardInterrupt, EOFError):
|
|
513
|
+
console.print("\n\n[yellow]API key setup cancelled[/yellow]\n")
|
|
514
|
+
return {}
|
|
515
|
+
except Exception as e:
|
|
516
|
+
console.print(f"\n[error]❌ Error during API key setup: {e}[/error]")
|
|
517
|
+
return {}
|
|
518
|
+
|
|
323
519
|
def show_available_providers(
|
|
324
520
|
self,
|
|
325
521
|
api_keys: Dict[str, bool],
|
|
@@ -2038,14 +2234,49 @@ class ConfigBuilder:
|
|
|
2038
2234
|
api_keys = {}
|
|
2039
2235
|
|
|
2040
2236
|
# Check if any API keys are available
|
|
2237
|
+
# Note: api_keys includes local models (vLLM, etc.) which are always True
|
|
2041
2238
|
if not any(api_keys.values()):
|
|
2042
|
-
|
|
2043
|
-
console.print("
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
console.print("
|
|
2048
|
-
|
|
2239
|
+
# No providers available at all (no API keys, no local models, no Claude Code)
|
|
2240
|
+
console.print("[yellow]⚠️ No API keys or local models detected[/yellow]\n")
|
|
2241
|
+
console.print("[dim]MassGen needs at least one of:[/dim]")
|
|
2242
|
+
console.print("[dim] • API keys for cloud providers (OpenAI, Anthropic, Google, etc.)[/dim]")
|
|
2243
|
+
console.print("[dim] • Local models (vLLM, Ollama, etc.)[/dim]")
|
|
2244
|
+
console.print("[dim] • Claude Code with 'claude login'[/dim]\n")
|
|
2245
|
+
|
|
2246
|
+
setup_choice = Confirm.ask(
|
|
2247
|
+
"[prompt]Would you like to set up API keys now (interactive)?[/prompt]",
|
|
2248
|
+
default=True,
|
|
2249
|
+
)
|
|
2250
|
+
|
|
2251
|
+
if setup_choice is None:
|
|
2252
|
+
raise KeyboardInterrupt
|
|
2253
|
+
|
|
2254
|
+
if setup_choice:
|
|
2255
|
+
# Run interactive setup
|
|
2256
|
+
api_keys = self.interactive_api_key_setup()
|
|
2257
|
+
|
|
2258
|
+
# Check if setup was successful
|
|
2259
|
+
if not any(api_keys.values()):
|
|
2260
|
+
console.print("\n[error]❌ No API keys were configured.[/error]")
|
|
2261
|
+
console.print("\n[dim]Alternatives to API keys:[/dim]")
|
|
2262
|
+
console.print("[dim] • Set up local models (vLLM, Ollama)[/dim]")
|
|
2263
|
+
console.print("[dim] • Use Claude Code with 'claude login'[/dim]")
|
|
2264
|
+
console.print("[dim] • Manually create .env file: ~/.massgen/.env or ./.env[/dim]\n")
|
|
2265
|
+
return None
|
|
2266
|
+
else:
|
|
2267
|
+
# User declined interactive setup
|
|
2268
|
+
console.print("\n[info]To use MassGen, you need at least one provider.[/info]")
|
|
2269
|
+
console.print("\n[cyan]Option 1: API Keys[/cyan]")
|
|
2270
|
+
console.print(" Create .env file with one or more:")
|
|
2271
|
+
for provider_id, provider_info in self.PROVIDERS.items():
|
|
2272
|
+
if provider_info.get("env_var"):
|
|
2273
|
+
console.print(f" • {provider_info['env_var']}")
|
|
2274
|
+
console.print("\n[cyan]Option 2: Local Models[/cyan]")
|
|
2275
|
+
console.print(" • Set up vLLM, Ollama, or other local inference")
|
|
2276
|
+
console.print("\n[cyan]Option 3: Claude Code[/cyan]")
|
|
2277
|
+
console.print(" • Run 'claude login' in your terminal")
|
|
2278
|
+
console.print("\n[dim]Run 'massgen --init' anytime to restart this wizard[/dim]\n")
|
|
2279
|
+
return None
|
|
2049
2280
|
|
|
2050
2281
|
try:
|
|
2051
2282
|
# Step 1: Select use case
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: massgen
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.0a2
|
|
4
4
|
Summary: Multi-Agent Scaling System - A powerful framework for collaborative AI
|
|
5
5
|
Author-email: MassGen Team <contact@massgen.dev>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -393,21 +393,25 @@ cmd /c %USERPROFILE%\.lmstudio\bin\lms.exe bootstrap
|
|
|
393
393
|
|
|
394
394
|
### 2. 🔐 API Configuration
|
|
395
395
|
|
|
396
|
-
**
|
|
397
|
-
|
|
398
|
-
For development installations or manual configuration:
|
|
396
|
+
**Create a `.env` file in your working directory with your API keys:**
|
|
399
397
|
|
|
400
398
|
```bash
|
|
401
|
-
# Copy
|
|
402
|
-
|
|
399
|
+
# Copy this template to .env and add your API keys
|
|
400
|
+
OPENAI_API_KEY=sk-...
|
|
401
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
402
|
+
GOOGLE_API_KEY=...
|
|
403
|
+
XAI_API_KEY=...
|
|
404
|
+
|
|
405
|
+
# Optional: Additional providers
|
|
406
|
+
CEREBRAS_API_KEY=...
|
|
407
|
+
TOGETHER_API_KEY=...
|
|
408
|
+
GROQ_API_KEY=...
|
|
409
|
+
OPENROUTER_API_KEY=...
|
|
403
410
|
```
|
|
404
411
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
export ANTHROPIC_API_KEY="your-key"
|
|
409
|
-
export GOOGLE_API_KEY="your-key"
|
|
410
|
-
```
|
|
412
|
+
MassGen automatically loads API keys from `.env` in your current directory.
|
|
413
|
+
|
|
414
|
+
→ **Complete setup guide with all providers:** See [API Key Configuration](https://massgen.readthedocs.io/en/latest/quickstart/installation.html#api-key-configuration) in the docs
|
|
411
415
|
|
|
412
416
|
**Get API keys:**
|
|
413
417
|
- [OpenAI](https://platform.openai.com/api-keys) | [Claude](https://docs.anthropic.com/en/api/overview) | [Gemini](https://ai.google.dev/gemini-api/docs) | [Grok](https://docs.x.ai/docs/overview)
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/api_params_handler/_claude_api_params_handler.py
RENAMED
|
File without changes
|
{massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/api_params_handler/_response_api_params_handler.py
RENAMED
|
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
|
|
File without changes
|
{massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/Function calling openai responses.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/MCP_IMPLEMENTATION_CLAUDE_BACKEND.md
RENAMED
|
File without changes
|
{massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/MCP_INTEGRATION_RESPONSE_BACKEND.md
RENAMED
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/geminicode_gpt5nano_claude.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|