databricks-agentbricks 0.3.0__tar.gz → 0.4.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 (164) hide show
  1. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/PKG-INFO +159 -27
  2. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/README.md +156 -25
  3. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/pyproject.toml +3 -2
  4. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/agent_project.py +24 -2
  5. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/app_resources.py +198 -1
  6. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/app.py +2 -0
  7. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/app_auth.py +11 -8
  8. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/deploy.py +60 -10
  9. databricks_agentbricks-0.4.0/src/databricks_agentbricks/cli/doctor.py +1127 -0
  10. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/endpoint.py +14 -9
  11. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/endpoint_examples.py +2 -2
  12. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/help.py +43 -1
  13. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/memory.py +4 -0
  14. databricks_agentbricks-0.4.0/src/databricks_agentbricks/cli/pipeline.py +200 -0
  15. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/tools.py +27 -2
  16. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-bricks-migrate/SKILL.md +9 -6
  17. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/AGENTKIT_CONTRACT.md +11 -1
  18. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/README.md +12 -9
  19. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/agent/agent.py +3 -1
  20. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/pyproject.toml +1 -1
  21. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/runtime/adapter.py +24 -14
  22. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/tests/test_agent.py +21 -4
  23. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/AGENTKIT_CONTRACT.md +7 -1
  24. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/AGENTS.md +7 -5
  25. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/README.md +12 -9
  26. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/pyproject.toml +1 -1
  27. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/runtime/adapter.py +8 -11
  28. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/tests/test_agent.py +10 -5
  29. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-langgraph/pyproject.toml +1 -1
  30. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-openai/pyproject.toml +1 -1
  31. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-langgraph/CHAT_APP.md +3 -3
  32. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-langgraph/runtime/ui.py +2 -4
  33. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-langgraph/tests/test_demo_ui.py +41 -3
  34. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-langgraph/ui/app.js +18 -13
  35. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-openai/CHAT_APP.md +3 -3
  36. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-openai/runtime/ui.py +2 -4
  37. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-openai/tests/test_demo_ui.py +41 -3
  38. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-openai/ui/app.js +17 -12
  39. databricks_agentbricks-0.4.0/src/databricks_agentbricks/tool_access.py +364 -0
  40. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/_api_client.py +78 -0
  41. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/langgraph/mcp.py +2 -2
  42. databricks_agentbricks-0.4.0/src/databricks_agentkit/langgraph/responses.py +40 -0
  43. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/openai/mcp.py +9 -9
  44. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/ARCHITECTURE.md +20 -3
  45. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/README.md +9 -4
  46. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/app.py +46 -21
  47. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/auth.py +18 -5
  48. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/durability/execution.py +42 -14
  49. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/durability/lakebase_runtime_store.py +222 -43
  50. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/execution.py +49 -14
  51. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/runtime.py +39 -13
  52. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/store.py +113 -18
  53. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/tool_manifest.py +106 -9
  54. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/types.py +9 -3
  55. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/.gitignore +0 -0
  56. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/NOTICE +0 -0
  57. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/__init__.py +0 -0
  58. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/_group.py +0 -0
  59. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/__init__.py +0 -0
  60. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/auth.py +0 -0
  61. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/dev.py +0 -0
  62. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/endpoint_output.py +0 -0
  63. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/endpoint_request.py +0 -0
  64. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/endpoint_transport.py +0 -0
  65. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/init.py +0 -0
  66. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/mcp.py +0 -0
  67. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/sandbox.py +0 -0
  68. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/sessions.py +0 -0
  69. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/cli/tracing.py +0 -0
  70. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/databricks_cli.py +0 -0
  71. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/errors.py +0 -0
  72. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/lakebase_runtime_store.py +0 -0
  73. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/legacy_lakebase_runtime_store.py +0 -0
  74. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/project_config.py +0 -0
  75. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/project_types.py +0 -0
  76. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/py.typed +0 -0
  77. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/render.py +0 -0
  78. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/.env.example +0 -0
  79. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/.gitignore +0 -0
  80. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/AGENTS.md +0 -0
  81. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/CLAUDE.md +0 -0
  82. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/agent/__init__.py +0 -0
  83. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/agent/mcps.py +0 -0
  84. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/agent/tools/__init__.py +0 -0
  85. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/agent/tools/sample_tool.py +0 -0
  86. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/agent/tools/send_message.py +0 -0
  87. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/app.yaml +0 -0
  88. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/runtime/__init__.py +0 -0
  89. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/runtime/main.py +0 -0
  90. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/tests/__init__.py +0 -0
  91. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/tests/test_runtime.py +0 -0
  92. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-langgraph/tests/test_workspace.py +0 -0
  93. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/.env.example +0 -0
  94. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/.gitignore +0 -0
  95. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/CLAUDE.md +0 -0
  96. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/agent/__init__.py +0 -0
  97. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/agent/agent.py +0 -0
  98. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/agent/mcps.py +0 -0
  99. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/agent/tools/__init__.py +0 -0
  100. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/agent/tools/sample_tool.py +0 -0
  101. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/agent/tools/send_message.py +0 -0
  102. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/app.yaml +0 -0
  103. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/runtime/__init__.py +0 -0
  104. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/runtime/main.py +0 -0
  105. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/tests/__init__.py +0 -0
  106. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/tests/test_runtime.py +0 -0
  107. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/agent-openai/tests/test_workspace.py +0 -0
  108. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-langgraph/.env.example +0 -0
  109. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-langgraph/.gitignore +0 -0
  110. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-langgraph/README.md +0 -0
  111. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-langgraph/agent/__init__.py +0 -0
  112. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-langgraph/agent/agent.py +0 -0
  113. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-langgraph/app.yaml +0 -0
  114. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-langgraph/runtime/__init__.py +0 -0
  115. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-langgraph/runtime/main.py +0 -0
  116. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-langgraph/tests/test_runtime.py +0 -0
  117. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-openai/.env.example +0 -0
  118. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-openai/.gitignore +0 -0
  119. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-openai/README.md +0 -0
  120. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-openai/agent/__init__.py +0 -0
  121. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-openai/agent/agent.py +0 -0
  122. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-openai/app.yaml +0 -0
  123. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-openai/runtime/__init__.py +0 -0
  124. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-openai/runtime/main.py +0 -0
  125. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/custom-agent-openai/tests/test_runtime.py +0 -0
  126. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/sandbox_mcp.py +0 -0
  127. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/sandbox_mcp_langgraph.py +0 -0
  128. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-langgraph/runtime/main.py +0 -0
  129. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-langgraph/ui/agentbricks-mark.png +0 -0
  130. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-langgraph/ui/index.html +0 -0
  131. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-langgraph/ui/styles.css +0 -0
  132. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-openai/runtime/main.py +0 -0
  133. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-openai/ui/agentbricks-mark.png +0 -0
  134. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-openai/ui/index.html +0 -0
  135. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/templates/ui/agent-openai/ui/styles.css +0 -0
  136. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/theme.py +0 -0
  137. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentbricks/trace_tables.py +0 -0
  138. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/__init__.py +0 -0
  139. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/_pagination.py +0 -0
  140. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/client.py +0 -0
  141. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/langgraph/__init__.py +0 -0
  142. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/langgraph/genie.py +0 -0
  143. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/langgraph/memory.py +0 -0
  144. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/langgraph/session_store.py +0 -0
  145. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/memory_store.py +0 -0
  146. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/models.py +0 -0
  147. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/openai/__init__.py +0 -0
  148. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/openai/genie.py +0 -0
  149. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/openai/memory.py +0 -0
  150. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/openai/sessions.py +0 -0
  151. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/py.typed +0 -0
  152. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/__init__.py +0 -0
  153. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/durability/__init__.py +0 -0
  154. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/durability/heartbeat.py +0 -0
  155. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/durability/recovery.py +0 -0
  156. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/durability/store.py +0 -0
  157. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/genie.py +0 -0
  158. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/mcp_auth.py +0 -0
  159. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/model_services.py +0 -0
  160. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/session_store_client.py +0 -0
  161. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/tracing.py +0 -0
  162. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/runtime/workspace.py +0 -0
  163. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/session_store.py +0 -0
  164. {databricks_agentbricks-0.3.0 → databricks_agentbricks-0.4.0}/src/databricks_agentkit/timefmt.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: databricks-agentbricks
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: Agent Bricks CLI and AgentKit SDK for custom agents on Databricks
5
5
  Author-email: Databricks <agent-feedback@databricks.com>
6
6
  License-File: NOTICE
@@ -10,6 +10,7 @@ Requires-Dist: databricks-ai-bridge[memory]>=0.22.0
10
10
  Requires-Dist: databricks-sdk>=0.124.0
11
11
  Requires-Dist: fastapi>=0.129.0
12
12
  Requires-Dist: mlflow-skinny>=3.10.1
13
+ Requires-Dist: packaging>=23.2
13
14
  Requires-Dist: psycopg[binary]>=3.1
14
15
  Requires-Dist: pyyaml>=6.0
15
16
  Requires-Dist: rich>=13.7
@@ -20,7 +21,7 @@ Requires-Dist: uvicorn>=0.20.0
20
21
  Provides-Extra: langgraph
21
22
  Requires-Dist: databricks-agents>=1.9.3; extra == 'langgraph'
22
23
  Requires-Dist: databricks-langchain>=0.17.0; extra == 'langgraph'
23
- Requires-Dist: langchain-mcp-adapters>=0.2.1; extra == 'langgraph'
24
+ Requires-Dist: langchain-mcp-adapters>=0.3.0; extra == 'langgraph'
24
25
  Requires-Dist: langchain>=1.0.0; extra == 'langgraph'
25
26
  Requires-Dist: langgraph>=1.1.0; extra == 'langgraph'
26
27
  Requires-Dist: mlflow>=3.10.1; extra == 'langgraph'
@@ -162,9 +163,9 @@ agentbricks deploy my-agent # deploy to Databricks
162
163
  local runtime so local behavior matches a deployment.
163
164
 
164
165
  `agentbricks deploy my-agent` deploys a Databricks App named `agent-bricks-my-agent`, provisions the
165
- stores declared in `agent.toml`, and grants the app's service principal access to them. Use
166
- `agentbricks deployments list` to find deployed apps, and `agentbricks deployments get agent-bricks-my-agent` to
167
- print an app's URL and status.
166
+ stores declared in `agent.toml`, and grants the app's service principal access to the stores and
167
+ direct App-auth tool resources declared there. Use `agentbricks deployments list` to find deployed
168
+ apps, and `agentbricks deployments get agent-bricks-my-agent` to print an app's URL and status.
168
169
 
169
170
  `agentbricks init` declares default memory and session stores in `agent.toml`, so the deployed agent has
170
171
  long-term memory and durable conversation history. It creates `<name>-<6-letter-token>-memory` and
@@ -263,12 +264,16 @@ Each managed run is an **invocation**. Send a client-generated UUID `id` and you
263
264
  ```json
264
265
  {
265
266
  "id": "550e8400-e29b-41d4-a716-446655440000",
267
+ "session_id": "support-case-123",
266
268
  "input": {"messages": [{"role": "user", "content": "Hello"}]},
267
269
  "background": true,
268
270
  "stream": true
269
271
  }
270
272
  ```
271
273
 
274
+ The optional top-level `session_id` groups invocations into one application session. It is distinct
275
+ from the invocation `id` and from the `X-Routing-Key` sticky-routing header.
276
+
272
277
  | Endpoint | Behavior |
273
278
  | --- | --- |
274
279
  | `POST /api/invocations` | Defaults to synchronous execution: `200` with the result under `output`. `stream: true` returns SSE events. `background: true` returns `202` with a status URL; adding `stream: true` also includes an events URL. |
@@ -469,6 +474,7 @@ agentbricks [-p <profile>] [-o text|json]
469
474
  [--disable-chat-app]
470
475
  [--memory-store NAME] [--session-store NAME]
471
476
  [--existing] [--profile P] [directory]
477
+ doctor [directory]
472
478
  dev [--source PATH] [--prepare-environment] [--app-port PORT]
473
479
  memory
474
480
  bind STORE [--source PATH]
@@ -485,7 +491,8 @@ agentbricks [-p <profile>] [-o text|json]
485
491
  unbind [--source PATH]
486
492
  list | get [--experiment-name NAME | --experiment-id ID] [--source PATH]
487
493
  tools
488
- add sandbox --scope SCOPE [--scope SCOPE ...] [--source PATH]
494
+ add sandbox --scope SCOPE [--scope SCOPE ...]
495
+ [--no-databricks-access-token-included] [--source PATH]
489
496
  add mcp SERVICE [--name NAME] [--source PATH]
490
497
  add uc-function FUNCTION [--name NAME] [--source PATH]
491
498
  add genie-one [--name NAME] [--auth user|app] [--source PATH]
@@ -508,6 +515,26 @@ agentbricks init --framework langgraph --existing .
508
515
  agentbricks init --framework openai --existing .
509
516
  ```
510
517
 
518
+ Before or after the conversion, inspect its progress without changing the repository or contacting
519
+ Databricks:
520
+
521
+ ```sh
522
+ agentbricks doctor .
523
+ agentbricks -o json doctor .
524
+ ```
525
+
526
+ Doctor exits 0 only when the project has a valid Agent Bricks manifest and matching project
527
+ metadata, uses the Agent Bricks server, declares the framework-appropriate `databricks-agentbricks`
528
+ extra and a non-empty `app.yaml` command, constructs `DurableAgentServer` with an `invoke` hook, and
529
+ calls a recognized adapter for the selected framework in production Python source. Test, example, and
530
+ old/stale directories do not count as source evidence. A failed report is the normal result for a
531
+ project that still needs migration; run
532
+ `agentbricks init --framework <framework_name> --existing <directory>` with the appropriate framework
533
+ to prepare the migration instructions. Doctor never imports or executes the target's source, and a
534
+ bounded source scan that exceeds a limit is reported while the evidence it already found still counts.
535
+ Its findings are static repository evidence, not proof that the configured startup command executes
536
+ the files it finds.
537
+
511
538
  This writes `agent-bricks-migrate/` containing a skill, a prompt to paste into your coding agent,
512
539
  `references/migration.json`, and a reference project generated from the templates bundled with the
513
540
  installed CLI. The bundle sits outside any single agent's configuration directory; `.claude/skills/`
@@ -544,11 +571,11 @@ server.
544
571
  ```sh
545
572
  agentbricks --profile <profile> endpoint invoke agent-bricks-my-agent \
546
573
  --path /api/invocations \
547
- --json '{"id":"00000000-0000-4000-8000-000000000001","input":[{"role":"user","content":"Hello"}]}'
574
+ --json '{"id":"00000000-0000-4000-8000-000000000001","session_id":"support-case-123","input":[{"role":"user","content":"Hello"}]}'
548
575
 
549
576
  agentbricks endpoint invoke --url http://localhost:8000 \
550
577
  --path /api/invocations \
551
- --json '{"id":"00000000-0000-4000-8000-000000000001","input":[{"role":"user","content":"Hello"}]}'
578
+ --json '{"id":"00000000-0000-4000-8000-000000000001","session_id":"support-case-123","input":[{"role":"user","content":"Hello"}]}'
552
579
  ```
553
580
 
554
581
  The JSON body remains explicit even for generated agents. For example, managed runtime agents require
@@ -556,21 +583,26 @@ a client-generated invocation ID, and streaming servers require their own stream
556
583
  `--sse` so the CLI consumes the response as Server-Sent Events.
557
584
 
558
585
  ```sh
586
+ SESSION_ID=$(uuidgen)
559
587
  INVOCATION_ID=$(uuidgen)
560
588
  agentbricks --profile <profile> endpoint invoke agent-bricks-my-agent \
561
589
  --path /api/invocations \
562
- --json "{\"id\":\"$INVOCATION_ID\",\"input\":[{\"role\":\"user\",\"content\":\"Run the report\"}]}"
590
+ --routing-key "$SESSION_ID" \
591
+ --json "{\"id\":\"$INVOCATION_ID\",\"session_id\":\"$SESSION_ID\",\"input\":[{\"role\":\"user\",\"content\":\"Run the report\"}]}"
563
592
 
593
+ INVOCATION_ID=$(uuidgen)
564
594
  agentbricks --profile <profile> endpoint invoke agent-bricks-my-agent \
565
595
  --path /api/invocations \
596
+ --routing-key "$SESSION_ID" \
566
597
  --sse \
567
- --json "{\"id\":\"$INVOCATION_ID\",\"input\":[{\"role\":\"user\",\"content\":\"Hello\"}],\"stream\":true}"
598
+ --json "{\"id\":\"$INVOCATION_ID\",\"session_id\":\"$SESSION_ID\",\"input\":[{\"role\":\"user\",\"content\":\"Hello\"}],\"stream\":true}"
568
599
  ```
569
600
 
570
- `--session-id` preserves one application session across calls by setting the Databricks Apps routing
571
- cookie. This also works with a direct App URL and with the generated runtime on localhost. OAuth and
572
- session headers are managed by the runtime; arbitrary custom request headers are intentionally not exposed
573
- by this command.
601
+ `--routing-key` keeps a session on one app replica (sticky routing): set it to your stable session id
602
+ and it is sent verbatim in the `X-Routing-Key` request header. It is routing only and is never used
603
+ as the session id - put the session id at the top level of the `--json` body for session continuity. This
604
+ also works with a direct App URL and with the generated runtime on localhost. OAuth and session headers are managed by
605
+ the runtime; arbitrary custom request headers are intentionally not exposed by this command.
574
606
 
575
607
  ## Command help
576
608
 
@@ -620,9 +652,79 @@ Managed-tool add commands write the selected identity to `agent.toml`; inspect t
620
652
  review configured bindings. Missing legacy auth continues to mean App identity at runtime; it is
621
653
  never silently upgraded to user identity.
622
654
 
623
- `DurableAgentServer` derives its request-auth policy directly from the managed tool bindings in `agent.toml`.
624
- Projects do not maintain a separate request-auth contract marker: the presence of any managed tool
625
- with `auth = "user"` makes the invocation require a transient request-user credential.
655
+ ### Automatic App-identity access on deploy
656
+
657
+ `agentbricks deploy` reconciles least-privilege access for resources explicitly declared by App/default
658
+ identity tool bindings. It skips every `auth = "user"` binding because those calls use the request
659
+ user's permissions instead of the App service principal.
660
+
661
+ | Explicit `agent.toml` resource | Automatic App service-principal access |
662
+ | --- | --- |
663
+ | UC function | Apps `uc_securable`: `FUNCTION` / `EXECUTE` |
664
+ | Genie Agent space | Apps `genie_space`: `CAN_RUN` |
665
+ | Sandbox table scope | Apps `uc_securable`: `TABLE` / `SELECT` or `MODIFY` |
666
+ | Sandbox volume scope | Apps `uc_securable`: `VOLUME` / `READ_VOLUME` or `WRITE_VOLUME` |
667
+ | Sandbox Workspace path | Workspace ACL: `CAN_READ` or `CAN_EDIT` |
668
+ | External MCP service | Unity Catalog: effective `EXECUTE` plus `USE_SCHEMA` and `USE_CATALOG` on its named parents |
669
+ | Built-in `system.ai` MCP service, including Sandbox and Genie One | Platform-managed access defaults; Agent Bricks does not mutate system securables |
670
+
671
+ Native Genie One has no resource identifier in its binding, so it does not add a resource-specific
672
+ grant. Use a Genie Agent binding when the App identity should be scoped to one explicit Genie Space.
673
+
674
+ Apps-backed tool resources are named deterministically and reconciled to the manifest on each
675
+ deploy: removing a binding removes that Agent Bricks-owned Apps resource while preserving Runtime
676
+ Store, tracing, and user-owned resources. MCP and Workspace ACL grants are additive in this release
677
+ because their permission APIs do not expose trustworthy Agent Bricks ownership metadata; removing
678
+ those bindings does not revoke an independently valid grant.
679
+
680
+ Only direct resources are automatic. Agent Bricks never discovers or grants tables and warehouses
681
+ used by a Genie Space, objects called by a UC function, or resources wrapped by an MCP service.
682
+ Grant those transitive dependencies manually when the called service uses the App identity. If any
683
+ required direct grant cannot be read, applied, or verified, deploy stops before source upload and
684
+ leaves the currently deployed version untouched.
685
+
686
+ `DurableAgentServer` derives its request-auth policy directly from the managed tool bindings in
687
+ `agent.toml`. Projects do not maintain a separate request-auth contract marker: a managed tool with
688
+ `auth = "user"` requires a transient request-user credential. Code-first tools can declare any
689
+ additional API scopes that Agent Bricks cannot infer from Python:
690
+
691
+ ```toml
692
+ [auth.user]
693
+ required = true
694
+ additional_api_scopes = ["sql"]
695
+ ```
696
+
697
+ `additional_api_scopes` is additive: deploy unions it with scopes inferred from managed bindings,
698
+ deduplicates the result, and preserves unrelated scopes already configured on the App. Scope names
699
+ are not restricted to a client-side allowlist; Databricks Apps validates whether a requested scope
700
+ is supported. Entries must be non-empty strings without surrounding whitespace or control
701
+ characters, and a non-empty list requires `required = true`. This request-auth contract is supported
702
+ only with `[agent].server = "agentbricks"`.
703
+
704
+ Generated framework adapters pass the request-bound resolver to agent construction. A code-first
705
+ tool should obtain its user client from that resolver inside the active invocation rather than
706
+ creating or persisting a user credential:
707
+
708
+ ```python
709
+ from langchain_core.tools import tool
710
+
711
+
712
+ def sql_tools(workspace_client_for):
713
+ @tool
714
+ def run_statement(statement: str) -> str:
715
+ client = workspace_client_for("user")
716
+ response = client.statement_execution.execute_statement(
717
+ warehouse_id="...",
718
+ statement=statement,
719
+ )
720
+ return str(response.result)
721
+
722
+ return [run_statement]
723
+ ```
724
+
725
+ The resolver is request-bound and closes after the attempt. Agent Bricks does not inject it into
726
+ arbitrary auto-discovered decorated tools; build those tools from the resolver passed to the
727
+ generated request-aware agent function.
626
728
 
627
729
  Request-user invocations use the same synchronous, streaming, background, status, event-replay,
628
730
  and idempotency APIs as app-auth invocations. The Runtime Store records only token-free request
@@ -638,13 +740,18 @@ upgrade copied Python adapter code. Outdated adapters fail closed rather than si
638
740
  identity. App-only legacy projects and generic bring-your-own source directories keep the existing
639
741
  path.
640
742
 
641
- Deploy derives Apps user scopes from explicit `auth = "user"` bindings:
743
+ Deploy derives Apps user scopes from explicit `auth = "user"` bindings and unions them with
744
+ `[auth.user].additional_api_scopes`:
642
745
 
643
746
  | Binding | Requested Apps scopes |
644
747
  | --- | --- |
645
748
  | Managed MCP (governed ingress) | `ai-gateway` |
749
+ | `system.ai.dbsql` | `ai-gateway`, `sql` |
646
750
  | `system.ai.genie_one_mcp` | `ai-gateway`, `genie` |
751
+ | Sandbox with a Volume downscope | `ai-gateway`, `files` |
647
752
  | First-class Genie One or Genie Agent | `genie` |
753
+ | Sandbox with token injection | `ai-gateway`, `workspace.workspace` |
754
+ | Sandbox with token injection disabled | `ai-gateway` |
648
755
 
649
756
  For example, bind Genie tools in a current project with `server = "agentbricks"`:
650
757
 
@@ -653,7 +760,8 @@ agentbricks tools add mcp system.ai.genie_one_mcp --auth user
653
760
  agentbricks tools add genie-agent SPACE_ID --auth user
654
761
  ```
655
762
 
656
- Mixed bindings request the union. App-auth and legacy bindings add no user scopes. These are
763
+ Mixed bindings and explicit additions request the union. App-auth and legacy bindings add no user
764
+ scopes. These are
657
765
  explicit service-consent scopes, not a claim that gateway access alone authorizes the downstream
658
766
  resource. OAuth consent does not grant Unity Catalog privileges: the user still needs access to
659
767
  the configured Genie Space and its underlying data.
@@ -670,10 +778,15 @@ The `system.ai.dbsql` managed MCP additionally requests the Apps `sql` user scop
670
778
  API consent, not `sql:restricted-query`; read-only enforcement remains the service policy plus the
671
779
  requesting user's Unity Catalog grants. DBSQL does not use Databricks Connect.
672
780
 
673
- A sandbox binding with a Volume downscope additionally requests the Apps `files` user scope.
781
+ When a user-auth sandbox has `databricks_access_token_included = true`, it requests the Apps
782
+ `workspace.workspace` user scope so the injected credential can call workspace APIs. A sandbox
783
+ binding with a Volume downscope additionally requests the Apps `files` user scope.
674
784
  OAuth consent does not grant Volume access: the requesting user still needs the corresponding
675
- Unity Catalog privileges, and the sandbox downscope remains authoritative. Table-only sandbox
676
- bindings request `ai-gateway` but do not request `files`.
785
+ Unity Catalog privileges, and the sandbox downscope remains authoritative. A sandbox binding with
786
+ token injection disabled does not request `workspace.workspace`; its other resource-derived scopes
787
+ still apply. Databricks Apps rejects the legacy bare `workspace` scope, so Agent Bricks requests
788
+ `workspace.workspace`. These scopes are requested only for `auth = "user"`; `auth = "app"` uses
789
+ the App service principal's permissions instead.
677
790
 
678
791
  Review the target App's scopes and coordinate with its other owners before allowing the update. Once
679
792
  those scopes are present, later deploys do not need the flag. The CLI preserves unrelated scopes,
@@ -772,7 +885,24 @@ do not generate or patch Python tool code, and do not alter the manifest's `[[to
772
885
  Sandbox scopes default to read-only access. Repeat `--scope` to allow more than one resource, use
773
886
  `volume:` or `workspace:` for those resource types, and use `--permission read_write` only when the
774
887
  agent needs writes. Every sandbox call carries this fixed downscope in MCP `_meta`, outside the tool
775
- arguments controlled by the model.
888
+ arguments controlled by the model. New sandbox bindings also expose the selected Databricks
889
+ credential to sandbox code by default:
890
+
891
+ ```toml
892
+ [[tools]]
893
+ id = "sandbox"
894
+ auth = "user"
895
+ source = { kind = "sandbox", service = "system.ai.sandbox" }
896
+ policy = { downscope = [{ resource = "workspace:/Workspace/Shared", permission = "read_only" }], databricks_access_token_included = true }
897
+ ```
898
+
899
+ With `databricks_access_token_included = true`, the sandbox receives `DATABRICKS_HOST`, a short-lived
900
+ `DATABRICKS_TOKEN`, and `DATABRICKS_AUTH_TYPE`, so code such as
901
+ `WorkspaceClient().current_user.me()` can call workspace APIs. This policy does not choose the
902
+ identity: `auth = "user"` uses the request user's OBO credential, while `auth = "app"` uses the
903
+ Databricks App service principal. Use `--no-databricks-access-token-included` when adding a sandbox that
904
+ does not need workspace API access. Existing manifests that omit `databricks_access_token_included`
905
+ remain disabled until explicitly updated.
776
906
 
777
907
  ### Genie tools
778
908
 
@@ -880,10 +1010,12 @@ store and grants the app's service principal access to it. The memory store id f
880
1010
  via the `AGENT_MEMORY_STORE` env var that `deploy` injects; `agentbricks dev` runs locally with memory off
881
1011
  and does not inject it. The id is not persisted in `agent.toml`.)
882
1012
 
883
- The chat UI generates a stable application session UUID in browser local storage, places it inside
884
- the invocation's opaque `input`, and creates a fresh invocation UUID per turn. The
885
- `__Host-databricks-app-router` cookie remains independent: API clients may reuse it for sticky
886
- replica routing, but it is neither authentication nor the template's application session state.
1013
+ The chat UI generates a stable application session UUID in browser local storage, sends it as the
1014
+ invocation's top-level `session_id`, and creates a fresh invocation UUID per turn. The chat app also
1015
+ sends this session UUID in the `X-Routing-Key` request header, which is used verbatim to pin
1016
+ the session to one app replica (it must be non-blank and no more than 128 UTF-8 bytes). The header is neither
1017
+ authentication nor the template's application session state; it is independent sticky-routing
1018
+ plumbing.
887
1019
 
888
1020
  The generated `README.md` documents every request the client makes: config discovery, sync and SSE
889
1021
  invocations, background submission and polling, session transcript loading, HITL resume, and memory
@@ -127,9 +127,9 @@ agentbricks deploy my-agent # deploy to Databricks
127
127
  local runtime so local behavior matches a deployment.
128
128
 
129
129
  `agentbricks deploy my-agent` deploys a Databricks App named `agent-bricks-my-agent`, provisions the
130
- stores declared in `agent.toml`, and grants the app's service principal access to them. Use
131
- `agentbricks deployments list` to find deployed apps, and `agentbricks deployments get agent-bricks-my-agent` to
132
- print an app's URL and status.
130
+ stores declared in `agent.toml`, and grants the app's service principal access to the stores and
131
+ direct App-auth tool resources declared there. Use `agentbricks deployments list` to find deployed
132
+ apps, and `agentbricks deployments get agent-bricks-my-agent` to print an app's URL and status.
133
133
 
134
134
  `agentbricks init` declares default memory and session stores in `agent.toml`, so the deployed agent has
135
135
  long-term memory and durable conversation history. It creates `<name>-<6-letter-token>-memory` and
@@ -228,12 +228,16 @@ Each managed run is an **invocation**. Send a client-generated UUID `id` and you
228
228
  ```json
229
229
  {
230
230
  "id": "550e8400-e29b-41d4-a716-446655440000",
231
+ "session_id": "support-case-123",
231
232
  "input": {"messages": [{"role": "user", "content": "Hello"}]},
232
233
  "background": true,
233
234
  "stream": true
234
235
  }
235
236
  ```
236
237
 
238
+ The optional top-level `session_id` groups invocations into one application session. It is distinct
239
+ from the invocation `id` and from the `X-Routing-Key` sticky-routing header.
240
+
237
241
  | Endpoint | Behavior |
238
242
  | --- | --- |
239
243
  | `POST /api/invocations` | Defaults to synchronous execution: `200` with the result under `output`. `stream: true` returns SSE events. `background: true` returns `202` with a status URL; adding `stream: true` also includes an events URL. |
@@ -434,6 +438,7 @@ agentbricks [-p <profile>] [-o text|json]
434
438
  [--disable-chat-app]
435
439
  [--memory-store NAME] [--session-store NAME]
436
440
  [--existing] [--profile P] [directory]
441
+ doctor [directory]
437
442
  dev [--source PATH] [--prepare-environment] [--app-port PORT]
438
443
  memory
439
444
  bind STORE [--source PATH]
@@ -450,7 +455,8 @@ agentbricks [-p <profile>] [-o text|json]
450
455
  unbind [--source PATH]
451
456
  list | get [--experiment-name NAME | --experiment-id ID] [--source PATH]
452
457
  tools
453
- add sandbox --scope SCOPE [--scope SCOPE ...] [--source PATH]
458
+ add sandbox --scope SCOPE [--scope SCOPE ...]
459
+ [--no-databricks-access-token-included] [--source PATH]
454
460
  add mcp SERVICE [--name NAME] [--source PATH]
455
461
  add uc-function FUNCTION [--name NAME] [--source PATH]
456
462
  add genie-one [--name NAME] [--auth user|app] [--source PATH]
@@ -473,6 +479,26 @@ agentbricks init --framework langgraph --existing .
473
479
  agentbricks init --framework openai --existing .
474
480
  ```
475
481
 
482
+ Before or after the conversion, inspect its progress without changing the repository or contacting
483
+ Databricks:
484
+
485
+ ```sh
486
+ agentbricks doctor .
487
+ agentbricks -o json doctor .
488
+ ```
489
+
490
+ Doctor exits 0 only when the project has a valid Agent Bricks manifest and matching project
491
+ metadata, uses the Agent Bricks server, declares the framework-appropriate `databricks-agentbricks`
492
+ extra and a non-empty `app.yaml` command, constructs `DurableAgentServer` with an `invoke` hook, and
493
+ calls a recognized adapter for the selected framework in production Python source. Test, example, and
494
+ old/stale directories do not count as source evidence. A failed report is the normal result for a
495
+ project that still needs migration; run
496
+ `agentbricks init --framework <framework_name> --existing <directory>` with the appropriate framework
497
+ to prepare the migration instructions. Doctor never imports or executes the target's source, and a
498
+ bounded source scan that exceeds a limit is reported while the evidence it already found still counts.
499
+ Its findings are static repository evidence, not proof that the configured startup command executes
500
+ the files it finds.
501
+
476
502
  This writes `agent-bricks-migrate/` containing a skill, a prompt to paste into your coding agent,
477
503
  `references/migration.json`, and a reference project generated from the templates bundled with the
478
504
  installed CLI. The bundle sits outside any single agent's configuration directory; `.claude/skills/`
@@ -509,11 +535,11 @@ server.
509
535
  ```sh
510
536
  agentbricks --profile <profile> endpoint invoke agent-bricks-my-agent \
511
537
  --path /api/invocations \
512
- --json '{"id":"00000000-0000-4000-8000-000000000001","input":[{"role":"user","content":"Hello"}]}'
538
+ --json '{"id":"00000000-0000-4000-8000-000000000001","session_id":"support-case-123","input":[{"role":"user","content":"Hello"}]}'
513
539
 
514
540
  agentbricks endpoint invoke --url http://localhost:8000 \
515
541
  --path /api/invocations \
516
- --json '{"id":"00000000-0000-4000-8000-000000000001","input":[{"role":"user","content":"Hello"}]}'
542
+ --json '{"id":"00000000-0000-4000-8000-000000000001","session_id":"support-case-123","input":[{"role":"user","content":"Hello"}]}'
517
543
  ```
518
544
 
519
545
  The JSON body remains explicit even for generated agents. For example, managed runtime agents require
@@ -521,21 +547,26 @@ a client-generated invocation ID, and streaming servers require their own stream
521
547
  `--sse` so the CLI consumes the response as Server-Sent Events.
522
548
 
523
549
  ```sh
550
+ SESSION_ID=$(uuidgen)
524
551
  INVOCATION_ID=$(uuidgen)
525
552
  agentbricks --profile <profile> endpoint invoke agent-bricks-my-agent \
526
553
  --path /api/invocations \
527
- --json "{\"id\":\"$INVOCATION_ID\",\"input\":[{\"role\":\"user\",\"content\":\"Run the report\"}]}"
554
+ --routing-key "$SESSION_ID" \
555
+ --json "{\"id\":\"$INVOCATION_ID\",\"session_id\":\"$SESSION_ID\",\"input\":[{\"role\":\"user\",\"content\":\"Run the report\"}]}"
528
556
 
557
+ INVOCATION_ID=$(uuidgen)
529
558
  agentbricks --profile <profile> endpoint invoke agent-bricks-my-agent \
530
559
  --path /api/invocations \
560
+ --routing-key "$SESSION_ID" \
531
561
  --sse \
532
- --json "{\"id\":\"$INVOCATION_ID\",\"input\":[{\"role\":\"user\",\"content\":\"Hello\"}],\"stream\":true}"
562
+ --json "{\"id\":\"$INVOCATION_ID\",\"session_id\":\"$SESSION_ID\",\"input\":[{\"role\":\"user\",\"content\":\"Hello\"}],\"stream\":true}"
533
563
  ```
534
564
 
535
- `--session-id` preserves one application session across calls by setting the Databricks Apps routing
536
- cookie. This also works with a direct App URL and with the generated runtime on localhost. OAuth and
537
- session headers are managed by the runtime; arbitrary custom request headers are intentionally not exposed
538
- by this command.
565
+ `--routing-key` keeps a session on one app replica (sticky routing): set it to your stable session id
566
+ and it is sent verbatim in the `X-Routing-Key` request header. It is routing only and is never used
567
+ as the session id - put the session id at the top level of the `--json` body for session continuity. This
568
+ also works with a direct App URL and with the generated runtime on localhost. OAuth and session headers are managed by
569
+ the runtime; arbitrary custom request headers are intentionally not exposed by this command.
539
570
 
540
571
  ## Command help
541
572
 
@@ -585,9 +616,79 @@ Managed-tool add commands write the selected identity to `agent.toml`; inspect t
585
616
  review configured bindings. Missing legacy auth continues to mean App identity at runtime; it is
586
617
  never silently upgraded to user identity.
587
618
 
588
- `DurableAgentServer` derives its request-auth policy directly from the managed tool bindings in `agent.toml`.
589
- Projects do not maintain a separate request-auth contract marker: the presence of any managed tool
590
- with `auth = "user"` makes the invocation require a transient request-user credential.
619
+ ### Automatic App-identity access on deploy
620
+
621
+ `agentbricks deploy` reconciles least-privilege access for resources explicitly declared by App/default
622
+ identity tool bindings. It skips every `auth = "user"` binding because those calls use the request
623
+ user's permissions instead of the App service principal.
624
+
625
+ | Explicit `agent.toml` resource | Automatic App service-principal access |
626
+ | --- | --- |
627
+ | UC function | Apps `uc_securable`: `FUNCTION` / `EXECUTE` |
628
+ | Genie Agent space | Apps `genie_space`: `CAN_RUN` |
629
+ | Sandbox table scope | Apps `uc_securable`: `TABLE` / `SELECT` or `MODIFY` |
630
+ | Sandbox volume scope | Apps `uc_securable`: `VOLUME` / `READ_VOLUME` or `WRITE_VOLUME` |
631
+ | Sandbox Workspace path | Workspace ACL: `CAN_READ` or `CAN_EDIT` |
632
+ | External MCP service | Unity Catalog: effective `EXECUTE` plus `USE_SCHEMA` and `USE_CATALOG` on its named parents |
633
+ | Built-in `system.ai` MCP service, including Sandbox and Genie One | Platform-managed access defaults; Agent Bricks does not mutate system securables |
634
+
635
+ Native Genie One has no resource identifier in its binding, so it does not add a resource-specific
636
+ grant. Use a Genie Agent binding when the App identity should be scoped to one explicit Genie Space.
637
+
638
+ Apps-backed tool resources are named deterministically and reconciled to the manifest on each
639
+ deploy: removing a binding removes that Agent Bricks-owned Apps resource while preserving Runtime
640
+ Store, tracing, and user-owned resources. MCP and Workspace ACL grants are additive in this release
641
+ because their permission APIs do not expose trustworthy Agent Bricks ownership metadata; removing
642
+ those bindings does not revoke an independently valid grant.
643
+
644
+ Only direct resources are automatic. Agent Bricks never discovers or grants tables and warehouses
645
+ used by a Genie Space, objects called by a UC function, or resources wrapped by an MCP service.
646
+ Grant those transitive dependencies manually when the called service uses the App identity. If any
647
+ required direct grant cannot be read, applied, or verified, deploy stops before source upload and
648
+ leaves the currently deployed version untouched.
649
+
650
+ `DurableAgentServer` derives its request-auth policy directly from the managed tool bindings in
651
+ `agent.toml`. Projects do not maintain a separate request-auth contract marker: a managed tool with
652
+ `auth = "user"` requires a transient request-user credential. Code-first tools can declare any
653
+ additional API scopes that Agent Bricks cannot infer from Python:
654
+
655
+ ```toml
656
+ [auth.user]
657
+ required = true
658
+ additional_api_scopes = ["sql"]
659
+ ```
660
+
661
+ `additional_api_scopes` is additive: deploy unions it with scopes inferred from managed bindings,
662
+ deduplicates the result, and preserves unrelated scopes already configured on the App. Scope names
663
+ are not restricted to a client-side allowlist; Databricks Apps validates whether a requested scope
664
+ is supported. Entries must be non-empty strings without surrounding whitespace or control
665
+ characters, and a non-empty list requires `required = true`. This request-auth contract is supported
666
+ only with `[agent].server = "agentbricks"`.
667
+
668
+ Generated framework adapters pass the request-bound resolver to agent construction. A code-first
669
+ tool should obtain its user client from that resolver inside the active invocation rather than
670
+ creating or persisting a user credential:
671
+
672
+ ```python
673
+ from langchain_core.tools import tool
674
+
675
+
676
+ def sql_tools(workspace_client_for):
677
+ @tool
678
+ def run_statement(statement: str) -> str:
679
+ client = workspace_client_for("user")
680
+ response = client.statement_execution.execute_statement(
681
+ warehouse_id="...",
682
+ statement=statement,
683
+ )
684
+ return str(response.result)
685
+
686
+ return [run_statement]
687
+ ```
688
+
689
+ The resolver is request-bound and closes after the attempt. Agent Bricks does not inject it into
690
+ arbitrary auto-discovered decorated tools; build those tools from the resolver passed to the
691
+ generated request-aware agent function.
591
692
 
592
693
  Request-user invocations use the same synchronous, streaming, background, status, event-replay,
593
694
  and idempotency APIs as app-auth invocations. The Runtime Store records only token-free request
@@ -603,13 +704,18 @@ upgrade copied Python adapter code. Outdated adapters fail closed rather than si
603
704
  identity. App-only legacy projects and generic bring-your-own source directories keep the existing
604
705
  path.
605
706
 
606
- Deploy derives Apps user scopes from explicit `auth = "user"` bindings:
707
+ Deploy derives Apps user scopes from explicit `auth = "user"` bindings and unions them with
708
+ `[auth.user].additional_api_scopes`:
607
709
 
608
710
  | Binding | Requested Apps scopes |
609
711
  | --- | --- |
610
712
  | Managed MCP (governed ingress) | `ai-gateway` |
713
+ | `system.ai.dbsql` | `ai-gateway`, `sql` |
611
714
  | `system.ai.genie_one_mcp` | `ai-gateway`, `genie` |
715
+ | Sandbox with a Volume downscope | `ai-gateway`, `files` |
612
716
  | First-class Genie One or Genie Agent | `genie` |
717
+ | Sandbox with token injection | `ai-gateway`, `workspace.workspace` |
718
+ | Sandbox with token injection disabled | `ai-gateway` |
613
719
 
614
720
  For example, bind Genie tools in a current project with `server = "agentbricks"`:
615
721
 
@@ -618,7 +724,8 @@ agentbricks tools add mcp system.ai.genie_one_mcp --auth user
618
724
  agentbricks tools add genie-agent SPACE_ID --auth user
619
725
  ```
620
726
 
621
- Mixed bindings request the union. App-auth and legacy bindings add no user scopes. These are
727
+ Mixed bindings and explicit additions request the union. App-auth and legacy bindings add no user
728
+ scopes. These are
622
729
  explicit service-consent scopes, not a claim that gateway access alone authorizes the downstream
623
730
  resource. OAuth consent does not grant Unity Catalog privileges: the user still needs access to
624
731
  the configured Genie Space and its underlying data.
@@ -635,10 +742,15 @@ The `system.ai.dbsql` managed MCP additionally requests the Apps `sql` user scop
635
742
  API consent, not `sql:restricted-query`; read-only enforcement remains the service policy plus the
636
743
  requesting user's Unity Catalog grants. DBSQL does not use Databricks Connect.
637
744
 
638
- A sandbox binding with a Volume downscope additionally requests the Apps `files` user scope.
745
+ When a user-auth sandbox has `databricks_access_token_included = true`, it requests the Apps
746
+ `workspace.workspace` user scope so the injected credential can call workspace APIs. A sandbox
747
+ binding with a Volume downscope additionally requests the Apps `files` user scope.
639
748
  OAuth consent does not grant Volume access: the requesting user still needs the corresponding
640
- Unity Catalog privileges, and the sandbox downscope remains authoritative. Table-only sandbox
641
- bindings request `ai-gateway` but do not request `files`.
749
+ Unity Catalog privileges, and the sandbox downscope remains authoritative. A sandbox binding with
750
+ token injection disabled does not request `workspace.workspace`; its other resource-derived scopes
751
+ still apply. Databricks Apps rejects the legacy bare `workspace` scope, so Agent Bricks requests
752
+ `workspace.workspace`. These scopes are requested only for `auth = "user"`; `auth = "app"` uses
753
+ the App service principal's permissions instead.
642
754
 
643
755
  Review the target App's scopes and coordinate with its other owners before allowing the update. Once
644
756
  those scopes are present, later deploys do not need the flag. The CLI preserves unrelated scopes,
@@ -737,7 +849,24 @@ do not generate or patch Python tool code, and do not alter the manifest's `[[to
737
849
  Sandbox scopes default to read-only access. Repeat `--scope` to allow more than one resource, use
738
850
  `volume:` or `workspace:` for those resource types, and use `--permission read_write` only when the
739
851
  agent needs writes. Every sandbox call carries this fixed downscope in MCP `_meta`, outside the tool
740
- arguments controlled by the model.
852
+ arguments controlled by the model. New sandbox bindings also expose the selected Databricks
853
+ credential to sandbox code by default:
854
+
855
+ ```toml
856
+ [[tools]]
857
+ id = "sandbox"
858
+ auth = "user"
859
+ source = { kind = "sandbox", service = "system.ai.sandbox" }
860
+ policy = { downscope = [{ resource = "workspace:/Workspace/Shared", permission = "read_only" }], databricks_access_token_included = true }
861
+ ```
862
+
863
+ With `databricks_access_token_included = true`, the sandbox receives `DATABRICKS_HOST`, a short-lived
864
+ `DATABRICKS_TOKEN`, and `DATABRICKS_AUTH_TYPE`, so code such as
865
+ `WorkspaceClient().current_user.me()` can call workspace APIs. This policy does not choose the
866
+ identity: `auth = "user"` uses the request user's OBO credential, while `auth = "app"` uses the
867
+ Databricks App service principal. Use `--no-databricks-access-token-included` when adding a sandbox that
868
+ does not need workspace API access. Existing manifests that omit `databricks_access_token_included`
869
+ remain disabled until explicitly updated.
741
870
 
742
871
  ### Genie tools
743
872
 
@@ -845,10 +974,12 @@ store and grants the app's service principal access to it. The memory store id f
845
974
  via the `AGENT_MEMORY_STORE` env var that `deploy` injects; `agentbricks dev` runs locally with memory off
846
975
  and does not inject it. The id is not persisted in `agent.toml`.)
847
976
 
848
- The chat UI generates a stable application session UUID in browser local storage, places it inside
849
- the invocation's opaque `input`, and creates a fresh invocation UUID per turn. The
850
- `__Host-databricks-app-router` cookie remains independent: API clients may reuse it for sticky
851
- replica routing, but it is neither authentication nor the template's application session state.
977
+ The chat UI generates a stable application session UUID in browser local storage, sends it as the
978
+ invocation's top-level `session_id`, and creates a fresh invocation UUID per turn. The chat app also
979
+ sends this session UUID in the `X-Routing-Key` request header, which is used verbatim to pin
980
+ the session to one app replica (it must be non-blank and no more than 128 UTF-8 bytes). The header is neither
981
+ authentication nor the template's application session state; it is independent sticky-routing
982
+ plumbing.
852
983
 
853
984
  The generated `README.md` documents every request the client makes: config discovery, sync and SSE
854
985
  invocations, background submission and polling, session transcript loading, HITL resume, and memory
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "databricks-agentbricks"
3
- version = "0.3.0"
3
+ version = "0.4.0"
4
4
  description = "Agent Bricks CLI and AgentKit SDK for custom agents on Databricks"
5
5
  authors = [
6
6
  { name="Databricks", email="agent-feedback@databricks.com" },
@@ -22,6 +22,7 @@ dependencies = [
22
22
  # so this is a base dependency. Auth rides on databricks-sdk (above), so the heavier
23
23
  # mlflow[databricks] extra (boto3/azure/gcs/databricks-agents, for artifact blob I/O) isn't needed.
24
24
  "mlflow-skinny>=3.10.1",
25
+ "packaging>=23.2",
25
26
  "psycopg[binary]>=3.1",
26
27
  "PyYAML>=6.0",
27
28
  "rich>=13.7",
@@ -35,7 +36,7 @@ langgraph = [
35
36
  "databricks-langchain>=0.17.0",
36
37
  "langgraph>=1.1.0",
37
38
  "langchain>=1.0.0",
38
- "langchain-mcp-adapters>=0.2.1",
39
+ "langchain-mcp-adapters>=0.3.0",
39
40
  "mlflow>=3.10.1",
40
41
  "opentelemetry-exporter-otlp-proto-grpc>=1.25.0",
41
42
  "databricks-agents>=1.9.3",