databricks-tellr-app 0.4.3.dev19__tar.gz → 0.4.3.dev21__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.
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/PKG-INFO +10 -8
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app/run.py +45 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app.egg-info/PKG-INFO +10 -8
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app.egg-info/SOURCES.txt +62 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app.egg-info/requires.txt +9 -7
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/pyproject.toml +17 -8
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/fixtures/tour_demo_deck.json +52 -1
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/main.py +22 -15
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/mcp_auth.py +25 -36
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/chat.py +80 -5
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/sessions.py +74 -5
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/settings/design_systems.py +2 -22
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/slides.py +133 -4
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/tour.py +28 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/verification.py +9 -9
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/version.py +2 -6
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/agent_config.py +4 -10
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/settings/requests.py +0 -11
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/settings/responses.py +0 -2
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/streaming.py +23 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/chat_service.py +852 -13
- databricks_tellr_app-0.4.3.dev21/src/api/services/deck_level_writer.py +407 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/job_queue.py +15 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/session_manager.py +1282 -47
- databricks_tellr_app-0.4.3.dev21/src/api/services/slide_repository.py +378 -0
- databricks_tellr_app-0.4.3.dev21/src/core/backfill_session_slides_startup.py +315 -0
- databricks_tellr_app-0.4.3.dev21/src/core/checkpointer.py +488 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/config_loader.py +4 -11
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/database.py +375 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/databricks_client.py +0 -50
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/defaults.py +9 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/encryption.py +32 -54
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/init_default_profile.py +0 -5
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/migrate_profiles_to_agent_config.py +4 -28
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/settings_db.py +3 -2
- databricks_tellr_app-0.4.3.dev21/src/core/skills/__init__.py +225 -0
- databricks_tellr_app-0.4.3.dev21/src/core/skills/architect.py +64 -0
- databricks_tellr_app-0.4.3.dev21/src/core/skills/build_reviewer.py +80 -0
- databricks_tellr_app-0.4.3.dev21/src/core/skills/builder.py +54 -0
- databricks_tellr_app-0.4.3.dev21/src/core/skills/data_analyst.py +38 -0
- databricks_tellr_app-0.4.3.dev21/src/core/skills/deck_reviewer.py +24 -0
- databricks_tellr_app-0.4.3.dev21/src/core/skills/fix_reviewer.py +22 -0
- databricks_tellr_app-0.4.3.dev21/src/core/skills/fixer.py +52 -0
- databricks_tellr_app-0.4.3.dev21/src/core/strip_retired_prompt_keys.py +210 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/__init__.py +8 -0
- databricks_tellr_app-0.4.3.dev21/src/database/models/deck_review.py +77 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/encryption_key.py +2 -6
- databricks_tellr_app-0.4.3.dev21/src/database/models/graph_checkpoint.py +104 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/prompts.py +7 -6
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/session.py +127 -1
- databricks_tellr_app-0.4.3.dev21/src/domain/deck_spec.py +166 -0
- databricks_tellr_app-0.4.3.dev21/src/domain/finding.py +313 -0
- databricks_tellr_app-0.4.3.dev21/src/domain/skill_io.py +259 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/domain/slide_deck.py +10 -4
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/agent.py +24 -5
- databricks_tellr_app-0.4.3.dev21/src/services/agent_factory.py +150 -0
- databricks_tellr_app-0.4.3.dev19/src/services/agent_factory.py → databricks_tellr_app-0.4.3.dev21/src/services/agent_resolution.py +260 -168
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/config_service.py +0 -12
- databricks_tellr_app-0.4.3.dev21/src/services/deck_css_aggregator.py +211 -0
- databricks_tellr_app-0.4.3.dev21/src/services/deck_review_store.py +263 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/design_system_compiler.py +1 -20
- databricks_tellr_app-0.4.3.dev21/src/services/foreman_service.py +307 -0
- databricks_tellr_app-0.4.3.dev21/src/services/graph/__init__.py +6 -0
- databricks_tellr_app-0.4.3.dev21/src/services/graph/builder.py +265 -0
- databricks_tellr_app-0.4.3.dev21/src/services/graph/event_emitter.py +186 -0
- databricks_tellr_app-0.4.3.dev21/src/services/graph/nodes.py +2682 -0
- databricks_tellr_app-0.4.3.dev21/src/services/graph/routers.py +203 -0
- databricks_tellr_app-0.4.3.dev21/src/services/graph/state.py +307 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/html_to_google_slides.py +1 -1
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/html_to_pptx.py +2 -2
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/profile_service.py +0 -7
- databricks_tellr_app-0.4.3.dev21/src/services/spec_sync.py +756 -0
- databricks_tellr_app-0.4.3.dev21/src/services/template_sections.py +512 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/validator.py +6 -10
- databricks_tellr_app-0.4.3.dev21/src/utils/css_utils.py +289 -0
- databricks_tellr_app-0.4.3.dev21/src/utils/graph_safety.py +100 -0
- databricks_tellr_app-0.4.3.dev19/src/utils/css_utils.py +0 -78
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/README.md +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app.egg-info/dependency_links.txt +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app.egg-info/top_level.txt +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/setup.cfg +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/setup.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/_otel_bootstrap.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/mcp_server.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/middleware/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/middleware/csrf.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/middleware/request_logging.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/middleware/security_headers.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/_authz.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/admin.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/admin_usage.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/agent_config.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/deck_contributors.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/export.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/feedback.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/google_slides.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/images.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/local_version.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/profiles.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/settings/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/settings/contributors.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/settings/deck_prompts.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/settings/identities.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/settings/slide_styles.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/setup.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/routes/tools.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/feedback.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/requests.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/responses.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/schemas/settings/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/export_job_queue.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/feedback_service.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/session_naming.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/usage_events.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/services/usage_service.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/utils/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/api/utils/validation.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/context_utils.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/lakebase.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/mlflow_agent_spans.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/mlflow_tracing.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/otel_logging.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/permission_context.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/prompt_modules.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/core/user_context.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/deck_contributor.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/design_system.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/feedback.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/genie_space.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/google_global_credentials.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/google_oauth_token.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/identity.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/image.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/profile.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/profile_contributor.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/request_log.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/slide_deck_prompt.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/slide_style_library.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/usage_event.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/models/user_preference.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/database/types.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/domain/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/domain/slide.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/config_validator.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/converter_jail/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/converter_jail/ast_guard.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/converter_jail/codeprep.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/converter_jail/gslides_runner.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/converter_jail/jail.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/converter_jail/pptx_runner.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/converter_jail/protocol.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/design_system_service.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/design_system_templates.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/drive_uploader.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/evaluation/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/evaluation/llm_judge.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/genie_service.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/google_slides_auth.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/google_slides_prompts_defaults.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/identity_provider.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/identity_providers/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/identity_providers/account_provider.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/identity_providers/local_provider.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/identity_providers/workspace_provider.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/image_service.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/image_tools.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/permission_service.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/pptx_from_html_huashu.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/pptx_from_records.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/pptx_prompts_defaults.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/streaming_callback.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/tools/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/tools/agent_bricks_tool.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/tools/ds_asset_tool.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/tools/genie_tool.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/tools/mcp_tool.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/tools/model_endpoint_tool.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/services/tools/vector_tool.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/__init__.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/ds_asset_utils.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/error_handling.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/html_safety.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/html_utils.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/image_utils.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/js_validator.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/logging_config.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/pi_filter.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/slide_hash.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/src/utils/spotlight.py +0 -0
- {databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/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.
|
|
3
|
+
Version: 0.4.3.dev21
|
|
4
4
|
Summary: Tellr application package for Databricks Apps
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -10,10 +10,10 @@ Requires-Dist: python-multipart==0.0.20
|
|
|
10
10
|
Requires-Dist: pydantic==2.12.4
|
|
11
11
|
Requires-Dist: pydantic-settings==2.12.0
|
|
12
12
|
Requires-Dist: databricks-langchain==0.9.0
|
|
13
|
-
Requires-Dist: langchain==1.
|
|
14
|
-
Requires-Dist: langchain-core==1.
|
|
15
|
-
Requires-Dist: langchain-community==0.4.
|
|
16
|
-
Requires-Dist: langchain-text-splitters==1.
|
|
13
|
+
Requires-Dist: langchain==1.3.14
|
|
14
|
+
Requires-Dist: langchain-core==1.5.3
|
|
15
|
+
Requires-Dist: langchain-community==0.4.2
|
|
16
|
+
Requires-Dist: langchain-text-splitters==1.1.2
|
|
17
17
|
Requires-Dist: litellm==1.80.11
|
|
18
18
|
Requires-Dist: mcp==1.27.0
|
|
19
19
|
Requires-Dist: opentelemetry-api==1.38.0
|
|
@@ -47,9 +47,11 @@ Requires-Dist: databricks-ai-bridge==0.21.0
|
|
|
47
47
|
Requires-Dist: databricks-ai-search==0.76
|
|
48
48
|
Requires-Dist: databricks-connect==16.1.7
|
|
49
49
|
Requires-Dist: databricks-vectorsearch==0.75
|
|
50
|
-
Requires-Dist: langchain-classic==1.0.
|
|
51
|
-
Requires-Dist: langgraph==1.
|
|
52
|
-
Requires-Dist: langgraph-
|
|
50
|
+
Requires-Dist: langchain-classic==1.0.8
|
|
51
|
+
Requires-Dist: langgraph==1.2.10
|
|
52
|
+
Requires-Dist: langgraph-checkpoint==4.1.1
|
|
53
|
+
Requires-Dist: langgraph-prebuilt==1.1.0
|
|
54
|
+
Requires-Dist: langgraph-sdk==0.4.2
|
|
53
55
|
Requires-Dist: langsmith==0.9.5
|
|
54
56
|
Requires-Dist: unitycatalog-ai==0.3.2
|
|
55
57
|
Requires-Dist: unitycatalog-langchain==0.3.0
|
{databricks_tellr_app-0.4.3.dev19 → databricks_tellr_app-0.4.3.dev21}/databricks_tellr_app/run.py
RENAMED
|
@@ -74,6 +74,29 @@ def init_database(seed_databricks_defaults: bool = False) -> None:
|
|
|
74
74
|
logger.error(f"Failed to migrate profiles/sessions to agent_config: {e}\n{tb}")
|
|
75
75
|
raise SystemExit(1) from e
|
|
76
76
|
|
|
77
|
+
# Row-per-slide (PR1): migrate historical deck_json blobs into session_slides
|
|
78
|
+
# rows. Runs HERE, pre-fork, for the same reason as the two migrations above —
|
|
79
|
+
# the uvicorn workers must never execute migration code. It originally lived in
|
|
80
|
+
# the FastAPI lifespan; main moved migrations out of the lifespan while this
|
|
81
|
+
# branch was in flight, so it was relocated on merge rather than dropped.
|
|
82
|
+
#
|
|
83
|
+
# Guarded by a per-deck NOT EXISTS anti-join over session_slides (index-only
|
|
84
|
+
# against its composite PK), so it is a no-op scan once every deck has rows.
|
|
85
|
+
# A deck whose blob will not parse is logged and skipped, never raised — one
|
|
86
|
+
# bad row must not abort startup.
|
|
87
|
+
logger.info("Backfilling session_slides rows...")
|
|
88
|
+
try:
|
|
89
|
+
from src.core.database import get_session_local
|
|
90
|
+
from src.core.backfill_session_slides_startup import backfill_unmigrated_decks
|
|
91
|
+
|
|
92
|
+
slide_decks = backfill_unmigrated_decks(get_session_local())
|
|
93
|
+
if slide_decks:
|
|
94
|
+
logger.info(f"Backfilled {slide_decks} deck(s) into session_slides rows")
|
|
95
|
+
except Exception as e:
|
|
96
|
+
tb = traceback.format_exc()
|
|
97
|
+
logger.error(f"Failed to backfill session_slides rows: {e}\n{tb}")
|
|
98
|
+
raise SystemExit(1) from e
|
|
99
|
+
|
|
77
100
|
# Seed default content
|
|
78
101
|
logger.info(f"Seeding defaults (include_databricks={seed_databricks_defaults})...")
|
|
79
102
|
try:
|
|
@@ -97,6 +120,28 @@ def init_database(seed_databricks_defaults: bool = False) -> None:
|
|
|
97
120
|
logger.error(f"Failed to ensure encryption key: {e}\n{tb}")
|
|
98
121
|
raise SystemExit(1) from e
|
|
99
122
|
|
|
123
|
+
# Retired prompt overrides: strip 'system_prompt' and
|
|
124
|
+
# 'slide_editing_instructions' out of every stored agent_config blob. The
|
|
125
|
+
# physical columns are dropped inside init_db()'s migration chain, early,
|
|
126
|
+
# because a database that still has them cannot insert a profile; the BLOB
|
|
127
|
+
# strip runs LAST, deliberately — it is the one position no later step can
|
|
128
|
+
# undo by writing a fresh blob (seed_defaults above creates profiles).
|
|
129
|
+
# A blob that will not parse is logged and skipped, never raised, so one bad
|
|
130
|
+
# row cannot abort startup; anything else here is SystemExit(1) like the five
|
|
131
|
+
# steps above.
|
|
132
|
+
logger.info("Stripping retired prompt keys from agent_config blobs...")
|
|
133
|
+
try:
|
|
134
|
+
from src.core.database import get_session_local
|
|
135
|
+
from src.core.strip_retired_prompt_keys import strip_retired_prompt_keys
|
|
136
|
+
|
|
137
|
+
stripped = strip_retired_prompt_keys(get_session_local())
|
|
138
|
+
if stripped:
|
|
139
|
+
logger.info(f"Stripped retired prompt keys from {stripped} row(s)")
|
|
140
|
+
except Exception as e:
|
|
141
|
+
tb = traceback.format_exc()
|
|
142
|
+
logger.error(f"Failed to strip retired prompt keys from agent_config: {e}\n{tb}")
|
|
143
|
+
raise SystemExit(1) from e
|
|
144
|
+
|
|
100
145
|
|
|
101
146
|
def main() -> None:
|
|
102
147
|
"""Start the uvicorn server."""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: databricks-tellr-app
|
|
3
|
-
Version: 0.4.3.
|
|
3
|
+
Version: 0.4.3.dev21
|
|
4
4
|
Summary: Tellr application package for Databricks Apps
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -10,10 +10,10 @@ Requires-Dist: python-multipart==0.0.20
|
|
|
10
10
|
Requires-Dist: pydantic==2.12.4
|
|
11
11
|
Requires-Dist: pydantic-settings==2.12.0
|
|
12
12
|
Requires-Dist: databricks-langchain==0.9.0
|
|
13
|
-
Requires-Dist: langchain==1.
|
|
14
|
-
Requires-Dist: langchain-core==1.
|
|
15
|
-
Requires-Dist: langchain-community==0.4.
|
|
16
|
-
Requires-Dist: langchain-text-splitters==1.
|
|
13
|
+
Requires-Dist: langchain==1.3.14
|
|
14
|
+
Requires-Dist: langchain-core==1.5.3
|
|
15
|
+
Requires-Dist: langchain-community==0.4.2
|
|
16
|
+
Requires-Dist: langchain-text-splitters==1.1.2
|
|
17
17
|
Requires-Dist: litellm==1.80.11
|
|
18
18
|
Requires-Dist: mcp==1.27.0
|
|
19
19
|
Requires-Dist: opentelemetry-api==1.38.0
|
|
@@ -47,9 +47,11 @@ Requires-Dist: databricks-ai-bridge==0.21.0
|
|
|
47
47
|
Requires-Dist: databricks-ai-search==0.76
|
|
48
48
|
Requires-Dist: databricks-connect==16.1.7
|
|
49
49
|
Requires-Dist: databricks-vectorsearch==0.75
|
|
50
|
-
Requires-Dist: langchain-classic==1.0.
|
|
51
|
-
Requires-Dist: langgraph==1.
|
|
52
|
-
Requires-Dist: langgraph-
|
|
50
|
+
Requires-Dist: langchain-classic==1.0.8
|
|
51
|
+
Requires-Dist: langgraph==1.2.10
|
|
52
|
+
Requires-Dist: langgraph-checkpoint==4.1.1
|
|
53
|
+
Requires-Dist: langgraph-prebuilt==1.1.0
|
|
54
|
+
Requires-Dist: langgraph-sdk==0.4.2
|
|
53
55
|
Requires-Dist: langsmith==0.9.5
|
|
54
56
|
Requires-Dist: unitycatalog-ai==0.3.2
|
|
55
57
|
Requires-Dist: unitycatalog-langchain==0.3.0
|
|
@@ -51,16 +51,20 @@ setup.py
|
|
|
51
51
|
./src/api/schemas/settings/responses.py
|
|
52
52
|
./src/api/services/__init__.py
|
|
53
53
|
./src/api/services/chat_service.py
|
|
54
|
+
./src/api/services/deck_level_writer.py
|
|
54
55
|
./src/api/services/export_job_queue.py
|
|
55
56
|
./src/api/services/feedback_service.py
|
|
56
57
|
./src/api/services/job_queue.py
|
|
57
58
|
./src/api/services/session_manager.py
|
|
58
59
|
./src/api/services/session_naming.py
|
|
60
|
+
./src/api/services/slide_repository.py
|
|
59
61
|
./src/api/services/usage_events.py
|
|
60
62
|
./src/api/services/usage_service.py
|
|
61
63
|
./src/api/utils/__init__.py
|
|
62
64
|
./src/api/utils/validation.py
|
|
63
65
|
./src/core/__init__.py
|
|
66
|
+
./src/core/backfill_session_slides_startup.py
|
|
67
|
+
./src/core/checkpointer.py
|
|
64
68
|
./src/core/config_loader.py
|
|
65
69
|
./src/core/context_utils.py
|
|
66
70
|
./src/core/database.py
|
|
@@ -76,17 +80,28 @@ setup.py
|
|
|
76
80
|
./src/core/permission_context.py
|
|
77
81
|
./src/core/prompt_modules.py
|
|
78
82
|
./src/core/settings_db.py
|
|
83
|
+
./src/core/strip_retired_prompt_keys.py
|
|
79
84
|
./src/core/user_context.py
|
|
85
|
+
./src/core/skills/__init__.py
|
|
86
|
+
./src/core/skills/architect.py
|
|
87
|
+
./src/core/skills/build_reviewer.py
|
|
88
|
+
./src/core/skills/builder.py
|
|
89
|
+
./src/core/skills/data_analyst.py
|
|
90
|
+
./src/core/skills/deck_reviewer.py
|
|
91
|
+
./src/core/skills/fix_reviewer.py
|
|
92
|
+
./src/core/skills/fixer.py
|
|
80
93
|
./src/database/__init__.py
|
|
81
94
|
./src/database/types.py
|
|
82
95
|
./src/database/models/__init__.py
|
|
83
96
|
./src/database/models/deck_contributor.py
|
|
97
|
+
./src/database/models/deck_review.py
|
|
84
98
|
./src/database/models/design_system.py
|
|
85
99
|
./src/database/models/encryption_key.py
|
|
86
100
|
./src/database/models/feedback.py
|
|
87
101
|
./src/database/models/genie_space.py
|
|
88
102
|
./src/database/models/google_global_credentials.py
|
|
89
103
|
./src/database/models/google_oauth_token.py
|
|
104
|
+
./src/database/models/graph_checkpoint.py
|
|
90
105
|
./src/database/models/identity.py
|
|
91
106
|
./src/database/models/image.py
|
|
92
107
|
./src/database/models/profile.py
|
|
@@ -99,17 +114,24 @@ setup.py
|
|
|
99
114
|
./src/database/models/usage_event.py
|
|
100
115
|
./src/database/models/user_preference.py
|
|
101
116
|
./src/domain/__init__.py
|
|
117
|
+
./src/domain/deck_spec.py
|
|
118
|
+
./src/domain/finding.py
|
|
119
|
+
./src/domain/skill_io.py
|
|
102
120
|
./src/domain/slide.py
|
|
103
121
|
./src/domain/slide_deck.py
|
|
104
122
|
./src/services/__init__.py
|
|
105
123
|
./src/services/agent.py
|
|
106
124
|
./src/services/agent_factory.py
|
|
125
|
+
./src/services/agent_resolution.py
|
|
107
126
|
./src/services/config_service.py
|
|
108
127
|
./src/services/config_validator.py
|
|
128
|
+
./src/services/deck_css_aggregator.py
|
|
129
|
+
./src/services/deck_review_store.py
|
|
109
130
|
./src/services/design_system_compiler.py
|
|
110
131
|
./src/services/design_system_service.py
|
|
111
132
|
./src/services/design_system_templates.py
|
|
112
133
|
./src/services/drive_uploader.py
|
|
134
|
+
./src/services/foreman_service.py
|
|
113
135
|
./src/services/genie_service.py
|
|
114
136
|
./src/services/google_slides_auth.py
|
|
115
137
|
./src/services/google_slides_prompts_defaults.py
|
|
@@ -123,7 +145,9 @@ setup.py
|
|
|
123
145
|
./src/services/pptx_from_records.py
|
|
124
146
|
./src/services/pptx_prompts_defaults.py
|
|
125
147
|
./src/services/profile_service.py
|
|
148
|
+
./src/services/spec_sync.py
|
|
126
149
|
./src/services/streaming_callback.py
|
|
150
|
+
./src/services/template_sections.py
|
|
127
151
|
./src/services/validator.py
|
|
128
152
|
./src/services/converter_jail/__init__.py
|
|
129
153
|
./src/services/converter_jail/ast_guard.py
|
|
@@ -134,6 +158,12 @@ setup.py
|
|
|
134
158
|
./src/services/converter_jail/protocol.py
|
|
135
159
|
./src/services/evaluation/__init__.py
|
|
136
160
|
./src/services/evaluation/llm_judge.py
|
|
161
|
+
./src/services/graph/__init__.py
|
|
162
|
+
./src/services/graph/builder.py
|
|
163
|
+
./src/services/graph/event_emitter.py
|
|
164
|
+
./src/services/graph/nodes.py
|
|
165
|
+
./src/services/graph/routers.py
|
|
166
|
+
./src/services/graph/state.py
|
|
137
167
|
./src/services/identity_providers/__init__.py
|
|
138
168
|
./src/services/identity_providers/account_provider.py
|
|
139
169
|
./src/services/identity_providers/local_provider.py
|
|
@@ -149,6 +179,7 @@ setup.py
|
|
|
149
179
|
./src/utils/css_utils.py
|
|
150
180
|
./src/utils/ds_asset_utils.py
|
|
151
181
|
./src/utils/error_handling.py
|
|
182
|
+
./src/utils/graph_safety.py
|
|
152
183
|
./src/utils/html_safety.py
|
|
153
184
|
./src/utils/html_utils.py
|
|
154
185
|
./src/utils/image_utils.py
|
|
@@ -213,16 +244,20 @@ src/api/schemas/settings/requests.py
|
|
|
213
244
|
src/api/schemas/settings/responses.py
|
|
214
245
|
src/api/services/__init__.py
|
|
215
246
|
src/api/services/chat_service.py
|
|
247
|
+
src/api/services/deck_level_writer.py
|
|
216
248
|
src/api/services/export_job_queue.py
|
|
217
249
|
src/api/services/feedback_service.py
|
|
218
250
|
src/api/services/job_queue.py
|
|
219
251
|
src/api/services/session_manager.py
|
|
220
252
|
src/api/services/session_naming.py
|
|
253
|
+
src/api/services/slide_repository.py
|
|
221
254
|
src/api/services/usage_events.py
|
|
222
255
|
src/api/services/usage_service.py
|
|
223
256
|
src/api/utils/__init__.py
|
|
224
257
|
src/api/utils/validation.py
|
|
225
258
|
src/core/__init__.py
|
|
259
|
+
src/core/backfill_session_slides_startup.py
|
|
260
|
+
src/core/checkpointer.py
|
|
226
261
|
src/core/config_loader.py
|
|
227
262
|
src/core/context_utils.py
|
|
228
263
|
src/core/database.py
|
|
@@ -238,17 +273,28 @@ src/core/otel_logging.py
|
|
|
238
273
|
src/core/permission_context.py
|
|
239
274
|
src/core/prompt_modules.py
|
|
240
275
|
src/core/settings_db.py
|
|
276
|
+
src/core/strip_retired_prompt_keys.py
|
|
241
277
|
src/core/user_context.py
|
|
278
|
+
src/core/skills/__init__.py
|
|
279
|
+
src/core/skills/architect.py
|
|
280
|
+
src/core/skills/build_reviewer.py
|
|
281
|
+
src/core/skills/builder.py
|
|
282
|
+
src/core/skills/data_analyst.py
|
|
283
|
+
src/core/skills/deck_reviewer.py
|
|
284
|
+
src/core/skills/fix_reviewer.py
|
|
285
|
+
src/core/skills/fixer.py
|
|
242
286
|
src/database/__init__.py
|
|
243
287
|
src/database/types.py
|
|
244
288
|
src/database/models/__init__.py
|
|
245
289
|
src/database/models/deck_contributor.py
|
|
290
|
+
src/database/models/deck_review.py
|
|
246
291
|
src/database/models/design_system.py
|
|
247
292
|
src/database/models/encryption_key.py
|
|
248
293
|
src/database/models/feedback.py
|
|
249
294
|
src/database/models/genie_space.py
|
|
250
295
|
src/database/models/google_global_credentials.py
|
|
251
296
|
src/database/models/google_oauth_token.py
|
|
297
|
+
src/database/models/graph_checkpoint.py
|
|
252
298
|
src/database/models/identity.py
|
|
253
299
|
src/database/models/image.py
|
|
254
300
|
src/database/models/profile.py
|
|
@@ -261,17 +307,24 @@ src/database/models/slide_style_library.py
|
|
|
261
307
|
src/database/models/usage_event.py
|
|
262
308
|
src/database/models/user_preference.py
|
|
263
309
|
src/domain/__init__.py
|
|
310
|
+
src/domain/deck_spec.py
|
|
311
|
+
src/domain/finding.py
|
|
312
|
+
src/domain/skill_io.py
|
|
264
313
|
src/domain/slide.py
|
|
265
314
|
src/domain/slide_deck.py
|
|
266
315
|
src/services/__init__.py
|
|
267
316
|
src/services/agent.py
|
|
268
317
|
src/services/agent_factory.py
|
|
318
|
+
src/services/agent_resolution.py
|
|
269
319
|
src/services/config_service.py
|
|
270
320
|
src/services/config_validator.py
|
|
321
|
+
src/services/deck_css_aggregator.py
|
|
322
|
+
src/services/deck_review_store.py
|
|
271
323
|
src/services/design_system_compiler.py
|
|
272
324
|
src/services/design_system_service.py
|
|
273
325
|
src/services/design_system_templates.py
|
|
274
326
|
src/services/drive_uploader.py
|
|
327
|
+
src/services/foreman_service.py
|
|
275
328
|
src/services/genie_service.py
|
|
276
329
|
src/services/google_slides_auth.py
|
|
277
330
|
src/services/google_slides_prompts_defaults.py
|
|
@@ -285,7 +338,9 @@ src/services/pptx_from_html_huashu.py
|
|
|
285
338
|
src/services/pptx_from_records.py
|
|
286
339
|
src/services/pptx_prompts_defaults.py
|
|
287
340
|
src/services/profile_service.py
|
|
341
|
+
src/services/spec_sync.py
|
|
288
342
|
src/services/streaming_callback.py
|
|
343
|
+
src/services/template_sections.py
|
|
289
344
|
src/services/validator.py
|
|
290
345
|
src/services/converter_jail/__init__.py
|
|
291
346
|
src/services/converter_jail/ast_guard.py
|
|
@@ -296,6 +351,12 @@ src/services/converter_jail/pptx_runner.py
|
|
|
296
351
|
src/services/converter_jail/protocol.py
|
|
297
352
|
src/services/evaluation/__init__.py
|
|
298
353
|
src/services/evaluation/llm_judge.py
|
|
354
|
+
src/services/graph/__init__.py
|
|
355
|
+
src/services/graph/builder.py
|
|
356
|
+
src/services/graph/event_emitter.py
|
|
357
|
+
src/services/graph/nodes.py
|
|
358
|
+
src/services/graph/routers.py
|
|
359
|
+
src/services/graph/state.py
|
|
299
360
|
src/services/identity_providers/__init__.py
|
|
300
361
|
src/services/identity_providers/account_provider.py
|
|
301
362
|
src/services/identity_providers/local_provider.py
|
|
@@ -311,6 +372,7 @@ src/utils/__init__.py
|
|
|
311
372
|
src/utils/css_utils.py
|
|
312
373
|
src/utils/ds_asset_utils.py
|
|
313
374
|
src/utils/error_handling.py
|
|
375
|
+
src/utils/graph_safety.py
|
|
314
376
|
src/utils/html_safety.py
|
|
315
377
|
src/utils/html_utils.py
|
|
316
378
|
src/utils/image_utils.py
|
|
@@ -4,10 +4,10 @@ python-multipart==0.0.20
|
|
|
4
4
|
pydantic==2.12.4
|
|
5
5
|
pydantic-settings==2.12.0
|
|
6
6
|
databricks-langchain==0.9.0
|
|
7
|
-
langchain==1.
|
|
8
|
-
langchain-core==1.
|
|
9
|
-
langchain-community==0.4.
|
|
10
|
-
langchain-text-splitters==1.
|
|
7
|
+
langchain==1.3.14
|
|
8
|
+
langchain-core==1.5.3
|
|
9
|
+
langchain-community==0.4.2
|
|
10
|
+
langchain-text-splitters==1.1.2
|
|
11
11
|
litellm==1.80.11
|
|
12
12
|
mcp==1.27.0
|
|
13
13
|
opentelemetry-api==1.38.0
|
|
@@ -41,9 +41,11 @@ databricks-ai-bridge==0.21.0
|
|
|
41
41
|
databricks-ai-search==0.76
|
|
42
42
|
databricks-connect==16.1.7
|
|
43
43
|
databricks-vectorsearch==0.75
|
|
44
|
-
langchain-classic==1.0.
|
|
45
|
-
langgraph==1.
|
|
46
|
-
langgraph-
|
|
44
|
+
langchain-classic==1.0.8
|
|
45
|
+
langgraph==1.2.10
|
|
46
|
+
langgraph-checkpoint==4.1.1
|
|
47
|
+
langgraph-prebuilt==1.1.0
|
|
48
|
+
langgraph-sdk==0.4.2
|
|
47
49
|
langsmith==0.9.5
|
|
48
50
|
unitycatalog-ai==0.3.2
|
|
49
51
|
unitycatalog-langchain==0.3.0
|
|
@@ -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.
|
|
7
|
+
version = "0.4.3.dev21"
|
|
8
8
|
description = "Tellr application package for Databricks Apps"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -15,10 +15,10 @@ dependencies = [
|
|
|
15
15
|
"pydantic==2.12.4",
|
|
16
16
|
"pydantic-settings==2.12.0",
|
|
17
17
|
"databricks-langchain==0.9.0",
|
|
18
|
-
"langchain==1.
|
|
19
|
-
"langchain-core==1.
|
|
20
|
-
"langchain-community==0.4.
|
|
21
|
-
"langchain-text-splitters==1.
|
|
18
|
+
"langchain==1.3.14",
|
|
19
|
+
"langchain-core==1.5.3",
|
|
20
|
+
"langchain-community==0.4.2",
|
|
21
|
+
"langchain-text-splitters==1.1.2",
|
|
22
22
|
"litellm==1.80.11",
|
|
23
23
|
"mcp==1.27.0",
|
|
24
24
|
"opentelemetry-api==1.38.0",
|
|
@@ -73,6 +73,13 @@ dependencies = [
|
|
|
73
73
|
# `pip install databricks-tellr-app` is safe.
|
|
74
74
|
# SDR-4437 MEDIUM-7 (July 2026): the 7 formerly-ranged direct deps above
|
|
75
75
|
# this block are now exact-pinned too; same refresh discipline.
|
|
76
|
+
# PR2 LangGraph stack bump (August 2026): updated langchain 1.0.5→1.3.14,
|
|
77
|
+
# langchain-core 1.0.4→1.5.3, langchain-community 0.4.1→0.4.2,
|
|
78
|
+
# langchain-text-splitters 1.0.0→1.1.2, langchain-classic 1.0.0→1.0.8,
|
|
79
|
+
# langgraph 1.0.10→1.2.10, added langgraph-checkpoint==4.1.1,
|
|
80
|
+
# langgraph-prebuilt 1.0.10→1.1.0, added langgraph-sdk==0.4.2. These match
|
|
81
|
+
# the repo-root requirements.txt and pyproject.toml. MUST be re-verified via
|
|
82
|
+
# a devloop deploy on db-tellr-dev-pinfix or equivalent before PR3 ships.
|
|
76
83
|
"databricks-sdk==0.120.0",
|
|
77
84
|
"mlflow[databricks]==3.14.0",
|
|
78
85
|
"mlflow-skinny==3.14.0",
|
|
@@ -81,9 +88,11 @@ dependencies = [
|
|
|
81
88
|
"databricks-ai-search==0.76",
|
|
82
89
|
"databricks-connect==16.1.7",
|
|
83
90
|
"databricks-vectorsearch==0.75",
|
|
84
|
-
"langchain-classic==1.0.
|
|
85
|
-
"langgraph==1.
|
|
86
|
-
"langgraph-
|
|
91
|
+
"langchain-classic==1.0.8",
|
|
92
|
+
"langgraph==1.2.10",
|
|
93
|
+
"langgraph-checkpoint==4.1.1",
|
|
94
|
+
"langgraph-prebuilt==1.1.0",
|
|
95
|
+
"langgraph-sdk==0.4.2",
|
|
87
96
|
"langsmith==0.9.5",
|
|
88
97
|
"unitycatalog-ai==0.3.2",
|
|
89
98
|
"unitycatalog-langchain==0.3.0",
|
|
@@ -24,5 +24,56 @@
|
|
|
24
24
|
}
|
|
25
25
|
],
|
|
26
26
|
"chat_prompt": "Create 3 slides about the benefits of AI in modern healthcare, with a title slide, key advantages, and future outlook.",
|
|
27
|
-
"chat_reply": "Here's your deck with 3 slides! I've created:\n\n1. **Title Slide** — introducing AI in healthcare\n2. **Key Advantages** — early detection, personalized treatment, operational efficiency, and drug discovery\n3. **Future Outlook** — predictive monitoring, AI-assisted surgery, and global health equity\n\nFeel free to ask me to refine any slide, add new ones, or change the style."
|
|
27
|
+
"chat_reply": "Here's your deck with 3 slides! I've created:\n\n1. **Title Slide** — introducing AI in healthcare\n2. **Key Advantages** — early detection, personalized treatment, operational efficiency, and drug discovery\n3. **Future Outlook** — predictive monitoring, AI-assisted surgery, and global health equity\n\nFeel free to ask me to refine any slide, add new ones, or change the style.",
|
|
28
|
+
"deck_spec": {
|
|
29
|
+
"title": "Example Deck — AI in Healthcare",
|
|
30
|
+
"audience": "A first-time Tellr user taking the product tour: a general business audience, with no clinical or machine-learning background assumed.",
|
|
31
|
+
"purpose": "Show a new user what a finished Tellr deck looks like, on a subject that needs no domain briefing, so they can see structure and styling before they write their own prompt.",
|
|
32
|
+
"argument": "AI already delivers concrete benefits across diagnosis, treatment and research, and its near-term trajectory points at prevention and wider access, so it is worth engaging with now rather than watching.",
|
|
33
|
+
"call_to_action": "Ask the assistant to refine a slide, add a new one, or change the style: the next step of the tour.",
|
|
34
|
+
"narrative_arc": [
|
|
35
|
+
"Frame the subject: AI is already changing patient care, diagnostics and medical research, a transformation under way rather than a forecast.",
|
|
36
|
+
"Ground that claim in four advantages visible today: earlier disease detection, personalized treatment, operational efficiency, and faster drug discovery.",
|
|
37
|
+
"Extend today's gains into the near future and land on access: predictive monitoring, AI-assisted surgery, and specialist-level care reaching underserved communities."
|
|
38
|
+
],
|
|
39
|
+
"design_contract": {
|
|
40
|
+
"design_system_id": null,
|
|
41
|
+
"template_id": null,
|
|
42
|
+
"slide_style_id": null
|
|
43
|
+
},
|
|
44
|
+
"resolved_data": {
|
|
45
|
+
"synthesis": "No live data was resolved for this deck. The tour ships fixed illustrative bytes so every user sees the same three slides; the claims are widely reported general benefits of AI in healthcare, not figures drawn from a source system.",
|
|
46
|
+
"figures": [],
|
|
47
|
+
"gaps": [
|
|
48
|
+
"No quantitative source: the deck cites no measured figure, so no claim in it is traceable to a dataset.",
|
|
49
|
+
"No organisation context: the tour deck is deliberately generic and names no customer, hospital or vendor."
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"slides": [
|
|
53
|
+
{
|
|
54
|
+
"position": 0,
|
|
55
|
+
"purpose": "Open the deck: name the subject and frame AI in healthcare as a transformation already under way.",
|
|
56
|
+
"content_brief": "Title slide. Badge reading 'AI & Healthcare', headline 'The Benefits of AI in Modern Healthcare', and a one-line standfirst naming the three areas the deck covers: patient care, diagnostics, and medical research.",
|
|
57
|
+
"assumes": "Nothing. This is the deck's first slide.",
|
|
58
|
+
"hands_off": "The reader knows the subject and expects concrete advantages next.",
|
|
59
|
+
"data_references": []
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"position": 1,
|
|
63
|
+
"purpose": "Make the case with four concrete present-day advantages, so the benefit claim is specific rather than atmospheric.",
|
|
64
|
+
"content_brief": "Four bolded items, one explanatory clause each: early disease detection (imaging patterns a human reader can miss), personalized treatment plans (genetics, lifestyle, history), operational efficiency (scheduling, documentation, triage), and drug discovery acceleration (molecular simulation at scale).",
|
|
65
|
+
"assumes": "The reader has accepted the framing from the title slide.",
|
|
66
|
+
"hands_off": "The present-tense case is made; the reader is ready to look forward.",
|
|
67
|
+
"data_references": []
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"position": 2,
|
|
71
|
+
"purpose": "Extend the argument from today's gains to the near future and close on access, so the deck ends on consequence rather than a list.",
|
|
72
|
+
"content_brief": "Three bolded forward-looking items: predictive health monitoring (wearables shifting medicine from reactive to proactive), AI-assisted surgery (robotics guided by real-time analysis), and global health equity (mobile diagnostics for underserved communities). Close on the italic line about healthcare becoming intelligent, personalized and accessible to all.",
|
|
73
|
+
"assumes": "The reader accepts the four present-day advantages from the previous slide.",
|
|
74
|
+
"hands_off": "The deck ends; the reader leaves with the equity claim as the takeaway.",
|
|
75
|
+
"data_references": []
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
28
79
|
}
|
|
@@ -51,13 +51,14 @@ _worker_task = None
|
|
|
51
51
|
_export_worker_task = None
|
|
52
52
|
_cleanup_task = None
|
|
53
53
|
_timeout_task = None
|
|
54
|
+
_spec_sweeper_task = None
|
|
54
55
|
_frontend_assets_stack: ExitStack | None = None
|
|
55
56
|
|
|
56
57
|
|
|
57
58
|
@asynccontextmanager
|
|
58
59
|
async def lifespan(app: FastAPI):
|
|
59
60
|
"""Lifespan context manager for startup/shutdown events."""
|
|
60
|
-
global _worker_task, _export_worker_task, _cleanup_task, _timeout_task, _frontend_assets_stack
|
|
61
|
+
global _worker_task, _export_worker_task, _cleanup_task, _timeout_task, _spec_sweeper_task, _frontend_assets_stack
|
|
61
62
|
|
|
62
63
|
# Startup
|
|
63
64
|
logger.info(f"Starting AI Slide Generator API (environment: {ENVIRONMENT})")
|
|
@@ -134,6 +135,16 @@ async def lifespan(app: FastAPI):
|
|
|
134
135
|
_cleanup_task = asyncio.create_task(request_log_cleanup_loop())
|
|
135
136
|
logger.info("Request log cleanup task started")
|
|
136
137
|
|
|
138
|
+
# Start the spec-dirty arc-review sweeper. A PERIODIC LOOP, so it belongs
|
|
139
|
+
# here beside the two above and NOT in run.py::init_database: the
|
|
140
|
+
# pre-fork rule there is for migrations and backfills, which must run
|
|
141
|
+
# exactly once, and a loop started in that step would die with it. It
|
|
142
|
+
# runs in every uvicorn worker (UVICORN_WORKERS defaults to 4), which is
|
|
143
|
+
# why claim_due_marker takes an atomic lease rather than trusting a read.
|
|
144
|
+
from src.services.spec_sync import spec_review_sweeper_loop
|
|
145
|
+
_spec_sweeper_task = asyncio.create_task(spec_review_sweeper_loop())
|
|
146
|
+
logger.info("Spec-review arc sweeper started")
|
|
147
|
+
|
|
137
148
|
# Recover any stuck requests from previous crashes
|
|
138
149
|
try:
|
|
139
150
|
recovered = await recover_stuck_requests()
|
|
@@ -185,6 +196,14 @@ async def lifespan(app: FastAPI):
|
|
|
185
196
|
pass
|
|
186
197
|
logger.info("MCP job timeout sweeper stopped")
|
|
187
198
|
|
|
199
|
+
if _spec_sweeper_task:
|
|
200
|
+
_spec_sweeper_task.cancel()
|
|
201
|
+
try:
|
|
202
|
+
await _spec_sweeper_task
|
|
203
|
+
except asyncio.CancelledError:
|
|
204
|
+
pass
|
|
205
|
+
logger.info("Spec-review arc sweeper stopped")
|
|
206
|
+
|
|
188
207
|
# Tear down the FastMCP session manager's task group. Safe to call
|
|
189
208
|
# unconditionally — the stack was entered unconditionally at startup.
|
|
190
209
|
await mcp_lifespan_stack.aclose()
|
|
@@ -489,23 +508,11 @@ logger.info("MCP server mounted at /mcp")
|
|
|
489
508
|
|
|
490
509
|
@app.get("/api/health")
|
|
491
510
|
async def health():
|
|
492
|
-
"""Health check endpoint.
|
|
493
|
-
|
|
494
|
-
``encryption_key_source`` is load-bearing for deployment: ``tellr.update``
|
|
495
|
-
polls it to confirm a relocated app is reading the secret before it deletes
|
|
496
|
-
the Lakebase key row. Reports the source only — never the key.
|
|
497
|
-
|
|
498
|
-
``version`` comes from the installed wheel's metadata, so it tracks the
|
|
499
|
-
deployed release; it reads "unknown" from a source checkout.
|
|
500
|
-
"""
|
|
501
|
-
from src.api.routes.version import get_installed_version
|
|
502
|
-
from src.core.encryption import key_source
|
|
503
|
-
|
|
511
|
+
"""Health check endpoint."""
|
|
504
512
|
return {
|
|
505
513
|
"status": "healthy",
|
|
506
514
|
"environment": ENVIRONMENT,
|
|
507
|
-
"version":
|
|
508
|
-
"encryption_key_source": key_source(),
|
|
515
|
+
"version": "0.3.0",
|
|
509
516
|
}
|
|
510
517
|
|
|
511
518
|
|
|
@@ -16,22 +16,19 @@ Accepts three identity sources, evaluated in priority order:
|
|
|
16
16
|
identity headers. The receiving app (tellr) trusts those headers
|
|
17
17
|
because the same proxy sets them, strips any caller-supplied versions,
|
|
18
18
|
and cannot be bypassed by external traffic. This path has no user
|
|
19
|
-
token, so
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
Code that legitimately needs SP credentials on this path must call
|
|
23
|
-
``get_system_client()`` explicitly. Attribution (``created_by`` on
|
|
24
|
-
decks, etc.) remains the real user via ``user_name``.
|
|
19
|
+
token, so downstream Databricks API calls use tellr's own service
|
|
20
|
+
principal credentials; attribution (``created_by`` on decks, etc.)
|
|
21
|
+
remains the real user via ``user_name``.
|
|
25
22
|
|
|
26
23
|
The priority-3 path is gated on ``TELLR_TRUST_FORWARDED_IDENTITY=true``
|
|
27
24
|
so the behaviour is explicit at deploy time. Production Databricks Apps
|
|
28
25
|
deployments enable it; local dev does not.
|
|
29
26
|
|
|
30
27
|
The resolved identity is bound into the same request-scoped ContextVars
|
|
31
|
-
the browser flow uses (``set_current_user``, ``
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
28
|
+
the browser flow uses (``set_current_user``, ``set_user_client``,
|
|
29
|
+
``set_permission_context``), so downstream services (session manager,
|
|
30
|
+
permission service, MLflow, Google OAuth) see the caller's identity
|
|
31
|
+
without any MCP-specific plumbing.
|
|
35
32
|
"""
|
|
36
33
|
|
|
37
34
|
from __future__ import annotations
|
|
@@ -46,6 +43,7 @@ from fastapi import Request
|
|
|
46
43
|
|
|
47
44
|
from src.core.databricks_client import (
|
|
48
45
|
get_or_create_user_client,
|
|
46
|
+
get_system_client,
|
|
49
47
|
set_user_client,
|
|
50
48
|
)
|
|
51
49
|
from src.core.permission_context import (
|
|
@@ -152,24 +150,28 @@ def extract_mcp_identity(request: Request) -> MCPIdentity:
|
|
|
152
150
|
def mcp_auth_scope(request: Request) -> Iterator[MCPIdentity]:
|
|
153
151
|
"""Authenticate an MCP request and bind identity ContextVars for the block.
|
|
154
152
|
|
|
155
|
-
On entry: resolves identity
|
|
156
|
-
``permission_context``.
|
|
157
|
-
a real user token is present (priority 1/2); on the token-less priority-3
|
|
158
|
-
app-to-app path it is deliberately left unset.
|
|
153
|
+
On entry: resolves identity, binds ``current_user``, ``user_client``,
|
|
154
|
+
and ``permission_context``.
|
|
159
155
|
|
|
160
156
|
On exit: clears all three ContextVars, even if the wrapped block raised.
|
|
161
157
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
unaffected: it uses ``user_name`` from the forwarded identity headers,
|
|
169
|
-
which the proxy attests.
|
|
158
|
+
When the identity was resolved via priority 3 (no user token), the
|
|
159
|
+
bound ``user_client`` is tellr's service-principal client — downstream
|
|
160
|
+
services still function, but any SDK calls are made with SP credentials
|
|
161
|
+
rather than the user's own. Attribution (``created_by``) is unaffected:
|
|
162
|
+
it uses ``user_name`` from the forwarded identity headers, which the
|
|
163
|
+
proxy attests.
|
|
170
164
|
"""
|
|
171
165
|
identity = extract_mcp_identity(request)
|
|
172
166
|
|
|
167
|
+
if identity.token is not None:
|
|
168
|
+
user_client = get_or_create_user_client(identity.token)
|
|
169
|
+
else:
|
|
170
|
+
# Priority-3 path: no user token, so downstream Databricks API
|
|
171
|
+
# calls use tellr's service principal. Safe because the app-to-app
|
|
172
|
+
# model explicitly delegates credentialing to the receiving app.
|
|
173
|
+
user_client = get_system_client()
|
|
174
|
+
|
|
173
175
|
permission_ctx = build_permission_context(
|
|
174
176
|
user_id=identity.user_id,
|
|
175
177
|
user_name=identity.user_name,
|
|
@@ -177,22 +179,9 @@ def mcp_auth_scope(request: Request) -> Iterator[MCPIdentity]:
|
|
|
177
179
|
)
|
|
178
180
|
|
|
179
181
|
set_current_user(identity.user_name)
|
|
182
|
+
set_user_client(user_client)
|
|
180
183
|
set_permission_context(permission_ctx)
|
|
181
184
|
|
|
182
|
-
if identity.token is not None:
|
|
183
|
-
# Priority 1/2: a real user token is present. Bind the OBO client so
|
|
184
|
-
# downstream services (agent tools included) act as the user.
|
|
185
|
-
set_user_client(get_or_create_user_client(identity.token))
|
|
186
|
-
else:
|
|
187
|
-
# Priority-3 (app-to-app) path: no user token is available. Do NOT
|
|
188
|
-
# bind any client into the user-client ContextVar. Leaving it unset
|
|
189
|
-
# makes it true by construction that agent tools — which resolve their
|
|
190
|
-
# client via get_user_client() — can never run as the app service
|
|
191
|
-
# principal on this path: they fail closed with UserClientRequiredError
|
|
192
|
-
# in production (SDR-4437 / F-CR-3). Anything that legitimately needs
|
|
193
|
-
# the SP here must call get_system_client() explicitly.
|
|
194
|
-
set_user_client(None)
|
|
195
|
-
|
|
196
185
|
logger.debug(
|
|
197
186
|
"MCP auth scope entered",
|
|
198
187
|
extra={
|