massgen 0.1.0a1__tar.gz → 0.1.0a3__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.0a3}/PKG-INFO +16 -12
- {massgen-0.1.0a1 → massgen-0.1.0a3}/README.md +15 -11
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/__init__.py +1 -1
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/cli.py +86 -18
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/config_builder.py +243 -12
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen.egg-info/PKG-INFO +16 -12
- {massgen-0.1.0a1 → massgen-0.1.0a3}/.env.example +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/CHANGELOG.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/CONTRIBUTING.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/LICENSE +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/MANIFEST.in +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/adapters/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/adapters/ag2_adapter.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/adapters/base.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/adapters/tests/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/adapters/tests/test_ag2_adapter.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/adapters/tests/test_agent_adapter.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/adapters/utils/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/adapters/utils/ag2_utils.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/adapters/utils/tests/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/adapters/utils/tests/test_ag2_utils.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/agent_config.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/api_params_handler/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/api_params_handler/_api_params_handler_base.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/api_params_handler/_chat_completions_api_params_handler.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/api_params_handler/_claude_api_params_handler.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/api_params_handler/_response_api_params_handler.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/azure_openai.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/base.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/base_with_mcp.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/capabilities.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/chat_completions.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/claude.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/claude_code.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/cli_base.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/docs/BACKEND_ARCHITECTURE.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/docs/CLAUDE_API_RESEARCH.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/docs/Function calling openai responses.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/docs/GEMINI_API_DOCUMENTATION.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/docs/Gemini MCP Integration Analysis.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/docs/MCP_IMPLEMENTATION_CLAUDE_BACKEND.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/docs/MCP_INTEGRATION_RESPONSE_BACKEND.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/docs/OPENAI_GPT5_MODELS.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/docs/OPENAI_RESPONSE_API_TOOL_CALLS.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/docs/OPENAI_response_streaming.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/docs/inference_backend.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/docs/permissions_and_context_files.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/external.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/gemini.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/grok.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/inference.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/lmstudio.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/backend/response.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/chat_agent.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/BACKEND_CONFIGURATION.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/README.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/ag2/ag2_case_study.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/ag2/ag2_coder.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/ag2/ag2_coder_case_study.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/ag2/ag2_gemini.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/ag2/ag2_groupchat.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/ag2/ag2_groupchat_gpt.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/ag2/ag2_single_agent.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/fast_timeout_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/gemini_4o_claude.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/gemini_gpt5nano_claude.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/geminicode_4o_claude.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/geminicode_gpt5nano_claude.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/glm_gemini_claude.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/gpt4o_audio_generation.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/gpt4o_image_generation.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/gpt5nano_glm_qwen.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/gpt5nano_image_understanding.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/three_agents_default.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/three_agents_opensource.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/three_agents_vllm.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/two_agents_gemini.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/two_agents_gpt5.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/two_agents_opensource_lmstudio.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/multi/two_qwen_vllm_sglang.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/single/single_agent.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/single/single_flash2.5.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/single/single_gemini2.5pro.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/single/single_gpt4o_audio_generation.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/single/single_gpt4o_image_generation.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/single/single_gpt4o_video_generation.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/single/single_gpt5nano.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/single/single_gpt5nano_file_search.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/single/single_gpt5nano_image_understanding.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/single/single_gptoss120b.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/single/single_openrouter_audio_understanding.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/basic/single/single_qwen_video_understanding.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/debug/code_execution/command_filtering_blacklist.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/debug/code_execution/command_filtering_whitelist.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/debug/code_execution/docker_verification.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/debug/skip_coordination_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/debug/test_sdk_migration.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/docs/DISCORD_MCP_SETUP.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/docs/TWITTER_MCP_ENESCINAR_SETUP.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/providers/azure/azure_openai_multi.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/providers/azure/azure_openai_single.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/providers/claude/claude.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/providers/gemini/gemini_gpt5nano.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/providers/local/lmstudio.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/providers/openai/gpt5.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/providers/openai/gpt5_nano.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/providers/others/grok_single_agent.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/providers/others/zai_coding_team.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/providers/others/zai_glm45.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/teams/creative/creative_team.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/teams/creative/travel_planning.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/teams/research/news_analysis.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/teams/research/research_team.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/teams/research/technical_analysis.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/code-execution/basic_command_execution.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/code-execution/code_execution_use_case_simple.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/code-execution/docker_claude_code.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/code-execution/docker_multi_agent.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/code-execution/docker_simple.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/code-execution/docker_with_resource_limits.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/code-execution/multi_agent_playwright_automation.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/cc_gpt5_gemini_filesystem.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/claude_code_context_sharing.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/claude_code_flash2.5.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/claude_code_flash2.5_gptoss.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/claude_code_gpt5nano.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/claude_code_single.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/fs_permissions_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/gemini_gemini_workspace_cleanup.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/gemini_gpt5_filesystem_casestudy.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/gemini_gpt5nano_file_context_path.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/gemini_gpt5nano_protected_paths.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/gpt5mini_cc_fs_context_path.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/grok4_gpt5_gemini_filesystem.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/multiturn/grok4_gpt5_claude_code_filesystem_multiturn.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/multiturn/grok4_gpt5_gemini_filesystem_multiturn.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/multiturn/two_claude_code_filesystem_multiturn.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/filesystem/multiturn/two_gemini_flash_filesystem_multiturn.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/claude_code_discord_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/claude_code_simple_mcp.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/claude_code_twitter_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/claude_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/claude_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/five_agents_travel_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/five_agents_weather_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/gemini_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/gemini_mcp_filesystem_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/gemini_mcp_filesystem_test_sharing.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/gemini_mcp_filesystem_test_single_agent.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/gemini_mcp_filesystem_test_with_claude_code.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/gemini_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/gemini_notion_mcp.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/gpt5_nano_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/gpt5_nano_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/gpt5mini_claude_code_discord_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/gpt_oss_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/gpt_oss_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/grok3_mini_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/grok3_mini_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/multimcp_gemini.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/qwen_api_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/qwen_api_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/qwen_local_mcp_example.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/mcp/qwen_local_mcp_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/planning/five_agents_discord_mcp_planning_mode.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/planning/five_agents_filesystem_mcp_planning_mode.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/planning/five_agents_notion_mcp_planning_mode.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/planning/five_agents_twitter_mcp_planning_mode.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/planning/gpt5_mini_case_study_mcp_planning_mode.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/web-search/claude_streamable_http_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/web-search/gemini_streamable_http_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/web-search/gpt5_mini_streamable_http_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/web-search/gpt_oss_streamable_http_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/web-search/grok3_mini_streamable_http_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/web-search/qwen_api_streamable_http_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/configs/tools/web-search/qwen_local_streamable_http_test.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/coordination_tracker.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/docker/README.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/filesystem_manager/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/filesystem_manager/_base.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/filesystem_manager/_code_execution_server.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/filesystem_manager/_docker_manager.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/filesystem_manager/_file_operation_tracker.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/filesystem_manager/_filesystem_manager.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/filesystem_manager/_path_permission_manager.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/filesystem_manager/_workspace_tools_server.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/formatter/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/formatter/_chat_completions_formatter.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/formatter/_claude_formatter.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/formatter/_formatter_base.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/formatter/_response_formatter.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/frontend/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/frontend/coordination_ui.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/frontend/displays/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/frontend/displays/base_display.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/frontend/displays/create_coordination_table.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/frontend/displays/rich_terminal_display.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/frontend/displays/simple_display.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/frontend/displays/terminal_display.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/logger_config.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/mcp_tools/README.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/mcp_tools/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/mcp_tools/backend_utils.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/mcp_tools/circuit_breaker.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/mcp_tools/client.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/mcp_tools/config_validator.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/mcp_tools/docs/circuit_breaker.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/mcp_tools/docs/client.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/mcp_tools/docs/config_validator.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/mcp_tools/docs/exceptions.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/mcp_tools/docs/security.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/mcp_tools/exceptions.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/mcp_tools/hooks.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/mcp_tools/security.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/message_templates.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/orchestrator.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/stream_chunk/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/stream_chunk/base.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/stream_chunk/multimodal.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/stream_chunk/text.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/mcp_test_server.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/multi_turn_conversation_design.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/multiturn_llm_input_analysis.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_azure_openai_backend.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_backend_capabilities.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_backend_event_loop_all.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_case_studies.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_chat_completions_refactor.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_claude_backend.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_claude_code.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_claude_code_context_sharing.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_claude_code_orchestrator.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_cli_backends.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_code_execution.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_external_agent_backend.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_final_presentation_fallback.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_gemini_planning_mode.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_grok_backend.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_http_mcp_server.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_integration_simple.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_mcp_blocking.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_message_context_building.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_orchestrator_final_presentation.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_path_permission_manager.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_rich_terminal_display.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_timeout.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_v3_3agents.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_v3_simple.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_v3_three_agents.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/tests/test_v3_two_agents.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/token_manager/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/token_manager/token_manager.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/utils.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/README.md +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/__init__.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/agent.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/agents.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/backends/gemini.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/backends/grok.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/backends/oai.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/cli.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/config.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/examples/fast-4o-mini-config.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/examples/fast_config.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/examples/production.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/examples/single_agent.yaml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/logging.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/main.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/orchestrator.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/streaming_display.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/tools.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/types.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen/v1/utils.py +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen.egg-info/SOURCES.txt +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen.egg-info/dependency_links.txt +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen.egg-info/entry_points.txt +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen.egg-info/not-zip-safe +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen.egg-info/requires.txt +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/massgen.egg-info/top_level.txt +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/pyproject.toml +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/requirements.txt +0 -0
- {massgen-0.1.0a1 → massgen-0.1.0a3}/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.0a3
|
|
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,33 @@ 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
|
-
raise ConfigurationError(
|
|
294
|
+
raise ConfigurationError(
|
|
295
|
+
"OpenAI API key not found. Set OPENAI_API_KEY environment variable.\n" "You can add it to a .env file in:\n" " - Current directory: .env\n" " - Global config: ~/.massgen/.env",
|
|
296
|
+
)
|
|
295
297
|
return ResponseBackend(api_key=api_key, **kwargs)
|
|
296
298
|
|
|
297
299
|
elif backend_type == "grok":
|
|
298
300
|
api_key = kwargs.get("api_key") or os.getenv("XAI_API_KEY")
|
|
299
301
|
if not api_key:
|
|
300
|
-
raise ConfigurationError(
|
|
302
|
+
raise ConfigurationError(
|
|
303
|
+
"Grok API key not found. Set XAI_API_KEY environment variable.\n" "You can add it to a .env file in:\n" " - Current directory: .env\n" " - Global config: ~/.massgen/.env",
|
|
304
|
+
)
|
|
301
305
|
return GrokBackend(api_key=api_key, **kwargs)
|
|
302
306
|
|
|
303
307
|
elif backend_type == "claude":
|
|
304
308
|
api_key = kwargs.get("api_key") or os.getenv("ANTHROPIC_API_KEY")
|
|
305
309
|
if not api_key:
|
|
306
|
-
raise ConfigurationError(
|
|
310
|
+
raise ConfigurationError(
|
|
311
|
+
"Claude API key not found. Set ANTHROPIC_API_KEY environment variable.\n" "You can add it to a .env file in:\n" " - Current directory: .env\n" " - Global config: ~/.massgen/.env",
|
|
312
|
+
)
|
|
307
313
|
return ClaudeBackend(api_key=api_key, **kwargs)
|
|
308
314
|
|
|
309
315
|
elif backend_type == "gemini":
|
|
310
316
|
api_key = kwargs.get("api_key") or os.getenv("GOOGLE_API_KEY") or os.getenv("GEMINI_API_KEY")
|
|
311
317
|
if not api_key:
|
|
312
|
-
raise ConfigurationError(
|
|
318
|
+
raise ConfigurationError(
|
|
319
|
+
"Gemini API key not found. Set GOOGLE_API_KEY environment variable.\n" "You can add it to a .env file in:\n" " - Current directory: .env\n" " - Global config: ~/.massgen/.env",
|
|
320
|
+
)
|
|
313
321
|
return GeminiBackend(api_key=api_key, **kwargs)
|
|
314
322
|
|
|
315
323
|
elif backend_type == "chatcompletion":
|
|
@@ -321,43 +329,81 @@ def create_backend(backend_type: str, **kwargs) -> Any:
|
|
|
321
329
|
if base_url and "cerebras.ai" in base_url:
|
|
322
330
|
api_key = os.getenv("CEREBRAS_API_KEY")
|
|
323
331
|
if not api_key:
|
|
324
|
-
raise ConfigurationError(
|
|
332
|
+
raise ConfigurationError(
|
|
333
|
+
"Cerebras AI API key not found. Set CEREBRAS_API_KEY environment variable.\n"
|
|
334
|
+
"You can add it to a .env file in:\n"
|
|
335
|
+
" - Current directory: .env\n"
|
|
336
|
+
" - Global config: ~/.massgen/.env",
|
|
337
|
+
)
|
|
325
338
|
elif base_url and "together.xyz" in base_url:
|
|
326
339
|
api_key = os.getenv("TOGETHER_API_KEY")
|
|
327
340
|
if not api_key:
|
|
328
|
-
raise ConfigurationError(
|
|
341
|
+
raise ConfigurationError(
|
|
342
|
+
"Together AI API key not found. Set TOGETHER_API_KEY environment variable.\n"
|
|
343
|
+
"You can add it to a .env file in:\n"
|
|
344
|
+
" - Current directory: .env\n"
|
|
345
|
+
" - Global config: ~/.massgen/.env",
|
|
346
|
+
)
|
|
329
347
|
elif base_url and "fireworks.ai" in base_url:
|
|
330
348
|
api_key = os.getenv("FIREWORKS_API_KEY")
|
|
331
349
|
if not api_key:
|
|
332
|
-
raise ConfigurationError(
|
|
350
|
+
raise ConfigurationError(
|
|
351
|
+
"Fireworks AI API key not found. Set FIREWORKS_API_KEY environment variable.\n"
|
|
352
|
+
"You can add it to a .env file in:\n"
|
|
353
|
+
" - Current directory: .env\n"
|
|
354
|
+
" - Global config: ~/.massgen/.env",
|
|
355
|
+
)
|
|
333
356
|
elif base_url and "groq.com" in base_url:
|
|
334
357
|
api_key = os.getenv("GROQ_API_KEY")
|
|
335
358
|
if not api_key:
|
|
336
|
-
raise ConfigurationError(
|
|
359
|
+
raise ConfigurationError(
|
|
360
|
+
"Groq API key not found. Set GROQ_API_KEY environment variable.\n" "You can add it to a .env file in:\n" " - Current directory: .env\n" " - Global config: ~/.massgen/.env",
|
|
361
|
+
)
|
|
337
362
|
elif base_url and "nebius.com" in base_url:
|
|
338
363
|
api_key = os.getenv("NEBIUS_API_KEY")
|
|
339
364
|
if not api_key:
|
|
340
|
-
raise ConfigurationError(
|
|
365
|
+
raise ConfigurationError(
|
|
366
|
+
"Nebius AI Studio API key not found. Set NEBIUS_API_KEY environment variable.\n"
|
|
367
|
+
"You can add it to a .env file in:\n"
|
|
368
|
+
" - Current directory: .env\n"
|
|
369
|
+
" - Global config: ~/.massgen/.env",
|
|
370
|
+
)
|
|
341
371
|
elif base_url and "openrouter.ai" in base_url:
|
|
342
372
|
api_key = os.getenv("OPENROUTER_API_KEY")
|
|
343
373
|
if not api_key:
|
|
344
|
-
raise ConfigurationError(
|
|
374
|
+
raise ConfigurationError(
|
|
375
|
+
"OpenRouter API key not found. Set OPENROUTER_API_KEY environment variable.\n"
|
|
376
|
+
"You can add it to a .env file in:\n"
|
|
377
|
+
" - Current directory: .env\n"
|
|
378
|
+
" - Global config: ~/.massgen/.env",
|
|
379
|
+
)
|
|
345
380
|
elif base_url and ("z.ai" in base_url or "bigmodel.cn" in base_url):
|
|
346
381
|
api_key = os.getenv("ZAI_API_KEY")
|
|
347
382
|
if not api_key:
|
|
348
|
-
raise ConfigurationError(
|
|
383
|
+
raise ConfigurationError(
|
|
384
|
+
"ZAI API key not found. Set ZAI_API_KEY environment variable.\n" "You can add it to a .env file in:\n" " - Current directory: .env\n" " - Global config: ~/.massgen/.env",
|
|
385
|
+
)
|
|
349
386
|
elif base_url and ("moonshot.ai" in base_url or "moonshot.cn" in base_url):
|
|
350
387
|
api_key = os.getenv("MOONSHOT_API_KEY") or os.getenv("KIMI_API_KEY")
|
|
351
388
|
if not api_key:
|
|
352
|
-
raise ConfigurationError(
|
|
389
|
+
raise ConfigurationError(
|
|
390
|
+
"Kimi/Moonshot API key not found. Set MOONSHOT_API_KEY or KIMI_API_KEY environment variable.\n"
|
|
391
|
+
"You can add it to a .env file in:\n"
|
|
392
|
+
" - Current directory: .env\n"
|
|
393
|
+
" - Global config: ~/.massgen/.env",
|
|
394
|
+
)
|
|
353
395
|
elif base_url and "poe.com" in base_url:
|
|
354
396
|
api_key = os.getenv("POE_API_KEY")
|
|
355
397
|
if not api_key:
|
|
356
|
-
raise ConfigurationError(
|
|
398
|
+
raise ConfigurationError(
|
|
399
|
+
"POE API key not found. Set POE_API_KEY environment variable.\n" "You can add it to a .env file in:\n" " - Current directory: .env\n" " - Global config: ~/.massgen/.env",
|
|
400
|
+
)
|
|
357
401
|
elif base_url and "aliyuncs.com" in base_url:
|
|
358
402
|
api_key = os.getenv("QWEN_API_KEY")
|
|
359
403
|
if not api_key:
|
|
360
|
-
raise ConfigurationError(
|
|
404
|
+
raise ConfigurationError(
|
|
405
|
+
"Qwen API key not found. Set QWEN_API_KEY environment variable.\n" "You can add it to a .env file in:\n" " - Current directory: .env\n" " - Global config: ~/.massgen/.env",
|
|
406
|
+
)
|
|
361
407
|
|
|
362
408
|
return ChatCompletionsBackend(api_key=api_key, **kwargs)
|
|
363
409
|
|
|
@@ -366,7 +412,9 @@ def create_backend(backend_type: str, **kwargs) -> Any:
|
|
|
366
412
|
# Supports both global (z.ai) and China (bigmodel.cn) endpoints
|
|
367
413
|
api_key = kwargs.get("api_key") or os.getenv("ZAI_API_KEY")
|
|
368
414
|
if not api_key:
|
|
369
|
-
raise ConfigurationError(
|
|
415
|
+
raise ConfigurationError(
|
|
416
|
+
"ZAI API key not found. Set ZAI_API_KEY environment variable.\n" "You can add it to a .env file in:\n" " - Current directory: .env\n" " - Global config: ~/.massgen/.env",
|
|
417
|
+
)
|
|
370
418
|
return ChatCompletionsBackend(api_key=api_key, **kwargs)
|
|
371
419
|
|
|
372
420
|
elif backend_type == "lmstudio":
|
|
@@ -1215,13 +1263,13 @@ async def run_interactive_mode(
|
|
|
1215
1263
|
rich_console.clear()
|
|
1216
1264
|
|
|
1217
1265
|
# ASCII art for interactive multi-agent mode
|
|
1218
|
-
ascii_art = """[bold
|
|
1266
|
+
ascii_art = """[bold #4A90E2]
|
|
1219
1267
|
███╗ ███╗ █████╗ ███████╗███████╗ ██████╗ ███████╗███╗ ██╗
|
|
1220
1268
|
████╗ ████║██╔══██╗██╔════╝██╔════╝██╔════╝ ██╔════╝████╗ ██║
|
|
1221
1269
|
██╔████╔██║███████║███████╗███████╗██║ ███╗█████╗ ██╔██╗ ██║
|
|
1222
1270
|
██║╚██╔╝██║██╔══██║╚════██║╚════██║██║ ██║██╔══╝ ██║╚██╗██║
|
|
1223
1271
|
██║ ╚═╝ ██║██║ ██║███████║███████║╚██████╔╝███████╗██║ ╚████║
|
|
1224
|
-
╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚══════╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝[/bold
|
|
1272
|
+
╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚══════╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝[/bold #4A90E2]
|
|
1225
1273
|
|
|
1226
1274
|
[dim] 🤖 🤖 🤖 → 💬 collaborate → 🎯 winner → 📢 final[/dim]
|
|
1227
1275
|
"""
|
|
@@ -1229,7 +1277,7 @@ async def run_interactive_mode(
|
|
|
1229
1277
|
# Wrap ASCII art in a panel
|
|
1230
1278
|
ascii_panel = Panel(
|
|
1231
1279
|
ascii_art,
|
|
1232
|
-
border_style="bold
|
|
1280
|
+
border_style="bold #4A90E2",
|
|
1233
1281
|
padding=(0, 2),
|
|
1234
1282
|
width=80,
|
|
1235
1283
|
)
|
|
@@ -1776,6 +1824,11 @@ Environment Variables:
|
|
|
1776
1824
|
action="store_true",
|
|
1777
1825
|
help="Launch interactive configuration builder to create config file",
|
|
1778
1826
|
)
|
|
1827
|
+
parser.add_argument(
|
|
1828
|
+
"--setup-keys",
|
|
1829
|
+
action="store_true",
|
|
1830
|
+
help="Launch interactive API key setup wizard to configure credentials",
|
|
1831
|
+
)
|
|
1779
1832
|
parser.add_argument(
|
|
1780
1833
|
"--list-examples",
|
|
1781
1834
|
action="store_true",
|
|
@@ -1834,6 +1887,21 @@ Environment Variables:
|
|
|
1834
1887
|
show_schema(backend=args.schema_backend, show_examples=args.with_examples)
|
|
1835
1888
|
return
|
|
1836
1889
|
|
|
1890
|
+
# Launch interactive API key setup if requested
|
|
1891
|
+
if args.setup_keys:
|
|
1892
|
+
from .config_builder import ConfigBuilder
|
|
1893
|
+
|
|
1894
|
+
builder = ConfigBuilder()
|
|
1895
|
+
api_keys = builder.interactive_api_key_setup()
|
|
1896
|
+
|
|
1897
|
+
if any(api_keys.values()):
|
|
1898
|
+
print(f"\n{BRIGHT_GREEN}✅ API key setup complete!{RESET}")
|
|
1899
|
+
print(f"{BRIGHT_CYAN}💡 You can now use MassGen with these providers{RESET}\n")
|
|
1900
|
+
else:
|
|
1901
|
+
print(f"\n{BRIGHT_YELLOW}⚠️ No API keys configured{RESET}")
|
|
1902
|
+
print(f"{BRIGHT_CYAN}💡 You can run 'massgen --setup-keys' anytime to set them up{RESET}\n")
|
|
1903
|
+
return
|
|
1904
|
+
|
|
1837
1905
|
# Launch interactive config builder if requested
|
|
1838
1906
|
if args.init:
|
|
1839
1907
|
from .config_builder import ConfigBuilder
|
|
@@ -33,11 +33,11 @@ load_dotenv()
|
|
|
33
33
|
# Custom theme for the CLI - using colors that work on both light and dark backgrounds
|
|
34
34
|
custom_theme = Theme(
|
|
35
35
|
{
|
|
36
|
-
"info": "
|
|
37
|
-
"warning": "
|
|
38
|
-
"error": "
|
|
39
|
-
"success": "
|
|
40
|
-
"prompt": "
|
|
36
|
+
"info": "#4A90E2", # Medium blue - matches system status colors
|
|
37
|
+
"warning": "#CC6600", # Orange-brown - works on both light and dark
|
|
38
|
+
"error": "#CC0000 bold", # Deep red - strong contrast
|
|
39
|
+
"success": "#00AA44 bold", # Deep green - visible on both
|
|
40
|
+
"prompt": "#6633CC bold", # Purple - good on both backgrounds
|
|
41
41
|
},
|
|
42
42
|
)
|
|
43
43
|
|
|
@@ -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.0a3
|
|
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
|