databricks-tellr-app 0.4.3.dev32__tar.gz → 0.4.3.dev33__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 (230) hide show
  1. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/PKG-INFO +1 -1
  2. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/databricks_tellr_app.egg-info/PKG-INFO +1 -1
  3. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/databricks_tellr_app.egg-info/SOURCES.txt +2 -0
  4. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/pyproject.toml +1 -1
  5. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/services/chat_service.py +5 -20
  6. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/services/session_naming.py +16 -0
  7. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/defaults.py +4 -0
  8. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/agent_runtime.py +4 -2
  9. databricks_tellr_app-0.4.3.dev33/src/services/gateway_openai.py +12 -0
  10. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph_configuration_draft.py +35 -0
  11. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/html_to_google_slides.py +3 -2
  12. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/html_to_pptx.py +7 -6
  13. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/model_endpoint_catalog.py +53 -62
  14. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/README.md +0 -0
  15. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/databricks_tellr_app/__init__.py +0 -0
  16. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/databricks_tellr_app/run.py +0 -0
  17. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/databricks_tellr_app.egg-info/dependency_links.txt +0 -0
  18. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/databricks_tellr_app.egg-info/requires.txt +0 -0
  19. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/databricks_tellr_app.egg-info/top_level.txt +0 -0
  20. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/setup.cfg +0 -0
  21. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/setup.py +0 -0
  22. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/__init__.py +0 -0
  23. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/__init__.py +0 -0
  24. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/_otel_bootstrap.py +0 -0
  25. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/fixtures/tour_demo_deck.json +0 -0
  26. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/main.py +0 -0
  27. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/mcp_auth.py +0 -0
  28. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/mcp_server.py +0 -0
  29. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/middleware/__init__.py +0 -0
  30. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/middleware/csrf.py +0 -0
  31. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/middleware/request_logging.py +0 -0
  32. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/middleware/security_headers.py +0 -0
  33. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/__init__.py +0 -0
  34. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/_authz.py +0 -0
  35. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/admin.py +0 -0
  36. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/admin_usage.py +0 -0
  37. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/agent_config.py +0 -0
  38. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/agent_definitions.py +0 -0
  39. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/chat.py +0 -0
  40. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/deck_contributors.py +0 -0
  41. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/export.py +0 -0
  42. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/feedback.py +0 -0
  43. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/google_slides.py +0 -0
  44. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/images.py +0 -0
  45. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/local_version.py +0 -0
  46. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/profiles.py +0 -0
  47. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/sessions.py +0 -0
  48. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/settings/__init__.py +0 -0
  49. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/settings/contributors.py +0 -0
  50. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/settings/deck_prompts.py +0 -0
  51. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/settings/design_systems.py +0 -0
  52. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/settings/identities.py +0 -0
  53. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/settings/slide_styles.py +0 -0
  54. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/setup.py +0 -0
  55. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/slides.py +0 -0
  56. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/tools.py +0 -0
  57. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/tour.py +0 -0
  58. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/verification.py +0 -0
  59. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/routes/version.py +0 -0
  60. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/schemas/__init__.py +0 -0
  61. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/schemas/agent_config.py +0 -0
  62. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/schemas/agent_definitions.py +0 -0
  63. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/schemas/feedback.py +0 -0
  64. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/schemas/graph_release_history.py +0 -0
  65. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/schemas/graph_releases.py +0 -0
  66. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/schemas/requests.py +0 -0
  67. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/schemas/responses.py +0 -0
  68. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/schemas/settings/__init__.py +0 -0
  69. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/schemas/settings/requests.py +0 -0
  70. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/schemas/settings/responses.py +0 -0
  71. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/schemas/streaming.py +0 -0
  72. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/services/__init__.py +0 -0
  73. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/services/deck_level_writer.py +0 -0
  74. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/services/export_job_queue.py +0 -0
  75. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/services/feedback_service.py +0 -0
  76. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/services/job_queue.py +0 -0
  77. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/services/session_manager.py +0 -0
  78. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/services/slide_repository.py +0 -0
  79. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/services/usage_events.py +0 -0
  80. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/services/usage_service.py +0 -0
  81. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/utils/__init__.py +0 -0
  82. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/api/utils/validation.py +0 -0
  83. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/__init__.py +0 -0
  84. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/backfill_session_slides_startup.py +0 -0
  85. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/checkpointer.py +0 -0
  86. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/config_loader.py +0 -0
  87. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/context_utils.py +0 -0
  88. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/database.py +0 -0
  89. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/databricks_client.py +0 -0
  90. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/encryption.py +0 -0
  91. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/init_default_profile.py +0 -0
  92. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/lakebase.py +0 -0
  93. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/migrate_profiles_to_agent_config.py +0 -0
  94. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/mlflow_agent_spans.py +0 -0
  95. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/mlflow_tracing.py +0 -0
  96. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/otel_logging.py +0 -0
  97. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/permission_context.py +0 -0
  98. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/prompt_modules.py +0 -0
  99. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/settings_db.py +0 -0
  100. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/skills/__init__.py +0 -0
  101. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/skills/architect.py +0 -0
  102. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/skills/build_reviewer.py +0 -0
  103. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/skills/builder.py +0 -0
  104. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/skills/data_analyst.py +0 -0
  105. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/skills/deck_reviewer.py +0 -0
  106. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/skills/fix_reviewer.py +0 -0
  107. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/skills/fixer.py +0 -0
  108. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/strip_retired_prompt_keys.py +0 -0
  109. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/core/user_context.py +0 -0
  110. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/__init__.py +0 -0
  111. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/__init__.py +0 -0
  112. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/deck_contributor.py +0 -0
  113. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/deck_review.py +0 -0
  114. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/design_system.py +0 -0
  115. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/encryption_key.py +0 -0
  116. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/feedback.py +0 -0
  117. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/genie_space.py +0 -0
  118. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/google_global_credentials.py +0 -0
  119. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/google_oauth_token.py +0 -0
  120. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/graph_checkpoint.py +0 -0
  121. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/graph_configuration.py +0 -0
  122. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/identity.py +0 -0
  123. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/image.py +0 -0
  124. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/profile.py +0 -0
  125. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/profile_contributor.py +0 -0
  126. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/prompts.py +0 -0
  127. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/request_log.py +0 -0
  128. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/session.py +0 -0
  129. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/slide_deck_prompt.py +0 -0
  130. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/slide_style_library.py +0 -0
  131. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/usage_event.py +0 -0
  132. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/models/user_preference.py +0 -0
  133. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/database/types.py +0 -0
  134. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/domain/__init__.py +0 -0
  135. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/domain/conversation_engine.py +0 -0
  136. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/domain/deck_spec.py +0 -0
  137. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/domain/finding.py +0 -0
  138. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/domain/skill_io.py +0 -0
  139. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/domain/slide.py +0 -0
  140. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/domain/slide_deck.py +0 -0
  141. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/__init__.py +0 -0
  142. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/agent.py +0 -0
  143. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/agent_definition_manifest_v1.py +0 -0
  144. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/agent_factory.py +0 -0
  145. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/agent_model_payload.py +0 -0
  146. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/agent_resolution.py +0 -0
  147. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/agent_runtime_identity.py +0 -0
  148. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/agent_schema_registry.py +0 -0
  149. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/agent_schema_types.py +0 -0
  150. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/agent_test_workbench.py +0 -0
  151. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/collaboration_history.py +0 -0
  152. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/config_service.py +0 -0
  153. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/config_validator.py +0 -0
  154. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/conversation_pins.py +0 -0
  155. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/converter_jail/__init__.py +0 -0
  156. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/converter_jail/ast_guard.py +0 -0
  157. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/converter_jail/codeprep.py +0 -0
  158. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/converter_jail/gslides_runner.py +0 -0
  159. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/converter_jail/jail.py +0 -0
  160. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/converter_jail/pptx_runner.py +0 -0
  161. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/converter_jail/protocol.py +0 -0
  162. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/deck_css_aggregator.py +0 -0
  163. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/deck_review_store.py +0 -0
  164. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/design_system_compiler.py +0 -0
  165. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/design_system_service.py +0 -0
  166. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/design_system_templates.py +0 -0
  167. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/drive_uploader.py +0 -0
  168. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/evaluation/__init__.py +0 -0
  169. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/evaluation/llm_judge.py +0 -0
  170. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/foreman_service.py +0 -0
  171. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/genie_service.py +0 -0
  172. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/google_slides_auth.py +0 -0
  173. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/google_slides_prompts_defaults.py +0 -0
  174. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph/__init__.py +0 -0
  175. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph/builder.py +0 -0
  176. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph/event_emitter.py +0 -0
  177. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph/nodes.py +0 -0
  178. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph/routers.py +0 -0
  179. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph/state.py +0 -0
  180. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph_configuration.py +0 -0
  181. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph_configuration_bootstrap.py +0 -0
  182. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph_configuration_content.py +0 -0
  183. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph_configuration_publication.py +0 -0
  184. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph_configuration_rollback.py +0 -0
  185. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph_configuration_seed.py +0 -0
  186. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph_configuration_workbench.py +0 -0
  187. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph_definition_manifest.py +0 -0
  188. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph_release_evidence.py +0 -0
  189. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/graph_release_history.py +0 -0
  190. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/identity_provider.py +0 -0
  191. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/identity_providers/__init__.py +0 -0
  192. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/identity_providers/account_provider.py +0 -0
  193. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/identity_providers/local_provider.py +0 -0
  194. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/identity_providers/workspace_provider.py +0 -0
  195. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/image_service.py +0 -0
  196. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/image_tools.py +0 -0
  197. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/model_endpoint_probe.py +0 -0
  198. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/permission_service.py +0 -0
  199. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/persisted_graph_release.py +0 -0
  200. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/pptx_from_html_huashu.py +0 -0
  201. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/pptx_from_records.py +0 -0
  202. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/pptx_prompts_defaults.py +0 -0
  203. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/profile_service.py +0 -0
  204. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/prompt_assembler.py +0 -0
  205. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/shared_deck_attribution.py +0 -0
  206. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/spec_sync.py +0 -0
  207. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/streaming_callback.py +0 -0
  208. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/template_sections.py +0 -0
  209. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/tools/__init__.py +0 -0
  210. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/tools/agent_bricks_tool.py +0 -0
  211. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/tools/ds_asset_tool.py +0 -0
  212. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/tools/genie_tool.py +0 -0
  213. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/tools/mcp_tool.py +0 -0
  214. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/tools/model_endpoint_tool.py +0 -0
  215. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/tools/vector_tool.py +0 -0
  216. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/services/validator.py +0 -0
  217. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/utils/__init__.py +0 -0
  218. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/utils/css_utils.py +0 -0
  219. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/utils/ds_asset_utils.py +0 -0
  220. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/utils/error_handling.py +0 -0
  221. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/utils/graph_safety.py +0 -0
  222. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/utils/html_safety.py +0 -0
  223. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/utils/html_utils.py +0 -0
  224. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/utils/image_utils.py +0 -0
  225. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/utils/js_validator.py +0 -0
  226. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/utils/logging_config.py +0 -0
  227. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/utils/pi_filter.py +0 -0
  228. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/utils/slide_hash.py +0 -0
  229. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/utils/spotlight.py +0 -0
  230. {databricks_tellr_app-0.4.3.dev32 → databricks_tellr_app-0.4.3.dev33}/src/utils/text_caps.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: databricks-tellr-app
3
- Version: 0.4.3.dev32
3
+ Version: 0.4.3.dev33
4
4
  Summary: Tellr application package for Databricks Apps
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: databricks-tellr-app
3
- Version: 0.4.3.dev32
3
+ Version: 0.4.3.dev33
4
4
  Summary: Tellr application package for Databricks Apps
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -147,6 +147,7 @@ setup.py
147
147
  ./src/services/design_system_templates.py
148
148
  ./src/services/drive_uploader.py
149
149
  ./src/services/foreman_service.py
150
+ ./src/services/gateway_openai.py
150
151
  ./src/services/genie_service.py
151
152
  ./src/services/google_slides_auth.py
152
153
  ./src/services/google_slides_prompts_defaults.py
@@ -371,6 +372,7 @@ src/services/design_system_service.py
371
372
  src/services/design_system_templates.py
372
373
  src/services/drive_uploader.py
373
374
  src/services/foreman_service.py
375
+ src/services/gateway_openai.py
374
376
  src/services/genie_service.py
375
377
  src/services/google_slides_auth.py
376
378
  src/services/google_slides_prompts_defaults.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "databricks-tellr-app"
7
- version = "0.4.3.dev32"
7
+ version = "0.4.3.dev33"
8
8
  description = "Tellr application package for Databricks Apps"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -1445,16 +1445,9 @@ class ChatService:
1445
1445
  def run_title_gen():
1446
1446
  """Generate a session title in parallel with the main agent."""
1447
1447
  try:
1448
- from databricks_langchain import ChatDatabricks
1449
- from src.core.databricks_client import get_user_client
1450
-
1451
- from src.core.defaults import DEFAULT_CONFIG
1452
- naming_model = ChatDatabricks(
1453
- endpoint=DEFAULT_CONFIG["llm"]["endpoint"],
1454
- max_tokens=50,
1455
- temperature=0.3,
1456
- workspace_client=get_user_client(),
1457
- )
1448
+ from src.api.services.session_naming import build_session_title_model
1449
+
1450
+ naming_model = build_session_title_model()
1458
1451
  generated_title = generate_session_title(message, naming_model)
1459
1452
  if generated_title:
1460
1453
  session_manager.rename_session(session_id, generated_title)
@@ -1999,17 +1992,9 @@ class ChatService:
1999
1992
  session must never fail the turn, so this catches and logs.
2000
1993
  """
2001
1994
  try:
2002
- from databricks_langchain import ChatDatabricks
1995
+ from src.api.services.session_naming import build_session_title_model
2003
1996
 
2004
- from src.core.databricks_client import get_user_client
2005
- from src.core.defaults import DEFAULT_CONFIG
2006
-
2007
- naming_model = ChatDatabricks(
2008
- endpoint=DEFAULT_CONFIG["llm"]["endpoint"],
2009
- max_tokens=50,
2010
- temperature=0.3,
2011
- workspace_client=get_user_client(),
2012
- )
1997
+ naming_model = build_session_title_model()
2013
1998
  generated_title = generate_session_title(message, naming_model)
2014
1999
  if generated_title:
2015
2000
  session_manager.rename_session(session_id, generated_title)
@@ -88,6 +88,22 @@ def _was_truncated(response: object) -> bool:
88
88
  return False
89
89
 
90
90
 
91
+ def build_session_title_model():
92
+ """The title model: Gateway-routed, on the requesting user's OBO identity."""
93
+ from databricks_langchain import ChatDatabricks
94
+
95
+ from src.core.databricks_client import get_user_client
96
+ from src.core.defaults import SESSION_TITLE_MODEL
97
+
98
+ return ChatDatabricks(
99
+ model=SESSION_TITLE_MODEL,
100
+ use_ai_gateway=True,
101
+ max_tokens=50,
102
+ temperature=0.3,
103
+ workspace_client=get_user_client(),
104
+ )
105
+
106
+
91
107
  def generate_session_title(
92
108
  user_message: str,
93
109
  model,
@@ -232,3 +232,7 @@ This means the user wants to modify these specific slides. Your response should:
232
232
  For these operations, respond with a helpful message guiding users to the UI or workaround - do NOT attempt to return HTML.""",
233
233
  },
234
234
  }
235
+
236
+ #: Session-title generation (both engine paths) goes through Unity AI Gateway (ws2a).
237
+ #: Kept separate from DEFAULT_CONFIG["llm"], which the out-of-scope monolith still reads.
238
+ SESSION_TITLE_MODEL = "system.ai.claude-opus-4-6"
@@ -231,7 +231,7 @@ def bind_structured_output_model(
231
231
  the plain structured-output binding of ``schema``.
232
232
  """
233
233
  model = model_factory(
234
- endpoint=configuration.endpoint_name,
234
+ model=configuration.endpoint_name,
235
235
  temperature=configuration.temperature,
236
236
  max_tokens=configuration.max_tokens,
237
237
  top_p=configuration.top_p,
@@ -322,7 +322,9 @@ class DatabricksModelAdapter:
322
322
  def _default_model_factory(**kwargs: Any) -> Any:
323
323
  from databricks_langchain import ChatDatabricks # type: ignore[import-untyped]
324
324
 
325
- return ChatDatabricks(**kwargs)
325
+ # Workstream 2a: every graph model call goes through Unity AI Gateway
326
+ # ({host}/ai-gateway/mlflow/v1). There is no /serving-endpoints fallback.
327
+ return ChatDatabricks(use_ai_gateway=True, **kwargs)
326
328
 
327
329
  @staticmethod
328
330
  def _default_client_factory() -> Any:
@@ -0,0 +1,12 @@
1
+ """The one OpenAI-compatible client for app LLM calls through Unity AI Gateway (ws2a)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+
8
+ def gateway_openai_client(workspace_client: Any) -> Any:
9
+ """``DatabricksOpenAI`` bound to ``{host}/ai-gateway/mlflow/v1`` with the caller's identity."""
10
+ from databricks_openai import DatabricksOpenAI
11
+
12
+ return DatabricksOpenAI(workspace_client=workspace_client, use_ai_gateway=True)
@@ -44,6 +44,7 @@ from src.services.model_endpoint_catalog import (
44
44
  EndpointValidationFailure,
45
45
  ModelEndpointCatalog,
46
46
  validate_endpoint_name_policy,
47
+ validate_gateway_model_name,
47
48
  )
48
49
  from src.services.prompt_assembler import PromptAssembler, PromptAssemblyRejected
49
50
 
@@ -285,6 +286,24 @@ def _endpoint_name_policy_validator(
285
286
  return ()
286
287
 
287
288
 
289
+ def _gateway_model_name_validator(
290
+ current: DefinitionContent, candidate: DefinitionContent
291
+ ) -> tuple[DraftValidationIssue, ...]:
292
+ """ws2a: a save that CHANGES the model must name a system.ai.* Gateway model.
293
+
294
+ Save-only by design. It is never composed into ``_save_local_validators``,
295
+ which publication and rollback reuse, because rollback re-validates historical
296
+ releases whose roles name ``databricks-*`` endpoints (spec §5.2).
297
+ """
298
+ if candidate.model.endpoint_name == current.model.endpoint_name:
299
+ return ()
300
+ try:
301
+ validate_gateway_model_name(candidate.model.endpoint_name)
302
+ except EndpointValidationFailure as failure:
303
+ return (_endpoint_issue(failure),)
304
+ return ()
305
+
306
+
288
307
  class RemoteEndpointDraftValidator(Protocol):
289
308
  """Remote exact-endpoint check over one complete reconstructed candidate.
290
309
 
@@ -449,6 +468,14 @@ class _GraphConfigurationDraft(_GraphConfigurationWorkbench):
449
468
  client_candidate=candidate,
450
469
  server=self._draft_aggregate_snapshot(locked.snapshot),
451
470
  )
471
+ # Post-lock (ruling I-1): the locked draft is now the client's own
472
+ # base, so "changed" means changed by this request, never by a
473
+ # concurrent save that a stale client has not seen.
474
+ gateway_issues = _gateway_model_name_validator(
475
+ locked.selected.draft.content, content
476
+ )
477
+ if gateway_issues:
478
+ raise DraftContentRejected(*gateway_issues)
452
479
  self._run_candidate_validators(self.post_stale_validators, content)
453
480
  self._validate_remote_endpoint(content)
454
481
  return self._write_locked_content(
@@ -508,6 +535,14 @@ class _GraphConfigurationDraft(_GraphConfigurationWorkbench):
508
535
  client_candidate=validated,
509
536
  server=self._draft_aggregate_snapshot(locked.snapshot),
510
537
  )
538
+ # Post-lock (ruling I-1): the locked draft is now the client's own
539
+ # base, so "changed" means changed by this request, never by a
540
+ # concurrent save that a stale client has not seen.
541
+ gateway_issues = _gateway_model_name_validator(
542
+ locked.selected.draft.content, validated
543
+ )
544
+ if gateway_issues:
545
+ raise DraftContentRejected(*gateway_issues)
511
546
  self._run_candidate_validators(self.post_stale_validators, validated)
512
547
  self._validate_remote_endpoint(validated)
513
548
  return self._write_locked_content(
@@ -16,6 +16,7 @@ from typing import Callable, Dict, List, Optional, Tuple
16
16
  from databricks.sdk import WorkspaceClient
17
17
 
18
18
  from src.services.converter_jail.codeprep import _fix_apostrophe_strings
19
+ from src.services.gateway_openai import gateway_openai_client
19
20
  from src.services.google_slides_auth import GoogleSlidesAuth, GoogleSlidesAuthError
20
21
  from src.services.google_slides_prompts_defaults import (
21
22
  DEFAULT_GSLIDES_SYSTEM_PROMPT,
@@ -339,7 +340,7 @@ class GoogleSlidesConversionError(Exception):
339
340
  class HtmlToGoogleSlidesConverter:
340
341
  """LLM-powered converter: HTML → Google Slides API code → execution."""
341
342
 
342
- DEFAULT_MODEL = "databricks-claude-sonnet-4-5"
343
+ DEFAULT_MODEL = "system.ai.claude-sonnet-4-5"
343
344
 
344
345
  def __init__(
345
346
  self,
@@ -355,7 +356,7 @@ class HtmlToGoogleSlidesConverter:
355
356
  from src.core.databricks_client import get_databricks_client
356
357
  self.ws_client = get_databricks_client()
357
358
 
358
- self.llm_client = self.ws_client.serving_endpoints.get_open_ai_client()
359
+ self.llm_client = gateway_openai_client(self.ws_client)
359
360
  self.auth = google_auth or GoogleSlidesAuth()
360
361
  self.SYSTEM_PROMPT = DEFAULT_GSLIDES_SYSTEM_PROMPT
361
362
  self.USER_PROMPT = DEFAULT_GSLIDES_USER_PROMPT
@@ -13,6 +13,7 @@ from typing import Any, Callable, Dict, List, Optional, Tuple
13
13
  from bs4 import BeautifulSoup
14
14
  from databricks.sdk import WorkspaceClient
15
15
 
16
+ from src.services.gateway_openai import gateway_openai_client
16
17
  from src.services.pptx_prompts_defaults import (
17
18
  DEFAULT_SYSTEM_PROMPT,
18
19
  DEFAULT_USER_PROMPT_TEMPLATE,
@@ -48,7 +49,7 @@ class HtmlToPptxConverterV3:
48
49
  """
49
50
 
50
51
  # Model configuration
51
- DEFAULT_MODEL = "databricks-claude-sonnet-4-5"
52
+ DEFAULT_MODEL = "system.ai.claude-sonnet-4-5"
52
53
 
53
54
 
54
55
  def __init__(
@@ -60,19 +61,19 @@ class HtmlToPptxConverterV3:
60
61
 
61
62
  Args:
62
63
  workspace_client: Databricks client (optional, uses singleton if not provided)
63
- model_endpoint: LLM model name (default: databricks-claude-sonnet-4-5)
64
+ model_endpoint: LLM model name (default: system.ai.claude-sonnet-4-5)
64
65
  """
65
66
  self.model_endpoint = model_endpoint or self.DEFAULT_MODEL
66
-
67
+
67
68
  # Use provided client or get singleton from databricks_client
68
69
  if workspace_client:
69
70
  self.ws_client = workspace_client
70
71
  else:
71
72
  from src.core.databricks_client import get_databricks_client
72
73
  self.ws_client = get_databricks_client()
73
-
74
- # Initialize OpenAI-compatible client for LLM calls
75
- self.llm_client = self.ws_client.serving_endpoints.get_open_ai_client()
74
+
75
+ # Initialize OpenAI-compatible client for LLM calls through Unity AI Gateway
76
+ self.llm_client = gateway_openai_client(self.ws_client)
76
77
 
77
78
  # Load default prompts
78
79
  self.SYSTEM_PROMPT = DEFAULT_SYSTEM_PROMPT
@@ -1,4 +1,4 @@
1
- """Exact Databricks foundation-model endpoint discovery and validation."""
1
+ """Unity AI Gateway model discovery and validation for the workbench (ws2a)."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -9,8 +9,7 @@ from typing import Any, Literal, Protocol
9
9
 
10
10
  import requests
11
11
  from databricks.sdk import WorkspaceClient
12
- from databricks.sdk.errors import DatabricksError, PermissionDenied, ResourceDoesNotExist
13
- from databricks.sdk.service.serving import EndpointStateConfigUpdate, EndpointStateReady
12
+ from databricks.sdk.errors import DatabricksError, NotFound, PermissionDenied
14
13
 
15
14
  CatalogFailureCode = Literal["catalog_forbidden", "catalog_unavailable"]
16
15
  EndpointValidationCode = Literal[
@@ -23,6 +22,8 @@ EndpointValidationCode = Literal[
23
22
  "endpoint_update_in_progress",
24
23
  "endpoint_update_failed",
25
24
  "endpoint_update_canceled",
25
+ "endpoint_not_gateway_model",
26
+ "endpoint_not_chat_model",
26
27
  ]
27
28
 
28
29
 
@@ -72,6 +73,27 @@ _TRANSPORT_FAILURES: tuple[type[BaseException], ...] = (
72
73
  )
73
74
 
74
75
 
76
+ GATEWAY_ENDPOINTS_PATH = "/api/ai-gateway/v2/endpoints"
77
+ GATEWAY_CHAT_API_TYPE = "mlflow/v1/chat/completions"
78
+ _GATEWAY_PREFIX = "databricks-"
79
+ _SYSTEM_AI_PREFIX = "system.ai."
80
+
81
+
82
+ def gateway_invocable_name(gateway_endpoint_name: str) -> str | None:
83
+ """``databricks-<m>`` -> ``system.ai.<m>`` (spec §2 naming rule); otherwise ``None``."""
84
+ if not gateway_endpoint_name.startswith(_GATEWAY_PREFIX):
85
+ return None
86
+ model = gateway_endpoint_name[len(_GATEWAY_PREFIX):]
87
+ return f"{_SYSTEM_AI_PREFIX}{model}" if model else None
88
+
89
+
90
+ def gateway_endpoint_name(model_name: str) -> str:
91
+ """``system.ai.<m>`` -> ``databricks-<m>``; any other (legacy) name is looked up as-is."""
92
+ if model_name.startswith(_SYSTEM_AI_PREFIX):
93
+ return f"{_GATEWAY_PREFIX}{model_name[len(_SYSTEM_AI_PREFIX):]}"
94
+ return model_name
95
+
96
+
75
97
  class ModelEndpointCatalog(Protocol):
76
98
  def list_system_models(self) -> SystemModelDiscovery: ...
77
99
 
@@ -103,6 +125,20 @@ def validate_endpoint_name_policy(name: str) -> None:
103
125
  )
104
126
 
105
127
 
128
+ _GATEWAY_MODEL_NAME = re.compile(r"^system\.ai\.[a-z0-9][a-z0-9._-]*[a-z0-9]$")
129
+
130
+
131
+ def validate_gateway_model_name(name: str) -> None:
132
+ """A changed draft model must be a ``system.ai.*`` Gateway name (spec §5.2)."""
133
+ if not _GATEWAY_MODEL_NAME.fullmatch(name):
134
+ raise EndpointValidationFailure(
135
+ "endpoint_not_gateway_model",
136
+ "Model name must start with `system.ai.` and contain only lowercase letters, "
137
+ "digits, hyphens, underscores and periods.",
138
+ False,
139
+ )
140
+
141
+
106
142
  #: The remote check runs while the save holds the exclusive draft lock, so its
107
143
  #: client must not inherit the SDK's 300 s default retry window. With a 5 s
108
144
  #: window and a 3 s per-request timeout, measured transport exhaustion ends
@@ -162,7 +198,7 @@ class DatabricksModelEndpointCatalog:
162
198
 
163
199
  def list_system_models(self) -> SystemModelDiscovery:
164
200
  try:
165
- endpoints = tuple(self._workspace_client.serving_endpoints.list())
201
+ listed = self._workspace_client.api_client.do("GET", GATEWAY_ENDPOINTS_PATH)
166
202
  except PermissionDenied as error:
167
203
  raise ModelEndpointCatalogFailure(
168
204
  "catalog_forbidden",
@@ -177,45 +213,31 @@ class DatabricksModelEndpointCatalog:
177
213
  ) from error
178
214
 
179
215
  discovered: list[SystemModelEndpoint] = []
180
- for endpoint in endpoints:
181
- served_entities = getattr(endpoint.config, "served_entities", None) or ()
182
- foundation_model = next(
183
- (
184
- getattr(entity, "foundation_model", None)
185
- for entity in served_entities
186
- if getattr(entity, "foundation_model", None) is not None
187
- ),
188
- None,
189
- )
190
- if foundation_model is None:
191
- continue
192
-
193
- name = getattr(endpoint, "name", None)
216
+ for entry in (listed or {}).get("endpoints") or ():
217
+ name = entry.get("name") if isinstance(entry, dict) else None
194
218
  if not isinstance(name, str) or not name.strip():
195
219
  raise ModelEndpointCatalogFailure(
196
220
  "catalog_unavailable",
197
221
  "Model endpoint discovery returned an endpoint without a name.",
198
222
  True,
199
223
  )
200
-
224
+ invocable = gateway_invocable_name(name)
225
+ if invocable is None:
226
+ continue
201
227
  discovered.append(
202
- SystemModelEndpoint(
203
- name=name,
204
- display_name=getattr(foundation_model, "display_name", None),
205
- description=getattr(foundation_model, "description", None),
206
- docs=getattr(foundation_model, "docs", None),
207
- )
228
+ SystemModelEndpoint(name=invocable, display_name=None, description=None, docs=None)
208
229
  )
209
230
 
210
- discovered.sort(key=lambda item: ((item.display_name or item.name).casefold(), item.name))
231
+ discovered.sort(key=lambda item: item.name)
211
232
  return SystemModelDiscovery(endpoints=tuple(discovered))
212
233
 
213
234
  def validate_custom_endpoint_remote(self, name: str) -> None:
214
235
  # Defensive: never let a path-shaped name reach the interpolated request.
215
236
  validate_endpoint_name_policy(name)
237
+ path = f"{GATEWAY_ENDPOINTS_PATH}/{gateway_endpoint_name(name)}"
216
238
  try:
217
- detail = self._workspace_client.serving_endpoints.get(name)
218
- except ResourceDoesNotExist as error:
239
+ detail = self._workspace_client.api_client.do("GET", path)
240
+ except NotFound as error:
219
241
  raise _validation_failure(
220
242
  "endpoint_unknown", "Endpoint name was not found.", False
221
243
  ) from error
@@ -232,41 +254,10 @@ class DatabricksModelEndpointCatalog:
232
254
  True,
233
255
  ) from error
234
256
 
235
- if getattr(detail, "name", None) != name:
236
- raise _validation_failure(
237
- "endpoint_name_mismatch",
238
- "Endpoint validation did not return the exact requested name.",
239
- False,
240
- )
241
-
242
- state = getattr(detail, "state", None)
243
- config_update = getattr(state, "config_update", None)
244
- if config_update == EndpointStateConfigUpdate.IN_PROGRESS:
245
- raise _validation_failure(
246
- "endpoint_update_in_progress",
247
- "Endpoint configuration update is in progress.",
248
- True,
249
- )
250
- if config_update == EndpointStateConfigUpdate.UPDATE_FAILED:
251
- raise _validation_failure(
252
- "endpoint_update_failed",
253
- "Endpoint configuration update failed.",
254
- False,
255
- )
256
- if config_update == EndpointStateConfigUpdate.UPDATE_CANCELED:
257
+ api_types = (detail or {}).get("supported_api_types") or ()
258
+ if GATEWAY_CHAT_API_TYPE not in api_types:
257
259
  raise _validation_failure(
258
- "endpoint_update_canceled",
259
- "Endpoint configuration update was canceled.",
260
- False,
261
- )
262
- if (
263
- getattr(state, "ready", None) != EndpointStateReady.READY
264
- or config_update != EndpointStateConfigUpdate.NOT_UPDATING
265
- ):
266
- raise _validation_failure(
267
- "endpoint_not_ready",
268
- "Endpoint is not ready for invocation.",
269
- True,
260
+ "endpoint_not_chat_model", "Endpoint is not a chat model.", False
270
261
  )
271
262
 
272
263