mail-swarms 1.3.2__tar.gz → 1.3.3__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.
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/AGENTS.md +3 -1
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/CLAUDE.md +3 -1
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/PKG-INFO +3 -3
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/README.md +2 -2
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/THIRD_PARTY_NOTICES.md +3 -3
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/api.md +4 -3
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/cli.md +2 -1
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/configuration.md +4 -3
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/docker.md +1 -1
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/factories.md +5 -1
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/quickstart.md +2 -2
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/stdlib/README.md +1 -1
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/troubleshooting.md +1 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/llms.txt +21 -13
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/mail.toml +2 -1
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/pyproject.toml +1 -1
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/output/mail.toml +1 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/api.py +5 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/cli.py +14 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/config/server.py +7 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/core/runtime.py +38 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/factories/action.py +7 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/factories/base.py +54 -32
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/factories/supervisor.py +7 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/server.py +7 -1
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/conftest.py +1 -1
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/unit/test_mail_api.py +47 -13
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/unit/test_mail_swarms_json_utils.py +3 -3
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/unit/test_runtime.py +42 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/uv.lock +1 -1
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/.github/workflows/python-publish.yml +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/.gitignore +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/.python-version +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/CONTRIBUTING.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/DCO +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/Dockerfile +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/LICENSE +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/MAINTAINERS.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/NOTICE +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/SPEC-LICENSE +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/SPEC-PATENT-LICENSE +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/TRADEMARKS.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/assets/design.jpg +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/assets/interswarm.png +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/assets/mail.png +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/assets/ss.png +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/AGENTS_MAIL_PRIMER.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/CHECKLIST.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/CLAUDE_MAIL_PRIMER.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/README.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/agents-and-tools.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/architecture.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/client.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/database.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/examples.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/interswarm.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/manual-mail-game-guide.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/message-format.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/reasoning-trace-findings.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/registry.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/security.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/stdlib/fs.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/stdlib/http.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/stdlib/interswarm.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/stdlib/mcp.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/swarms-schema.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/docs/testing.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/pytest.ini +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/build_llms_txt.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/build_third_party_licenses.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/create_db_tables.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/demo_client.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/multi_swarm_demo.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/output/anthropic_non_streaming_20260106_232743.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/output/anthropic_streaming_20260106_232737.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/output/anthropic_streaming_20260106_233856.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/output/oai_non_streaming_20260106_232804.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/output/oai_streaming_20260106_232755.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/output/parallel_tool_calls_20260106_232812.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/output/swarm_communication_20260106_232415.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/output/ui_dev_swarm.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/run_mafia.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/run_ui_dev.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/single_swarm_demo.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/smoke_test_anthropic_thinking.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/smoke_test_multiturn.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/smoke_test_oai_interleaved.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/smoke_test_reasoning.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/smoke_test_swarm.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/smoke_test_websearch.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/swarm_export.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/swarm_indexer.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/scripts/test_reasoning_traces.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/MAIL-core.schema.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/MAIL-interswarm.schema.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/SPEC.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/examples/README.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/examples/interswarm_request.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/examples/interswarm_response.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/examples/mail_message_broadcast.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/examples/mail_message_broadcast_complete.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/examples/mail_message_interrupt.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/examples/mail_message_request.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/examples/mail_message_response.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/openapi.yaml +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/validate_samples.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/why/01.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/spec/why/README.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/client.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/config/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/config/client.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/core/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/core/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/core/agents.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/core/message.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/core/tasks.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/core/tools.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/db/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/db/init.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/db/types.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/db/utils.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/analyst_dummy/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/analyst_dummy/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/analyst_dummy/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/consultant_dummy/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/consultant_dummy/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/consultant_dummy/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/analyst/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/analyst/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/analyst/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/processor/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/processor/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/processor/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/processor/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/reporter/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/reporter/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/reporter/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/reporter/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/statistics/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/statistics/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/statistics/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/data_analysis/statistics/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/mafia/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/mafia/game.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/mafia/narrator_tools.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/mafia/personas.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/mafia/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/mafia/roles.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/mafia/spec.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/math_dummy/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/math_dummy/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/math_dummy/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/math_dummy/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/math_dummy/types.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/researcher/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/researcher/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/researcher/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/searcher/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/searcher/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/searcher/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/searcher/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/summarizer/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/summarizer/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/summarizer/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/summarizer/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/verifier/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/verifier/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/verifier/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/research/verifier/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/supervisor/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/supervisor/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/supervisor/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/classifier/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/classifier/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/classifier/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/classifier/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/coordinator/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/coordinator/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/coordinator/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/faq/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/faq/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/faq/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/faq/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/sentiment/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/sentiment/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/sentiment/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/support/sentiment/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/weather_dummy/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/weather_dummy/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/weather_dummy/agent.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/weather_dummy/prompts.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/examples/weather_dummy/types.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/factories/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/net/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/net/registry.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/net/router.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/net/server_utils.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/net/types.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/stdlib/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/stdlib/anthropic/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/stdlib/fs/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/stdlib/fs/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/stdlib/http/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/stdlib/http/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/stdlib/interswarm/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/stdlib/interswarm/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/stdlib/mcp/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/stdlib/mcp/actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/stdlib/openai/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/stdlib/openai/agents.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/summarizer.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/swarms_json/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/swarms_json/types.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/swarms_json/utils.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/url_scheme.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/utils/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/utils/auth.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/utils/context.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/utils/logger.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/utils/openai.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/utils/parsing.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/utils/serialize.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/utils/store.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/utils/string_builder.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/src/mail/utils/version.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/swarms.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/__init__.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/mock/test_interswarm_router.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/mock/test_mail_submit_and_wait.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/mock/test_message_addressing.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/mock/test_tools_conversion.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/network/test_interswarm_endpoints.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/network/test_server_auth_and_status.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/network/test_server_endpoints.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/stdlib/test_fs_actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/stdlib/test_http_actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/stdlib/test_interswarm_actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/stdlib/test_mcp_actions.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/stdlib/test_openai_agents.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/unit/test_executor.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/unit/test_interswarm_router_utils.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/unit/test_mail_client.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/unit/test_mail_client_cli.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/unit/test_message_xml.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/unit/test_server_interswarm.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/unit/test_swarm_registry_unit.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/unit/test_tasks.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/unit/test_tools_specs.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/tests/unit/test_utils_parsing.py +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/.gitignore +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/CLAUDE.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/README.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/app/chat/ChatContent.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/app/chat/ChatErrorCard.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/app/chat/ChatToolCall.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/app/chat/page.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/app/favicon.ico +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/app/globals.css +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/app/layout.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/app/page.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/artifact.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/canvas.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/chain-of-thought.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/checkpoint.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/code-block.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/confirmation.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/connection.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/context.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/controls.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/conversation.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/edge.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/image.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/inline-citation.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/loader.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/message.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/model-selector.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/node.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/open-in-chat.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/panel.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/plan.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/prompt-input.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/queue.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/reasoning.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/shimmer.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/sources.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/suggestion.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/task.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/tool.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/toolbar.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ai-elements/web-preview.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/chat/ChatSidebar.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/chat/ChatTabContent.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/chat/CollapsibleChatSidebar.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/chat/TaskHistoryContent.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/effects/BreachSequence.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/effects/MatrixRain.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/effects/ScreenFlicker.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/graph/AgentGraph.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/graph/AgentNode.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/panels/AgentDetailPanel.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/panels/EventsPanel.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/EvalModeHeader.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/alert.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/badge.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/button-group.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/button.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/card.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/carousel.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/collapsible.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/command.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/dialog.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/dropdown-menu.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/hover-card.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/input-group.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/input.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/progress.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/scroll-area.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/select.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/separator.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/skeleton.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/textarea.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components/ui/tooltip.tsx +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/components.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/docs/chat-first-ui.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/docs/chatbot-example.md +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/eslint.config.mjs +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/hooks/useChatTimeline.ts +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/hooks/useKonamiCode.ts +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/hooks/useSSE.ts +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/hooks/useTaskHistory.ts +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/lib/api.ts +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/lib/sseControl.ts +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/lib/store.ts +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/lib/utils.ts +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/next.config.ts +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/package-lock.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/package.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/pnpm-lock.yaml +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/pnpm-workspace.yaml +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/postcss.config.mjs +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/public/file.svg +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/public/globe.svg +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/public/next.svg +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/public/vercel.svg +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/public/window.svg +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/tsconfig.json +0 -0
- {mail_swarms-1.3.2 → mail_swarms-1.3.3}/ui/types/mail.ts +0 -0
|
@@ -182,6 +182,7 @@ registry_file = "registries/example-no-proxy.json"
|
|
|
182
182
|
|
|
183
183
|
[server.settings]
|
|
184
184
|
task_message_limit = 15
|
|
185
|
+
print_llm_streams = true
|
|
185
186
|
```
|
|
186
187
|
|
|
187
188
|
Environment variables:
|
|
@@ -196,7 +197,7 @@ Environment variables:
|
|
|
196
197
|
[
|
|
197
198
|
{
|
|
198
199
|
"name": "example",
|
|
199
|
-
"version": "1.3.
|
|
200
|
+
"version": "1.3.3",
|
|
200
201
|
"entrypoint": "supervisor",
|
|
201
202
|
"enable_interswarm": true,
|
|
202
203
|
"enable_db_agent_histories": true,
|
|
@@ -258,6 +259,7 @@ Common `agent_params`:
|
|
|
258
259
|
- `reasoning_effort` - "minimal", "low", "medium", "high"
|
|
259
260
|
- `thinking_budget` - Token budget for extended thinking
|
|
260
261
|
- `stream_tokens` - Stream output to terminal
|
|
262
|
+
- `print_llm_streams` - Print streamed reasoning/response chunks when streaming; runtime-level `print_llm_streams` can override this globally
|
|
261
263
|
|
|
262
264
|
Note: `tool_format` is top-level, not inside `agent_params`.
|
|
263
265
|
|
|
@@ -185,6 +185,7 @@ registry_file = "registries/example-no-proxy.json"
|
|
|
185
185
|
|
|
186
186
|
[server.settings]
|
|
187
187
|
task_message_limit = 15
|
|
188
|
+
print_llm_streams = true
|
|
188
189
|
```
|
|
189
190
|
|
|
190
191
|
**Environment variables:**
|
|
@@ -199,7 +200,7 @@ The file contains a **JSON array** of swarm definitions. Required fields: `name`
|
|
|
199
200
|
[
|
|
200
201
|
{
|
|
201
202
|
"name": "example",
|
|
202
|
-
"version": "1.3.
|
|
203
|
+
"version": "1.3.3",
|
|
203
204
|
"entrypoint": "supervisor",
|
|
204
205
|
"enable_interswarm": true,
|
|
205
206
|
"enable_db_agent_histories": true,
|
|
@@ -266,6 +267,7 @@ The file contains a **JSON array** of swarm definitions. Required fields: `name`
|
|
|
266
267
|
- `reasoning_effort` - "minimal", "low", "medium", "high"
|
|
267
268
|
- `thinking_budget` - Token budget for extended thinking
|
|
268
269
|
- `stream_tokens` - Stream output to terminal
|
|
270
|
+
- `print_llm_streams` - Print streamed reasoning/response chunks when streaming; runtime-level `print_llm_streams` can override this globally
|
|
269
271
|
|
|
270
272
|
Note: `tool_format` should be a top-level agent field. If placed in agent_params, a deprecation warning is logged.
|
|
271
273
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mail-swarms
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.3
|
|
4
4
|
Summary: Multi-Agent Interface Layer reference implementation
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
License-File: LICENSE
|
|
@@ -121,7 +121,7 @@ The runtime processes MAIL messages **asynchronously**, tracks per-task state, a
|
|
|
121
121
|
### Installation
|
|
122
122
|
```bash
|
|
123
123
|
# Clone and enter the repository
|
|
124
|
-
git clone https://github.com/charonlabs/mail --branch v1.3.
|
|
124
|
+
git clone https://github.com/charonlabs/mail --branch v1.3.3
|
|
125
125
|
cd mail
|
|
126
126
|
|
|
127
127
|
# Install dependencies (preferred)
|
|
@@ -150,7 +150,7 @@ export ANTHROPIC_API_KEY=sk-your-anthropic-key
|
|
|
150
150
|
export DATABASE_URL=postgresql://...
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
-
Defaults for host, port, swarm metadata, and client behaviour are loaded from [`mail.toml`](mail.toml). The `[server.settings]` table exposes `task_message_limit`, which bounds how many messages the runtime will process per task when `run_continuous` is active (default `15`). Override the file or point `MAIL_CONFIG_PATH` at an alternate TOML to adjust these values per environment. Use
|
|
153
|
+
Defaults for host, port, swarm metadata, and client behaviour are loaded from [`mail.toml`](mail.toml). The `[server.settings]` table exposes `task_message_limit`, which bounds how many messages the runtime will process per task when `run_continuous` is active (default `15`), and `print_llm_streams` (default `true`), which controls whether runtime-managed agents print LLM reasoning/response stream chunks to server stdout. Set `print_llm_streams=false` (or pass `mail server --print-llm-streams false`) for quieter server logs; task/event SSE streaming is unaffected. Override the file or point `MAIL_CONFIG_PATH` at an alternate TOML to adjust these values per environment. Use CLI flags such as `--swarm-name`, `--swarm-source`, `--swarm-registry`, and `--print-llm-streams true|false` (or edit `mail.toml`) to override these at launch; `mail server` exports `SWARM_NAME`, `SWARM_SOURCE`, `SWARM_REGISTRY_FILE`, and `BASE_URL` for downstream tools but does not read them as config overrides.
|
|
154
154
|
|
|
155
155
|
MAIL will create the parent directory for `SWARM_REGISTRY_FILE` on startup if it is missing, so you can rely on the default `registries/` path without committing the folder.
|
|
156
156
|
|
|
@@ -88,7 +88,7 @@ The runtime processes MAIL messages **asynchronously**, tracks per-task state, a
|
|
|
88
88
|
### Installation
|
|
89
89
|
```bash
|
|
90
90
|
# Clone and enter the repository
|
|
91
|
-
git clone https://github.com/charonlabs/mail --branch v1.3.
|
|
91
|
+
git clone https://github.com/charonlabs/mail --branch v1.3.3
|
|
92
92
|
cd mail
|
|
93
93
|
|
|
94
94
|
# Install dependencies (preferred)
|
|
@@ -117,7 +117,7 @@ export ANTHROPIC_API_KEY=sk-your-anthropic-key
|
|
|
117
117
|
export DATABASE_URL=postgresql://...
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
-
Defaults for host, port, swarm metadata, and client behaviour are loaded from [`mail.toml`](mail.toml). The `[server.settings]` table exposes `task_message_limit`, which bounds how many messages the runtime will process per task when `run_continuous` is active (default `15`). Override the file or point `MAIL_CONFIG_PATH` at an alternate TOML to adjust these values per environment. Use
|
|
120
|
+
Defaults for host, port, swarm metadata, and client behaviour are loaded from [`mail.toml`](mail.toml). The `[server.settings]` table exposes `task_message_limit`, which bounds how many messages the runtime will process per task when `run_continuous` is active (default `15`), and `print_llm_streams` (default `true`), which controls whether runtime-managed agents print LLM reasoning/response stream chunks to server stdout. Set `print_llm_streams=false` (or pass `mail server --print-llm-streams false`) for quieter server logs; task/event SSE streaming is unaffected. Override the file or point `MAIL_CONFIG_PATH` at an alternate TOML to adjust these values per environment. Use CLI flags such as `--swarm-name`, `--swarm-source`, `--swarm-registry`, and `--print-llm-streams true|false` (or edit `mail.toml`) to override these at launch; `mail server` exports `SWARM_NAME`, `SWARM_SOURCE`, `SWARM_REGISTRY_FILE`, and `BASE_URL` for downstream tools but does not read them as config overrides.
|
|
121
121
|
|
|
122
122
|
MAIL will create the parent directory for `SWARM_REGISTRY_FILE` on startup if it is missing, so you can rely on the default `registries/` path without committing the folder.
|
|
123
123
|
|
|
@@ -5124,14 +5124,14 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
5124
5124
|
SOFTWARE.
|
|
5125
5125
|
```
|
|
5126
5126
|
|
|
5127
|
-
## `mail-swarms==1.3.
|
|
5127
|
+
## `mail-swarms==1.3.3`
|
|
5128
5128
|
Multi-Agent Interface Layer reference implementation
|
|
5129
5129
|
### License field:
|
|
5130
5130
|
Apache-2.0
|
|
5131
5131
|
### Classifiers:
|
|
5132
5132
|
License :: OSI Approved :: Apache Software License
|
|
5133
5133
|
|
|
5134
|
-
### License Text (`mail_swarms-1.3.
|
|
5134
|
+
### License Text (`mail_swarms-1.3.3.dist-info/licenses/LICENSE`)
|
|
5135
5135
|
|
|
5136
5136
|
```text
|
|
5137
5137
|
Apache License
|
|
@@ -5337,7 +5337,7 @@ See the License for the specific language governing permissions and
|
|
|
5337
5337
|
limitations under the License.
|
|
5338
5338
|
```
|
|
5339
5339
|
|
|
5340
|
-
### License Text (`mail_swarms-1.3.
|
|
5340
|
+
### License Text (`mail_swarms-1.3.3.dist-info/licenses/NOTICE`)
|
|
5341
5341
|
|
|
5342
5342
|
```text
|
|
5343
5343
|
MAIL Project
|
|
@@ -162,7 +162,7 @@ The Python surface is designed for embedding MAIL inside other applications, bui
|
|
|
162
162
|
|
|
163
163
|
#### `MAILSwarm` (`mail.api`)
|
|
164
164
|
- **Summary**: Runtime container that owns instantiated agents/actions and embeds a `MAILRuntime`.
|
|
165
|
-
- **Constructor parameters**: `name: str`, `version: str`, `agents: list[MAILAgent]`, `actions: list[MAILAction]`, `entrypoint: str`, `user_id: str = "default"`, `user_role: Literal["admin","agent","user"] = "user"`, `swarm_registry: SwarmRegistry | None = None`, `enable_interswarm: bool = False`, `breakpoint_tools: list[str] = []`, `exclude_tools: list[str] = []`, `task_message_limit: int | None = None`, `description: str = ""`, `keywords: list[str] = []`, `enable_db_agent_histories: bool = False`.
|
|
165
|
+
- **Constructor parameters**: `name: str`, `version: str`, `agents: list[MAILAgent]`, `actions: list[MAILAction]`, `entrypoint: str`, `user_id: str = "default"`, `user_role: Literal["admin","agent","user"] = "user"`, `swarm_registry: SwarmRegistry | None = None`, `enable_interswarm: bool = False`, `breakpoint_tools: list[str] = []`, `exclude_tools: list[str] = []`, `task_message_limit: int | None = None`, `description: str = ""`, `keywords: list[str] = []`, `enable_db_agent_histories: bool = False`, `print_llm_streams: bool = True`.
|
|
166
166
|
- **Key methods**:
|
|
167
167
|
- `post_message(...)`, `post_message_stream(...)`, `post_message_and_run(...)`: enqueue user requests (optionally streaming or running to completion).
|
|
168
168
|
- `submit_message(...)`, `submit_message_stream(...)`: submit fully-formed `MAILMessage` envelopes.
|
|
@@ -180,7 +180,7 @@ The Python surface is designed for embedding MAIL inside other applications, bui
|
|
|
180
180
|
- **Notes**: Inline definitions from `actions` may be combined with `action_imports` that resolve to decorated `MAILAction` objects (e.g., from `mail.stdlib`).
|
|
181
181
|
- **Constructor parameters**: `name: str`, `version: str`, `agents: list[MAILAgentTemplate]`, `actions: list[MAILAction]`, `entrypoint: str`, `enable_interswarm: bool = False`, `breakpoint_tools: list[str] = []`, `exclude_tools: list[str] = []`, `task_message_limit: int | None = None`, `description: str = ""`, `keywords: list[str] = []`, `public: bool = False`, `enable_db_agent_histories: bool = False`.
|
|
182
182
|
- **Key methods**:
|
|
183
|
-
- `instantiate(instance_params, user_id?, user_role?, base_url?, registry_file?) -> MAILSwarm`: produce a runtime swarm (creates `SwarmRegistry` when interswarm is enabled).
|
|
183
|
+
- `instantiate(instance_params, user_id?, user_role?, base_url?, registry_file?, print_llm_streams?) -> MAILSwarm`: produce a runtime swarm (creates `SwarmRegistry` when interswarm is enabled).
|
|
184
184
|
- `get_subswarm(names, name_suffix, entrypoint?) -> MAILSwarmTemplate`: filter agents into a smaller template while preserving supervisors and entrypoints.
|
|
185
185
|
- `update_from_adjacency_matrix(adj: list[list[int]]) -> None`: sync template wiring back to `comm_targets` for each agent.
|
|
186
186
|
- `from_swarm_json(json_str) -> MAILSwarmTemplate` / `from_swarm_json_file(swarm_name, json_filepath?) -> MAILSwarmTemplate`: rebuild from persisted JSON.
|
|
@@ -195,8 +195,9 @@ The Python surface is designed for embedding MAIL inside other applications, bui
|
|
|
195
195
|
|
|
196
196
|
#### `MAILRuntime` (`mail.core.runtime`)
|
|
197
197
|
- **Summary**: Asynchronous runtime that owns the internal message queue, tool execution, and optional interswarm router.
|
|
198
|
-
- **Constructor parameters**: `agents: dict[str, AgentCore]`, `actions: dict[str, ActionCore]`, `user_id: str`, `user_role: Literal["admin","agent","user"]`, `swarm_name: str = "example"`, `entrypoint: str = "supervisor"`, `swarm_registry: SwarmRegistry | None = None`, `enable_interswarm: bool = False`, `breakpoint_tools: list[str] | None = None`, `exclude_tools: list[str] | None = None`, `enable_db_agent_histories: bool = False`.
|
|
198
|
+
- **Constructor parameters**: `agents: dict[str, AgentCore]`, `actions: dict[str, ActionCore]`, `user_id: str`, `user_role: Literal["admin","agent","user"]`, `swarm_name: str = "example"`, `entrypoint: str = "supervisor"`, `swarm_registry: SwarmRegistry | None = None`, `enable_interswarm: bool = False`, `breakpoint_tools: list[str] | None = None`, `exclude_tools: list[str] | None = None`, `enable_db_agent_histories: bool = False`, `print_llm_streams: bool = True`.
|
|
199
199
|
- Pass the lower-level `AgentCore` / `ActionCore` objects (for example via `MAILAgent.to_core()` and `MAILAction.to_core()`) when instantiating the runtime directly.
|
|
200
|
+
- `print_llm_streams` is applied recursively to known agent-function wrappers (`supervisor_fn`, `action_agent_fn`, `_mail_agent`) so a runtime can centrally suppress local LLM stream printing without changing each agent definition.
|
|
200
201
|
- **Key methods**:
|
|
201
202
|
- `start_interswarm()`, `stop_interswarm()`, `is_interswarm_running()`.
|
|
202
203
|
- `handle_interswarm_response(response_message)` and internal `_handle_local_message(message)`.
|
|
@@ -17,10 +17,11 @@ The top-level parser accepts the same flags regardless of how you invoke it, for
|
|
|
17
17
|
|
|
18
18
|
### `mail server`
|
|
19
19
|
- Configuration defaults are read from `mail.toml` (see
|
|
20
|
-
[configuration.md](./configuration.md)). Flags such as `--host`, `--port`, `--reload`, `--swarm-name`, `--swarm-source`, and `--
|
|
20
|
+
[configuration.md](./configuration.md)). Flags such as `--host`, `--port`, `--reload`, `--swarm-name`, `--swarm-source`, `--swarm-registry`, and `--print-llm-streams true|false` only override the values you provide.
|
|
21
21
|
- Use `--config /path/to/mail.toml` to point at a different configuration file for a single run. The environment variable `MAIL_CONFIG_PATH` acts as the persistent override if you prefer exporting it once.
|
|
22
22
|
- Environment variables such as `AUTH_ENDPOINT` and `TOKEN_INFO_ENDPOINT` remain required; `LITELLM_PROXY_API_BASE` is required only if your swarm uses `use_proxy=true`. The CLI does not provide defaults for these. When launched via `mail server`, defaults from `mail.toml` are exported to `SWARM_NAME`, `SWARM_SOURCE`, `SWARM_REGISTRY_FILE`, and `BASE_URL` for you.
|
|
23
23
|
- Pass `--debug` (or set `[server].debug = true`) when you need the debug-only surface, including the OpenAI-compatible `/responses` endpoint. Leave it off for production deployments.
|
|
24
|
+
- Use `--print-llm-streams true|false` to control whether runtime-managed agents print LLM reasoning/response stream chunks to server stdout. This does not affect SSE event streaming returned by `message-stream`/`POST /message`.
|
|
24
25
|
- Example:
|
|
25
26
|
|
|
26
27
|
```bash
|
|
@@ -20,6 +20,7 @@ registry = "registries/example-no-proxy.json"
|
|
|
20
20
|
|
|
21
21
|
[server.settings]
|
|
22
22
|
task_message_limit = 15
|
|
23
|
+
print_llm_streams = true
|
|
23
24
|
|
|
24
25
|
[client]
|
|
25
26
|
timeout = 3600.0
|
|
@@ -28,10 +29,10 @@ verbose = false
|
|
|
28
29
|
|
|
29
30
|
- The `[server]` table controls how Uvicorn listens (`port`, `host`, `reload`) and whether debug-only integrations are exposed (`debug`).
|
|
30
31
|
- The `[server.swarm]` table specifies the persistent swarm template (`source`), the registry persistence file (`registry` or `registry_file`), and the runtime swarm name (`name`).
|
|
31
|
-
- The `[server.settings]` table
|
|
32
|
+
- The `[server.settings]` table exposes `task_message_limit`, which caps how many MAIL messages a task will process in continuous mode before yielding control, and `print_llm_streams`, which controls whether runtime-managed agents print LLM reasoning/response stream output to the server console. Set `print_llm_streams = false` for quieter logs (SSE event streaming is unchanged).
|
|
32
33
|
- The `[client]` table exposes `timeout` (seconds) and `verbose` (bool). They feed `ClientConfig`, which in turn sets the default timeout and whether the CLI/HTTP client emit debug logs.
|
|
33
34
|
- Instantiating `ServerConfig()` or `ClientConfig()` with no arguments uses these values as defaults; if a key is missing or the file is absent, the literal defaults above are applied.
|
|
34
|
-
- The CLI command `mail server` accepts `--port`, `--host`, `--reload`, `--debug`, `--swarm-name`, `--swarm-source`, and `--
|
|
35
|
+
- The CLI command `mail server` accepts `--port`, `--host`, `--reload`, `--debug`, `--swarm-name`, `--swarm-source`, `--swarm-registry`, and `--print-llm-streams true|false`. Provided flags override the file-driven defaults, while omitted flags continue to use `mail.toml` values.
|
|
35
36
|
- The CLI command `mail client` honors `timeout` from `[client]` and allows `--timeout` to override it per invocation.
|
|
36
37
|
- Set `MAIL_CONFIG_PATH` to point at an alternate `mail.toml` (for example per environment). `mail server --config /path/to/mail.toml` temporarily overrides this variable for the lifetime of the command.
|
|
37
38
|
- Toggle `[server].debug` (or pass `mail server --debug`) when you need the optional OpenAI-compatible `/responses` endpoint or other debug helpers exposed by the FastAPI app. Leave it `false` for production deployments to keep the surface minimal.
|
|
@@ -68,7 +69,7 @@ verbose = false
|
|
|
68
69
|
[
|
|
69
70
|
{
|
|
70
71
|
"name": "example",
|
|
71
|
-
"version": "1.3.
|
|
72
|
+
"version": "1.3.3",
|
|
72
73
|
"entrypoint": "supervisor",
|
|
73
74
|
"enable_interswarm": true,
|
|
74
75
|
"agents": [
|
|
@@ -51,7 +51,7 @@ docker build -t mail-server .
|
|
|
51
51
|
The build context must contain the repository so that the `COPY` commands pick up the source and configuration files.
|
|
52
52
|
|
|
53
53
|
## Run the container
|
|
54
|
-
The server requires the same environment variables as the native quickstart (`AUTH_ENDPOINT`, `TOKEN_INFO_ENDPOINT`, and `LITELLM_PROXY_API_BASE` only if your swarm uses `use_proxy=true`). Pass them via `--env` flags or an env file. To change swarm name/source/registry, mount a custom `mail.toml` and set `MAIL_CONFIG_PATH` or pass `mail server
|
|
54
|
+
The server requires the same environment variables as the native quickstart (`AUTH_ENDPOINT`, `TOKEN_INFO_ENDPOINT`, and `LITELLM_PROXY_API_BASE` only if your swarm uses `use_proxy=true`). Pass them via `--env` flags or an env file. To change swarm name/source/registry or runtime LLM stream-print behavior, mount a custom `mail.toml` and set `MAIL_CONFIG_PATH` or pass `mail server` flags such as `--swarm-name`, `--swarm-source`, `--swarm-registry`, and `--print-llm-streams true|false` in the container command.
|
|
55
55
|
|
|
56
56
|
```bash
|
|
57
57
|
# Option 1: export locally then forward with --env
|
|
@@ -35,6 +35,8 @@ analytics_agent = LiteLLMAgentFunction(
|
|
|
35
35
|
max_tokens=6000,
|
|
36
36
|
memory=True,
|
|
37
37
|
use_proxy=True,
|
|
38
|
+
stream_tokens=True,
|
|
39
|
+
print_llm_streams=True,
|
|
38
40
|
)
|
|
39
41
|
```
|
|
40
42
|
|
|
@@ -108,10 +110,12 @@ Factory call signatures follow a convention:
|
|
|
108
110
|
|
|
109
111
|
- **Top-level parameters** (`comm_targets`, `tools`, `name`, `enable_entrypoint`, etc.) describe the agent's static wiring and are typically supplied from `swarms.json` or other configuration.
|
|
110
112
|
- **Instance parameters** (`user_token`, instance-level overrides) are filled when the swarm or agent instance is created.
|
|
111
|
-
- **Internal parameters (`agent_params`)** (`llm`, `system`, `reasoning_effort`, `thinking_budget`) control the LLM call and are often set by package defaults or environment configuration.
|
|
113
|
+
- **Internal parameters (`agent_params`)** (`llm`, `system`, `reasoning_effort`, `thinking_budget`, `stream_tokens`, `print_llm_streams`) control the LLM call and are often set by package defaults or environment configuration.
|
|
112
114
|
|
|
113
115
|
`LiteLLMAgentFunction` closes over the supplied top-level settings and uses the instance parameters provided when the swarm is instantiated (for example, a per-user `user_token`).
|
|
114
116
|
|
|
117
|
+
When a `MAILRuntime` is created with `print_llm_streams=False`, it best-effort propagates that value down to these function wrappers so stream output is centrally suppressed even if individual agent params were set to `true`.
|
|
118
|
+
|
|
115
119
|
## Integrating with Swarms
|
|
116
120
|
|
|
117
121
|
Agent definitions in `swarms.json` reference factories via import strings, for example:
|
|
@@ -13,7 +13,7 @@ This guide gets you running a local MAIL swarm and interacting with it.
|
|
|
13
13
|
### Cloning the repo
|
|
14
14
|
```bash
|
|
15
15
|
git clone https://github.com/charonlabs/mail.git \
|
|
16
|
-
--branch v1.3.
|
|
16
|
+
--branch v1.3.3
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
### Installing dependencies
|
|
@@ -26,7 +26,7 @@ pip install -e .
|
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
## Environment & Config
|
|
29
|
-
- Start with `mail.toml` (checked into the repo) to control default host, port, swarm source, client timeout, and `[server.settings
|
|
29
|
+
- Start with `mail.toml` (checked into the repo) to control default host, port, swarm source, client timeout, and `[server.settings]` values (`task_message_limit`, `print_llm_streams`). Copy it if you need environment-specific values and point `MAIL_CONFIG_PATH` (or `--config`) at the new file.
|
|
30
30
|
- Minimum environment variables:
|
|
31
31
|
- `AUTH_ENDPOINT`, `TOKEN_INFO_ENDPOINT` for auth (see [configuration.md](/docs/configuration.md))
|
|
32
32
|
- `LITELLM_PROXY_API_BASE` for LLM access only when `use_proxy=true`
|
|
@@ -31,6 +31,7 @@ This list is not exhaustive, and probably never will be. If you run into any res
|
|
|
31
31
|
|
|
32
32
|
## Logs
|
|
33
33
|
- **Enable logging** to debug flow and events
|
|
34
|
+
- If model reasoning/token stream output is too noisy in server logs, set `[server.settings].print_llm_streams = false` (or launch with `mail server --print-llm-streams false`)
|
|
34
35
|
- See [src/mail/utils/logger.py](/src/mail/utils/logger.py) for initialization
|
|
35
36
|
|
|
36
37
|
## Where to ask
|
|
@@ -90,7 +90,7 @@ The runtime processes MAIL messages **asynchronously**, tracks per-task state, a
|
|
|
90
90
|
### Installation
|
|
91
91
|
```bash
|
|
92
92
|
# Clone and enter the repository
|
|
93
|
-
git clone https://github.com/charonlabs/mail --branch v1.3.
|
|
93
|
+
git clone https://github.com/charonlabs/mail --branch v1.3.3
|
|
94
94
|
cd mail
|
|
95
95
|
|
|
96
96
|
# Install dependencies (preferred)
|
|
@@ -119,7 +119,7 @@ export ANTHROPIC_API_KEY=sk-your-anthropic-key
|
|
|
119
119
|
export DATABASE_URL=postgresql://...
|
|
120
120
|
```
|
|
121
121
|
|
|
122
|
-
Defaults for host, port, swarm metadata, and client behaviour are loaded from [`mail.toml`](mail.toml). The `[server.settings]` table exposes `task_message_limit`, which bounds how many messages the runtime will process per task when `run_continuous` is active (default `15`). Override the file or point `MAIL_CONFIG_PATH` at an alternate TOML to adjust these values per environment. Use
|
|
122
|
+
Defaults for host, port, swarm metadata, and client behaviour are loaded from [`mail.toml`](mail.toml). The `[server.settings]` table exposes `task_message_limit`, which bounds how many messages the runtime will process per task when `run_continuous` is active (default `15`), and `print_llm_streams` (default `true`), which controls whether runtime-managed agents print LLM reasoning/response stream chunks to server stdout. Set `print_llm_streams=false` (or pass `mail server --print-llm-streams false`) for quieter server logs; task/event SSE streaming is unaffected. Override the file or point `MAIL_CONFIG_PATH` at an alternate TOML to adjust these values per environment. Use CLI flags such as `--swarm-name`, `--swarm-source`, `--swarm-registry`, and `--print-llm-streams true|false` (or edit `mail.toml`) to override these at launch; `mail server` exports `SWARM_NAME`, `SWARM_SOURCE`, `SWARM_REGISTRY_FILE`, and `BASE_URL` for downstream tools but does not read them as config overrides.
|
|
123
123
|
|
|
124
124
|
MAIL will create the parent directory for `SWARM_REGISTRY_FILE` on startup if it is missing, so you can rely on the default `registries/` path without committing the folder.
|
|
125
125
|
|
|
@@ -284,10 +284,11 @@ The top-level parser accepts the same flags regardless of how you invoke it, for
|
|
|
284
284
|
|
|
285
285
|
### `mail server`
|
|
286
286
|
- Configuration defaults are read from `mail.toml` (see
|
|
287
|
-
[configuration.md](./configuration.md)). Flags such as `--host`, `--port`, `--reload`, `--swarm-name`, `--swarm-source`, and `--
|
|
287
|
+
[configuration.md](./configuration.md)). Flags such as `--host`, `--port`, `--reload`, `--swarm-name`, `--swarm-source`, `--swarm-registry`, and `--print-llm-streams true|false` only override the values you provide.
|
|
288
288
|
- Use `--config /path/to/mail.toml` to point at a different configuration file for a single run. The environment variable `MAIL_CONFIG_PATH` acts as the persistent override if you prefer exporting it once.
|
|
289
289
|
- Environment variables such as `AUTH_ENDPOINT` and `TOKEN_INFO_ENDPOINT` remain required; `LITELLM_PROXY_API_BASE` is required only if your swarm uses `use_proxy=true`. The CLI does not provide defaults for these. When launched via `mail server`, defaults from `mail.toml` are exported to `SWARM_NAME`, `SWARM_SOURCE`, `SWARM_REGISTRY_FILE`, and `BASE_URL` for you.
|
|
290
290
|
- Pass `--debug` (or set `[server].debug = true`) when you need the debug-only surface, including the OpenAI-compatible `/responses` endpoint. Leave it off for production deployments.
|
|
291
|
+
- Use `--print-llm-streams true|false` to control whether runtime-managed agents print LLM reasoning/response stream chunks to server stdout. This does not affect SSE event streaming returned by `message-stream`/`POST /message`.
|
|
291
292
|
- Example:
|
|
292
293
|
|
|
293
294
|
```bash
|
|
@@ -499,6 +500,8 @@ analytics_agent = LiteLLMAgentFunction(
|
|
|
499
500
|
max_tokens=6000,
|
|
500
501
|
memory=True,
|
|
501
502
|
use_proxy=True,
|
|
503
|
+
stream_tokens=True,
|
|
504
|
+
print_llm_streams=True,
|
|
502
505
|
)
|
|
503
506
|
```
|
|
504
507
|
|
|
@@ -572,10 +575,12 @@ Factory call signatures follow a convention:
|
|
|
572
575
|
|
|
573
576
|
- **Top-level parameters** (`comm_targets`, `tools`, `name`, `enable_entrypoint`, etc.) describe the agent's static wiring and are typically supplied from `swarms.json` or other configuration.
|
|
574
577
|
- **Instance parameters** (`user_token`, instance-level overrides) are filled when the swarm or agent instance is created.
|
|
575
|
-
- **Internal parameters (`agent_params`)** (`llm`, `system`, `reasoning_effort`, `thinking_budget`) control the LLM call and are often set by package defaults or environment configuration.
|
|
578
|
+
- **Internal parameters (`agent_params`)** (`llm`, `system`, `reasoning_effort`, `thinking_budget`, `stream_tokens`, `print_llm_streams`) control the LLM call and are often set by package defaults or environment configuration.
|
|
576
579
|
|
|
577
580
|
`LiteLLMAgentFunction` closes over the supplied top-level settings and uses the instance parameters provided when the swarm is instantiated (for example, a per-user `user_token`).
|
|
578
581
|
|
|
582
|
+
When a `MAILRuntime` is created with `print_llm_streams=False`, it best-effort propagates that value down to these function wrappers so stream output is centrally suppressed even if individual agent params were set to `true`.
|
|
583
|
+
|
|
579
584
|
## Integrating with Swarms
|
|
580
585
|
|
|
581
586
|
Agent definitions in `swarms.json` reference factories via import strings, for example:
|
|
@@ -640,6 +645,7 @@ This list is not exhaustive, and probably never will be. If you run into any res
|
|
|
640
645
|
|
|
641
646
|
## Logs
|
|
642
647
|
- **Enable logging** to debug flow and events
|
|
648
|
+
- If model reasoning/token stream output is too noisy in server logs, set `[server.settings].print_llm_streams = false` (or launch with `mail server --print-llm-streams false`)
|
|
643
649
|
- See [src/mail/utils/logger.py](/src/mail/utils/logger.py) for initialization
|
|
644
650
|
|
|
645
651
|
## Where to ask
|
|
@@ -1034,7 +1040,7 @@ This guide gets you running a local MAIL swarm and interacting with it.
|
|
|
1034
1040
|
### Cloning the repo
|
|
1035
1041
|
```bash
|
|
1036
1042
|
git clone https://github.com/charonlabs/mail.git \
|
|
1037
|
-
--branch v1.3.
|
|
1043
|
+
--branch v1.3.3
|
|
1038
1044
|
```
|
|
1039
1045
|
|
|
1040
1046
|
### Installing dependencies
|
|
@@ -1047,7 +1053,7 @@ pip install -e .
|
|
|
1047
1053
|
```
|
|
1048
1054
|
|
|
1049
1055
|
## Environment & Config
|
|
1050
|
-
- Start with `mail.toml` (checked into the repo) to control default host, port, swarm source, client timeout, and `[server.settings
|
|
1056
|
+
- Start with `mail.toml` (checked into the repo) to control default host, port, swarm source, client timeout, and `[server.settings]` values (`task_message_limit`, `print_llm_streams`). Copy it if you need environment-specific values and point `MAIL_CONFIG_PATH` (or `--config`) at the new file.
|
|
1051
1057
|
- Minimum environment variables:
|
|
1052
1058
|
- `AUTH_ENDPOINT`, `TOKEN_INFO_ENDPOINT` for auth (see [configuration.md](/docs/configuration.md))
|
|
1053
1059
|
- `LITELLM_PROXY_API_BASE` for LLM access only when `use_proxy=true`
|
|
@@ -2518,7 +2524,7 @@ The Python surface is designed for embedding MAIL inside other applications, bui
|
|
|
2518
2524
|
|
|
2519
2525
|
#### `MAILSwarm` (`mail.api`)
|
|
2520
2526
|
- **Summary**: Runtime container that owns instantiated agents/actions and embeds a `MAILRuntime`.
|
|
2521
|
-
- **Constructor parameters**: `name: str`, `version: str`, `agents: list[MAILAgent]`, `actions: list[MAILAction]`, `entrypoint: str`, `user_id: str = "default"`, `user_role: Literal["admin","agent","user"] = "user"`, `swarm_registry: SwarmRegistry | None = None`, `enable_interswarm: bool = False`, `breakpoint_tools: list[str] = []`, `exclude_tools: list[str] = []`, `task_message_limit: int | None = None`, `description: str = ""`, `keywords: list[str] = []`, `enable_db_agent_histories: bool = False`.
|
|
2527
|
+
- **Constructor parameters**: `name: str`, `version: str`, `agents: list[MAILAgent]`, `actions: list[MAILAction]`, `entrypoint: str`, `user_id: str = "default"`, `user_role: Literal["admin","agent","user"] = "user"`, `swarm_registry: SwarmRegistry | None = None`, `enable_interswarm: bool = False`, `breakpoint_tools: list[str] = []`, `exclude_tools: list[str] = []`, `task_message_limit: int | None = None`, `description: str = ""`, `keywords: list[str] = []`, `enable_db_agent_histories: bool = False`, `print_llm_streams: bool = True`.
|
|
2522
2528
|
- **Key methods**:
|
|
2523
2529
|
- `post_message(...)`, `post_message_stream(...)`, `post_message_and_run(...)`: enqueue user requests (optionally streaming or running to completion).
|
|
2524
2530
|
- `submit_message(...)`, `submit_message_stream(...)`: submit fully-formed `MAILMessage` envelopes.
|
|
@@ -2536,7 +2542,7 @@ The Python surface is designed for embedding MAIL inside other applications, bui
|
|
|
2536
2542
|
- **Notes**: Inline definitions from `actions` may be combined with `action_imports` that resolve to decorated `MAILAction` objects (e.g., from `mail.stdlib`).
|
|
2537
2543
|
- **Constructor parameters**: `name: str`, `version: str`, `agents: list[MAILAgentTemplate]`, `actions: list[MAILAction]`, `entrypoint: str`, `enable_interswarm: bool = False`, `breakpoint_tools: list[str] = []`, `exclude_tools: list[str] = []`, `task_message_limit: int | None = None`, `description: str = ""`, `keywords: list[str] = []`, `public: bool = False`, `enable_db_agent_histories: bool = False`.
|
|
2538
2544
|
- **Key methods**:
|
|
2539
|
-
- `instantiate(instance_params, user_id?, user_role?, base_url?, registry_file?) -> MAILSwarm`: produce a runtime swarm (creates `SwarmRegistry` when interswarm is enabled).
|
|
2545
|
+
- `instantiate(instance_params, user_id?, user_role?, base_url?, registry_file?, print_llm_streams?) -> MAILSwarm`: produce a runtime swarm (creates `SwarmRegistry` when interswarm is enabled).
|
|
2540
2546
|
- `get_subswarm(names, name_suffix, entrypoint?) -> MAILSwarmTemplate`: filter agents into a smaller template while preserving supervisors and entrypoints.
|
|
2541
2547
|
- `update_from_adjacency_matrix(adj: list[list[int]]) -> None`: sync template wiring back to `comm_targets` for each agent.
|
|
2542
2548
|
- `from_swarm_json(json_str) -> MAILSwarmTemplate` / `from_swarm_json_file(swarm_name, json_filepath?) -> MAILSwarmTemplate`: rebuild from persisted JSON.
|
|
@@ -2551,8 +2557,9 @@ The Python surface is designed for embedding MAIL inside other applications, bui
|
|
|
2551
2557
|
|
|
2552
2558
|
#### `MAILRuntime` (`mail.core.runtime`)
|
|
2553
2559
|
- **Summary**: Asynchronous runtime that owns the internal message queue, tool execution, and optional interswarm router.
|
|
2554
|
-
- **Constructor parameters**: `agents: dict[str, AgentCore]`, `actions: dict[str, ActionCore]`, `user_id: str`, `user_role: Literal["admin","agent","user"]`, `swarm_name: str = "example"`, `entrypoint: str = "supervisor"`, `swarm_registry: SwarmRegistry | None = None`, `enable_interswarm: bool = False`, `breakpoint_tools: list[str] | None = None`, `exclude_tools: list[str] | None = None`, `enable_db_agent_histories: bool = False`.
|
|
2560
|
+
- **Constructor parameters**: `agents: dict[str, AgentCore]`, `actions: dict[str, ActionCore]`, `user_id: str`, `user_role: Literal["admin","agent","user"]`, `swarm_name: str = "example"`, `entrypoint: str = "supervisor"`, `swarm_registry: SwarmRegistry | None = None`, `enable_interswarm: bool = False`, `breakpoint_tools: list[str] | None = None`, `exclude_tools: list[str] | None = None`, `enable_db_agent_histories: bool = False`, `print_llm_streams: bool = True`.
|
|
2555
2561
|
- Pass the lower-level `AgentCore` / `ActionCore` objects (for example via `MAILAgent.to_core()` and `MAILAction.to_core()`) when instantiating the runtime directly.
|
|
2562
|
+
- `print_llm_streams` is applied recursively to known agent-function wrappers (`supervisor_fn`, `action_agent_fn`, `_mail_agent`) so a runtime can centrally suppress local LLM stream printing without changing each agent definition.
|
|
2556
2563
|
- **Key methods**:
|
|
2557
2564
|
- `start_interswarm()`, `stop_interswarm()`, `is_interswarm_running()`.
|
|
2558
2565
|
- `handle_interswarm_response(response_message)` and internal `_handle_local_message(message)`.
|
|
@@ -3419,7 +3426,7 @@ docker build -t mail-server .
|
|
|
3419
3426
|
The build context must contain the repository so that the `COPY` commands pick up the source and configuration files.
|
|
3420
3427
|
|
|
3421
3428
|
## Run the container
|
|
3422
|
-
The server requires the same environment variables as the native quickstart (`AUTH_ENDPOINT`, `TOKEN_INFO_ENDPOINT`, and `LITELLM_PROXY_API_BASE` only if your swarm uses `use_proxy=true`). Pass them via `--env` flags or an env file. To change swarm name/source/registry, mount a custom `mail.toml` and set `MAIL_CONFIG_PATH` or pass `mail server
|
|
3429
|
+
The server requires the same environment variables as the native quickstart (`AUTH_ENDPOINT`, `TOKEN_INFO_ENDPOINT`, and `LITELLM_PROXY_API_BASE` only if your swarm uses `use_proxy=true`). Pass them via `--env` flags or an env file. To change swarm name/source/registry or runtime LLM stream-print behavior, mount a custom `mail.toml` and set `MAIL_CONFIG_PATH` or pass `mail server` flags such as `--swarm-name`, `--swarm-source`, `--swarm-registry`, and `--print-llm-streams true|false` in the container command.
|
|
3423
3430
|
|
|
3424
3431
|
```bash
|
|
3425
3432
|
# Option 1: export locally then forward with --env
|
|
@@ -4721,6 +4728,7 @@ registry = "registries/example-no-proxy.json"
|
|
|
4721
4728
|
|
|
4722
4729
|
[server.settings]
|
|
4723
4730
|
task_message_limit = 15
|
|
4731
|
+
print_llm_streams = true
|
|
4724
4732
|
|
|
4725
4733
|
[client]
|
|
4726
4734
|
timeout = 3600.0
|
|
@@ -4729,10 +4737,10 @@ verbose = false
|
|
|
4729
4737
|
|
|
4730
4738
|
- The `[server]` table controls how Uvicorn listens (`port`, `host`, `reload`) and whether debug-only integrations are exposed (`debug`).
|
|
4731
4739
|
- The `[server.swarm]` table specifies the persistent swarm template (`source`), the registry persistence file (`registry` or `registry_file`), and the runtime swarm name (`name`).
|
|
4732
|
-
- The `[server.settings]` table
|
|
4740
|
+
- The `[server.settings]` table exposes `task_message_limit`, which caps how many MAIL messages a task will process in continuous mode before yielding control, and `print_llm_streams`, which controls whether runtime-managed agents print LLM reasoning/response stream output to the server console. Set `print_llm_streams = false` for quieter logs (SSE event streaming is unchanged).
|
|
4733
4741
|
- The `[client]` table exposes `timeout` (seconds) and `verbose` (bool). They feed `ClientConfig`, which in turn sets the default timeout and whether the CLI/HTTP client emit debug logs.
|
|
4734
4742
|
- Instantiating `ServerConfig()` or `ClientConfig()` with no arguments uses these values as defaults; if a key is missing or the file is absent, the literal defaults above are applied.
|
|
4735
|
-
- The CLI command `mail server` accepts `--port`, `--host`, `--reload`, `--debug`, `--swarm-name`, `--swarm-source`, and `--
|
|
4743
|
+
- The CLI command `mail server` accepts `--port`, `--host`, `--reload`, `--debug`, `--swarm-name`, `--swarm-source`, `--swarm-registry`, and `--print-llm-streams true|false`. Provided flags override the file-driven defaults, while omitted flags continue to use `mail.toml` values.
|
|
4736
4744
|
- The CLI command `mail client` honors `timeout` from `[client]` and allows `--timeout` to override it per invocation.
|
|
4737
4745
|
- Set `MAIL_CONFIG_PATH` to point at an alternate `mail.toml` (for example per environment). `mail server --config /path/to/mail.toml` temporarily overrides this variable for the lifetime of the command.
|
|
4738
4746
|
- Toggle `[server].debug` (or pass `mail server --debug`) when you need the optional OpenAI-compatible `/responses` endpoint or other debug helpers exposed by the FastAPI app. Leave it `false` for production deployments to keep the surface minimal.
|
|
@@ -4769,7 +4777,7 @@ verbose = false
|
|
|
4769
4777
|
[
|
|
4770
4778
|
{
|
|
4771
4779
|
"name": "example",
|
|
4772
|
-
"version": "1.3.
|
|
4780
|
+
"version": "1.3.3",
|
|
4773
4781
|
"entrypoint": "supervisor",
|
|
4774
4782
|
"enable_interswarm": true,
|
|
4775
4783
|
"agents": [
|
|
@@ -748,6 +748,7 @@ class MAILSwarm:
|
|
|
748
748
|
description: str = "",
|
|
749
749
|
keywords: list[str] = [],
|
|
750
750
|
enable_db_agent_histories: bool = False,
|
|
751
|
+
print_llm_streams: bool = True,
|
|
751
752
|
) -> None:
|
|
752
753
|
self.name = name
|
|
753
754
|
self.version = version
|
|
@@ -763,6 +764,7 @@ class MAILSwarm:
|
|
|
763
764
|
self.task_message_limit = task_message_limit
|
|
764
765
|
self.description = description
|
|
765
766
|
self.keywords = keywords
|
|
767
|
+
self.print_llm_streams = print_llm_streams
|
|
766
768
|
self.adjacency_matrix, self.agent_names = self._build_adjacency_matrix()
|
|
767
769
|
self.supervisors = [agent for agent in agents if agent.can_complete_tasks]
|
|
768
770
|
self._agent_cores = {agent.name: agent.to_core() for agent in agents}
|
|
@@ -778,6 +780,7 @@ class MAILSwarm:
|
|
|
778
780
|
breakpoint_tools=breakpoint_tools,
|
|
779
781
|
exclude_tools=exclude_tools,
|
|
780
782
|
enable_db_agent_histories=enable_db_agent_histories,
|
|
783
|
+
print_llm_streams=print_llm_streams,
|
|
781
784
|
)
|
|
782
785
|
self._validate()
|
|
783
786
|
|
|
@@ -1543,6 +1546,7 @@ class MAILSwarmTemplate:
|
|
|
1543
1546
|
user_role: Literal["admin", "agent", "user"] = "user",
|
|
1544
1547
|
base_url: str = "http://localhost:8000",
|
|
1545
1548
|
registry_file: str | None = None,
|
|
1549
|
+
print_llm_streams: bool = True,
|
|
1546
1550
|
) -> MAILSwarm:
|
|
1547
1551
|
"""
|
|
1548
1552
|
Instantiate a MAILSwarm from a MAILSwarmTemplate.
|
|
@@ -1638,6 +1642,7 @@ class MAILSwarmTemplate:
|
|
|
1638
1642
|
description=self.description,
|
|
1639
1643
|
keywords=self.keywords,
|
|
1640
1644
|
enable_db_agent_histories=self.enable_db_agent_histories,
|
|
1645
|
+
print_llm_streams=print_llm_streams,
|
|
1641
1646
|
)
|
|
1642
1647
|
|
|
1643
1648
|
def get_subswarm(
|
|
@@ -68,10 +68,18 @@ def _run_server_with_args(args: argparse.Namespace) -> None:
|
|
|
68
68
|
if args.swarm_registry is not None:
|
|
69
69
|
swarm_overrides["registry_file"] = args.swarm_registry
|
|
70
70
|
|
|
71
|
+
settings_overrides: dict[str, object] = {}
|
|
72
|
+
if args.print_llm_streams is not None:
|
|
73
|
+
settings_overrides["print_llm_streams"] = args.print_llm_streams
|
|
74
|
+
|
|
71
75
|
if swarm_overrides:
|
|
72
76
|
server_overrides["swarm"] = base_config.swarm.model_copy(
|
|
73
77
|
update=swarm_overrides
|
|
74
78
|
)
|
|
79
|
+
if settings_overrides:
|
|
80
|
+
server_overrides["settings"] = base_config.settings.model_copy(
|
|
81
|
+
update=settings_overrides
|
|
82
|
+
)
|
|
75
83
|
|
|
76
84
|
effective_config = (
|
|
77
85
|
base_config.model_copy(update=server_overrides)
|
|
@@ -345,6 +353,12 @@ def main() -> None:
|
|
|
345
353
|
required=False,
|
|
346
354
|
help="registry file of the swarm",
|
|
347
355
|
)
|
|
356
|
+
server_parser.add_argument(
|
|
357
|
+
"--print-llm-streams",
|
|
358
|
+
type=_str_to_bool,
|
|
359
|
+
required=False,
|
|
360
|
+
help="whether to print LLM reasoning/response streams to the console (true/false)",
|
|
361
|
+
)
|
|
348
362
|
|
|
349
363
|
# command `client`
|
|
350
364
|
client_parser = subparsers.add_parser("client", help="run the MAIL client")
|
|
@@ -68,6 +68,7 @@ def _load_defaults_from_toml() -> tuple[dict[str, Any], dict[str, Any], dict[str
|
|
|
68
68
|
}
|
|
69
69
|
settings_defaults: dict[str, Any] = {
|
|
70
70
|
"task_message_limit": 15,
|
|
71
|
+
"print_llm_streams": True,
|
|
71
72
|
}
|
|
72
73
|
|
|
73
74
|
if tomllib is None:
|
|
@@ -118,6 +119,9 @@ def _load_defaults_from_toml() -> tuple[dict[str, Any], dict[str, Any], dict[str
|
|
|
118
119
|
"task_message_limit": settings_section.get(
|
|
119
120
|
"task_message_limit", settings_defaults["task_message_limit"]
|
|
120
121
|
),
|
|
122
|
+
"print_llm_streams": settings_section.get(
|
|
123
|
+
"print_llm_streams", settings_defaults["print_llm_streams"]
|
|
124
|
+
),
|
|
121
125
|
}
|
|
122
126
|
|
|
123
127
|
logger.info(
|
|
@@ -153,6 +157,9 @@ class SettingsConfig(BaseModel):
|
|
|
153
157
|
task_message_limit: int = Field(
|
|
154
158
|
default_factory=lambda: _settings_defaults()["task_message_limit"]
|
|
155
159
|
)
|
|
160
|
+
print_llm_streams: bool = Field(
|
|
161
|
+
default_factory=lambda: _settings_defaults()["print_llm_streams"]
|
|
162
|
+
)
|
|
156
163
|
|
|
157
164
|
|
|
158
165
|
class ServerConfig(BaseModel):
|
|
@@ -94,6 +94,7 @@ class MAILRuntime:
|
|
|
94
94
|
breakpoint_tools: list[str] | None = None,
|
|
95
95
|
exclude_tools: list[str] | None = None,
|
|
96
96
|
enable_db_agent_histories: bool = False,
|
|
97
|
+
print_llm_streams: bool = True,
|
|
97
98
|
):
|
|
98
99
|
# Use a priority queue with a deterministic tiebreaker to avoid comparing dicts
|
|
99
100
|
# Structure: (priority, seq, message)
|
|
@@ -142,6 +143,7 @@ class MAILRuntime:
|
|
|
142
143
|
self.manual_return_events: dict[str, asyncio.Event] = defaultdict(asyncio.Event)
|
|
143
144
|
self.manual_return_messages: dict[str, MAILMessage | None] = defaultdict(None)
|
|
144
145
|
self.exclude_tools = list(exclude_tools or [])
|
|
146
|
+
self.print_llm_streams = print_llm_streams
|
|
145
147
|
self.response_messages: dict[str, MAILMessage] = {}
|
|
146
148
|
self.last_breakpoint_caller: dict[str, str] = {}
|
|
147
149
|
self.last_breakpoint_tool_calls: dict[str, list[AgentToolCall]] = {}
|
|
@@ -151,6 +153,42 @@ class MAILRuntime:
|
|
|
151
153
|
self.outstanding_requests: dict[str, dict[str, int]] = defaultdict(
|
|
152
154
|
lambda: defaultdict(int)
|
|
153
155
|
)
|
|
156
|
+
self._apply_llm_stream_settings()
|
|
157
|
+
|
|
158
|
+
def _apply_llm_stream_settings(self) -> None:
|
|
159
|
+
"""
|
|
160
|
+
Best-effort propagation of LLM stream print settings to agent functions.
|
|
161
|
+
"""
|
|
162
|
+
seen: set[int] = set()
|
|
163
|
+
for agent in self.agents.values():
|
|
164
|
+
self._set_llm_stream_setting(agent.function, seen)
|
|
165
|
+
|
|
166
|
+
def _set_llm_stream_setting(
|
|
167
|
+
self, fn: Any, seen: set[int], value: bool | None = None
|
|
168
|
+
) -> None:
|
|
169
|
+
"""
|
|
170
|
+
Recursively apply print_llm_streams to known agent function wrappers.
|
|
171
|
+
"""
|
|
172
|
+
if fn is None:
|
|
173
|
+
return
|
|
174
|
+
fn_id = id(fn)
|
|
175
|
+
if fn_id in seen:
|
|
176
|
+
return
|
|
177
|
+
seen.add(fn_id)
|
|
178
|
+
stream_value = self.print_llm_streams if value is None else value
|
|
179
|
+
|
|
180
|
+
if hasattr(fn, "print_llm_streams"):
|
|
181
|
+
try:
|
|
182
|
+
setattr(fn, "print_llm_streams", stream_value)
|
|
183
|
+
except Exception: # pragma: no cover - defensive
|
|
184
|
+
logger.debug(
|
|
185
|
+
f"{self._log_prelude()} unable to update print_llm_streams on {fn}"
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
for attr in ("supervisor_fn", "action_agent_fn", "_mail_agent"):
|
|
189
|
+
inner = getattr(fn, attr, None)
|
|
190
|
+
if inner is not None:
|
|
191
|
+
self._set_llm_stream_setting(inner, seen, stream_value)
|
|
154
192
|
|
|
155
193
|
def _log_prelude(self) -> str:
|
|
156
194
|
"""
|