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.
Files changed (274) hide show
  1. agentbyte-0.7.0/.github/skills/agentbyte-fastapi-sse-streaming/SKILL.md +114 -0
  2. {agentbyte-0.5.0 → agentbyte-0.7.0}/CHANGELOG.md +39 -0
  3. {agentbyte-0.5.0 → agentbyte-0.7.0}/PKG-INFO +29 -4
  4. {agentbyte-0.5.0 → agentbyte-0.7.0}/README.md +27 -2
  5. {agentbyte-0.5.0 → agentbyte-0.7.0}/pyproject.toml +3 -3
  6. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/__about__.py +1 -1
  7. agentbyte-0.7.0/src/agentbyte/microwebui/__init__.py +9 -0
  8. agentbyte-0.7.0/src/agentbyte/microwebui/server.py +307 -0
  9. agentbyte-0.7.0/src/agentbyte/microwebui/ui/index.html +1499 -0
  10. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/cli/test_create_skills.py +1 -0
  11. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-agent-as-tool/SKILL.md +0 -0
  12. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-ai-driven-orchestration/SKILL.md +0 -0
  13. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-dataset/SKILL.md +0 -0
  14. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-function-tools/SKILL.md +0 -0
  15. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-handoff-orchestration/SKILL.md +0 -0
  16. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-list-memory/SKILL.md +0 -0
  17. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-llm-client/SKILL.md +0 -0
  18. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-memory-tool/SKILL.md +0 -0
  19. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-middleware/SKILL.md +0 -0
  20. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-multi-turn-context/SKILL.md +0 -0
  21. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-otel-tracing/SKILL.md +0 -0
  22. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-plan-based-orchestration/SKILL.md +0 -0
  23. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-round-robin-orchestration/SKILL.md +0 -0
  24. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-simple-agent/SKILL.md +0 -0
  25. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-tool-approval/SKILL.md +0 -0
  26. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/agentbyte-workflow/SKILL.md +0 -0
  27. {agentbyte-0.5.0 → agentbyte-0.7.0}/.github/skills/skill-authoring/SKILL.md +0 -0
  28. {agentbyte-0.5.0 → agentbyte-0.7.0}/.gitignore +0 -0
  29. {agentbyte-0.5.0 → agentbyte-0.7.0}/LICENSE +0 -0
  30. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/__init__.py +0 -0
  31. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/agents/__init__.py +0 -0
  32. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/agents/agent.py +0 -0
  33. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/agents/agent_as_tool.py +0 -0
  34. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/agents/base.py +0 -0
  35. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/agents/types.py +0 -0
  36. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/cancellation_token.py +0 -0
  37. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/cli/__init__.py +0 -0
  38. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/cli/main.py +0 -0
  39. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/component.py +0 -0
  40. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/context.py +0 -0
  41. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/__init__.py +0 -0
  42. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/base.py +0 -0
  43. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/config.py +0 -0
  44. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/json.py +0 -0
  45. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/loader.py +0 -0
  46. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/loaders.py +0 -0
  47. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/sources.py +0 -0
  48. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/dataset/sqlite.py +0 -0
  49. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/entity.py +0 -0
  50. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/__init__.py +0 -0
  51. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/_retry_observability.py +0 -0
  52. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/auth.py +0 -0
  53. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/azure/__init__.py +0 -0
  54. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/azure/auth.py +0 -0
  55. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/azure/chat.py +0 -0
  56. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/azure/embedding.py +0 -0
  57. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/azure/settings.py +0 -0
  58. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/azure_openai.py +0 -0
  59. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
  60. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/base.py +0 -0
  61. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/embeddings_base.py +0 -0
  62. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/openai/__init__.py +0 -0
  63. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/openai/chat.py +0 -0
  64. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/openai/embedding.py +0 -0
  65. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/openai/settings.py +0 -0
  66. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/openai.py +0 -0
  67. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/openai_embedding.py +0 -0
  68. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/pricing.py +0 -0
  69. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/retry_policy.py +0 -0
  70. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/settings.py +0 -0
  71. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/llm/types.py +0 -0
  72. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/memory/__init__.py +0 -0
  73. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/memory/base.py +0 -0
  74. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/messages.py +0 -0
  75. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/middleware/__init__.py +0 -0
  76. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/middleware/base.py +0 -0
  77. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/middleware/otel.py +0 -0
  78. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/middleware/retry.py +0 -0
  79. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/notebook.py +0 -0
  80. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/orchestration/__init__.py +0 -0
  81. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/orchestration/ai.py +0 -0
  82. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/orchestration/base.py +0 -0
  83. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/orchestration/handoff.py +0 -0
  84. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/orchestration/plan.py +0 -0
  85. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/orchestration/policies.py +0 -0
  86. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/orchestration/round_robin.py +0 -0
  87. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/presets/__init__.py +0 -0
  88. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/presets/agents.py +0 -0
  89. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/presets/clients.py +0 -0
  90. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/presets/orchestration.py +0 -0
  91. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/presets/workflow.py +0 -0
  92. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/session_store.py +0 -0
  93. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/__init__.py +0 -0
  94. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/base.py +0 -0
  95. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/cancellation.py +0 -0
  96. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/composite.py +0 -0
  97. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/consecutive_agent.py +0 -0
  98. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/external.py +0 -0
  99. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/function_call.py +0 -0
  100. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/handoff.py +0 -0
  101. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/max_message.py +0 -0
  102. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/predicate.py +0 -0
  103. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/source.py +0 -0
  104. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/text_mention.py +0 -0
  105. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/timeout.py +0 -0
  106. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/termination/token_usage.py +0 -0
  107. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/tools/__init__.py +0 -0
  108. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/tools/base.py +0 -0
  109. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/tools/core_tools.py +0 -0
  110. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/tools/decorator.py +0 -0
  111. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/tools/memory_tool.py +0 -0
  112. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/types.py +0 -0
  113. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/__init__.py +0 -0
  114. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/agent_framework_devui/ui/assets/index-BzhEszHZ.css +0 -0
  115. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/agent_framework_devui/ui/assets/index-DByFJNGD.js +0 -0
  116. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/agent_framework_devui/ui/index.html +0 -0
  117. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/agent_framework_devui/ui/vite.svg +0 -0
  118. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/discovery.py +0 -0
  119. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/execution.py +0 -0
  120. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/.gitignore +0 -0
  121. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/README.md +0 -0
  122. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/components.json +0 -0
  123. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/eslint.config.js +0 -0
  124. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/index.html +0 -0
  125. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/package.json +0 -0
  126. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/plan.md +0 -0
  127. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/public/vite.svg +0 -0
  128. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/App.css +0 -0
  129. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/App.tsx +0 -0
  130. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/assets/react.svg +0 -0
  131. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/agent/agent-view.tsx +0 -0
  132. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/message_renderer/ContentRenderer.tsx +0 -0
  133. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/message_renderer/MessageRenderer.tsx +0 -0
  134. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/message_renderer/index.ts +0 -0
  135. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/message_renderer/types.ts +0 -0
  136. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/mode-toggle.tsx +0 -0
  137. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/orchestrator/orchestrator-view.tsx +0 -0
  138. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/app-header.tsx +0 -0
  139. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/chat-base.tsx +0 -0
  140. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/context-inspector.tsx +0 -0
  141. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/debug-panel.tsx +0 -0
  142. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/entity-selector.tsx +0 -0
  143. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/example-tasks-display.tsx +0 -0
  144. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/examples-gallery.tsx +0 -0
  145. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/session-switcher.tsx +0 -0
  146. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/shared/tool-approval-banner.tsx +0 -0
  147. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/theme-provider.tsx +0 -0
  148. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/attachment-gallery.tsx +0 -0
  149. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/badge.tsx +0 -0
  150. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/button.tsx +0 -0
  151. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/card.tsx +0 -0
  152. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/dialog.tsx +0 -0
  153. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/dropdown-menu.tsx +0 -0
  154. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/file-upload.tsx +0 -0
  155. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/input.tsx +0 -0
  156. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/label.tsx +0 -0
  157. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/loading-spinner.tsx +0 -0
  158. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/loading-state.tsx +0 -0
  159. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/message-input.tsx +0 -0
  160. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/scroll-area.tsx +0 -0
  161. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/slider.tsx +0 -0
  162. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/tabs.tsx +0 -0
  163. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/ui/textarea.tsx +0 -0
  164. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/components/workflow/workflow-view.tsx +0 -0
  165. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/hooks/messageHandlers.ts +0 -0
  166. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/hooks/useEntityExecution.ts +0 -0
  167. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/index.css +0 -0
  168. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/main.tsx +0 -0
  169. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/services/api.ts +0 -0
  170. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/types/index.ts +0 -0
  171. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/types/picoagents.ts +0 -0
  172. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/utils/message-utils.ts +0 -0
  173. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/src/vite-env.d.ts +0 -0
  174. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/tsconfig.app.json +0 -0
  175. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/tsconfig.json +0 -0
  176. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/tsconfig.node.json +0 -0
  177. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/vite.config.ts +0 -0
  178. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/frontend/yarn.lock +0 -0
  179. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/models.py +0 -0
  180. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/registry.py +0 -0
  181. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/server.py +0 -0
  182. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/session_store.py +0 -0
  183. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/sessions.py +0 -0
  184. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/ui/assets/index-CWk64UM3.js +0 -0
  185. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/ui/assets/index-vt1cujlT.css +0 -0
  186. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/ui/index.html +0 -0
  187. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/webui/ui/vite.svg +0 -0
  188. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/__init__.py +0 -0
  189. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/agent.py +0 -0
  190. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/core/__init__.py +0 -0
  191. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
  192. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/core/checkpoint.py +0 -0
  193. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/core/models.py +0 -0
  194. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/core/runner.py +0 -0
  195. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/core/workflow.py +0 -0
  196. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/defaults.py +0 -0
  197. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/loader.py +0 -0
  198. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/schema.py +0 -0
  199. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/schema_utils.py +0 -0
  200. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/__init__.py +0 -0
  201. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/agentbyte_agent.py +0 -0
  202. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/echo.py +0 -0
  203. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/function.py +0 -0
  204. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/http.py +0 -0
  205. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/step.py +0 -0
  206. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
  207. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/steps/transform.py +0 -0
  208. {agentbyte-0.5.0 → agentbyte-0.7.0}/src/agentbyte/workflow/visualizer.py +0 -0
  209. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_agent_as_tool.py +0 -0
  210. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_agent_basic.py +0 -0
  211. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_agent_event_types.py +0 -0
  212. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_agent_memory_integration.py +0 -0
  213. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_agent_middleware_integration.py +0 -0
  214. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_agent_retry_middleware.py +0 -0
  215. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_agent_stream_events.py +0 -0
  216. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/agents/test_tool_approval.py +0 -0
  217. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/dataset/test_loader.py +0 -0
  218. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/llm/test_azure_client.py +0 -0
  219. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/llm/test_azure_embedding_client.py +0 -0
  220. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/llm/test_llm_types.py +0 -0
  221. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/llm/test_openai_client.py +0 -0
  222. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/llm/test_openai_embedding_client.py +0 -0
  223. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/llm/test_retry_observability.py +0 -0
  224. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/llm/test_retry_policy_api.py +0 -0
  225. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/memory/test_memory.py +0 -0
  226. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/middleware/test_middleware_chain.py +0 -0
  227. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/middleware/test_otel.py +0 -0
  228. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/middleware/test_retry_middleware.py +0 -0
  229. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/orchestration/test_ai_orchestrator.py +0 -0
  230. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/orchestration/test_base_orchestrator.py +0 -0
  231. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/orchestration/test_handoff_orchestrator.py +0 -0
  232. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/orchestration/test_plan_orchestrator.py +0 -0
  233. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/orchestration/test_round_robin.py +0 -0
  234. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/presets/test_agents.py +0 -0
  235. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/presets/test_clients.py +0 -0
  236. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/presets/test_orchestration.py +0 -0
  237. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/presets/test_workflow.py +0 -0
  238. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_base.py +0 -0
  239. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_cancellation.py +0 -0
  240. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_composite.py +0 -0
  241. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_consecutive_agent.py +0 -0
  242. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_external.py +0 -0
  243. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_function_call.py +0 -0
  244. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_handoff.py +0 -0
  245. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_max_message.py +0 -0
  246. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_predicate.py +0 -0
  247. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_source.py +0 -0
  248. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_text_mention.py +0 -0
  249. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_timeout.py +0 -0
  250. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/termination/test_token_usage.py +0 -0
  251. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/test_cancellation_token.py +0 -0
  252. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/test_context.py +0 -0
  253. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/test_messages.py +0 -0
  254. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/test_package_api.py +0 -0
  255. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/test_session_store.py +0 -0
  256. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/test_types.py +0 -0
  257. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/tools/test_memory_tool.py +0 -0
  258. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/tools/test_tools.py +0 -0
  259. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/webui/__init__.py +0 -0
  260. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/webui/helpers.py +0 -0
  261. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/webui/test_execution.py +0 -0
  262. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/webui/test_package_api.py +0 -0
  263. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/webui/test_registry.py +0 -0
  264. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/webui/test_server.py +0 -0
  265. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/webui/test_sessions.py +0 -0
  266. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_checkpoint.py +0 -0
  267. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_subworkflow_step.py +0 -0
  268. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_workflow_agent.py +0 -0
  269. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_workflow_class.py +0 -0
  270. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_workflow_models.py +0 -0
  271. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_workflow_runner.py +0 -0
  272. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_workflow_schema.py +0 -0
  273. {agentbyte-0.5.0 → agentbyte-0.7.0}/tests/workflow/test_workflow_steps.py +0 -0
  274. {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.5.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.42.0; extra == 'webui'
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.5.0/logo/agent-byte-avatar-low.png" alt="Agentbyte" width="200"/>
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.5.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.5.0/logo/agent-byte-avatar-low.png" alt="Agentbyte" width="200"/>
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.5.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.42.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.42.0",
129
+ "uvicorn[standard]>=0.44.0",
130
130
  ]
131
131
 
132
132
  [tool.pytest.ini_options]
@@ -1,2 +1,2 @@
1
- __version__ = "0.5.0"
1
+ __version__ = "0.7.0"
2
2
  VERSION = __version__
@@ -0,0 +1,9 @@
1
+ """Minimal built-in web UI for small Agentbyte demos."""
2
+
3
+ from agentbyte.microwebui.server import MicroWebUIServer, create_app, serve
4
+
5
+ __all__ = [
6
+ "MicroWebUIServer",
7
+ "create_app",
8
+ "serve",
9
+ ]
@@ -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)