agentbyte 0.5.0__tar.gz → 0.7.0__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.
- agentbyte-0.7.0/.github/skills/agentbyte-fastapi-sse-streaming/SKILL.md +114 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/CHANGELOG.md +39 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/PKG-INFO +29 -4
- {agentbyte-0.5.0 → agentbyte-0.7.0}/README.md +27 -2
- {agentbyte-0.5.0 → agentbyte-0.7.0}/pyproject.toml +3 -3
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/__about__.py +1 -1
- agentbyte-0.7.0/src/agentbyte/microwebui/__init__.py +9 -0
- agentbyte-0.7.0/src/agentbyte/microwebui/server.py +307 -0
- agentbyte-0.7.0/src/agentbyte/microwebui/ui/index.html +1499 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/cli/test_create_skills.py +1 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-agent-as-tool/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-ai-driven-orchestration/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-dataset/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-function-tools/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-handoff-orchestration/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-list-memory/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-llm-client/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-memory-tool/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-middleware/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-multi-turn-context/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-otel-tracing/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-plan-based-orchestration/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-round-robin-orchestration/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-simple-agent/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-tool-approval/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-workflow/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/skill-authoring/SKILL.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/.gitignore +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/LICENSE +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/agents/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/agents/agent.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/agents/agent_as_tool.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/agents/base.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/agents/types.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/cancellation_token.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/cli/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/cli/main.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/component.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/context.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/base.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/config.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/json.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/loader.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/loaders.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/sources.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/sqlite.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/entity.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/_retry_observability.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/auth.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/azure/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/azure/auth.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/azure/chat.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/azure/embedding.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/azure/settings.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/azure_openai.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/base.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/embeddings_base.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/openai/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/openai/chat.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/openai/embedding.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/openai/settings.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/openai.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/openai_embedding.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/pricing.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/retry_policy.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/settings.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/types.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/memory/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/memory/base.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/messages.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/middleware/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/middleware/base.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/middleware/otel.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/middleware/retry.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/notebook.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/orchestration/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/orchestration/ai.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/orchestration/base.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/orchestration/handoff.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/orchestration/plan.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/orchestration/policies.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/orchestration/round_robin.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/presets/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/presets/agents.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/presets/clients.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/presets/orchestration.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/presets/workflow.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/session_store.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/base.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/cancellation.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/composite.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/consecutive_agent.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/external.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/function_call.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/handoff.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/max_message.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/predicate.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/source.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/text_mention.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/timeout.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/token_usage.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/tools/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/tools/base.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/tools/core_tools.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/tools/decorator.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/tools/memory_tool.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/types.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/agent_framework_devui/ui/assets/index-BzhEszHZ.css +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/agent_framework_devui/ui/assets/index-DByFJNGD.js +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/agent_framework_devui/ui/index.html +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/agent_framework_devui/ui/vite.svg +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/discovery.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/execution.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/.gitignore +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/README.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/components.json +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/eslint.config.js +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/index.html +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/package.json +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/plan.md +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/public/vite.svg +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/App.css +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/App.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/assets/react.svg +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/agent/agent-view.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/message_renderer/ContentRenderer.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/message_renderer/MessageRenderer.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/message_renderer/index.ts +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/message_renderer/types.ts +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/mode-toggle.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/orchestrator/orchestrator-view.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/app-header.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/chat-base.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/context-inspector.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/debug-panel.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/entity-selector.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/example-tasks-display.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/examples-gallery.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/session-switcher.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/tool-approval-banner.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/theme-provider.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/attachment-gallery.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/badge.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/button.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/card.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/dialog.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/dropdown-menu.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/file-upload.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/input.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/label.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/loading-spinner.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/loading-state.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/message-input.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/scroll-area.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/slider.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/tabs.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/textarea.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/workflow/workflow-view.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/hooks/messageHandlers.ts +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/hooks/useEntityExecution.ts +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/index.css +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/main.tsx +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/services/api.ts +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/types/index.ts +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/types/picoagents.ts +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/utils/message-utils.ts +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/vite-env.d.ts +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/tsconfig.app.json +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/tsconfig.json +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/tsconfig.node.json +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/vite.config.ts +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/yarn.lock +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/models.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/registry.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/server.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/session_store.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/sessions.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/ui/assets/index-CWk64UM3.js +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/ui/assets/index-vt1cujlT.css +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/ui/index.html +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/ui/vite.svg +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/agent.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/core/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/core/checkpoint.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/core/models.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/core/runner.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/core/workflow.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/defaults.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/loader.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/schema.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/schema_utils.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/agentbyte_agent.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/echo.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/function.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/http.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/step.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/transform.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/visualizer.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_agent_as_tool.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_agent_basic.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_agent_event_types.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_agent_memory_integration.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_agent_middleware_integration.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_agent_retry_middleware.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_agent_stream_events.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_tool_approval.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/dataset/test_loader.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/llm/test_azure_client.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/llm/test_azure_embedding_client.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/llm/test_llm_types.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/llm/test_openai_client.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/llm/test_openai_embedding_client.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/llm/test_retry_observability.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/llm/test_retry_policy_api.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/memory/test_memory.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/middleware/test_middleware_chain.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/middleware/test_otel.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/middleware/test_retry_middleware.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/orchestration/test_ai_orchestrator.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/orchestration/test_base_orchestrator.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/orchestration/test_handoff_orchestrator.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/orchestration/test_plan_orchestrator.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/orchestration/test_round_robin.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/presets/test_agents.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/presets/test_clients.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/presets/test_orchestration.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/presets/test_workflow.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_base.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_cancellation.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_composite.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_consecutive_agent.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_external.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_function_call.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_handoff.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_max_message.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_predicate.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_source.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_text_mention.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_timeout.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_token_usage.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/test_cancellation_token.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/test_context.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/test_messages.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/test_package_api.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/test_session_store.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/test_types.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/tools/test_memory_tool.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/tools/test_tools.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/webui/__init__.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/webui/helpers.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/webui/test_execution.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/webui/test_package_api.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/webui/test_registry.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/webui/test_server.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/webui/test_sessions.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_checkpoint.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_subworkflow_step.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_workflow_agent.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_workflow_class.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_workflow_models.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_workflow_runner.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_workflow_schema.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_workflow_steps.py +0 -0
- {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_workflow_visualizer.py +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agentbyte-fastapi-sse-streaming
|
|
3
|
+
description: Guide for building or updating FastAPI-based Server-Sent Events streaming in Agentbyte, especially POST /chat/stream endpoints that use EventSourceResponse and ServerSentEvent for browser or curl clients.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Use this skill when adding or maintaining FastAPI SSE streaming in Agentbyte, especially for `agentbyte.microwebui`.
|
|
8
|
+
|
|
9
|
+
## Inputs to confirm
|
|
10
|
+
- Whether the stream should stay on `POST` because the client sends a JSON body
|
|
11
|
+
- Whether the frontend expects plain `data: <json>` SSE frames with no named SSE events
|
|
12
|
+
- Whether session continuity requires `session_id` and `user_id` in the request body
|
|
13
|
+
- Whether the stream should persist the final `AgentContext` and replayable event history
|
|
14
|
+
|
|
15
|
+
## Pattern: Native FastAPI SSE for POST streaming
|
|
16
|
+
|
|
17
|
+
Prefer FastAPI's built-in SSE support over manual `StreamingResponse` framing.
|
|
18
|
+
|
|
19
|
+
```python
|
|
20
|
+
from collections.abc import AsyncIterable
|
|
21
|
+
from typing import Any
|
|
22
|
+
|
|
23
|
+
from fastapi import FastAPI
|
|
24
|
+
from fastapi.sse import EventSourceResponse, ServerSentEvent
|
|
25
|
+
from pydantic import BaseModel
|
|
26
|
+
|
|
27
|
+
app = FastAPI()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ChatRequest(BaseModel):
|
|
31
|
+
message: str
|
|
32
|
+
session_id: str | None = None
|
|
33
|
+
user_id: str | None = None
|
|
34
|
+
agent_name: str | None = None
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
async def stream_events(request: ChatRequest) -> AsyncIterable[ServerSentEvent]:
|
|
38
|
+
for payload in [{"event_type": "task_start", "task": request.message}]:
|
|
39
|
+
yield ServerSentEvent(data=payload)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@app.post("/chat/stream", response_class=EventSourceResponse)
|
|
43
|
+
async def chat_stream(request: ChatRequest) -> AsyncIterable[ServerSentEvent]:
|
|
44
|
+
async for event in stream_events(request):
|
|
45
|
+
yield event
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Current Agentbyte pattern
|
|
49
|
+
|
|
50
|
+
For `microwebui`, the stream generator:
|
|
51
|
+
|
|
52
|
+
- resolves the selected agent
|
|
53
|
+
- loads or creates `AgentContext` from `InMemorySessionStore`
|
|
54
|
+
- runs `agent.run_stream(..., context=context, verbose=True, stream_tokens=True)`
|
|
55
|
+
- yields `ServerSentEvent(data=event_payload)` for each streamed item
|
|
56
|
+
- persists the final `AgentContext` plus stored event history when the final `AgentResponse` arrives
|
|
57
|
+
|
|
58
|
+
The important point is that Agentbyte no longer manually builds:
|
|
59
|
+
|
|
60
|
+
```python
|
|
61
|
+
f"data: {json_payload}\\n\\n"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
FastAPI now handles the SSE framing for us.
|
|
65
|
+
|
|
66
|
+
## Request shape after the API is running
|
|
67
|
+
|
|
68
|
+
For a live server on `127.0.0.1:8070`, use:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
curl -N -X POST http://127.0.0.1:8070/chat/stream \
|
|
72
|
+
-H "Content-Type: application/json" \
|
|
73
|
+
-d '{
|
|
74
|
+
"message": "What is the weather in Prague?",
|
|
75
|
+
"session_id": "demo-session-1",
|
|
76
|
+
"user_id": "demo-user-1",
|
|
77
|
+
"agent_name": "weather_assistant"
|
|
78
|
+
}'
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
To test follow-up memory, reuse the same `session_id` and `user_id`:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
curl -N -X POST http://127.0.0.1:8070/chat/stream \
|
|
85
|
+
-H "Content-Type: application/json" \
|
|
86
|
+
-d '{
|
|
87
|
+
"message": "Summarize the previous answer in one sentence.",
|
|
88
|
+
"session_id": "demo-session-1",
|
|
89
|
+
"user_id": "demo-user-1",
|
|
90
|
+
"agent_name": "weather_assistant"
|
|
91
|
+
}'
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Expected stream shape
|
|
95
|
+
|
|
96
|
+
The browser or curl client still sees normal SSE frames such as:
|
|
97
|
+
|
|
98
|
+
```text
|
|
99
|
+
data: {"event_type":"task_start",...}
|
|
100
|
+
|
|
101
|
+
data: {"event_type":"model_call",...}
|
|
102
|
+
|
|
103
|
+
data: {"content":"...","role":"assistant",...}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
The frontend can keep parsing `data: ` lines exactly as before.
|
|
107
|
+
|
|
108
|
+
## Guardrails
|
|
109
|
+
|
|
110
|
+
- For body-carrying chat streams, keep `POST` plus `fetch()`; browser `EventSource` is not a drop-in replacement because it does not send JSON request bodies.
|
|
111
|
+
- When using native FastAPI SSE, yield `ServerSentEvent(data=...)` instead of manually formatting `data: ...\\n\\n`.
|
|
112
|
+
- Keep the JSON payload shape stable unless the frontend/parser is updated in the same change set.
|
|
113
|
+
- If memory is part of the demo, reuse the same `session_id` and `user_id` across follow-up requests.
|
|
114
|
+
- Store replayable session events only after normalizing them to JSON-friendly payloads.
|
|
@@ -4,6 +4,45 @@ All notable changes to Agentbyte are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format follows Keep a Changelog principles and semantic versioning.
|
|
6
6
|
|
|
7
|
+
## [0.7.0] - 2026-04-09
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Added a new bundled Copilot skill: `agentbyte-fastapi-sse-streaming`, covering FastAPI native SSE setup, `ServerSentEvent` usage, and copy-ready `curl` requests for testing a running `/chat/stream` endpoint.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Switched `agentbyte.microwebui` from manual SSE string framing to FastAPI's native `EventSourceResponse` and `ServerSentEvent` support while keeping the existing frontend event payload contract intact.
|
|
16
|
+
- Refined the bundled `microwebui` frontend with a scrollable chat feed, updated visual styling, and a lightweight live "thinking" panel inside the main conversation view during streamed runs.
|
|
17
|
+
- Expanded the Chapter 8 web study notes to document browser-generated `session_id` / `user_id` handling, user-scoped session listing, and why `microwebui` moved from manual SSE framing to FastAPI's built-in SSE support.
|
|
18
|
+
|
|
19
|
+
## [0.6.1] - 2026-04-09
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- Improved ASCII diagrams in web study topics (`docs/study/04-web_topics/`) for better visual clarity: construction flow, session lifecycle, startup sequence, session switching, and example runtime flow now use box-drawing characters for enhanced readability.
|
|
24
|
+
|
|
25
|
+
## [0.6.0] - 2026-04-09
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
|
|
29
|
+
- Added `agentbyte.microwebui`, a new lightweight built-in web UI module for small agent demos with a simple `serve(entities=[...], port=...)` interface.
|
|
30
|
+
- Added a bundled vanilla frontend for `microwebui` with agent discovery, in-memory session switching, stored event-stream reload, and a live debug panel.
|
|
31
|
+
- Added `examples/microwebui_agents.py`, a one-file example that defines multiple agents locally and serves them through the new `microwebui` module.
|
|
32
|
+
- Added multiple demo agent patterns for the Chapter 8-style experience: weather, travel, and packing assistants sharing the same model client and weather tool.
|
|
33
|
+
|
|
34
|
+
### Changed
|
|
35
|
+
|
|
36
|
+
- Promoted the working Chapter 8 FastAPI + SSE prototype into the reusable `agentbyte.microwebui` package instead of keeping it only under `examples/`.
|
|
37
|
+
- Updated the root example run path so `make run-microwebui-example` launches the new one-file `microwebui` demo.
|
|
38
|
+
- Updated package build metadata so the bundled `microwebui` frontend ships in installable artifacts.
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- Removed the redundant wheel include rule for `microwebui` UI assets, eliminating duplicate archive entries during builds while preserving install-time asset availability.
|
|
43
|
+
- Fixed `microwebui` request-model binding so `POST /chat/stream` accepts the frontend payload correctly after installation.
|
|
44
|
+
- Fixed stale in-browser session handling so a restarted server automatically falls back to a fresh in-memory session instead of repeatedly probing a dead session id.
|
|
45
|
+
|
|
7
46
|
## [0.5.0] - 2026-04-08
|
|
8
47
|
|
|
9
48
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentbyte
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: A toolkit for designing multiagent systems
|
|
5
5
|
Project-URL: Homepage, https://gitlab.com/pyninja/aiengineering/agentbyte
|
|
6
6
|
Project-URL: Repository, https://gitlab.com/pyninja/aiengineering/agentbyte
|
|
@@ -51,21 +51,46 @@ Provides-Extra: viz
|
|
|
51
51
|
Requires-Dist: graphviz>=0.21; extra == 'viz'
|
|
52
52
|
Provides-Extra: webui
|
|
53
53
|
Requires-Dist: fastapi>=0.135.2; extra == 'webui'
|
|
54
|
-
Requires-Dist: uvicorn>=0.
|
|
54
|
+
Requires-Dist: uvicorn[standard]>=0.44.0; extra == 'webui'
|
|
55
55
|
Description-Content-Type: text/markdown
|
|
56
56
|
|
|
57
57
|
<p align="center">
|
|
58
|
-
<img src="https://gitlab.com/pyninja/aiengineering/agentbyte/-/raw/v0.
|
|
58
|
+
<img src="https://gitlab.com/pyninja/aiengineering/agentbyte/-/raw/v0.7.0/logo/agent-byte-avatar-low.png" alt="Agentbyte" width="200"/>
|
|
59
59
|
</p>
|
|
60
60
|
|
|
61
61
|
# Agentbyte
|
|
62
62
|
|
|
63
63
|
Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
|
|
64
64
|
|
|
65
|
-
Current release: **0.
|
|
65
|
+
Current release: **0.7.0**
|
|
66
66
|
|
|
67
67
|
Repository: [gitlab.com/pyninja/aiengineering/agentbyte](https://gitlab.com/pyninja/aiengineering/agentbyte)
|
|
68
68
|
|
|
69
|
+
## What's New in 0.7.0
|
|
70
|
+
|
|
71
|
+
**MicroWebUI streaming polish + bundled SSE skill**
|
|
72
|
+
|
|
73
|
+
- Switched `agentbyte.microwebui` streaming to FastAPI's native SSE support with `EventSourceResponse` and `ServerSentEvent`, while preserving the existing frontend wire contract.
|
|
74
|
+
- Refined the bundled `microwebui` frontend with a scrollable chat window and a lightweight live "thinking" trace during streamed runs.
|
|
75
|
+
- Added a new bundled Copilot skill, `agentbyte-fastapi-sse-streaming`, covering FastAPI SSE setup and copy-ready `curl` examples for `/chat/stream`.
|
|
76
|
+
- Expanded the Chapter 8 web study topics to explain browser-generated `session_id` / `user_id` flow, session-list filtering, and the manual-SSE to native-SSE migration.
|
|
77
|
+
|
|
78
|
+
## What's New in 0.6.1
|
|
79
|
+
|
|
80
|
+
**Study topic documentation polish**
|
|
81
|
+
|
|
82
|
+
- Improved ASCII diagrams in web study topics with clearer visual hierarchy and flow using box-drawing characters.
|
|
83
|
+
|
|
84
|
+
## What's New in 0.6.0
|
|
85
|
+
|
|
86
|
+
**MicroWebUI + Chapter 8 demo promotion**
|
|
87
|
+
|
|
88
|
+
- Added `agentbyte.microwebui` with a small built-in `serve(entities=[...], port=...)` interface for lightweight agent demos.
|
|
89
|
+
- Promoted the working Chapter 8 FastAPI + SSE example into the reusable `microwebui` module instead of keeping it only as an `examples/app/` prototype.
|
|
90
|
+
- Added a bundled vanilla HTML frontend for `microwebui` with agent discovery, in-memory sessions, stored event history reload, and a live debug panel.
|
|
91
|
+
- Added a one-file launcher example, `examples/microwebui_agents.py`, showing the picoagents-style flow of defining agents locally and passing them to `serve(...)`.
|
|
92
|
+
- Fixed `microwebui` packaging so the bundled frontend ships correctly in the installable wheel without duplicate archive entries.
|
|
93
|
+
|
|
69
94
|
## What's New in 0.5.0
|
|
70
95
|
|
|
71
96
|
**Workflow Runtime — Spec 08 complete (8 sub-specs)**
|
|
@@ -1,15 +1,40 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://gitlab.com/pyninja/aiengineering/agentbyte/-/raw/v0.
|
|
2
|
+
<img src="https://gitlab.com/pyninja/aiengineering/agentbyte/-/raw/v0.7.0/logo/agent-byte-avatar-low.png" alt="Agentbyte" width="200"/>
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
# Agentbyte
|
|
6
6
|
|
|
7
7
|
Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
|
|
8
8
|
|
|
9
|
-
Current release: **0.
|
|
9
|
+
Current release: **0.7.0**
|
|
10
10
|
|
|
11
11
|
Repository: [gitlab.com/pyninja/aiengineering/agentbyte](https://gitlab.com/pyninja/aiengineering/agentbyte)
|
|
12
12
|
|
|
13
|
+
## What's New in 0.7.0
|
|
14
|
+
|
|
15
|
+
**MicroWebUI streaming polish + bundled SSE skill**
|
|
16
|
+
|
|
17
|
+
- Switched `agentbyte.microwebui` streaming to FastAPI's native SSE support with `EventSourceResponse` and `ServerSentEvent`, while preserving the existing frontend wire contract.
|
|
18
|
+
- Refined the bundled `microwebui` frontend with a scrollable chat window and a lightweight live "thinking" trace during streamed runs.
|
|
19
|
+
- Added a new bundled Copilot skill, `agentbyte-fastapi-sse-streaming`, covering FastAPI SSE setup and copy-ready `curl` examples for `/chat/stream`.
|
|
20
|
+
- Expanded the Chapter 8 web study topics to explain browser-generated `session_id` / `user_id` flow, session-list filtering, and the manual-SSE to native-SSE migration.
|
|
21
|
+
|
|
22
|
+
## What's New in 0.6.1
|
|
23
|
+
|
|
24
|
+
**Study topic documentation polish**
|
|
25
|
+
|
|
26
|
+
- Improved ASCII diagrams in web study topics with clearer visual hierarchy and flow using box-drawing characters.
|
|
27
|
+
|
|
28
|
+
## What's New in 0.6.0
|
|
29
|
+
|
|
30
|
+
**MicroWebUI + Chapter 8 demo promotion**
|
|
31
|
+
|
|
32
|
+
- Added `agentbyte.microwebui` with a small built-in `serve(entities=[...], port=...)` interface for lightweight agent demos.
|
|
33
|
+
- Promoted the working Chapter 8 FastAPI + SSE example into the reusable `microwebui` module instead of keeping it only as an `examples/app/` prototype.
|
|
34
|
+
- Added a bundled vanilla HTML frontend for `microwebui` with agent discovery, in-memory sessions, stored event history reload, and a live debug panel.
|
|
35
|
+
- Added a one-file launcher example, `examples/microwebui_agents.py`, showing the picoagents-style flow of defining agents locally and passing them to `serve(...)`.
|
|
36
|
+
- Fixed `microwebui` packaging so the bundled frontend ships correctly in the installable wheel without duplicate archive entries.
|
|
37
|
+
|
|
13
38
|
## What's New in 0.5.0
|
|
14
39
|
|
|
15
40
|
**Workflow Runtime — Spec 08 complete (8 sub-specs)**
|
|
@@ -42,7 +42,7 @@ azureopenai = [
|
|
|
42
42
|
]
|
|
43
43
|
webui = [
|
|
44
44
|
"fastapi>=0.135.2",
|
|
45
|
-
"uvicorn>=0.
|
|
45
|
+
"uvicorn[standard]>=0.44.0",
|
|
46
46
|
]
|
|
47
47
|
viz = [
|
|
48
48
|
"graphviz>=0.21",
|
|
@@ -91,7 +91,7 @@ packages = ["src/agentbyte"]
|
|
|
91
91
|
".github/skills" = "agentbyte/skills"
|
|
92
92
|
|
|
93
93
|
[tool.hatch.build.targets.sdist]
|
|
94
|
-
include = ["/src", "/tests", "/README.md", "/LICENSE", "/CHANGELOG.md", "/.github/skills", "/src/agentbyte/webui/ui"]
|
|
94
|
+
include = ["/src", "/tests", "/README.md", "/LICENSE", "/CHANGELOG.md", "/.github/skills", "/src/agentbyte/webui/ui", "/src/agentbyte/microwebui/ui"]
|
|
95
95
|
|
|
96
96
|
[dependency-groups]
|
|
97
97
|
aws = [
|
|
@@ -126,7 +126,7 @@ viz = [
|
|
|
126
126
|
]
|
|
127
127
|
webui = [
|
|
128
128
|
"fastapi>=0.135.2",
|
|
129
|
-
"uvicorn>=0.
|
|
129
|
+
"uvicorn[standard]>=0.44.0",
|
|
130
130
|
]
|
|
131
131
|
|
|
132
132
|
[tool.pytest.ini_options]
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
__version__ = "0.
|
|
1
|
+
__version__ = "0.7.0"
|
|
2
2
|
VERSION = __version__
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
"""Minimal FastAPI-based web UI for small Agentbyte demos."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from collections.abc import Iterable, Sequence
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any
|
|
9
|
+
from uuid import uuid4
|
|
10
|
+
|
|
11
|
+
from agentbyte import InMemorySessionStore
|
|
12
|
+
from agentbyte.agents import Agent, AgentResponse
|
|
13
|
+
from agentbyte.context import AgentContext
|
|
14
|
+
from pydantic import BaseModel
|
|
15
|
+
|
|
16
|
+
EVENT_STREAM_KEY = "microwebui_event_stream"
|
|
17
|
+
RUN_COUNTER_KEY = "microwebui_run_counter"
|
|
18
|
+
UI_INDEX = Path(__file__).resolve().parent / "ui" / "index.html"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _require_fastapi() -> tuple[Any, Any, Any, Any, Any]:
|
|
22
|
+
try:
|
|
23
|
+
from fastapi import FastAPI, HTTPException
|
|
24
|
+
from fastapi.responses import FileResponse
|
|
25
|
+
from fastapi.sse import EventSourceResponse, ServerSentEvent
|
|
26
|
+
except ImportError as exc:
|
|
27
|
+
raise RuntimeError(
|
|
28
|
+
"Agentbyte microwebui requires optional dependencies. "
|
|
29
|
+
"Install with `uv sync --extra webui` or `pip install agentbyte[webui]`."
|
|
30
|
+
) from exc
|
|
31
|
+
return FastAPI, HTTPException, FileResponse, EventSourceResponse, ServerSentEvent
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class ChatRequest(BaseModel):
|
|
35
|
+
"""Incoming chat payload."""
|
|
36
|
+
|
|
37
|
+
message: str
|
|
38
|
+
session_id: str | None = None
|
|
39
|
+
agent_name: str | None = None
|
|
40
|
+
user_id: str | None = None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class AgentSummary(BaseModel):
|
|
44
|
+
"""Compact agent metadata for the discovery dropdown."""
|
|
45
|
+
|
|
46
|
+
name: str
|
|
47
|
+
description: str
|
|
48
|
+
default: bool = False
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class SessionSummary(BaseModel):
|
|
52
|
+
"""Compact session metadata for the session picker."""
|
|
53
|
+
|
|
54
|
+
session_id: str
|
|
55
|
+
message_count: int
|
|
56
|
+
created_at: str | None = None
|
|
57
|
+
updated_at: str | None = None
|
|
58
|
+
preview: str | None = None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class SessionEvent(BaseModel):
|
|
62
|
+
"""Stored SSE-style event payload for a past run."""
|
|
63
|
+
|
|
64
|
+
run_index: int
|
|
65
|
+
run_label: str
|
|
66
|
+
prompt: str
|
|
67
|
+
agent_name: str
|
|
68
|
+
event: dict[str, Any]
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _serialize_stream_item(item: Any) -> str:
|
|
72
|
+
"""Serialize Agentbyte stream items to JSON for SSE output."""
|
|
73
|
+
if hasattr(item, "model_dump_json"):
|
|
74
|
+
return item.model_dump_json()
|
|
75
|
+
|
|
76
|
+
if hasattr(item, "model_dump"):
|
|
77
|
+
return json.dumps(item.model_dump(mode="json"))
|
|
78
|
+
|
|
79
|
+
return json.dumps(
|
|
80
|
+
{
|
|
81
|
+
"event_type": "unknown",
|
|
82
|
+
"content": str(item),
|
|
83
|
+
"python_type": type(item).__name__,
|
|
84
|
+
}
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _parse_stream_item(item: Any) -> dict[str, Any]:
|
|
89
|
+
"""Parse a stream item into a JSON-friendly dict."""
|
|
90
|
+
return json.loads(_serialize_stream_item(item))
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _iter_visible_messages(context: AgentContext) -> Iterable[dict[str, Any]]:
|
|
94
|
+
"""Yield user/assistant/tool messages with JSON-friendly shape."""
|
|
95
|
+
for message in context.messages:
|
|
96
|
+
if hasattr(message, "model_dump"):
|
|
97
|
+
yield message.model_dump(mode="json")
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _session_preview(context: AgentContext) -> str | None:
|
|
101
|
+
"""Return a short preview for a stored session."""
|
|
102
|
+
for message in context.messages:
|
|
103
|
+
role = getattr(message, "role", None)
|
|
104
|
+
content = getattr(message, "content", None)
|
|
105
|
+
if role == "user" and content:
|
|
106
|
+
return str(content)[:72]
|
|
107
|
+
return None
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _stored_event_stream(context: AgentContext) -> list[dict[str, Any]]:
|
|
111
|
+
"""Return the stored event stream list from session metadata."""
|
|
112
|
+
events = context.metadata.get(EVENT_STREAM_KEY, [])
|
|
113
|
+
return events if isinstance(events, list) else []
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _next_run_index(context: AgentContext) -> int:
|
|
117
|
+
"""Return the next run index for this stored session."""
|
|
118
|
+
current_value = context.metadata.get(RUN_COUNTER_KEY, 0)
|
|
119
|
+
return int(current_value) + 1
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class MicroWebUIServer:
|
|
123
|
+
"""Serve a small multi-agent web UI from a list of Agent objects."""
|
|
124
|
+
|
|
125
|
+
def __init__(self, entities: Sequence[Agent]) -> None:
|
|
126
|
+
if not entities:
|
|
127
|
+
raise ValueError("microwebui requires at least one agent")
|
|
128
|
+
|
|
129
|
+
self.entities = list(entities)
|
|
130
|
+
self.entity_lookup = {entity.name: entity for entity in self.entities}
|
|
131
|
+
self.session_store = InMemorySessionStore()
|
|
132
|
+
|
|
133
|
+
def default_agent(self) -> Agent:
|
|
134
|
+
"""Return the first registered agent as the default selection."""
|
|
135
|
+
return self.entities[0]
|
|
136
|
+
|
|
137
|
+
def resolve_agent(self, agent_name: str | None, http_exception: Any) -> Agent:
|
|
138
|
+
"""Resolve a requested agent name or fall back to the default agent."""
|
|
139
|
+
if agent_name is None:
|
|
140
|
+
return self.default_agent()
|
|
141
|
+
|
|
142
|
+
agent = self.entity_lookup.get(agent_name)
|
|
143
|
+
if agent is None:
|
|
144
|
+
raise http_exception(status_code=404, detail=f"Unknown agent: {agent_name}")
|
|
145
|
+
return agent
|
|
146
|
+
|
|
147
|
+
async def stream_agent_events(
|
|
148
|
+
self,
|
|
149
|
+
message: str,
|
|
150
|
+
session_id: str | None,
|
|
151
|
+
agent_name: str | None,
|
|
152
|
+
user_id: str | None,
|
|
153
|
+
http_exception: Any,
|
|
154
|
+
server_sent_event: Any,
|
|
155
|
+
):
|
|
156
|
+
"""Stream agent execution as SSE and persist emitted events in memory."""
|
|
157
|
+
selected_agent = self.resolve_agent(agent_name, http_exception)
|
|
158
|
+
effective_session_id = session_id or str(uuid4())
|
|
159
|
+
context = await self.session_store.get(effective_session_id)
|
|
160
|
+
if context is None:
|
|
161
|
+
context = AgentContext(session_id=effective_session_id, user_id=user_id)
|
|
162
|
+
else:
|
|
163
|
+
context.session_id = effective_session_id
|
|
164
|
+
if user_id is not None:
|
|
165
|
+
context.user_id = user_id
|
|
166
|
+
|
|
167
|
+
current_run_index = _next_run_index(context)
|
|
168
|
+
current_run_events: list[SessionEvent] = []
|
|
169
|
+
|
|
170
|
+
async for event in selected_agent.run_stream(
|
|
171
|
+
message,
|
|
172
|
+
context=context,
|
|
173
|
+
verbose=True,
|
|
174
|
+
stream_tokens=True,
|
|
175
|
+
):
|
|
176
|
+
event_payload = _parse_stream_item(event)
|
|
177
|
+
current_run_events.append(
|
|
178
|
+
SessionEvent(
|
|
179
|
+
run_index=current_run_index,
|
|
180
|
+
run_label=f"Run {current_run_index}",
|
|
181
|
+
prompt=message,
|
|
182
|
+
agent_name=selected_agent.name,
|
|
183
|
+
event=event_payload,
|
|
184
|
+
)
|
|
185
|
+
)
|
|
186
|
+
if isinstance(event, AgentResponse):
|
|
187
|
+
event.context.metadata[EVENT_STREAM_KEY] = [
|
|
188
|
+
*_stored_event_stream(event.context),
|
|
189
|
+
*(stored_event.model_dump(mode="json") for stored_event in current_run_events),
|
|
190
|
+
]
|
|
191
|
+
event.context.metadata[RUN_COUNTER_KEY] = current_run_index
|
|
192
|
+
await self.session_store.save(effective_session_id, event.context)
|
|
193
|
+
yield server_sent_event(data=event_payload)
|
|
194
|
+
|
|
195
|
+
def create_app(self) -> Any:
|
|
196
|
+
"""Build the FastAPI application for the microwebui server."""
|
|
197
|
+
FastAPI, HTTPException, FileResponse, EventSourceResponse, ServerSentEvent = (
|
|
198
|
+
_require_fastapi()
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
app = FastAPI(title="Agentbyte MicroWebUI")
|
|
202
|
+
|
|
203
|
+
@app.post("/chat/stream", response_class=EventSourceResponse)
|
|
204
|
+
async def chat_stream(request: ChatRequest) -> Any:
|
|
205
|
+
async for event in self.stream_agent_events(
|
|
206
|
+
request.message,
|
|
207
|
+
request.session_id,
|
|
208
|
+
request.agent_name,
|
|
209
|
+
request.user_id,
|
|
210
|
+
HTTPException,
|
|
211
|
+
ServerSentEvent,
|
|
212
|
+
):
|
|
213
|
+
yield event
|
|
214
|
+
|
|
215
|
+
@app.get("/api/agents")
|
|
216
|
+
async def list_agents() -> list[AgentSummary]:
|
|
217
|
+
default_name = self.default_agent().name
|
|
218
|
+
return [
|
|
219
|
+
AgentSummary(
|
|
220
|
+
name=agent.name,
|
|
221
|
+
description=getattr(agent, "description", "") or "",
|
|
222
|
+
default=agent.name == default_name,
|
|
223
|
+
)
|
|
224
|
+
for agent in self.entities
|
|
225
|
+
]
|
|
226
|
+
|
|
227
|
+
@app.get("/api/sessions")
|
|
228
|
+
async def list_sessions(user_id: str | None = None) -> list[SessionSummary]:
|
|
229
|
+
session_items = (
|
|
230
|
+
await self.session_store.list_by_user(user_id)
|
|
231
|
+
if user_id
|
|
232
|
+
else await self.session_store.list()
|
|
233
|
+
)
|
|
234
|
+
sessions = [
|
|
235
|
+
SessionSummary(
|
|
236
|
+
session_id=session_id,
|
|
237
|
+
message_count=len(context.messages),
|
|
238
|
+
created_at=context.created_at.isoformat() if context.created_at else None,
|
|
239
|
+
updated_at=context.updated_at.isoformat() if context.updated_at else None,
|
|
240
|
+
preview=_session_preview(context),
|
|
241
|
+
)
|
|
242
|
+
for session_id, context in session_items
|
|
243
|
+
]
|
|
244
|
+
sessions.sort(
|
|
245
|
+
key=lambda session: session.updated_at or session.created_at or "",
|
|
246
|
+
reverse=True,
|
|
247
|
+
)
|
|
248
|
+
return sessions
|
|
249
|
+
|
|
250
|
+
@app.get("/api/sessions/{session_id}")
|
|
251
|
+
async def get_session(session_id: str) -> dict[str, Any]:
|
|
252
|
+
context = await self.session_store.get(session_id)
|
|
253
|
+
if context is None:
|
|
254
|
+
raise HTTPException(status_code=404, detail="Session not found")
|
|
255
|
+
|
|
256
|
+
return {
|
|
257
|
+
"session_id": session_id,
|
|
258
|
+
"message_count": len(context.messages),
|
|
259
|
+
"context": context.model_dump(mode="json"),
|
|
260
|
+
"visible_messages": list(_iter_visible_messages(context)),
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
@app.get("/api/sessions/{session_id}/events")
|
|
264
|
+
async def get_session_events(session_id: str) -> dict[str, Any]:
|
|
265
|
+
context = await self.session_store.get(session_id)
|
|
266
|
+
if context is None:
|
|
267
|
+
raise HTTPException(status_code=404, detail="Session not found")
|
|
268
|
+
|
|
269
|
+
events = _stored_event_stream(context)
|
|
270
|
+
return {
|
|
271
|
+
"session_id": session_id,
|
|
272
|
+
"event_count": len(events),
|
|
273
|
+
"events": events,
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
@app.get("/")
|
|
277
|
+
async def serve_frontend() -> Any:
|
|
278
|
+
return FileResponse(UI_INDEX)
|
|
279
|
+
|
|
280
|
+
return app
|
|
281
|
+
|
|
282
|
+
def serve(self, host: str = "127.0.0.1", port: int = 8070) -> None:
|
|
283
|
+
"""Run the microwebui application with uvicorn."""
|
|
284
|
+
try:
|
|
285
|
+
import uvicorn
|
|
286
|
+
except ImportError as exc:
|
|
287
|
+
raise RuntimeError(
|
|
288
|
+
"Agentbyte microwebui requires optional dependencies. "
|
|
289
|
+
"Install with `uv sync --extra webui` or `pip install agentbyte[webui]`."
|
|
290
|
+
) from exc
|
|
291
|
+
|
|
292
|
+
print(f"Starting Agentbyte MicroWebUI on http://{host}:{port}/")
|
|
293
|
+
uvicorn.run(self.create_app(), host=host, port=port)
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
def create_app(entities: Sequence[Agent]) -> Any:
|
|
297
|
+
"""Create a FastAPI app for the given list of agents."""
|
|
298
|
+
return MicroWebUIServer(entities).create_app()
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def serve(
|
|
302
|
+
entities: Sequence[Agent],
|
|
303
|
+
host: str = "127.0.0.1",
|
|
304
|
+
port: int = 8070,
|
|
305
|
+
) -> None:
|
|
306
|
+
"""Serve a minimal built-in web UI for the given list of agents."""
|
|
307
|
+
MicroWebUIServer(entities).serve(host=host, port=port)
|