by-framework 0.2.0__tar.gz → 0.2.2.dev0__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.
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/.github/workflows/publish.yml +79 -1
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/PKG-INFO +28 -3
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/README.md +27 -2
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/README_zh.md +28 -3
- by_framework-0.2.2.dev0/assets/img/architecture_en.png +0 -0
- by_framework-0.2.2.dev0/assets/img/architecture_zh.png +0 -0
- by_framework-0.2.2.dev0/docs/plans/2026-05-15-worker-task-state-stats.md +468 -0
- by_framework-0.2.2.dev0/libs/by-framework-adk/README.md +23 -0
- by_framework-0.2.2.dev0/libs/by-framework-adk/pyproject.toml +36 -0
- by_framework-0.2.2.dev0/libs/by-framework-adk/src/by_framework_adk/__init__.py +6 -0
- by_framework-0.2.2.dev0/libs/by-framework-adk/src/by_framework_adk/_utils.py +53 -0
- by_framework-0.2.2.dev0/libs/by-framework-adk/src/by_framework_adk/adapter.py +167 -0
- by_framework-0.2.2.dev0/libs/by-framework-adk/src/by_framework_adk/worker.py +112 -0
- by_framework-0.2.2.dev0/libs/by-framework-adk/tests/test_worker.py +63 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-history-byclaw/pyproject.toml +2 -2
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-history-postgres/pyproject.toml +2 -2
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-langgraph/pyproject.toml +4 -4
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-trace-langfuse/pyproject.toml +2 -2
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-trace-phoenix/pyproject.toml +2 -2
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/pyproject.toml +3 -1
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/__init__.py +25 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/client/byai_client.py +9 -2
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/client/client.py +93 -35
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/common/constants.py +87 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/__init__.py +25 -0
- by_framework-0.2.2.dev0/src/by_framework/core/availability.py +495 -0
- by_framework-0.2.2.dev0/src/by_framework/core/delivery_gate.py +60 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/registry.py +241 -0
- by_framework-0.2.2.dev0/src/by_framework/core/wakeup_controller.py +151 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/util/discovery_http_client.py +34 -9
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/util/http_client.py +27 -6
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/worker/byai_context.py +9 -2
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/worker/context.py +56 -27
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/client/test_client.py +35 -12
- by_framework-0.2.2.dev0/tests/core/test_availability.py +606 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/test_registry.py +327 -0
- by_framework-0.2.2.dev0/tests/util/test_discovery_http_client_upload.py +181 -0
- by_framework-0.2.2.dev0/tests/util/test_http_client.py +172 -0
- by_framework-0.2.2.dev0/uv.lock +3912 -0
- by_framework-0.2.0/tests/util/test_http_client.py +0 -41
- by_framework-0.2.0/uv.lock +0 -1756
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/.github/RELEASING.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/.github/workflows/ci.yml +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/.github/workflows/stale.yml +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/.gitignore +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/.pre-commit-config.yaml +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/AGENTS.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/CHANGELOG.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/CLAUDE.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/CODE_OF_CONDUCT.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/CONTRIBUTING.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/LICENSE +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/Makefile +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/SECURITY.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/autoformat.sh +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/docs/README.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-history-byclaw/README.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-history-byclaw/src/by_framework_history_byclaw/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-history-byclaw/src/by_framework_history_byclaw/byclaw_history.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-history-byclaw/tests/test_byclaw_history.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-history-postgres/README.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-history-postgres/src/by_framework_history_postgres/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-history-postgres/src/by_framework_history_postgres/postgres.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-history-postgres/tests/test_postgres_history_storage.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-langgraph/README.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-langgraph/src/by_framework_langgraph/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-langgraph/src/by_framework_langgraph/_utils.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-langgraph/src/by_framework_langgraph/adapter.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-langgraph/src/by_framework_langgraph/tools.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-langgraph/src/by_framework_langgraph/worker.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-langgraph/tests/test_adapter.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-langgraph/tests/test_tools.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-langgraph/tests/test_utils.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-trace-langfuse/README.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-trace-langfuse/src/by_framework_trace_langfuse/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-trace-langfuse/src/by_framework_trace_langfuse/langfuse.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-trace-langfuse/tests/test_langfuse_import.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-trace-phoenix/README.md +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-trace-phoenix/src/by_framework_trace_phoenix/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-trace-phoenix/src/by_framework_trace_phoenix/phoenix.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/libs/by-framework-trace-phoenix/tests/test_phoenix_import.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/pylintrc +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/scripts/python_quality.sh +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/__main__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/client/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/common/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/common/config.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/common/emitter.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/common/exceptions.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/common/logger.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/common/redis_client.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/discovery.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/extensions/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/extensions/agent_config.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/extensions/plugin.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/extensions/registry.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/extensions/trace_provider.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/action_type.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/agent_state.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/byai_codec.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/byai_command.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/byai_types.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/commands.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/content_codec.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/content_type.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/data_message.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/data_shapes.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/event_type.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/events.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/message.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/message_header.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/responses.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/protocol/results.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/runtime/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/runtime/agent_config_manager.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/runtime/agent_runtime_state.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/runtime/file_manager.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/runtime/file_paths.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/runtime/file_permissions.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/runtime/filestore/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/runtime/filestore/base.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/runtime/filestore/local.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/runtime/history/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/runtime/history/base.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/runtime/history/history_manager.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/runtime/history/in_memory.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/runtime/session_manager.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/core/workspace.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/errors/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/errors/base.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/errors/common.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/errors/execution.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/errors/http.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/errors/protocol.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/errors/registry.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/util/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/util/generate_message_id.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/worker/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/worker/_control_handling.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/worker/_execution_tracking.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/worker/_message_processing.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/worker/app.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/worker/byai_worker.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/worker/heartbeat.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/worker/processor.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/worker/runner.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/worker/sandbox/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/worker/sandbox/hook_sandbox.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/src/by_framework/worker/worker.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/client/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/common/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/common/test_config.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/common/test_exceptions.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/common/test_logger.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/common/test_redis_client.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/conftest.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/protocol/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/protocol/test_byai_codec.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/protocol/test_command_wire.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/protocol/test_protocol.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/protocol/test_results.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/runtime/history/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/runtime/history/test_history_persistence.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/runtime/test_file_access_context.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/runtime/test_file_manager_default_storage.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/runtime/test_file_paths.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/runtime/test_file_permissions.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/runtime/test_filestore_local_collection.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/runtime/test_filestore_local_mutation.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/runtime/test_filestore_local_read.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/runtime/test_filestore_local_search.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/core/test_discovery.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/integration/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/integration/test_ask_user_flow.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/integration/test_callback_flow.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/integration/test_logger_integration.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/integration/test_scatter_gather.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/plugin/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/plugin/test_langfuse_plugin.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/plugin/test_plugin_discovery.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/plugin/test_plugin_improvements.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/plugin/test_plugin_registry.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/plugin/test_plugin_system.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/util/test_discovery_http_client.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/util/test_discovery_http_client_download.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/worker/__init__.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/worker/test_app.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/worker/test_byai_worker.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/worker/test_context.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/worker/test_control_handling.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/worker/test_emitter.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/worker/test_gateway_worker.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/worker/test_heartbeat.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/worker/test_message_processing.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/worker/test_processor.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/worker/test_runner.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/worker/test_sandbox.py +0 -0
- {by_framework-0.2.0 → by_framework-0.2.2.dev0}/tests/worker/test_workspace.py +0 -0
|
@@ -9,9 +9,11 @@ on:
|
|
|
9
9
|
- "by-framework-trace-langfuse-v*"
|
|
10
10
|
- "by-framework-trace-phoenix-v*"
|
|
11
11
|
- "by-framework-langgraph-v*"
|
|
12
|
+
- "by-framework-adk-v*"
|
|
12
13
|
|
|
13
14
|
permissions:
|
|
14
|
-
contents:
|
|
15
|
+
contents: write
|
|
16
|
+
pull-requests: write
|
|
15
17
|
|
|
16
18
|
jobs:
|
|
17
19
|
resolve-package:
|
|
@@ -57,6 +59,11 @@ jobs:
|
|
|
57
59
|
echo "package_dir=libs/by-framework-langgraph" >> "$GITHUB_OUTPUT"
|
|
58
60
|
echo "version=${REF_NAME#by-framework-langgraph-v}" >> "$GITHUB_OUTPUT"
|
|
59
61
|
;;
|
|
62
|
+
by-framework-adk-v*)
|
|
63
|
+
echo "package_name=by-framework-adk" >> "$GITHUB_OUTPUT"
|
|
64
|
+
echo "package_dir=libs/by-framework-adk" >> "$GITHUB_OUTPUT"
|
|
65
|
+
echo "version=${REF_NAME#by-framework-adk-v}" >> "$GITHUB_OUTPUT"
|
|
66
|
+
;;
|
|
60
67
|
*)
|
|
61
68
|
echo "Unsupported tag: $REF_NAME" >&2
|
|
62
69
|
exit 1
|
|
@@ -133,3 +140,74 @@ jobs:
|
|
|
133
140
|
uses: pypa/gh-action-pypi-publish@release/v1
|
|
134
141
|
with:
|
|
135
142
|
packages-dir: dist/
|
|
143
|
+
|
|
144
|
+
post-release:
|
|
145
|
+
runs-on: ubuntu-latest
|
|
146
|
+
needs:
|
|
147
|
+
- resolve-package
|
|
148
|
+
- publish
|
|
149
|
+
steps:
|
|
150
|
+
- uses: actions/checkout@v4
|
|
151
|
+
with:
|
|
152
|
+
ref: ${{ github.ref }}
|
|
153
|
+
fetch-depth: 0
|
|
154
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
|
155
|
+
- uses: actions/setup-python@v5
|
|
156
|
+
with:
|
|
157
|
+
python-version: "3.12"
|
|
158
|
+
- uses: astral-sh/setup-uv@v5
|
|
159
|
+
|
|
160
|
+
- name: Create release branch
|
|
161
|
+
env:
|
|
162
|
+
PACKAGE_NAME: ${{ needs.resolve-package.outputs.package_name }}
|
|
163
|
+
VERSION: ${{ needs.resolve-package.outputs.version }}
|
|
164
|
+
run: |
|
|
165
|
+
RELEASE_BRANCH="release/${PACKAGE_NAME}/v${VERSION}"
|
|
166
|
+
git checkout -b "$RELEASE_BRANCH"
|
|
167
|
+
git push origin "$RELEASE_BRANCH"
|
|
168
|
+
|
|
169
|
+
- name: Bump version and create PR
|
|
170
|
+
env:
|
|
171
|
+
GH_TOKEN: ${{ github.token }}
|
|
172
|
+
PACKAGE_NAME: ${{ needs.resolve-package.outputs.package_name }}
|
|
173
|
+
PACKAGE_DIR: ${{ needs.resolve-package.outputs.package_dir }}
|
|
174
|
+
VERSION: ${{ needs.resolve-package.outputs.version }}
|
|
175
|
+
run: |
|
|
176
|
+
# Calculate next version using Python to support pre-releases (e.g., 0.2.3b0 -> 0.2.3b1, 0.2.3 -> 0.2.4.dev0)
|
|
177
|
+
NEXT_VERSION=$(python -c 'if True:
|
|
178
|
+
import re, sys
|
|
179
|
+
version = sys.argv[1]
|
|
180
|
+
match = re.search(r"(a|b|rc|dev)(\d+)$", version)
|
|
181
|
+
if match:
|
|
182
|
+
prefix = version[:match.start()]
|
|
183
|
+
suffix_type = match.group(1)
|
|
184
|
+
suffix_num = int(match.group(2))
|
|
185
|
+
print(f"{prefix}{suffix_type}{suffix_num + 1}")
|
|
186
|
+
else:
|
|
187
|
+
parts = version.split(".")
|
|
188
|
+
try:
|
|
189
|
+
parts[-1] = str(int(parts[-1]) + 1)
|
|
190
|
+
print(".".join(parts) + ".dev0")
|
|
191
|
+
except ValueError:
|
|
192
|
+
print(version + ".dev0")
|
|
193
|
+
' "$VERSION")
|
|
194
|
+
|
|
195
|
+
PYPROJECT="${PACKAGE_DIR}/pyproject.toml"
|
|
196
|
+
sed -i "s/version = \"${VERSION}\"/version = \"${NEXT_VERSION}\"/" "$PYPROJECT"
|
|
197
|
+
|
|
198
|
+
# Regenerate uv.lock to align with the new version bump in workspace
|
|
199
|
+
uv lock
|
|
200
|
+
|
|
201
|
+
BUMP_BRANCH="bump/${PACKAGE_NAME}/v${NEXT_VERSION}"
|
|
202
|
+
git checkout -b "$BUMP_BRANCH"
|
|
203
|
+
git config user.name "github-actions[bot]"
|
|
204
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
205
|
+
git add "$PYPROJECT" uv.lock
|
|
206
|
+
git commit -m "chore: bump ${PACKAGE_NAME} version to ${NEXT_VERSION}"
|
|
207
|
+
git push origin "$BUMP_BRANCH"
|
|
208
|
+
|
|
209
|
+
gh pr create \
|
|
210
|
+
--title "chore: bump ${PACKAGE_NAME} to ${NEXT_VERSION}" \
|
|
211
|
+
--body "Auto-bump version after ${PACKAGE_NAME} v${VERSION} release." \
|
|
212
|
+
--base main \
|
|
213
|
+
--head "$BUMP_BRANCH"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: by-framework
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2.dev0
|
|
4
4
|
Summary: 分布式 Agent 调度框架
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Requires-Python: >=3.12
|
|
@@ -37,9 +37,34 @@ Description-Content-Type: text/markdown
|
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
-
**by-framework** is a distributed, high-performance Agent scheduling engine built on Redis Streams
|
|
40
|
+
**by-framework** is a distributed, high-performance Agent scheduling engine built on Redis Streams, purpose-built for multi-agent systems.
|
|
41
|
+
|
|
42
|
+
## Challenges in Traditional Architecture
|
|
43
|
+
|
|
44
|
+
Traditional AI application architectures often face three critical challenges when dealing with Agent scenarios:
|
|
45
|
+
|
|
46
|
+
- **Full-link Synchronous Blocking $\rightarrow$ Forced "Manual Monitoring"** — Strong coupling between frontend and backend means tasks are interrupted if the page is closed. Users cannot switch devices or tasks, making workflows fragile to network fluctuations or interruptions.
|
|
47
|
+
- **Inability to Support Long-running Tasks $\rightarrow$ System "Constant Accompaniment"** — For reasoning tasks taking minutes or hours, callers must block threads and wait. This leads to gateway timeouts and massive waste of idle compute resources.
|
|
48
|
+
- **Inter-Agent Orchestration Recovery Dilemma** — In complex cascaded calls, if a timeout or interruption occurs, it's nearly impossible to accurately resume state. Developers are forced to build extremely complex persistent state machines.
|
|
49
|
+
|
|
50
|
+
## The By-Framework Solution
|
|
51
|
+
|
|
52
|
+

|
|
53
|
+
|
|
54
|
+
By-Framework addresses these issues through an asynchronous architecture with **separated Control and Data Planes**:
|
|
55
|
+
|
|
56
|
+
- **Instruction Asynchrony**: The APP sends control instructions to the **Control Queue** via the **Gateway Client**. Being asynchronous, the APP never blocks, and backend threads are released immediately.
|
|
57
|
+
- **Agent Cluster Consumption**: A distributed cluster of **Agents** competitively consumes messages from the control queue. Logical routing (Agent Type) provides native load balancing and elastic scaling.
|
|
58
|
+
- **Data Stream Feedback**: During execution, Agents asynchronously push chunks, state changes, and artifacts to the **Data Queue**. The APP listens via the **Gateway Client** for progress, natively supporting ultra-long tasks.
|
|
59
|
+
- **Native Orchestration & Resumption**: When an Agent needs to call another Agent, it sends a new instruction to the **Control Queue**. This message-based mechanism allows tasks to release resources while waiting and resume context precisely upon receiving a reply.
|
|
60
|
+
|
|
61
|
+
## Highlights
|
|
62
|
+
|
|
63
|
+
- 🔌 **Plugin System** — Hot-reloadable plugins with lifecycle hooks, tools, prompts, and sub-agent configs
|
|
64
|
+
- 🤝 **Inter-Agent Orchestration** — Built-in `call_agent`, scatter-gather fan-out, and human-in-the-loop patterns
|
|
65
|
+
- 🧩 **Extension Ecosystem** — Drop-in packages for Langfuse, Phoenix, PostgreSQL, LangGraph, and Google ADK
|
|
66
|
+
- 🛡️ **Production-Ready** — Competitive consumption, graceful shutdown, message persistence, and execution state tracking
|
|
41
67
|
|
|
42
|
-
---
|
|
43
68
|
|
|
44
69
|
## Table of Contents
|
|
45
70
|
|
|
@@ -17,9 +17,34 @@
|
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
**by-framework** is a distributed, high-performance Agent scheduling engine built on Redis Streams
|
|
20
|
+
**by-framework** is a distributed, high-performance Agent scheduling engine built on Redis Streams, purpose-built for multi-agent systems.
|
|
21
|
+
|
|
22
|
+
## Challenges in Traditional Architecture
|
|
23
|
+
|
|
24
|
+
Traditional AI application architectures often face three critical challenges when dealing with Agent scenarios:
|
|
25
|
+
|
|
26
|
+
- **Full-link Synchronous Blocking $\rightarrow$ Forced "Manual Monitoring"** — Strong coupling between frontend and backend means tasks are interrupted if the page is closed. Users cannot switch devices or tasks, making workflows fragile to network fluctuations or interruptions.
|
|
27
|
+
- **Inability to Support Long-running Tasks $\rightarrow$ System "Constant Accompaniment"** — For reasoning tasks taking minutes or hours, callers must block threads and wait. This leads to gateway timeouts and massive waste of idle compute resources.
|
|
28
|
+
- **Inter-Agent Orchestration Recovery Dilemma** — In complex cascaded calls, if a timeout or interruption occurs, it's nearly impossible to accurately resume state. Developers are forced to build extremely complex persistent state machines.
|
|
29
|
+
|
|
30
|
+
## The By-Framework Solution
|
|
31
|
+
|
|
32
|
+

|
|
33
|
+
|
|
34
|
+
By-Framework addresses these issues through an asynchronous architecture with **separated Control and Data Planes**:
|
|
35
|
+
|
|
36
|
+
- **Instruction Asynchrony**: The APP sends control instructions to the **Control Queue** via the **Gateway Client**. Being asynchronous, the APP never blocks, and backend threads are released immediately.
|
|
37
|
+
- **Agent Cluster Consumption**: A distributed cluster of **Agents** competitively consumes messages from the control queue. Logical routing (Agent Type) provides native load balancing and elastic scaling.
|
|
38
|
+
- **Data Stream Feedback**: During execution, Agents asynchronously push chunks, state changes, and artifacts to the **Data Queue**. The APP listens via the **Gateway Client** for progress, natively supporting ultra-long tasks.
|
|
39
|
+
- **Native Orchestration & Resumption**: When an Agent needs to call another Agent, it sends a new instruction to the **Control Queue**. This message-based mechanism allows tasks to release resources while waiting and resume context precisely upon receiving a reply.
|
|
40
|
+
|
|
41
|
+
## Highlights
|
|
42
|
+
|
|
43
|
+
- 🔌 **Plugin System** — Hot-reloadable plugins with lifecycle hooks, tools, prompts, and sub-agent configs
|
|
44
|
+
- 🤝 **Inter-Agent Orchestration** — Built-in `call_agent`, scatter-gather fan-out, and human-in-the-loop patterns
|
|
45
|
+
- 🧩 **Extension Ecosystem** — Drop-in packages for Langfuse, Phoenix, PostgreSQL, LangGraph, and Google ADK
|
|
46
|
+
- 🛡️ **Production-Ready** — Competitive consumption, graceful shutdown, message persistence, and execution state tracking
|
|
21
47
|
|
|
22
|
-
---
|
|
23
48
|
|
|
24
49
|
## Table of Contents
|
|
25
50
|
|
|
@@ -13,13 +13,38 @@
|
|
|
13
13
|
|
|
14
14
|
[**English**](README.md) | [**中文**](README_zh.md)
|
|
15
15
|
|
|
16
|
+
**重要链接:** [文档](https://beyonai.github.io/by-framework-docs) · [Java 版本](https://beyonai.github.io/by-framework-java) · [TypeScript 版本](https://beyonai.github.io/by-framework-ts)
|
|
17
|
+
|
|
16
18
|
</div>
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
**by-framework** 是一个基于 Redis Streams 构建的分布式高性能 Agent 调度引擎,专为多 Agent 系统设计。
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
## 传统架构的困境
|
|
23
|
+
|
|
24
|
+
传统 AI 应用架构在面对 Agent 场景时常面临三大挑战:
|
|
25
|
+
|
|
26
|
+
- **全链路同步阻塞 $\rightarrow$ 迫使用户“人肉盯看”** — 前端与后端强绑定,页面关闭即任务中断。用户无法跨端切换,工作流极易因网络波动或意外打断而前功尽弃。
|
|
27
|
+
- **无法支撑超长任务 $\rightarrow$ 导致系统“全程陪同”** — 面对数分钟甚至小时级的推理,调用方必须持续阻塞线程等待,不仅面临网关超时截断,更造成了严重的计算资源空转与浪费。
|
|
28
|
+
- **多 Agent 编排的中断恢复困局** — 在复杂级联调用中,一旦出现超时或中断,系统难以精准定位状态并恢复,容易超时或结果错乱。
|
|
29
|
+
|
|
30
|
+
## By-Framework 的方案
|
|
31
|
+
|
|
32
|
+

|
|
33
|
+
|
|
34
|
+
By-Framework 通过**控制与数据平面分离**的异步架构解决上述问题:
|
|
35
|
+
|
|
36
|
+
- **指令异步化**:APP 通过 **Gateway Client** 将用户请求转化为控制指令并投入 **Control Queue**(控制队列)。由于是异步解耦,APP 无需阻塞等待,后端线程立即释放。
|
|
37
|
+
- **Agent 集群消费**:分布式的 **Agents** 集群竞争消费控制队列中的消息。通过逻辑寻址(Agent Type)自动实现负载均衡,天然支持动态扩缩容。
|
|
38
|
+
- **过程数据回传**:Agent 在执行过程中,将流式文本(Chunk)、状态变更(State)及产物(Artifact)异步推送到 **Data Queue**(数据队列),APP 通过 **Gateway Client** 实时监听该队列以获取任务进度,从而原生支持超长任务。
|
|
39
|
+
- **原生编排与中断恢复**:当 Agent 需要调用其他 Agent(编排)时,它会将新指令发往 **Control Queue**。这种基于消息的机制允许 Agent 任务在等待期间完全释放资源,并在收到回复指令后精准恢复上下文。
|
|
40
|
+
|
|
41
|
+
## 亮点
|
|
42
|
+
|
|
43
|
+
- 🔌 **插件系统** — 支持热加载的插件机制,提供生命周期钩子、工具、提示词和子 Agent 配置
|
|
44
|
+
- 🤝 **多 Agent 编排** — 内置 call_agent、scatter-gather 扇出和人机交互模式
|
|
45
|
+
- 🧩 **扩展生态** — 开箱即用的 Langfuse、Phoenix、PostgreSQL、LangGraph 及 Google ADK 集成包
|
|
46
|
+
- 🛡️ **生产就绪** — 竞争消费、优雅退出、消息持久化与配置快照
|
|
21
47
|
|
|
22
|
-
---
|
|
23
48
|
|
|
24
49
|
## 目录
|
|
25
50
|
|
|
Binary file
|
|
Binary file
|