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.

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