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.

Files changed (284) hide show
  1. {massgen-0.1.0a1 → massgen-0.1.0a2}/PKG-INFO +16 -12
  2. {massgen-0.1.0a1 → massgen-0.1.0a2}/README.md +15 -11
  3. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/__init__.py +1 -1
  4. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/cli.py +28 -4
  5. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/config_builder.py +238 -7
  6. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen.egg-info/PKG-INFO +16 -12
  7. {massgen-0.1.0a1 → massgen-0.1.0a2}/.env.example +0 -0
  8. {massgen-0.1.0a1 → massgen-0.1.0a2}/CHANGELOG.md +0 -0
  9. {massgen-0.1.0a1 → massgen-0.1.0a2}/CONTRIBUTING.md +0 -0
  10. {massgen-0.1.0a1 → massgen-0.1.0a2}/LICENSE +0 -0
  11. {massgen-0.1.0a1 → massgen-0.1.0a2}/MANIFEST.in +0 -0
  12. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/__init__.py +0 -0
  13. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/ag2_adapter.py +0 -0
  14. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/base.py +0 -0
  15. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/tests/__init__.py +0 -0
  16. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/tests/test_ag2_adapter.py +0 -0
  17. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/tests/test_agent_adapter.py +0 -0
  18. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/utils/__init__.py +0 -0
  19. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/utils/ag2_utils.py +0 -0
  20. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/utils/tests/__init__.py +0 -0
  21. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/adapters/utils/tests/test_ag2_utils.py +0 -0
  22. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/agent_config.py +0 -0
  23. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/api_params_handler/__init__.py +0 -0
  24. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/api_params_handler/_api_params_handler_base.py +0 -0
  25. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/api_params_handler/_chat_completions_api_params_handler.py +0 -0
  26. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/api_params_handler/_claude_api_params_handler.py +0 -0
  27. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/api_params_handler/_response_api_params_handler.py +0 -0
  28. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/__init__.py +0 -0
  29. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/azure_openai.py +0 -0
  30. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/base.py +0 -0
  31. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/base_with_mcp.py +0 -0
  32. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/capabilities.py +0 -0
  33. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/chat_completions.py +0 -0
  34. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/claude.py +0 -0
  35. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/claude_code.py +0 -0
  36. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/cli_base.py +0 -0
  37. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/BACKEND_ARCHITECTURE.md +0 -0
  38. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/CLAUDE_API_RESEARCH.md +0 -0
  39. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/Function calling openai responses.md +0 -0
  40. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/GEMINI_API_DOCUMENTATION.md +0 -0
  41. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/Gemini MCP Integration Analysis.md +0 -0
  42. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/MCP_IMPLEMENTATION_CLAUDE_BACKEND.md +0 -0
  43. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/MCP_INTEGRATION_RESPONSE_BACKEND.md +0 -0
  44. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/OPENAI_GPT5_MODELS.md +0 -0
  45. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/OPENAI_RESPONSE_API_TOOL_CALLS.md +0 -0
  46. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/OPENAI_response_streaming.md +0 -0
  47. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/inference_backend.md +0 -0
  48. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/docs/permissions_and_context_files.md +0 -0
  49. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/external.py +0 -0
  50. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/gemini.py +0 -0
  51. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/grok.py +0 -0
  52. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/inference.py +0 -0
  53. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/lmstudio.py +0 -0
  54. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/backend/response.py +0 -0
  55. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/chat_agent.py +0 -0
  56. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/BACKEND_CONFIGURATION.md +0 -0
  57. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/README.md +0 -0
  58. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/ag2/ag2_case_study.yaml +0 -0
  59. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/ag2/ag2_coder.yaml +0 -0
  60. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/ag2/ag2_coder_case_study.yaml +0 -0
  61. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/ag2/ag2_gemini.yaml +0 -0
  62. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/ag2/ag2_groupchat.yaml +0 -0
  63. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/ag2/ag2_groupchat_gpt.yaml +0 -0
  64. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/ag2/ag2_single_agent.yaml +0 -0
  65. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/fast_timeout_example.yaml +0 -0
  66. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/gemini_4o_claude.yaml +0 -0
  67. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/gemini_gpt5nano_claude.yaml +0 -0
  68. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/geminicode_4o_claude.yaml +0 -0
  69. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/geminicode_gpt5nano_claude.yaml +0 -0
  70. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/glm_gemini_claude.yaml +0 -0
  71. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/gpt4o_audio_generation.yaml +0 -0
  72. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/gpt4o_image_generation.yaml +0 -0
  73. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/gpt5nano_glm_qwen.yaml +0 -0
  74. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/gpt5nano_image_understanding.yaml +0 -0
  75. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/three_agents_default.yaml +0 -0
  76. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/three_agents_opensource.yaml +0 -0
  77. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/three_agents_vllm.yaml +0 -0
  78. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/two_agents_gemini.yaml +0 -0
  79. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/two_agents_gpt5.yaml +0 -0
  80. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/two_agents_opensource_lmstudio.yaml +0 -0
  81. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/multi/two_qwen_vllm_sglang.yaml +0 -0
  82. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_agent.yaml +0 -0
  83. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_flash2.5.yaml +0 -0
  84. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gemini2.5pro.yaml +0 -0
  85. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gpt4o_audio_generation.yaml +0 -0
  86. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gpt4o_image_generation.yaml +0 -0
  87. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gpt4o_video_generation.yaml +0 -0
  88. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gpt5nano.yaml +0 -0
  89. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gpt5nano_file_search.yaml +0 -0
  90. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gpt5nano_image_understanding.yaml +0 -0
  91. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_gptoss120b.yaml +0 -0
  92. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_openrouter_audio_understanding.yaml +0 -0
  93. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/basic/single/single_qwen_video_understanding.yaml +0 -0
  94. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/debug/code_execution/command_filtering_blacklist.yaml +0 -0
  95. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/debug/code_execution/command_filtering_whitelist.yaml +0 -0
  96. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/debug/code_execution/docker_verification.yaml +0 -0
  97. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/debug/skip_coordination_test.yaml +0 -0
  98. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/debug/test_sdk_migration.yaml +0 -0
  99. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/docs/DISCORD_MCP_SETUP.md +0 -0
  100. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/docs/TWITTER_MCP_ENESCINAR_SETUP.md +0 -0
  101. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/azure/azure_openai_multi.yaml +0 -0
  102. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/azure/azure_openai_single.yaml +0 -0
  103. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/claude/claude.yaml +0 -0
  104. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/gemini/gemini_gpt5nano.yaml +0 -0
  105. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/local/lmstudio.yaml +0 -0
  106. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/openai/gpt5.yaml +0 -0
  107. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/openai/gpt5_nano.yaml +0 -0
  108. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/others/grok_single_agent.yaml +0 -0
  109. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/others/zai_coding_team.yaml +0 -0
  110. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/providers/others/zai_glm45.yaml +0 -0
  111. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/teams/creative/creative_team.yaml +0 -0
  112. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/teams/creative/travel_planning.yaml +0 -0
  113. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/teams/research/news_analysis.yaml +0 -0
  114. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/teams/research/research_team.yaml +0 -0
  115. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/teams/research/technical_analysis.yaml +0 -0
  116. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/code-execution/basic_command_execution.yaml +0 -0
  117. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/code-execution/code_execution_use_case_simple.yaml +0 -0
  118. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/code-execution/docker_claude_code.yaml +0 -0
  119. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/code-execution/docker_multi_agent.yaml +0 -0
  120. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/code-execution/docker_simple.yaml +0 -0
  121. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/code-execution/docker_with_resource_limits.yaml +0 -0
  122. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/code-execution/multi_agent_playwright_automation.yaml +0 -0
  123. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/cc_gpt5_gemini_filesystem.yaml +0 -0
  124. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/claude_code_context_sharing.yaml +0 -0
  125. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/claude_code_flash2.5.yaml +0 -0
  126. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/claude_code_flash2.5_gptoss.yaml +0 -0
  127. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/claude_code_gpt5nano.yaml +0 -0
  128. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/claude_code_single.yaml +0 -0
  129. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/fs_permissions_test.yaml +0 -0
  130. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/gemini_gemini_workspace_cleanup.yaml +0 -0
  131. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/gemini_gpt5_filesystem_casestudy.yaml +0 -0
  132. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/gemini_gpt5nano_file_context_path.yaml +0 -0
  133. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/gemini_gpt5nano_protected_paths.yaml +0 -0
  134. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/gpt5mini_cc_fs_context_path.yaml +0 -0
  135. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/grok4_gpt5_gemini_filesystem.yaml +0 -0
  136. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/multiturn/grok4_gpt5_claude_code_filesystem_multiturn.yaml +0 -0
  137. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/multiturn/grok4_gpt5_gemini_filesystem_multiturn.yaml +0 -0
  138. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/multiturn/two_claude_code_filesystem_multiturn.yaml +0 -0
  139. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/filesystem/multiturn/two_gemini_flash_filesystem_multiturn.yaml +0 -0
  140. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/claude_code_discord_mcp_example.yaml +0 -0
  141. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/claude_code_simple_mcp.yaml +0 -0
  142. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/claude_code_twitter_mcp_example.yaml +0 -0
  143. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/claude_mcp_example.yaml +0 -0
  144. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/claude_mcp_test.yaml +0 -0
  145. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/five_agents_travel_mcp_test.yaml +0 -0
  146. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/five_agents_weather_mcp_test.yaml +0 -0
  147. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gemini_mcp_example.yaml +0 -0
  148. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gemini_mcp_filesystem_test.yaml +0 -0
  149. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gemini_mcp_filesystem_test_sharing.yaml +0 -0
  150. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gemini_mcp_filesystem_test_single_agent.yaml +0 -0
  151. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gemini_mcp_filesystem_test_with_claude_code.yaml +0 -0
  152. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gemini_mcp_test.yaml +0 -0
  153. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gemini_notion_mcp.yaml +0 -0
  154. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gpt5_nano_mcp_example.yaml +0 -0
  155. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gpt5_nano_mcp_test.yaml +0 -0
  156. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gpt5mini_claude_code_discord_mcp_example.yaml +0 -0
  157. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gpt_oss_mcp_example.yaml +0 -0
  158. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/gpt_oss_mcp_test.yaml +0 -0
  159. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/grok3_mini_mcp_example.yaml +0 -0
  160. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/grok3_mini_mcp_test.yaml +0 -0
  161. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/multimcp_gemini.yaml +0 -0
  162. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/qwen_api_mcp_example.yaml +0 -0
  163. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/qwen_api_mcp_test.yaml +0 -0
  164. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/qwen_local_mcp_example.yaml +0 -0
  165. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/mcp/qwen_local_mcp_test.yaml +0 -0
  166. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/planning/five_agents_discord_mcp_planning_mode.yaml +0 -0
  167. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/planning/five_agents_filesystem_mcp_planning_mode.yaml +0 -0
  168. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/planning/five_agents_notion_mcp_planning_mode.yaml +0 -0
  169. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/planning/five_agents_twitter_mcp_planning_mode.yaml +0 -0
  170. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/planning/gpt5_mini_case_study_mcp_planning_mode.yaml +0 -0
  171. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/web-search/claude_streamable_http_test.yaml +0 -0
  172. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/web-search/gemini_streamable_http_test.yaml +0 -0
  173. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/web-search/gpt5_mini_streamable_http_test.yaml +0 -0
  174. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/web-search/gpt_oss_streamable_http_test.yaml +0 -0
  175. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/web-search/grok3_mini_streamable_http_test.yaml +0 -0
  176. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/web-search/qwen_api_streamable_http_test.yaml +0 -0
  177. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/configs/tools/web-search/qwen_local_streamable_http_test.yaml +0 -0
  178. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/coordination_tracker.py +0 -0
  179. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/docker/README.md +0 -0
  180. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/__init__.py +0 -0
  181. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/_base.py +0 -0
  182. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/_code_execution_server.py +0 -0
  183. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/_docker_manager.py +0 -0
  184. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/_file_operation_tracker.py +0 -0
  185. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/_filesystem_manager.py +0 -0
  186. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/_path_permission_manager.py +0 -0
  187. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/filesystem_manager/_workspace_tools_server.py +0 -0
  188. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/formatter/__init__.py +0 -0
  189. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/formatter/_chat_completions_formatter.py +0 -0
  190. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/formatter/_claude_formatter.py +0 -0
  191. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/formatter/_formatter_base.py +0 -0
  192. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/formatter/_response_formatter.py +0 -0
  193. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/__init__.py +0 -0
  194. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/coordination_ui.py +0 -0
  195. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/displays/__init__.py +0 -0
  196. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/displays/base_display.py +0 -0
  197. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/displays/create_coordination_table.py +0 -0
  198. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/displays/rich_terminal_display.py +0 -0
  199. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/displays/simple_display.py +0 -0
  200. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/frontend/displays/terminal_display.py +0 -0
  201. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/logger_config.py +0 -0
  202. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/README.md +0 -0
  203. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/__init__.py +0 -0
  204. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/backend_utils.py +0 -0
  205. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/circuit_breaker.py +0 -0
  206. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/client.py +0 -0
  207. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/config_validator.py +0 -0
  208. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/docs/circuit_breaker.md +0 -0
  209. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/docs/client.md +0 -0
  210. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/docs/config_validator.md +0 -0
  211. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/docs/exceptions.md +0 -0
  212. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/docs/security.md +0 -0
  213. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/exceptions.py +0 -0
  214. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/hooks.py +0 -0
  215. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/mcp_tools/security.py +0 -0
  216. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/message_templates.py +0 -0
  217. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/orchestrator.py +0 -0
  218. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/stream_chunk/__init__.py +0 -0
  219. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/stream_chunk/base.py +0 -0
  220. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/stream_chunk/multimodal.py +0 -0
  221. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/stream_chunk/text.py +0 -0
  222. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/__init__.py +0 -0
  223. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/mcp_test_server.py +0 -0
  224. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/multi_turn_conversation_design.md +0 -0
  225. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/multiturn_llm_input_analysis.md +0 -0
  226. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_azure_openai_backend.py +0 -0
  227. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_backend_capabilities.py +0 -0
  228. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_backend_event_loop_all.py +0 -0
  229. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_case_studies.md +0 -0
  230. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_chat_completions_refactor.py +0 -0
  231. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_claude_backend.py +0 -0
  232. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_claude_code.py +0 -0
  233. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_claude_code_context_sharing.py +0 -0
  234. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_claude_code_orchestrator.py +0 -0
  235. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_cli_backends.py +0 -0
  236. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_code_execution.py +0 -0
  237. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_external_agent_backend.py +0 -0
  238. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_final_presentation_fallback.py +0 -0
  239. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_gemini_planning_mode.py +0 -0
  240. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_grok_backend.py +0 -0
  241. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_http_mcp_server.py +0 -0
  242. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_integration_simple.py +0 -0
  243. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_mcp_blocking.py +0 -0
  244. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_message_context_building.py +0 -0
  245. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_orchestrator_final_presentation.py +0 -0
  246. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_path_permission_manager.py +0 -0
  247. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_rich_terminal_display.py +0 -0
  248. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_timeout.py +0 -0
  249. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_v3_3agents.py +0 -0
  250. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_v3_simple.py +0 -0
  251. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_v3_three_agents.py +0 -0
  252. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/tests/test_v3_two_agents.py +0 -0
  253. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/token_manager/__init__.py +0 -0
  254. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/token_manager/token_manager.py +0 -0
  255. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/utils.py +0 -0
  256. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/README.md +0 -0
  257. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/__init__.py +0 -0
  258. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/agent.py +0 -0
  259. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/agents.py +0 -0
  260. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/backends/gemini.py +0 -0
  261. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/backends/grok.py +0 -0
  262. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/backends/oai.py +0 -0
  263. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/cli.py +0 -0
  264. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/config.py +0 -0
  265. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/examples/fast-4o-mini-config.yaml +0 -0
  266. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/examples/fast_config.yaml +0 -0
  267. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/examples/production.yaml +0 -0
  268. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/examples/single_agent.yaml +0 -0
  269. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/logging.py +0 -0
  270. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/main.py +0 -0
  271. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/orchestrator.py +0 -0
  272. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/streaming_display.py +0 -0
  273. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/tools.py +0 -0
  274. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/types.py +0 -0
  275. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen/v1/utils.py +0 -0
  276. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen.egg-info/SOURCES.txt +0 -0
  277. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen.egg-info/dependency_links.txt +0 -0
  278. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen.egg-info/entry_points.txt +0 -0
  279. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen.egg-info/not-zip-safe +0 -0
  280. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen.egg-info/requires.txt +0 -0
  281. {massgen-0.1.0a1 → massgen-0.1.0a2}/massgen.egg-info/top_level.txt +0 -0
  282. {massgen-0.1.0a1 → massgen-0.1.0a2}/pyproject.toml +0 -0
  283. {massgen-0.1.0a1 → massgen-0.1.0a2}/requirements.txt +0 -0
  284. {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.0a1
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
- **If you used the setup wizard (`massgen` command), your API keys are already configured!**
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 example configuration
402
- cp .env.example .env
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
- Or set environment variables directly:
406
- ```bash
407
- export OPENAI_API_KEY="your-key"
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
- **If you used the setup wizard (`massgen` command), your API keys are already configured!**
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 example configuration
319
- cp .env.example .env
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
- Or set environment variables directly:
323
- ```bash
324
- export OPENAI_API_KEY="your-key"
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)
@@ -68,7 +68,7 @@ from .chat_agent import (
68
68
  from .message_templates import MessageTemplates, get_templates
69
69
  from .orchestrator import Orchestrator, create_orchestrator
70
70
 
71
- __version__ = "0.1.0a1"
71
+ __version__ = "0.1.0a2"
72
72
  __author__ = "MassGen Contributors"
73
73
 
74
74
 
@@ -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
- raise ConfigurationError("OpenAI API key not found. Set OPENAI_API_KEY or provide " "in config.")
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
- raise ConfigurationError("Grok API key not found. Set XAI_API_KEY or provide in config.")
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
- raise ConfigurationError("Claude API key not found. Set ANTHROPIC_API_KEY or provide in config.")
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
- raise ConfigurationError("Gemini API key not found. Set GOOGLE_API_KEY or provide in config.")
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
- console.print("[error]❌ No API keys found in environment![/error]")
2043
- console.print("\n[yellow]Please set at least one API key in your .env file:[/yellow]")
2044
- for provider_id, provider_info in self.PROVIDERS.items():
2045
- if provider_info.get("env_var"):
2046
- console.print(f" - {provider_info['env_var']}")
2047
- console.print("\n[info]Tip: Copy .env.example to .env and add your keys[/info]")
2048
- return None
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.0a1
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
- **If you used the setup wizard (`massgen` command), your API keys are already configured!**
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 example configuration
402
- cp .env.example .env
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
- Or set environment variables directly:
406
- ```bash
407
- export OPENAI_API_KEY="your-key"
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