Copy disabled (too large)
Download .txt
Showing preview only (27,628K chars total). Download the full file to get everything.
Repository: onyx-dot-app/onyx
Branch: main
Commit: d4a96d70f32f
Files: 4225
Total size: 25.4 MB
Directory structure:
gitextract_2880u6lc/
├── .git-blame-ignore-revs
├── .github/
│ ├── CODEOWNERS
│ ├── actionlint.yml
│ ├── actions/
│ │ ├── build-backend-image/
│ │ │ └── action.yml
│ │ ├── build-integration-image/
│ │ │ └── action.yml
│ │ ├── build-model-server-image/
│ │ │ └── action.yml
│ │ ├── run-nightly-provider-chat-test/
│ │ │ └── action.yml
│ │ ├── setup-playwright/
│ │ │ └── action.yml
│ │ ├── setup-python-and-install-dependencies/
│ │ │ └── action.yml
│ │ └── slack-notify/
│ │ ├── action.yml
│ │ └── user-mappings.json
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ ├── runs-on.yml
│ └── workflows/
│ ├── deployment.yml
│ ├── docker-tag-beta.yml
│ ├── docker-tag-latest.yml
│ ├── helm-chart-releases.yml
│ ├── merge-group.yml
│ ├── nightly-close-stale-issues.yml
│ ├── nightly-llm-provider-chat.yml
│ ├── post-merge-beta-cherry-pick.yml
│ ├── pr-database-tests.yml
│ ├── pr-desktop-build.yml
│ ├── pr-external-dependency-unit-tests.yml
│ ├── pr-golang-tests.yml
│ ├── pr-helm-chart-testing.yml
│ ├── pr-integration-tests.yml
│ ├── pr-jest-tests.yml
│ ├── pr-labeler.yml
│ ├── pr-linear-check.yml
│ ├── pr-playwright-tests.yml
│ ├── pr-python-checks.yml
│ ├── pr-python-connector-tests.yml
│ ├── pr-python-model-tests.yml
│ ├── pr-python-tests.yml
│ ├── pr-quality-checks.yml
│ ├── preview.yml
│ ├── release-cli.yml
│ ├── release-devtools.yml
│ ├── reusable-nightly-llm-provider-chat.yml
│ ├── sandbox-deployment.yml
│ ├── storybook-deploy.yml
│ ├── sync_foss.yml
│ ├── tag-nightly.yml
│ └── zizmor.yml
├── .gitignore
├── .greptile/
│ ├── config.json
│ ├── files.json
│ └── rules.md
├── .pre-commit-config.yaml
├── .prettierignore
├── .vscode/
│ ├── env.web_template.txt
│ ├── env_template.txt
│ ├── launch.json
│ └── tasks.template.jsonc
├── AGENTS.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── backend/
│ ├── .dockerignore
│ ├── .gitignore
│ ├── .trivyignore
│ ├── Dockerfile
│ ├── Dockerfile.model_server
│ ├── alembic/
│ │ ├── README.md
│ │ ├── env.py
│ │ ├── run_multitenant_migrations.py
│ │ ├── script.py.mako
│ │ └── versions/
│ │ ├── 01f8e6d95a33_populate_flow_mapping_data.py
│ │ ├── 027381bce97c_add_shortcut_option_for_users.py
│ │ ├── 03bf8be6b53a_rework_kg_config.py
│ │ ├── 03d085c5c38d_backfill_account_type.py
│ │ ├── 03d710ccf29c_add_permission_sync_attempt_tables.py
│ │ ├── 0568ccf46a6b_add_thread_specific_model_selection.py
│ │ ├── 05c07bf07c00_add_search_doc_relevance_details.py
│ │ ├── 07b98176f1de_code_interpreter_seed.py
│ │ ├── 0816326d83aa_add_federated_connector_tables.py
│ │ ├── 08a1eda20fe1_add_earliest_indexing_to_connector.py
│ │ ├── 09995b8811eb_add_theme_preference_to_user.py
│ │ ├── 0a2b51deb0b8_add_starter_prompts.py
│ │ ├── 0a98909f2757_enable_encrypted_fields.py
│ │ ├── 0bb4558f35df_add_scim_username_to_scim_user_mapping.py
│ │ ├── 0cd424f32b1d_user_file_data_preparation_and_backfill.py
│ │ ├── 0ebb1d516877_add_ccpair_deletion_failure_message.py
│ │ ├── 0f7ff6d75b57_add_index_to_index_attempt_time_created.py
│ │ ├── 114a638452db_add_default_app_mode_to_user.py
│ │ ├── 12635f6655b7_drive_canonical_ids.py
│ │ ├── 15326fcec57e_introduce_onyx_apis.py
│ │ ├── 16c37a30adf2_user_file_relationship_migration.py
│ │ ├── 173cae5bba26_port_config_store.py
│ │ ├── 175ea04c7087_add_user_preferences.py
│ │ ├── 177de57c21c9_display_custom_llm_models.py
│ │ ├── 18b5b2524446_add_is_clarification_to_chat_message.py
│ │ ├── 19c0ccb01687_migrate_to_contextual_rag_model.py
│ │ ├── 1a03d2c2856b_add_indexes_to_document__tag.py
│ │ ├── 1b10e1fda030_add_additional_data_to_notifications.py
│ │ ├── 1b8206b29c5d_add_user_delete_cascades.py
│ │ ├── 1d78c0ca7853_remove_voice_provider_deleted_column.py
│ │ ├── 1f2a3b4c5d6e_add_internet_search_and_content_providers.py
│ │ ├── 1f60f60c3401_embedding_model_search_settings.py
│ │ ├── 2020d417ec84_single_onyx_craft_migration.py
│ │ ├── 213fd978c6d8_notifications.py
│ │ ├── 238b84885828_add_foreign_key_to_user__external_user_.py
│ │ ├── 23957775e5f5_remove_feedback_foreignkey_constraint.py
│ │ ├── 25a5501dc766_group_permissions_phase1.py
│ │ ├── 2664261bfaab_add_cache_store_table.py
│ │ ├── 2666d766cb9b_google_oauth2.py
│ │ ├── 26b931506ecb_default_chosen_assistants_to_none.py
│ │ ├── 27c6ecc08586_permission_framework.py
│ │ ├── 27fb147a843f_add_timestamps_to_user_table.py
│ │ ├── 2955778aa44c_add_chunk_count_to_document.py
│ │ ├── 2a391f840e85_add_last_refreshed_at_mcp_server.py
│ │ ├── 2acdef638fc2_add_switchover_type_field.py
│ │ ├── 2b75d0a8ffcb_user_file_schema_cleanup.py
│ │ ├── 2b90f3af54b8_usage_limits.py
│ │ ├── 2c2430828bdf_add_unique_constraint_to_inputprompt_.py
│ │ ├── 2cdeff6d8c93_set_built_in_to_default.py
│ │ ├── 2d2304e27d8c_add_above_below_to_persona.py
│ │ ├── 2daa494a0851_add_group_sync_time.py
│ │ ├── 2f80c6a2550f_add_chat_session_specific_temperature_.py
│ │ ├── 2f95e36923e6_add_indexing_coordination.py
│ │ ├── 30c1d5744104_persona_datetime_aware.py
│ │ ├── 325975216eb3_add_icon_color_and_icon_shape_to_persona.py
│ │ ├── 33cb72ea4d80_single_tool_call_per_message.py
│ │ ├── 33ea50e88f24_foreign_key_input_prompts.py
│ │ ├── 351faebd379d_add_curator_fields.py
│ │ ├── 35e518e0ddf4_properly_cascade.py
│ │ ├── 35e6853a51d5_server_default_chosen_assistants.py
│ │ ├── 369644546676_add_composite_index_for_index_attempt_.py
│ │ ├── 36e9220ab794_update_kg_trigger_functions.py
│ │ ├── 3781a5eb12cb_add_chunk_stats_table.py
│ │ ├── 3879338f8ba1_add_tool_table.py
│ │ ├── 38eda64af7fe_add_chat_session_sharing.py
│ │ ├── 3934b1bc7b62_update_github_connector_repo_name_to_.py
│ │ ├── 3a7802814195_add_alternate_assistant_to_chat_message.py
│ │ ├── 3a78dba1080a_user_file_legacy_data_cleanup.py
│ │ ├── 3b25685ff73c_move_is_public_to_cc_pair.py
│ │ ├── 3bd4c84fe72f_improved_index.py
│ │ ├── 3c5e35aa9af0_polling_document_count.py
│ │ ├── 3c6531f32351_add_back_input_prompts.py
│ │ ├── 3c9a65f1207f_seed_exa_provider_from_env.py
│ │ ├── 3d1cca026fe8_add_oauth_config_and_user_tokens.py
│ │ ├── 3fc5d75723b3_add_doc_metadata_field_in_document_model.py
│ │ ├── 401c1ac29467_add_tables_for_ui_based_llm_.py
│ │ ├── 40926a4dab77_reset_userfile_document_id_migrated_.py
│ │ ├── 41fa44bef321_remove_default_prompt_shortcuts.py
│ │ ├── 43cbbb3f5e6a_rename_index_origin_to_index_recursively.py
│ │ ├── 44f856ae2a4a_add_cloud_embedding_model.py
│ │ ├── 4505fd7302e1_added_is_internet_to_dbdoc.py
│ │ ├── 465f78d9b7f9_larger_access_tokens_for_oauth.py
│ │ ├── 46625e4745d4_remove_native_enum.py
│ │ ├── 46b7a812670f_fix_user__external_user_group_id_fk.py
│ │ ├── 4738e4b3bae1_pg_file_store.py
│ │ ├── 473a1a7ca408_add_display_model_names_to_llm_provider.py
│ │ ├── 47433d30de82_create_indexattempt_table.py
│ │ ├── 475fcefe8826_add_name_to_api_key.py
│ │ ├── 4794bc13e484_update_prompt_length.py
│ │ ├── 47a07e1a38f1_fix_invalid_model_configurations_state.py
│ │ ├── 47e5bef3a1d7_add_persona_categories.py
│ │ ├── 48d14957fe80_add_support_for_custom_tools.py
│ │ ├── 495cb26ce93e_create_knowlege_graph_tables.py
│ │ ├── 4a1e4b1c89d2_add_indexing_to_userfilestatus.py
│ │ ├── 4a951134c801_moved_status_to_connector_credential_.py
│ │ ├── 4b08d97e175a_change_default_prune_freq.py
│ │ ├── 4cebcbc9b2ae_add_tab_index_to_tool_call.py
│ │ ├── 4d58345da04a_lowercase_user_emails.py
│ │ ├── 4ea2c93919c1_add_type_to_credentials.py
│ │ ├── 4ee1287bd26a_add_multiple_slack_bot_support.py
│ │ ├── 4f8a2b3c1d9e_add_open_url_tool.py
│ │ ├── 503883791c39_add_effective_permissions.py
│ │ ├── 505c488f6662_merge_default_assistants_into_unified.py
│ │ ├── 50b683a8295c_add_additional_retrieval_controls_to_.py
│ │ ├── 52a219fb5233_add_last_synced_and_last_modified_to_document_table.py
│ │ ├── 54a74a0417fc_danswerbot_onyxbot.py
│ │ ├── 55546a7967ee_assistant_rework.py
│ │ ├── 570282d33c49_track_onyxbot_explicitly.py
│ │ ├── 57122d037335_add_python_tool_on_default.py
│ │ ├── 57b53544726e_add_document_set_tables.py
│ │ ├── 5809c0787398_add_chat_sessions.py
│ │ ├── 58c50ef19f08_add_stale_column_to_user__external_user_.py
│ │ ├── 5ae8240accb3_add_research_agent_database_tables_and_.py
│ │ ├── 5b29123cd710_nullable_search_settings_for_historic_.py
│ │ ├── 5c3dca366b35_backend_driven_notification_details.py
│ │ ├── 5c448911b12f_add_content_type_to_userfile.py
│ │ ├── 5c7fdadae813_match_any_keywords_flag_for_standard_.py
│ │ ├── 5d12a446f5c0_add_api_version_and_deployment_name_to_.py
│ │ ├── 5e1c073d48a3_add_personal_access_token_table.py
│ │ ├── 5e6f7a8b9c0d_update_default_persona_prompt.py
│ │ ├── 5e84129c8be3_add_docs_indexed_column_to_index_.py
│ │ ├── 5f4b8568a221_add_removed_documents_to_index_attempt.py
│ │ ├── 5fc1f54cc252_hybrid_enum.py
│ │ ├── 61ff3651add4_add_permission_syncing.py
│ │ ├── 62c3a055a141_add_file_names_to_file_connector_config.py
│ │ ├── 631fd2504136_add_approx_chunk_count_in_vespa_to_.py
│ │ ├── 6436661d5b65_add_created_at_in_project_userfile.py
│ │ ├── 643a84a42a33_add_user_configured_names_to_llmprovider.py
│ │ ├── 64bd5677aeb6_add_image_input_support_to_model_config.py
│ │ ├── 65bc6e0f8500_remove_kg_subtype_from_db.py
│ │ ├── 6756efa39ada_id_uuid_for_chat_session.py
│ │ ├── 689433b0d8de_add_hook_and_hook_execution_log_tables.py
│ │ ├── 699221885109_nullify_default_task_prompt.py
│ │ ├── 6a804aeb4830_duplicated_no_harm_user_file_migration.py
│ │ ├── 6b3b4083c5aa_persona_cleanup_and_featured.py
│ │ ├── 6d387b3196c2_basic_auth.py
│ │ ├── 6d562f86c78b_remove_default_bot.py
│ │ ├── 6f4f86aef280_add_queries_and_is_web_fetch_to_.py
│ │ ├── 6fc7886d665d_make_categories_labels_and_many_to_many.py
│ │ ├── 703313b75876_add_tokenratelimit_tables.py
│ │ ├── 70f00c45c0f2_more_descriptive_filestore.py
│ │ ├── 7206234e012a_add_image_generation_config_table.py
│ │ ├── 72aa7de2e5cf_make_processing_mode_default_all_caps.py
│ │ ├── 72bdc9929a46_permission_auto_sync_framework.py
│ │ ├── 73e9983e5091_add_search_query_table.py
│ │ ├── 7477a5f5d728_added_model_defaults_for_users.py
│ │ ├── 7547d982db8f_chat_folders.py
│ │ ├── 7616121f6e97_add_enterprise_fields_to_scim_user_mapping.py
│ │ ├── 767f1c2a00eb_count_chat_tokens.py
│ │ ├── 76b60d407dfb_cc_pair_name_not_unique.py
│ │ ├── 776b3bbe9092_remove_remaining_enums.py
│ │ ├── 77d07dffae64_forcibly_remove_more_enum_types_from_.py
│ │ ├── 78dbe7e38469_task_tracking.py
│ │ ├── 78ebc66946a0_remove_reranking_from_search_settings.py
│ │ ├── 795b20b85b4b_add_llm_group_permissions_control.py
│ │ ├── 797089dfb4d2_persona_start_date.py
│ │ ├── 79acd316403a_add_api_key_table.py
│ │ ├── 7a70b7664e37_add_model_configuration_table.py
│ │ ├── 7aea705850d5_added_slack_auto_filter.py
│ │ ├── 7b9b952abdf6_update_entities.py
│ │ ├── 7bd55f264e1b_add_display_name_to_model_configuration.py
│ │ ├── 7cb492013621_code_interpreter_server_model.py
│ │ ├── 7cc3fcc116c1_user_file_uuid_primary_key_swap.py
│ │ ├── 7ccea01261f6_store_chat_retrieval_docs.py
│ │ ├── 7da0ae5ad583_add_description_to_persona.py
│ │ ├── 7da543f5672f_add_slackbotconfig_table.py
│ │ ├── 7e490836d179_nullify_default_system_prompt.py
│ │ ├── 7ed603b64d5a_add_mcp_server_and_connection_config_.py
│ │ ├── 7f726bad5367_slack_followup.py
│ │ ├── 7f99be1cb9f5_add_index_for_getting_documents_just_by_.py
│ │ ├── 800f48024ae9_add_id_to_connectorcredentialpair.py
│ │ ├── 80696cf850ae_add_chat_session_to_query_event.py
│ │ ├── 8188861f4e92_csv_to_tabular_chat_file_type.py
│ │ ├── 81c22b1e2e78_hierarchy_nodes_v1.py
│ │ ├── 8405ca81cc83_notifications_constraint.py
│ │ ├── 849b21c732f8_add_demo_data_enabled_to_build_session.py
│ │ ├── 87c52ec39f84_update_default_system_prompt.py
│ │ ├── 8818cf73fa1a_drop_include_citations.py
│ │ ├── 891cd83c87a8_add_is_visible_to_persona.py
│ │ ├── 8987770549c0_add_full_exception_stack_trace.py
│ │ ├── 8a87bd6ec550_associate_index_attempts_with_ccpair.py
│ │ ├── 8aabb57f3b49_restructure_document_indices.py
│ │ ├── 8b5ce697290e_add_discord_bot_tables.py
│ │ ├── 8e1ac4f39a9f_enable_contextual_retrieval.py
│ │ ├── 8e26726b7683_chat_context_addition.py
│ │ ├── 8f43500ee275_add_index.py
│ │ ├── 8ffcc2bcfc11_add_needs_persona_sync_to_user_file.py
│ │ ├── 904451035c9b_store_tool_details.py
│ │ ├── 904e5138fffb_tags.py
│ │ ├── 9087b548dd69_seed_default_image_gen_config.py
│ │ ├── 90b409d06e50_add_chat_compression_fields.py
│ │ ├── 90e3b9af7da4_tag_fix.py
│ │ ├── 91a0a4d62b14_milestone.py
│ │ ├── 91fd3b470d1a_remove_documentsource_from_tag.py
│ │ ├── 91ffac7e65b3_add_expiry_time.py
│ │ ├── 93560ba1b118_add_web_ui_option_to_slack_config.py
│ │ ├── 93a2e195e25c_add_voice_provider_and_user_voice_prefs.py
│ │ ├── 93c15d6a6fbb_add_chunk_error_and_vespa_count_columns_.py
│ │ ├── 949b4a92a401_remove_rt.py
│ │ ├── 94dc3d0236f8_make_document_set_description_optional.py
│ │ ├── 96a5702df6aa_mcp_tool_enabled.py
│ │ ├── 977e834c1427_seed_default_groups.py
│ │ ├── 97dbb53fa8c8_add_syncrecord.py
│ │ ├── 98a5008d8711_agent_tracking.py
│ │ ├── 9a0296d7421e_add_is_auto_mode_to_llm_provider.py
│ │ ├── 9aadf32dfeb4_add_user_files.py
│ │ ├── 9b66d3156fc6_user_file_schema_additions.py
│ │ ├── 9c00a2bccb83_chat_message_agentic.py
│ │ ├── 9c54986124c6_add_scim_tables.py
│ │ ├── 9cf5c00f72fe_add_creator_to_cc_pair.py
│ │ ├── 9d1543a37106_add_processing_duration_seconds_to_chat_.py
│ │ ├── 9d97fecfab7f_added_retrieved_docs_to_query_event.py
│ │ ├── 9drpiiw74ljy_add_config_to_federated_connector.py
│ │ ├── 9f696734098f_combine_search_and_chat.py
│ │ ├── a01bf2971c5d_update_default_tool_descriptions.py
│ │ ├── a1b2c3d4e5f6_add_license_table.py
│ │ ├── a1b2c3d4e5f7_drop_agent_search_metrics_table.py
│ │ ├── a2b3c4d5e6f7_remove_fast_default_model_name.py
│ │ ├── a3795dce87be_migration_confluence_to_be_explicit.py
│ │ ├── a3b8d9e2f1c4_make_scim_external_id_nullable.py
│ │ ├── a3bfd0d64902_add_chosen_assistants_to_user_table.py
│ │ ├── a3c1a7904cd0_remove_userfile_related_deprecated_.py
│ │ ├── a3f8b2c1d4e5_add_preferred_response_id_to_chat_message.py
│ │ ├── a4f23d6b71c8_add_llm_provider_persona_restrictions.py
│ │ ├── a570b80a5f20_usergroup_tables.py
│ │ ├── a6df6b88ef81_remove_recent_assistants.py
│ │ ├── a7688ab35c45_add_public_external_user_group_table.py
│ │ ├── a852cbe15577_new_chat_history.py
│ │ ├── a8c2065484e6_add_auto_scroll_to_user_model.py
│ │ ├── abbfec3a5ac5_merge_prompt_into_persona.py
│ │ ├── abe7378b8217_add_indexing_trigger_to_cc_pair.py
│ │ ├── ac5eaac849f9_add_last_pruned_to_connector_table.py
│ │ ├── acaab4ef4507_remove_inactive_ccpair_status_on_.py
│ │ ├── ae62505e3acc_add_saml_accounts.py
│ │ ├── aeda5f2df4f6_add_pinned_assistants.py
│ │ ├── b082fec533f0_make_last_attempt_status_nullable.py
│ │ ├── b156fa702355_chat_reworked.py
│ │ ├── b30353be4eec_add_mcp_auth_performer.py
│ │ ├── b329d00a9ea6_adding_assistant_specific_user_.py
│ │ ├── b388730a2899_nullable_preferences.py
│ │ ├── b4b7e1028dfd_grant_basic_to_existing_groups.py
│ │ ├── b4ef3ae0bf6e_add_user_oauth_token_to_slack_bot.py
│ │ ├── b51c6844d1df_seed_memory_tool.py
│ │ ├── b558f51620b4_pause_finished_user_file_connectors.py
│ │ ├── b5c4d7e8f9a1_add_hierarchy_node_cc_pair_table.py
│ │ ├── b728689f45b1_rename_persona_is_visible_to_is_listed_.py
│ │ ├── b72ed7a5db0e_remove_description_from_starter_messages.py
│ │ ├── b7a7eee5aa15_add_checkpointing_failure_handling.py
│ │ ├── b7bcc991d722_assign_users_to_default_groups.py
│ │ ├── b7c2b63c4a03_add_background_reindex_enabled_field.py
│ │ ├── b7ec9b5b505f_adjust_prompt_length.py
│ │ ├── b85f02ec1308_fix_file_type_migration.py
│ │ ├── b896bbd0d5a7_backfill_is_internet_data_to_false.py
│ │ ├── b8c9d0e1f2a3_drop_milestone_table.py
│ │ ├── ba98eba0f66a_add_support_for_litellm_proxy_in_.py
│ │ ├── baf71f781b9e_add_llm_model_version_override_to_.py
│ │ ├── bc9771dccadf_create_usage_reports_table.py
│ │ ├── bceb1e139447_add_base_url_to_cloudembeddingprovider.py
│ │ ├── bd2921608c3a_non_nullable_default_persona.py
│ │ ├── bd7c3bf8beba_migrate_agent_responses_to_research_.py
│ │ ├── be2ab2aa50ee_fix_capitalization.py
│ │ ├── be87a654d5af_persona_new_default_model_configuration_.py
│ │ ├── bf7a81109301_delete_input_prompts.py
│ │ ├── c0aab6edb6dd_delete_workspace.py
│ │ ├── c0c937d5c9e5_llm_provider_deprecate_fields.py
│ │ ├── c0fd6e4da83a_add_recent_assistants.py
│ │ ├── c18cdf4b497e_add_standard_answer_tables.py
│ │ ├── c1d2e3f4a5b6_add_deep_research_tool.py
│ │ ├── c5b692fa265c_add_index_attempt_errors_table.py
│ │ ├── c5eae4a75a1b_add_chat_message__standard_answer_table.py
│ │ ├── c7bf5721733e_add_has_been_indexed_to_.py
│ │ ├── c7e9f4a3b2d1_add_python_tool.py
│ │ ├── c7f2e1b4a9d3_add_sharing_scope_to_build_session.py
│ │ ├── c8a93a2af083_personalization_user_info.py
│ │ ├── c99d76fcd298_add_nullable_to_persona_id_in_chat_.py
│ │ ├── c9e2cd766c29_add_s3_file_store_table.py
│ │ ├── ca04500b9ee8_add_cascade_deletes_to_agent_tables.py
│ │ ├── cbc03e08d0f3_add_opensearch_migration_tables.py
│ │ ├── cec7ec36c505_kgentity_parent.py
│ │ ├── cf90764725d8_larger_refresh_tokens.py
│ │ ├── d09fc20a3c66_seed_builtin_tools.py
│ │ ├── d1b637d7050a_sync_exa_api_key_to_content_provider.py
│ │ ├── d25168c2beee_tool_name_consistency.py
│ │ ├── d3fd499c829c_add_file_reader_tool.py
│ │ ├── d5645c915d0e_remove_deletion_attempt_table.py
│ │ ├── d56ffa94ca32_add_file_content.py
│ │ ├── d5c86e2c6dc6_add_cascade_delete_to_search_query_user_.py
│ │ ├── d61e513bef0a_add_total_docs_for_index_attempt.py
│ │ ├── d7111c1238cd_remove_document_ids.py
│ │ ├── d716b0791ddd_combined_slack_id_fields.py
│ │ ├── d8cdfee5df80_add_skipped_to_userfilestatus.py
│ │ ├── d929f0c1c6af_feedback_feature.py
│ │ ├── d961aca62eb3_update_status_length.py
│ │ ├── d9ec13955951_remove__dim_suffix_from_model_name.py
│ │ ├── da42808081e3_migrate_jira_connectors_to_new_format.py
│ │ ├── da4c21c69164_chosen_assistants_changed_to_jsonb.py
│ │ ├── dab04867cd88_add_composite_index_to_document_by_.py
│ │ ├── dba7f71618f5_onyx_custom_tool_flow.py
│ │ ├── dbaa756c2ccf_embedding_models.py
│ │ ├── df0c7ad8a076_added_deletion_attempt_table.py
│ │ ├── df46c75b714e_add_default_vision_provider_to_llm_.py
│ │ ├── dfbe9e93d3c7_extended_role_for_non_web.py
│ │ ├── e0a68a81d434_add_chat_feedback.py
│ │ ├── e1392f05e840_added_input_prompts.py
│ │ ├── e209dc5a8156_added_prune_frequency.py
│ │ ├── e4334d5b33ba_add_deployment_name_to_llmprovider.py
│ │ ├── e50154680a5c_no_source_enum.py
│ │ ├── e6a4bbc13fe4_add_index_for_retrieving_latest_index_.py
│ │ ├── e7f8a9b0c1d2_create_anonymous_user.py
│ │ ├── e86866a9c78a_add_persona_to_chat_session.py
│ │ ├── e8f0d2a38171_add_status_to_mcp_server_and_make_auth_.py
│ │ ├── e91df4e935ef_private_personas_documentsets.py
│ │ ├── eaa3b5593925_add_default_slack_channel_config.py
│ │ ├── ec3ec2eabf7b_index_from_beginning.py
│ │ ├── ec85f2b3c544_remove_last_attempt_status_from_cc_pair.py
│ │ ├── ecab2b3f1a3b_add_overrides_to_the_chat_session.py
│ │ ├── ed9e44312505_add_icon_name_field.py
│ │ ├── ee3f4b47fad5_added_alternate_model_to_chat_message.py
│ │ ├── ef7da92f7213_add_files_to_chatmessage.py
│ │ ├── efb35676026c_standard_answer_match_regex_flag.py
│ │ ├── f11b408e39d3_force_lowercase_all_users.py
│ │ ├── f13db29f3101_add_composite_index_for_last_modified_.py
│ │ ├── f17bf3b0d9f1_embedding_provider_by_provider_type.py
│ │ ├── f1c6478c3fd8_add_pre_defined_feedback.py
│ │ ├── f1ca58b2f2ec_add_passthrough_auth_to_tool.py
│ │ ├── f220515df7b4_add_flow_mapping_table.py
│ │ ├── f32615f71aeb_add_custom_headers_to_tools.py
│ │ ├── f39c5794c10a_add_background_errors_table.py
│ │ ├── f5437cc136c5_delete_non_search_assistants.py
│ │ ├── f71470ba9274_add_prompt_length_limit.py
│ │ ├── f7505c5b0284_updated_constraints_for_ccpairs.py
│ │ ├── f7a894b06d02_non_nullbale_slack_bot_id_in_channel_.py
│ │ ├── f7ca3e2f45d9_migrate_no_auth_data_to_placeholder.py
│ │ ├── f7e58d357687_add_has_web_column_to_user.py
│ │ ├── f8a9b2c3d4e5_add_research_answer_purpose_to_chat_message.py
│ │ ├── f9b8c7d6e5a4_update_parent_question_id_foreign_key_to_research_agent_iteration.py
│ │ ├── fad14119fb92_delete_tags_with_wrong_enum.py
│ │ ├── fb80bdd256de_add_chat_background_to_user.py
│ │ ├── fcd135795f21_add_slack_bot_display_type.py
│ │ ├── febe9eaa0644_add_document_set_persona_relationship_.py
│ │ ├── fec3db967bf7_add_time_updated_to_usergroup_and_.py
│ │ ├── feead2911109_add_opensearch_tenant_migration_columns.py
│ │ └── ffc707a226b4_basic_document_metadata.py
│ ├── alembic.ini
│ ├── alembic_tenants/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── env.py
│ │ ├── script.py.mako
│ │ └── versions/
│ │ ├── 14a83a331951_create_usertenantmapping_table.py
│ │ ├── 34e3630c7f32_lowercase_multi_tenant_user_auth.py
│ │ ├── 3b45e0018bf1_add_new_available_tenant_table.py
│ │ ├── 3b9f09038764_add_read_only_kg_user.py
│ │ ├── a4f6ee863c47_mapping_for_anonymous_user_path.py
│ │ └── ac842f85f932_new_column_user_tenant_mapping.py
│ ├── assets/
│ │ └── .gitignore
│ ├── ee/
│ │ ├── LICENSE
│ │ ├── __init__.py
│ │ └── onyx/
│ │ ├── __init__.py
│ │ ├── access/
│ │ │ ├── access.py
│ │ │ └── hierarchy_access.py
│ │ ├── auth/
│ │ │ ├── __init__.py
│ │ │ └── users.py
│ │ ├── background/
│ │ │ ├── celery/
│ │ │ │ ├── apps/
│ │ │ │ │ ├── heavy.py
│ │ │ │ │ ├── light.py
│ │ │ │ │ ├── monitoring.py
│ │ │ │ │ └── primary.py
│ │ │ │ └── tasks/
│ │ │ │ ├── beat_schedule.py
│ │ │ │ ├── cleanup/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── tasks.py
│ │ │ │ ├── cloud/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── tasks.py
│ │ │ │ ├── doc_permission_syncing/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── tasks.py
│ │ │ │ ├── external_group_syncing/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── group_sync_utils.py
│ │ │ │ │ └── tasks.py
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── tasks.py
│ │ │ │ ├── query_history/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── tasks.py
│ │ │ │ ├── tenant_provisioning/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── tasks.py
│ │ │ │ ├── ttl_management/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── tasks.py
│ │ │ │ ├── usage_reporting/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── tasks.py
│ │ │ │ └── vespa/
│ │ │ │ ├── __init__.py
│ │ │ │ └── tasks.py
│ │ │ ├── celery_utils.py
│ │ │ └── task_name_builders.py
│ │ ├── configs/
│ │ │ ├── __init__.py
│ │ │ ├── app_configs.py
│ │ │ └── license_enforcement_config.py
│ │ ├── connectors/
│ │ │ └── perm_sync_valid.py
│ │ ├── db/
│ │ │ ├── __init__.py
│ │ │ ├── analytics.py
│ │ │ ├── connector.py
│ │ │ ├── connector_credential_pair.py
│ │ │ ├── document.py
│ │ │ ├── document_set.py
│ │ │ ├── external_perm.py
│ │ │ ├── hierarchy.py
│ │ │ ├── license.py
│ │ │ ├── persona.py
│ │ │ ├── query_history.py
│ │ │ ├── saml.py
│ │ │ ├── scim.py
│ │ │ ├── search.py
│ │ │ ├── standard_answer.py
│ │ │ ├── token_limit.py
│ │ │ ├── usage_export.py
│ │ │ └── user_group.py
│ │ ├── document_index/
│ │ │ └── vespa/
│ │ │ └── app_config/
│ │ │ └── cloud-services.xml.jinja
│ │ ├── external_permissions/
│ │ │ ├── __init__.py
│ │ │ ├── confluence/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── constants.py
│ │ │ │ ├── doc_sync.py
│ │ │ │ ├── group_sync.py
│ │ │ │ ├── page_access.py
│ │ │ │ └── space_access.py
│ │ │ ├── github/
│ │ │ │ ├── doc_sync.py
│ │ │ │ ├── group_sync.py
│ │ │ │ └── utils.py
│ │ │ ├── gmail/
│ │ │ │ └── doc_sync.py
│ │ │ ├── google_drive/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── doc_sync.py
│ │ │ │ ├── folder_retrieval.py
│ │ │ │ ├── group_sync.py
│ │ │ │ ├── models.py
│ │ │ │ └── permission_retrieval.py
│ │ │ ├── jira/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── doc_sync.py
│ │ │ │ ├── group_sync.py
│ │ │ │ ├── models.py
│ │ │ │ └── page_access.py
│ │ │ ├── perm_sync_types.py
│ │ │ ├── post_query_censoring.py
│ │ │ ├── salesforce/
│ │ │ │ ├── postprocessing.py
│ │ │ │ └── utils.py
│ │ │ ├── sharepoint/
│ │ │ │ ├── doc_sync.py
│ │ │ │ ├── group_sync.py
│ │ │ │ └── permission_utils.py
│ │ │ ├── slack/
│ │ │ │ ├── channel_access.py
│ │ │ │ ├── doc_sync.py
│ │ │ │ ├── group_sync.py
│ │ │ │ └── utils.py
│ │ │ ├── sync_params.py
│ │ │ ├── teams/
│ │ │ │ └── doc_sync.py
│ │ │ └── utils.py
│ │ ├── feature_flags/
│ │ │ ├── __init__.py
│ │ │ ├── factory.py
│ │ │ └── posthog_provider.py
│ │ ├── hooks/
│ │ │ ├── __init__.py
│ │ │ └── executor.py
│ │ ├── main.py
│ │ ├── onyxbot/
│ │ │ └── slack/
│ │ │ └── handlers/
│ │ │ ├── __init__.py
│ │ │ └── handle_standard_answers.py
│ │ ├── prompts/
│ │ │ ├── __init__.py
│ │ │ ├── query_expansion.py
│ │ │ └── search_flow_classification.py
│ │ ├── search/
│ │ │ └── process_search_query.py
│ │ ├── secondary_llm_flows/
│ │ │ ├── __init__.py
│ │ │ ├── query_expansion.py
│ │ │ └── search_flow_classification.py
│ │ ├── server/
│ │ │ ├── __init__.py
│ │ │ ├── analytics/
│ │ │ │ └── api.py
│ │ │ ├── auth_check.py
│ │ │ ├── billing/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── api.py
│ │ │ │ ├── models.py
│ │ │ │ └── service.py
│ │ │ ├── documents/
│ │ │ │ └── cc_pair.py
│ │ │ ├── enterprise_settings/
│ │ │ │ ├── api.py
│ │ │ │ ├── models.py
│ │ │ │ └── store.py
│ │ │ ├── evals/
│ │ │ │ ├── __init__.py
│ │ │ │ └── api.py
│ │ │ ├── features/
│ │ │ │ ├── __init__.py
│ │ │ │ └── hooks/
│ │ │ │ ├── __init__.py
│ │ │ │ └── api.py
│ │ │ ├── license/
│ │ │ │ ├── api.py
│ │ │ │ └── models.py
│ │ │ ├── manage/
│ │ │ │ └── standard_answer.py
│ │ │ ├── middleware/
│ │ │ │ ├── license_enforcement.py
│ │ │ │ └── tenant_tracking.py
│ │ │ ├── oauth/
│ │ │ │ ├── api.py
│ │ │ │ ├── api_router.py
│ │ │ │ ├── confluence_cloud.py
│ │ │ │ ├── google_drive.py
│ │ │ │ └── slack.py
│ │ │ ├── query_and_chat/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── models.py
│ │ │ │ ├── query_backend.py
│ │ │ │ ├── search_backend.py
│ │ │ │ ├── streaming_models.py
│ │ │ │ └── token_limit.py
│ │ │ ├── query_history/
│ │ │ │ ├── api.py
│ │ │ │ └── models.py
│ │ │ ├── reporting/
│ │ │ │ ├── usage_export_api.py
│ │ │ │ ├── usage_export_generation.py
│ │ │ │ └── usage_export_models.py
│ │ │ ├── scim/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── api.py
│ │ │ │ ├── auth.py
│ │ │ │ ├── filtering.py
│ │ │ │ ├── models.py
│ │ │ │ ├── patch.py
│ │ │ │ ├── providers/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── entra.py
│ │ │ │ │ └── okta.py
│ │ │ │ └── schema_definitions.py
│ │ │ ├── seeding.py
│ │ │ ├── settings/
│ │ │ │ ├── __init__.py
│ │ │ │ └── api.py
│ │ │ ├── tenant_usage_limits.py
│ │ │ ├── tenants/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── access.py
│ │ │ │ ├── admin_api.py
│ │ │ │ ├── anonymous_user_path.py
│ │ │ │ ├── anonymous_users_api.py
│ │ │ │ ├── api.py
│ │ │ │ ├── billing.py
│ │ │ │ ├── billing_api.py
│ │ │ │ ├── models.py
│ │ │ │ ├── product_gating.py
│ │ │ │ ├── provisioning.py
│ │ │ │ ├── proxy.py
│ │ │ │ ├── schema_management.py
│ │ │ │ ├── team_membership_api.py
│ │ │ │ ├── tenant_management_api.py
│ │ │ │ ├── user_invitations_api.py
│ │ │ │ └── user_mapping.py
│ │ │ ├── token_rate_limits/
│ │ │ │ └── api.py
│ │ │ ├── usage_limits.py
│ │ │ └── user_group/
│ │ │ ├── api.py
│ │ │ └── models.py
│ │ └── utils/
│ │ ├── __init__.py
│ │ ├── encryption.py
│ │ ├── license.py
│ │ ├── posthog_client.py
│ │ └── telemetry.py
│ ├── generated/
│ │ └── README.md
│ ├── keys/
│ │ └── license_public_key.pem
│ ├── model_server/
│ │ ├── __init__.py
│ │ ├── constants.py
│ │ ├── encoders.py
│ │ ├── legacy/
│ │ │ ├── README.md
│ │ │ ├── __init__.py
│ │ │ ├── custom_models.py
│ │ │ ├── onyx_torch_model.py
│ │ │ └── reranker.py
│ │ ├── main.py
│ │ ├── management_endpoints.py
│ │ └── utils.py
│ ├── onyx/
│ │ ├── __init__.py
│ │ ├── access/
│ │ │ ├── __init__.py
│ │ │ ├── access.py
│ │ │ ├── hierarchy_access.py
│ │ │ ├── models.py
│ │ │ └── utils.py
│ │ ├── auth/
│ │ │ ├── __init__.py
│ │ │ ├── anonymous_user.py
│ │ │ ├── api_key.py
│ │ │ ├── captcha.py
│ │ │ ├── constants.py
│ │ │ ├── disposable_email_validator.py
│ │ │ ├── email_utils.py
│ │ │ ├── invited_users.py
│ │ │ ├── jwt.py
│ │ │ ├── oauth_refresher.py
│ │ │ ├── oauth_token_manager.py
│ │ │ ├── pat.py
│ │ │ ├── permissions.py
│ │ │ ├── schemas.py
│ │ │ ├── users.py
│ │ │ └── utils.py
│ │ ├── background/
│ │ │ ├── README.md
│ │ │ ├── celery/
│ │ │ │ ├── apps/
│ │ │ │ │ ├── app_base.py
│ │ │ │ │ ├── beat.py
│ │ │ │ │ ├── client.py
│ │ │ │ │ ├── docfetching.py
│ │ │ │ │ ├── docprocessing.py
│ │ │ │ │ ├── heavy.py
│ │ │ │ │ ├── light.py
│ │ │ │ │ ├── monitoring.py
│ │ │ │ │ ├── primary.py
│ │ │ │ │ ├── task_formatters.py
│ │ │ │ │ └── user_file_processing.py
│ │ │ │ ├── celery_k8s_probe.py
│ │ │ │ ├── celery_redis.py
│ │ │ │ ├── celery_utils.py
│ │ │ │ ├── configs/
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── beat.py
│ │ │ │ │ ├── client.py
│ │ │ │ │ ├── docfetching.py
│ │ │ │ │ ├── docprocessing.py
│ │ │ │ │ ├── heavy.py
│ │ │ │ │ ├── light.py
│ │ │ │ │ ├── monitoring.py
│ │ │ │ │ ├── primary.py
│ │ │ │ │ └── user_file_processing.py
│ │ │ │ ├── memory_monitoring.py
│ │ │ │ ├── tasks/
│ │ │ │ │ ├── beat_schedule.py
│ │ │ │ │ ├── connector_deletion/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── tasks.py
│ │ │ │ │ ├── docfetching/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── task_creation_utils.py
│ │ │ │ │ │ └── tasks.py
│ │ │ │ │ ├── docprocessing/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── heartbeat.py
│ │ │ │ │ │ ├── tasks.py
│ │ │ │ │ │ └── utils.py
│ │ │ │ │ ├── evals/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── tasks.py
│ │ │ │ │ ├── hierarchyfetching/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── tasks.py
│ │ │ │ │ ├── llm_model_update/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── tasks.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ ├── monitoring/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── tasks.py
│ │ │ │ │ ├── opensearch_migration/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── constants.py
│ │ │ │ │ │ ├── tasks.py
│ │ │ │ │ │ └── transformer.py
│ │ │ │ │ ├── periodic/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── tasks.py
│ │ │ │ │ ├── pruning/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── tasks.py
│ │ │ │ │ ├── shared/
│ │ │ │ │ │ ├── RetryDocumentIndex.py
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── tasks.py
│ │ │ │ │ ├── user_file_processing/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── tasks.py
│ │ │ │ │ └── vespa/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── document_sync.py
│ │ │ │ │ └── tasks.py
│ │ │ │ └── versioned_apps/
│ │ │ │ ├── beat.py
│ │ │ │ ├── client.py
│ │ │ │ ├── docfetching.py
│ │ │ │ ├── docprocessing.py
│ │ │ │ ├── heavy.py
│ │ │ │ ├── light.py
│ │ │ │ ├── monitoring.py
│ │ │ │ ├── primary.py
│ │ │ │ └── user_file_processing.py
│ │ │ ├── error_logging.py
│ │ │ ├── indexing/
│ │ │ │ ├── checkpointing_utils.py
│ │ │ │ ├── dask_utils.py
│ │ │ │ ├── index_attempt_utils.py
│ │ │ │ ├── job_client.py
│ │ │ │ ├── memory_tracer.py
│ │ │ │ ├── models.py
│ │ │ │ └── run_docfetching.py
│ │ │ ├── periodic_poller.py
│ │ │ └── task_utils.py
│ │ ├── cache/
│ │ │ ├── factory.py
│ │ │ ├── interface.py
│ │ │ ├── postgres_backend.py
│ │ │ └── redis_backend.py
│ │ ├── chat/
│ │ │ ├── COMPRESSION.md
│ │ │ ├── README.md
│ │ │ ├── __init__.py
│ │ │ ├── chat_processing_checker.py
│ │ │ ├── chat_state.py
│ │ │ ├── chat_utils.py
│ │ │ ├── citation_processor.py
│ │ │ ├── citation_utils.py
│ │ │ ├── compression.py
│ │ │ ├── emitter.py
│ │ │ ├── llm_loop.py
│ │ │ ├── llm_step.py
│ │ │ ├── models.py
│ │ │ ├── process_message.py
│ │ │ ├── prompt_utils.py
│ │ │ ├── save_chat.py
│ │ │ ├── stop_signal_checker.py
│ │ │ └── tool_call_args_streaming.py
│ │ ├── configs/
│ │ │ ├── __init__.py
│ │ │ ├── agent_configs.py
│ │ │ ├── app_configs.py
│ │ │ ├── chat_configs.py
│ │ │ ├── constants.py
│ │ │ ├── embedding_configs.py
│ │ │ ├── kg_configs.py
│ │ │ ├── llm_configs.py
│ │ │ ├── model_configs.py
│ │ │ ├── onyxbot_configs.py
│ │ │ ├── research_configs.py
│ │ │ ├── saml_config/
│ │ │ │ └── template.settings.json
│ │ │ └── tool_configs.py
│ │ ├── connectors/
│ │ │ ├── README.md
│ │ │ ├── __init__.py
│ │ │ ├── airtable/
│ │ │ │ └── airtable_connector.py
│ │ │ ├── asana/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── asana_api.py
│ │ │ │ └── connector.py
│ │ │ ├── axero/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── bitbucket/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── connector.py
│ │ │ │ └── utils.py
│ │ │ ├── blob/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── bookstack/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── client.py
│ │ │ │ └── connector.py
│ │ │ ├── canvas/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── access.py
│ │ │ │ ├── client.py
│ │ │ │ └── connector.py
│ │ │ ├── clickup/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── coda/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── confluence/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── access.py
│ │ │ │ ├── connector.py
│ │ │ │ ├── models.py
│ │ │ │ ├── onyx_confluence.py
│ │ │ │ ├── user_profile_override.py
│ │ │ │ └── utils.py
│ │ │ ├── connector_runner.py
│ │ │ ├── credentials_provider.py
│ │ │ ├── cross_connector_utils/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── miscellaneous_utils.py
│ │ │ │ └── rate_limit_wrapper.py
│ │ │ ├── discord/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── discourse/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── document360/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── connector.py
│ │ │ │ └── utils.py
│ │ │ ├── dropbox/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── drupal_wiki/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── connector.py
│ │ │ │ ├── models.py
│ │ │ │ └── utils.py
│ │ │ ├── egnyte/
│ │ │ │ └── connector.py
│ │ │ ├── exceptions.py
│ │ │ ├── factory.py
│ │ │ ├── file/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── fireflies/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── freshdesk/
│ │ │ │ ├── __init__,py
│ │ │ │ └── connector.py
│ │ │ ├── gitbook/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── github/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── connector.py
│ │ │ │ ├── models.py
│ │ │ │ ├── rate_limit_utils.py
│ │ │ │ └── utils.py
│ │ │ ├── gitlab/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── gmail/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── gong/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── google_drive/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── connector.py
│ │ │ │ ├── constants.py
│ │ │ │ ├── doc_conversion.py
│ │ │ │ ├── file_retrieval.py
│ │ │ │ ├── models.py
│ │ │ │ └── section_extraction.py
│ │ │ ├── google_site/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── google_utils/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── google_auth.py
│ │ │ │ ├── google_kv.py
│ │ │ │ ├── google_utils.py
│ │ │ │ ├── resources.py
│ │ │ │ └── shared_constants.py
│ │ │ ├── guru/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── highspot/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── client.py
│ │ │ │ ├── connector.py
│ │ │ │ └── utils.py
│ │ │ ├── hubspot/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── connector.py
│ │ │ │ └── rate_limit.py
│ │ │ ├── imap/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── connector.py
│ │ │ │ └── models.py
│ │ │ ├── interfaces.py
│ │ │ ├── jira/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── access.py
│ │ │ │ ├── connector.py
│ │ │ │ └── utils.py
│ │ │ ├── linear/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── loopio/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── mediawiki/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── family.py
│ │ │ │ └── wiki.py
│ │ │ ├── microsoft_graph_env.py
│ │ │ ├── mock_connector/
│ │ │ │ └── connector.py
│ │ │ ├── models.py
│ │ │ ├── notion/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── outline/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── client.py
│ │ │ │ └── connector.py
│ │ │ ├── productboard/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── registry.py
│ │ │ ├── requesttracker/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── salesforce/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── blacklist.py
│ │ │ │ ├── connector.py
│ │ │ │ ├── doc_conversion.py
│ │ │ │ ├── onyx_salesforce.py
│ │ │ │ ├── salesforce_calls.py
│ │ │ │ ├── shelve_stuff/
│ │ │ │ │ ├── old_test_salesforce_shelves.py
│ │ │ │ │ ├── shelve_functions.py
│ │ │ │ │ ├── shelve_utils.py
│ │ │ │ │ └── test_salesforce_shelves.py
│ │ │ │ ├── sqlite_functions.py
│ │ │ │ └── utils.py
│ │ │ ├── sharepoint/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── connector.py
│ │ │ │ └── connector_utils.py
│ │ │ ├── slab/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── slack/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── access.py
│ │ │ │ ├── connector.py
│ │ │ │ ├── models.py
│ │ │ │ ├── onyx_retry_handler.py
│ │ │ │ ├── onyx_slack_web_client.py
│ │ │ │ └── utils.py
│ │ │ ├── teams/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── connector.py
│ │ │ │ ├── models.py
│ │ │ │ └── utils.py
│ │ │ ├── testrail/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── web/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── wikipedia/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── xenforo/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ ├── zendesk/
│ │ │ │ ├── __init__.py
│ │ │ │ └── connector.py
│ │ │ └── zulip/
│ │ │ ├── __init__.py
│ │ │ ├── connector.py
│ │ │ ├── schemas.py
│ │ │ └── utils.py
│ │ ├── context/
│ │ │ └── search/
│ │ │ ├── __init__.py
│ │ │ ├── enums.py
│ │ │ ├── federated/
│ │ │ │ ├── models.py
│ │ │ │ ├── slack_search.py
│ │ │ │ └── slack_search_utils.py
│ │ │ ├── models.py
│ │ │ ├── pipeline.py
│ │ │ ├── preprocessing/
│ │ │ │ └── access_filters.py
│ │ │ ├── retrieval/
│ │ │ │ └── search_runner.py
│ │ │ └── utils.py
│ │ ├── db/
│ │ │ ├── README.md
│ │ │ ├── __init__.py
│ │ │ ├── _deprecated/
│ │ │ │ └── pg_file_store.py
│ │ │ ├── api_key.py
│ │ │ ├── auth.py
│ │ │ ├── background_error.py
│ │ │ ├── chat.py
│ │ │ ├── chat_search.py
│ │ │ ├── chunk.py
│ │ │ ├── code_interpreter.py
│ │ │ ├── connector.py
│ │ │ ├── connector_credential_pair.py
│ │ │ ├── constants.py
│ │ │ ├── credentials.py
│ │ │ ├── dal.py
│ │ │ ├── deletion_attempt.py
│ │ │ ├── discord_bot.py
│ │ │ ├── document.py
│ │ │ ├── document_access.py
│ │ │ ├── document_set.py
│ │ │ ├── engine/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── async_sql_engine.py
│ │ │ │ ├── connection_warmup.py
│ │ │ │ ├── iam_auth.py
│ │ │ │ ├── sql_engine.py
│ │ │ │ ├── tenant_utils.py
│ │ │ │ └── time_utils.py
│ │ │ ├── entities.py
│ │ │ ├── entity_type.py
│ │ │ ├── enums.py
│ │ │ ├── federated.py
│ │ │ ├── feedback.py
│ │ │ ├── file_content.py
│ │ │ ├── file_record.py
│ │ │ ├── hierarchy.py
│ │ │ ├── hook.py
│ │ │ ├── image_generation.py
│ │ │ ├── index_attempt.py
│ │ │ ├── indexing_coordination.py
│ │ │ ├── input_prompt.py
│ │ │ ├── kg_config.py
│ │ │ ├── kg_temp_view.py
│ │ │ ├── llm.py
│ │ │ ├── mcp.py
│ │ │ ├── memory.py
│ │ │ ├── models.py
│ │ │ ├── notification.py
│ │ │ ├── oauth_config.py
│ │ │ ├── opensearch_migration.py
│ │ │ ├── pat.py
│ │ │ ├── permission_sync_attempt.py
│ │ │ ├── permissions.py
│ │ │ ├── persona.py
│ │ │ ├── projects.py
│ │ │ ├── pydantic_type.py
│ │ │ ├── relationships.py
│ │ │ ├── release_notes.py
│ │ │ ├── rotate_encryption_key.py
│ │ │ ├── saml.py
│ │ │ ├── search_settings.py
│ │ │ ├── seeding/
│ │ │ │ └── chat_history_seeding.py
│ │ │ ├── slack_bot.py
│ │ │ ├── slack_channel_config.py
│ │ │ ├── swap_index.py
│ │ │ ├── sync_record.py
│ │ │ ├── tag.py
│ │ │ ├── tasks.py
│ │ │ ├── token_limit.py
│ │ │ ├── tools.py
│ │ │ ├── usage.py
│ │ │ ├── user_file.py
│ │ │ ├── user_preferences.py
│ │ │ ├── users.py
│ │ │ ├── utils.py
│ │ │ ├── voice.py
│ │ │ └── web_search.py
│ │ ├── deep_research/
│ │ │ ├── __init__.py
│ │ │ ├── dr_loop.py
│ │ │ ├── dr_mock_tools.py
│ │ │ ├── models.py
│ │ │ └── utils.py
│ │ ├── document_index/
│ │ │ ├── FILTER_SEMANTICS.md
│ │ │ ├── __init__.py
│ │ │ ├── chunk_content_enrichment.py
│ │ │ ├── disabled.py
│ │ │ ├── document_index_utils.py
│ │ │ ├── factory.py
│ │ │ ├── interfaces.py
│ │ │ ├── interfaces_new.py
│ │ │ ├── opensearch/
│ │ │ │ ├── README.md
│ │ │ │ ├── client.py
│ │ │ │ ├── cluster_settings.py
│ │ │ │ ├── constants.py
│ │ │ │ ├── opensearch_document_index.py
│ │ │ │ ├── schema.py
│ │ │ │ ├── search.py
│ │ │ │ └── string_filtering.py
│ │ │ ├── vespa/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── app_config/
│ │ │ │ │ ├── schemas/
│ │ │ │ │ │ └── danswer_chunk.sd.jinja
│ │ │ │ │ ├── services.xml.jinja
│ │ │ │ │ └── validation-overrides.xml.jinja
│ │ │ │ ├── chunk_retrieval.py
│ │ │ │ ├── deletion.py
│ │ │ │ ├── index.py
│ │ │ │ ├── indexing_utils.py
│ │ │ │ ├── kg_interactions.py
│ │ │ │ ├── shared_utils/
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── vespa_request_builders.py
│ │ │ │ └── vespa_document_index.py
│ │ │ └── vespa_constants.py
│ │ ├── error_handling/
│ │ │ ├── __init__.py
│ │ │ ├── error_codes.py
│ │ │ └── exceptions.py
│ │ ├── evals/
│ │ │ ├── README.md
│ │ │ ├── eval.py
│ │ │ ├── eval_cli.py
│ │ │ ├── models.py
│ │ │ ├── one_off/
│ │ │ │ └── create_braintrust_dataset.py
│ │ │ ├── provider.py
│ │ │ └── providers/
│ │ │ ├── braintrust.py
│ │ │ └── local.py
│ │ ├── feature_flags/
│ │ │ ├── __init__.py
│ │ │ ├── factory.py
│ │ │ ├── feature_flags_keys.py
│ │ │ ├── flags.py
│ │ │ └── interface.py
│ │ ├── federated_connectors/
│ │ │ ├── __init__.py
│ │ │ ├── factory.py
│ │ │ ├── federated_retrieval.py
│ │ │ ├── interfaces.py
│ │ │ ├── models.py
│ │ │ ├── oauth_utils.py
│ │ │ ├── registry.py
│ │ │ └── slack/
│ │ │ ├── __init__.py
│ │ │ ├── federated_connector.py
│ │ │ └── models.py
│ │ ├── file_processing/
│ │ │ ├── __init__.py
│ │ │ ├── enums.py
│ │ │ ├── extract_file_text.py
│ │ │ ├── file_types.py
│ │ │ ├── html_utils.py
│ │ │ ├── image_summarization.py
│ │ │ ├── image_utils.py
│ │ │ ├── password_validation.py
│ │ │ └── unstructured.py
│ │ ├── file_store/
│ │ │ ├── README.md
│ │ │ ├── constants.py
│ │ │ ├── document_batch_storage.py
│ │ │ ├── file_store.py
│ │ │ ├── models.py
│ │ │ ├── postgres_file_store.py
│ │ │ ├── s3_key_utils.py
│ │ │ └── utils.py
│ │ ├── hooks/
│ │ │ ├── __init__.py
│ │ │ ├── api_dependencies.py
│ │ │ ├── executor.py
│ │ │ ├── models.py
│ │ │ ├── points/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── document_ingestion.py
│ │ │ │ └── query_processing.py
│ │ │ └── registry.py
│ │ ├── httpx/
│ │ │ └── httpx_pool.py
│ │ ├── image_gen/
│ │ │ ├── __init__.py
│ │ │ ├── exceptions.py
│ │ │ ├── factory.py
│ │ │ ├── interfaces.py
│ │ │ └── providers/
│ │ │ ├── azure_img_gen.py
│ │ │ ├── openai_img_gen.py
│ │ │ └── vertex_img_gen.py
│ │ ├── indexing/
│ │ │ ├── __init__.py
│ │ │ ├── adapters/
│ │ │ │ ├── document_indexing_adapter.py
│ │ │ │ └── user_file_indexing_adapter.py
│ │ │ ├── chunk_batch_store.py
│ │ │ ├── chunker.py
│ │ │ ├── content_classification.py
│ │ │ ├── embedder.py
│ │ │ ├── indexing_heartbeat.py
│ │ │ ├── indexing_pipeline.py
│ │ │ ├── models.py
│ │ │ └── vector_db_insertion.py
│ │ ├── key_value_store/
│ │ │ ├── __init__.py
│ │ │ ├── factory.py
│ │ │ ├── interface.py
│ │ │ └── store.py
│ │ ├── kg/
│ │ │ ├── clustering/
│ │ │ │ ├── clustering.py
│ │ │ │ └── normalizations.py
│ │ │ ├── extractions/
│ │ │ │ └── extraction_processing.py
│ │ │ ├── models.py
│ │ │ ├── resets/
│ │ │ │ ├── reset_index.py
│ │ │ │ ├── reset_source.py
│ │ │ │ └── reset_vespa.py
│ │ │ ├── setup/
│ │ │ │ └── kg_default_entity_definitions.py
│ │ │ ├── utils/
│ │ │ │ ├── embeddings.py
│ │ │ │ ├── extraction_utils.py
│ │ │ │ ├── formatting_utils.py
│ │ │ │ └── lock_utils.py
│ │ │ └── vespa/
│ │ │ └── vespa_interactions.py
│ │ ├── llm/
│ │ │ ├── __init__.py
│ │ │ ├── constants.py
│ │ │ ├── cost.py
│ │ │ ├── factory.py
│ │ │ ├── interfaces.py
│ │ │ ├── litellm_singleton/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── config.py
│ │ │ │ └── monkey_patches.py
│ │ │ ├── model_metadata_enrichments.json
│ │ │ ├── model_name_parser.py
│ │ │ ├── model_response.py
│ │ │ ├── models.py
│ │ │ ├── multi_llm.py
│ │ │ ├── override_models.py
│ │ │ ├── prompt_cache/
│ │ │ │ ├── README.md
│ │ │ │ ├── __init__.py
│ │ │ │ ├── cache_manager.py
│ │ │ │ ├── models.py
│ │ │ │ ├── processor.py
│ │ │ │ ├── providers/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── anthropic.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── factory.py
│ │ │ │ │ ├── noop.py
│ │ │ │ │ ├── openai.py
│ │ │ │ │ └── vertex.py
│ │ │ │ └── utils.py
│ │ │ ├── request_context.py
│ │ │ ├── utils.py
│ │ │ └── well_known_providers/
│ │ │ ├── auto_update_models.py
│ │ │ ├── auto_update_service.py
│ │ │ ├── constants.py
│ │ │ ├── llm_provider_options.py
│ │ │ ├── models.py
│ │ │ └── recommended-models.json
│ │ ├── main.py
│ │ ├── mcp_server/
│ │ │ ├── README.md
│ │ │ ├── api.py
│ │ │ ├── auth.py
│ │ │ ├── mcp.json.template
│ │ │ ├── resources/
│ │ │ │ ├── __init__.py
│ │ │ │ └── indexed_sources.py
│ │ │ ├── tools/
│ │ │ │ ├── __init__.py
│ │ │ │ └── search.py
│ │ │ └── utils.py
│ │ ├── mcp_server_main.py
│ │ ├── natural_language_processing/
│ │ │ ├── __init__.py
│ │ │ ├── constants.py
│ │ │ ├── english_stopwords.py
│ │ │ ├── exceptions.py
│ │ │ ├── search_nlp_models.py
│ │ │ └── utils.py
│ │ ├── onyxbot/
│ │ │ ├── discord/
│ │ │ │ ├── DISCORD_MULTITENANT_README.md
│ │ │ │ ├── api_client.py
│ │ │ │ ├── cache.py
│ │ │ │ ├── client.py
│ │ │ │ ├── constants.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── handle_commands.py
│ │ │ │ ├── handle_message.py
│ │ │ │ └── utils.py
│ │ │ └── slack/
│ │ │ ├── blocks.py
│ │ │ ├── config.py
│ │ │ ├── constants.py
│ │ │ ├── formatting.py
│ │ │ ├── handlers/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── handle_buttons.py
│ │ │ │ ├── handle_message.py
│ │ │ │ ├── handle_regular_answer.py
│ │ │ │ ├── handle_standard_answers.py
│ │ │ │ └── utils.py
│ │ │ ├── icons.py
│ │ │ ├── listener.py
│ │ │ ├── models.py
│ │ │ └── utils.py
│ │ ├── prompts/
│ │ │ ├── __init__.py
│ │ │ ├── basic_memory.py
│ │ │ ├── chat_prompts.py
│ │ │ ├── chat_tools.py
│ │ │ ├── compression_prompts.py
│ │ │ ├── constants.py
│ │ │ ├── contextual_retrieval.py
│ │ │ ├── deep_research/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── dr_tool_prompts.py
│ │ │ │ ├── orchestration_layer.py
│ │ │ │ └── research_agent.py
│ │ │ ├── federated_search.py
│ │ │ ├── filter_extration.py
│ │ │ ├── image_analysis.py
│ │ │ ├── kg_prompts.py
│ │ │ ├── prompt_template.py
│ │ │ ├── prompt_utils.py
│ │ │ ├── search_prompts.py
│ │ │ ├── tool_prompts.py
│ │ │ └── user_info.py
│ │ ├── redis/
│ │ │ ├── iam_auth.py
│ │ │ ├── redis_connector.py
│ │ │ ├── redis_connector_delete.py
│ │ │ ├── redis_connector_doc_perm_sync.py
│ │ │ ├── redis_connector_ext_group_sync.py
│ │ │ ├── redis_connector_index.py
│ │ │ ├── redis_connector_prune.py
│ │ │ ├── redis_connector_stop.py
│ │ │ ├── redis_connector_utils.py
│ │ │ ├── redis_document_set.py
│ │ │ ├── redis_hierarchy.py
│ │ │ ├── redis_object_helper.py
│ │ │ ├── redis_pool.py
│ │ │ ├── redis_usergroup.py
│ │ │ └── redis_utils.py
│ │ ├── secondary_llm_flows/
│ │ │ ├── __init__.py
│ │ │ ├── chat_session_naming.py
│ │ │ ├── document_filter.py
│ │ │ ├── memory_update.py
│ │ │ ├── query_expansion.py
│ │ │ ├── source_filter.py
│ │ │ └── time_filter.py
│ │ ├── seeding/
│ │ │ └── __init__.py
│ │ ├── server/
│ │ │ ├── __init__.py
│ │ │ ├── api_key/
│ │ │ │ ├── api.py
│ │ │ │ └── models.py
│ │ │ ├── api_key_usage.py
│ │ │ ├── auth_check.py
│ │ │ ├── documents/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── cc_pair.py
│ │ │ │ ├── connector.py
│ │ │ │ ├── credential.py
│ │ │ │ ├── document.py
│ │ │ │ ├── document_utils.py
│ │ │ │ ├── models.py
│ │ │ │ ├── private_key_types.py
│ │ │ │ └── standard_oauth.py
│ │ │ ├── evals/
│ │ │ │ ├── __init__.py
│ │ │ │ └── models.py
│ │ │ ├── features/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── build/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── AGENTS.template.md
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── api/
│ │ │ │ │ │ ├── api.py
│ │ │ │ │ │ ├── messages_api.py
│ │ │ │ │ │ ├── models.py
│ │ │ │ │ │ ├── packet_logger.py
│ │ │ │ │ │ ├── packets.py
│ │ │ │ │ │ ├── rate_limit.py
│ │ │ │ │ │ ├── sessions_api.py
│ │ │ │ │ │ ├── subscription_check.py
│ │ │ │ │ │ ├── templates/
│ │ │ │ │ │ │ ├── webapp_hmr_fixer.js
│ │ │ │ │ │ │ └── webapp_offline.html
│ │ │ │ │ │ └── user_library.py
│ │ │ │ │ ├── configs.py
│ │ │ │ │ ├── db/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── build_session.py
│ │ │ │ │ │ ├── rate_limit.py
│ │ │ │ │ │ ├── sandbox.py
│ │ │ │ │ │ └── user_library.py
│ │ │ │ │ ├── indexing/
│ │ │ │ │ │ └── persistent_document_writer.py
│ │ │ │ │ ├── s3/
│ │ │ │ │ │ └── s3_client.py
│ │ │ │ │ ├── sandbox/
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── base.py
│ │ │ │ │ │ ├── kubernetes/
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── docker/
│ │ │ │ │ │ │ │ ├── Dockerfile
│ │ │ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ │ │ ├── generate_agents_md.py
│ │ │ │ │ │ │ │ ├── initial-requirements.txt
│ │ │ │ │ │ │ │ ├── run-test.sh
│ │ │ │ │ │ │ │ ├── skills/
│ │ │ │ │ │ │ │ │ ├── image-generation/
│ │ │ │ │ │ │ │ │ │ ├── SKILL.md
│ │ │ │ │ │ │ │ │ │ └── scripts/
│ │ │ │ │ │ │ │ │ │ └── generate.py
│ │ │ │ │ │ │ │ │ └── pptx/
│ │ │ │ │ │ │ │ │ ├── SKILL.md
│ │ │ │ │ │ │ │ │ ├── editing.md
│ │ │ │ │ │ │ │ │ ├── pptxgenjs.md
│ │ │ │ │ │ │ │ │ └── scripts/
│ │ │ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ │ │ ├── add_slide.py
│ │ │ │ │ │ │ │ │ ├── clean.py
│ │ │ │ │ │ │ │ │ ├── office/
│ │ │ │ │ │ │ │ │ │ ├── helpers/
│ │ │ │ │ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ │ │ │ │ ├── merge_runs.py
│ │ │ │ │ │ │ │ │ │ │ └── simplify_redlines.py
│ │ │ │ │ │ │ │ │ │ ├── pack.py
│ │ │ │ │ │ │ │ │ │ ├── schemas/
│ │ │ │ │ │ │ │ │ │ │ ├── ISO-IEC29500-4_2016/
│ │ │ │ │ │ │ │ │ │ │ │ ├── dml-chart.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── dml-chartDrawing.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── dml-diagram.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── dml-lockedCanvas.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── dml-main.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── dml-picture.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── dml-spreadsheetDrawing.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── dml-wordprocessingDrawing.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── pml.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── shared-additionalCharacteristics.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── shared-bibliography.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── shared-commonSimpleTypes.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── shared-customXmlDataProperties.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── shared-customXmlSchemaProperties.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── shared-documentPropertiesCustom.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── shared-documentPropertiesExtended.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── shared-documentPropertiesVariantTypes.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── shared-math.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── shared-relationshipReference.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── sml.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── vml-main.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── vml-officeDrawing.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── vml-presentationDrawing.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── vml-spreadsheetDrawing.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── vml-wordprocessingDrawing.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── wml.xsd
│ │ │ │ │ │ │ │ │ │ │ │ └── xml.xsd
│ │ │ │ │ │ │ │ │ │ │ ├── ecma/
│ │ │ │ │ │ │ │ │ │ │ │ └── fouth-edition/
│ │ │ │ │ │ │ │ │ │ │ │ ├── opc-contentTypes.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── opc-coreProperties.xsd
│ │ │ │ │ │ │ │ │ │ │ │ ├── opc-digSig.xsd
│ │ │ │ │ │ │ │ │ │ │ │ └── opc-relationships.xsd
│ │ │ │ │ │ │ │ │ │ │ ├── mce/
│ │ │ │ │ │ │ │ │ │ │ │ └── mc.xsd
│ │ │ │ │ │ │ │ │ │ │ └── microsoft/
│ │ │ │ │ │ │ │ │ │ │ ├── wml-2010.xsd
│ │ │ │ │ │ │ │ │ │ │ ├── wml-2012.xsd
│ │ │ │ │ │ │ │ │ │ │ ├── wml-2018.xsd
│ │ │ │ │ │ │ │ │ │ │ ├── wml-cex-2018.xsd
│ │ │ │ │ │ │ │ │ │ │ ├── wml-cid-2016.xsd
│ │ │ │ │ │ │ │ │ │ │ ├── wml-sdtdatahash-2020.xsd
│ │ │ │ │ │ │ │ │ │ │ └── wml-symex-2015.xsd
│ │ │ │ │ │ │ │ │ │ ├── soffice.py
│ │ │ │ │ │ │ │ │ │ ├── unpack.py
│ │ │ │ │ │ │ │ │ │ ├── validate.py
│ │ │ │ │ │ │ │ │ │ └── validators/
│ │ │ │ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ │ │ │ ├── base.py
│ │ │ │ │ │ │ │ │ │ ├── docx.py
│ │ │ │ │ │ │ │ │ │ ├── pptx.py
│ │ │ │ │ │ │ │ │ │ └── redlining.py
│ │ │ │ │ │ │ │ │ ├── preview.py
│ │ │ │ │ │ │ │ │ └── thumbnail.py
│ │ │ │ │ │ │ │ ├── templates/
│ │ │ │ │ │ │ │ │ └── outputs/
│ │ │ │ │ │ │ │ │ └── web/
│ │ │ │ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ │ │ │ ├── AGENTS.md
│ │ │ │ │ │ │ │ │ ├── app/
│ │ │ │ │ │ │ │ │ │ ├── globals.css
│ │ │ │ │ │ │ │ │ │ ├── layout.tsx
│ │ │ │ │ │ │ │ │ │ ├── page.tsx
│ │ │ │ │ │ │ │ │ │ └── site.webmanifest
│ │ │ │ │ │ │ │ │ ├── components/
│ │ │ │ │ │ │ │ │ │ ├── component-example.tsx
│ │ │ │ │ │ │ │ │ │ ├── example.tsx
│ │ │ │ │ │ │ │ │ │ └── ui/
│ │ │ │ │ │ │ │ │ │ ├── accordion.tsx
│ │ │ │ │ │ │ │ │ │ ├── alert-dialog.tsx
│ │ │ │ │ │ │ │ │ │ ├── alert.tsx
│ │ │ │ │ │ │ │ │ │ ├── aspect-ratio.tsx
│ │ │ │ │ │ │ │ │ │ ├── avatar.tsx
│ │ │ │ │ │ │ │ │ │ ├── badge.tsx
│ │ │ │ │ │ │ │ │ │ ├── breadcrumb.tsx
│ │ │ │ │ │ │ │ │ │ ├── button-group.tsx
│ │ │ │ │ │ │ │ │ │ ├── button.tsx
│ │ │ │ │ │ │ │ │ │ ├── calendar.tsx
│ │ │ │ │ │ │ │ │ │ ├── card.tsx
│ │ │ │ │ │ │ │ │ │ ├── carousel.tsx
│ │ │ │ │ │ │ │ │ │ ├── chart.tsx
│ │ │ │ │ │ │ │ │ │ ├── checkbox.tsx
│ │ │ │ │ │ │ │ │ │ ├── collapsible.tsx
│ │ │ │ │ │ │ │ │ │ ├── combobox.tsx
│ │ │ │ │ │ │ │ │ │ ├── command.tsx
│ │ │ │ │ │ │ │ │ │ ├── context-menu.tsx
│ │ │ │ │ │ │ │ │ │ ├── dialog.tsx
│ │ │ │ │ │ │ │ │ │ ├── drawer.tsx
│ │ │ │ │ │ │ │ │ │ ├── dropdown-menu.tsx
│ │ │ │ │ │ │ │ │ │ ├── empty.tsx
│ │ │ │ │ │ │ │ │ │ ├── field.tsx
│ │ │ │ │ │ │ │ │ │ ├── hover-card.tsx
│ │ │ │ │ │ │ │ │ │ ├── input-group.tsx
│ │ │ │ │ │ │ │ │ │ ├── input.tsx
│ │ │ │ │ │ │ │ │ │ ├── item.tsx
│ │ │ │ │ │ │ │ │ │ ├── kbd.tsx
│ │ │ │ │ │ │ │ │ │ ├── label.tsx
│ │ │ │ │ │ │ │ │ │ ├── menubar.tsx
│ │ │ │ │ │ │ │ │ │ ├── native-select.tsx
│ │ │ │ │ │ │ │ │ │ ├── navigation-menu.tsx
│ │ │ │ │ │ │ │ │ │ ├── pagination.tsx
│ │ │ │ │ │ │ │ │ │ ├── popover.tsx
│ │ │ │ │ │ │ │ │ │ ├── progress.tsx
│ │ │ │ │ │ │ │ │ │ ├── radio-group.tsx
│ │ │ │ │ │ │ │ │ │ ├── resizable.tsx
│ │ │ │ │ │ │ │ │ │ ├── scroll-area.tsx
│ │ │ │ │ │ │ │ │ │ ├── select.tsx
│ │ │ │ │ │ │ │ │ │ ├── separator.tsx
│ │ │ │ │ │ │ │ │ │ ├── sheet.tsx
│ │ │ │ │ │ │ │ │ │ ├── sidebar.tsx
│ │ │ │ │ │ │ │ │ │ ├── skeleton.tsx
│ │ │ │ │ │ │ │ │ │ ├── slider.tsx
│ │ │ │ │ │ │ │ │ │ ├── sonner.tsx
│ │ │ │ │ │ │ │ │ │ ├── spinner.tsx
│ │ │ │ │ │ │ │ │ │ ├── switch.tsx
│ │ │ │ │ │ │ │ │ │ ├── table.tsx
│ │ │ │ │ │ │ │ │ │ ├── tabs.tsx
│ │ │ │ │ │ │ │ │ │ ├── textarea.tsx
│ │ │ │ │ │ │ │ │ │ ├── toggle-group.tsx
│ │ │ │ │ │ │ │ │ │ ├── toggle.tsx
│ │ │ │ │ │ │ │ │ │ └── tooltip.tsx
│ │ │ │ │ │ │ │ │ ├── components.json
│ │ │ │ │ │ │ │ │ ├── eslint.config.mjs
│ │ │ │ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ │ │ │ └── use-mobile.ts
│ │ │ │ │ │ │ │ │ ├── lib/
│ │ │ │ │ │ │ │ │ │ └── utils.ts
│ │ │ │ │ │ │ │ │ ├── next.config.ts
│ │ │ │ │ │ │ │ │ ├── package.json
│ │ │ │ │ │ │ │ │ ├── postcss.config.mjs
│ │ │ │ │ │ │ │ │ └── tsconfig.json
│ │ │ │ │ │ │ │ └── test-job.yaml
│ │ │ │ │ │ │ ├── internal/
│ │ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ │ └── acp_exec_client.py
│ │ │ │ │ │ │ └── kubernetes_sandbox_manager.py
│ │ │ │ │ │ ├── local/
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── agent_client.py
│ │ │ │ │ │ │ ├── local_sandbox_manager.py
│ │ │ │ │ │ │ ├── process_manager.py
│ │ │ │ │ │ │ ├── test_agent_client.py
│ │ │ │ │ │ │ └── test_manager.py
│ │ │ │ │ │ ├── manager/
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── directory_manager.py
│ │ │ │ │ │ │ ├── snapshot_manager.py
│ │ │ │ │ │ │ └── test_directory_manager.py
│ │ │ │ │ │ ├── models.py
│ │ │ │ │ │ ├── tasks/
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ └── tasks.py
│ │ │ │ │ │ └── util/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── agent_instructions.py
│ │ │ │ │ │ ├── build_venv_template.py
│ │ │ │ │ │ ├── opencode_config.py
│ │ │ │ │ │ └── persona_mapping.py
│ │ │ │ │ ├── session/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── manager.py
│ │ │ │ │ │ └── prompts.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── default_assistant/
│ │ │ │ │ ├── api.py
│ │ │ │ │ └── models.py
│ │ │ │ ├── document_set/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ └── models.py
│ │ │ │ ├── hierarchy/
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── constants.py
│ │ │ │ │ └── models.py
│ │ │ │ ├── hooks/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── input_prompt/
│ │ │ │ │ ├── api.py
│ │ │ │ │ └── models.py
│ │ │ │ ├── mcp/
│ │ │ │ │ ├── api.py
│ │ │ │ │ └── models.py
│ │ │ │ ├── notifications/
│ │ │ │ │ └── api.py
│ │ │ │ ├── oauth_config/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ └── models.py
│ │ │ │ ├── password/
│ │ │ │ │ ├── api.py
│ │ │ │ │ └── models.py
│ │ │ │ ├── persona/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── constants.py
│ │ │ │ │ └── models.py
│ │ │ │ ├── projects/
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ └── projects_file_utils.py
│ │ │ │ ├── release_notes/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── constants.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── tool/
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ └── tool_visibility.py
│ │ │ │ ├── user_oauth_token/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── api.py
│ │ │ │ └── web_search/
│ │ │ │ ├── api.py
│ │ │ │ └── models.py
│ │ │ ├── federated/
│ │ │ │ ├── api.py
│ │ │ │ └── models.py
│ │ │ ├── kg/
│ │ │ │ ├── api.py
│ │ │ │ └── models.py
│ │ │ ├── manage/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── administrative.py
│ │ │ │ ├── code_interpreter/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ └── models.py
│ │ │ │ ├── discord_bot/
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── embedding/
│ │ │ │ │ ├── api.py
│ │ │ │ │ └── models.py
│ │ │ │ ├── get_state.py
│ │ │ │ ├── image_generation/
│ │ │ │ │ ├── api.py
│ │ │ │ │ └── models.py
│ │ │ │ ├── llm/
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── models.py
│ │ │ │ ├── opensearch_migration/
│ │ │ │ │ ├── api.py
│ │ │ │ │ └── models.py
│ │ │ │ ├── search_settings.py
│ │ │ │ ├── slack_bot.py
│ │ │ │ ├── users.py
│ │ │ │ ├── validate_tokens.py
│ │ │ │ ├── voice/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ ├── user_api.py
│ │ │ │ │ └── websocket_api.py
│ │ │ │ └── web_search/
│ │ │ │ ├── api.py
│ │ │ │ └── models.py
│ │ │ ├── metrics/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── celery_task_metrics.py
│ │ │ │ ├── indexing_pipeline.py
│ │ │ │ ├── indexing_pipeline_setup.py
│ │ │ │ ├── indexing_task_metrics.py
│ │ │ │ ├── metrics_server.py
│ │ │ │ ├── opensearch_search.py
│ │ │ │ ├── per_tenant.py
│ │ │ │ ├── postgres_connection_pool.py
│ │ │ │ ├── prometheus_setup.py
│ │ │ │ └── slow_requests.py
│ │ │ ├── middleware/
│ │ │ │ ├── latency_logging.py
│ │ │ │ └── rate_limiting.py
│ │ │ ├── models.py
│ │ │ ├── onyx_api/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── ingestion.py
│ │ │ │ └── models.py
│ │ │ ├── pat/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── api.py
│ │ │ │ └── models.py
│ │ │ ├── query_and_chat/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── chat_backend.py
│ │ │ │ ├── chat_utils.py
│ │ │ │ ├── models.py
│ │ │ │ ├── placement.py
│ │ │ │ ├── query_backend.py
│ │ │ │ ├── session_loading.py
│ │ │ │ ├── streaming_models.py
│ │ │ │ └── token_limit.py
│ │ │ ├── runtime/
│ │ │ │ └── onyx_runtime.py
│ │ │ ├── saml.py
│ │ │ ├── settings/
│ │ │ │ ├── api.py
│ │ │ │ ├── models.py
│ │ │ │ └── store.py
│ │ │ ├── tenant_usage_limits.py
│ │ │ ├── token_rate_limits/
│ │ │ │ ├── api.py
│ │ │ │ └── models.py
│ │ │ ├── usage_limits.py
│ │ │ ├── utils.py
│ │ │ └── utils_vector_db.py
│ │ ├── setup.py
│ │ ├── tools/
│ │ │ ├── built_in_tools.py
│ │ │ ├── constants.py
│ │ │ ├── fake_tools/
│ │ │ │ ├── __init__.py
│ │ │ │ └── research_agent.py
│ │ │ ├── interface.py
│ │ │ ├── models.py
│ │ │ ├── tool_constructor.py
│ │ │ ├── tool_implementations/
│ │ │ │ ├── custom/
│ │ │ │ │ ├── base_tool_types.py
│ │ │ │ │ ├── custom_tool.py
│ │ │ │ │ └── openapi_parsing.py
│ │ │ │ ├── file_reader/
│ │ │ │ │ └── file_reader_tool.py
│ │ │ │ ├── images/
│ │ │ │ │ ├── image_generation_tool.py
│ │ │ │ │ └── models.py
│ │ │ │ ├── knowledge_graph/
│ │ │ │ │ └── knowledge_graph_tool.py
│ │ │ │ ├── mcp/
│ │ │ │ │ ├── mcp_client.py
│ │ │ │ │ └── mcp_tool.py
│ │ │ │ ├── memory/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── memory_tool.py
│ │ │ │ │ └── models.py
│ │ │ │ ├── open_url/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── firecrawl.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ ├── onyx_web_crawler.py
│ │ │ │ │ ├── open_url_tool.py
│ │ │ │ │ ├── snippet_matcher.py
│ │ │ │ │ ├── url_normalization.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── python/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── code_interpreter_client.py
│ │ │ │ │ └── python_tool.py
│ │ │ │ ├── search/
│ │ │ │ │ ├── constants.py
│ │ │ │ │ ├── search_tool.py
│ │ │ │ │ └── search_utils.py
│ │ │ │ ├── search_like_tool_utils.py
│ │ │ │ ├── utils.py
│ │ │ │ └── web_search/
│ │ │ │ ├── clients/
│ │ │ │ │ ├── brave_client.py
│ │ │ │ │ ├── exa_client.py
│ │ │ │ │ ├── google_pse_client.py
│ │ │ │ │ ├── searxng_client.py
│ │ │ │ │ └── serper_client.py
│ │ │ │ ├── models.py
│ │ │ │ ├── providers.py
│ │ │ │ ├── utils.py
│ │ │ │ └── web_search_tool.py
│ │ │ ├── tool_runner.py
│ │ │ └── utils.py
│ │ ├── tracing/
│ │ │ ├── braintrust_tracing_processor.py
│ │ │ ├── framework/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _error_tracing.py
│ │ │ │ ├── create.py
│ │ │ │ ├── processor_interface.py
│ │ │ │ ├── provider.py
│ │ │ │ ├── scope.py
│ │ │ │ ├── setup.py
│ │ │ │ ├── span_data.py
│ │ │ │ ├── spans.py
│ │ │ │ ├── traces.py
│ │ │ │ └── util.py
│ │ │ ├── langfuse_tracing_processor.py
│ │ │ ├── llm_utils.py
│ │ │ ├── masking.py
│ │ │ └── setup.py
│ │ ├── utils/
│ │ │ ├── __init__.py
│ │ │ ├── b64.py
│ │ │ ├── batching.py
│ │ │ ├── callbacks.py
│ │ │ ├── encryption.py
│ │ │ ├── error_handling.py
│ │ │ ├── errors.py
│ │ │ ├── file.py
│ │ │ ├── gpu_utils.py
│ │ │ ├── headers.py
│ │ │ ├── jsonriver/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── parse.py
│ │ │ │ └── tokenize.py
│ │ │ ├── logger.py
│ │ │ ├── long_term_log.py
│ │ │ ├── memory_logger.py
│ │ │ ├── middleware.py
│ │ │ ├── object_size_check.py
│ │ │ ├── postgres_sanitization.py
│ │ │ ├── pydantic_util.py
│ │ │ ├── retry_wrapper.py
│ │ │ ├── search_nlp_models_utils.py
│ │ │ ├── sensitive.py
│ │ │ ├── sitemap.py
│ │ │ ├── special_types.py
│ │ │ ├── subclasses.py
│ │ │ ├── supervisord_watchdog.py
│ │ │ ├── telemetry.py
│ │ │ ├── tenant.py
│ │ │ ├── text_processing.py
│ │ │ ├── threadpool_concurrency.py
│ │ │ ├── timing.py
│ │ │ ├── url.py
│ │ │ ├── variable_functionality.py
│ │ │ └── web_content.py
│ │ └── voice/
│ │ ├── __init__.py
│ │ ├── factory.py
│ │ ├── interface.py
│ │ └── providers/
│ │ ├── __init__.py
│ │ ├── azure.py
│ │ ├── elevenlabs.py
│ │ └── openai.py
│ ├── pyproject.toml
│ ├── pytest.ini
│ ├── requirements/
│ │ ├── README.md
│ │ ├── combined.txt
│ │ ├── default.txt
│ │ ├── dev.txt
│ │ ├── ee.txt
│ │ └── model_server.txt
│ ├── scripts/
│ │ ├── __init__.py
│ │ ├── add_connector_creation_script.py
│ │ ├── api_inference_sample.py
│ │ ├── celery_purge_queue.py
│ │ ├── chat_feedback_dump.py
│ │ ├── chat_history_seeding.py
│ │ ├── chat_loadtest.py
│ │ ├── debugging/
│ │ │ ├── debug_usage_limits.py
│ │ │ ├── litellm/
│ │ │ │ ├── README
│ │ │ │ ├── call_litellm.py
│ │ │ │ ├── directly_hit_azure_api.py
│ │ │ │ └── payload.json
│ │ │ ├── onyx_db.py
│ │ │ ├── onyx_list_tenants.py
│ │ │ ├── onyx_redis.py
│ │ │ ├── onyx_vespa_schemas.py
│ │ │ └── opensearch/
│ │ │ ├── benchmark_retrieval.py
│ │ │ ├── constants.py
│ │ │ ├── embed_and_save.py
│ │ │ ├── embedding_io.py
│ │ │ ├── opensearch_debug.py
│ │ │ └── query_hierarchy_debug.py
│ │ ├── decrypt.py
│ │ ├── dev_run_background_jobs.py
│ │ ├── docker_memory_tracking.sh
│ │ ├── force_delete_connector_by_id.py
│ │ ├── get_wikidocs.py
│ │ ├── hard_delete_chats.py
│ │ ├── lib/
│ │ │ └── logger.py
│ │ ├── make_foss_repo.sh
│ │ ├── onyx_openapi_schema.py
│ │ ├── orphan_doc_cleanup_script.py
│ │ ├── query_time_check/
│ │ │ ├── seed_dummy_docs.py
│ │ │ └── test_query_times.py
│ │ ├── reencrypt_secrets.py
│ │ ├── reset_indexes.py
│ │ ├── reset_postgres.py
│ │ ├── restart_containers.sh
│ │ ├── resume_paused_connectors.py
│ │ ├── run_industryrag_bench_questions.py
│ │ ├── save_load_state.py
│ │ ├── setup_craft_templates.sh
│ │ ├── sources_selection_analysis.py
│ │ ├── supervisord_entrypoint.sh
│ │ ├── tenant_cleanup/
│ │ │ ├── QUICK_START_NO_BASTION.md
│ │ │ ├── README.md
│ │ │ ├── analyze_current_tenants.py
│ │ │ ├── check_no_bastion_setup.py
│ │ │ ├── cleanup_tenants.py
│ │ │ ├── cleanup_utils.py
│ │ │ ├── mark_connectors_for_deletion.py
│ │ │ ├── no_bastion_analyze_tenants.py
│ │ │ ├── no_bastion_cleanup_tenants.py
│ │ │ ├── no_bastion_cleanup_utils.py
│ │ │ ├── no_bastion_mark_connectors.py
│ │ │ └── on_pod_scripts/
│ │ │ ├── check_documents_deleted.py
│ │ │ ├── cleanup_tenant_schema.py
│ │ │ ├── execute_connector_deletion.py
│ │ │ ├── get_tenant_connectors.py
│ │ │ ├── get_tenant_index_name.py
│ │ │ ├── get_tenant_users.py
│ │ │ └── understand_tenants.py
│ │ ├── test-openapi-key.py
│ │ ├── transform_openapi_for_docs.py
│ │ └── upload_files_as_connectors.py
│ ├── shared_configs/
│ │ ├── __init__.py
│ │ ├── configs.py
│ │ ├── contextvars.py
│ │ ├── enums.py
│ │ ├── model_server_models.py
│ │ └── utils.py
│ ├── slackbot_images/
│ │ └── README.md
│ ├── supervisord.conf
│ └── tests/
│ ├── README.md
│ ├── __init__.py
│ ├── api/
│ │ └── test_api.py
│ ├── conftest.py
│ ├── daily/
│ │ ├── conftest.py
│ │ ├── connectors/
│ │ │ ├── airtable/
│ │ │ │ └── test_airtable_basic.py
│ │ │ ├── bitbucket/
│ │ │ │ ├── conftest.py
│ │ │ │ ├── test_bitbucket_checkpointed.py
│ │ │ │ └── test_bitbucket_slim_connector.py
│ │ │ ├── blob/
│ │ │ │ └── test_blob_connector.py
│ │ │ ├── coda/
│ │ │ │ ├── README.md
│ │ │ │ └── test_coda_connector.py
│ │ │ ├── confluence/
│ │ │ │ ├── models.py
│ │ │ │ ├── test_confluence_basic.py
│ │ │ │ ├── test_confluence_permissions_basic.py
│ │ │ │ └── test_confluence_user_email_overrides.py
│ │ │ ├── conftest.py
│ │ │ ├── discord/
│ │ │ │ └── test_discord_connector.py
│ │ │ ├── file/
│ │ │ │ └── test_file_connector.py
│ │ │ ├── fireflies/
│ │ │ │ ├── test_fireflies_connector.py
│ │ │ │ └── test_fireflies_data.json
│ │ │ ├── gitbook/
│ │ │ │ └── test_gitbook_connector.py
│ │ │ ├── github/
│ │ │ │ └── test_github_basic.py
│ │ │ ├── gitlab/
│ │ │ │ └── test_gitlab_basic.py
│ │ │ ├── gmail/
│ │ │ │ ├── conftest.py
│ │ │ │ └── test_gmail_connector.py
│ │ │ ├── gong/
│ │ │ │ └── test_gong.py
│ │ │ ├── google_drive/
│ │ │ │ ├── conftest.py
│ │ │ │ ├── consts_and_utils.py
│ │ │ │ ├── drive_id_mapping.json
│ │ │ │ ├── test_admin_oauth.py
│ │ │ │ ├── test_drive_perm_sync.py
│ │ │ │ ├── test_link_visibility_filter.py
│ │ │ │ ├── test_map_test_ids.py
│ │ │ │ ├── test_sections.py
│ │ │ │ ├── test_service_acct.py
│ │ │ │ └── test_user_1_oauth.py
│ │ │ ├── highspot/
│ │ │ │ ├── test_highspot_connector.py
│ │ │ │ └── test_highspot_data.json
│ │ │ ├── hubspot/
│ │ │ │ └── test_hubspot_connector.py
│ │ │ ├── imap/
│ │ │ │ ├── models.py
│ │ │ │ └── test_imap_connector.py
│ │ │ ├── jira/
│ │ │ │ └── test_jira_basic.py
│ │ │ ├── notion/
│ │ │ │ └── test_notion_connector.py
│ │ │ ├── outline/
│ │ │ │ └── test_outline_connector.py
│ │ │ ├── salesforce/
│ │ │ │ ├── test_salesforce_connector.py
│ │ │ │ └── test_salesforce_data.json
│ │ │ ├── sharepoint/
│ │ │ │ └── test_sharepoint_connector.py
│ │ │ ├── slab/
│ │ │ │ ├── test_slab_connector.py
│ │ │ │ └── test_slab_data.json
│ │ │ ├── slack/
│ │ │ │ ├── conftest.py
│ │ │ │ ├── test_slack_connector.py
│ │ │ │ └── test_slack_perm_sync.py
│ │ │ ├── teams/
│ │ │ │ ├── models.py
│ │ │ │ └── test_teams_connector.py
│ │ │ ├── utils.py
│ │ │ ├── web/
│ │ │ │ └── test_web_connector.py
│ │ │ └── zendesk/
│ │ │ ├── test_zendesk_connector.py
│ │ │ └── test_zendesk_data.json
│ │ ├── embedding/
│ │ │ └── test_embeddings.py
│ │ └── llm/
│ │ └── test_bedrock.py
│ ├── external_dependency_unit/
│ │ ├── answer/
│ │ │ ├── conftest.py
│ │ │ ├── stream_test_assertions.py
│ │ │ ├── stream_test_builder.py
│ │ │ ├── stream_test_utils.py
│ │ │ ├── test_answer_without_openai.py
│ │ │ ├── test_current_datetime_replacement.py
│ │ │ ├── test_stream_chat_message.py
│ │ │ └── test_stream_chat_message_objects.py
│ │ ├── background/
│ │ │ ├── test_periodic_task_claim.py
│ │ │ └── test_startup_recovery.py
│ │ ├── cache/
│ │ │ ├── conftest.py
│ │ │ ├── test_cache_backend_parity.py
│ │ │ ├── test_kv_store_cache_layer.py
│ │ │ └── test_postgres_cache_backend.py
│ │ ├── celery/
│ │ │ ├── test_docfetching_priority.py
│ │ │ ├── test_docprocessing_priority.py
│ │ │ ├── test_persona_file_sync.py
│ │ │ ├── test_pruning_hierarchy_nodes.py
│ │ │ ├── test_user_file_delete_queue.py
│ │ │ ├── test_user_file_indexing_adapter.py
│ │ │ └── test_user_file_processing_queue.py
│ │ ├── chat/
│ │ │ └── test_user_reminder_message_type.py
│ │ ├── conftest.py
│ │ ├── connectors/
│ │ │ ├── confluence/
│ │ │ │ ├── conftest.py
│ │ │ │ └── test_confluence_group_sync.py
│ │ │ ├── google_drive/
│ │ │ │ └── test_google_drive_group_sync.py
│ │ │ └── jira/
│ │ │ ├── conftest.py
│ │ │ ├── test_jira_doc_sync.py
│ │ │ └── test_jira_group_sync.py
│ │ ├── constants.py
│ │ ├── craft/
│ │ │ ├── conftest.py
│ │ │ ├── test_build_packet_storage.py
│ │ │ ├── test_file_upload.py
│ │ │ ├── test_kubernetes_sandbox.py
│ │ │ └── test_persistent_document_writer.py
│ │ ├── db/
│ │ │ ├── __init__.py
│ │ │ ├── conftest.py
│ │ │ ├── test_chat_session_eager_load.py
│ │ │ ├── test_credential_sensitive_value.py
│ │ │ ├── test_rotate_encryption_key.py
│ │ │ ├── test_tag_race_condition.py
│ │ │ └── test_user_account_type.py
│ │ ├── discord_bot/
│ │ │ ├── conftest.py
│ │ │ └── test_discord_events.py
│ │ ├── document_index/
│ │ │ ├── conftest.py
│ │ │ ├── test_document_index.py
│ │ │ └── test_document_index_old.py
│ │ ├── feature_flags/
│ │ │ ├── __init__.py
│ │ │ └── test_feature_flag_provider_factory.py
│ │ ├── file_store/
│ │ │ ├── test_file_store_non_mocked.py
│ │ │ └── test_postgres_file_store_non_mocked.py
│ │ ├── full_setup.py
│ │ ├── hierarchy/
│ │ │ ├── __init__.py
│ │ │ └── test_hierarchy_access_filter.py
│ │ ├── llm/
│ │ │ ├── test_llm_provider.py
│ │ │ ├── test_llm_provider_api_base.py
│ │ │ ├── test_llm_provider_auto_mode.py
│ │ │ ├── test_llm_provider_called.py
│ │ │ ├── test_llm_provider_default_model_protection.py
│ │ │ └── test_prompt_caching.py
│ │ ├── mock_content_provider.py
│ │ ├── mock_image_provider.py
│ │ ├── mock_llm.py
│ │ ├── mock_search_pipeline.py
│ │ ├── mock_search_provider.py
│ │ ├── opensearch/
│ │ │ ├── test_assistant_knowledge_filter.py
│ │ │ └── test_opensearch_client.py
│ │ ├── opensearch_migration/
│ │ │ └── test_opensearch_migration_tasks.py
│ │ ├── permission_sync/
│ │ │ ├── test_doc_permission_sync_attempt.py
│ │ │ └── test_external_group_permission_sync_attempt.py
│ │ ├── search_settings/
│ │ │ └── test_search_settings.py
│ │ ├── slack_bot/
│ │ │ ├── __init__.py
│ │ │ ├── test_slack_bot_crud.py
│ │ │ └── test_slack_bot_federated_search.py
│ │ ├── tools/
│ │ │ ├── data/
│ │ │ │ └── financial-sample.xlsx
│ │ │ ├── test_image_generation_tool.py
│ │ │ ├── test_mcp_passthrough_oauth.py
│ │ │ ├── test_memory_tool_integration.py
│ │ │ ├── test_oauth_config_crud.py
│ │ │ ├── test_oauth_token_manager.py
│ │ │ ├── test_oauth_tool_integration.py
│ │ │ ├── test_python_tool.py
│ │ │ └── test_python_tool_server_enabled.py
│ │ └── tracing/
│ │ ├── __init__.py
│ │ └── test_llm_span_recording.py
│ ├── integration/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── common_utils/
│ │ │ ├── chat.py
│ │ │ ├── config.py
│ │ │ ├── constants.py
│ │ │ ├── document_acl.py
│ │ │ ├── managers/
│ │ │ │ ├── api_key.py
│ │ │ │ ├── cc_pair.py
│ │ │ │ ├── chat.py
│ │ │ │ ├── connector.py
│ │ │ │ ├── credential.py
│ │ │ │ ├── discord_bot.py
│ │ │ │ ├── document.py
│ │ │ │ ├── document_search.py
│ │ │ │ ├── document_set.py
│ │ │ │ ├── file.py
│ │ │ │ ├── image_generation.py
│ │ │ │ ├── index_attempt.py
│ │ │ │ ├── llm_provider.py
│ │ │ │ ├── pat.py
│ │ │ │ ├── persona.py
│ │ │ │ ├── project.py
│ │ │ │ ├── query_history.py
│ │ │ │ ├── scim_client.py
│ │ │ │ ├── scim_token.py
│ │ │ │ ├── settings.py
│ │ │ │ ├── tenant.py
│ │ │ │ ├── tool.py
│ │ │ │ ├── user.py
│ │ │ │ └── user_group.py
│ │ │ ├── reset.py
│ │ │ ├── test_document_utils.py
│ │ │ ├── test_file_utils.py
│ │ │ ├── test_files/
│ │ │ │ └── three_images.docx
│ │ │ ├── test_models.py
│ │ │ ├── timeout.py
│ │ │ └── vespa.py
│ │ ├── conftest.py
│ │ ├── connector_job_tests/
│ │ │ ├── github/
│ │ │ │ ├── conftest.py
│ │ │ │ ├── test_github_permission_sync.py
│ │ │ │ └── utils.py
│ │ │ ├── google/
│ │ │ │ ├── google_drive_api_utils.py
│ │ │ │ └── test_google_drive_permission_sync.py
│ │ │ ├── jira/
│ │ │ │ ├── conftest.py
│ │ │ │ └── test_jira_permission_sync_full.py
│ │ │ ├── sharepoint/
│ │ │ │ ├── conftest.py
│ │ │ │ └── test_sharepoint_permissions.py
│ │ │ └── slack/
│ │ │ ├── conftest.py
│ │ │ ├── slack_api_utils.py
│ │ │ ├── test_permission_sync.py
│ │ │ └── test_prune.py
│ │ ├── mock_services/
│ │ │ ├── docker-compose.mock-it-services.yml
│ │ │ ├── mcp_test_server/
│ │ │ │ ├── run_mcp_server_api_key.py
│ │ │ │ ├── run_mcp_server_google_oauth.py
│ │ │ │ ├── run_mcp_server_no_auth.py
│ │ │ │ ├── run_mcp_server_oauth.py
│ │ │ │ └── run_mcp_server_per_user_key.py
│ │ │ └── mock_connector_server/
│ │ │ ├── Dockerfile
│ │ │ └── main.py
│ │ ├── multitenant_tests/
│ │ │ ├── discord_bot/
│ │ │ │ └── test_discord_bot_multitenant.py
│ │ │ ├── invitation/
│ │ │ │ └── test_user_invitation.py
│ │ │ ├── migrations/
│ │ │ │ └── test_run_multitenant_migrations.py
│ │ │ ├── syncing/
│ │ │ │ └── test_search_permissions.py
│ │ │ ├── tenants/
│ │ │ │ ├── test_tenant_creation.py
│ │ │ │ └── test_tenant_provisioning_rollback.py
│ │ │ └── test_get_schemas_needing_migration.py
│ │ └── tests/
│ │ ├── anonymous_user/
│ │ │ └── test_anonymous_user.py
│ │ ├── api_key/
│ │ │ └── test_api_key.py
│ │ ├── auth/
│ │ │ └── test_saml_user_conversion.py
│ │ ├── chat/
│ │ │ ├── test_chat_deletion.py
│ │ │ └── test_chat_session_access.py
│ │ ├── chat_retention/
│ │ │ └── test_chat_retention.py
│ │ ├── code_interpreter/
│ │ │ ├── conftest.py
│ │ │ └── test_code_interpreter_api.py
│ │ ├── connector/
│ │ │ ├── test_connector_creation.py
│ │ │ ├── test_connector_deletion.py
│ │ │ └── test_last_indexed_time.py
│ │ ├── discord_bot/
│ │ │ ├── test_discord_bot_api.py
│ │ │ └── test_discord_bot_db.py
│ │ ├── document_set/
│ │ │ └── test_syncing.py
│ │ ├── image_generation/
│ │ │ ├── test_image_generation_config.py
│ │ │ └── test_image_generation_tool_visibility.py
│ │ ├── image_indexing/
│ │ │ └── test_indexing_images.py
│ │ ├── index_attempt/
│ │ │ └── test_index_attempt_pagination.py
│ │ ├── indexing/
│ │ │ ├── conftest.py
│ │ │ ├── file_connector/
│ │ │ │ ├── test_file_connector_zip_metadata.py
│ │ │ │ └── test_files/
│ │ │ │ ├── .onyx_metadata.json
│ │ │ │ ├── sample1.txt
│ │ │ │ └── sample2.txt
│ │ │ ├── test_checkpointing.py
│ │ │ ├── test_initial_permission_sync.py
│ │ │ ├── test_polling.py
│ │ │ └── test_repeated_error_state.py
│ │ ├── ingestion/
│ │ │ └── test_ingestion_api.py
│ │ ├── kg/
│ │ │ └── test_kg_api.py
│ │ ├── llm_auto_update/
│ │ │ └── test_auto_llm_update.py
│ │ ├── llm_provider/
│ │ │ ├── test_llm_provider.py
│ │ │ ├── test_llm_provider_access_control.py
│ │ │ └── test_llm_provider_persona_access.py
│ │ ├── llm_workflows/
│ │ │ ├── test_mock_llm_tool_calls.py
│ │ │ ├── test_nightly_provider_chat_workflow.py
│ │ │ └── test_tool_policy_enforcement.py
│ │ ├── mcp/
│ │ │ ├── test_mcp_client_no_auth_flow.py
│ │ │ ├── test_mcp_server_auth.py
│ │ │ └── test_mcp_server_search.py
│ │ ├── migrations/
│ │ │ ├── conftest.py
│ │ │ ├── test_alembic_main.py
│ │ │ ├── test_alembic_tenants.py
│ │ │ ├── test_assistant_consolidation_migration.py
│ │ │ ├── test_migrations.py
│ │ │ └── test_tool_seeding.py
│ │ ├── no_vectordb/
│ │ │ ├── conftest.py
│ │ │ ├── test_no_vectordb_chat.py
│ │ │ ├── test_no_vectordb_endpoints.py
│ │ │ └── test_no_vectordb_file_lifecycle.py
│ │ ├── opensearch_migration/
│ │ │ └── test_opensearch_migration_api.py
│ │ ├── pat/
│ │ │ └── test_pat_api.py
│ │ ├── permissions/
│ │ │ ├── test_auth_permission_propagation.py
│ │ │ ├── test_cc_pair_permissions.py
│ │ │ ├── test_connector_permissions.py
│ │ │ ├── test_credential_permissions.py
│ │ │ ├── test_doc_set_permissions.py
│ │ │ ├── test_file_connector_permissions.py
│ │ │ ├── test_persona_permissions.py
│ │ │ ├── test_user_file_permissions.py
│ │ │ ├── test_user_role_permissions.py
│ │ │ └── test_whole_curator_flow.py
│ │ ├── personalization/
│ │ │ └── test_personalization_flow.py
│ │ ├── personas/
│ │ │ ├── test_persona_categories.py
│ │ │ ├── test_persona_creation.py
│ │ │ ├── test_persona_file_context.py
│ │ │ ├── test_persona_label_updates.py
│ │ │ ├── test_persona_pagination.py
│ │ │ └── test_unified_assistant.py
│ │ ├── projects/
│ │ │ └── test_projects.py
│ │ ├── pruning/
│ │ │ ├── test_pruning.py
│ │ │ └── website/
│ │ │ ├── about.html
│ │ │ ├── contact.html
│ │ │ ├── courses.html
│ │ │ ├── css/
│ │ │ │ ├── animate.css
│ │ │ │ ├── custom-fonts.css
│ │ │ │ ├── fancybox/
│ │ │ │ │ └── jquery.fancybox.css
│ │ │ │ ├── font-awesome.css
│ │ │ │ └── style.css
│ │ │ ├── fonts/
│ │ │ │ └── fontawesome.otf
│ │ │ ├── index.html
│ │ │ ├── js/
│ │ │ │ ├── animate.js
│ │ │ │ ├── custom.js
│ │ │ │ ├── flexslider/
│ │ │ │ │ ├── jquery.flexslider.js
│ │ │ │ │ └── setting.js
│ │ │ │ ├── google-code-prettify/
│ │ │ │ │ ├── prettify.css
│ │ │ │ │ └── prettify.js
│ │ │ │ ├── jquery.easing.1.3.js
│ │ │ │ ├── jquery.fancybox-media.js
│ │ │ │ ├── jquery.fancybox.pack.js
│ │ │ │ ├── jquery.flexslider.js
│ │ │ │ ├── jquery.js
│ │ │ │ ├── portfolio/
│ │ │ │ │ ├── jquery.quicksand.js
│ │ │ │ │ └── setting.js
│ │ │ │ ├── quicksand/
│ │ │ │ │ ├── jquery.quicksand.js
│ │ │ │ │ └── setting.js
│ │ │ │ └── validate.js
│ │ │ ├── portfolio.html
│ │ │ ├── pricing.html
│ │ │ └── readme.txt
│ │ ├── query_history/
│ │ │ ├── test_query_history.py
│ │ │ ├── test_query_history_pagination.py
│ │ │ ├── test_usage_reports.py
│ │ │ └── utils.py
│ │ ├── reporting/
│ │ │ └── test_usage_export_api.py
│ │ ├── scim/
│ │ │ ├── test_scim_groups.py
│ │ │ ├── test_scim_tokens.py
│ │ │ └── test_scim_users.py
│ │ ├── search_settings/
│ │ │ └── test_search_settings.py
│ │ ├── streaming_endpoints/
│ │ │ ├── test_chat_file_attachment.py
│ │ │ └── test_chat_stream.py
│ │ ├── tags/
│ │ │ └── test_tags.py
│ │ ├── tools/
│ │ │ ├── test_force_tool_use.py
│ │ │ └── test_image_generation_streaming.py
│ │ ├── usergroup/
│ │ │ ├── test_add_users_to_group.py
│ │ │ ├── test_group_membership_updates_user_permissions.py
│ │ │ ├── test_new_group_gets_basic_permission.py
│ │ │ ├── test_user_group_deletion.py
│ │ │ └── test_usergroup_syncing.py
│ │ ├── users/
│ │ │ ├── test_default_group_assignment.py
│ │ │ ├── test_password_signup_upgrade.py
│ │ │ ├── test_reactivation_groups.py
│ │ │ ├── test_seat_limit.py
│ │ │ ├── test_slack_user_deactivation.py
│ │ │ └── test_user_pagination.py
│ │ └── web_search/
│ │ └── test_web_search_api.py
│ ├── load_env_vars.py
│ ├── regression/
│ │ ├── answer_quality/
│ │ │ ├── README.md
│ │ │ ├── __init__.py
│ │ │ ├── api_utils.py
│ │ │ ├── cli_utils.py
│ │ │ ├── file_uploader.py
│ │ │ ├── launch_eval_env.py
│ │ │ └── search_test_config.yaml.template
│ │ └── search_quality/
│ │ ├── README.md
│ │ ├── models.py
│ │ ├── run_search_eval.py
│ │ ├── test_queries.json.template
│ │ └── utils.py
│ └── unit/
│ ├── __init__.py
│ ├── build/
│ │ └── test_rewrite_asset_paths.py
│ ├── ee/
│ │ ├── conftest.py
│ │ └── onyx/
│ │ ├── db/
│ │ │ ├── test_license.py
│ │ │ └── test_user_group_rename.py
│ │ ├── external_permissions/
│ │ │ ├── salesforce/
│ │ │ │ └── test_postprocessing.py
│ │ │ └── sharepoint/
│ │ │ └── test_permission_utils.py
│ │ ├── hooks/
│ │ │ ├── __init__.py
│ │ │ └── test_executor.py
│ │ ├── server/
│ │ │ ├── __init__.py
│ │ │ ├── billing/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── conftest.py
│ │ │ │ ├── test_billing_api.py
│ │ │ │ ├── test_billing_service.py
│ │ │ │ └── test_proxy.py
│ │ │ ├── features/
│ │ │ │ ├── __init__.py
│ │ │ │ └── hooks/
│ │ │ │ ├── __init__.py
│ │ │ │ └── test_api.py
│ │ │ ├── license/
│ │ │ │ └── test_api.py
│ │ │ ├── middleware/
│ │ │ │ └── test_license_enforcement.py
│ │ │ ├── settings/
│ │ │ │ └── test_license_enforcement_settings.py
│ │ │ └── tenants/
│ │ │ ├── test_billing_api.py
│ │ │ ├── test_product_gating.py
│ │ │ ├── test_proxy.py
│ │ │ └── test_schema_management.py
│ │ └── utils/
│ │ ├── test_encryption.py
│ │ └── test_license_utils.py
│ ├── federated_connector/
│ │ └── slack/
│ │ └── test_slack_federated_connnector.py
│ ├── file_store/
│ │ ├── test_file_store.py
│ │ └── test_postgres_file_store.py
│ ├── model_server/
│ │ └── test_embedding.py
│ ├── onyx/
│ │ ├── __init__.py
│ │ ├── access/
│ │ │ └── test_user_file_access.py
│ │ ├── auth/
│ │ │ ├── conftest.py
│ │ │ ├── test_disposable_email_validator.py
│ │ │ ├── test_email.py
│ │ │ ├── test_is_same_origin.py
│ │ │ ├── test_jwt_provisioning.py
│ │ │ ├── test_oauth_refresher.py
│ │ │ ├── test_oidc_pkce.py
│ │ │ ├── test_permissions.py
│ │ │ ├── test_single_tenant_jwt_strategy.py
│ │ │ ├── test_user_create_schema.py
│ │ │ ├── test_user_default_pins.py
│ │ │ ├── test_user_registration.py
│ │ │ ├── test_verify_auth_setting.py
│ │ │ ├── test_verify_email_domain.py
│ │ │ └── test_verify_email_invite.py
│ │ ├── background/
│ │ │ └── celery/
│ │ │ ├── tasks/
│ │ │ │ ├── tenant_provisioning/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── test_check_available_tenants.py
│ │ │ │ ├── test_hierarchyfetching_queue.py
│ │ │ │ ├── test_user_file_impl_redis_locking.py
│ │ │ │ ├── test_user_file_processing_no_vectordb.py
│ │ │ │ └── test_user_file_project_sync_queue.py
│ │ │ └── test_celery_redis.py
│ │ ├── chat/
│ │ │ ├── test_argument_delta_streaming.py
│ │ │ ├── test_chat_utils.py
│ │ │ ├── test_citation_processor.py
│ │ │ ├── test_citation_utils.py
│ │ │ ├── test_compression.py
│ │ │ ├── test_context_files.py
│ │ │ ├── test_emitter.py
│ │ │ ├── test_llm_loop.py
│ │ │ ├── test_llm_step.py
│ │ │ ├── test_multi_model_streaming.py
│ │ │ ├── test_multi_model_types.py
│ │ │ ├── test_process_message.py
│ │ │ ├── test_process_message_mock_llm.py
│ │ │ ├── test_save_chat.py
│ │ │ └── test_stop_signal_checker.py
│ │ ├── connectors/
│ │ │ ├── airtable/
│ │ │ │ └── test_airtable_index_all.py
│ │ │ ├── asana/
│ │ │ │ └── test_asana_connector.py
│ │ │ ├── canvas/
│ │ │ │ └── test_canvas_connector.py
│ │ │ ├── confluence/
│ │ │ │ ├── test_confluence_checkpointing.py
│ │ │ │ ├── test_onyx_confluence.py
│ │ │ │ └── test_rate_limit_handler.py
│ │ │ ├── cross_connector_utils/
│ │ │ │ ├── test_html_utils.py
│ │ │ │ ├── test_rate_limit.py
│ │ │ │ └── test_table.html
│ │ │ ├── discord/
│ │ │ │ └── test_discord_validation.py
│ │ │ ├── github/
│ │ │ │ └── test_github_checkpointing.py
│ │ │ ├── gmail/
│ │ │ │ ├── test_connector.py
│ │ │ │ └── thread.json
│ │ │ ├── google_utils/
│ │ │ │ └── test_rate_limit_detection.py
│ │ │ ├── jira/
│ │ │ │ ├── conftest.py
│ │ │ │ ├── test_jira_bulk_fetch.py
│ │ │ │ ├── test_jira_checkpointing.py
│ │ │ │ ├── test_jira_error_handling.py
│ │ │ │ ├── test_jira_large_ticket_handling.py
│ │ │ │ └── test_jira_permission_sync.py
│ │ │ ├── mediawiki/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── test_mediawiki_family.py
│ │ │ │ └── test_wiki.py
│ │ │ ├── notion/
│ │ │ │ └── test_notion_datasource.py
│ │ │ ├── salesforce/
│ │ │ │ ├── test_salesforce_custom_config.py
│ │ │ │ ├── test_salesforce_sqlite.py
│ │ │ │ └── test_yield_doc_batches.py
│ │ │ ├── sharepoint/
│ │ │ │ ├── test_delta_checkpointing.py
│ │ │ │ ├── test_denylist.py
│ │ │ │ ├── test_drive_matching.py
│ │ │ │ ├── test_fetch_site_pages.py
│ │ │ │ ├── test_hierarchy_helpers.py
│ │ │ │ ├── test_rest_client_context_caching.py
│ │ │ │ └── test_url_parsing.py
│ │ │ ├── slab/
│ │ │ │ └── test_slab_validation.py
│ │ │ ├── slack/
│ │ │ │ └── test_message_filtering.py
│ │ │ ├── teams/
│ │ │ │ └── test_collect_teams.py
│ │ │ ├── test_connector_factory.py
│ │ │ ├── test_document_metadata_coercion.py
│ │ │ ├── test_microsoft_graph_env.py
│ │ │ ├── utils.py
│ │ │ └── zendesk/
│ │ │ ├── test_zendesk_checkpointing.py
│ │ │ └── test_zendesk_rate_limit.py
│ │ ├── context/
│ │ │ └── search/
│ │ │ └── federated/
│ │ │ ├── test_slack_query_construction.py
│ │ │ └── test_slack_thread_context.py
│ │ ├── db/
│ │ │ ├── __init__.py
│ │ │ ├── conftest.py
│ │ │ ├── test_assign_default_groups.py
│ │ │ ├── test_chat_sessions.py
│ │ │ ├── test_dal.py
│ │ │ ├── test_delete_user.py
│ │ │ ├── test_llm_sync.py
│ │ │ ├── test_persona_display_priority.py
│ │ │ ├── test_projects_upload_task_expiry.py
│ │ │ ├── test_scim_dal.py
│ │ │ ├── test_tools.py
│ │ │ ├── test_usage.py
│ │ │ └── test_voice.py
│ │ ├── document_index/
│ │ │ ├── opensearch/
│ │ │ │ ├── test_get_doc_chunk_id.py
│ │ │ │ └── test_opensearch_batch_flush.py
│ │ │ ├── test_disabled_document_index.py
│ │ │ └── vespa/
│ │ │ ├── shared_utils/
│ │ │ │ └── test_utils.py
│ │ │ └── test_vespa_batch_flush.py
│ │ ├── error_handling/
│ │ │ ├── __init__.py
│ │ │ └── test_exceptions.py
│ │ ├── federated_connectors/
│ │ │ ├── test_federated_connector_factory.py
│ │ │ └── test_oauth_utils.py
│ │ ├── file_processing/
│ │ │ ├── __init__.py
│ │ │ ├── test_image_summarization_errors.py
│ │ │ ├── test_image_summarization_litellm_errors.py
│ │ │ ├── test_pdf.py
│ │ │ └── test_xlsx_to_text.py
│ │ ├── hooks/
│ │ │ ├── __init__.py
│ │ │ ├── test_api_dependencies.py
│ │ │ ├── test_base_spec.py
│ │ │ ├── test_models.py
│ │ │ ├── test_query_processing_spec.py
│ │ │ └── test_registry.py
│ │ ├── image_gen/
│ │ │ └── test_provider_building.py
│ │ ├── indexing/
│ │ │ ├── conftest.py
│ │ │ ├── test_censoring.py
│ │ │ ├── test_chunker.py
│ │ │ ├── test_embed_chunks_in_batches.py
│ │ │ ├── test_embedder.py
│ │ │ ├── test_indexing_pipeline.py
│ │ │ ├── test_personas_in_chunks.py
│ │ │ └── test_vespa.py
│ │ ├── lazy_handling/
│ │ │ └── __init__.py
│ │ ├── llm/
│ │ │ ├── conftest.py
│ │ │ ├── test_bedrock_token_limit.py
│ │ │ ├── test_factory.py
│ │ │ ├── test_formatting_reenabled.py
│ │ │ ├── test_litellm_monkey_patches.py
│ │ │ ├── test_llm_provider_options.py
│ │ │ ├── test_model_is_reasoning.py
│ │ │ ├── test_model_map.py
│ │ │ ├── test_model_name_parser.py
│ │ │ ├── test_model_response.py
│ │ │ ├── test_multi_llm.py
│ │ │ ├── test_reasoning_effort_mapping.py
│ │ │ ├── test_request_context.py
│ │ │ ├── test_true_openai_model.py
│ │ │ └── test_vision_model_selection_logging.py
│ │ ├── natural_language_processing/
│ │ │ └── test_search_nlp_models.py
│ │ ├── onyxbot/
│ │ │ ├── discord/
│ │ │ │ ├── conftest.py
│ │ │ │ ├── test_api_client.py
│ │ │ │ ├── test_cache_manager.py
│ │ │ │ ├── test_context_builders.py
│ │ │ │ ├── test_discord_utils.py
│ │ │ │ ├── test_message_utils.py
│ │ │ │ └── test_should_respond.py
│ │ │ ├── test_handle_regular_answer.py
│ │ │ ├── test_slack_blocks.py
│ │ │ ├── test_slack_channel_config.py
│ │ │ ├── test_slack_formatting.py
│ │ │ └── test_slack_gating.py
│ │ ├── prompts/
│ │ │ └── test_prompt_utils.py
│ │ ├── redis_ca.pem
│ │ ├── server/
│ │ │ ├── __init__.py
│ │ │ ├── features/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── hierarchy/
│ │ │ │ │ └── test_user_access_info.py
│ │ │ │ └── hooks/
│ │ │ │ └── __init__.py
│ │ │ ├── manage/
│ │ │ │ ├── embedding/
│ │ │ │ │ └── test_embedding_api.py
│ │ │ │ ├── llm/
│ │ │ │ │ ├── test_fetch_models_api.py
│ │ │ │ │ └── test_llm_provider_utils.py
│ │ │ │ ├── test_bulk_invite_limit.py
│ │ │ │ └── voice/
│ │ │ │ └── test_voice_api_validation.py
│ │ │ ├── scim/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── conftest.py
│ │ │ │ ├── test_admin.py
│ │ │ │ ├── test_auth.py
│ │ │ │ ├── test_entra.py
│ │ │ │ ├── test_filtering.py
│ │ │ │ ├── test_group_endpoints.py
│ │ │ │ ├── test_patch.py
│ │ │ │ ├── test_providers.py
│ │ │ │ └── test_user_endpoints.py
│ │ │ ├── test_full_user_snapshot.py
│ │ │ ├── test_pool_metrics.py
│ │ │ ├── test_projects_file_utils.py
│ │ │ ├── test_prometheus_instrumentation.py
│ │ │ ├── test_settings_store.py
│ │ │ └── test_upload_files.py
│ │ ├── test_redis.py
│ │ ├── test_startup_validation.py
│ │ ├── tools/
│ │ │ ├── __init__.py
│ │ │ ├── custom/
│ │ │ │ └── test_custom_tools.py
│ │ │ ├── test_construct_tools_no_vectordb.py
│ │ │ ├── test_file_reader_tool.py
│ │ │ ├── test_no_vectordb.py
│ │ │ ├── test_python_tool_availability.py
│ │ │ ├── test_search_utils.py
│ │ │ ├── test_tool_runner.py
│ │ │ ├── test_tool_runner_chat_files.py
│ │ │ ├── test_tool_utils.py
│ │ │ └── tool_implementations/
│ │ │ ├── open_url/
│ │ │ │ ├── data/
│ │ │ │ │ └── test_snippet_finding_data.json
│ │ │ │ ├── test_onyx_web_crawler.py
│ │ │ │ ├── test_snippet_matcher.py
│ │ │ │ └── test_url_normalization.py
│ │ │ ├── python/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── test_code_interpreter_client.py
│ │ │ │ └── test_python_tool_upload_cache.py
│ │ │ └── websearch/
│ │ │ ├── data/
│ │ │ │ └── tartan.txt
│ │ │ ├── test_brave_client.py
│ │ │ ├── test_web_search_providers.py
│ │ │ ├── test_web_search_tool_run.py
│ │ │ └── test_websearch_utils.py
│ │ ├── tracing/
│ │ │ ├── __init__.py
│ │ │ └── test_tracing_setup.py
│ │ ├── utils/
│ │ │ ├── test_gpu_utils.py
│ │ │ ├── test_json_river.py
│ │ │ ├── test_postgres_sanitization.py
│ │ │ ├── test_sensitive.py
│ │ │ ├── test_sensitive_typing.py
│ │ │ ├── test_telemetry.py
│ │ │ ├── test_threadpool_concurrency.py
│ │ │ ├── test_threadpool_contextvars.py
│ │ │ ├── test_url_ssrf.py
│ │ │ ├── test_vespa_query.py
│ │ │ └── test_vespa_tasks.py
│ │ └── voice/
│ │ └── providers/
│ │ ├── test_azure_provider.py
│ │ ├── test_azure_ssml.py
│ │ ├── test_elevenlabs_provider.py
│ │ └── test_openai_provider.py
│ ├── scripts/
│ │ └── __init__.py
│ ├── server/
│ │ └── metrics/
│ │ ├── test_celery_task_metrics.py
│ │ ├── test_indexing_pipeline_collectors.py
│ │ ├── test_indexing_pipeline_setup.py
│ │ ├── test_indexing_task_metrics.py
│ │ ├── test_metrics_server.py
│ │ ├── test_opensearch_search_metrics.py
│ │ └── test_worker_health.py
│ └── tools/
│ ├── __init__.py
│ └── test_memory_tool_packets.py
├── contributor_ip_assignment/
│ └── EE_Contributor_IP_Assignment_Agreement.md
├── ct.yaml
├── cubic.yaml
├── deployment/
│ ├── .gitignore
│ ├── README.md
│ ├── aws_ecs_fargate/
│ │ └── cloudformation/
│ │ ├── README.md
│ │ ├── deploy.sh
│ │ ├── onyx_acm_template.yaml
│ │ ├── onyx_cluster_template.yaml
│ │ ├── onyx_config.jsonl
│ │ ├── onyx_efs_template.yaml
│ │ ├── services/
│ │ │ ├── onyx_backend_api_server_service_template.yaml
│ │ │ ├── onyx_backend_background_server_service_template.yaml
│ │ │ ├── onyx_model_server_indexing_service_template.yaml
│ │ │ ├── onyx_model_server_inference_service_template.yaml
│ │ │ ├── onyx_nginx_service_template.yaml
│ │ │ ├── onyx_postgres_service_template.yaml
│ │ │ ├── onyx_redis_service_template.yaml
│ │ │ ├── onyx_vespaengine_service_template.yaml
│ │ │ └── onyx_web_server_service_template.yaml
│ │ └── uninstall.sh
│ ├── data/
│ │ └── nginx/
│ │ ├── app.conf.template
│ │ ├── app.conf.template.no-letsencrypt
│ │ ├── app.conf.template.prod
│ │ ├── mcp.conf.inc.template
│ │ ├── mcp_upstream.conf.inc.template
│ │ └── run-nginx.sh
│ ├── docker_compose/
│ │ ├── README.md
│ │ ├── docker-compose.dev.yml
│ │ ├── docker-compose.mcp-api-key-test.yml
│ │ ├── docker-compose.mcp-oauth-test.yml
│ │ ├── docker-compose.multitenant-dev.yml
│ │ ├── docker-compose.onyx-lite.yml
│ │ ├── docker-compose.prod-cloud.yml
│ │ ├── docker-compose.prod-no-letsencrypt.yml
│ │ ├── docker-compose.prod.yml
│ │ ├── docker-compose.resources.yml
│ │ ├── docker-compose.search-testing.yml
│ │ ├── docker-compose.yml
│ │ ├── env.nginx.template
│ │ ├── env.prod.template
│ │ ├── env.template
│ │ ├── init-letsencrypt.sh
│ │ ├── install.ps1
│ │ └── install.sh
│ ├── helm/
│ │ ├── README.md
│ │ └── charts/
│ │ └── onyx/
│ │ ├── .gitignore
│ │ ├── .helmignore
│ │ ├── Chart.yaml
│ │ ├── ci/
│ │ │ └── ct-values.yaml
│ │ ├── dashboards/
│ │ │ └── indexing-pipeline.json
│ │ ├── templates/
│ │ │ ├── _helpers.tpl
│ │ │ ├── api-deployment.yaml
│ │ │ ├── api-hpa.yaml
│ │ │ ├── api-scaledobject.yaml
│ │ │ ├── api-service.yaml
│ │ │ ├── auth-secrets.yaml
│ │ │ ├── celery-beat.yaml
│ │ │ ├── celery-worker-docfetching-hpa.yaml
│ │ │ ├── celery-worker-docfetching-metrics-service.yaml
│ │ │ ├── celery-worker-docfetching-scaledobject.yaml
│ │ │ ├── celery-worker-docfetching.yaml
│ │ │ ├── celery-worker-docprocessing-hpa.yaml
│ │ │ ├── celery-worker-docprocessing-metrics-service.yaml
│ │ │ ├── celery-worker-docprocessing-scaledobject.yaml
│ │ │ ├── celery-worker-docprocessing.yaml
│ │ │ ├── celery-worker-heavy-hpa.yaml
│ │ │ ├── celery-worker-heavy-scaledobject.yaml
│ │ │ ├── celery-worker-heavy.yaml
│ │ │ ├── celery-worker-light-hpa.yaml
│ │ │ ├── celery-worker-light-scaledobject.yaml
│ │ │ ├── celery-worker-light.yaml
│ │ │ ├── celery-worker-monitoring-hpa.yaml
│ │ │ ├── celery-worker-monitoring-metrics-service.yaml
│ │ │ ├── celery-worker-monitoring-scaledobject.yaml
│ │ │ ├── celery-worker-monitoring.yaml
│ │ │ ├── celery-worker-primary-hpa.yaml
│ │ │ ├── celery-worker-primary-scaledobject.yaml
│ │ │ ├── celery-worker-primary.yaml
│ │ │ ├── celery-worker-servicemonitors.yaml
│ │ │ ├── celery-worker-user-file-processing-hpa.yaml
│ │ │ ├── celery-worker-user-file-processing-scaledobject.yaml
│ │ │ ├── celery-worker-user-file-processing.yaml
│ │ │ ├── configmap.yaml
│ │ │ ├── discordbot.yaml
│ │ │ ├── grafana-dashboards.yaml
│ │ │ ├── indexing-model-deployment.yaml
│ │ │ ├── indexing-model-service.yaml
│ │ │ ├── inference-model-deployment.yaml
│ │ │ ├── inference-model-service.yaml
│ │ │ ├── ingress-api.yaml
│ │ │ ├── ingress-mcp.yaml
│ │ │ ├── ingress-webserver.yaml
│ │ │ ├── lets-encrypt.yaml
│ │ │ ├── mcp-server-deployment.yaml
│ │ │ ├── mcp-server-service.yaml
│ │ │ ├── nginx-conf.yaml
│ │ │ ├── serviceaccount.yaml
│ │ │ ├── slackbot.yaml
│ │ │ ├── tests/
│ │ │ │ └── test-connection.yaml
│ │ │ ├── tooling-pginto-configmap.yaml
│ │ │ ├── webserver-deployment.yaml
│ │ │ ├── webserver-hpa.yaml
│ │ │ ├── webserver-scaledobject.yaml
│ │ │ └── webserver-service.yaml
│ │ ├── templates_disabled/
│ │ │ ├── background-deployment.yaml
│ │ │ ├── background-hpa.yaml
│ │ │ └── onyx-secret.yaml
│ │ ├── values-lite.yaml
│ │ └── values.yaml
│ └── terraform/
│ └── modules/
│ └── aws/
│ ├── README.md
│ ├── eks/
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ └── variables.tf
│ ├── onyx/
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ ├── variables.tf
│ │ └── versions.tf
│ ├── opensearch/
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ └── variables.tf
│ ├── postgres/
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ └── variables.tf
│ ├── redis/
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ └── variables.tf
│ ├── s3/
│ │ ├── main.tf
│ │ └── variables.tf
│ ├── vpc/
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ └── variables.tf
│ └── waf/
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── desktop/
│ ├── .gitignore
│ ├── README.md
│ ├── package.json
│ ├── scripts/
│ │ └── generate-icons.sh
│ ├── src/
│ │ ├── index.html
│ │ └── titlebar.js
│ └── src-tauri/
│ ├── Cargo.toml
│ ├── build.rs
│ ├── gen/
│ │ └── schemas/
│ │ ├── acl-manifests.json
│ │ ├── capabilities.json
│ │ ├── desktop-schema.json
│ │ └── macOS-schema.json
│ ├── icons/
│ │ ├── android/
│ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ └── ic_launcher.xml
│ │ │ └── values/
│ │ │ └── ic_launcher_background.xml
│ │ └── icon.icns
│ ├── src/
│ │ └── main.rs
│ └── tauri.conf.json
├── docker-bake.hcl
├── docs/
│ └── METRICS.md
├── examples/
│ ├── assistants-api/
│ │ └── topics_analyzer.py
│ └── widget/
│ ├── .eslintrc.json
│ ├── .gitignore
│ ├── README.md
│ ├── next.config.mjs
│ ├── package.json
│ ├── postcss.config.mjs
│ ├── src/
│ │ └── app/
│ │ ├── globals.css
│ │ ├── layout.tsx
│ │ ├── page.tsx
│ │ └── widget/
│ │ └── Widget.tsx
│ ├── tailwind.config.ts
│ └── tsconfig.json
├── extensions/
│ └── chrome/
│ ├── LICENSE
│ ├── README.md
│ ├── manifest.json
│ ├── service_worker.js
│ └── src/
│ ├── pages/
│ │ ├── onyx_home.html
│ │ ├── onyx_home.js
│ │ ├── options.html
│ │ ├── options.js
│ │ ├── panel.html
│ │ ├── panel.js
│ │ ├── popup.html
│ │ ├── popup.js
│ │ ├── welcome.html
│ │ └── welcome.js
│ ├── styles/
│ │ ├── selection-icon.css
│ │ └── shared.css
│ └── utils/
│ ├── constants.js
│ ├── content.js
│ ├── error-modal.js
│ ├── selection-icon.js
│ └── storage.js
├── profiling/
│ └── grafana/
│ └── dashboards/
│ └── onyx/
│ └── opensearch-search-latency.json
├── pyproject.toml
├── web/
│ ├── .dockerignore
│ ├── .eslintrc.json
│ ├── .gitignore
│ ├── .prettierignore
│ ├── .prettierrc.json
│ ├── .storybook/
│ │ ├── Introduction.mdx
│ │ ├── README.md
│ │ ├── main.ts
│ │ ├── mocks/
│ │ │ ├── next-image.tsx
│ │ │ ├── next-link.tsx
│ │ │ └── next-navigation.tsx
│ │ ├── preview-head.html
│ │ └── preview.ts
│ ├── @types/
│ │ ├── favicon-fetch.d.ts
│ │ └── images.d.ts
│ ├── AGENTS.md
│ ├── Dockerfile
│ ├── README.md
│ ├── components.json
│ ├── jest.config.js
│ ├── lib/
│ │ └── opal/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── scripts/
│ │ │ ├── README.md
│ │ │ ├── convert-svg.sh
│ │ │ └── icon-template.js
│ │ ├── src/
│ │ │ ├── components/
│ │ │ │ ├── README.md
│ │ │ │ ├── buttons/
│ │ │ │ │ ├── Button/
│ │ │ │ │ │ └── Button.stories.tsx
│ │ │ │ │ ├── button/
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── components.tsx
│ │ │ │ │ ├── chevron.css
│ │ │ │ │ ├── chevron.tsx
│ │ │ │ │ ├── filter-button/
│ │ │ │ │ │ ├── FilterButton.stories.tsx
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── components.tsx
│ │ │ │ │ ├── icon-wrapper.tsx
│ │ │ │ │ ├── line-item-button/
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── components.tsx
│ │ │ │ │ ├── open-button/
│ │ │ │ │ │ ├── OpenButton.stories.tsx
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── components.tsx
│ │ │ │ │ ├── select-button/
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ ├── components.tsx
│ │ │ │ │ │ └── styles.css
│ │ │ │ │ └── sidebar-tab/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── SidebarTab.stories.tsx
│ │ │ │ │ └── components.tsx
│ │ │ │ ├── cards/
│ │ │ │ │ ├── card/
│ │ │ │ │ │ ├── Card.stories.tsx
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ ├── components.tsx
│ │ │ │ │ │ └── styles.css
│ │ │ │ │ ├── empty-message-card/
│ │ │ │ │ │ ├── EmptyMessageCard.stories.tsx
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── components.tsx
│ │ │ │ │ └── select-card/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── SelectCard.stories.tsx
│ │ │ │ │ ├── components.tsx
│ │ │ │ │ └── styles.css
│ │ │ │ ├── index.ts
│ │ │ │ ├── pagination/
│ │ │ │ │ ├── Pagination.stories.tsx
│ │ │ │ │ ├── README.md
│ │ │ │ │ └── components.tsx
│ │ │ │ ├── table/
│ │ │ │ │ ├── ActionsContainer.tsx
│ │ │ │ │ ├── ColumnSortabilityPopover.tsx
│ │ │ │ │ ├── ColumnVisibilityPopover.tsx
│ │ │ │ │ ├── DragOverlayRow.tsx
│ │ │ │ │ ├── Footer.tsx
│ │ │ │ │ ├── QualifierContainer.tsx
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── Table.stories.tsx
│ │ │ │ │ ├── TableBody.tsx
│ │ │ │ │ ├── TableCell.tsx
│ │ │ │ │ ├── TableElement.tsx
│ │ │ │ │ ├── TableHead.tsx
│ │ │ │ │ ├── TableHeader.tsx
│ │ │ │ │ ├── TableQualifier.tsx
│ │ │ │ │ ├── TableRow.tsx
│ │ │ │ │ ├── TableSizeContext.tsx
│ │ │ │ │ ├── columns.ts
│ │ │ │ │ ├── components.tsx
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ ├── useColumnWidths.ts
│ │ │ │ │ │ ├── useDataTable.ts
│ │ │ │ │ │ └── useDraggableRows.ts
│ │ │ │ │ ├── styles.css
│ │ │ │ │ └── types.ts
│ │ │ │ ├── tag/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── Tag.stories.tsx
│ │ │ │ │ ├── components.tsx
│ │ │ │ │ └── styles.css
│ │ │ │ ├── text/
│ │ │ │ │ ├── InlineMarkdown.tsx
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── Text.stories.tsx
│ │ │ │ │ └── components.tsx
│ │ │ │ └── tooltip.css
│ │ │ ├── core/
│ │ │ │ ├── README.md
│ │ │ │ ├── animations/
│ │ │ │ │ ├── Hoverable.stories.tsx
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── components.tsx
│ │ │ │ │ └── styles.css
│ │ │ │ ├── disabled/
│ │ │ │ │ ├── components.tsx
│ │ │ │ │ └── styles.css
│ │ │ │ ├── index.ts
│ │ │ │ └── interactive/
│ │ │ │ ├── Interactive.stories.tsx
│ │ │ │ ├── README.md
│ │ │ │ ├── container/
│ │ │ │ │ ├── README.md
│ │ │ │ │ └── components.tsx
│ │ │ │ ├── foldable/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── components.tsx
│ │ │ │ │ └── styles.css
│ │ │ │ ├── shared.css
│ │ │ │ ├── simple/
│ │ │ │ │ └── components.tsx
│ │ │ │ ├── stateful/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── components.tsx
│ │ │ │ │ └── styles.css
│ │ │ │ ├── stateless/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── components.tsx
│ │ │ │ │ └── styles.css
│ │ │ │ └── utils.ts
│ │ │ ├── icons/
│ │ │ │ ├── DiscordMono.tsx
│ │ │ │ ├── actions.tsx
│ │ │ │ ├── activity-small.tsx
│ │ │ │ ├── activity.tsx
│ │ │ │ ├── add-lines.tsx
│ │ │ │ ├── alert-circle.tsx
│ │ │ │ ├── alert-triangle.tsx
│ │ │ │ ├── arrow-down-dot.tsx
│ │ │ │ ├── arrow-exchange.tsx
│ │ │ │ ├── arrow-left-dot.tsx
│ │ │ │ ├── arrow-left.tsx
│ │ │ │ ├── arrow-right-circle.tsx
│ │ │ │ ├── arrow-right-dot.tsx
│ │ │ │ ├── arrow-right.tsx
│ │ │ │ ├── arrow-up-circle.tsx
│ │ │ │ ├── arrow-up-dot.tsx
│ │ │ │ ├── arrow-up-down.tsx
│ │ │ │ ├── arrow-up-right.tsx
│ │ │ │ ├── arrow-up.tsx
│ │ │ │ ├── arrow-wall-right.tsx
│ │ │ │ ├── audio-eq-small.tsx
│ │ │ │ ├── audio.tsx
│ │ │ │ ├── aws.tsx
│ │ │ │ ├── azure.tsx
│ │ │ │ ├── bar-chart-small.tsx
│ │ │ │ ├── bar-chart.tsx
│ │ │ │ ├── bell.tsx
│ │ │ │ ├── bifrost.tsx
│ │ │ │ ├── blocks.tsx
│ │ │ │ ├── book-open.tsx
│ │ │ │ ├── bookmark.tsx
│ │ │ │ ├── books-line-small.tsx
│ │ │ │ ├── books-stack-small.tsx
│ │ │ │ ├── bracket-curly.tsx
│ │ │ │ ├── branch.tsx
│ │ │ │ ├── bubble-text.tsx
│ │ │ │ ├── calendar.tsx
│ │ │ │ ├── check-circle.tsx
│ │ │ │ ├── check-small.tsx
│ │ │ │ ├── check-square.tsx
│ │ │ │ ├── check.tsx
│ │ │ │ ├── chevron-down-small.tsx
│ │ │ │ ├── chevron-down.tsx
│ │ │ │ ├── chevron-left.tsx
│ │ │ │ ├── chevron-right.tsx
│ │ │ │ ├── chevron-up-small.tsx
│ │ │ │ ├── chevron-up.tsx
│ │ │ │ ├── circle.tsx
│ │ │ │ ├── claude.tsx
│ │ │ │ ├── clipboard.tsx
│ │ │ │ ├── clock-hands-small.tsx
│ │ │ │ ├── clock.tsx
│ │ │ │ ├── cloud.tsx
│ │ │ │ ├── code.tsx
│ │ │ │ ├── column.tsx
│ │ │ │ ├── copy.tsx
│ │ │ │ ├── corner-right-up-dot.tsx
│ │ │ │ ├── cpu.tsx
│ │ │ │ ├── credit-card.tsx
│ │ │ │ ├── curate.tsx
│ │ │ │ ├── dashboard.tsx
│ │ │ │ ├── dev-kit.tsx
│ │ │ │ ├── download-cloud.tsx
│ │ │ │ ├── download.tsx
│ │ │ │ ├── edit-big.tsx
│ │ │ │ ├── edit.tsx
│ │ │ │ ├── empty.tsx
│ │ │ │ ├── expand.tsx
│ │ │ │ ├── external-link.tsx
│ │ │ │ ├── eye-closed.tsx
│ │ │ │ ├── eye-off.tsx
│ │ │ │ ├── eye.tsx
│ │ │ │ ├── file-braces.tsx
│ │ │ │ ├── file-broadcast.tsx
│ │ │ │ ├── file-chart-pie.tsx
│ │ │ │ ├── file-small.tsx
│ │ │ │ ├── file-text.tsx
│ │ │ │ ├── files.tsx
│ │ │ │ ├── filter-plus.tsx
│ │ │ │ ├── filter.tsx
│ │ │ │ ├── fold.tsx
│ │ │ │ ├── folder-in.tsx
│ │ │ │ ├── folder-open.tsx
│ │ │ │ ├── folder-partial-open.tsx
│ │ │ │ ├── folder-plus.tsx
│ │ │ │ ├── folder.tsx
│ │ │ │ ├── gemini.tsx
│ │ │ │ ├── globe.tsx
│ │ │ │ ├── handle.tsx
│ │ │ │ ├── hard-drive.tsx
│ │ │ │ ├── hash-small.tsx
│ │ │ │ ├── hash.tsx
│ │ │ │ ├── headset-mic.tsx
│ │ │ │ ├── history.tsx
│ │ │ │ ├── hourglass.tsx
│ │ │ │ ├── image-small.tsx
│ │ │ │ ├── image.tsx
│ │ │ │ ├── import-icon.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── info-small.tsx
│ │ │ │ ├── info.tsx
│ │ │ │ ├── key.tsx
│ │ │ │ ├── keystroke.tsx
│ │ │ │ ├── lightbulb-simple.tsx
│ │ │ │ ├── line-chart-up.tsx
│ │ │ │ ├── link.tsx
│ │ │ │ ├── linked-dots.tsx
│ │ │ │ ├── litellm.tsx
│ │ │ │ ├── lm-studio.tsx
│ │ │ │ ├── loader.tsx
│ │ │ │ ├── lock.tsx
│ │ │ │ ├── log-out.tsx
│ │ │ │ ├── maximize-2.tsx
│ │ │ │ ├── mcp.tsx
│ │ │ │ ├── menu.tsx
│ │ │ │ ├── microphone-off.tsx
│ │ │ │ ├── microphone.tsx
│ │ │ │ ├── minus-circle.tsx
│ │ │ │ ├── minus.tsx
│ │ │ │ ├── moon.tsx
│ │ │ │ ├── more-horizontal.tsx
│ │ │ │ ├── music-small.tsx
│ │ │ │ ├── network-graph.tsx
│ │ │ │ ├── notification-bubble.tsx
│ │ │ │ ├── ollama.tsx
│ │ │ │ ├── onyx-logo-typed.tsx
│ │ │ │ ├── onyx-logo.tsx
│ │ │ │ ├── onyx-octagon.tsx
│ │ │ │ ├── onyx-typed.tsx
│ │ │ │ ├── openai.tsx
│ │ │ │ ├── openrouter.tsx
│ │ │ │ ├── organization.tsx
│ │ │ │ ├── paint-brush.tsx
│ │ │ │ ├── paperclip.tsx
│ │ │ │ ├── pause-circle.tsx
│ │ │ │ ├── pen-small.tsx
│ │ │ │ ├── pencil-ruler.tsx
│ │ │ │ ├── pie-chart.tsx
│ │ │ │ ├── pin.tsx
│ │ │ │ ├── pinned.tsx
│ │ │ │ ├── play-circle.tsx
│ │ │ │ ├── plug.tsx
│ │ │ │ ├── plus-circle.tsx
│ │ │ │ ├── plus.tsx
│ │ │ │ ├── progress-bars.tsx
│ │ │ │ ├── progress-circle.tsx
│ │ │ │ ├── question-mark-small.tsx
│ │ │ │ ├── quote-end.tsx
│ │ │ │ ├── quote-start.tsx
│ │ │ │ ├── refresh-cw.tsx
│ │ │ │ ├── revert.tsx
│ │ │ │ ├── search-menu.tsx
│ │ │ │ ├── search-small.tsx
│ │ │ │ ├── search.tsx
│ │ │ │ ├── server.tsx
│ │ │ │ ├── settings.tsx
│ │ │ │ ├── share-webhook.tsx
│ │ │ │ ├── share.tsx
│ │ │ │ ├── shield.tsx
│ │ │ │ ├── sidebar.tsx
│ │ │ │ ├── slack.tsx
│ │ │ │ ├── slash.tsx
│ │ │ │ ├── sliders-small.tsx
│ │ │ │ ├── sliders.tsx
│ │ │ │ ├── sort-order.tsx
│ │ │ │ ├── sort.tsx
│ │ │ │ ├── sparkle.tsx
│ │ │ │ ├── star-off.tsx
│ │ │ │ ├── star.tsx
│ │ │ │ ├── step1.tsx
│ │ │ │ ├── step2.tsx
│ │ │ │ ├── step3-end.tsx
│ │ │ │ ├── step3.tsx
│ │ │ │ ├── stop-circle.tsx
│ │ │ │ ├── stop.tsx
│ │ │ │ ├── sun.tsx
│ │ │ │ ├── tag.tsx
│ │ │ │ ├── terminal-small.tsx
│ │ │ │ ├── terminal.tsx
│ │ │ │ ├── text-lines-small.tsx
│ │ │ │ ├── text-lines.tsx
│ │ │ │ ├── thumbs-down.tsx
│ │ │ │ ├── thumbs-up.tsx
│ │ │ │ ├── trash.tsx
│ │ │ │ ├── two-line-small.tsx
│ │ │ │ ├── unplug.tsx
│ │ │ │ ├── upload-cloud.tsx
│ │ │ │ ├── user-check.tsx
│ │ │ │ ├── user-edit.tsx
│ │ │ │ ├── user-key.tsx
│ │ │ │ ├── user-manage.tsx
│ │ │ │ ├── user-minus.tsx
│ │ │ │ ├── user-plus.tsx
│ │ │ │ ├── user-shield.tsx
│ │ │ │ ├── user-speaker.tsx
│ │ │ │ ├── user-sync.tsx
│ │ │ │ ├── user-x.tsx
│ │ │ │ ├── user.tsx
│ │ │ │ ├── users.tsx
│ │ │ │ ├── volume-off.tsx
│ │ │ │ ├── volume.tsx
│ │ │ │ ├── wallet.tsx
│ │ │ │ ├── workflow.tsx
│ │ │ │ ├── x-circle.tsx
│ │ │ │ ├── x-octagon.tsx
│ │ │ │ ├── x.tsx
│ │ │ │ ├── zoom-in.tsx
│ │ │ │ └── zoom-out.tsx
│ │ │ ├── illustrations/
│ │ │ │ ├── broken-key.tsx
│ │ │ │ ├── connect.tsx
│ │ │ │ ├── connected.tsx
│ │ │ │ ├── disconnected.tsx
│ │ │ │ ├── empty.tsx
│ │ │ │ ├── end-of-line.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── limit-alert.tsx
│ │ │ │ ├── long-wait.tsx
│ │ │ │ ├── no-access.tsx
│ │ │ │ ├── no-result.tsx
│ │ │ │ ├── not-found.tsx
│ │ │ │ ├── overflow.tsx
│ │ │ │ ├── plug-broken.tsx
│ │ │ │ ├── timeout.tsx
│ │ │ │ ├── un-plugged.tsx
│ │ │ │ └── usage-alert.tsx
│ │ │ ├── layouts/
│ │ │ │ ├── README.md
│ │ │ │ ├── cards/
│ │ │ │ │ └── header-layout/
│ │ │ │ │ ├── CardHeaderLayout.stories.tsx
│ │ │ │ │ ├── README.md
│ │ │ │ │ └── components.tsx
│ │ │ │ ├── content/
│ │ │ │ │ ├── Content.stories.tsx
│ │ │ │ │ ├── ContentLg.tsx
│ │ │ │ │ ├── ContentMd.tsx
│ │ │ │ │ ├── ContentSm.tsx
│ │ │ │ │ ├── ContentXl.tsx
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── components.tsx
│ │ │ │ │ └── styles.css
│ │ │ │ ├── content-action/
│ │ │ │ │ ├── ContentAction.stories.tsx
│ │ │ │ │ ├── README.md
│ │ │ │ │ └── components.tsx
│ │ │ │ ├── illustration-content/
│ │ │ │ │ ├── IllustrationContent.stories.tsx
│ │ │ │ │ ├── README.md
│ │ │ │ │ └── components.tsx
│ │ │ │ └── index.ts
│ │ │ ├── shared.ts
│ │ │ ├── types.ts
│ │ │ └── utils.ts
│ │ └── tsconfig.json
│ ├── next.config.js
│ ├── package.json
│ ├── playwright.config.ts
│ ├── postcss.config.js
│ ├── public/
│ │ └── fonts/
│ │ └── KHTeka-Medium.otf
│ ├── sentry.edge.config.ts
│ ├── sentry.server.config.ts
│ ├── src/
│ │ ├── app/
│ │ │ ├── PostHogPageView.tsx
│ │ │ ├── admin/
│ │ │ │ ├── actions/
│ │ │ │ │ ├── edit/
│ │ │ │ │ │ └── [toolId]/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── edit-mcp/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── mcp/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── new/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── open-api/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── add-connector/
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── agents/
│ │ │ │ │ ├── CollapsibleSection.tsx
│ │ │ │ │ ├── interfaces.ts
│ │ │ │ │ ├── lib.ts
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── billing/
│ │ │ │ │ ├── BillingDetailsView.tsx
│ │ │ │ │ ├── CheckoutView.tsx
│ │ │ │ │ ├── LicenseActivationCard.tsx
│ │ │ │ │ ├── PlansView.tsx
│ │ │ │ │ ├── billing.css
│ │ │ │ │ ├── page.test.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── bots/
│ │ │ │ │ ├── SlackBotCreationForm.tsx
│ │ │ │ │ ├── SlackBotTable.tsx
│ │ │ │ │ ├── SlackBotUpdateForm.tsx
│ │ │ │ │ ├── SlackTokensForm.tsx
│ │ │ │ │ ├── [bot-id]/
│ │ │ │ │ │ ├── SlackChannelConfigsTable.tsx
│ │ │ │ │ │ ├── channels/
│ │ │ │ │ │ │ ├── SlackChannelConfigCreationForm.tsx
│ │ │ │ │ │ │ ├── SlackChannelConfigFormFields.tsx
│ │ │ │ │ │ │ ├── [id]/
│ │ │ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ │ └── new/
│ │ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ ├── hooks.ts
│ │ │ │ │ │ ├── lib.ts
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── new/
│ │ │ │ │ │ ├── lib.ts
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── configuration/
│ │ │ │ │ ├── chat-preferences/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── code-interpreter/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── document-processing/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── image-generation/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── llm/
│ │ │ │ │ │ ├── ModelConfigurationField.tsx
│ │ │ │ │ │ ├── ProviderIcon.tsx
│ │ │ │ │ │ ├── page.tsx
│ │ │ │ │ │ └── utils.ts
│ │ │ │ │ ├── search/
│ │ │ │ │ │ ├── UpgradingPage.tsx
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── voice/
│ │ │ │ │ │ ├── VoiceProviderSetupModal.tsx
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── web-search/
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── connector/
│ │ │ │ │ └── [ccPairId]/
│ │ │ │ │ ├── ConfigDisplay.tsx
│ │ │ │ │ ├── DeletionErrorStatus.tsx
│ │ │ │ │ ├── IndexAttemptErrorsModal.tsx
│ │ │ │ │ ├── IndexAttemptsTable.tsx
│ │ │ │ │ ├── InlineFileManagement.tsx
│ │ │ │ │ ├── ReIndexModal.tsx
│ │ │ │ │ ├── lib.ts
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── useStatusChange.tsx
│ │ │ │ ├── connectors/
│ │ │ │ │ └── [connector]/
│ │ │ │ │ ├── AddConnectorPage.tsx
│ │ │ │ │ ├── ConnectorWrapper.tsx
│ │ │ │ │ ├── NavigationRow.tsx
│ │ │ │ │ ├── auth/
│ │ │ │ │ │ └── callback/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ ├── oauth/
│ │ │ │ │ │ ├── callback/
│ │ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ └── finalize/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ └── pages/
│ │ │ │ │ ├── Advanced.tsx
│ │ │ │ │ ├── ConnectorInput/
│ │ │ │ │ │ ├── FileInput.tsx
│ │ │ │ │ │ ├── ListInput.tsx
│ │ │ │ │ │ ├── NumberInput.tsx
│ │ │ │ │ │ └── SelectInput.tsx
│ │ │ │ │ ├── DynamicConnectorCreationForm.tsx
│ │ │ │ │ ├── FieldRendering.tsx
│ │ │ │ │ ├── gdrive/
│ │ │ │ │ │ ├── Credential.tsx
│ │ │ │ │ │ └── GoogleDrivePage.tsx
│ │ │ │ │ ├── gmail/
│ │ │ │ │ │ ├── Credential.tsx
│ │ │ │ │ │ └── GmailPage.tsx
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── files.ts
│ │ │ │ │ ├── google_site.ts
│ │ │ │ │ └── hooks.ts
│ │ │ │ ├── debug/
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── discord-bot/
│ │ │ │ │ ├── BotConfigCard.tsx
│ │ │ │ │ ├── DiscordGuildsTable.tsx
│ │ │ │ │ ├── [guild-id]/
│ │ │ │ │ │ ├── DiscordChannelsTable.tsx
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── hooks.ts
│ │ │ │ │ ├── lib.ts
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ └── types.ts
│ │ │ │ ├── document-index-migration/
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── documents/
│ │ │ │ │ ├── ScoreEditor.tsx
│ │ │ │ │ ├── explorer/
│ │ │ │ │ │ ├── DocumentExplorerPage.tsx
│ │ │ │ │ │ ├── Explorer.tsx
│ │ │ │ │ │ ├── lib.ts
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── feedback/
│ │ │ │ │ │ ├── DocumentFeedbackTable.tsx
│ │ │ │ │ │ ├── constants.ts
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── lib.ts
│ │ │ │ │ └── sets/
│ │ │ │ │ ├── DocumentSetCreationForm.tsx
│ │ │ │ │ ├── [documentSetId]/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── hooks.tsx
│ │ │ │ │ ├── lib.ts
│ │ │ │ │ ├── new/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── embeddings/
│ │ │ │ │ ├── EmbeddingModelSelectionForm.tsx
│ │ │ │ │ ├── RerankingFormPage.tsx
│ │ │ │ │ ├── interfaces.ts
│ │ │ │ │ ├── modals/
│ │ │ │ │ │ ├── AlreadyPickedModal.tsx
│ │ │ │ │ │ ├── ChangeCredentialsModal.tsx
│ │ │ │ │ │ ├── DeleteCredentialsModal.tsx
│ │ │ │ │ │ ├── InstantSwitchConfirmModal.tsx
│ │ │ │ │ │ ├── ModelSelectionModal.tsx
│ │ │ │ │ │ ├── ProviderCreationModal.tsx
│ │ │ │ │ │ └── SelectModelModal.tsx
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ └── pages/
│ │ │ │ │ ├── AdvancedEmbeddingFormPage.tsx
│ │ │ │ │ ├── CloudEmbeddingPage.tsx
│ │ │ │ │ ├── EmbeddingFormPage.tsx
│ │ │ │ │ ├── OpenEmbeddingPage.tsx
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── federated/
│ │ │ │ │ └── [id]/
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ └── useFederatedConnector.ts
│ │ │ │ ├── groups/
│ │ │ │ │ ├── [id]/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── create/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── groups2/
│ │ │ │ │ ├── [id]/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── create/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── hooks/
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── indexing/
│ │ │ │ │ └── status/
│ │ │ │ │ ├── CCPairIndexingStatusTable.tsx
│ │ │ │ │ ├── ConnectorRowSkeleton.tsx
│ │ │ │ │ ├── FilterComponent.tsx
│ │ │ │ │ ├── SearchAndFilterControls.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── kg/
│ │ │ │ │ ├── KGEntityTypes.tsx
│ │ │ │ │ ├── interfaces.ts
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── layout.tsx
│ │ │ │ ├── scim/
│ │ │ │ │ ├── ScimModal.tsx
│ │ │ │ │ ├── ScimSyncCard.tsx
│ │ │ │ │ ├── interfaces.ts
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ └── svc.ts
│ │ │ │ ├── service-accounts/
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── systeminfo/
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── token-rate-limits/
│ │ │ │ │ ├── CreateRateLimitModal.tsx
│ │ │ │ │ ├── TokenRateLimitTables.tsx
│ │ │ │ │ ├── lib.ts
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ └── types.ts
│ │ │ │ └── users/
│ │ │ │ └── page.tsx
│ │ │ ├── anonymous/
│ │ │ │ └── [id]/
│ │ │ │ ├── AnonymousPage.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── api/
│ │ │ │ ├── [...path]/
│ │ │ │ │ └── route.ts
│ │ │ │ └── chat/
│ │ │ │ └── mcp/
│ │ │ │ └── oauth/
│ │ │ │ └── callback/
│ │ │ │ └── route.ts
│ │ │ ├── app/
│ │ │ │ ├── agents/
│ │ │ │ │ ├── create/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── edit/
│ │ │ │ │ │ └── [id]/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── AgentDescription.tsx
│ │ │ │ │ ├── AppPopup.tsx
│ │ │ │ │ ├── WelcomeMessage.tsx
│ │ │ │ │ ├── files/
│ │ │ │ │ │ ├── InputBarPreview.tsx
│ │ │ │ │ │ └── images/
│ │ │ │ │ │ ├── FullImageModal.tsx
│ │ │ │ │ │ ├── InMessageImage.tsx
│ │ │ │ │ │ ├── InputBarPreviewImage.tsx
│ │ │ │ │ │ └── utils.ts
│ │ │ │ │ ├── folders/
│ │ │ │ │ │ ├── FolderDropdown.tsx
│ │ │ │ │ │ └── interfaces.ts
│ │ │ │ │ ├── modifiers/
│ │ │ │ │ │ └── SelectedDocuments.tsx
│ │ │ │ │ ├── projects/
│ │ │ │ │ │ ├── ProjectChatSessionList.tsx
│ │ │ │ │ │ ├── ProjectContextPanel.tsx
│ │ │ │ │ │ └── project_utils.ts
│ │ │ │ │ └── tools/
│ │ │ │ │ ├── GeneratingImageDisplay.tsx
│ │ │ │ │ └── constants.ts
│ │ │ │ ├── interfaces.ts
│ │ │ │ ├── layout.tsx
│ │ │ │ ├── message/
│ │ │ │ │ ├── BlinkingBar.tsx
│ │ │ │ │ ├── CodeBlock.tsx
│ │ │ │ │ ├── FileDisplay.tsx
│ │ │ │ │ ├── HumanMessage.tsx
│ │ │ │ │ ├── MemoizedTextComponents.tsx
│ │ │ │ │ ├── MessageSwitcher.tsx
│ │ │ │ │ ├── Resubmit.tsx
│ │ │ │ │ ├── codeUtils.test.ts
│ │ │ │ │ ├── codeUtils.ts
│ │ │ │ │ ├── copyingUtils.tsx
│ │ │ │ │ ├── custom-code-styles.css
│ │ │ │ │ ├── errorHelpers.tsx
│ │ │ │ │ ├── hooks.ts
│ │ │ │ │ ├── messageComponents/
│ │ │ │ │ │ ├── AgentMessage.tsx
│ │ │ │ │ │ ├── CustomToolAuthCard.tsx
│ │ │ │ │ │ ├── MessageToolbar.tsx
│ │ │ │ │ │ ├── TTSButton.tsx
│ │ │ │ │ │ ├── constants.ts
│ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ ├── useAuthErrors.ts
│ │ │ │ │ │ │ ├── useMessageSwitching.ts
│ │ │ │ │ │ │ └── usePacketAnimationAndCollapse.ts
│ │ │ │ │ │ ├── interfaces.ts
│ │ │ │ │ │ ├── markdownUtils.tsx
│ │ │ │ │ │ ├── renderMessageComponent.tsx
│ │ │ │ │ │ ├── renderers/
│ │ │ │ │ │ │ ├── CustomToolRenderer.tsx
│ │ │ │ │ │ │ ├── ImageToolRenderer.tsx
│ │ │ │ │ │ │ └── MessageTextRenderer.tsx
│ │ │ │ │ │ ├── timeline/
│ │ │ │ │ │ │ ├── AgentTimeline.tsx
│ │ │ │ │ │ │ ├── CollapsedStreamingContent.tsx
│ │ │ │ │ │ │ ├── ExpandedTimelineContent.tsx
│ │ │ │ │ │ │ ├── ParallelTimelineTabs.tsx
│ │ │ │ │ │ │ ├── StepContainer.tsx
│ │ │ │ │ │ │ ├── TimelineRendererComponent.tsx
│ │ │ │ │ │ │ ├── TimelineStepComposer.tsx
│ │ │ │ │ │ │ ├── headers/
│ │ │ │ │ │ │ │ ├── CompletedHeader.tsx
│ │ │ │ │ │ │ │ ├── ParallelStreamingHeader.tsx
│ │ │ │ │ │ │ │ ├── StoppedHeader.tsx
│ │ │ │ │ │ │ │ └── StreamingHeader.tsx
│ │ │ │ │ │ │ ├── hooks/
│ │ │ │ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ │ │ │ └── testHelpers.ts
│ │ │ │ │ │ │ │ ├── packetProcessor.test.ts
│ │ │ │ │ │ │ │ ├── packetProcessor.ts
│ │ │ │ │ │ │ │ ├── usePacedTurnGroups.test.tsx
│ │ │ │ │ │ │ │ ├── usePacedTurnGroups.ts
│ │ │ │ │ │ │ │ ├── usePacketProcessor.test.tsx
│ │ │ │ │ │ │ │ ├── usePacketProcessor.ts
│ │ │ │ │ │ │ │ ├── useStreamingDuration.ts
│ │ │ │ │ │ │ │ ├── useTimelineExpansion.ts
│ │ │ │ │ │ │ │ ├── useTimelineHeader.ts
│ │ │ │ │ │ │ │ ├── useTimelineMetrics.ts
│ │ │ │ │ │ │ │ ├── useTimelineStepState.ts
│ │ │ │ │ │ │ │ └── useTimelineUIState.ts
│ │ │ │ │ │ │ ├── packetHelpers.ts
│ │ │ │ │ │ │ ├── primitives/
│ │ │ │ │ │ │ │ ├── TimelineHeaderRow.tsx
│ │ │ │ │ │ │ │ ├── TimelineIconColumn.tsx
│ │ │ │ │ │ │ │ ├── TimelineRoot.tsx
│ │ │ │ │ │ │ │ ├── TimelineRow.tsx
│ │ │ │ │ │ │ │ ├── TimelineStepContent.tsx
│ │ │ │ │ │ │ │ ├── TimelineSurface.tsx
│ │ │ │ │ │ │ │ ├── TimelineTopSpacer.tsx
│ │ │ │ │ │ │ │ └── tokens.ts
│ │ │ │ │ │ │ ├── renderers/
│ │ │ │ │ │ │ │ ├── code/
│ │ │ │ │ │ │ │ │ └── PythonToolRenderer.tsx
│ │ │ │ │ │ │ │ ├── deepresearch/
│ │ │ │ │ │ │ │ │ ├── DeepResearchPlanRenderer.tsx
│ │ │ │ │ │ │ │ │ └── ResearchAgentRenderer.tsx
│ │ │ │ │ │ │ │ ├── fetch/
│ │ │ │ │ │ │ │ │ ├── FetchToolRenderer.tsx
│ │ │ │ │ │ │ │ │ └── fetchStateUtils.ts
│ │ │ │ │ │ │ │ ├── filereader/
│ │ │ │ │ │ │ │ │ └── FileReaderToolRenderer.tsx
│ │ │ │ │ │ │ │ ├── memory/
│ │ │ │ │ │ │ │ │ ├── MemoryToolRenderer.tsx
│ │ │ │ │ │ │ │ │ └── memoryStateUtils.ts
│ │ │ │ │ │ │ │ ├── reasoning/
│ │ │ │ │ │ │ │ │ └── ReasoningRenderer.tsx
│ │ │ │ │ │ │ │ ├── search/
│ │ │ │ │ │ │ │ │ ├── InternalSearchToolRenderer.tsx
│ │ │ │ │ │ │ │ │ ├── SearchChipList.tsx
│ │ │ │ │ │ │ │ │ ├── WebSearchToolRenderer.tsx
│ │ │ │ │ │ │ │ │ └── searchStateUtils.ts
│ │ │ │ │ │ │ │ └── sharedMarkdownComponents.tsx
│ │ │ │ │ │ │ └── transformers.ts
│ │ │ │ │ │ ├── timing.ts
│ │ │ │ │ │ └── toolDisplayHelpers.tsx
│ │ │ │ │ └── thinkingBox/
│ │ │ │ │ └── ThinkingBox.css
│ │ │ │ ├── page.tsx
│ │ │ │ ├── projects/
│ │ │ │ │ └── projectsService.ts
│ │ │ │ ├── services/
│ │ │ │ │ ├── actionUtils.ts
│ │ │ │ │ ├── currentMessageFIFO.ts
│ │ │ │ │ ├── fileUtils.ts
│ │ │ │ │ ├── lib.tsx
│ │ │ │ │ ├── messageTree.ts
│ │ │ │ │ ├── packetUtils.test.ts
│ │ │ │ │ ├── packetUtils.ts
│ │ │ │ │ ├── searchParams.ts
│ │ │ │ │ ├── streamingModels.ts
│ │ │ │ │ └── thinkingTokens.ts
│ │ │ │ ├── settings/
│ │ │ │ │ ├── accounts-access/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── chat-preferences/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── connectors/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── general/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── layout.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── shared/
│ │ │ │ │ └── [chatId]/
│ │ │ │ │ ├── SharedChatDisplay.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ └── stores/
│ │ │ │ └── useChatSessionStore.ts
│ │ │ ├── auth/
│ │ │ │ ├── create-account/
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── error/
│ │ │ │ │ ├── AuthErrorContent.tsx
│ │ │ │ │ ├── layout.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── forgot-password/
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── impersonate/
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── join/
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── lib.ts
│ │ │ │ ├── libSS.ts
│ │ │ │ ├── login/
│ │ │ │ │ ├── EmailPasswordForm.test.tsx
│ │ │ │ │ ├── EmailPasswordForm.tsx
│ │ │ │ │ ├── LoginPage.tsx
│ │ │ │ │ ├── LoginText.tsx
│ │ │ │ │ ├── SignInButton.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── logout/
│ │ │ │ │ └── route.ts
│ │ │ │ ├── oauth/
│ │ │ │ │ └── callback/
│ │ │ │ │ └── route.ts
│ │ │ │ ├── oidc/
│ │ │ │ │ └── callback/
│ │ │ │ │ └── route.ts
│ │ │ │ ├── reset-password/
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── saml/
│ │ │ │ │ └── callback/
│ │ │ │ │ └── route.ts
│ │ │ │ ├── signup/
│ │ │ │ │ ├── ReferralSourceSelector.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── verify-email/
│ │ │ │ │ ├── Verify.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ └── waiting-on-verification/
│ │ │ │ ├── RequestNewVerificationEmail.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── components/
│ │ │ │ └── nrf/
│ │ │ │ └── SettingsPanel.tsx
│ │ │ ├── config/
│ │ │ │ └── timeRange.tsx
│ │ │ ├── connector/
│ │ │ │ └── oauth/
│ │ │ │ └── callback/
│ │ │ │ └── [source]/
│ │ │ │ └── route.tsx
│ │ │ ├── craft/
│ │ │ │ ├── README.md
│ │ │ │ ├── components/
│ │ │ │ │ ├── BigButton.tsx
│ │ │ │ │ ├── BuildLLMPopover.tsx
│ │ │ │ │ ├── BuildMessageList.tsx
│ │ │ │ │ ├── BuildWelcome.tsx
│ │ │ │ │ ├── ChatPanel.tsx
│ │ │ │ │ ├── ConnectDataBanner.tsx
│ │ │ │ │ ├── ConnectorBannersRow.tsx
│ │ │ │ │ ├── CraftingLoader.tsx
│ │ │ │ │ ├── DiffView.tsx
│ │ │ │ │ ├── FileBrowser.tsx
│ │ │ │ │ ├── FilePreviewModal.tsx
│ │ │ │ │ ├── InputBar.tsx
│ │ │ │ │ ├── IntroBackground.tsx
│ │ │ │ │ ├── IntroContent.tsx
│ │ │ │ │ ├── OutputPanel.tsx
│ │ │ │ │ ├── RawOutputBlock.tsx
│ │ │ │ │ ├── SandboxStatusIndicator.tsx
│ │ │ │ │ ├── ShareButton.tsx
│ │ │ │ │ ├── SideBar.tsx
│ │ │ │ │ ├── SuggestedPrompts.tsx
│ │ │ │ │ ├── SuggestionBubbles.tsx
│ │ │ │ │ ├── TextChunk.tsx
│ │ │ │ │ ├── ThinkingCard.tsx
│ │ │ │ │ ├── TodoListCard.tsx
│ │ │ │ │ ├── ToggleWarningModal.tsx
│ │ │ │ │ ├── ToolCallPill.tsx
│ │ │ │ │ ├── TypewriterText.tsx
│ │ │ │ │ ├── UpgradePlanModal.tsx
│ │ │ │ │ ├── UserMessage.tsx
│ │ │ │ │ ├── WorkingLine.tsx
│ │ │ │ │ ├── WorkingPill.tsx
│ │ │ │ │ └── output-panel/
│ │ │ │ │ ├── ArtifactsTab.tsx
│ │ │ │ │ ├── FilePreviewContent.tsx
│ │ │ │ │ ├── FilesTab.tsx
│ │ │ │ │ ├── ImagePreview.tsx
│ │ │ │ │ ├── MarkdownFilePreview.tsx
│ │ │ │ │ ├── PdfPreview.tsx
│ │ │ │ │ ├── PptxPreview.tsx
│ │ │ │ │ ├── PreviewTab.tsx
│ │ │ │ │ └── UrlBar.tsx
│ │ │ │ ├── constants/
│ │ │ │ │ └── exampleBuildPrompts.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── contexts/
│ │ │ │ │ ├── BuildContext.tsx
│ │ │ │ │ └── UploadFilesContext.tsx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useBuildConnectors.ts
│ │ │ │ │ ├── useBuildLlmSelection.ts
│ │ │ │ │ ├── useBuildSessionController.ts
│ │ │ │ │ ├── useBuildSessionStore.ts
│ │ │ │ │ ├── useBuildStreaming.ts
│ │ │ │ │ ├── usePreProvisionPolling.ts
│ │ │ │ │ └── useUsageLimits.ts
│ │ │ │ ├── layout.tsx
│ │ │ │ ├── onboarding/
│ │ │ │ │ ├── BuildOnboardingProvider.tsx
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── BuildOnboardingModal.tsx
│ │ │ │ │ │ ├── NoLlmProvidersModal.tsx
│ │ │ │ │ │ ├── NotAllowedModal.tsx
│ │ │ │ │ │ ├── OnboardingInfoPages.tsx
│ │ │ │ │ │ ├── OnboardingLlmSetup.tsx
│ │ │ │ │ │ └── OnboardingUserInfo.tsx
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── hooks/
│ │ │ │ │ │ └── useOnboardingModal.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── page.tsx
│ │ │ │ ├── services/
│ │ │ │ │ ├── apiServices.ts
│ │ │ │ │ └── searchParams.ts
│ │ │ │ ├── types/
│ │ │ │ │ ├── displayTypes.ts
│ │ │ │ │ ├── streamingTypes.ts
│ │ │ │ │ └── user-library.ts
│ │ │ │ ├── utils/
│ │ │ │ │ ├── packetTypes.ts
│ │ │ │ │ ├── parsePacket.ts
│ │ │ │ │ ├── pathSanitizer.test.ts
│ │ │ │ │ ├── pathSanitizer.ts
│ │ │ │ │ └── streamItemHelpers.ts
│ │ │ │ └── v1/
│ │ │ │ ├── configure/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── ComingSoonConnectors.tsx
│ │ │ │ │ │ ├── ConfigureConnectorModal.tsx
│ │ │ │ │ │ ├── ConfigureOverlays.tsx
│ │ │ │ │ │ ├── ConnectorCard.tsx
│ │ │ │ │ │ ├── ConnectorConfigStep.tsx
│ │ │ │ │ │ ├── CreateCredentialInline.tsx
│ │ │ │ │ │ ├── CredentialStep.tsx
│ │ │ │ │ │ ├── DemoDataConfirmModal.tsx
│ │ │ │ │ │ ├── RequestConnectorModal.tsx
│ │ │ │ │ │ └── UserLibraryModal.tsx
│ │ │ │ │ ├── page.tsx
│ │ │ │ │ └── utils/
│ │ │ │ │ └── createBuildConnector.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── layout.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── css/
│ │ │ │ ├── attachment-button.css
│ │ │ │ ├── button.css
│ │ │ │ ├── card.css
│ │ │ │ ├── code.css
│ │ │ │ ├── color-swatch.css
│ │ │ │ ├── colors.css
│ │ │ │ ├── divider.css
│ │ │ │ ├── general-layouts.css
│ │ │ │ ├── inputs.css
│ │ │ │ ├── knowledge-table.css
│ │ │ │ ├── line-item.css
│ │ │ │ ├── sizes.css
│ │ │ │ ├── square-button.css
│ │ │ │ ├── switch.css
│ │ │ │ └── z-index.css
│ │ │ ├── ee/
│ │ │ │ ├── EEFeatureRedirect.tsx
│ │ │ │ ├── LICENSE
│ │ │ │ ├── admin/
│ │ │ │ │ ├── billing/
│ │ │ │ │ │ ├── BillingAlerts.tsx
│ │ │ │ │ │ ├── BillingInformationPage.tsx
│ │ │ │ │ │ ├── InfoItem.tsx
│ │ │ │ │ │ ├── SubscriptionSummary.tsx
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── groups/
│ │ │ │ │ │ ├── [id]/
│ │ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ ├── create/
│ │ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── layout.tsx
│ │ │ │ │ ├── performance/
│ │ │ │ │ │ ├── custom-analytics/
│ │ │ │ │ │ │ ├── CustomAnalyticsUpdateForm.tsx
│ │ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ ├── lib.ts
│ │ │ │ │ │ ├── query-history/
│ │ │ │ │ │ │ ├── FeedbackBadge.tsx
│ │ │ │ │ │ │ ├── KickoffCSVExport.tsx
│ │ │ │ │ │ │ ├── QueryHistoryTable.tsx
│ │ │ │ │ │ │ ├── [id]/
│ │ │ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ │ ├── constants.ts
│ │ │ │ │ │ │ ├── page.tsx
│ │ │ │ │ │ │ ├── types.ts
│ │ │ │ │ │ │ └── utils.ts
│ │ │ │ │ │ └── usage/
│ │ │ │ │ │ ├── FeedbackChart.tsx
│ │ │ │ │ │ ├── OnyxBotChart.tsx
│ │ │ │ │ │ ├── PersonaMessagesChart.tsx
│ │ │ │ │ │ ├── QueryPerformanceChart.tsx
│ │ │ │ │ │ ├── UsageReports.tsx
│ │ │ │ │ │ ├── page.tsx
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── standard-answer/
│ │ │ │ │ │ ├── StandardAnswerCreationForm.tsx
│ │ │ │ │ │ ├── [id]/
│ │ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ ├── hooks.ts
│ │ │ │ │ │ ├── lib.ts
│ │ │ │ │ │ ├── new/
│ │ │ │ │ │ │ └── page.tsx
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ └── theme/
│ │ │ │ │ ├── AppearanceThemeSettings.tsx
│ │ │ │ │ ├── Preview.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── agents/
│ │ │ │ │ └── stats/
│ │ │ │ │ └── [id]/
│ │ │ │ │ ├── AgentStats.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ └── layout.tsx
│ │ │ ├── federated/
│ │ │ │ └── oauth/
│ │ │ │ └── callback/
│ │ │ │ └── page.tsx
│ │ │ ├── global-error.tsx
│ │ │ ├── globals.css
│ │ │ ├── layout.tsx
│ │ │ ├── mcp/
│ │ │ │ ├── [[...path]]/
│ │ │ │ │ └── route.ts
│ │ │ │ └── oauth/
│ │ │ │ └── callback/
│ │ │ │ └── page.tsx
│ │ │ ├── not-found.tsx
│ │ │ ├── nrf/
│ │ │ │ ├── (main)/
│ │ │ │ │ ├── layout.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── NRFChrome.tsx
│ │ │ │ ├── NRFPage.tsx
│ │ │ │ ├── layout.tsx
│ │ │ │ └── side-panel/
│ │ │ │ ├── SidePanelHeader.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── oauth-config/
│ │ │ │ └── callback/
│ │ │ │ └── page.tsx
│ │ │ ├── page.tsx
│ │ │ ├── providers.tsx
│ │ │ └── web-vitals.tsx
│ │ ├── ce.tsx
│ │ ├── components/
│ │ │ ├── AdvancedOptionsToggle.tsx
│ │ │ ├── AgentsMultiSelect.tsx
│ │ │ ├── BasicClickable.tsx
│ │ │ ├── Bubble.tsx
│ │ │ ├── CollapsibleCard.tsx
│ │ │ ├── ConnectorMultiSelect.tsx
│ │ │ ├── DeleteButton.tsx
│ │ │ ├── Dropdown.tsx
│ │ │ ├── EditableStringFieldDisplay.tsx
│ │ │ ├── EditableValue.tsx
│ │ │ ├── ErrorCallout.tsx
│ │ │ ├── FederatedConnectorSelector.tsx
│ │ │ ├── Field.tsx
│ │ │ ├── FormErrorHelpers.tsx
│ │ │ ├── GatedContentWrapper.tsx
│ │ │ ├── GenericMultiSelect.tsx
│ │ │ ├── GroupsMultiSelect.tsx
│ │ │ ├── HoverPopup.tsx
│ │ │ ├── IsPublicGroupSelector.tsx
│ │ │ ├── Loading.tsx
│ │ │ ├── MetadataBadge.tsx
│ │ │ ├── MultiSelectDropdown.tsx
│ │ │ ├── NonSelectableConnectors.tsx
│ │ │ ├── OnyxInitializingLoader.tsx
│ │ │ ├── PageSelector.tsx
│ │ │ ├── RichTextSubtext.tsx
│ │ │ ├── SSRAutoRefresh.tsx
│ │ │ ├── SearchResultIcon.tsx
│ │ │ ├── SourceIcon.tsx
│ │ │ ├── SourceTile.tsx
│ │ │ ├── Spinner.tsx
│ │ │ ├── Status.tsx
│ │ │ ├── WebResultIcon.tsx
│ │ │ ├── admin/
│ │ │ │ ├── CardSection.tsx
│ │ │ │ ├── ClientLayout.tsx
│ │ │ │ ├── Layout.tsx
│ │ │ │ ├── Title.tsx
│ │ │ │ ├── connectors/
│ │ │ │ │ ├── AccessTypeForm.tsx
│ │ │ │ │ ├── AccessTypeGroupSelector.tsx
│ │ │ │ │ ├── AutoSyncOptions.tsx
│ │ │ │ │ ├── BasicTable.tsx
│ │ │ │ │ ├── ConnectorDocsLink.tsx
│ │ │ │ │ ├── ConnectorTitle.tsx
│ │ │ │ │ ├── CredentialForm.tsx
│ │ │ │ │ ├── FileUpload.tsx
│ │ │ │ │ └── types.ts
│ │ │ │ ├── federated/
│ │ │ │ │ └── FederatedConnectorForm.tsx
│ │ │ │ └── users/
│ │ │ │ ├── BulkAdd.tsx
│ │ │ │ ├── CenteredPageSelector.tsx
│ │ │ │ ├── InvitedUserTable.tsx
│ │ │ │ ├── PendingUsersTable.tsx
│ │ │ │ ├── ResetPasswordModal.tsx
│ │ │ │ ├── SignedUpUserTable.tsx
│ │ │ │ └── buttons/
│ │ │ │ ├── DeactivateUserButton.tsx
│ │ │ │ ├── DeleteUserButton.tsx
│ │ │ │ ├── InviteUserButton.tsx
│ │ │ │ ├── LeaveOrganizationButton.tsx
│ │ │ │ └── UserRoleDropdown.tsx
│ │ │ ├── auth/
│ │ │ │ ├── AuthErrorDisplay.tsx
│ │ │ │ └── AuthFlowContainer.tsx
│ │ │ ├── chat/
│ │ │ │ ├── DynamicBottomSpacer.tsx
│ │ │ │ ├── FederatedOAuthModal.tsx
│ │ │ │ ├── MCPApiKeyModal.tsx
│ │ │ │ ├── MinimalMarkdown.test.tsx
│ │ │ │ ├── MinimalMarkdown.tsx
│ │ │ │ ├── ProviderContext.tsx
│ │ │ │ └── ScrollContainerContext.tsx
│ │ │ ├── context/
│ │ │ │ ├── EmbeddingContext.tsx
│ │ │ │ ├── FormContext.tsx
│ │ │ │ ├── ModalContext.tsx
│ │ │ │ └── NRFPreferencesContext.tsx
│ │ │ ├── credentials/
│ │ │ │ ├── CredentialFields.tsx
│ │ │ │ ├── CredentialSection.tsx
│ │ │ │ ├── actions/
│ │ │ │ │ ├── CreateCredential.tsx
│ │ │ │ │ ├── CreateStdOAuthCredential.tsx
│ │ │ │ │ ├── CredentialFieldsRenderer.tsx
│ │ │ │ │ ├── EditCredential.tsx
│ │ │ │ │ └── ModifyCredential.tsx
│ │ │ │ ├── lib.ts
│ │ │ │ └── types.ts
│ │ │ ├── dateRangeSelectors/
│ │ │ │ ├── AdminDateRangeSelector.tsx
│ │ │ │ ├── SearchDateRangeSelector.tsx
│ │ │ │ └── dateUtils.ts
│ │ │ ├── dev/
│ │ │ │ ├── StatsOverlay.tsx
│ │ │ │ └── StatsOverlayLoader.tsx
│ │ │ ├── embedding/
│ │ │ │ ├── CustomEmbeddingModelForm.tsx
│ │ │ │ ├── CustomModelForm.tsx
│ │ │ │ ├── FailedReIndexAttempts.tsx
│ │ │ │ ├── ModelSelector.tsx
│ │ │ │ ├── ReindexingProgressTable.tsx
│ │ │ │ └── interfaces.tsx
│ │ │ ├── errorPages/
│ │ │ │ ├── AccessRestrictedPage.tsx
│ │ │ │ ├── CloudErrorPage.tsx
│ │ │ │ ├── ErrorPage.tsx
│ │ │ │ └── ErrorPageLayout.tsx
│ │ │ ├── filters/
│ │ │ │ ├── SourceSelector.tsx
│ │ │ │ └── TimeRangeSelector.tsx
│ │ │ ├── header/
│ │ │ │ ├── AnnouncementBanner.tsx
│ │ │ │ └── HeaderTitle.tsx
│ │ │ ├── icons/
│ │ │ │ ├── DynamicFaIcon.tsx
│ │ │ │ ├── icons.test.tsx
│ │ │ │ └── icons.tsx
│ │ │ ├── llm/
│ │ │ │ └── LLMSelector.tsx
│ │ │ ├── loading.css
│ │ │ ├── modals/
│ │ │ │ ├── AddInstructionModal.tsx
│ │ │ │ ├── ConfirmEntityModal.tsx
│ │ │ │ ├── CreateProjectModal.tsx
│ │ │ │ ├── EditPropertyModal.tsx
│ │ │ │ ├── GenericConfirmModal.tsx
│ │ │ │ ├── MoveCustomAgentChatModal.tsx
│ │ │ │ ├── NewTeamModal.tsx
│ │ │ │ ├── NoAgentModal.tsx
│ │ │ │ ├── ProviderModal.tsx
│ │ │ │ └── UserFilesModal.tsx
│ │ │ ├── oauth/
│ │ │ │ └── OAuthCallbackPage.tsx
│ │ │ ├── resizable/
│ │ │ │ └── constants.ts
│ │ │ ├── search/
│ │ │ │ ├── DocumentDisplay.tsx
│ │ │ │ ├── DocumentFeedbackBlock.tsx
│ │ │ │ ├── DocumentUpdatedAtBadge.tsx
│ │ │ │ ├── filtering/
│ │ │ │ │ └── FilterDropdown.tsx
│ │ │ │ └── results/
│ │ │ │ ├── Citation.tsx
│ │ │ │ └── ResponseSection.tsx
│ │ │ ├── settings/
│ │ │ │ ├── lib.ts
│ │ │ │ └── usePaidEnterpriseFeaturesEnabled.ts
│ │ │ ├── sidebar/
│ │ │ │ ├── ChatSessionMorePopup.tsx
│ │ │ │ └── types.ts
│ │ │ ├── spinner.css
│ │ │ ├── standardAnswers/
│ │ │ │ ├── StandardAnswerCategoryDropdown.tsx
│ │ │ │ └── getStandardAnswerCategoriesIfEE.tsx
│ │ │ ├── table/
│ │ │ │ ├── DragHandle.tsx
│ │ │ │ ├── DraggableRow.tsx
│ │ │ │ ├── DraggableTable.tsx
│ │ │ │ └── interfaces.ts
│ │ │ ├── theme/
│ │ │ │ └── ThemeProvider.tsx
│ │ │ ├── tools/
│ │ │ │ ├── CSVContent.tsx
│ │ │ │ ├── ExpandableContentWrapper.tsx
│ │ │ │ └── parseCSV.test.ts
│ │ │ ├── tooltip/
│ │ │ │ └── CustomTooltip.tsx
│ │ │ ├── ui/
│ │ │ │ ├── RadioGroupItemField.tsx
│ │ │ │ ├── accordion.tsx
│ │ │ │ ├── alert.tsx
│ │ │ │ ├── areaChart.tsx
│ │ │ │ ├── badge.tsx
│ │ │ │ ├── callout.tsx
│ │ │ │ ├── card.tsx
│ │ │ │ ├── dialog.tsx
│ │ │ │ ├── dropdown-menu-with-tooltip.tsx
│ │ │ │ ├── dropdown-menu.tsx
│ │ │ │ ├── input.tsx
│ │ │ │ ├── radio-group.tsx
│ │ │ │ ├── scroll-area.tsx
│ │ │ │ ├── select.tsx
│ │ │ │ ├── slider.tsx
│ │ │ │ ├── table.tsx
│ │ │ │ ├── title.tsx
│ │ │ │ └── tooltip.tsx
│ │ │ └── voice/
│ │ │ └── Waveform.tsx
│ │ ├── ee/
│ │ │ ├── LICENSE
│ │ │ ├── hooks/
│ │ │ │ ├── useHookExecutionLogs.ts
│ │ │ │ ├── useHookSpecs.ts
│ │ │ │ └── useHooks.ts
│ │ │ ├── lib/
│ │ │ │ └── search/
│ │ │ │ └── svc.ts
│ │ │ ├── providers/
│ │ │ │ └── QueryControllerProvider.tsx
│ │ │ ├── refresh-pages/
│ │ │ │ └── admin/
│ │ │ │ └── HooksPage/
│ │ │ │ ├── HookFormModal.tsx
│ │ │ │ ├── HookLogsModal.tsx
│ │ │ │ ├── HookStatusPopover.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ ├── interfaces.ts
│ │ │ │ └── svc.ts
│ │ │ └── sections/
│ │ │ ├── SearchCard.tsx
│ │ │ └── SearchUI.tsx
│ │ ├── hooks/
│ │ │ ├── __tests__/
│ │ │ │ └── useShowOnboarding.test.tsx
│ │ │ ├── appNavigation.ts
│ │ │ ├── formHooks.ts
│ │ │ ├── useAdminPersonas.ts
│ │ │ ├── useAdminUsers.ts
│ │ │ ├── useAgentController.ts
│ │ │ ├── useAgentPreferences.ts
│ │ │ ├── useAgents.ts
│ │ │ ├── useAppFocus.ts
│ │ │ ├── useAuthTypeMetadata.ts
│ │ │ ├── useAvailableTools.ts
│ │ │ ├── useBillingInformation.ts
│ │ │ ├── useBoundingBox.ts
│ │ │ ├── useBrowserInfo.ts
│ │ │ ├── useCCPairs.ts
│ │ │ ├── useChatController.ts
│ │ │ ├── useChatSessionController.ts
│ │ │ ├── useChatSessions.ts
│ │ │ ├── useClickOutside.ts
│ │ │ ├── useCloudSubscription.ts
│ │ │ ├── useCodeInterpreter.ts
│ │ │ ├── useContainerCenter.ts
│ │ │ ├── useContentSize.ts
│ │ │ ├── useCurrentUser.ts
│ │ │ ├── useDeepResearchToggle.ts
│ │ │ ├── useFederatedOAuthStatus.ts
│ │ │ ├── useFeedbackController.ts
│ │ │ ├── useFilter.ts
│ │ │ ├── useGroups.ts
│ │ │ ├── useImageDropzone.ts
│ │ │ ├── useIsDefaultAgent.ts
│ │ │ ├── useKeyPress.ts
│ │ │ ├── useLLMProviders.ts
│ │ │ ├── useLicense.ts
│ │ │ ├── useMcpServers.ts
│ │ │ ├── useMcpServersForAgentEditor.ts
│ │ │ ├── useMemoryManager.ts
│ │ │ ├── useOnMount.ts
│ │ │ ├── useOpenApiTools.ts
│ │ │ ├── usePaginatedFetch.ts
│ │ │ ├── usePromptShortcuts.ts
│ │ │ ├── useScimToken.ts
│ │ │ ├── useScreenSize.ts
│ │ │ ├── useServerTools.ts
│ │ │ ├── useSettings.test.ts
│ │ │ ├── useSettings.ts
│ │ │ ├── useShareableGroups.ts
│ │ │ ├── useShareableUsers.ts
│ │ │ ├── useShowOnboarding.ts
│ │ │ ├── useTags.ts
│ │ │ ├── useToast.ts
│ │ │ ├── useTokenRefresh.ts
│ │ │ ├── useUserCounts.ts
│ │ │ ├── useUserPersonalization.ts
│ │ │ ├── useUsers.ts
│ │ │ ├── useVoicePlayback.ts
│ │ │ ├── useVoiceProviders.ts
│ │ │ ├── useVoiceRecorder.ts
│ │ │ ├── useVoiceStatus.ts
│ │ │ └── useWebSocket.ts
│ │ ├── instrumentation-client.ts
│ │ ├── instrumentation.ts
│ │ ├── interfaces/
│ │ │ ├── llm.ts
│ │ │ ├── onboarding.ts
│ │ │ └── settings.ts
│ │ ├── layouts/
│ │ │ ├── actions-layouts.tsx
│ │ │ ├── app-layouts.tsx
│ │ │ ├── expandable-card-layouts.tsx
│ │ │ ├── general-layouts.tsx
│ │ │ ├── input-layouts.tsx
│ │ │ ├── settings-layouts.tsx
│ │ │ └── table-layouts.tsx
│ │ ├── lib/
│ │ │ ├── admin/
│ │ │ │ ├── users/
│ │ │ │ │ └── userMutationFetcher.ts
│ │ │ │ └── voice/
│ │ │ │ └── svc.ts
│ │ │ ├── admin-routes.ts
│ │ │ ├── agents.ts
│ │ │ ├── agentsSS.ts
│ │ │ ├── analytics.ts
│ │ │ ├── appSidebarSS.ts
│ │ │ ├── auth/
│ │ │ │ ├── redirectValidation.ts
│ │ │ │ └── requireAuth.ts
│ │ │ ├── azureTargetUri.ts
│ │ │ ├── billing/
│ │ │ │ ├── index.ts
│ │ │ │ ├── interfaces.ts
│ │ │ │ ├── svc.test.ts
│ │ │ │ └── svc.ts
│ │ │ ├── browserUtilities.tsx
│ │ │ ├── build/
│ │ │ │ └── client.ts
│ │ │ ├── ccPair.ts
│ │ │ ├── chat/
│ │ │ │ ├── fetchAgentData.ts
│ │ │ │ ├── fetchBackendChatSessionSS.ts
│ │ │ │ ├── greetingMessages.ts
│ │ │ │ └── svc.ts
│ │ │ ├── clipboard.test.ts
│ │ │ ├── clipboard.ts
│ │ │ ├── connector.ts
│ │ │ ├── connectors/
│ │ │ │ ├── AutoSyncOptionFields.tsx
│ │ │ │ ├── connectors.tsx
│ │ │ │ ├── credentials.ts
│ │ │ │ ├── fileTypes.ts
│ │ │ │ └── oauth.ts
│ │ │ ├── constants/
│ │ │ │ └── chatBackgrounds.ts
│ │ │ ├── constants.ts
│ │ │ ├── contains.ts
│ │ │ ├── credential.ts
│ │ │ ├── dateUtils.ts
│ │ │ ├── documentDeletion.ts
│ │ │ ├── documentUtils.ts
│ │ │ ├── download.ts
│ │ │ ├── drag/
│ │ │ │ └── constants.ts
│ │ │ ├── error.ts
│ │ │ ├── extension/
│ │ │ │ ├── constants.ts
│ │ │ │ └── utils.ts
│ │ │ ├── fetchUtils.ts
│ │ │ ├── fetcher.ts
│ │ │ ├── fileConnector.ts
│ │ │ ├── filters.ts
│ │ │ ├── generated/
│ │ │ │ └── README.md
│ │ │ ├── gmail.ts
│ │ │ ├── googleConnector.ts
│ │ │ ├── googleDrive.ts
│ │ │ ├── headers/
│ │ │ │ └── fetchHeaderDataSS.ts
│ │ │ ├── hierarchy/
│ │ │ │ ├── interfaces.ts
│ │ │ │ └── svc.ts
│ │ │ ├── hooks/
│ │ │ │ ├── useCaptcha.ts
│ │ │ │ ├── useCustomAnalyticsEnabled.ts
│ │ │ │ ├── useDocumentSets.ts
│ │ │ │ ├── useForcedTools.ts
│ │ │ │ ├── useLLMProviderOptions.ts
│ │ │ │ ├── useLLMProviders.test.ts
│ │ │ │ ├── useProjects.ts
│ │ │ │ └── useToolOAuthStatus.ts
│ │ │ ├── hooks.llmResolver.test.ts
│ │ │ ├── hooks.ts
│ │ │ ├── indexAttempt.ts
│ │ │ ├── languages.test.ts
│ │ │ ├── languages.ts
│ │ │ ├── llmConfig/
│ │ │ │ ├── cache.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── providers.ts
│ │ │ │ ├── svc.ts
│ │ │ │ ├── utils.ts
│ │ │ │ └── visionLLM.ts
│ │ │ ├── oauth/
│ │ │ │ └── api.ts
│ │ │ ├── oauth_utils.ts
│ │ │ ├── redirectSS.ts
│ │ │ ├── search/
│ │ │ │ ├── interfaces.ts
│ │ │ │ ├── streamingUtils.ts
│ │ │ │ ├── utils.ts
│ │ │ │ └── utilsSS.ts
│ │ │ ├── sources.ts
│ │ │ ├── streamingTTS.ts
│ │ │ ├── swr-keys.ts
│ │ │ ├── time.ts
│ │ │ ├── tools/
│ │ │ │ ├── fetchTools.ts
│ │ │ │ ├── interfaces.ts
│ │ │ │ ├── mcpService.ts
│ │ │ │ ├── mcpUtils.tsx
│ │ │ │ └── openApiService.ts
│ │ │ ├── types.ts
│ │ │ ├── typingUtils.ts
│ │ │ ├── updateSlackBotField.ts
│ │ │ ├── urlBuilder.ts
│ │ │ ├── user.test.ts
│ │ │ ├── user.ts
│ │ │ ├── userSS.ts
│ │ │ ├── userSettings.ts
│ │ │ ├── utils.test.ts
│ │ │ ├── utils.ts
│ │ │ ├── utilsSS.ts
│ │ │ └── version.ts
│ │ ├── providers/
│ │ │ ├── AppBackgroundProvider.tsx
│ │ │ ├── AppProvider.tsx
│ │ │ ├── AppSidebarProvider.tsx
│ │ │ ├── CustomAnalyticsScript.tsx
│ │ │ ├── DynamicMetadata.tsx
│ │ │ ├── ProductGatingWrapper.tsx
│ │ │ ├── ProjectsContext.tsx
│ │ │ ├── QueryControllerProvider.tsx
│ │ │ ├── SWRConfigProvider.tsx
│ │ │ ├── SettingsProvider.tsx
│ │ │ ├── ToastProvider.tsx
│ │ │ ├── UserProvider.tsx
│ │ │ ├── VoiceModeProvider.tsx
│ │ │ └── __tests__/
│ │ │ └── ProjectsContext.test.tsx
│ │ ├── proxy.ts
│ │ ├── refresh-components/
│ │ │ ├── Attachment.stories.tsx
│ │ │ ├── Attachment.tsx
│ │ │ ├── Calendar.stories.tsx
│ │ │ ├── Calendar.tsx
│ │ │ ├── CharacterCount.stories.tsx
│ │ │ ├── CharacterCount.tsx
│ │ │ ├── Chip.stories.tsx
│ │ │ ├── Chip.tsx
│ │ │ ├── Code.stories.tsx
│ │ │ ├── Code.tsx
│ │ │ ├── Collapsible.stories.tsx
│ │ │ ├── Collapsible.tsx
│ │ │ ├── ColorSwatch.stories.tsx
│ │ │ ├── ColorSwatch.tsx
│ │ │ ├── ConnectionProviderIcon.stories.tsx
│ │ │ ├── ConnectionProviderIcon.tsx
│ │ │ ├── Divider.stories.tsx
│ │ │ ├── Divider.tsx
│ │ │ ├── EmptyMessage.stories.tsx
│ │ │ ├── EmptyMessage.tsx
│ │ │ ├── EnabledCount.stories.tsx
│ │ │ ├── EnabledCount.tsx
│ │ │ ├── FadingEdgeContainer.stories.tsx
│ │ │ ├── FadingEdgeContainer.tsx
│ │ │ ├── FrostedDiv.stories.tsx
│ │ │ ├── FrostedDiv.tsx
│ │ │ ├── InlineExternalLink.stories.tsx
│ │ │ ├── InlineExternalLink.tsx
│ │ │ ├── Logo.tsx
│ │ │ ├── Modal.stories.tsx
│ │ │ ├── Modal.tsx
│ │ │ ├── OverflowDiv.stories.tsx
│ │ │ ├── OverflowDiv.tsx
│ │ │ ├── Popover.stories.tsx
│ │ │ ├── Popover.tsx
│ │ │ ├── PreviewImage.stories.tsx
│ │ │ ├── PreviewImage.tsx
│ │ │ ├── ScrollIndicatorDiv.stories.tsx
│ │ │ ├── ScrollIndicatorDiv.tsx
│ │ │ ├── Separator.stories.tsx
│ │ │ ├── Separator.tsx
│ │ │ ├── ShadowDiv.stories.tsx
│ │ │ ├── ShadowDiv.tsx
│ │ │ ├── SimpleCollapsible.stories.tsx
│ │ │ ├── SimpleCollapsible.tsx
│ │ │ ├── SimplePopover.stories.tsx
│ │ │ ├── SimplePopover.tsx
│ │ │ ├── SimpleTabs.stories.tsx
│ │ │ ├── SimpleTabs.tsx
│ │ │ ├── SimpleTooltip.stories.tsx
│ │ │ ├── SimpleTooltip.tsx
│ │ │ ├── Spacer.stories.tsx
│ │ │ ├── Spacer.tsx
│ │ │ ├── Tabs.stories.tsx
│ │ │ ├── Tabs.tsx
│ │ │ ├── TextSeparator.stories.tsx
│ │ │ ├── TextSeparator.tsx
│ │ │ ├── avatars/
│ │ │ │ ├── AgentAvatar.tsx
│ │ │ │ ├── CustomAgentAvatar.stories.tsx
│ │ │ │ ├── CustomAgentAvatar.tsx
│ │ │ │ └── UserAvatar.tsx
│ │ │ ├── buttons/
│ │ │ │ ├── AttachmentButton.stories.tsx
│ │ │ │ ├── AttachmentButton.tsx
│ │ │ │ ├── BackButton.stories.tsx
│ │ │ │ ├── BackButton.tsx
│ │ │ │ ├── Button.stories.tsx
│ │ │ │ ├── Button.tsx
│ │ │ │ ├── ButtonRenaming.stories.tsx
│ │ │ │ ├── ButtonRenaming.tsx
│ │ │ │ ├── CopyIconButton.stories.tsx
│ │ │ │ ├── CopyIconButton.tsx
│ │ │ │ ├── CreateButton.stories.tsx
│ │ │ │ ├── CreateButton.tsx
│ │ │ │ ├── IconButton.stories.tsx
│ │ │ │ ├── IconButton.tsx
│ │ │ │ ├── LineItem.stories.tsx
│ │ │ │ ├── LineItem.tsx
│ │ │ │ ├── SelectButton.stories.tsx
│ │ │ │ ├── SelectButton.tsx
│ │ │ │ ├── SquareButton.stories.tsx
│ │ │ │ ├── SquareButton.tsx
│ │ │ │ ├── Tag.stories.tsx
│ │ │ │ ├── Tag.tsx
│ │ │ │ └── source-tag/
│ │ │ │ ├── SourceTag.tsx
│ │ │ │ ├── SourceTagDetailsCard.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── sourceTagUtils.ts
│ │ │ ├── cards/
│ │ │ │ ├── Card.stories.tsx
│ │ │ │ ├── Card.tsx
│ │ │ │ └── index.ts
│ │ │ ├── commandmenu/
│ │ │ │ ├── CommandMenu.stories.tsx
│ │ │ │ ├── CommandMenu.test.tsx
│ │ │ │ ├── CommandMenu.tsx
│ │ │ │ └── types.ts
│ │ │ ├── contexts/
│ │ │ │ └── ModalContext.tsx
│ │ │ ├── form/
│ │ │ │ ├── CheckboxField.tsx
│ │ │ │ ├── FieldContext.tsx
│ │ │ │ ├── FormField.stories.tsx
│ │ │ │ ├── FormField.tsx
│ │ │ │ ├── FormikField.tsx
│ │ │ │ ├── FormikFields.stories.tsx
│ │ │ │ ├── InputDatePickerField.tsx
│ │ │ │ ├── InputSelectField.tsx
│ │ │ │ ├── InputTextAreaField.tsx
│ │ │ │ ├── InputTypeInElementField.tsx
│ │ │ │ ├── InputTypeInField.tsx
│ │ │ │ ├── Label.stories.tsx
│ │ │ │ ├── Label.tsx
│ │ │ │ ├── LabeledCheckboxField.tsx
│ │ │ │ ├── PasswordInputTypeInField.tsx
│ │ │ │ ├── SwitchField.tsx
│ │ │ │ └── types.ts
│ │ │ ├── inputs/
│ │ │ │ ├── Checkbox.stories.tsx
│ │ │ │ ├── Checkbox.test.tsx
│ │ │ │ ├── Checkbox.tsx
│ │ │ │ ├── InputAvatar.stories.tsx
│ │ │ │ ├── InputAvatar.tsx
│ │ │ │ ├── InputChipField.stories.tsx
│ │ │ │ ├── InputChipField.tsx
│ │ │ │ ├── InputComboBox/
│ │ │ │ │ ├── InputComboBox.stories.tsx
│ │ │ │ │ ├── InputComboBox.test.tsx
│ │ │ │ │ ├── InputComboBox.tsx
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── ComboBoxDropdown.tsx
│ │ │ │ │ │ ├── OptionItem.tsx
│ │ │ │ │ │ └── OptionsList.tsx
│ │ │ │ │ ├── hooks.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── aria.ts
│ │ │ │ │ └── validation.ts
│ │ │ │ ├── InputDatePicker.stories.tsx
│ │ │ │ ├── InputDatePicker.tsx
│ │ │ │ ├── InputFile.stories.tsx
│ │ │ │ ├── InputFile.tsx
│ │ │ │ ├── InputImage.stories.tsx
│ │ │ │ ├── InputImage.tsx
│ │ │ │ ├── InputKeyValue.stories.tsx
│ │ │ │ ├── InputKeyValue.tsx
│ │ │ │ ├── InputNumber.stories.tsx
│ │ │ │ ├── InputNumber.tsx
│ │ │ │ ├── InputSearch.stories.tsx
│ │ │ │ ├── InputSearch.tsx
│ │ │ │ ├── InputSelect.stories.tsx
│ │ │ │ ├── InputSelect.tsx
│ │ │ │ ├── InputTextArea.stories.tsx
│ │ │ │ ├── InputTextArea.tsx
│ │ │ │ ├── InputTypeIn.stories.tsx
│ │ │ │ ├── InputTypeIn.tsx
│ │ │ │ ├── ListFieldInput.stories.tsx
│ │ │ │ ├── ListFieldInput.tsx
│ │ │ │ ├── PasswordInputTypeIn.stories.tsx
│ │ │ │ ├── PasswordInputTypeIn.test.ts
│ │ │ │ ├── PasswordInputTypeIn.tsx
│ │ │ │ ├── Switch.stories.tsx
│ │ │ │ ├── Switch.tsx
│ │ │ │ └── styles.ts
│ │ │ ├── layouts/
│ │ │ │ ├── ConfirmationModalLayout.stories.tsx
│ │ │ │ └── ConfirmationModalLayout.tsx
│ │ │ ├── loaders/
│ │ │ │ ├── SimpleLoader.stories.tsx
│ │ │ │ └── SimpleLoader.tsx
│ │ │ ├── messages/
│ │ │ │ ├── FieldMessage.stories.tsx
│ │ │ │ ├── FieldMessage.tsx
│ │ │ │ ├── InfoBlock.stories.tsx
│ │ │ │ ├── InfoBlock.tsx
│ │ │ │ ├── Message.stories.tsx
│ │ │ │ └── Message.tsx
│ │ │ ├── modals/
│ │ │ │ └── MemoriesModal.tsx
│ │ │ ├── popovers/
│ │ │ │ ├── ActionsPopover/
│ │ │ │ │ ├── ActionLineItem.tsx
│ │ │ │ │ ├── MCPLineItem.tsx
│ │ │ │ │ ├── SwitchList.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── FilePickerPopover.tsx
│ │ │ │ ├── LLMPopover.test.tsx
│ │ │ │ ├── LLMPopover.tsx
│ │ │ │ └── interfaces.ts
│ │ │ ├── skeletons/
│ │ │ │ ├── ChatSessionSkeleton.stories.tsx
│ │ │ │ ├── ChatSessionSkeleton.tsx
│ │ │ │ ├── SidebarTabSkeleton.stories.tsx
│ │ │ │ └── SidebarTabSkeleton.tsx
│ │ │ ├── texts/
│ │ │ │ ├── ExpandableTextDisplay.stories.tsx
│ │ │ │ ├── ExpandableTextDisplay.tsx
│ │ │ │ ├── Text.stories.tsx
│ │ │ │ ├── Text.tsx
│ │ │ │ ├── Truncated.stories.tsx
│ │ │ │ └── Truncated.tsx
│ │ │ └── tiles/
│ │ │ ├── ButtonTile.stories.tsx
│ │ │ ├── ButtonTile.tsx
│ │ │ ├── FileTile.stories.tsx
│ │ │ └── FileTile.tsx
│ │ ├── refresh-pages/
│ │ │ ├── AgentEditorPage.tsx
│ │ │ ├── AgentsNavigationPage.tsx
│ │ │ ├── AppPage.tsx
│ │ │ ├── SettingsPage.tsx
│ │ │ └── admin/
│ │ │ ├── AgentsPage/
│ │ │ │ ├── AgentRowActions.tsx
│ │ │ │ ├── AgentsTable.tsx
│ │ │ │ ├── interfaces.ts
│ │ │ │ └── svc.ts
│ │ │ ├── AgentsPage.tsx
│ │ │ ├── ChatPreferencesPage.tsx
│ │ │ ├── CodeInterpreterPage/
│ │ │ │ ├── index.tsx
│ │ │ │ └── svc.ts
│ │ │ ├── GroupsPage/
│ │ │ │ ├── CreateGroupPage.tsx
│ │ │ │ ├── EditGroupPage.tsx
│ │ │ │ ├── GroupCard.tsx
│ │ │ │ ├── GroupsList.tsx
│ │ │ │ ├── SharedGroupResources/
│ │ │ │ │ ├── ResourceContent.tsx
│ │ │ │ │ ├── ResourcePopover.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── interfaces.ts
│ │ │ │ ├── TokenLimitSection.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ ├── interfaces.ts
│ │ │ │ ├── shared.tsx
│ │ │ │ ├── svc.ts
│ │ │ │ └── utils.ts
│ │ │ ├── ImageGenerationPage/
│ │ │ │ ├── ImageGenerationContent.tsx
│ │ │ │ ├── constants.ts
│ │ │ │ ├── forms/
│ │ │ │ │ ├── AzureImageGenForm.tsx
│ │ │ │ │ ├── ImageGenFormWrapper.tsx
│ │ │ │ │ ├── OpenAIImageGenForm.tsx
│ │ │ │ │ ├── VertexImageGenForm.tsx
│ │ │ │ │ ├── getImageGenForm.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── index.tsx
│ │ │ │ └── svc.ts
│ │ │ ├── LLMConfigurationPage.tsx
│ │ │ ├── ServiceAccountsPage/
│ │ │ │ ├── ApiKeyFormModal.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ ├── interfaces.ts
│ │ │ │ └── svc.ts
│ │ │ ├── UsersPage/
│ │ │ │ ├── EditUserModal.tsx
│ │ │ │ ├── GroupsCell.tsx
│ │ │ │ ├── InviteUsersModal.tsx
│ │ │ │ ├── UserActionModals.tsx
│ │ │ │ ├── UserFilters.tsx
│ │ │ │ ├── UserRoleCell.tsx
│ │ │ │ ├── UserRowActions.tsx
│ │ │ │ ├── UsersSummary.tsx
│ │ │ │ ├── UsersTable.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ ├── interfaces.ts
│ │ │ │ └── svc.ts
│ │ │ ├── VoiceConfigurationPage.tsx
│ │ │ └── WebSearchPage/
│ │ │ ├── WebProviderModalReducer.ts
│ │ │ ├── WebProviderSetupModal.tsx
│ │ │ ├── connectProviderFlow.ts
│ │ │ ├── contentProviderUtils.ts
│ │ │ ├── index.tsx
│ │ │ ├── interfaces.ts
│ │ │ ├── searchProviderUtils.ts
│ │ │ └── svc.ts
│ │ ├── sections/
│ │ │ ├── AppHealthBanner.tsx
│ │ │ ├── Suggestions.tsx
│ │ │ ├── actions/
│ │ │ │ ├── ActionCard.tsx
│ │ │ │ ├── ActionCardContext.tsx
│ │ │ │ ├── ActionCardHeader.tsx
│ │ │ │ ├── Actions.tsx
│ │ │ │ ├── MCPActionCard.tsx
│ │ │ │ ├── MCPPageContent.tsx
│ │ │ │ ├── OpenApiActionCard.tsx
│ │ │ │ ├── OpenApiPageContent.tsx
│ │ │ │ ├── PerUserAuthConfig.tsx
│ │ │ │ ├── ToolItem.tsx
│ │ │ │ ├── ToolsList.tsx
│ │ │ │ ├── ToolsSection.tsx
│ │ │ │ ├── modals/
│ │ │ │ │ ├── AddMCPServerModal.tsx
│ │ │ │ │ ├── AddOpenAPIActionModal.tsx
│ │ │ │ │ ├── DisconnectEntityModal.tsx
│ │ │ │ │ ├── MCPAuthenticationModal.tsx
│ │ │ │ │ └── OpenAPIAuthenticationModal.tsx
│ │ │ │ └── skeleton/
│ │ │ │ ├── ActionCardSkeleton.tsx
│ │ │ │ └── ToolItemSkeleton.tsx
│ │ │ ├── admin/
│ │ │ │ ├── AdminListHeader.tsx
│ │ │ │ └── ProviderCard.tsx
│ │ │ ├── cards/
│ │ │ │ ├── AgentCard.tsx
│ │ │ │ ├── DocumentSetCard.tsx
│ │ │ │ ├── FileCard.tsx
│ │ │ │ └── README.md
│ │ │ ├── chat/
│ │ │ │ ├── ChatScrollContainer.tsx
│ │ │ │ └── ChatUI.tsx
│ │ │ ├── document-sidebar/
│ │ │ │ ├── ChatDocumentDisplay.tsx
│ │ │ │ └── DocumentsSidebar.tsx
│ │ │ ├── input/
│ │ │ │ ├── AppInputBar.tsx
│ │ │ │ ├── MicrophoneButton.tsx
│ │ │ │ └── SharedAppInputBar.tsx
│ │ │ ├── knowledge/
│ │ │ │ ├── AgentKnowledgePane.tsx
│ │ │ │ └── SourceHierarchyBrowser.tsx
│ │ │ ├── modals/
│ │ │ │ ├── AgentViewerModal.tsx
│ │ │ │ ├── FeedbackModal.tsx
│ │ │ │ ├── NewTenantModal.tsx
│ │ │ │ ├── PreviewModal/
│ │ │ │ │ ├── ExceptionTraceModal.tsx
│ │ │ │ │ ├── FloatingFooter.tsx
│ │ │ │ │ ├── PreviewModal.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── interfaces.ts
│ │ │ │ │ └── variants/
│ │ │ │ │ ├── CodePreview.tsx
│ │ │ │ │ ├── codeVariant.tsx
│ │ │ │ │ ├── csvVariant.tsx
│ │ │ │ │ ├── dataVariant.tsx
│ │ │ │ │ ├── docxVariant.tsx
│ │ │ │ │ ├── imageVaria
================================================
FILE CONTENTS
================================================
================================================
FILE: .git-blame-ignore-revs
================================================
# Exclude these commits from git blame (e.g. mass reformatting).
# These are ignored by GitHub automatically.
# To enable this locally, run:
#
# git config blame.ignoreRevsFile .git-blame-ignore-revs
3134e5f840c12c8f32613ce520101a047c89dcc2 # refactor(whitespace): rm temporary react fragments (#7161)
ed3f72bc75f3e3a9ae9e4d8cd38278f9c97e78b4 # refactor(whitespace): rm react fragment #7190
7b927e79c25f4ddfd18a067f489e122acd2c89de # chore(format): format files where `ruff` and `black` agree (#9339)
================================================
FILE: .github/CODEOWNERS
================================================
* @onyx-dot-app/onyx-core-team
# Helm charts Owners
/helm/ @justin-tahara
# Web standards updates
/web/STANDARDS.md @raunakab @Weves
# Agent context files
/CLAUDE.md @Weves
/AGENTS.md @Weves
# Beta cherry-pick workflow owners
/.github/workflows/post-merge-beta-cherry-pick.yml @justin-tahara @jmelahman
================================================
FILE: .github/actionlint.yml
================================================
self-hosted-runner:
# Labels of self-hosted runner in array of strings.
labels:
- extras=ecr-cache
- extras=s3-cache
- hdd=256
- runs-on
- runner=1cpu-linux-arm64
- runner=1cpu-linux-x64
- runner=2cpu-linux-arm64
- runner=2cpu-linux-x64
- runner=4cpu-linux-arm64
- runner=4cpu-linux-x64
- runner=8cpu-linux-arm64
- runner=8cpu-linux-x64
- runner=16cpu-linux-arm64
- runner=16cpu-linux-x64
- ubuntu-slim # Currently in public preview
- volume=40gb
- volume=50gb
# Configuration variables in array of strings defined in your repository or
# organization. `null` means disabling configuration variables check.
# Empty array means no configuration variable is allowed.
config-variables: null
# Configuration for file paths. The keys are glob patterns to match to file
# paths relative to the repository root. The values are the configurations for
# the file paths. Note that the path separator is always '/'.
# The following configurations are available.
#
# "ignore" is an array of regular expression patterns. Matched error messages
# are ignored. This is similar to the "-ignore" command line option.
paths:
# Glob pattern relative to the repository root for matching files. The path separator is always '/'.
# This example configures any YAML file under the '.github/workflows/' directory.
.github/workflows/**/*.{yml,yaml}:
# TODO: These are real and should be fixed eventually.
ignore:
- 'shellcheck reported issue in this script: SC2038:.+'
- 'shellcheck reported issue in this script: SC2046:.+'
- 'shellcheck reported issue in this script: SC2086:.+'
- 'shellcheck reported issue in this script: SC2193:.+'
================================================
FILE: .github/actions/build-backend-image/action.yml
================================================
name: "Build Backend Image"
description: "Builds and pushes the backend Docker image with cache reuse"
inputs:
runs-on-ecr-cache:
description: "ECR cache registry from runs-on/action"
required: true
ref-name:
description: "Git ref name used for cache suffix fallback"
required: true
pr-number:
description: "Optional PR number for cache suffix"
required: false
default: ""
github-sha:
description: "Commit SHA used for cache keys"
required: true
run-id:
description: "GitHub run ID used in output image tag"
required: true
docker-username:
description: "Docker Hub username"
required: true
docker-token:
description: "Docker Hub token"
required: true
docker-no-cache:
description: "Set to 'true' to disable docker build cache"
required: false
default: "false"
runs:
using: "composite"
steps:
- name: Format branch name for cache
id: format-branch
shell: bash
env:
PR_NUMBER: ${{ inputs.pr-number }}
REF_NAME: ${{ inputs.ref-name }}
run: |
if [ -n "${PR_NUMBER}" ]; then
CACHE_SUFFIX="${PR_NUMBER}"
else
# shellcheck disable=SC2001
CACHE_SUFFIX=$(echo "${REF_NAME}" | sed 's/[^A-Za-z0-9._-]/-/g')
fi
echo "cache-suffix=${CACHE_SUFFIX}" >> "$GITHUB_OUTPUT"
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ inputs.docker-username }}
password: ${{ inputs.docker-token }}
- name: Build and push Backend Docker image
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./backend
file: ./backend/Dockerfile
push: true
tags: ${{ inputs.runs-on-ecr-cache }}:nightly-llm-it-backend-${{ inputs.run-id }}
cache-from: |
type=registry,ref=${{ inputs.runs-on-ecr-cache }}:backend-cache-${{ inputs.github-sha }}
type=registry,ref=${{ inputs.runs-on-ecr-cache }}:backend-cache-${{ steps.format-branch.outputs.cache-suffix }}
type=registry,ref=${{ inputs.runs-on-ecr-cache }}:backend-cache
type=registry,ref=onyxdotapp/onyx-backend:latest
cache-to: |
type=registry,ref=${{ inputs.runs-on-ecr-cache }}:backend-cache-${{ inputs.github-sha }},mode=max
type=registry,ref=${{ inputs.runs-on-ecr-cache }}:backend-cache-${{ steps.format-branch.outputs.cache-suffix }},mode=max
type=registry,ref=${{ inputs.runs-on-ecr-cache }}:backend-cache,mode=max
no-cache: ${{ inputs.docker-no-cache == 'true' }}
================================================
FILE: .github/actions/build-integration-image/action.yml
================================================
name: "Build Integration Image"
description: "Builds and pushes the integration test image with docker bake"
inputs:
runs-on-ecr-cache:
description: "ECR cache registry from runs-on/action"
required: true
ref-name:
description: "Git ref name used for cache suffix fallback"
required: true
pr-number:
description: "Optional PR number for cache suffix"
required: false
default: ""
github-sha:
description: "Commit SHA used for cache keys"
required: true
run-id:
description: "GitHub run ID used in output image tag"
required: true
docker-username:
description: "Docker Hub username"
required: true
docker-token:
description: "Docker Hub token"
required: true
runs:
using: "composite"
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ inputs.docker-username }}
password: ${{ inputs.docker-token }}
- name: Format branch name for cache
id: format-branch
shell: bash
env:
PR_NUMBER: ${{ inputs.pr-number }}
REF_NAME: ${{ inputs.ref-name }}
run: |
if [ -n "${PR_NUMBER}" ]; then
CACHE_SUFFIX="${PR_NUMBER}"
else
# shellcheck disable=SC2001
CACHE_SUFFIX=$(echo "${REF_NAME}" | sed 's/[^A-Za-z0-9._-]/-/g')
fi
echo "cache-suffix=${CACHE_SUFFIX}" >> "$GITHUB_OUTPUT"
- name: Build and push integration test image with Docker Bake
shell: bash
env:
RUNS_ON_ECR_CACHE: ${{ inputs.runs-on-ecr-cache }}
INTEGRATION_REPOSITORY: ${{ inputs.runs-on-ecr-cache }}
TAG: nightly-llm-it-${{ inputs.run-id }}
CACHE_SUFFIX: ${{ steps.format-branch.outputs.cache-suffix }}
HEAD_SHA: ${{ inputs.github-sha }}
run: |
docker buildx bake --push \
--set backend.cache-from=type=registry,ref=${RUNS_ON_ECR_CACHE}:backend-cache-${HEAD_SHA} \
--set backend.cache-from=type=registry,ref=${RUNS_ON_ECR_CACHE}:backend-cache-${CACHE_SUFFIX} \
--set backend.cache-from=type=registry,ref=${RUNS_ON_ECR_CACHE}:backend-cache \
--set backend.cache-from=type=registry,ref=onyxdotapp/onyx-backend:latest \
--set backend.cache-to=type=registry,ref=${RUNS_ON_ECR_CACHE}:backend-cache-${HEAD_SHA},mode=max \
--set backend.cache-to=type=registry,ref=${RUNS_ON_ECR_CACHE}:backend-cache-${CACHE_SUFFIX},mode=max \
--set backend.cache-to=type=registry,ref=${RUNS_ON_ECR_CACHE}:backend-cache,mode=max \
--set integration.cache-from=type=registry,ref=${RUNS_ON_ECR_CACHE}:integration-cache-${HEAD_SHA} \
--set integration.cache-from=type=registry,ref=${RUNS_ON_ECR_CACHE}:integration-cache-${CACHE_SUFFIX} \
--set integration.cache-from=type=registry,ref=${RUNS_ON_ECR_CACHE}:integration-cache \
--set integration.cache-to=type=registry,ref=${RUNS_ON_ECR_CACHE}:integration-cache-${HEAD_SHA},mode=max \
--set integration.cache-to=type=registry,ref=${RUNS_ON_ECR_CACHE}:integration-cache-${CACHE_SUFFIX},mode=max \
--set integration.cache-to=type=registry,ref=${RUNS_ON_ECR_CACHE}:integration-cache,mode=max \
integration
================================================
FILE: .github/actions/build-model-server-image/action.yml
================================================
name: "Build Model Server Image"
description: "Builds and pushes the model server Docker image with cache reuse"
inputs:
runs-on-ecr-cache:
description: "ECR cache registry from runs-on/action"
required: true
ref-name:
description: "Git ref name used for cache suffix fallback"
required: true
pr-number:
description: "Optional PR number for cache suffix"
required: false
default: ""
github-sha:
description: "Commit SHA used for cache keys"
required: true
run-id:
description: "GitHub run ID used in output image tag"
required: true
docker-username:
description: "Docker Hub username"
required: true
docker-token:
description: "Docker Hub token"
required: true
runs:
using: "composite"
steps:
- name: Format branch name for cache
id: format-branch
shell: bash
env:
PR_NUMBER: ${{ inputs.pr-number }}
REF_NAME: ${{ inputs.ref-name }}
run: |
if [ -n "${PR_NUMBER}" ]; then
CACHE_SUFFIX="${PR_NUMBER}"
else
# shellcheck disable=SC2001
CACHE_SUFFIX=$(echo "${REF_NAME}" | sed 's/[^A-Za-z0-9._-]/-/g')
fi
echo "cache-suffix=${CACHE_SUFFIX}" >> "$GITHUB_OUTPUT"
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ inputs.docker-username }}
password: ${{ inputs.docker-token }}
- name: Build and push Model Server Docker image
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./backend
file: ./backend/Dockerfile.model_server
push: true
tags: ${{ inputs.runs-on-ecr-cache }}:nightly-llm-it-model-server-${{ inputs.run-id }}
cache-from: |
type=registry,ref=${{ inputs.runs-on-ecr-cache }}:model-server-cache-${{ inputs.github-sha }}
type=registry,ref=${{ inputs.runs-on-ecr-cache }}:model-server-cache-${{ steps.format-branch.outputs.cache-suffix }}
type=registry,ref=${{ inputs.runs-on-ecr-cache }}:model-server-cache
type=registry,ref=onyxdotapp/onyx-model-server:latest
cache-to: |
type=registry,ref=${{ inputs.runs-on-ecr-cache }}:model-server-cache-${{ inputs.github-sha }},mode=max
type=registry,ref=${{ inputs.runs-on-ecr-cache }}:model-server-cache-${{ steps.format-branch.outputs.cache-suffix }},mode=max
type=registry,ref=${{ inputs.runs-on-ecr-cache }}:model-server-cache,mode=max
================================================
FILE: .github/actions/run-nightly-provider-chat-test/action.yml
================================================
name: "Run Nightly Provider Chat Test"
description: "Starts required compose services and runs nightly provider integration test"
inputs:
provider:
description: "Provider slug for NIGHTLY_LLM_PROVIDER"
required: true
models:
description: "Comma-separated model list for NIGHTLY_LLM_MODELS"
required: true
provider-api-key:
description: "API key for NIGHTLY_LLM_API_KEY"
required: false
default: ""
strict:
description: "String true/false for NIGHTLY_LLM_STRICT"
required: true
api-base:
description: "Optional NIGHTLY_LLM_API_BASE"
required: false
default: ""
api-version:
description: "Optional NIGHTLY_LLM_API_VERSION"
required: false
default: ""
deployment-name:
description: "Optional NIGHTLY_LLM_DEPLOYMENT_NAME"
required: false
default: ""
custom-config-json:
description: "Optional NIGHTLY_LLM_CUSTOM_CONFIG_JSON"
required: false
default: ""
runs-on-ecr-cache:
description: "ECR cache registry from runs-on/action"
required: true
run-id:
description: "GitHub run ID used in image tags"
required: true
docker-username:
description: "Docker Hub username"
required: true
docker-token:
description: "Docker Hub token"
required: true
runs:
using: "composite"
steps:
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ inputs.docker-username }}
password: ${{ inputs.docker-token }}
- name: Create .env file for Docker Compose
shell: bash
env:
ECR_CACHE: ${{ inputs.runs-on-ecr-cache }}
RUN_ID: ${{ inputs.run-id }}
run: |
cat <<EOF2 > deployment/docker_compose/.env
COMPOSE_PROFILES=s3-filestore
ENABLE_PAID_ENTERPRISE_EDITION_FEATURES=true
LICENSE_ENFORCEMENT_ENABLED=false
AUTH_TYPE=basic
POSTGRES_POOL_PRE_PING=true
POSTGRES_USE_NULL_POOL=true
REQUIRE_EMAIL_VERIFICATION=false
DISABLE_TELEMETRY=true
INTEGRATION_TESTS_MODE=true
AUTO_LLM_UPDATE_INTERVAL_SECONDS=10
AWS_REGION_NAME=us-west-2
ONYX_BACKEND_IMAGE=${ECR_CACHE}:nightly-llm-it-backend-${RUN_ID}
ONYX_MODEL_SERVER_IMAGE=${ECR_CACHE}:nightly-llm-it-model-server-${RUN_ID}
EOF2
- name: Start Docker containers
shell: bash
run: |
cd deployment/docker_compose
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d --wait \
relational_db \
index \
cache \
minio \
api_server \
inference_model_server
- name: Run nightly provider integration test
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # ratchet:nick-fields/retry@v3
env:
MODELS: ${{ inputs.models }}
NIGHTLY_LLM_PROVIDER: ${{ inputs.provider }}
NIGHTLY_LLM_API_KEY: ${{ inputs.provider-api-key }}
NIGHTLY_LLM_API_BASE: ${{ inputs.api-base }}
NIGHTLY_LLM_API_VERSION: ${{ inputs.api-version }}
NIGHTLY_LLM_DEPLOYMENT_NAME: ${{ inputs.deployment-name }}
NIGHTLY_LLM_CUSTOM_CONFIG_JSON: ${{ inputs.custom-config-json }}
NIGHTLY_LLM_STRICT: ${{ inputs.strict }}
RUNS_ON_ECR_CACHE: ${{ inputs.runs-on-ecr-cache }}
RUN_ID: ${{ inputs.run-id }}
with:
timeout_minutes: 20
max_attempts: 2
retry_wait_seconds: 10
command: |
docker run --rm --network onyx_default \
--name test-runner \
-e POSTGRES_HOST=relational_db \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=password \
-e POSTGRES_DB=postgres \
-e DB_READONLY_USER=db_readonly_user \
-e DB_READONLY_PASSWORD=password \
-e POSTGRES_POOL_PRE_PING=true \
-e POSTGRES_USE_NULL_POOL=true \
-e VESPA_HOST=index \
-e REDIS_HOST=cache \
-e API_SERVER_HOST=api_server \
-e TEST_WEB_HOSTNAME=test-runner \
-e AWS_REGION_NAME=us-west-2 \
-e NIGHTLY_LLM_PROVIDER="${NIGHTLY_LLM_PROVIDER}" \
-e NIGHTLY_LLM_MODELS="${MODELS}" \
-e NIGHTLY_LLM_API_KEY="${NIGHTLY_LLM_API_KEY}" \
-e NIGHTLY_LLM_API_BASE="${NIGHTLY_LLM_API_BASE}" \
-e NIGHTLY_LLM_API_VERSION="${NIGHTLY_LLM_API_VERSION}" \
-e NIGHTLY_LLM_DEPLOYMENT_NAME="${NIGHTLY_LLM_DEPLOYMENT_NAME}" \
-e NIGHTLY_LLM_CUSTOM_CONFIG_JSON="${NIGHTLY_LLM_CUSTOM_CONFIG_JSON}" \
-e NIGHTLY_LLM_STRICT="${NIGHTLY_LLM_STRICT}" \
${RUNS_ON_ECR_CACHE}:nightly-llm-it-${RUN_ID} \
/app/tests/integration/tests/llm_workflows/test_nightly_provider_chat_workflow.py
================================================
FILE: .github/actions/setup-playwright/action.yml
================================================
name: "Setup Playwright"
description: "Sets up Playwright and system deps (assumes Python and Playwright are installed)"
runs:
using: "composite"
steps:
- name: Cache playwright cache
uses: runs-on/cache@50350ad4242587b6c8c2baa2e740b1bc11285ff4 # ratchet:runs-on/cache@v4
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-${{ runner.arch }}-playwright-${{ hashFiles('backend/requirements/default.txt') }}
restore-keys: |
${{ runner.os }}-${{ runner.arch }}-playwright-
- name: Install playwright
shell: bash
run: |
playwright install chromium --with-deps
================================================
FILE: .github/actions/setup-python-and-install-dependencies/action.yml
================================================
name: "Setup Python and Install Dependencies"
description: "Sets up Python with uv and installs deps"
inputs:
requirements:
description: "Newline-separated list of requirement files to install (relative to repo root)"
required: true
runs:
using: "composite"
steps:
- name: Compute requirements hash
id: req-hash
shell: bash
env:
REQUIREMENTS: ${{ inputs.requirements }}
run: |
# Hash the contents of the specified requirement files
hash=""
while IFS= read -r req; do
if [ -n "$req" ] && [ -f "$req" ]; then
hash="$hash$(sha256sum "$req")"
fi
done <<< "$REQUIREMENTS"
echo "hash=$(echo "$hash" | sha256sum | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"
# NOTE: This comes before Setup uv since clean-ups run in reverse chronological order
# such that Setup uv's prune-cache is able to prune the cache before we upload.
- name: Cache uv cache directory
uses: runs-on/cache@50350ad4242587b6c8c2baa2e740b1bc11285ff4 # ratchet:runs-on/cache@v4
with:
path: ~/.cache/uv
key: ${{ runner.os }}-uv-${{ steps.req-hash.outputs.hash }}
restore-keys: |
${{ runner.os }}-uv-
- name: Setup uv
uses: astral-sh/setup-uv@ed21f2f24f8dd64503750218de024bcf64c7250a # ratchet:astral-sh/setup-uv@v7
with:
version: "0.9.9"
# TODO: Enable caching once there is a uv.lock file checked in.
# with:
# enable-cache: true
- name: Setup Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # ratchet:actions/setup-python@v5
with:
python-version: "3.11"
- name: Create virtual environment
shell: bash
env:
VENV_DIR: ${{ runner.temp }}/venv
run: | # zizmor: ignore[github-env]
uv venv "$VENV_DIR"
# Validate path before adding to GITHUB_PATH to prevent code injection
if [ -d "$VENV_DIR/bin" ]; then
realpath "$VENV_DIR/bin" >> "$GITHUB_PATH"
else
echo "Error: $VENV_DIR/bin does not exist"
exit 1
fi
- name: Install Python dependencies with uv
shell: bash
env:
REQUIREMENTS: ${{ inputs.requirements }}
run: |
# Build the uv pip install command with each requirement file as array elements
cmd=("uv" "pip" "install")
while IFS= read -r req; do
# Skip empty lines
if [ -n "$req" ]; then
cmd+=("-r" "$req")
fi
done <<< "$REQUIREMENTS"
echo "Running: ${cmd[*]}"
"${cmd[@]}"
================================================
FILE: .github/actions/slack-notify/action.yml
================================================
name: "Slack Notify"
description: "Sends a Slack notification for workflow events"
inputs:
webhook-url:
description: "Slack webhook URL (can also use SLACK_WEBHOOK_URL env var)"
required: false
details:
description: "Additional message body content"
required: false
failed-jobs:
description: "Deprecated alias for details"
required: false
mention:
description: "GitHub username to resolve to a Slack @-mention. Replaces {mention} in details."
required: false
title:
description: "Title for the notification"
required: false
default: "🚨 Workflow Failed"
ref-name:
description: "Git ref name (tag/branch)"
required: false
runs:
using: "composite"
steps:
- name: Send Slack notification
shell: bash
env:
SLACK_WEBHOOK_URL: ${{ inputs.webhook-url }}
DETAILS: ${{ inputs.details }}
FAILED_JOBS: ${{ inputs.failed-jobs }}
MENTION_USER: ${{ inputs.mention }}
TITLE: ${{ inputs.title }}
REF_NAME: ${{ inputs.ref-name }}
REPO: ${{ github.repository }}
WORKFLOW: ${{ github.workflow }}
RUN_NUMBER: ${{ github.run_number }}
RUN_ID: ${{ github.run_id }}
SERVER_URL: ${{ github.server_url }}
GITHUB_REF_NAME: ${{ github.ref_name }}
run: |
if [ -z "$SLACK_WEBHOOK_URL" ]; then
echo "webhook-url input or SLACK_WEBHOOK_URL env var is not set, skipping notification"
exit 0
fi
# Build workflow URL
WORKFLOW_URL="${SERVER_URL}/${REPO}/actions/runs/${RUN_ID}"
# Use ref_name from input or fall back to github.ref_name
if [ -z "$REF_NAME" ]; then
REF_NAME="$GITHUB_REF_NAME"
fi
if [ -z "$DETAILS" ]; then
DETAILS="$FAILED_JOBS"
fi
# Resolve {mention} placeholder if a GitHub username was provided.
# Looks up the username in user-mappings.json (co-located with this action)
# and replaces {mention} with <@SLACK_ID> for a Slack @-mention.
# Falls back to the plain GitHub username if not found in the mapping.
if [ -n "$MENTION_USER" ]; then
MAPPINGS_FILE="${GITHUB_ACTION_PATH}/user-mappings.json"
slack_id="$(jq -r --arg gh "$MENTION_USER" 'to_entries[] | select(.value | ascii_downcase == ($gh | ascii_downcase)) | .key' "$MAPPINGS_FILE" 2>/dev/null | head -1)"
if [ -n "$slack_id" ]; then
mention_text="<@${slack_id}>"
else
mention_text="${MENTION_USER}"
fi
DETAILS="${DETAILS//\{mention\}/$mention_text}"
TITLE="${TITLE//\{mention\}/}"
else
DETAILS="${DETAILS//\{mention\}/}"
TITLE="${TITLE//\{mention\}/}"
fi
normalize_multiline() {
printf '%s' "$1" | awk 'BEGIN { ORS=""; first=1 } { if (!first) printf "\\n"; printf "%s", $0; first=0 }'
}
DETAILS="$(normalize_multiline "$DETAILS")"
REF_NAME="$(normalize_multiline "$REF_NAME")"
TITLE="$(normalize_multiline "$TITLE")"
# Escape JSON special characters
escape_json() {
local input="$1"
# Escape backslashes first (but preserve \n sequences)
# Protect \n sequences temporarily
input=$(printf '%s' "$input" | sed 's/\\n/\x01NL\x01/g')
# Escape remaining backslashes
input=$(printf '%s' "$input" | sed 's/\\/\\\\/g')
# Restore \n sequences (single backslash, will be correct in JSON)
input=$(printf '%s' "$input" | sed 's/\x01NL\x01/\\n/g')
# Escape quotes
printf '%s' "$input" | sed 's/"/\\"/g'
}
REF_NAME_ESC=$(escape_json "$REF_NAME")
DETAILS_ESC=$(escape_json "$DETAILS")
WORKFLOW_URL_ESC=$(escape_json "$WORKFLOW_URL")
TITLE_ESC=$(escape_json "$TITLE")
# Build JSON payload piece by piece
# Note: DETAILS_ESC already contains \n sequences that should remain as \n in JSON
PAYLOAD="{"
PAYLOAD="${PAYLOAD}\"text\":\"${TITLE_ESC}\","
PAYLOAD="${PAYLOAD}\"blocks\":[{"
PAYLOAD="${PAYLOAD}\"type\":\"header\","
PAYLOAD="${PAYLOAD}\"text\":{\"type\":\"plain_text\",\"text\":\"${TITLE_ESC}\"}"
PAYLOAD="${PAYLOAD}},{"
PAYLOAD="${PAYLOAD}\"type\":\"section\","
PAYLOAD="${PAYLOAD}\"fields\":["
if [ -n "$REF_NAME" ]; then
PAYLOAD="${PAYLOAD}{\"type\":\"mrkdwn\",\"text\":\"*Ref:*\\n${REF_NAME_ESC}\"},"
fi
PAYLOAD="${PAYLOAD}{\"type\":\"mrkdwn\",\"text\":\"*Run ID:*\\n#${RUN_NUMBER}\"}"
PAYLOAD="${PAYLOAD}]"
PAYLOAD="${PAYLOAD}}"
if [ -n "$DETAILS" ]; then
PAYLOAD="${PAYLOAD},{"
PAYLOAD="${PAYLOAD}\"type\":\"section\","
PAYLOAD="${PAYLOAD}\"text\":{\"type\":\"mrkdwn\",\"text\":\"${DETAILS_ESC}\"}"
PAYLOAD="${PAYLOAD}}"
fi
PAYLOAD="${PAYLOAD},{"
PAYLOAD="${PAYLOAD}\"type\":\"actions\","
PAYLOAD="${PAYLOAD}\"elements\":[{"
PAYLOAD="${PAYLOAD}\"type\":\"button\","
PAYLOAD="${PAYLOAD}\"text\":{\"type\":\"plain_text\",\"text\":\"View Workflow Run\"},"
PAYLOAD="${PAYLOAD}\"url\":\"${WORKFLOW_URL_ESC}\""
PAYLOAD="${PAYLOAD}}]"
PAYLOAD="${PAYLOAD}}"
PAYLOAD="${PAYLOAD}]"
PAYLOAD="${PAYLOAD}}"
curl -X POST -H 'Content-type: application/json' \
--data "$PAYLOAD" \
"$SLACK_WEBHOOK_URL"
================================================
FILE: .github/actions/slack-notify/user-mappings.json
================================================
{
"U05SAGZPEA1": "yuhongsun96",
"U05SAH6UGUD": "Weves",
"U07PWEQB7A5": "evan-onyx",
"U07V1SM68KF": "joachim-danswer",
"U08JZ9N3QNN": "raunakab",
"U08L24NCLJE": "Subash-Mohan",
"U090B9M07B2": "wenxi-onyx",
"U094RASDP0Q": "duo-onyx",
"U096L8ZQ85B": "justin-tahara",
"U09AHV8UBQX": "jessicasingh7",
"U09KAL5T3C2": "nmgarza5",
"U09KPGVQ70R": "acaprau",
"U09QR8KTSJH": "rohoswagger",
"U09RB4NTXA4": "jmelahman",
"U0A6K9VCY6A": "Danelegend",
"U0AGC4KH71A": "Bo-Onyx"
}
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
cooldown:
default-days: 7
open-pull-requests-limit: 3
assignees:
- "jmelahman"
labels:
- "dependabot:actions"
- package-ecosystem: "pip"
directory: "/backend"
schedule:
interval: "weekly"
cooldown:
default-days: 7
open-pull-requests-limit: 3
assignees:
- "jmelahman"
labels:
- "dependabot:python"
================================================
FILE: .github/pull_request_template.md
================================================
## Description
<!--- Provide a brief description of the changes in this PR --->
## How Has This Been Tested?
<!--- Describe the tests you ran to verify your changes --->
## Additional Options
- [ ] [Optional] Please cherry-pick this PR to the latest release version.
- [ ] [Optional] Override Linear Check
================================================
FILE: .github/runs-on.yml
================================================
_extend: .github-private
================================================
FILE: .github/workflows/deployment.yml
================================================
name: Build and Push Docker Images on Tag
on:
push:
tags:
- "*"
workflow_dispatch:
# Set restrictive default permissions for all jobs. Jobs that need more permissions
# should explicitly declare them.
permissions:
# Required for OIDC authentication with AWS
id-token: write # zizmor: ignore[excessive-permissions]
env:
EDGE_TAG: ${{ startsWith(github.ref_name, 'nightly-latest') }}
jobs:
# Determine which components to build based on the tag
determine-builds:
# NOTE: Github-hosted runners have about 20s faster queue times and are preferred here.
runs-on: ubuntu-slim
timeout-minutes: 90
outputs:
build-desktop: ${{ steps.check.outputs.build-desktop }}
build-web: ${{ steps.check.outputs.build-web }}
build-web-cloud: ${{ steps.check.outputs.build-web-cloud }}
build-backend: ${{ steps.check.outputs.build-backend }}
build-backend-craft: ${{ steps.check.outputs.build-backend-craft }}
build-model-server: ${{ steps.check.outputs.build-model-server }}
is-cloud-tag: ${{ steps.check.outputs.is-cloud-tag }}
is-beta: ${{ steps.check.outputs.is-beta }}
is-beta-standalone: ${{ steps.check.outputs.is-beta-standalone }}
is-latest: ${{ steps.check.outputs.is-latest }}
is-test-run: ${{ steps.check.outputs.is-test-run }}
sanitized-tag: ${{ steps.check.outputs.sanitized-tag }}
short-sha: ${{ steps.check.outputs.short-sha }}
steps:
- name: Checkout (for git tags)
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
fetch-depth: 0
fetch-tags: true
- name: Setup uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # ratchet:astral-sh/setup-uv@v7
with:
version: "0.9.9"
enable-cache: false
- name: Check which components to build and version info
id: check
env:
EVENT_NAME: ${{ github.event_name }}
run: |
set -eo pipefail
TAG="${GITHUB_REF_NAME}"
# Sanitize tag name by replacing slashes with hyphens (for Docker tag compatibility)
SANITIZED_TAG=$(echo "$TAG" | tr '/' '-')
SHORT_SHA="${GITHUB_SHA::7}"
# Initialize all flags to false
IS_CLOUD=false
IS_NIGHTLY=false
IS_VERSION_TAG=false
IS_STABLE=false
IS_BETA=false
IS_BETA_STANDALONE=false
IS_LATEST=false
IS_PROD_TAG=false
IS_TEST_RUN=false
BUILD_DESKTOP=false
BUILD_WEB=false
BUILD_WEB_CLOUD=false
BUILD_BACKEND=true
BUILD_BACKEND_CRAFT=false
BUILD_MODEL_SERVER=true
# Determine tag type based on pattern matching (do regex checks once)
if [[ "$TAG" == *cloud* ]]; then
IS_CLOUD=true
fi
if [[ "$TAG" == nightly* ]]; then
IS_NIGHTLY=true
fi
if [[ "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+ ]]; then
IS_VERSION_TAG=true
fi
if [[ "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
IS_STABLE=true
fi
if [[ "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+-beta(\.[0-9]+)?$ ]]; then
IS_BETA=true
fi
# Determine what to build based on tag type
if [[ "$IS_CLOUD" == "true" ]]; then
BUILD_WEB_CLOUD=true
else
BUILD_WEB=true
# Only build desktop for semver tags (excluding beta)
if [[ "$IS_VERSION_TAG" == "true" ]] && [[ "$IS_BETA" != "true" ]]; then
BUILD_DESKTOP=true
fi
fi
# Standalone version checks (for backend/model-server - version excluding cloud tags)
if [[ "$IS_BETA" == "true" ]] && [[ "$IS_CLOUD" != "true" ]]; then
IS_BETA_STANDALONE=true
fi
# Determine if this tag should get the "latest" Docker tag.
# Only the highest semver stable tag (vX.Y.Z exactly) gets "latest".
if [[ "$IS_STABLE" == "true" ]]; then
HIGHEST_STABLE=$(uv run --no-sync --with onyx-devtools ods latest-stable-tag) || {
echo "::error::Failed to determine highest stable tag via 'ods latest-stable-tag'"
exit 1
}
if [[ "$TAG" == "$HIGHEST_STABLE" ]]; then
IS_LATEST=true
fi
fi
# Build craft-latest backend alongside the regular latest.
if [[ "$IS_LATEST" == "true" ]]; then
BUILD_BACKEND_CRAFT=true
fi
# Determine if this is a production tag
# Production tags are: version tags (v1.2.3*) or nightly tags
if [[ "$IS_VERSION_TAG" == "true" ]] || [[ "$IS_NIGHTLY" == "true" ]]; then
IS_PROD_TAG=true
fi
# Determine if this is a test run (workflow_dispatch on non-production ref)
if [[ "$EVENT_NAME" == "workflow_dispatch" ]] && [[ "$IS_PROD_TAG" != "true" ]]; then
IS_TEST_RUN=true
fi
{
echo "build-desktop=$BUILD_DESKTOP"
echo "build-web=$BUILD_WEB"
echo "build-web-cloud=$BUILD_WEB_CLOUD"
echo "build-backend=$BUILD_BACKEND"
echo "build-backend-craft=$BUILD_BACKEND_CRAFT"
echo "build-model-server=$BUILD_MODEL_SERVER"
echo "is-cloud-tag=$IS_CLOUD"
echo "is-beta=$IS_BETA"
echo "is-beta-standalone=$IS_BETA_STANDALONE"
echo "is-latest=$IS_LATEST"
echo "is-test-run=$IS_TEST_RUN"
echo "sanitized-tag=$SANITIZED_TAG"
echo "short-sha=$SHORT_SHA"
} >> "$GITHUB_OUTPUT"
check-version-tag:
runs-on: ubuntu-slim
timeout-minutes: 10
if: ${{ !startsWith(github.ref_name, 'nightly-latest') && github.event_name != 'workflow_dispatch' }}
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
fetch-depth: 0
- name: Setup uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # ratchet:astral-sh/setup-uv@v7
with:
version: "0.9.9"
# NOTE: This isn't caching much and zizmor suggests this could be poisoned, so disable.
enable-cache: false
- name: Validate tag is versioned correctly
run: |
uv run --no-sync --with release-tag tag --check
notify-slack-on-tag-check-failure:
needs:
- check-version-tag
if: always() && needs.check-version-tag.result == 'failure' && github.event_name != 'workflow_dispatch'
runs-on: ubuntu-slim
timeout-minutes: 10
environment: release
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Send Slack notification
uses: ./.github/actions/slack-notify
with:
webhook-url: ${{ secrets.MONITOR_DEPLOYMENTS_WEBHOOK }}
failed-jobs: "• check-version-tag"
title: "🚨 Version Tag Check Failed"
ref-name: ${{ github.ref_name }}
# Create GitHub release first, before desktop builds start.
# This ensures all desktop matrix jobs upload to the same release instead of
# racing to create duplicate releases.
create-release:
needs: determine-builds
if: needs.determine-builds.outputs.build-desktop == 'true'
runs-on: ubuntu-slim
timeout-minutes: 10
permissions:
contents: write
outputs:
release-id: ${{ steps.create-release.outputs.id }}
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Determine release tag
id: release-tag
env:
IS_TEST_RUN: ${{ needs.determine-builds.outputs.is-test-run }}
SHORT_SHA: ${{ needs.determine-builds.outputs.short-sha }}
run: |
if [ "${IS_TEST_RUN}" == "true" ]; then
echo "tag=v0.0.0-dev+${SHORT_SHA}" >> "$GITHUB_OUTPUT"
else
echo "tag=${GITHUB_REF_NAME}" >> "$GITHUB_OUTPUT"
fi
- name: Create GitHub Release
id: create-release
uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 # ratchet:softprops/action-gh-release@v2
with:
tag_name: ${{ steps.release-tag.outputs.tag }}
name: ${{ steps.release-tag.outputs.tag }}
body: "See the assets to download this version and install."
draft: true
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
build-desktop:
needs:
- determine-builds
- create-release
if: needs.determine-builds.outputs.build-desktop == 'true'
permissions:
id-token: write
contents: write
actions: read
strategy:
fail-fast: false
matrix:
include:
- platform: "macos-latest" # Build a universal image for macOS.
args: "--target universal-apple-darwin"
- platform: "ubuntu-24.04"
args: "--bundles deb,rpm"
- platform: "ubuntu-24.04-arm" # Only available in public repos.
args: "--bundles deb,rpm"
- platform: "windows-latest"
args: ""
runs-on: ${{ matrix.platform }}
timeout-minutes: 90
environment: release
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6.0.2
with:
# NOTE: persist-credentials is needed for tauri-action to upload assets to GitHub releases.
persist-credentials: true # zizmor: ignore[artipacked]
- name: Configure AWS credentials
if: startsWith(matrix.platform, 'macos-')
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
if: startsWith(matrix.platform, 'macos-')
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
APPLE_ID, deploy/apple-id
APPLE_PASSWORD, deploy/apple-password
APPLE_CERTIFICATE, deploy/apple-certificate
APPLE_CERTIFICATE_PASSWORD, deploy/apple-certificate-password
KEYCHAIN_PASSWORD, deploy/keychain-password
APPLE_TEAM_ID, deploy/apple-team-id
parse-json-secrets: true
- name: install dependencies (ubuntu only)
if: startsWith(matrix.platform, 'ubuntu-')
run: |
sudo apt-get update
sudo apt-get install -y \
build-essential \
libglib2.0-dev \
libgirepository1.0-dev \
libgtk-3-dev \
libjavascriptcoregtk-4.1-dev \
libwebkit2gtk-4.1-dev \
libayatana-appindicator3-dev \
gobject-introspection \
pkg-config \
curl \
xdg-utils
- name: setup node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # ratchet:actions/setup-node@v6.3.0
with:
node-version: 24
package-manager-cache: false
- name: install Rust stable
uses: dtolnay/rust-toolchain@6d9817901c499d6b02debbb57edb38d33daa680b # zizmor: ignore[impostor-commit]
with:
# Those targets are only used on macos runners so it's in an `if` to slightly speed up windows and linux builds.
targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}
- name: install frontend dependencies
working-directory: ./desktop
run: npm install
- name: Inject version (Unix)
if: runner.os != 'Windows'
working-directory: ./desktop
env:
SHORT_SHA: ${{ needs.determine-builds.outputs.short-sha }}
IS_TEST_RUN: ${{ needs.determine-builds.outputs.is-test-run }}
run: |
if [ "${IS_TEST_RUN}" == "true" ]; then
VERSION="0.0.0-dev+${SHORT_SHA}"
else
VERSION="${GITHUB_REF_NAME#v}"
fi
echo "Injecting version: $VERSION"
# Update Cargo.toml
sed "s/^version = .*/version = \"$VERSION\"/" src-tauri/Cargo.toml > src-tauri/Cargo.toml.tmp
mv src-tauri/Cargo.toml.tmp src-tauri/Cargo.toml
# Update tauri.conf.json
jq --arg v "$VERSION" '.version = $v' src-tauri/tauri.conf.json > src-tauri/tauri.conf.json.tmp
mv src-tauri/tauri.conf.json.tmp src-tauri/tauri.conf.json
# Update package.json
jq --arg v "$VERSION" '.version = $v' package.json > package.json.tmp
mv package.json.tmp package.json
echo "Versions set to: $VERSION"
- name: Inject version (Windows)
if: runner.os == 'Windows'
working-directory: ./desktop
shell: pwsh
env:
IS_TEST_RUN: ${{ needs.determine-builds.outputs.is-test-run }}
run: |
# Windows MSI requires numeric-only build metadata, so we skip the SHA suffix
if ($env:IS_TEST_RUN -eq "true") {
$VERSION = "0.0.0"
} else {
# Strip 'v' prefix and any pre-release suffix (e.g., -beta.13) for MSI compatibility
$VERSION = "$env:GITHUB_REF_NAME" -replace '^v', '' -replace '-.*$', ''
}
Write-Host "Injecting version: $VERSION"
# Update Cargo.toml
$cargo = Get-Content src-tauri/Cargo.toml -Raw
$cargo = $cargo -replace '(?m)^version = .*', "version = `"$VERSION`""
Set-Content src-tauri/Cargo.toml $cargo -NoNewline
# Update tauri.conf.json
$json = Get-Content src-tauri/tauri.conf.json | ConvertFrom-Json
$json.version = $VERSION
$json | ConvertTo-Json -Depth 100 | Set-Content src-tauri/tauri.conf.json
# Update package.json
$pkg = Get-Content package.json | ConvertFrom-Json
$pkg.version = $VERSION
$pkg | ConvertTo-Json -Depth 100 | Set-Content package.json
Write-Host "Versions set to: $VERSION"
- name: Import Apple Developer Certificate
if: startsWith(matrix.platform, 'macos-')
run: |
echo $APPLE_CERTIFICATE | base64 --decode > certificate.p12
security create-keychain -p "$KEYCHAIN_PASSWORD" build.keychain
security default-keychain -s build.keychain
security unlock-keychain -p "$KEYCHAIN_PASSWORD" build.keychain
security set-keychain-settings -t 3600 -u build.keychain
security import certificate.p12 -k build.keychain -P "$APPLE_CERTIFICATE_PASSWORD" -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KEYCHAIN_PASSWORD" build.keychain
security find-identity -v -p codesigning build.keychain
- name: Verify Certificate
if: startsWith(matrix.platform, 'macos-')
run: |
CERT_INFO=$(security find-identity -v -p codesigning build.keychain | grep -E "(Developer ID Application|Apple Distribution|Apple Development)" | head -n 1)
CERT_ID=$(echo "$CERT_INFO" | awk -F'"' '{print $2}')
echo "CERT_ID=$CERT_ID" >> $GITHUB_ENV
echo "Certificate imported."
- uses: tauri-apps/tauri-action@73fb865345c54760d875b94642314f8c0c894afa # ratchet:tauri-apps/tauri-action@action-v0.6.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
APPLE_ID: ${{ env.APPLE_ID }}
APPLE_PASSWORD: ${{ env.APPLE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ env.CERT_ID }}
APPLE_TEAM_ID: ${{ env.APPLE_TEAM_ID }}
with:
# Use the release created by the create-release job to avoid race conditions
# when multiple matrix jobs try to create/update the same release simultaneously
releaseId: ${{ needs.create-release.outputs.release-id }}
assetNamePattern: "[name]_[arch][ext]"
args: ${{ matrix.args }}
build-web-amd64:
needs: determine-builds
if: needs.determine-builds.outputs.build-web == 'true'
runs-on:
- runs-on
- runner=4cpu-linux-x64
- run-id=${{ github.run_id }}-web-amd64
- extras=ecr-cache
timeout-minutes: 90
environment: release
outputs:
digest: ${{ steps.build.outputs.digest }}
env:
REGISTRY_IMAGE: onyxdotapp/onyx-web-server
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
flavor: |
latest=false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Build and push AMD64
id: build
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./web
file: ./web/Dockerfile
platforms: linux/amd64
labels: ${{ steps.meta.outputs.labels }}
build-args: |
ONYX_VERSION=${{ github.ref_name }}
NODE_OPTIONS=--max-old-space-size=8192
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:web-cache-amd64
type=registry,ref=${{ env.REGISTRY_IMAGE }}:edge
type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest
cache-to: |
type=inline
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:web-cache-amd64,mode=max
outputs: type=image,name=${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
no-cache: ${{ vars.DOCKER_NO_CACHE == 'true' }}
build-web-arm64:
needs: determine-builds
if: needs.determine-builds.outputs.build-web == 'true'
runs-on:
- runs-on
- runner=4cpu-linux-arm64
- run-id=${{ github.run_id }}-web-arm64
- extras=ecr-cache
timeout-minutes: 90
environment: release
outputs:
digest: ${{ steps.build.outputs.digest }}
env:
REGISTRY_IMAGE: onyxdotapp/onyx-web-server
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
flavor: |
latest=false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Build and push ARM64
id: build
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./web
file: ./web/Dockerfile
platforms: linux/arm64
labels: ${{ steps.meta.outputs.labels }}
build-args: |
ONYX_VERSION=${{ github.ref_name }}
NODE_OPTIONS=--max-old-space-size=8192
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:web-cache-arm64
type=registry,ref=${{ env.REGISTRY_IMAGE }}:edge
type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest
cache-to: |
type=inline
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:web-cache-arm64,mode=max
outputs: type=image,name=${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
no-cache: ${{ vars.DOCKER_NO_CACHE == 'true' }}
merge-web:
needs:
- determine-builds
- build-web-amd64
- build-web-arm64
runs-on:
- runs-on
- runner=2cpu-linux-x64
- run-id=${{ github.run_id }}-merge-web
- extras=ecr-cache
timeout-minutes: 90
environment: release
env:
REGISTRY_IMAGE: onyxdotapp/onyx-web-server
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
flavor: |
latest=false
tags: |
type=raw,value=${{ needs.determine-builds.outputs.is-test-run == 'true' && format('web-{0}', needs.determine-builds.outputs.sanitized-tag) || github.ref_name }}
type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-latest == 'true' && 'latest' || '' }}
type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-latest == 'true' && 'craft-latest' || '' }}
type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && env.EDGE_TAG == 'true' && 'edge' || '' }}
type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-beta == 'true' && 'beta' || '' }}
- name: Create and push manifest
env:
IMAGE_REPO: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
AMD64_DIGEST: ${{ needs.build-web-amd64.outputs.digest }}
ARM64_DIGEST: ${{ needs.build-web-arm64.outputs.digest }}
META_TAGS: ${{ steps.meta.outputs.tags }}
run: |
IMAGES="${IMAGE_REPO}@${AMD64_DIGEST} ${IMAGE_REPO}@${ARM64_DIGEST}"
docker buildx imagetools create \
$(printf '%s\n' "${META_TAGS}" | xargs -I {} echo -t {}) \
$IMAGES
build-web-cloud-amd64:
needs: determine-builds
if: needs.determine-builds.outputs.build-web-cloud == 'true'
runs-on:
- runs-on
- runner=4cpu-linux-x64
- run-id=${{ github.run_id }}-web-cloud-amd64
- extras=ecr-cache
timeout-minutes: 90
environment: release
outputs:
digest: ${{ steps.build.outputs.digest }}
env:
REGISTRY_IMAGE: onyxdotapp/onyx-web-server-cloud
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
flavor: |
latest=false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Build and push AMD64
id: build
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./web
file: ./web/Dockerfile
platforms: linux/amd64
labels: ${{ steps.meta.outputs.labels }}
build-args: |
ONYX_VERSION=${{ github.ref_name }}
NEXT_PUBLIC_CLOUD_ENABLED=true
NEXT_PUBLIC_POSTHOG_KEY=${{ secrets.POSTHOG_KEY }}
NEXT_PUBLIC_POSTHOG_HOST=${{ secrets.POSTHOG_HOST }}
NEXT_PUBLIC_SENTRY_DSN=${{ secrets.SENTRY_DSN }}
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=${{ secrets.STRIPE_PUBLISHABLE_KEY }}
NEXT_PUBLIC_RECAPTCHA_SITE_KEY=${{ vars.NEXT_PUBLIC_RECAPTCHA_SITE_KEY }}
NEXT_PUBLIC_GTM_ENABLED=true
NEXT_PUBLIC_FORGOT_PASSWORD_ENABLED=true
NEXT_PUBLIC_INCLUDE_ERROR_POPUP_SUPPORT_LINK=true
NODE_OPTIONS=--max-old-space-size=8192
SENTRY_RELEASE=${{ github.sha }}
secrets: |
sentry_auth_token=${{ secrets.SENTRY_AUTH_TOKEN }}
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:cloudweb-cache-amd64
type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest
cache-to: |
type=inline
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:cloudweb-cache-amd64,mode=max
outputs: type=image,name=${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
no-cache: ${{ vars.DOCKER_NO_CACHE == 'true' }}
build-web-cloud-arm64:
needs: determine-builds
if: needs.determine-builds.outputs.build-web-cloud == 'true'
runs-on:
- runs-on
- runner=4cpu-linux-arm64
- run-id=${{ github.run_id }}-web-cloud-arm64
- extras=ecr-cache
timeout-minutes: 90
environment: release
outputs:
digest: ${{ steps.build.outputs.digest }}
env:
REGISTRY_IMAGE: onyxdotapp/onyx-web-server-cloud
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
flavor: |
latest=false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Build and push ARM64
id: build
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./web
file: ./web/Dockerfile
platforms: linux/arm64
labels: ${{ steps.meta.outputs.labels }}
build-args: |
ONYX_VERSION=${{ github.ref_name }}
NEXT_PUBLIC_CLOUD_ENABLED=true
NEXT_PUBLIC_POSTHOG_KEY=${{ secrets.POSTHOG_KEY }}
NEXT_PUBLIC_POSTHOG_HOST=${{ secrets.POSTHOG_HOST }}
NEXT_PUBLIC_SENTRY_DSN=${{ secrets.SENTRY_DSN }}
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=${{ secrets.STRIPE_PUBLISHABLE_KEY }}
NEXT_PUBLIC_RECAPTCHA_SITE_KEY=${{ vars.NEXT_PUBLIC_RECAPTCHA_SITE_KEY }}
NEXT_PUBLIC_GTM_ENABLED=true
NEXT_PUBLIC_FORGOT_PASSWORD_ENABLED=true
NEXT_PUBLIC_INCLUDE_ERROR_POPUP_SUPPORT_LINK=true
NODE_OPTIONS=--max-old-space-size=8192
SENTRY_RELEASE=${{ github.sha }}
secrets: |
sentry_auth_token=${{ secrets.SENTRY_AUTH_TOKEN }}
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:cloudweb-cache-arm64
type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest
cache-to: |
type=inline
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:cloudweb-cache-arm64,mode=max
outputs: type=image,name=${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
no-cache: ${{ vars.DOCKER_NO_CACHE == 'true' }}
merge-web-cloud:
needs:
- determine-builds
- build-web-cloud-amd64
- build-web-cloud-arm64
runs-on:
- runs-on
- runner=2cpu-linux-x64
- run-id=${{ github.run_id }}-merge-web-cloud
- extras=ecr-cache
timeout-minutes: 90
environment: release
env:
REGISTRY_IMAGE: onyxdotapp/onyx-web-server-cloud
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
flavor: |
latest=false
tags: |
type=raw,value=${{ needs.determine-builds.outputs.is-test-run == 'true' && format('web-cloud-{0}', needs.determine-builds.outputs.sanitized-tag) || github.ref_name }}
- name: Create and push manifest
env:
IMAGE_REPO: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
AMD64_DIGEST: ${{ needs.build-web-cloud-amd64.outputs.digest }}
ARM64_DIGEST: ${{ needs.build-web-cloud-arm64.outputs.digest }}
META_TAGS: ${{ steps.meta.outputs.tags }}
run: |
IMAGES="${IMAGE_REPO}@${AMD64_DIGEST} ${IMAGE_REPO}@${ARM64_DIGEST}"
docker buildx imagetools create \
$(printf '%s\n' "${META_TAGS}" | xargs -I {} echo -t {}) \
$IMAGES
build-backend-amd64:
needs: determine-builds
if: needs.determine-builds.outputs.build-backend == 'true'
runs-on:
- runs-on
- runner=2cpu-linux-x64
- run-id=${{ github.run_id }}-backend-amd64
- extras=ecr-cache
timeout-minutes: 90
environment: release
outputs:
digest: ${{ steps.build.outputs.digest }}
env:
REGISTRY_IMAGE: ${{ contains(github.ref_name, 'cloud') && 'onyxdotapp/onyx-backend-cloud' || 'onyxdotapp/onyx-backend' }}
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
flavor: |
latest=false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Build and push AMD64
id: build
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./backend
file: ./backend/Dockerfile
platforms: linux/amd64
labels: ${{ steps.meta.outputs.labels }}
build-args: |
ONYX_VERSION=${{ github.ref_name }}
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-amd64
type=registry,ref=${{ env.REGISTRY_IMAGE }}:edge
type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest
cache-to: |
type=inline
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-amd64,mode=max
outputs: type=image,name=${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
no-cache: ${{ vars.DOCKER_NO_CACHE == 'true' }}
build-backend-arm64:
needs: determine-builds
if: needs.determine-builds.outputs.build-backend == 'true'
runs-on:
- runs-on
- runner=2cpu-linux-arm64
- run-id=${{ github.run_id }}-backend-arm64
- extras=ecr-cache
timeout-minutes: 90
environment: release
outputs:
digest: ${{ steps.build.outputs.digest }}
env:
REGISTRY_IMAGE: ${{ contains(github.ref_name, 'cloud') && 'onyxdotapp/onyx-backend-cloud' || 'onyxdotapp/onyx-backend' }}
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
flavor: |
latest=false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Build and push ARM64
id: build
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./backend
file: ./backend/Dockerfile
platforms: linux/arm64
labels: ${{ steps.meta.outputs.labels }}
build-args: |
ONYX_VERSION=${{ github.ref_name }}
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-arm64
type=registry,ref=${{ env.REGISTRY_IMAGE }}:edge
type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest
cache-to: |
type=inline
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-arm64,mode=max
outputs: type=image,name=${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
no-cache: ${{ vars.DOCKER_NO_CACHE == 'true' }}
merge-backend:
needs:
- determine-builds
- build-backend-amd64
- build-backend-arm64
runs-on:
- runs-on
- runner=2cpu-linux-x64
- run-id=${{ github.run_id }}-merge-backend
- extras=ecr-cache
timeout-minutes: 90
environment: release
env:
REGISTRY_IMAGE: ${{ contains(github.ref_name, 'cloud') && 'onyxdotapp/onyx-backend-cloud' || 'onyxdotapp/onyx-backend' }}
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
flavor: |
latest=false
tags: |
type=raw,value=${{ needs.determine-builds.outputs.is-test-run == 'true' && format('backend-{0}', needs.determine-builds.outputs.sanitized-tag) || github.ref_name }}
type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-latest == 'true' && 'latest' || '' }}
type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && env.EDGE_TAG == 'true' && 'edge' || '' }}
type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-beta-standalone == 'true' && 'beta' || '' }}
- name: Create and push manifest
env:
IMAGE_REPO: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
AMD64_DIGEST: ${{ needs.build-backend-amd64.outputs.digest }}
ARM64_DIGEST: ${{ needs.build-backend-arm64.outputs.digest }}
META_TAGS: ${{ steps.meta.outputs.tags }}
run: |
IMAGES="${IMAGE_REPO}@${AMD64_DIGEST} ${IMAGE_REPO}@${ARM64_DIGEST}"
docker buildx imagetools create \
$(printf '%s\n' "${META_TAGS}" | xargs -I {} echo -t {}) \
$IMAGES
build-backend-craft-amd64:
needs: determine-builds
if: needs.determine-builds.outputs.build-backend-craft == 'true'
runs-on:
- runs-on
- runner=2cpu-linux-x64
- run-id=${{ github.run_id }}-backend-craft-amd64
- extras=ecr-cache
timeout-minutes: 90
environment: release
outputs:
digest: ${{ steps.build.outputs.digest }}
env:
REGISTRY_IMAGE: onyxdotapp/onyx-backend
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ env.REGISTRY_IMAGE }}
flavor: |
latest=false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Build and push AMD64
id: build
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./backend
file: ./backend/Dockerfile
platforms: linux/amd64
labels: ${{ steps.meta.outputs.labels }}
build-args: |
ONYX_VERSION=${{ github.ref_name }}
ENABLE_CRAFT=true
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-craft-cache-amd64
type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest
cache-to: |
type=inline
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-craft-cache-amd64,mode=max
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
no-cache: ${{ vars.DOCKER_NO_CACHE == 'true' }}
build-backend-craft-arm64:
needs: determine-builds
if: needs.determine-builds.outputs.build-backend-craft == 'true'
runs-on:
- runs-on
- runner=2cpu-linux-arm64
- run-id=${{ github.run_id }}-backend-craft-arm64
- extras=ecr-cache
timeout-minutes: 90
environment: release
outputs:
digest: ${{ steps.build.outputs.digest }}
env:
REGISTRY_IMAGE: onyxdotapp/onyx-backend
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ env.REGISTRY_IMAGE }}
flavor: |
latest=false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Build and push ARM64
id: build
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./backend
file: ./backend/Dockerfile
platforms: linux/arm64
labels: ${{ steps.meta.outputs.labels }}
build-args: |
ONYX_VERSION=${{ github.ref_name }}
ENABLE_CRAFT=true
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-craft-cache-arm64
type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest
cache-to: |
type=inline
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-craft-cache-arm64,mode=max
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
no-cache: ${{ vars.DOCKER_NO_CACHE == 'true' }}
merge-backend-craft:
needs:
- determine-builds
- build-backend-craft-amd64
- build-backend-craft-arm64
if: needs.determine-builds.outputs.build-backend-craft == 'true'
runs-on:
- runs-on
- runner=2cpu-linux-x64
- run-id=${{ github.run_id }}-merge-backend-craft
- extras=ecr-cache
timeout-minutes: 90
environment: release
env:
REGISTRY_IMAGE: onyxdotapp/onyx-backend
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ env.REGISTRY_IMAGE }}
flavor: |
latest=false
tags: |
type=raw,value=craft-latest
- name: Create and push manifest
env:
IMAGE_REPO: ${{ env.REGISTRY_IMAGE }}
AMD64_DIGEST: ${{ needs.build-backend-craft-amd64.outputs.digest }}
ARM64_DIGEST: ${{ needs.build-backend-craft-arm64.outputs.digest }}
META_TAGS: ${{ steps.meta.outputs.tags }}
run: |
IMAGES="${IMAGE_REPO}@${AMD64_DIGEST} ${IMAGE_REPO}@${ARM64_DIGEST}"
docker buildx imagetools create \
$(printf '%s\n' "${META_TAGS}" | xargs -I {} echo -t {}) \
$IMAGES
build-model-server-amd64:
needs: determine-builds
if: needs.determine-builds.outputs.build-model-server == 'true'
runs-on:
- runs-on
- runner=2cpu-linux-x64
- run-id=${{ github.run_id }}-model-server-amd64
- volume=40gb
- extras=ecr-cache
timeout-minutes: 90
environment: release
outputs:
digest: ${{ steps.build.outputs.digest }}
env:
REGISTRY_IMAGE: ${{ contains(github.ref_name, 'cloud') && 'onyxdotapp/onyx-model-server-cloud' || 'onyxdotapp/onyx-model-server' }}
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
flavor: |
latest=false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
with:
buildkitd-flags: ${{ vars.DOCKER_DEBUG == 'true' && '--debug' || '' }}
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Build and push AMD64
id: build
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
env:
DEBUG: ${{ vars.DOCKER_DEBUG == 'true' && 1 || 0 }}
with:
context: ./backend
file: ./backend/Dockerfile.model_server
platforms: linux/amd64
labels: ${{ steps.meta.outputs.labels }}
build-args: |
ONYX_VERSION=${{ github.ref_name }}
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-amd64
type=registry,ref=${{ env.REGISTRY_IMAGE }}:edge
type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest
cache-to: |
type=inline
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-amd64,mode=max
outputs: type=image,name=${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
no-cache: ${{ env.EDGE_TAG != 'true' && vars.MODEL_SERVER_NO_CACHE == 'true' }}
provenance: false
sbom: false
build-model-server-arm64:
needs: determine-builds
if: needs.determine-builds.outputs.build-model-server == 'true'
runs-on:
- runs-on
- runner=2cpu-linux-arm64
- run-id=${{ github.run_id }}-model-server-arm64
- volume=40gb
- extras=ecr-cache
timeout-minutes: 90
environment: release
outputs:
digest: ${{ steps.build.outputs.digest }}
env:
REGISTRY_IMAGE: ${{ contains(github.ref_name, 'cloud') && 'onyxdotapp/onyx-model-server-cloud' || 'onyxdotapp/onyx-model-server' }}
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
flavor: |
latest=false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
with:
buildkitd-flags: ${{ vars.DOCKER_DEBUG == 'true' && '--debug' || '' }}
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Build and push ARM64
id: build
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
env:
DEBUG: ${{ vars.DOCKER_DEBUG == 'true' && 1 || 0 }}
with:
context: ./backend
file: ./backend/Dockerfile.model_server
platforms: linux/arm64
labels: ${{ steps.meta.outputs.labels }}
build-args: |
ONYX_VERSION=${{ github.ref_name }}
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-arm64
type=registry,ref=${{ env.REGISTRY_IMAGE }}:edge
type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest
cache-to: |
type=inline
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-arm64,mode=max
outputs: type=image,name=${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
no-cache: ${{ env.EDGE_TAG != 'true' && vars.MODEL_SERVER_NO_CACHE == 'true' }}
provenance: false
sbom: false
merge-model-server:
needs:
- determine-builds
- build-model-server-amd64
- build-model-server-arm64
runs-on:
- runs-on
- runner=2cpu-linux-x64
- run-id=${{ github.run_id }}-merge-model-server
- extras=ecr-cache
timeout-minutes: 90
environment: release
env:
REGISTRY_IMAGE: ${{ contains(github.ref_name, 'cloud') && 'onyxdotapp/onyx-model-server-cloud' || 'onyxdotapp/onyx-model-server' }}
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-east-2
- name: Get AWS Secrets
uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
with:
secret-ids: |
DOCKER_USERNAME, deploy/docker-username
DOCKER_TOKEN, deploy/docker-token
parse-json-secrets: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0
with:
images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
flavor: |
latest=false
tags: |
type=raw,value=${{ needs.determine-builds.outputs.is-test-run == 'true' && format('model-server-{0}', needs.determine-builds.outputs.sanitized-tag) || github.ref_name }}
type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-latest == 'true' && 'latest' || '' }}
type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-latest == 'true' && 'craft-latest' || '' }}
type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && env.EDGE_TAG == 'true' && 'edge' || '' }}
type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-beta-standalone == 'true' && 'beta' || '' }}
- name: Create and push manifest
env:
IMAGE_REPO: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }}
AMD64_DIGEST: ${{ needs.build-model-server-amd64.outputs.digest }}
ARM64_DIGEST: ${{ needs.build-model-server-arm64.outputs.digest }}
META_TAGS: ${{ steps.meta.outputs.tags }}
run: |
IMAGES="${IMAGE_REPO}@${AMD64_DIGEST} ${IMAGE_REPO}@${ARM64_DIGEST}"
docker buildx imagetools create \
$(printf '%s\n' "${META_TAGS}" | xargs -I {} echo -t {}) \
$IMAGES
trivy-scan:
needs:
- determine-builds
- merge-web
- merge-web-cloud
- merge-backend
- merge-model-server
if: >-
always() && !cancelled() &&
(needs.merge-web.result == 'success' ||
needs.merge-web-cloud.result == 'success' ||
needs.merge-backend.result == 'success' ||
needs.merge-model-server.result == 'success')
runs-on:
- runs-on
- runner=2cpu-linux-arm64
- run-id=${{ github.run_id }}-trivy-scan-${{ matrix.component }}
- extras=ecr-cache
permissions:
security-events: write # needed for SARIF uploads
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
include:
- component: web
registry-image: onyxdotapp/onyx-web-server
- component: web-cloud
registry-image: onyxdotapp/onyx-web-server-cloud
- component: backend
registry-image: ${{ contains(github.ref_name, 'cloud') && 'onyxdotapp/onyx-backend-cloud' || 'onyxdotapp/onyx-backend' }}
trivyignore: backend/.trivyignore
- component: model-server
registry-image: ${{ contains(github.ref_name, 'cloud') && 'onyxdotapp/onyx-model-server-cloud' || 'onyxdotapp/onyx-model-server' }}
steps:
- name: Check if this scan should run
id: should-run
run: |
case "$COMPONENT" in
web) RESULT="$MERGE_WEB" ;;
web-cloud) RESULT="$MERGE_WEB_CLOUD" ;;
backend) RESULT="$MERGE_BACKEND" ;;
model-server) RESULT="$MERGE_MODEL_SERVER" ;;
esac
if [ "$RESULT" == "success" ]; then
echo "run=true" >> "$GITHUB_OUTPUT"
else
echo "run=false" >> "$GITHUB_OUTPUT"
fi
env:
COMPONENT: ${{ matrix.component }}
MERGE_WEB: ${{ needs.merge-web.result }}
MERGE_WEB_CLOUD: ${{ needs.merge-web-cloud.result }}
MERGE_BACKEND: ${{ needs.merge-backend.result }}
MERGE_MODEL_SERVER: ${{ needs.merge-model-server.result }}
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
if: steps.should-run.outputs.run == 'true'
- name: Checkout
if: steps.should-run.outputs.run == 'true' && matrix.trivyignore != ''
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Determine scan image
if: steps.should-run.outputs.run == 'true'
id: scan-image
run: |
if [ "$IS_TEST_RUN" == "true" ]; then
echo "image=${RUNS_ON_ECR_CACHE}:${TAG_PREFIX}-${SANITIZED_TAG}" >> "$GITHUB_OUTPUT"
else
echo "image=docker.io/${REGISTRY_IMAGE}:${REF_NAME}" >> "$GITHUB_OUTPUT"
fi
env:
IS_TEST_RUN: ${{ needs.determine-builds.outputs.is-test-run }}
TAG_PREFIX: ${{ matrix.component }}
SANITIZED_TAG: ${{ needs.determine-builds.outputs.sanitized-tag }}
REGISTRY_IMAGE: ${{ matrix.registry-image }}
REF_NAME: ${{ github.ref_name }}
- name: Run Trivy vulnerability scanner
if: steps.should-run.outputs.run == 'true'
uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # ratchet:aquasecurity/trivy-action@v0.35.0
with:
image-ref: ${{ steps.scan-image.outputs.image }}
severity: CRITICAL,HIGH
format: "sarif"
output: "trivy-results.sarif"
trivyignores: ${{ matrix.trivyignore }}
env:
TRIVY_USERNAME: ${{ secrets.DOCKER_USERNAME }}
TRIVY_PASSWORD: ${{ secrets.DOCKER_TOKEN }}
- name: Upload Trivy scan results to GitHub Security tab
if: steps.should-run.outputs.run == 'true'
uses: github/codeql-action/upload-sarif@ba454b8ab46733eb6145342877cd148270bb77ab
with:
sarif_file: "trivy-results.sarif"
notify-slack-on-failure:
needs:
- determine-builds
- build-desktop
- build-web-amd64
- build-web-arm64
- merge-web
- build-web-cloud-amd64
- build-web-cloud-arm64
- merge-web-cloud
- build-backend-amd64
- build-backend-arm64
- merge-backend
- build-backend-craft-amd64
- build-backend-craft-arm64
- merge-backend-craft
- build-model-server-amd64
- build-model-server-arm64
- merge-model-server
if: always() && (needs.build-desktop.result == 'failure' || needs.build-web-amd64.result == 'failure' || needs.build-web-arm64.result == 'failure' || needs.merge-web.result == 'failure' || needs.build-web-cloud-amd64.result == 'failure' || needs.build-web-cloud-arm64.result == 'failure' || needs.merge-web-cloud.result == 'failure' || needs.build-backend-amd64.result == 'failure' || needs.build-backend-arm64.result == 'failure' || needs.merge-backend.result == 'failure' || (needs.determine-builds.outputs.build-backend-craft == 'true' && (needs.build-backend-craft-amd64.result == 'failure' || needs.build-backend-craft-arm64.result == 'failure' || needs.merge-backend-craft.result == 'failure')) || needs.build-model-server-amd64.result == 'failure' || needs.build-model-server-arm64.result == 'failure' || needs.merge-model-server.result == 'failure') && needs.determine-builds.outputs.is-test-run != 'true'
# NOTE: Github-hosted runners have about 20s faster queue times and are preferred here.
runs-on: ubuntu-slim
timeout-minutes: 90
environment: release
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Determine failed jobs
id: failed-jobs
shell: bash
run: |
FAILED_JOBS=""
if [ "${NEEDS_BUILD_DESKTOP_RESULT}" == "failure" ]; then
FAILED_JOBS="${FAILED_JOBS}• build-desktop\\n"
fi
if [ "${NEEDS_BUILD_WEB_AMD64_RESULT}" == "failure" ]; then
FAILED_JOBS="${FAILED_JOBS}• build-web-amd64\\n"
fi
if [ "${NEEDS_BUILD_WEB_ARM64_RESULT}" == "failure" ]; then
FAILED_JOBS="${FAILED_JOBS}• build-web-arm64\\n"
fi
if [ "${NEEDS_MERGE_WEB_RESULT}" == "failure" ]; then
FAILED_JOBS="${FAILED_JOBS}• merge-web\\n"
fi
if [ "${NEEDS_BUILD_WEB_CLOUD_AMD64_RESULT}" == "failure" ]; then
FAILED_JOBS="${FAILED_JOBS}• build-web-cloud-amd64\\n"
fi
if [ "${NEEDS_BUILD_WEB_CLOUD_ARM64_RESULT}" == "failure" ]; then
FAILED_JOBS="${FAILED_JOBS}• build-web-cloud-arm64\\n"
fi
if [ "${NEEDS_MERGE_WEB_CLOUD_RESULT}" == "failure" ]; then
FAILED_JOBS="${FAILED_JOBS}• merge-web-cloud\\n"
fi
if [ "${NEEDS_BUILD_BACKEND_AMD64_RESULT}" == "failure" ]; then
FAILED_JOBS="${FAILED_JOBS}• build-backend-amd64\\n"
fi
if [ "${NEEDS_BUILD_BACKEND_ARM64_RESULT}" == "failure" ]; then
FAILED_JOBS="${FAILED_JOBS}• build-backend-arm64\\n"
fi
if [ "${NEEDS_MERGE_BACKEND_RESULT}" == "failure" ]; then
FAILED_JOBS="${FAILED_JOBS}• merge-backend\\n"
fi
if [ "${NEEDS_BUILD_MODEL_SERVER_AMD64_RESULT}" == "failure" ]; then
FAILED_JOBS="${FAILED_JOBS}• build-model-server-amd64\\n"
fi
if [ "${NEEDS_BUILD_MODEL_SERVER_ARM64_RESULT}" == "failure" ]; then
FAILED_JOBS="${FAILED_JOBS}• build-model-server-arm64\\n"
fi
if [ "${NEEDS_MERGE_MODEL_SERVER_RESULT}" == "failure" ]; then
FAILED_JOBS="${FAILED_JOBS}• merge-model-server\\n"
fi
# Remove trailing \n and set output
FAILED_JOBS=$(printf '%s' "$FAILED_JOBS" | sed 's/\\n$//')
echo "jobs=$FAILED_JOBS" >> "$GITHUB_OUTPUT"
env:
NEEDS_BUILD_DESKTOP_RESULT: ${{ needs.build-desktop.result }}
NEEDS_BUILD_WEB_AMD64_RESULT: ${{ needs.build-web-amd64.result }}
NEEDS_BUILD_WEB_ARM64_RESULT: ${{ needs.build-web-arm64.result }}
NEEDS_MERGE_WEB_RESULT: ${{ needs.merge-web.result }}
NEEDS_BUILD_WEB_CLOUD_AMD64_RESULT: ${{ needs.build-web-cloud-amd64.result }}
NEEDS_BUILD_WEB_CLOUD_ARM64_RESULT: ${{ needs.build-web-cloud-arm64.result }}
NEEDS_MERGE_WEB_CLOUD_RESULT: ${{ needs.merge-web-cloud.result }}
NEEDS_BUILD_BACKEND_AMD64_RESULT: ${{ needs.build-backend-amd64.result }}
NEEDS_BUILD_BACKEND_ARM64_RESULT: ${{ needs.build-backend-arm64.result }}
NEEDS_MERGE_BACKEND_RESULT: ${{ needs.merge-backend.result }}
NEEDS_BUILD_MODEL_SERVER_AMD64_RESULT: ${{ needs.build-model-server-amd64.result }}
NEEDS_BUILD_MODEL_SERVER_ARM64_RESULT: ${{ needs.build-model-server-arm64.result }}
NEEDS_MERGE_MODEL_SERVER_RESULT: ${{ needs.merge-model-server.result }}
- name: Send Slack notification
uses: ./.github/actions/slack-notify
with:
webhook-url: ${{ secrets.MONITOR_DEPLOYMENTS_WEBHOOK }}
failed-jobs: ${{ steps.failed-jobs.outputs.jobs }}
title: "🚨 Deployment Workflow Failed"
ref-name: ${{ github.ref_name }}
================================================
FILE: .github/workflows/docker-tag-beta.yml
================================================
# This workflow is set up to be manually triggered via the GitHub Action tab.
# Given a version, it will tag those backend and webserver images as "beta".
name: Tag Beta Version
on:
workflow_dispatch:
inputs:
version:
description: "The version (ie v1.0.0-beta.0) to tag as beta"
required: true
permissions:
contents: read
jobs:
tag:
# See https://runs-on.com/runners/linux/
# use a lower powered instance since this just does i/o to docker hub
runs-on: [runs-on, runner=2cpu-linux-x64, "run-id=${{ github.run_id }}-tag"]
timeout-minutes: 45
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Enable Docker CLI experimental features
run: echo "DOCKER_CLI_EXPERIMENTAL=enabled" >> $GITHUB_ENV
- name: Pull, Tag and Push Web Server Image
env:
VERSION: ${{ github.event.inputs.version }}
run: |
docker buildx imagetools create -t onyxdotapp/onyx-web-server:beta onyxdotapp/onyx-web-server:${VERSION}
- name: Pull, Tag and Push API Server Image
env:
VERSION: ${{ github.event.inputs.version }}
run: |
docker buildx imagetools create -t onyxdotapp/onyx-backend:beta onyxdotapp/onyx-backend:${VERSION}
- name: Pull, Tag and Push Model Server Image
env:
VERSION: ${{ github.event.inputs.version }}
run: |
docker buildx imagetools create -t onyxdotapp/onyx-model-server:beta onyxdotapp/onyx-model-server:${VERSION}
================================================
FILE: .github/workflows/docker-tag-latest.yml
================================================
# This workflow is set up to be manually triggered via the GitHub Action tab.
# Given a version, it will tag those backend and webserver images as "latest".
name: Tag Latest Version
on:
workflow_dispatch:
inputs:
version:
description: "The version (ie v0.0.1) to tag as latest"
required: true
permissions:
contents: read
jobs:
tag:
# See https://runs-on.com/runners/linux/
# use a lower powered instance since this just does i/o to docker hub
runs-on: [runs-on, runner=2cpu-linux-x64, "run-id=${{ github.run_id }}-tag"]
timeout-minutes: 45
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Enable Docker CLI experimental features
run: echo "DOCKER_CLI_EXPERIMENTAL=enabled" >> $GITHUB_ENV
- name: Pull, Tag and Push Web Server Image
env:
VERSION: ${{ github.event.inputs.version }}
run: |
docker buildx imagetools create -t onyxdotapp/onyx-web-server:latest onyxdotapp/onyx-web-server:${VERSION}
- name: Pull, Tag and Push API Server Image
env:
VERSION: ${{ github.event.inputs.version }}
run: |
docker buildx imagetools create -t onyxdotapp/onyx-backend:latest onyxdotapp/onyx-backend:${VERSION}
- name: Pull, Tag and Push Model Server Image
env:
VERSION: ${{ github.event.inputs.version }}
run: |
docker buildx imagetools create -t onyxdotapp/onyx-model-server:latest onyxdotapp/onyx-model-server:${VERSION}
================================================
FILE: .github/workflows/helm-chart-releases.yml
================================================
name: Release Onyx Helm Charts
on:
push:
branches:
- main
permissions: write-all
jobs:
release:
permissions:
contents: write
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false
- name: Install Helm CLI
uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # ratchet:azure/setup-helm@v4
with:
version: v3.12.1
- name: Add required Helm repositories
run: |
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo add onyx-vespa https://onyx-dot-app.github.io/vespa-helm-charts
helm repo add opensearch https://opensearch-project.github.io/helm-charts
helm repo add cloudnative-pg https://cloudnative-pg.github.io/charts
helm repo add ot-container-kit https://ot-container-kit.github.io/helm-charts
helm repo add minio https://charts.min.io/
helm repo add code-interpreter https://onyx-dot-app.github.io/python-sandbox/
helm repo update
- name: Build chart dependencies
run: |
set -euo pipefail
for chart_dir in deployment/helm/charts/*; do
if [ -f "$chart_dir/Chart.yaml" ]; then
echo "Building dependencies for $chart_dir"
helm dependency build "$chart_dir"
fi
done
- name: Publish Helm charts to gh-pages
# NOTE: HEAD of https://github.com/stefanprodan/helm-gh-pages/pull/43
uses: stefanprodan/helm-gh-pages@ad32ad3b8720abfeaac83532fd1e9bdfca5bbe27 # zizmor: ignore[impostor-commit]
with:
token: ${{ secrets.GITHUB_TOKEN }}
charts_dir: deployment/helm/charts
branch: gh-pages
commit_username: ${{ github.actor }}
commit_email: ${{ github.actor }}@users.noreply.github.com
================================================
FILE: .github/workflows/merge-group.yml
================================================
name: Merge Group-Specific
on:
merge_group:
permissions:
contents: read
jobs:
# This job immediately succeeds to satisfy branch protection rules on merge_group events.
# There is a similarly named "required" job in pr-integration-tests.yml which runs the actual
# integration tests. That job runs on both pull_request and merge_group events, and this job
# exists solely to provide a fast-passing check with the same name for branch protection.
# The actual tests remain enforced on presubmit (pull_request events).
required:
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Success
run: echo "Success"
# This job immediately succeeds to satisfy branch protection rules on merge_group events.
# There is a similarly named "playwright-required" job in pr-playwright-tests.yml which runs
# the actual playwright tests. That job runs on both pull_request and merge_group events, and
# this job exists solely to provide a fast-passing check with the same name for branch protection.
# The actual tests remain enforced on presubmit (pull_request events).
playwright-required:
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Success
run: echo "Success"
================================================
FILE: .github/workflows/nightly-close-stale-issues.yml
================================================
name: 'Nightly - Close stale issues and PRs'
on:
schedule:
- cron: '0 11 * * *' # Runs every day at 3 AM PST / 4 AM PDT / 11 AM UTC
permissions:
# contents: write # only for delete-branch option
issues: write
pull-requests: write
jobs:
stale:
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # ratchet:actions/stale@v10
with:
stale-issue-message: 'This issue is stale because it has been open 75 days with no activity. Remove stale label or comment or this will be closed in 15 days.'
stale-pr-message: 'This PR is stale because it has been open 75 days with no activity. Remove stale label or comment or this will be closed in 15 days.'
close-issue-message: 'This issue was closed because it has been stalled for 90 days with no activity.'
close-pr-message: 'This PR was closed because it has been stalled for 90 days with no activity.'
days-before-stale: 75
# days-before-close: 90 # uncomment after we test stale behavior
================================================
FILE: .github/workflows/nightly-llm-provider-chat.yml
================================================
name: Nightly LLM Provider Chat Tests
concurrency:
group: Nightly-LLM-Provider-Chat-${{ github.workflow }}-${{ github.ref_name }}
cancel-in-progress: true
on:
schedule:
# Runs daily at 10:30 UTC (2:30 AM PST / 3:30 AM PDT)
- cron: "30 10 * * *"
workflow_dispatch:
permissions:
contents: read
jobs:
provider-chat-test:
uses: ./.github/workflows/reusable-nightly-llm-provider-chat.yml
secrets:
AWS_OIDC_ROLE_ARN: ${{ secrets.AWS_OIDC_ROLE_ARN }}
permissions:
contents: read
id-token: write
with:
openai_models: ${{ vars.NIGHTLY_LLM_OPENAI_MODELS }}
anthropic_models: ${{ vars.NIGHTLY_LLM_ANTHROPIC_MODELS }}
bedrock_models: ${{ vars.NIGHTLY_LLM_BEDROCK_MODELS }}
vertex_ai_models: ${{ vars.NIGHTLY_LLM_VERTEX_AI_MODELS }}
azure_models: ${{ vars.NIGHTLY_LLM_AZURE_MODELS }}
azure_api_base: ${{ vars.NIGHTLY_LLM_AZURE_API_BASE }}
ollama_models: ${{ vars.NIGHTLY_LLM_OLLAMA_MODELS }}
openrouter_models: ${{ vars.NIGHTLY_LLM_OPENROUTER_MODELS }}
strict: true
notify-slack-on-failure:
needs: [provider-chat-test]
if: failure() && github.event_name == 'schedule'
runs-on: ubuntu-slim
environment: ci-protected
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Send Slack notification
uses: ./.github/actions/slack-notify
with:
webhook-url: ${{ secrets.SLACK_WEBHOOK }}
failed-jobs: provider-chat-test
title: "🚨 Scheduled LLM Provider Chat Tests failed!"
ref-name: ${{ github.ref_name }}
================================================
FILE: .github/workflows/post-merge-beta-cherry-pick.yml
================================================
name: Post-Merge Beta Cherry-Pick
on:
pull_request_target:
types:
- closed
# SECURITY NOTE:
# This workflow intentionally uses pull_request_target so post-merge automation can
# use base-repo credentials. Do not checkout PR head refs in this workflow
# (e.g. github.event.pull_request.head.sha). Only trusted base refs are allowed.
permissions:
contents: read
jobs:
resolve-cherry-pick-request:
if: >-
github.event.pull_request.merged == true
&& github.event.pull_request.base.ref == 'main'
&& github.event.pull_request.head.repo.full_name == github.repository
outputs:
should_cherrypick: ${{ steps.gate.outputs.should_cherrypick }}
pr_number: ${{ steps.gate.outputs.pr_number }}
merge_commit_sha: ${{ steps.gate.outputs.merge_commit_sha }}
merged_by: ${{ steps.gate.outputs.merged_by }}
gate_error: ${{ steps.gate.outputs.gate_error }}
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Resolve merged PR and checkbox state
id: gate
env:
GH_TOKEN: ${{ github.token }}
PR_NUMBER: ${{ github.event.pull_request.number }}
# SECURITY: keep PR body in env/plain-text handling; avoid directly
# inlining github.event.pull_request.body into shell commands.
PR_BODY: ${{ github.event.pull_request.body }}
MERGE_COMMIT_SHA: ${{ github.event.pull_request.merge_commit_sha }}
MERGED_BY: ${{ github.event.pull_request.merged_by.login }}
# Explicit merger allowlist used because pull_request_target runs with
# the default GITHUB_TOKEN, which cannot reliably read org/team
# membership for this repository context.
ALLOWED_MERGERS: |
acaprau
bo-onyx
danelegend
duo-onyx
evan-onyx
jessicasingh7
jmelahman
joachim-danswer
justin-tahara
nmgarza5
raunakab
rohoswagger
subash-mohan
trial2onyx
wenxi-onyx
weves
yuhongsun96
run: |
echo "pr_number=${PR_NUMBER}" >> "$GITHUB_OUTPUT"
echo "merged_by=${MERGED_BY}" >> "$GITHUB_OUTPUT"
if ! echo "${PR_BODY}" | grep -qiE "\\[x\\][[:space:]]*(\\[[^]]+\\][[:space:]]*)?Please cherry-pick this PR to the latest release version"; then
echo "should_cherrypick=false" >> "$GITHUB_OUTPUT"
echo "Cherry-pick checkbox not checked for PR #${PR_NUMBER}. Skipping."
exit 0
fi
# Keep should_cherrypick output before any possible exit 1 below so
# notify-slack can still gate on this output even if this job fails.
echo "should_cherrypick=true" >> "$GITHUB_OUTPUT"
echo "Cherry-pick checkbox checked for PR #${PR_NUMBER}."
if [ -z "${MERGE_COMMIT_SHA}" ] || [ "${MERGE_COMMIT_SHA}" = "null" ]; then
echo "gate_error=missing-merge-commit-sha" >> "$GITHUB_OUTPUT"
echo "::error::PR #${PR_NUMBER} requested cherry-pick, but merge_commit_sha is missing."
exit 1
fi
echo "merge_commit_sha=${MERGE_COMMIT_SHA}" >> "$GITHUB_OUTPUT"
normalized_merged_by="$(printf '%s' "${MERGED_BY}" | tr '[:upper:]' '[:lower:]')"
normalized_allowed_mergers="$(printf '%s\n' "${ALLOWED_MERGERS}" | tr '[:upper:]' '[:lower:]')"
if ! printf '%s\n' "${normalized_allowed_mergers}" | grep -Fxq "${normalized_merged_by}"; then
echo "gate_error=not-allowed-merger" >> "$GITHUB_OUTPUT"
echo "::error::${MERGED_BY} is not in the explicit cherry-pick merger allowlist. Failing cherry-pick gate."
exit 1
fi
exit 0
cherry-pick-to-latest-release:
needs:
- resolve-cherry-pick-request
if: needs.resolve-cherry-pick-request.outputs.should_cherrypick == 'true' && needs.resolve-cherry-pick-request.result == 'success'
permissions:
contents: write
pull-requests: write
outputs:
cherry_pick_pr_url: ${{ steps.run_cherry_pick.outputs.pr_url }}
cherry_pick_reason: ${{ steps.run_cherry_pick.outputs.reason }}
cherry_pick_details: ${{ steps.run_cherry_pick.outputs.details }}
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Checkout repository
# SECURITY: keep checkout pinned to trusted base branch; do not switch to PR head refs.
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: true
ref: main
- name: Install the latest version of uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # ratchet:astral-sh/setup-uv@v7
with:
enable-cache: false
version: "0.9.9"
- name: Configure git identity
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Create cherry-pick PR to latest release
id: run_cherry_pick
env:
GH_TOKEN: ${{ github.token }}
GITHUB_TOKEN: ${{ github.token }}
CHERRY_PICK_ASSIGNEE: ${{ needs.resolve-cherry-pick-request.outputs.merged_by }}
MERGE_COMMIT_SHA: ${{ needs.resolve-cherry-pick-request.outputs.merge_commit_sha }}
run: |
output_file="$(mktemp)"
set +e
uv run --no-sync --with onyx-devtools ods cherry-pick "${MERGE_COMMIT_SHA}" --yes --no-verify 2>&1 | tee "$output_file"
pipe_statuses=("${PIPESTATUS[@]}")
exit_code="${pipe_statuses[0]}"
tee_exit="${pipe_statuses[1]:-0}"
set -e
if [ "${tee_exit}" -ne 0 ]; then
echo "status=failure" >> "$GITHUB_OUTPUT"
echo "reason=output-capture-failed" >> "$GITHUB_OUTPUT"
echo "::error::tee failed to capture cherry-pick output (exit ${tee_exit}); cannot classify result."
exit 1
fi
if [ "${exit_code}" -eq 0 ]; then
pr_url="$(sed -n 's/^.*PR created successfully: \(https:\/\/github\.com\/[^[:space:]]\+\/pull\/[0-9]\+\).*$/\1/p' "$output_file" | tail -n 1)"
echo "status=success" >> "$GITHUB_OUTPUT"
if [ -n "${pr_url}" ]; then
echo "pr_url=${pr_url}" >> "$GITHUB_OUTPUT"
fi
exit 0
fi
echo "status=failure" >> "$GITHUB_OUTPUT"
reason="command-failed"
if grep -qiE "merge conflict during cherry-pick|CONFLICT|could not apply|cherry-pick in progress with staged changes" "$output_file"; then
reason="merge-conflict"
fi
echo "reason=${reason}" >> "$GITHUB_OUTPUT"
{
echo "details<<EOF"
tail -n 40 "$output_file"
echo "EOF"
} >> "$GITHUB_OUTPUT"
- name: Mark workflow as failed if cherry-pick failed
if: steps.run_cherry_pick.outputs.status == 'failure'
env:
CHERRY_PICK_REASON: ${{ steps.run_cherry_pick.outputs.reason }}
run: |
echo "::error::Automated cherry-pick failed (${CHERRY_PICK_REASON})."
exit 1
notify-slack-on-cherry-pick-success:
needs:
- resolve-cherry-pick-request
- cherry-pick-to-latest-release
if: needs.resolve-cherry-pick-request.outputs.should_cherrypick == 'true' && needs.resolve-cherry-pick-request.result == 'success' && needs.cherry-pick-to-latest-release.result == 'success'
runs-on: ubuntu-slim
environment: ci-protected
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Fail if Slack webhook secret is missing
env:
CHERRY_PICK_PRS_WEBHOOK: ${{ secrets.CHERRY_PICK_PRS_WEBHOOK }}
run: |
if [ -z "${CHERRY_PICK_PRS_WEBHOOK}" ]; then
echo "::error::CHERRY_PICK_PRS_WEBHOOK is not configured."
exit 1
fi
- name: Build cherry-pick success summary
id: success-summary
env:
SOURCE_PR_NUMBER: ${{ needs.resolve-cherry-pick-request.outputs.pr_number }}
MERGE_COMMIT_SHA: ${{ needs.resolve-cherry-pick-request.outputs.merge_commit_sha }}
CHERRY_PICK_PR_URL: ${{ needs.cherry-pick-to-latest-release.outputs.cherry_pick_pr_url }}
run: |
source_pr_url="https://github.com/${GITHUB_REPOSITORY}/pull/${SOURCE_PR_NUMBER}"
details="*Cherry-pick PR opened successfully.*\\n• author: {mention}\\n• source PR: ${source_pr_url}"
if [ -n "${CHERRY_PICK_PR_URL}" ]; then
details="${details}\\n• cherry-pick PR: ${CHERRY_PICK_PR_URL}"
fi
if [ -n "${MERGE_COMMIT_SHA}" ]; then
details="${details}\\n• merge SHA: ${MERGE_COMMIT_SHA}"
fi
echo "details=${details}" >> "$GITHUB_OUTPUT"
- name: Notify #cherry-pick-prs about cherry-pick success
uses: ./.github/actions/slack-notify
with:
webhook-url: ${{ secrets.CHERRY_PICK_PRS_WEBHOOK }}
mention: ${{ needs.resolve-cherry-pick-request.outputs.merged_by }}
details: ${{ steps.success-summary.outputs.details }}
title: "✅ Automated Cherry-Pick PR Opened"
ref-name: ${{ github.event.pull_request.base.ref }}
notify-slack-on-cherry-pick-failure:
needs:
- resolve-cherry-pick-request
- cherry-pick-to-latest-release
if: always() && needs.resolve-cherry-pick-request.outputs.should_cherrypick == 'true' && (needs.resolve-cherry-pick-request.result == 'failure' || needs.cherry-pick-to-latest-release.result == 'failure')
runs-on: ubuntu-slim
environment: ci-protected
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Fail if Slack webhook secret is missing
env:
CHERRY_PICK_PRS_WEBHOOK: ${{ secrets.CHERRY_PICK_PRS_WEBHOOK }}
run: |
if [ -z "${CHERRY_PICK_PRS_WEBHOOK}" ]; then
echo "::error::CHERRY_PICK_PRS_WEBHOOK is not configured."
exit 1
fi
- name: Build cherry-pick failure summary
id: failure-summary
env:
SOURCE_PR_NUMBER: ${{ needs.resolve-cherry-pick-request.outputs.pr_number }}
MERGE_COMMIT_SHA: ${{ needs.resolve-cherry-pick-request.outputs.merge_commit_sha }}
GATE_ERROR: ${{ needs.resolve-cherry-pick-request.outputs.gate_error }}
CHERRY_PICK_REASON: ${{ needs.cherry-pick-to-latest-release.outputs.cherry_pick_reason }}
CHERRY_PICK_DETAILS: ${{ needs.cherry-pick-to-latest-release.outputs.cherry_pick_details }}
run: |
source_pr_url="https://github.com/${GITHUB_REPOSITORY}/pull/${SOURCE_PR_NUMBER}"
reason_text="cherry-pick command failed"
if [ "${GATE_ERROR}" = "missing-merge-commit-sha" ]; then
reason_text="requested cherry-pick but merge commit SHA was missing"
elif [ "${GATE_ERROR}" = "not-allowed-merger" ]; then
reason_text="merger is not in the explicit cherry-pick allowlist"
elif [ "${CHERRY_PICK_REASON}" = "output-capture-failed" ]; then
reason_text="failed to capture cherry-pick output for classification"
elif [ "${CHERRY_PICK_REASON}" = "merge-conflict" ]; then
reason_text="merge conflict during cherry-pick"
fi
details_excerpt="$(printf '%s' "${CHERRY_PICK_DETAILS}" | tail -n 8 | tr '\n' ' ' | sed "s/[[:space:]]\\+/ /g" | sed "s/\"/'/g" | cut -c1-350)"
if [ -n "${GATE_ERROR}" ]; then
failed_job_label="resolve-cherry-pick-request"
else
failed_job_label="cherry-pick-to-latest-release"
fi
details="• author: {mention}\\n• ${failed_job_label}\\n• source PR: ${source_pr_url}\\n• reason: ${reason_text}"
if [ -n "${MERGE_COMMIT_SHA}" ]; then
details="${details}\\n• merge SHA: ${MERGE_COMMIT_SHA}"
fi
if [ -n "${details_excerpt}" ]; then
details="${details}\\n• excerpt: ${details_excerpt}"
fi
echo "details=${details}" >> "$GITHUB_OUTPUT"
- name: Notify #cherry-pick-prs about cherry-pick failure
uses: ./.github/actions/slack-notify
with:
webhook-url: ${{ secrets.CHERRY_PICK_PRS_WEBHOOK }}
mention: ${{ needs.resolve-cherry-pick-request.outputs.merged_by }}
details: ${{ steps.failure-summary.outputs.details }}
title: "🚨 Automated Cherry-Pick Failed"
ref-name: ${{ github.event.pull_request.base.ref }}
================================================
FILE: .github/workflows/pr-database-tests.yml
================================================
name: Database Tests
concurrency:
group: Database-Tests-${{ github.workflow }}-${{ github.head_ref || github.event.workflow_run.head_branch || github.run_id }}
cancel-in-progress: true
on:
merge_group:
pull_request:
branches:
- main
- "release/**"
push:
tags:
- "v*.*.*"
permissions:
contents: read
jobs:
database-tests:
runs-on:
- runs-on
- runner=2cpu-linux-arm64
- "run-id=${{ github.run_id }}-database-tests"
timeout-minutes: 45
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Setup Python and Install Dependencies
uses: ./.github/actions/setup-python-and-install-dependencies
with:
requirements: |
backend/requirements/default.txt
backend/requirements/dev.txt
- name: Generate OpenAPI schema and Python client
shell: bash
# TODO(Nik): https://linear.app/onyx-app/issue/ENG-1/update-test-infra-to-use-test-license
env:
LICENSE_ENFORCEMENT_ENABLED: "false"
run: |
ods openapi all
# needed for pulling external images otherwise, we hit the "Unauthenticated users" limit
# https://docs.docker.com/docker-hub/usage/
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Start Docker containers
working-directory: ./deployment/docker_compose
run: |
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d \
relational_db
- name: Run Database Tests
working-directory: ./backend
run: pytest -m alembic tests/integration/tests/migrations/
================================================
FILE: .github/workflows/pr-desktop-build.yml
================================================
name: Build Desktop App
concurrency:
group: Build-Desktop-App-${{ github.workflow }}-${{ github.head_ref || github.event.workflow_run.head_branch || github.run_id }}
cancel-in-progress: true
on:
merge_group:
pull_request:
branches:
- main
- "release/**"
paths:
- "desktop/**"
- ".github/workflows/pr-desktop-build.yml"
push:
tags:
- "v*.*.*"
permissions:
contents: read
jobs:
build-desktop:
name: Build Desktop (${{ matrix.platform }})
runs-on: ${{ matrix.os }}
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
include:
- platform: linux
os: ubuntu-latest
target: x86_64-unknown-linux-gnu
args: "--bundles deb,rpm"
# TODO: Fix and enable the macOS build.
#- platform: macos
# os: macos-latest
# target: universal-apple-darwin
# args: "--target universal-apple-darwin"
# TODO: Fix and enable the Windows build.
#- platform: windows
# os: windows-latest
# target: x86_64-pc-windows-msvc
# args: ""
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
persist-credentials: false
- name: Setup node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f
with:
node-version: 24
cache: "npm" # zizmor: ignore[cache-poisoning]
cache-dependency-path: ./desktop/package-lock.json
- name: Setup Rust
uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9
with:
toolchain: stable
targets: ${{ matrix.target }}
- name: Cache Cargo registry and build
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # zizmor: ignore[cache-poisoning]
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
desktop/src-tauri/target/
key: ${{ runner.os }}-cargo-${{ hashFiles('desktop/src-tauri/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- name: Install Linux dependencies
if: matrix.platform == 'linux'
run: |
sudo apt-get update
sudo apt-get install -y \
build-essential \
libglib2.0-dev \
libgirepository1.0-dev \
libgtk-3-dev \
libjavascriptcoregtk-4.1-dev \
libwebkit2gtk-4.1-dev \
libayatana-appindicator3-dev \
gobject-introspection \
pkg-config \
curl \
xdg-utils
- name: Install npm dependencies
working-directory: ./desktop
run: npm ci
- name: Build desktop app
working-directory: ./desktop
run: npx tauri build ${{ matrix.args }}
env:
TAURI_SIGNING_PRIVATE_KEY: ""
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ""
- name: Upload build artifacts
if: always()
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f
with:
name: desktop-build-${{ matrix.platform }}-${{ github.run_id }}
path: |
desktop/src-tauri/target/release/bundle/
retention-days: 7
if-no-files-found: ignore
================================================
FILE: .github/workflows/pr-external-dependency-unit-tests.yml
================================================
name: External Dependency Unit Tests
concurrency:
group: External-Dependency-Unit-Tests-${{ github.workflow }}-${{ github.head_ref || github.event.workflow_run.head_branch || github.run_id }}
cancel-in-progress: true
on:
merge_group:
pull_request:
branches: [main]
paths:
- "backend/**"
- "pyproject.toml"
- "uv.lock"
- ".github/workflows/pr-external-dependency-unit-tests.yml"
- ".github/actions/setup-python-and-install-dependencies/**"
- ".github/actions/setup-playwright/**"
- "deployment/docker_compose/docker-compose.yml"
- "deployment/docker_compose/docker-compose.dev.yml"
push:
tags:
- "v*.*.*"
permissions:
contents: read
env:
# AWS credentials for S3-specific test
S3_AWS_ACCESS_KEY_ID_FOR_TEST: ${{ secrets.S3_AWS_ACCESS_KEY_ID }}
S3_AWS_SECRET_ACCESS_KEY_FOR_TEST: ${{ secrets.S3_AWS_SECRET_ACCESS_KEY }}
# MinIO
S3_ENDPOINT_URL: "http://localhost:9004"
S3_AWS_ACCESS_KEY_ID: "minioadmin"
S3_AWS_SECRET_ACCESS_KEY: "minioadmin"
# Confluence
CONFLUENCE_TEST_SPACE_URL: ${{ vars.CONFLUENCE_TEST_SPACE_URL }}
CONFLUENCE_TEST_SPACE: ${{ vars.CONFLUENCE_TEST_SPACE }}
CONFLUENCE_TEST_PAGE_ID: ${{ secrets.CONFLUENCE_TEST_PAGE_ID }}
CONFLUENCE_USER_NAME: ${{ vars.CONFLUENCE_USER_NAME }}
CONFLUENCE_ACCESS_TOKEN: ${{ secrets.CONFLUENCE_ACCESS_TOKEN }}
CONFLUENCE_ACCESS_TOKEN_SCOPED: ${{ secrets.CONFLUENCE_ACCESS_TOKEN_SCOPED }}
# Jira
JIRA_ADMIN_API_TOKEN: ${{ secrets.JIRA_ADMIN_API_TOKEN }}
# LLMs
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
VERTEX_CREDENTIALS: ${{ secrets.VERTEX_CREDENTIALS }}
VERTEX_LOCATION: ${{ vars.VERTEX_LOCATION }}
# Code Interpreter
# TODO: debug why this is failing and enable
CODE_INTERPRETER_BASE_URL: http://localhost:8000
jobs:
discover-test-dirs:
# NOTE: Github-hosted runners have about 20s faster queue times and are preferred here.
runs-on: ubuntu-slim
timeout-minutes: 45
outputs:
test-dirs: ${{ steps.set-matrix.outputs.test-dirs }}
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Discover test directories
id: set-matrix
run: |
# Find all subdirectories in backend/tests/external_dependency_unit
dirs=$(find backend/tests/external_dependency_unit -mindepth 1 -maxdepth 1 -type d -exec basename {} \; | sort | jq -R -s -c 'split("\n")[:-1]')
echo "test-dirs=$dirs" >> $GITHUB_OUTPUT
external-dependency-unit-tests:
needs: discover-test-dirs
# Use larger runner with more resources for Vespa
runs-on:
- runs-on
- runner=2cpu-linux-arm64
- ${{ format('run-id={0}-external-dependency-unit-tests-job-{1}', github.run_id, strategy['job-index']) }}
- extras=s3-cache
timeout-minutes: 45
strategy:
fail-fast: false
matrix:
test-dir: ${{ fromJson(needs.discover-test-dirs.outputs.test-dirs) }}
env:
PYTHONPATH: ./backend
MODEL_SERVER_HOST: "disabled"
DISABLE_TELEMETRY: "true"
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Setup Python and Install Dependencies
uses: ./.github/actions/setup-python-and-install-dependencies
with:
requirements: |
backend/requirements/default.txt
backend/requirements/dev.txt
backend/requirements/ee.txt
- name: Setup Playwright
uses: ./.github/actions/setup-playwright
# needed for pulling Vespa, Redis, Postgres, and Minio images
# otherwise, we hit the "Unauthenticated users" limit
# https://docs.docker.com/docker-hub/usage/
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Create .env file for Docker Compose
run: |
cat <<EOF > deployment/docker_compose/.env
COMPOSE_PROFILES=s3-filestore,opensearch-enabled
DISABLE_TELEMETRY=true
OPENSEARCH_FOR_ONYX_ENABLED=true
EOF
- name: Set up Standard Dependencies
run: |
cd deployment/docker_compose
docker compose \
-f docker-compose.yml \
-f docker-compose.dev.yml \
up -d \
minio \
relational_db \
cache \
index \
opensearch \
code-interpreter
- name: Run migrations
run: |
cd backend
# Run migrations to head
alembic upgrade head
alembic heads --verbose
- name: Run Tests for ${{ matrix.test-dir }}
shell: script -q -e -c "bash --noprofile --norc -eo pipefail {0}"
env:
TEST_DIR: ${{ matrix.test-dir }}
run: |
py.test \
--durations=8 \
-o junit_family=xunit2 \
-xv \
--ff \
backend/tests/external_dependency_unit/${TEST_DIR}
- name: Collect Docker logs on failure
if: failure()
run: |
mkdir -p docker-logs
cd deployment/docker_compose
# Get list of running containers
containers=$(docker compose -f docker-compose.yml -f docker-compose.dev.yml ps -q)
# Collect logs from each container
for container in $containers; do
container_name=$(docker inspect --format='{{.Name}}' $container | sed 's/^\///')
echo "Collecting logs from $container_name..."
docker logs $container > ../../docker-logs/${container_name}.log 2>&1
done
cd ../..
echo "Docker logs collected in docker-logs directory"
- name: Upload Docker logs
if: failure()
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f
with:
name: docker-logs-${{ matrix.test-dir }}
path: docker-logs/
retention-days: 7
================================================
FILE: .github/workflows/pr-golang-tests.yml
================================================
name: Golang Tests
concurrency:
group: Golang-Tests-${{ github.workflow }}-${{ github.head_ref || github.event.workflow_run.head_branch || github.run_id }}
cancel-in-progress: true
on:
merge_group:
pull_request:
branches:
- main
- "release/**"
push:
tags:
- "v*.*.*"
permissions: {}
env:
GO_VERSION: "1.26"
jobs:
detect-modules:
runs-on: ubuntu-latest
timeout-minutes: 10
outputs:
modules: ${{ steps.set-modules.outputs.modules }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
persist-credentials: false
- id: set-modules
run: echo "modules=$(find . -name 'go.mod' -exec dirname {} \; | jq -Rc '[.,inputs]')" >> "$GITHUB_OUTPUT"
golang:
needs: detect-modules
runs-on: ubuntu-latest
timeout-minutes: 10
strategy:
matrix:
modules: ${{ fromJSON(needs.detect-modules.outputs.modules) }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # zizmor: ignore[cache-poisoning]
with:
go-version: ${{ env.GO_VERSION }}
cache-dependency-path: "**/go.sum"
- run: go mod tidy
working-directory: ${{ matrix.modules }}
- run: git diff --exit-code go.mod go.sum
working-directory: ${{ matrix.modules }}
- run: go test ./...
working-directory: ${{ matrix.modules }}
================================================
FILE: .github/workflows/pr-helm-chart-testing.yml
================================================
name: Helm - Lint and Test Charts
concurrency:
group: Helm-Lint-and-Test-Charts-${{ github.workflow }}-${{ github.head_ref || github.event.workflow_run.head_branch || github.run_id }}
cancel-in-progress: true
on:
merge_group:
pull_request:
branches: [main]
push:
tags:
- "v*.*.*"
workflow_dispatch: # Allows manual triggering
permissions:
contents: read
jobs:
helm-chart-check:
# See https://runs-on.com/runners/linux/
runs-on:
[
runs-on,
runner=8cpu-linux-x64,
hdd=256,
"run-id=${{ github.run_id }}-helm-chart-check",
]
timeout-minutes: 45
# fetch-depth 0 is required for helm/chart-testing-action
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false
- name: Set up Helm
uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # ratchet:azure/setup-helm@v4.3.1
with:
version: v3.19.0
- name: Set up chart-testing
uses: helm/chart-testing-action@2e2940618cb426dce2999631d543b53cdcfc8527
with:
uv_version: "0.9.9"
# even though we specify chart-dirs in ct.yaml, it isn't used by ct for the list-changed command...
- name: Run chart-testing (list-changed)
id: list-changed
env:
DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
run: |
echo "default_branch: ${DEFAULT_BRANCH}"
changed=$(ct list-changed --remote origin --target-branch ${DEFAULT_BRANCH} --chart-dirs deployment/helm/charts)
echo "list-changed output: $changed"
if [[ -n "$changed" ]]; then
echo "changed=true" >> "$GITHUB_OUTPUT"
fi
# uncomment to force run chart-testing
# - name: Force run chart-testing (list-changed)
# id: list-changed
# run: echo "changed=true" >> $GITHUB_OUTPUT
# lint all charts if any changes were detected
- name: Run chart-testing (lint)
if: steps.list-changed.outputs.changed == 'true'
run: ct lint --config ct.yaml --all
# the following would lint only changed charts, but linting isn't expensive
# run: ct lint --config ct.yaml --target-branch ${{ github.event.repository.default_branch }}
- name: Create kind cluster
if: steps.list-changed.outputs.changed == 'true'
uses: helm/kind-action@ef37e7f390d99f746eb8b610417061a60e82a6cc # ratchet:helm/kind-action@v1.14.0
- name: Pre-install cluster status check
if: steps.list-changed.outputs.changed == 'true'
run: |
echo "=== Pre-install Cluster Status ==="
kubectl get nodes -o wide
kubectl get pods --all-namespaces
kubectl get storageclass
- name: Add Helm repositories and update
if: steps.list-changed.outputs.changed == 'true'
run: |
echo "=== Adding Helm repositories ==="
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo add vespa https://onyx-dot-app.github.io/vespa-helm-charts
helm repo add opensearch https://opensearch-project.github.io/helm-charts
helm repo add cloudnative-pg https://cloudnative-pg.github.io/charts
helm repo add ot-container-kit https://ot-container-kit.github.io/helm-charts
helm repo add minio https://charts.min.io/
helm repo add code-interpreter https://onyx-dot-app.github.io/python-sandbox/
helm repo update
- name: Install Redis operator
if: steps.list-changed.outputs.changed == 'true'
shell: bash
run: |
echo "=== Installing redis-operator CRDs ==="
helm upgrade --install redis-operator ot-container-kit/redis-operator \
--namespace redis-operator --create-namespace --wait --timeout 300s
- name: Pre-pull required images
if: steps.list-changed.outputs.changed == 'true'
run: |
echo "=== Pre-pulling required images to avoid timeout ==="
KIND_CLUSTER=$(kubectl config current-context | sed 's/kind-//')
echo "Kind cluster: $KIND_CLUSTER"
IMAGES=(
"ghcr.io/cloudnative-pg/cloudnative-pg:1.27.0"
"quay.io/opstree/redis:v7.0.15"
"docker.io/onyxdotapp/onyx-web-server:latest"
)
for image in "${IMAGES[@]}"; do
echo "Pre-pulling $image"
if docker pull "$image"; then
kind load docker-image "$image" --name "$KIND_CLUSTER" || echo "Failed to load $image into kind"
else
echo "Failed to pull $image"
fi
done
echo "=== Images loaded into Kind cluster ==="
docker exec "$KIND_CLUSTER"-control-plane crictl images | grep -E "(cloudnative-pg|redis|onyx)" || echo "Some images may still be loading..."
- name: Validate chart dependencies
if: steps.list-changed.outputs.changed == 'true'
run: |
echo "=== Validating chart dependencies ==="
cd deployment/helm/charts/onyx
helm dependency update
helm lint . --set auth.userauth.values.user_auth_secret=placeholder
- name: Run chart-testing (install) with enhanced monitoring
timeout-minutes: 25
if: steps.list-changed.outputs.changed == 'true'
run: |
echo "=== Starting chart installation with monitoring ==="
# Function to monitor cluster state
monitor_cluster() {
while true; do
echo "=== Cluster Status Check at $(date) ==="
# Only show non-running pods to reduce noise
NON_RUNNING_PODS=$(kubectl get pods --all-namespaces --field-selector=status.phase!=Running,status.phase!=Succeeded --no-headers 2>/dev/null | wc -l)
if [ "$NON_RUNNING_PODS" -gt 0 ]; then
echo "Non-running pods:"
kubectl get pods --all-namespaces --field-selector=status.phase!=Running,status.phase!=Succeeded
else
echo "All pods running successfully"
fi
# Only show recent events if there are issues
RECENT_EVENTS=$(kubectl get events --sort-by=.lastTimestamp --all-namespaces --field-selector=type!=Normal 2>/dev/null | tail -5)
if [ -n "$RECENT_EVENTS" ]; then
echo "Recent warnings/errors:"
echo "$RECENT_EVENTS"
fi
sleep 60
done
}
# Start monitoring in background
monitor_cluster &
MONITOR_PID=$!
# Set up cleanup
cleanup() {
echo "=== Cleaning up monitoring process ==="
kill $MONITOR_PID 2>/dev/null || true
echo "=== Final cluster state ==="
kubectl get pods --all-namespaces
kubectl get events --all-namespaces --sort-by=.lastTimestamp | tail -20
}
# Trap cleanup on exit
trap cleanup EXIT
# Run the actual installation with detailed logging
# Note that opensearch.enabled is true whereas others in this install
# are false. There is some work that needs to be done to get this
# entire step working in CI, enabling opensearch here is a small step
# in that direction. If this is causing issues, disabling it in this
# step should be ok in the short term.
echo "=== Starting ct install ==="
set +e
ct install --all \
--helm-extra-set-args="\
--set=nginx.enabled=false \
--set=minio.enabled=false \
--set=vespa.enabled=false \
--set=opensearch.enabled=true \
--set=auth.opensearch.enabled=true \
--set=auth.userauth.values.user_auth_secret=test-secret \
--set=slackbot.enabled=false \
--set=postgresql.enabled=true \
--set=postgresql.cluster.storage.storageClass=standard \
--set=redis.enabled=true \
--set=redis.storageSpec.volumeClaimTemplate.spec.storageClassName=standard \
--set=webserver.replicaCount=1 \
--set=api.replicaCount=0 \
--set=inferenceCapability.replicaCount=0 \
--set=indexCapability.replicaCount=0 \
--set=celery_beat.replicaCount=0 \
--set=celery_worker_heavy.replicaCount=0 \
--set=celery_worker_docfetching.replicaCount=0 \
--set=celery_worker_docprocessing.replicaCount=0 \
--set=celery_worker_light.replicaCount=0 \
--set=celery_worker_monitoring.replicaCount=0 \
--set=celery_worker_primary.replicaCount=0 \
--set=celery_worker_user_file_processing.replicaCount=0 \
--set=celery_worker_user_files_indexing.replicaCount=0" \
--helm-extra-args="--timeout 900s --debug" \
--debug --config ct.yaml
CT_EXIT=$?
set -e
if [[ $CT_EXIT -ne 0 ]]; then
echo "ct install failed with exit code $CT_EXIT"
exit $CT_EXIT
else
echo "=== Installation completed successfully ==="
fi
kubectl get pods --all-namespaces
- name: Post-install verification
if: steps.list-changed.outputs.changed == 'true'
run: |
echo "=== Post-install verification ==="
if ! kubectl cluster-info >/dev/null 2>&1; then
echo "ERROR: Kubernetes cluster is not reachable after install"
exit 1
fi
kubectl get pods --all-namespaces
kubectl get services --all-namespaces
# Only show issues if they exist
kubectl describe pods --all-namespaces | grep -A 5 -B 2 "Failed\|Error\|Warning" || echo "No pod issues found"
- name: Cleanup on failure
if: failure() && steps.list-changed.outputs.changed == 'true'
run: |
echo "=== Cleanup on failure ==="
if ! kubectl cluster-info >/dev/null 2>&1; then
echo "Skipping failure cleanup: Kubernetes cluster is not reachable"
exit 0
fi
echo "=== Final cluster state ==="
kubectl get pods --all-namespaces
kubectl get events --all-namespaces --sort-by=.lastTimestamp | tail -10
echo "=== Pod descriptions for debugging ==="
kubectl describe pods --all-namespaces | grep -A 10 -B 3 "Failed\|Error\|Warning\|Pending" || echo "No problematic pods found"
echo "=== Recent logs for debugging ==="
kubectl logs --all-namespaces --tail=50 | grep -i "error\|timeout\|failed\|pull" || echo "No error logs found"
echo "=== Helm releases ==="
helm list --all-namespaces
# the following would install only changed charts, but we only have one chart so
# don't worry about that for now
# run: ct install --target-branch ${{ github.event.repository.default_branch }}
================================================
FILE: .github/workflows/pr-integration-tests.yml
================================================
name: Run Integration Tests v2
concurrency:
group: Run-Integration-Tests-${{ github.workflow }}-${{ github.head_ref || github.event.workflow_run.head_branch || github.run_id }}
cancel-in-progress: true
on:
merge_group:
pull_request:
branches:
- main
- "release/**"
push:
tags:
- "v*.*.*"
permissions:
contents: read
env:
# Test Environment Variables
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_BOT_TOKEN_TEST_SPACE: ${{ secrets.SLACK_BOT_TOKEN_TEST_SPACE }}
CONFLUENCE_TEST_SPACE_URL: ${{ vars.CONFLUENCE_TEST_SPACE_URL }}
CONFLUENCE_USER_NAME: ${{ vars.CONFLUENCE_USER_NAME }}
CONFLUENCE_ACCESS_TOKEN: ${{ secrets.CONFLUENCE_ACCESS_TOKEN }}
CONFLUENCE_ACCESS_TOKEN_SCOPED: ${{ secrets.CONFLUENCE_ACCESS_TOKEN_SCOPED }}
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
JIRA_API_TOKEN_SCOPED: ${{ secrets.JIRA_API_TOKEN_SCOPED }}
PERM_SYNC_SHAREPOINT_CLIENT_ID: ${{ secrets.PERM_SYNC_SHAREPOINT_CLIENT_ID }}
PERM_SYNC_SHAREPOINT_PRIVATE_KEY: ${{ secrets.PERM_SYNC_SHAREPOINT_PRIVATE_KEY }}
PERM_SYNC_SHAREPOINT_CERTIFICATE_PASSWORD: ${{ secrets.PERM_SYNC_SHAREPOINT_CERTIFICATE_PASSWORD }}
PERM_SYNC_SHAREPOINT_DIRECTORY_ID: ${{ secrets.PERM_SYNC_SHAREPOINT_DIRECTORY_ID }}
EXA_API_KEY: ${{ secrets.EXA_API_KEY }}
GITHUB_PERMISSION_SYNC_TEST_ACCESS_TOKEN: ${{ secrets.ONYX_GITHUB_PERMISSION_SYNC_TEST_ACCESS_TOKEN }}
GITHUB_PERMISSION_SYNC_TEST_ACCESS_TOKEN_CLASSIC: ${{ secrets.ONYX_GITHUB_PERMISSION_SYNC_TEST_ACCESS_TOKEN_CLASSIC }}
GITHUB_ADMIN_EMAIL: ${{ secrets.ONYX_GITHUB_ADMIN_EMAIL }}
GITHUB_TEST_USER_1_EMAIL: ${{ secrets.ONYX_GITHUB_TEST_USER_1_EMAIL }}
GITHUB_TEST_USER_2_EMAIL: ${{ secrets.ONYX_GITHUB_TEST_USER_2_EMAIL }}
jobs:
discover-test-dirs:
# NOTE: Github-hosted runners have about 20s faster queue times and are preferred here.
runs-on: ubuntu-slim
timeout-minutes: 45
outputs:
test-dirs: ${{ steps.set-matrix.outputs.test-dirs }}
editions: ${{ steps.set-editions.outputs.editions }}
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Discover test directories
id: set-matrix
run: |
# Find all leaf-level directories in both test directories
tests_dirs=$(find backend/tests/integration/tests -mindepth 1 -maxdepth 1 -type d ! -name "__pycache__" ! -name "mcp" ! -name "no_vectordb" -exec basename {} \; | sort)
connector_dirs=$(find backend/tests/integration/connector_job_tests -mindepth 1 -maxdepth 1 -type d ! -name "__pycache__" -exec basename {} \; | sort)
# Create JSON array with directory info
all_dirs=""
for dir in $tests_dirs; do
all_dirs="$all_dirs{\"path\":\"tests/$dir\",\"name\":\"tests-$dir\"},"
done
for dir in $connector_dirs; do
all_dirs="$all_dirs{\"path\":\"connector_job_tests/$dir\",\"name\":\"connector-$dir\"},"
done
# Remove trailing comma and wrap in array
all_dirs="[${all_dirs%,}]"
echo "test-dirs=$all_dirs" >> $GITHUB_OUTPUT
- name: Determine editions to test
id: set-editions
run: |
# On PRs, only run EE tests. On merge_group and tags, run both EE and MIT.
if [ "${{ github.event_name }}" = "pull_request" ]; then
echo 'editions=["ee"]' >> $GITHUB_OUTPUT
else
echo 'editions=["ee","mit"]' >> $GITHUB_OUTPUT
fi
build-backend-image:
runs-on:
[
runs-on,
runner=1cpu-linux-arm64,
"run-id=${{ github.run_id }}-build-backend-image",
"extras=ecr-cache",
]
timeout-minutes: 45
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Format branch name for cache
id: format-branch
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
REF_NAME: ${{ github.ref_name }}
run: |
if [ -n "${PR_NUMBER}" ]; then
CACHE_SUFFIX="${PR_NUMBER}"
else
# shellcheck disable=SC2001
CACHE_SUFFIX=$(echo "${REF_NAME}" | sed 's/[^A-Za-z0-9._-]/-/g')
fi
echo "cache-suffix=${CACHE_SUFFIX}" >> $GITHUB_OUTPUT
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
# needed for pulling Vespa, Redis, Postgres, and Minio images
# otherwise, we hit the "Unauthenticated users" limit
# https://docs.docker.com/docker-hub/usage/
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Build and push Backend Docker image
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./backend
file: ./backend/Dockerfile
push: true
tags: ${{ env.RUNS_ON_ECR_CACHE }}:integration-test-backend-test-${{ github.run_id }}
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-${{ github.event.pull_request.head.sha || github.sha }}
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-${{ steps.format-branch.outputs.cache-suffix }}
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache
type=registry,ref=onyxdotapp/onyx-backend:latest
cache-to: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-${{ github.event.pull_request.head.sha || github.sha }},mode=max
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-${{ steps.format-branch.outputs.cache-suffix }},mode=max
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache,mode=max
no-cache: ${{ vars.DOCKER_NO_CACHE == 'true' }}
build-model-server-image:
runs-on:
[
runs-on,
runner=1cpu-linux-arm64,
"run-id=${{ github.run_id }}-build-model-server-image",
"extras=ecr-cache",
]
timeout-minutes: 45
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Format branch name for cache
id: format-branch
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
REF_NAME: ${{ github.ref_name }}
run: |
if [ -n "${PR_NUMBER}" ]; then
CACHE_SUFFIX="${PR_NUMBER}"
else
# shellcheck disable=SC2001
CACHE_SUFFIX=$(echo "${REF_NAME}" | sed 's/[^A-Za-z0-9._-]/-/g')
fi
echo "cache-suffix=${CACHE_SUFFIX}" >> $GITHUB_OUTPUT
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
# needed for pulling Vespa, Redis, Postgres, and Minio images
# otherwise, we hit the "Unauthenticated users" limit
# https://docs.docker.com/docker-hub/usage/
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Build and push Model Server Docker image
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./backend
file: ./backend/Dockerfile.model_server
push: true
tags: ${{ env.RUNS_ON_ECR_CACHE }}:integration-test-model-server-test-${{ github.run_id }}
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-${{ github.event.pull_request.head.sha || github.sha }}
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-${{ steps.format-branch.outputs.cache-suffix }}
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache
type=registry,ref=onyxdotapp/onyx-model-server:latest
cache-to: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-${{ github.event.pull_request.head.sha || github.sha }},mode=max
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-${{ steps.format-branch.outputs.cache-suffix }},mode=max
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache,mode=max
build-integration-image:
runs-on:
[
runs-on,
runner=2cpu-linux-arm64,
"run-id=${{ github.run_id }}-build-integration-image",
"extras=ecr-cache",
]
timeout-minutes: 45
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
# needed for pulling openapitools/openapi-generator-cli
# otherwise, we hit the "Unauthenticated users" limit
# https://docs.docker.com/docker-hub/usage/
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Format branch name for cache
id: format-branch
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
REF_NAME: ${{ github.ref_name }}
run: |
if [ -n "${PR_NUMBER}" ]; then
CACHE_SUFFIX="${PR_NUMBER}"
else
# shellcheck disable=SC2001
CACHE_SUFFIX=$(echo "${REF_NAME}" | sed 's/[^A-Za-z0-9._-]/-/g')
fi
echo "cache-suffix=${CACHE_SUFFIX}" >> $GITHUB_OUTPUT
- name: Build and push integration test image with Docker Bake
env:
INTEGRATION_REPOSITORY: ${{ env.RUNS_ON_ECR_CACHE }}
TAG: integration-test-${{ github.run_id }}
CACHE_SUFFIX: ${{ steps.format-branch.outputs.cache-suffix }}
HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
run: |
docker buildx bake --push \
--set backend.cache-from=type=registry,ref=${RUNS_ON_ECR_CACHE}:backend-cache-${HEAD_SHA} \
--set backend.cache-from=type=registry,ref=${RUNS_ON_ECR_CACHE}:backend-cache-${CACHE_SUFFIX} \
--set backend.cache-from=type=registry,ref=${RUNS_ON_ECR_CACHE}:backend-cache \
--set backend.cache-from=type=registry,ref=onyxdotapp/onyx-backend:latest \
--set backend.cache-to=type=registry,ref=${RUNS_ON_ECR_CACHE}:backend-cache-${HEAD_SHA},mode=max \
--set backend.cache-to=type=registry,ref=${RUNS_ON_ECR_CACHE}:backend-cache-${CACHE_SUFFIX},mode=max \
--set backend.cache-to=type=registry,ref=${RUNS_ON_ECR_CACHE}:backend-cache,mode=max \
--set integration.cache-from=type=registry,ref=${RUNS_ON_ECR_CACHE}:integration-cache-${HEAD_SHA} \
--set integration.cache-from=type=registry,ref=${RUNS_ON_ECR_CACHE}:integration-cache-${CACHE_SUFFIX} \
--set integration.cache-from=type=registry,ref=${RUNS_ON_ECR_CACHE}:integration-cache \
--set integration.cache-to=type=registry,ref=${RUNS_ON_ECR_CACHE}:integration-cache-${HEAD_SHA},mode=max \
--set integration.cache-to=type=registry,ref=${RUNS_ON_ECR_CACHE}:integration-cache-${CACHE_SUFFIX},mode=max \
--set integration.cache-to=type=registry,ref=${RUNS_ON_ECR_CACHE}:integration-cache,mode=max \
integration
integration-tests:
needs:
[
discover-test-dirs,
build-backend-image,
build-model-server-image,
build-integration-image,
]
runs-on:
- runs-on
- runner=4cpu-linux-arm64
- ${{ format('run-id={0}-integration-tests-{1}-job-{2}', github.run_id, matrix.edition, strategy['job-index']) }}
- extras=ecr-cache
timeout-minutes: 45
strategy:
fail-fast: false
matrix:
test-dir: ${{ fromJson(needs.discover-test-dirs.outputs.test-dirs) }}
edition: ${{ fromJson(needs.discover-test-dirs.outputs.editions) }}
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
# needed for pulling Vespa, Redis, Postgres, and Minio images
# otherwise, we hit the "Unauthenticated users" limit
# https://docs.docker.com/docker-hub/usage/
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
# NOTE: Use pre-ping/null pool to reduce flakiness due to dropped connections
# NOTE: don't need web server for integration tests
- name: Create .env file for Docker Compose
env:
ECR_CACHE: ${{ env.RUNS_ON_ECR_CACHE }}
RUN_ID: ${{ github.run_id }}
EDITION: ${{ matrix.edition }}
run: |
# Base config shared by both editions
cat <<EOF > deployment/docker_compose/.env
COMPOSE_PROFILES=s3-filestore
OPENSEARCH_FOR_ONYX_ENABLED=false
AUTH_TYPE=basic
POSTGRES_POOL_PRE_PING=true
POSTGRES_USE_NULL_POOL=true
REQUIRE_EMAIL_VERIFICATION=false
DISABLE_TELEMETRY=true
ONYX_BACKEND_IMAGE=${ECR_CACHE}:integration-test-backend-test-${RUN_ID}
ONYX_MODEL_SERVER_IMAGE=${ECR_CACHE}:integration-test-model-server-test-${RUN_ID}
INTEGRATION_TESTS_MODE=true
MCP_SERVER_ENABLED=true
AUTO_LLM_UPDATE_INTERVAL_SECONDS=10
EOF
# EE-only config
if [ "$EDITION" = "ee" ]; then
cat <<EOF >> deployment/docker_compose/.env
ENABLE_PAID_ENTERPRISE_EDITION_FEATURES=true
# TODO(Nik): https://linear.app/onyx-app/issue/ENG-1/update-test-infra-to-use-test-license
LICENSE_ENFORCEMENT_ENABLED=false
CHECK_TTL_MANAGEMENT_TASK_FREQUENCY_IN_HOURS=0.001
EOF
fi
- name: Start Docker containers
run: |
cd deployment/docker_compose
docker compose -f docker-compose.yml -f docker-compose.dev.yml up \
relational_db \
index \
cache \
minio \
api_server \
inference_model_server \
indexing_model_server \
background \
-d
id: start_docker
- name: Wait for services to be ready
run: |
echo "Starting wait-for-service script..."
wait_for_service() {
local url=$1
local label=$2
local timeout=${3:-300} # default 5 minutes
local start_time
start_time=$(date +%s)
while true; do
local current_time
current_time=$(date +%s)
local elapsed_time=$((current_time - start_time))
if [ $elapsed_time -ge $timeout ]; then
echo "Timeout reached. ${label} did not become ready in $timeout seconds."
exit 1
fi
local response
response=$(curl -s -o /dev/null -w "%{http_code}" "$url" || echo "curl_error")
if [ "$response" = "200" ]; then
echo "${label} is ready!"
break
elif [ "$response" = "curl_error" ]; then
echo "Curl encountered an error while checking ${label}. Retrying in 5 seconds..."
else
echo "${label} not ready yet (HTTP status $response). Retrying in 5 seconds..."
fi
sleep 5
done
}
wait_for_service "http://localhost:8080/health" "API server"
echo "Finished waiting for services."
- name: Start Mock Services
run: |
cd backend/tests/integration/mock_services
docker compose -f docker-compose.mock-it-services.yml \
-p mock-it-services-stack up -d
- name: Run Integration Tests (${{ matrix.edition }}) for ${{ matrix.test-dir.name }}
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # ratchet:nick-fields/retry@v3
with:
timeout_minutes: 20
max_attempts: 3
retry_wait_seconds: 10
command: |
echo "Running ${{ matrix.edition }} integration tests for ${{ matrix.test-dir.path }}..."
docker run --rm --network onyx_default \
--name test-runner \
-e POSTGRES_HOST=relational_db \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=password \
-e POSTGRES_DB=postgres \
-e DB_READONLY_USER=db_readonly_user \
-e DB_READONLY_PASSWORD=password \
-e POSTGRES_POOL_PRE_PING=true \
-e POSTGRES_USE_NULL_POOL=true \
-e VESPA_HOST=index \
-e ENABLE_OPENSEARCH_INDEXING_FOR_ONYX=false \
-e REDIS_HOST=cache \
-e API_SERVER_HOST=api_server \
-e OPENAI_API_KEY=${OPENAI_API_KEY} \
-e EXA_API_KEY=${EXA_API_KEY} \
-e SLACK_BOT_TOKEN=${SLACK_BOT_TOKEN} \
-e SLACK_BOT_TOKEN_TEST_SPACE=${SLACK_BOT_TOKEN_TEST_SPACE} \
-e CONFLUENCE_TEST_SPACE_URL=${CONFLUENCE_TEST_SPACE_URL} \
-e CONFLUENCE_USER_NAME=${CONFLUENCE_USER_NAME} \
-e CONFLUENCE_ACCESS_TOKEN=${CONFLUENCE_ACCESS_TOKEN} \
-e CONFLUENCE_ACCESS_TOKEN_SCOPED=${CONFLUENCE_ACCESS_TOKEN_SCOPED} \
-e JIRA_BASE_URL=${JIRA_BASE_URL} \
-e JIRA_USER_EMAIL=${JIRA_USER_EMAIL} \
-e JIRA_API_TOKEN=${JIRA_API_TOKEN} \
-e JIRA_API_TOKEN_SCOPED=${JIRA_API_TOKEN_SCOPED} \
-e PERM_SYNC_SHAREPOINT_CLIENT_ID=${PERM_SYNC_SHAREPOINT_CLIENT_ID} \
-e PERM_SYNC_SHAREPOINT_PRIVATE_KEY="${PERM_SYNC_SHAREPOINT_PRIVATE_KEY}" \
-e PERM_SYNC_SHAREPOINT_CERTIFICATE_PASSWORD=${PERM_SYNC_SHAREPOINT_CERTIFICATE_PASSWORD} \
-e PERM_SYNC_SHAREPOINT_DIRECTORY_ID=${PERM_SYNC_SHAREPOINT_DIRECTORY_ID} \
-e GITHUB_PERMISSION_SYNC_TEST_ACCESS_TOKEN=${GITHUB_PERMISSION_SYNC_TEST_ACCESS_TOKEN} \
-e GITHUB_PERMISSION_SYNC_TEST_ACCESS_TOKEN_CLASSIC=${GITHUB_PERMISSION_SYNC_TEST_ACCESS_TOKEN_CLASSIC} \
-e GITHUB_ADMIN_EMAIL=${GITHUB_ADMIN_EMAIL} \
-e GITHUB_TEST_USER_1_EMAIL=${GITHUB_TEST_USER_1_EMAIL} \
-e GITHUB_TEST_USER_2_EMAIL=${GITHUB_TEST_USER_2_EMAIL} \
-e TEST_WEB_HOSTNAME=test-runner \
-e MOCK_CONNECTOR_SERVER_HOST=mock_connector_server \
-e MOCK_CONNECTOR_SERVER_PORT=8001 \
-e ENABLE_PAID_ENTERPRISE_EDITION_FEATURES=${{ matrix.edition == 'ee' && 'true' || 'false' }} \
${{ env.RUNS_ON_ECR_CACHE }}:integration-test-${{ github.run_id }} \
/app/tests/integration/${{ matrix.test-dir.path }}
# ------------------------------------------------------------
# Always gather logs BEFORE "down":
- name: Dump API server logs
if: always()
run: |
cd deployment/docker_compose
docker compose logs --no-color api_server > $GITHUB_WORKSPACE/api_server.log || true
- name: Dump all-container logs (optional)
if: always()
run: |
cd deployment/docker_compose
docker compose logs --no-color > $GITHUB_WORKSPACE/docker-compose.log || true
- name: Upload logs
if: always()
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f
with:
name: docker-all-logs-${{ matrix.edition }}-${{ matrix.test-dir.name }}
path: ${{ github.workspace }}/docker-compose.log
# ------------------------------------------------------------
onyx-lite-tests:
needs: [build-backend-image, build-integration-image]
runs-on:
[
runs-on,
runner=4cpu-linux-arm64,
"run-id=${{ github.run_id }}-onyx-lite-tests",
"extras=ecr-cache",
]
timeout-minutes: 45
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Create .env file for Onyx Lite Docker Compose
env:
ECR_CACHE: ${{ env.RUNS_ON_ECR_CACHE }}
RUN_ID: ${{ github.run_id }}
run: |
cat <<EOF > deployment/docker_compose/.env
ENABLE_PAID_ENTERPRISE_EDITION_FEATURES=true
LICENSE_ENFORCEMENT_ENABLED=false
AUTH_TYPE=basic
POSTGRES_POOL_PRE_PING=true
POSTGRES_USE_NULL_POOL=true
REQUIRE_EMAIL_VERIFICATION=false
DISABLE_TELEMETRY=true
ONYX_BACKEND_IMAGE=${ECR_CACHE}:integration-test-backend-test-${RUN_ID}
INTEGRATION_TESTS_MODE=true
EOF
# Start only the services needed for Onyx Lite (Postgres + API server)
- name: Start Docker containers (onyx-lite)
run: |
cd deployment/docker_compose
docker compose -f docker-compose.yml -f docker-compose.onyx-lite.yml -f docker-compose.dev.yml up \
relational_db \
api_server \
-d
id: start_docker_onyx_lite
- name: Wait for services to be ready
run: |
echo "Starting wait-for-service script (onyx-lite)..."
start_time=$(date +%s)
timeout=300
while true; do
current_time=$(date +%s)
elapsed_time=$((current_time - start_time))
if [ $elapsed_time -ge $timeout ]; then
echo "Timeout reached. Service did not become ready in $timeout seconds."
exit 1
fi
response=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/health || echo "curl_error")
if [ "$response" = "200" ]; then
echo "API server is ready!"
break
elif [ "$response" = "curl_error" ]; then
echo "Curl encountered an error; retrying..."
else
echo "Service not ready yet (HTTP $response). Retrying in 5 seconds..."
fi
sleep 5
done
- name: Run Onyx Lite Integration Tests
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # ratchet:nick-fields/retry@v3
with:
timeout_minutes: 20
max_attempts: 3
retry_wait_seconds: 10
command: |
echo "Running onyx-lite integration tests..."
docker run --rm --network onyx_default \
--name test-runner \
-e POSTGRES_HOST=relational_db \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=password \
-e POSTGRES_DB=postgres \
-e DB_READONLY_USER=db_readonly_user \
-e DB_READONLY_PASSWORD=password \
-e POSTGRES_POOL_PRE_PING=true \
-e POSTGRES_USE_NULL_POOL=true \
-e API_SERVER_HOST=api_server \
-e OPENAI_API_KEY=${OPENAI_API_KEY} \
-e TEST_WEB_HOSTNAME=test-runner \
${{ env.RUNS_ON_ECR_CACHE }}:integration-test-${{ github.run_id }} \
/app/tests/integration/tests/no_vectordb
- name: Dump API server logs (onyx-lite)
if: always()
run: |
cd deployment/docker_compose
docker compose -f docker-compose.yml -f docker-compose.onyx-lite.yml -f docker-compose.dev.yml \
logs --no-color api_server > $GITHUB_WORKSPACE/api_server_onyx_lite.log || true
- name: Dump all-container logs (onyx-lite)
if: always()
run: |
cd deployment/docker_compose
docker compose -f docker-compose.yml -f docker-compose.onyx-lite.yml -f docker-compose.dev.yml \
logs --no-color > $GITHUB_WORKSPACE/docker-compose-onyx-lite.log || true
- name: Upload logs (onyx-lite)
if: always()
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f
with:
name: docker-all-logs-onyx-lite
path: ${{ github.workspace }}/docker-compose-onyx-lite.log
- name: Stop Docker containers (onyx-lite)
if: always()
run: |
cd deployment/docker_compose
docker compose -f docker-compose.yml -f docker-compose.onyx-lite.yml -f docker-compose.dev.yml down -v
multitenant-tests:
needs:
[build-backend-image, build-model-server-image, build-integration-image]
runs-on:
[
runs-on,
runner=8cpu-linux-arm64,
"run-id=${{ github.run_id }}-multitenant-tests",
"extras=ecr-cache",
]
timeout-minutes: 45
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Start Docker containers for multi-tenant tests
env:
ECR_CACHE: ${{ env.RUNS_ON_ECR_CACHE }}
RUN_ID: ${{ github.run_id }}
run: |
cd deployment/docker_compose
ENABLE_PAID_ENTERPRISE_EDITION_FEATURES=true \
LICENSE_ENFORCEMENT_ENABLED=false \
MULTI_TENANT=true \
AUTH_TYPE=cloud \
REQUIRE_EMAIL_VERIFICATION=false \
DISABLE_TELEMETRY=true \
OPENAI_DEFAULT_API_KEY=${OPENAI_API_KEY} \
ONYX_BACKEND_IMAGE=${ECR_CACHE}:integration-test-backend-test-${RUN_ID} \
ONYX_MODEL_SERVER_IMAGE=${ECR_CACHE}:integration-test-model-server-test-${RUN_ID} \
DEV_MODE=true \
OPENSEARCH_FOR_ONYX_ENABLED=false \
docker compose -f docker-compose.multitenant-dev.yml up \
relational_db \
index \
cache \
minio \
api_server \
inference_model_server \
indexing_model_server \
background \
-d
id: start_docker_multi_tenant
- name: Wait for service to be ready (multi-tenant)
run: |
echo "Starting wait-for-service script for multi-tenant..."
docker logs -f onyx-api_server-1 &
start_time=$(date +%s)
timeout=300
while true; do
current_time=$(date +%s)
elapsed_time=$((current_time - start_time))
if [ $elapsed_time -ge $timeout ]; then
echo "Timeout reached. Service did not become ready in 5 minutes."
exit 1
fi
response=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/health || echo "curl_error")
if [ "$response" = "200" ]; then
echo "Service is ready!"
break
elif [ "$response" = "curl_error" ]; then
echo "Curl encountered an error; retrying..."
else
echo "Service not ready yet (HTTP $response). Retrying in 5 seconds..."
fi
sleep 5
done
echo "Finished waiting for service."
- name: Run Multi-Tenant Integration Tests
env:
ECR_CACHE: ${{ env.RUNS_ON_ECR_CACHE }}
RUN_ID: ${{ github.run_id }}
run: |
echo "Running multi-tenant integration tests..."
docker run --rm --network onyx_default \
--name test-runner \
-e POSTGRES_HOST=relational_db \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=password \
-e DB_READONLY_USER=db_readonly_user \
-e DB_READONLY_PASSWORD=password \
-e POSTGRES_DB=postgres \
-e POSTGRES_USE_NULL_POOL=true \
-e VESPA_HOST=index \
-e ENABLE_OPENSEARCH_INDEXING_FOR_ONYX=false \
-e REDIS_HOST=cache \
-e API_SERVER_HOST=api_server \
-e OPENAI_API_KEY=${OPENAI_API_KEY} \
-e EXA_API_KEY=${EXA_API_KEY} \
-e SLACK_BOT_TOKEN=${SLACK_BOT_TOKEN} \
-e SLACK_BOT_TOKEN_TEST_SPACE=${SLACK_BOT_TOKEN_TEST_SPACE} \
-e TEST_WEB_HOSTNAME=test-runner \
-e AUTH_TYPE=cloud \
-e MULTI_TENANT=true \
-e SKIP_RESET=true \
-e REQUIRE_EMAIL_VERIFICATION=false \
-e DISABLE_TELEMETRY=true \
-e DEV_MODE=true \
${ECR_CACHE}:integration-test-${RUN_ID} \
/app/tests/integration/multitenant_tests
- name: Dump API server logs (multi-tenant)
if: always()
run: |
cd deployment/docker_compose
docker compose -f docker-compose.multitenant-dev.yml logs --no-color api_server > $GITHUB_WORKSPACE/api_server_multitenant.log || true
- name: Dump all-container logs (multi-tenant)
if: always()
run: |
cd deployment/docker_compose
docker compose -f docker-compose.multitenant-dev.yml logs --no-color > $GITHUB_WORKSPACE/docker-compose-multitenant.log || true
- name: Upload logs (multi-tenant)
if: always()
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f
with:
name: docker-all-logs-multitenant
path: ${{ github.workspace }}/docker-compose-multitenant.log
- name: Stop multi-tenant Docker containers
if: always()
run: |
cd deployment/docker_compose
docker compose -f docker-compose.multitenant-dev.yml down -v
required:
# NOTE: Github-hosted runners have about 20s faster queue times and are preferred here.
runs-on: ubuntu-slim
timeout-minutes: 45
needs: [integration-tests, onyx-lite-tests, multitenant-tests]
if: ${{ always() }}
steps:
- name: Check job status
if: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped') }}
run: exit 1
================================================
FILE: .github/workflows/pr-jest-tests.yml
================================================
name: Run Jest Tests
concurrency:
group: Run-Jest-Tests-${{ github.workflow }}-${{ github.head_ref || github.event.workflow_run.head_branch || github.run_id }}
cancel-in-progress: true
on:
merge_group:
pull_request:
branches:
- main
- "release/**"
push:
tags:
- "v*.*.*"
permissions:
contents: read
jobs:
jest-tests:
name: Jest Tests
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Setup node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # ratchet:actions/setup-node@v4
with:
node-version: 22
cache: "npm" # zizmor: ignore[cache-poisoning] test-only workflow; no deploy artifacts
cache-dependency-path: ./web/package-lock.json
- name: Install node dependencies
working-directory: ./web
run: npm ci
- name: Run Jest tests
working-directory: ./web
run: npm test -- --ci --coverage --maxWorkers=50%
- name: Upload coverage reports
if: always()
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f
with:
name: jest-coverage-${{ github.run_id }}
path: ./web/coverage
retention-days: 7
================================================
FILE: .github/workflows/pr-labeler.yml
================================================
name: PR Labeler
on:
pull_request:
branches:
- main
types:
- opened
- reopened
- synchronize
- edited
permissions:
contents: read
jobs:
validate_pr_title:
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Check PR title for Conventional Commits
env:
PR_TITLE: ${{ github.event.pull_request.title }}
run: |
echo "PR Title: $PR_TITLE"
if [[ ! "$PR_TITLE" =~ ^(feat|fix|docs|test|ci|refactor|perf|chore|revert|build)(\(.+\))?:\ .+ ]]; then
echo "::error::❌ Your PR title does not follow the Conventional Commits format.
This check ensures that all pull requests use clear, consistent titles that help automate changelogs and improve project history.
Please update your PR title to follow the Conventional Commits style.
Here is a link to a blog explaining the reason why we've included the Conventional Commits style into our PR titles: https://xfuture-blog.com/working-with-conventional-commits
**Here are some examples of valid PR titles:**
- feat: add user authentication
- fix(login): handle null password error
- docs(readme): update installation instructions"
exit 1
fi
================================================
FILE: .github/workflows/pr-linear-check.yml
================================================
name: Ensure PR references Linear
concurrency:
group: Ensure-PR-references-Linear-${{ github.workflow }}-${{ github.head_ref || github.event.workflow_run.head_branch || github.run_id }}
cancel-in-progress: true
on:
pull_request:
types: [opened, edited, reopened, synchronize]
permissions:
contents: read
jobs:
linear-check:
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Check PR body for Linear link or override
env:
PR_BODY: ${{ github.event.pull_request.body }}
run: |
# Looking for "https://linear.app" in the body
if echo "$PR_BODY" | grep -qE "https://linear\.app"; then
echo "Found a Linear link. Check passed."
exit 0
fi
# Looking for a checked override: "[x] Override Linear Check"
if echo "$PR_BODY" | grep -q "\[x\].*Override Linear Check"; then
echo "Override box is checked. Check passed."
exit 0
fi
# Otherwise, fail the run
echo "No Linear link or override found in the PR description."
exit 1
================================================
FILE: .github/workflows/pr-playwright-tests.yml
================================================
name: Run Playwright Tests
concurrency:
group: Run-Playwright-Tests-${{ github.workflow }}-${{ github.head_ref || github.event.workflow_run.head_branch || github.run_id }}
cancel-in-progress: true
on:
merge_group:
pull_request:
branches:
- main
- "release/**"
push:
tags:
- "v*.*.*"
# TODO: Remove this if we enable merge-queues for release branches.
branches:
- "release/**"
permissions:
contents: read
env:
# Test Environment Variables
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
GEN_AI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
EXA_API_KEY: ${{ secrets.EXA_API_KEY }}
FIRECRAWL_API_KEY: ${{ secrets.FIRECRAWL_API_KEY }}
GOOGLE_PSE_API_KEY: ${{ secrets.GOOGLE_PSE_API_KEY }}
GOOGLE_PSE_SEARCH_ENGINE_ID: ${{ secrets.GOOGLE_PSE_SEARCH_ENGINE_ID }}
# for federated slack tests
SLACK_CLIENT_ID: ${{ secrets.SLACK_CLIENT_ID }}
SLACK_CLIENT_SECRET: ${{ secrets.SLACK_CLIENT_SECRET }}
# for MCP Oauth tests
MCP_OAUTH_CLIENT_ID: ${{ secrets.MCP_OAUTH_CLIENT_ID }}
MCP_OAUTH_CLIENT_SECRET: ${{ secrets.MCP_OAUTH_CLIENT_SECRET }}
MCP_OAUTH_ISSUER: ${{ secrets.MCP_OAUTH_ISSUER }}
MCP_OAUTH_JWKS_URI: ${{ secrets.MCP_OAUTH_JWKS_URI }}
MCP_OAUTH_USERNAME: ${{ vars.MCP_OAUTH_USERNAME }}
MCP_OAUTH_PASSWORD: ${{ secrets.MCP_OAUTH_PASSWORD }}
# for MCP API Key tests
MCP_API_KEY: test-api-key-12345
MCP_API_KEY_TEST_PORT: 8005
MCP_API_KEY_TEST_URL: http://host.docker.internal:8005/mcp
MCP_API_KEY_SERVER_HOST: 0.0.0.0
MCP_API_KEY_SERVER_PUBLIC_HOST: host.docker.internal
MOCK_LLM_RESPONSE: true
MCP_TEST_SERVER_PORT: 8004
MCP_TEST_SERVER_URL: http://host.docker.internal:8004/mcp
MCP_TEST_SERVER_PUBLIC_URL: http://host.docker.internal:8004/mcp
MCP_TEST_SERVER_BIND_HOST: 0.0.0.0
MCP_TEST_SERVER_PUBLIC_HOST: host.docker.internal
MCP_SERVER_HOST: 0.0.0.0
MCP_SERVER_PUBLIC_HOST: host.docker.internal
MCP_SERVER_PUBLIC_URL: http://host.docker.internal:8004/mcp
# Visual regression S3 bucket (shared across all jobs)
PLAYWRIGHT_S3_BUCKET: onyx-playwright-artifacts
jobs:
build-web-image:
runs-on:
[
runs-on,
runner=4cpu-linux-arm64,
"run-id=${{ github.run_id }}-build-web-image",
"extras=ecr-cache",
]
timeout-minutes: 45
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Format branch name for cache
id: format-branch
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
REF_NAME: ${{ github.ref_name }}
run: |
if [ -n "${PR_NUMBER}" ]; then
CACHE_SUFFIX="${PR_NUMBER}"
else
# shellcheck disable=SC2001
CACHE_SUFFIX=$(echo "${REF_NAME}" | sed 's/[^A-Za-z0-9._-]/-/g')
fi
echo "cache-suffix=${CACHE_SUFFIX}" >> $GITHUB_OUTPUT
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
# needed for pulling external images otherwise, we hit the "Unauthenticated users" limit
# https://docs.docker.com/docker-hub/usage/
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Build and push Web Docker image
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./web
file: ./web/Dockerfile
platforms: linux/arm64
tags: ${{ env.RUNS_ON_ECR_CACHE }}:playwright-test-web-${{ github.run_id }}
push: true
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:web-cache-${{ github.event.pull_request.head.sha || github.sha }}
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:web-cache-${{ steps.format-branch.outputs.cache-suffix }}
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:web-cache
type=registry,ref=onyxdotapp/onyx-web-server:latest
cache-to: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:web-cache-${{ github.event.pull_request.head.sha || github.sha }},mode=max
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:web-cache-${{ steps.format-branch.outputs.cache-suffix }},mode=max
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:web-cache,mode=max
no-cache: ${{ vars.DOCKER_NO_CACHE == 'true' }}
build-backend-image:
runs-on:
[
runs-on,
runner=1cpu-linux-arm64,
"run-id=${{ github.run_id }}-build-backend-image",
"extras=ecr-cache",
]
timeout-minutes: 45
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Format branch name for cache
id: format-branch
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
REF_NAME: ${{ github.ref_name }}
run: |
if [ -n "${PR_NUMBER}" ]; then
CACHE_SUFFIX="${PR_NUMBER}"
else
# shellcheck disable=SC2001
CACHE_SUFFIX=$(echo "${REF_NAME}" | sed 's/[^A-Za-z0-9._-]/-/g')
fi
echo "cache-suffix=${CACHE_SUFFIX}" >> $GITHUB_OUTPUT
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
# needed for pulling external images otherwise, we hit the "Unauthenticated users" limit
# https://docs.docker.com/docker-hub/usage/
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Build and push Backend Docker image
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./backend
file: ./backend/Dockerfile
platforms: linux/arm64
tags: ${{ env.RUNS_ON_ECR_CACHE }}:playwright-test-backend-${{ github.run_id }}
push: true
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-${{ github.event.pull_request.head.sha || github.sha }}
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-${{ steps.format-branch.outputs.cache-suffix }}
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache
type=registry,ref=onyxdotapp/onyx-backend:latest
cache-to: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-${{ github.event.pull_request.head.sha || github.sha }},mode=max
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-${{ steps.format-branch.outputs.cache-suffix }},mode=max
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache,mode=max
no-cache: ${{ vars.DOCKER_NO_CACHE == 'true' }}
build-model-server-image:
runs-on:
[
runs-on,
runner=1cpu-linux-arm64,
"run-id=${{ github.run_id }}-build-model-server-image",
"extras=ecr-cache",
]
timeout-minutes: 45
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Format branch name for cache
id: format-branch
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
REF_NAME: ${{ github.ref_name }}
run: |
if [ -n "${PR_NUMBER}" ]; then
CACHE_SUFFIX="${PR_NUMBER}"
else
# shellcheck disable=SC2001
CACHE_SUFFIX=$(echo "${REF_NAME}" | sed 's/[^A-Za-z0-9._-]/-/g')
fi
echo "cache-suffix=${CACHE_SUFFIX}" >> $GITHUB_OUTPUT
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # ratchet:docker/setup-buildx-action@v3
# needed for pulling external images otherwise, we hit the "Unauthenticated users" limit
# https://docs.docker.com/docker-hub/usage/
- name: Login to Docker Hub
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Build and push Model Server Docker image
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # ratchet:docker/build-push-action@v6
with:
context: ./backend
file: ./backend/Dockerfile.model_server
platforms: linux/arm64
tags: ${{ env.RUNS_ON_ECR_CACHE }}:playwright-test-model-server-${{ github.run_id }}
push: true
cache-from: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-${{ github.event.pull_request.head.sha || github.sha }}
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-${{ steps.format-branch.outputs.cache-suffix }}
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache
type=registry,ref=onyxdotapp/onyx-model-server:latest
cache-to: |
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-${{ github.event.pull_request.head.sha || github.sha }},mode=max
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-${{ steps.format-branch.outputs.cache-suffix }},mode=max
type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache,mode=max
no-cache: ${{ vars.DOCKER_NO_CACHE == 'true' }}
playwright-tests:
needs: [build-web-image, build-backend-image, build-model-server-image]
name: Playwright Tests (${{ matrix.project }})
permissions:
id-token: write # Required for OIDC-based AWS credential exchange (S3 access)
contents: read
runs-on:
- runs-on
- runner=8cpu-linux-arm64
- "run-id=${{ github.run_id }}-playwright-tests-${{ matrix.project }}"
- "extras=ecr-cache"
- volume=50gb
timeout-minutes: 45
strategy:
fail-fast: false
matrix:
project: [admin, exclusive]
steps:
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6
with:
persist-credentials: false
- name: Setup node
# zizmor: ignore[cache-poisoning] ephemeral runners; no release artifacts
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # ratchet:actions/setup-node@v4
with:
node-version: 22
cache: "npm" # zizmor: ignore[cache-poisoning]
cache-dependency-path: ./web/package-lock.json
- name: Install node dependencies
working-directory: ./web
run: npm ci
- name: Cache playwright cache
# zizmor: ignore[cache-poisoning] ephemeral runners; no release artifacts
uses: runs-on/cache@a5f51d6f3fece787d03b7b4e981c82538a0654ed # ratchet:runs-on/cache@v4
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-npm-${{ hashFiles('web/package-lock.json') }}
restore-keys: |
${{ runner.os }}-playwright-npm-
- name: Install playwright browsers
working-directory: ./web
run: npx playwright install --with-dep
Showing preview only (278K chars total). Download the full file or copy to clipboard to get everything.
gitextract_2880u6lc/ ├── .git-blame-ignore-revs ├── .github/ │ ├── CODEOWNERS │ ├── actionlint.yml │ ├── actions/ │ │ ├── build-backend-image/ │ │ │ └── action.yml │ │ ├── build-integration-image/ │ │ │ └── action.yml │ │ ├── build-model-server-image/ │ │ │ └── action.yml │ │ ├── run-nightly-provider-chat-test/ │ │ │ └── action.yml │ │ ├── setup-playwright/ │ │ │ └── action.yml │ │ ├── setup-python-and-install-dependencies/ │ │ │ └── action.yml │ │ └── slack-notify/ │ │ ├── action.yml │ │ └── user-mappings.json │ ├── dependabot.yml │ ├── pull_request_template.md │ ├── runs-on.yml │ └── workflows/ │ ├── deployment.yml │ ├── docker-tag-beta.yml │ ├── docker-tag-latest.yml │ ├── helm-chart-releases.yml │ ├── merge-group.yml │ ├── nightly-close-stale-issues.yml │ ├── nightly-llm-provider-chat.yml │ ├── post-merge-beta-cherry-pick.yml │ ├── pr-database-tests.yml │ ├── pr-desktop-build.yml │ ├── pr-external-dependency-unit-tests.yml │ ├── pr-golang-tests.yml │ ├── pr-helm-chart-testing.yml │ ├── pr-integration-tests.yml │ ├── pr-jest-tests.yml │ ├── pr-labeler.yml │ ├── pr-linear-check.yml │ ├── pr-playwright-tests.yml │ ├── pr-python-checks.yml │ ├── pr-python-connector-tests.yml │ ├── pr-python-model-tests.yml │ ├── pr-python-tests.yml │ ├── pr-quality-checks.yml │ ├── preview.yml │ ├── release-cli.yml │ ├── release-devtools.yml │ ├── reusable-nightly-llm-provider-chat.yml │ ├── sandbox-deployment.yml │ ├── storybook-deploy.yml │ ├── sync_foss.yml │ ├── tag-nightly.yml │ └── zizmor.yml ├── .gitignore ├── .greptile/ │ ├── config.json │ ├── files.json │ └── rules.md ├── .pre-commit-config.yaml ├── .prettierignore ├── .vscode/ │ ├── env.web_template.txt │ ├── env_template.txt │ ├── launch.json │ └── tasks.template.jsonc ├── AGENTS.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── backend/ │ ├── .dockerignore │ ├── .gitignore │ ├── .trivyignore │ ├── Dockerfile │ ├── Dockerfile.model_server │ ├── alembic/ │ │ ├── README.md │ │ ├── env.py │ │ ├── run_multitenant_migrations.py │ │ ├── script.py.mako │ │ └── versions/ │ │ ├── 01f8e6d95a33_populate_flow_mapping_data.py │ │ ├── 027381bce97c_add_shortcut_option_for_users.py │ │ ├── 03bf8be6b53a_rework_kg_config.py │ │ ├── 03d085c5c38d_backfill_account_type.py │ │ ├── 03d710ccf29c_add_permission_sync_attempt_tables.py │ │ ├── 0568ccf46a6b_add_thread_specific_model_selection.py │ │ ├── 05c07bf07c00_add_search_doc_relevance_details.py │ │ ├── 07b98176f1de_code_interpreter_seed.py │ │ ├── 0816326d83aa_add_federated_connector_tables.py │ │ ├── 08a1eda20fe1_add_earliest_indexing_to_connector.py │ │ ├── 09995b8811eb_add_theme_preference_to_user.py │ │ ├── 0a2b51deb0b8_add_starter_prompts.py │ │ ├── 0a98909f2757_enable_encrypted_fields.py │ │ ├── 0bb4558f35df_add_scim_username_to_scim_user_mapping.py │ │ ├── 0cd424f32b1d_user_file_data_preparation_and_backfill.py │ │ ├── 0ebb1d516877_add_ccpair_deletion_failure_message.py │ │ ├── 0f7ff6d75b57_add_index_to_index_attempt_time_created.py │ │ ├── 114a638452db_add_default_app_mode_to_user.py │ │ ├── 12635f6655b7_drive_canonical_ids.py │ │ ├── 15326fcec57e_introduce_onyx_apis.py │ │ ├── 16c37a30adf2_user_file_relationship_migration.py │ │ ├── 173cae5bba26_port_config_store.py │ │ ├── 175ea04c7087_add_user_preferences.py │ │ ├── 177de57c21c9_display_custom_llm_models.py │ │ ├── 18b5b2524446_add_is_clarification_to_chat_message.py │ │ ├── 19c0ccb01687_migrate_to_contextual_rag_model.py │ │ ├── 1a03d2c2856b_add_indexes_to_document__tag.py │ │ ├── 1b10e1fda030_add_additional_data_to_notifications.py │ │ ├── 1b8206b29c5d_add_user_delete_cascades.py │ │ ├── 1d78c0ca7853_remove_voice_provider_deleted_column.py │ │ ├── 1f2a3b4c5d6e_add_internet_search_and_content_providers.py │ │ ├── 1f60f60c3401_embedding_model_search_settings.py │ │ ├── 2020d417ec84_single_onyx_craft_migration.py │ │ ├── 213fd978c6d8_notifications.py │ │ ├── 238b84885828_add_foreign_key_to_user__external_user_.py │ │ ├── 23957775e5f5_remove_feedback_foreignkey_constraint.py │ │ ├── 25a5501dc766_group_permissions_phase1.py │ │ ├── 2664261bfaab_add_cache_store_table.py │ │ ├── 2666d766cb9b_google_oauth2.py │ │ ├── 26b931506ecb_default_chosen_assistants_to_none.py │ │ ├── 27c6ecc08586_permission_framework.py │ │ ├── 27fb147a843f_add_timestamps_to_user_table.py │ │ ├── 2955778aa44c_add_chunk_count_to_document.py │ │ ├── 2a391f840e85_add_last_refreshed_at_mcp_server.py │ │ ├── 2acdef638fc2_add_switchover_type_field.py │ │ ├── 2b75d0a8ffcb_user_file_schema_cleanup.py │ │ ├── 2b90f3af54b8_usage_limits.py │ │ ├── 2c2430828bdf_add_unique_constraint_to_inputprompt_.py │ │ ├── 2cdeff6d8c93_set_built_in_to_default.py │ │ ├── 2d2304e27d8c_add_above_below_to_persona.py │ │ ├── 2daa494a0851_add_group_sync_time.py │ │ ├── 2f80c6a2550f_add_chat_session_specific_temperature_.py │ │ ├── 2f95e36923e6_add_indexing_coordination.py │ │ ├── 30c1d5744104_persona_datetime_aware.py │ │ ├── 325975216eb3_add_icon_color_and_icon_shape_to_persona.py │ │ ├── 33cb72ea4d80_single_tool_call_per_message.py │ │ ├── 33ea50e88f24_foreign_key_input_prompts.py │ │ ├── 351faebd379d_add_curator_fields.py │ │ ├── 35e518e0ddf4_properly_cascade.py │ │ ├── 35e6853a51d5_server_default_chosen_assistants.py │ │ ├── 369644546676_add_composite_index_for_index_attempt_.py │ │ ├── 36e9220ab794_update_kg_trigger_functions.py │ │ ├── 3781a5eb12cb_add_chunk_stats_table.py │ │ ├── 3879338f8ba1_add_tool_table.py │ │ ├── 38eda64af7fe_add_chat_session_sharing.py │ │ ├── 3934b1bc7b62_update_github_connector_repo_name_to_.py │ │ ├── 3a7802814195_add_alternate_assistant_to_chat_message.py │ │ ├── 3a78dba1080a_user_file_legacy_data_cleanup.py │ │ ├── 3b25685ff73c_move_is_public_to_cc_pair.py │ │ ├── 3bd4c84fe72f_improved_index.py │ │ ├── 3c5e35aa9af0_polling_document_count.py │ │ ├── 3c6531f32351_add_back_input_prompts.py │ │ ├── 3c9a65f1207f_seed_exa_provider_from_env.py │ │ ├── 3d1cca026fe8_add_oauth_config_and_user_tokens.py │ │ ├── 3fc5d75723b3_add_doc_metadata_field_in_document_model.py │ │ ├── 401c1ac29467_add_tables_for_ui_based_llm_.py │ │ ├── 40926a4dab77_reset_userfile_document_id_migrated_.py │ │ ├── 41fa44bef321_remove_default_prompt_shortcuts.py │ │ ├── 43cbbb3f5e6a_rename_index_origin_to_index_recursively.py │ │ ├── 44f856ae2a4a_add_cloud_embedding_model.py │ │ ├── 4505fd7302e1_added_is_internet_to_dbdoc.py │ │ ├── 465f78d9b7f9_larger_access_tokens_for_oauth.py │ │ ├── 46625e4745d4_remove_native_enum.py │ │ ├── 46b7a812670f_fix_user__external_user_group_id_fk.py │ │ ├── 4738e4b3bae1_pg_file_store.py │ │ ├── 473a1a7ca408_add_display_model_names_to_llm_provider.py │ │ ├── 47433d30de82_create_indexattempt_table.py │ │ ├── 475fcefe8826_add_name_to_api_key.py │ │ ├── 4794bc13e484_update_prompt_length.py │ │ ├── 47a07e1a38f1_fix_invalid_model_configurations_state.py │ │ ├── 47e5bef3a1d7_add_persona_categories.py │ │ ├── 48d14957fe80_add_support_for_custom_tools.py │ │ ├── 495cb26ce93e_create_knowlege_graph_tables.py │ │ ├── 4a1e4b1c89d2_add_indexing_to_userfilestatus.py │ │ ├── 4a951134c801_moved_status_to_connector_credential_.py │ │ ├── 4b08d97e175a_change_default_prune_freq.py │ │ ├── 4cebcbc9b2ae_add_tab_index_to_tool_call.py │ │ ├── 4d58345da04a_lowercase_user_emails.py │ │ ├── 4ea2c93919c1_add_type_to_credentials.py │ │ ├── 4ee1287bd26a_add_multiple_slack_bot_support.py │ │ ├── 4f8a2b3c1d9e_add_open_url_tool.py │ │ ├── 503883791c39_add_effective_permissions.py │ │ ├── 505c488f6662_merge_default_assistants_into_unified.py │ │ ├── 50b683a8295c_add_additional_retrieval_controls_to_.py │ │ ├── 52a219fb5233_add_last_synced_and_last_modified_to_document_table.py │ │ ├── 54a74a0417fc_danswerbot_onyxbot.py │ │ ├── 55546a7967ee_assistant_rework.py │ │ ├── 570282d33c49_track_onyxbot_explicitly.py │ │ ├── 57122d037335_add_python_tool_on_default.py │ │ ├── 57b53544726e_add_document_set_tables.py │ │ ├── 5809c0787398_add_chat_sessions.py │ │ ├── 58c50ef19f08_add_stale_column_to_user__external_user_.py │ │ ├── 5ae8240accb3_add_research_agent_database_tables_and_.py │ │ ├── 5b29123cd710_nullable_search_settings_for_historic_.py │ │ ├── 5c3dca366b35_backend_driven_notification_details.py │ │ ├── 5c448911b12f_add_content_type_to_userfile.py │ │ ├── 5c7fdadae813_match_any_keywords_flag_for_standard_.py │ │ ├── 5d12a446f5c0_add_api_version_and_deployment_name_to_.py │ │ ├── 5e1c073d48a3_add_personal_access_token_table.py │ │ ├── 5e6f7a8b9c0d_update_default_persona_prompt.py │ │ ├── 5e84129c8be3_add_docs_indexed_column_to_index_.py │ │ ├── 5f4b8568a221_add_removed_documents_to_index_attempt.py │ │ ├── 5fc1f54cc252_hybrid_enum.py │ │ ├── 61ff3651add4_add_permission_syncing.py │ │ ├── 62c3a055a141_add_file_names_to_file_connector_config.py │ │ ├── 631fd2504136_add_approx_chunk_count_in_vespa_to_.py │ │ ├── 6436661d5b65_add_created_at_in_project_userfile.py │ │ ├── 643a84a42a33_add_user_configured_names_to_llmprovider.py │ │ ├── 64bd5677aeb6_add_image_input_support_to_model_config.py │ │ ├── 65bc6e0f8500_remove_kg_subtype_from_db.py │ │ ├── 6756efa39ada_id_uuid_for_chat_session.py │ │ ├── 689433b0d8de_add_hook_and_hook_execution_log_tables.py │ │ ├── 699221885109_nullify_default_task_prompt.py │ │ ├── 6a804aeb4830_duplicated_no_harm_user_file_migration.py │ │ ├── 6b3b4083c5aa_persona_cleanup_and_featured.py │ │ ├── 6d387b3196c2_basic_auth.py │ │ ├── 6d562f86c78b_remove_default_bot.py │ │ ├── 6f4f86aef280_add_queries_and_is_web_fetch_to_.py │ │ ├── 6fc7886d665d_make_categories_labels_and_many_to_many.py │ │ ├── 703313b75876_add_tokenratelimit_tables.py │ │ ├── 70f00c45c0f2_more_descriptive_filestore.py │ │ ├── 7206234e012a_add_image_generation_config_table.py │ │ ├── 72aa7de2e5cf_make_processing_mode_default_all_caps.py │ │ ├── 72bdc9929a46_permission_auto_sync_framework.py │ │ ├── 73e9983e5091_add_search_query_table.py │ │ ├── 7477a5f5d728_added_model_defaults_for_users.py │ │ ├── 7547d982db8f_chat_folders.py │ │ ├── 7616121f6e97_add_enterprise_fields_to_scim_user_mapping.py │ │ ├── 767f1c2a00eb_count_chat_tokens.py │ │ ├── 76b60d407dfb_cc_pair_name_not_unique.py │ │ ├── 776b3bbe9092_remove_remaining_enums.py │ │ ├── 77d07dffae64_forcibly_remove_more_enum_types_from_.py │ │ ├── 78dbe7e38469_task_tracking.py │ │ ├── 78ebc66946a0_remove_reranking_from_search_settings.py │ │ ├── 795b20b85b4b_add_llm_group_permissions_control.py │ │ ├── 797089dfb4d2_persona_start_date.py │ │ ├── 79acd316403a_add_api_key_table.py │ │ ├── 7a70b7664e37_add_model_configuration_table.py │ │ ├── 7aea705850d5_added_slack_auto_filter.py │ │ ├── 7b9b952abdf6_update_entities.py │ │ ├── 7bd55f264e1b_add_display_name_to_model_configuration.py │ │ ├── 7cb492013621_code_interpreter_server_model.py │ │ ├── 7cc3fcc116c1_user_file_uuid_primary_key_swap.py │ │ ├── 7ccea01261f6_store_chat_retrieval_docs.py │ │ ├── 7da0ae5ad583_add_description_to_persona.py │ │ ├── 7da543f5672f_add_slackbotconfig_table.py │ │ ├── 7e490836d179_nullify_default_system_prompt.py │ │ ├── 7ed603b64d5a_add_mcp_server_and_connection_config_.py │ │ ├── 7f726bad5367_slack_followup.py │ │ ├── 7f99be1cb9f5_add_index_for_getting_documents_just_by_.py │ │ ├── 800f48024ae9_add_id_to_connectorcredentialpair.py │ │ ├── 80696cf850ae_add_chat_session_to_query_event.py │ │ ├── 8188861f4e92_csv_to_tabular_chat_file_type.py │ │ ├── 81c22b1e2e78_hierarchy_nodes_v1.py │ │ ├── 8405ca81cc83_notifications_constraint.py │ │ ├── 849b21c732f8_add_demo_data_enabled_to_build_session.py │ │ ├── 87c52ec39f84_update_default_system_prompt.py │ │ ├── 8818cf73fa1a_drop_include_citations.py │ │ ├── 891cd83c87a8_add_is_visible_to_persona.py │ │ ├── 8987770549c0_add_full_exception_stack_trace.py │ │ ├── 8a87bd6ec550_associate_index_attempts_with_ccpair.py │ │ ├── 8aabb57f3b49_restructure_document_indices.py │ │ ├── 8b5ce697290e_add_discord_bot_tables.py │ │ ├── 8e1ac4f39a9f_enable_contextual_retrieval.py │ │ ├── 8e26726b7683_chat_context_addition.py │ │ ├── 8f43500ee275_add_index.py │ │ ├── 8ffcc2bcfc11_add_needs_persona_sync_to_user_file.py │ │ ├── 904451035c9b_store_tool_details.py │ │ ├── 904e5138fffb_tags.py │ │ ├── 9087b548dd69_seed_default_image_gen_config.py │ │ ├── 90b409d06e50_add_chat_compression_fields.py │ │ ├── 90e3b9af7da4_tag_fix.py │ │ ├── 91a0a4d62b14_milestone.py │ │ ├── 91fd3b470d1a_remove_documentsource_from_tag.py │ │ ├── 91ffac7e65b3_add_expiry_time.py │ │ ├── 93560ba1b118_add_web_ui_option_to_slack_config.py │ │ ├── 93a2e195e25c_add_voice_provider_and_user_voice_prefs.py │ │ ├── 93c15d6a6fbb_add_chunk_error_and_vespa_count_columns_.py │ │ ├── 949b4a92a401_remove_rt.py │ │ ├── 94dc3d0236f8_make_document_set_description_optional.py │ │ ├── 96a5702df6aa_mcp_tool_enabled.py │ │ ├── 977e834c1427_seed_default_groups.py │ │ ├── 97dbb53fa8c8_add_syncrecord.py │ │ ├── 98a5008d8711_agent_tracking.py │ │ ├── 9a0296d7421e_add_is_auto_mode_to_llm_provider.py │ │ ├── 9aadf32dfeb4_add_user_files.py │ │ ├── 9b66d3156fc6_user_file_schema_additions.py │ │ ├── 9c00a2bccb83_chat_message_agentic.py │ │ ├── 9c54986124c6_add_scim_tables.py │ │ ├── 9cf5c00f72fe_add_creator_to_cc_pair.py │ │ ├── 9d1543a37106_add_processing_duration_seconds_to_chat_.py │ │ ├── 9d97fecfab7f_added_retrieved_docs_to_query_event.py │ │ ├── 9drpiiw74ljy_add_config_to_federated_connector.py │ │ ├── 9f696734098f_combine_search_and_chat.py │ │ ├── a01bf2971c5d_update_default_tool_descriptions.py │ │ ├── a1b2c3d4e5f6_add_license_table.py │ │ ├── a1b2c3d4e5f7_drop_agent_search_metrics_table.py │ │ ├── a2b3c4d5e6f7_remove_fast_default_model_name.py │ │ ├── a3795dce87be_migration_confluence_to_be_explicit.py │ │ ├── a3b8d9e2f1c4_make_scim_external_id_nullable.py │ │ ├── a3bfd0d64902_add_chosen_assistants_to_user_table.py │ │ ├── a3c1a7904cd0_remove_userfile_related_deprecated_.py │ │ ├── a3f8b2c1d4e5_add_preferred_response_id_to_chat_message.py │ │ ├── a4f23d6b71c8_add_llm_provider_persona_restrictions.py │ │ ├── a570b80a5f20_usergroup_tables.py │ │ ├── a6df6b88ef81_remove_recent_assistants.py │ │ ├── a7688ab35c45_add_public_external_user_group_table.py │ │ ├── a852cbe15577_new_chat_history.py │ │ ├── a8c2065484e6_add_auto_scroll_to_user_model.py │ │ ├── abbfec3a5ac5_merge_prompt_into_persona.py │ │ ├── abe7378b8217_add_indexing_trigger_to_cc_pair.py │ │ ├── ac5eaac849f9_add_last_pruned_to_connector_table.py │ │ ├── acaab4ef4507_remove_inactive_ccpair_status_on_.py │ │ ├── ae62505e3acc_add_saml_accounts.py │ │ ├── aeda5f2df4f6_add_pinned_assistants.py │ │ ├── b082fec533f0_make_last_attempt_status_nullable.py │ │ ├── b156fa702355_chat_reworked.py │ │ ├── b30353be4eec_add_mcp_auth_performer.py │ │ ├── b329d00a9ea6_adding_assistant_specific_user_.py │ │ ├── b388730a2899_nullable_preferences.py │ │ ├── b4b7e1028dfd_grant_basic_to_existing_groups.py │ │ ├── b4ef3ae0bf6e_add_user_oauth_token_to_slack_bot.py │ │ ├── b51c6844d1df_seed_memory_tool.py │ │ ├── b558f51620b4_pause_finished_user_file_connectors.py │ │ ├── b5c4d7e8f9a1_add_hierarchy_node_cc_pair_table.py │ │ ├── b728689f45b1_rename_persona_is_visible_to_is_listed_.py │ │ ├── b72ed7a5db0e_remove_description_from_starter_messages.py │ │ ├── b7a7eee5aa15_add_checkpointing_failure_handling.py │ │ ├── b7bcc991d722_assign_users_to_default_groups.py │ │ ├── b7c2b63c4a03_add_background_reindex_enabled_field.py │ │ ├── b7ec9b5b505f_adjust_prompt_length.py │ │ ├── b85f02ec1308_fix_file_type_migration.py │ │ ├── b896bbd0d5a7_backfill_is_internet_data_to_false.py │ │ ├── b8c9d0e1f2a3_drop_milestone_table.py │ │ ├── ba98eba0f66a_add_support_for_litellm_proxy_in_.py │ │ ├── baf71f781b9e_add_llm_model_version_override_to_.py │ │ ├── bc9771dccadf_create_usage_reports_table.py │ │ ├── bceb1e139447_add_base_url_to_cloudembeddingprovider.py │ │ ├── bd2921608c3a_non_nullable_default_persona.py │ │ ├── bd7c3bf8beba_migrate_agent_responses_to_research_.py │ │ ├── be2ab2aa50ee_fix_capitalization.py │ │ ├── be87a654d5af_persona_new_default_model_configuration_.py │ │ ├── bf7a81109301_delete_input_prompts.py │ │ ├── c0aab6edb6dd_delete_workspace.py │ │ ├── c0c937d5c9e5_llm_provider_deprecate_fields.py │ │ ├── c0fd6e4da83a_add_recent_assistants.py │ │ ├── c18cdf4b497e_add_standard_answer_tables.py │ │ ├── c1d2e3f4a5b6_add_deep_research_tool.py │ │ ├── c5b692fa265c_add_index_attempt_errors_table.py │ │ ├── c5eae4a75a1b_add_chat_message__standard_answer_table.py │ │ ├── c7bf5721733e_add_has_been_indexed_to_.py │ │ ├── c7e9f4a3b2d1_add_python_tool.py │ │ ├── c7f2e1b4a9d3_add_sharing_scope_to_build_session.py │ │ ├── c8a93a2af083_personalization_user_info.py │ │ ├── c99d76fcd298_add_nullable_to_persona_id_in_chat_.py │ │ ├── c9e2cd766c29_add_s3_file_store_table.py │ │ ├── ca04500b9ee8_add_cascade_deletes_to_agent_tables.py │ │ ├── cbc03e08d0f3_add_opensearch_migration_tables.py │ │ ├── cec7ec36c505_kgentity_parent.py │ │ ├── cf90764725d8_larger_refresh_tokens.py │ │ ├── d09fc20a3c66_seed_builtin_tools.py │ │ ├── d1b637d7050a_sync_exa_api_key_to_content_provider.py │ │ ├── d25168c2beee_tool_name_consistency.py │ │ ├── d3fd499c829c_add_file_reader_tool.py │ │ ├── d5645c915d0e_remove_deletion_attempt_table.py │ │ ├── d56ffa94ca32_add_file_content.py │ │ ├── d5c86e2c6dc6_add_cascade_delete_to_search_query_user_.py │ │ ├── d61e513bef0a_add_total_docs_for_index_attempt.py │ │ ├── d7111c1238cd_remove_document_ids.py │ │ ├── d716b0791ddd_combined_slack_id_fields.py │ │ ├── d8cdfee5df80_add_skipped_to_userfilestatus.py │ │ ├── d929f0c1c6af_feedback_feature.py │ │ ├── d961aca62eb3_update_status_length.py │ │ ├── d9ec13955951_remove__dim_suffix_from_model_name.py │ │ ├── da42808081e3_migrate_jira_connectors_to_new_format.py │ │ ├── da4c21c69164_chosen_assistants_changed_to_jsonb.py │ │ ├── dab04867cd88_add_composite_index_to_document_by_.py │ │ ├── dba7f71618f5_onyx_custom_tool_flow.py │ │ ├── dbaa756c2ccf_embedding_models.py │ │ ├── df0c7ad8a076_added_deletion_attempt_table.py │ │ ├── df46c75b714e_add_default_vision_provider_to_llm_.py │ │ ├── dfbe9e93d3c7_extended_role_for_non_web.py │ │ ├── e0a68a81d434_add_chat_feedback.py │ │ ├── e1392f05e840_added_input_prompts.py │ │ ├── e209dc5a8156_added_prune_frequency.py │ │ ├── e4334d5b33ba_add_deployment_name_to_llmprovider.py │ │ ├── e50154680a5c_no_source_enum.py │ │ ├── e6a4bbc13fe4_add_index_for_retrieving_latest_index_.py │ │ ├── e7f8a9b0c1d2_create_anonymous_user.py │ │ ├── e86866a9c78a_add_persona_to_chat_session.py │ │ ├── e8f0d2a38171_add_status_to_mcp_server_and_make_auth_.py │ │ ├── e91df4e935ef_private_personas_documentsets.py │ │ ├── eaa3b5593925_add_default_slack_channel_config.py │ │ ├── ec3ec2eabf7b_index_from_beginning.py │ │ ├── ec85f2b3c544_remove_last_attempt_status_from_cc_pair.py │ │ ├── ecab2b3f1a3b_add_overrides_to_the_chat_session.py │ │ ├── ed9e44312505_add_icon_name_field.py │ │ ├── ee3f4b47fad5_added_alternate_model_to_chat_message.py │ │ ├── ef7da92f7213_add_files_to_chatmessage.py │ │ ├── efb35676026c_standard_answer_match_regex_flag.py │ │ ├── f11b408e39d3_force_lowercase_all_users.py │ │ ├── f13db29f3101_add_composite_index_for_last_modified_.py │ │ ├── f17bf3b0d9f1_embedding_provider_by_provider_type.py │ │ ├── f1c6478c3fd8_add_pre_defined_feedback.py │ │ ├── f1ca58b2f2ec_add_passthrough_auth_to_tool.py │ │ ├── f220515df7b4_add_flow_mapping_table.py │ │ ├── f32615f71aeb_add_custom_headers_to_tools.py │ │ ├── f39c5794c10a_add_background_errors_table.py │ │ ├── f5437cc136c5_delete_non_search_assistants.py │ │ ├── f71470ba9274_add_prompt_length_limit.py │ │ ├── f7505c5b0284_updated_constraints_for_ccpairs.py │ │ ├── f7a894b06d02_non_nullbale_slack_bot_id_in_channel_.py │ │ ├── f7ca3e2f45d9_migrate_no_auth_data_to_placeholder.py │ │ ├── f7e58d357687_add_has_web_column_to_user.py │ │ ├── f8a9b2c3d4e5_add_research_answer_purpose_to_chat_message.py │ │ ├── f9b8c7d6e5a4_update_parent_question_id_foreign_key_to_research_agent_iteration.py │ │ ├── fad14119fb92_delete_tags_with_wrong_enum.py │ │ ├── fb80bdd256de_add_chat_background_to_user.py │ │ ├── fcd135795f21_add_slack_bot_display_type.py │ │ ├── febe9eaa0644_add_document_set_persona_relationship_.py │ │ ├── fec3db967bf7_add_time_updated_to_usergroup_and_.py │ │ ├── feead2911109_add_opensearch_tenant_migration_columns.py │ │ └── ffc707a226b4_basic_document_metadata.py │ ├── alembic.ini │ ├── alembic_tenants/ │ │ ├── README.md │ │ ├── __init__.py │ │ ├── env.py │ │ ├── script.py.mako │ │ └── versions/ │ │ ├── 14a83a331951_create_usertenantmapping_table.py │ │ ├── 34e3630c7f32_lowercase_multi_tenant_user_auth.py │ │ ├── 3b45e0018bf1_add_new_available_tenant_table.py │ │ ├── 3b9f09038764_add_read_only_kg_user.py │ │ ├── a4f6ee863c47_mapping_for_anonymous_user_path.py │ │ └── ac842f85f932_new_column_user_tenant_mapping.py │ ├── assets/ │ │ └── .gitignore │ ├── ee/ │ │ ├── LICENSE │ │ ├── __init__.py │ │ └── onyx/ │ │ ├── __init__.py │ │ ├── access/ │ │ │ ├── access.py │ │ │ └── hierarchy_access.py │ │ ├── auth/ │ │ │ ├── __init__.py │ │ │ └── users.py │ │ ├── background/ │ │ │ ├── celery/ │ │ │ │ ├── apps/ │ │ │ │ │ ├── heavy.py │ │ │ │ │ ├── light.py │ │ │ │ │ ├── monitoring.py │ │ │ │ │ └── primary.py │ │ │ │ └── tasks/ │ │ │ │ ├── beat_schedule.py │ │ │ │ ├── cleanup/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── tasks.py │ │ │ │ ├── cloud/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── tasks.py │ │ │ │ ├── doc_permission_syncing/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── tasks.py │ │ │ │ ├── external_group_syncing/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── group_sync_utils.py │ │ │ │ │ └── tasks.py │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── tasks.py │ │ │ │ ├── query_history/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── tasks.py │ │ │ │ ├── tenant_provisioning/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── tasks.py │ │ │ │ ├── ttl_management/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── tasks.py │ │ │ │ ├── usage_reporting/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── tasks.py │ │ │ │ └── vespa/ │ │ │ │ ├── __init__.py │ │ │ │ └── tasks.py │ │ │ ├── celery_utils.py │ │ │ └── task_name_builders.py │ │ ├── configs/ │ │ │ ├── __init__.py │ │ │ ├── app_configs.py │ │ │ └── license_enforcement_config.py │ │ ├── connectors/ │ │ │ └── perm_sync_valid.py │ │ ├── db/ │ │ │ ├── __init__.py │ │ │ ├── analytics.py │ │ │ ├── connector.py │ │ │ ├── connector_credential_pair.py │ │ │ ├── document.py │ │ │ ├── document_set.py │ │ │ ├── external_perm.py │ │ │ ├── hierarchy.py │ │ │ ├── license.py │ │ │ ├── persona.py │ │ │ ├── query_history.py │ │ │ ├── saml.py │ │ │ ├── scim.py │ │ │ ├── search.py │ │ │ ├── standard_answer.py │ │ │ ├── token_limit.py │ │ │ ├── usage_export.py │ │ │ └── user_group.py │ │ ├── document_index/ │ │ │ └── vespa/ │ │ │ └── app_config/ │ │ │ └── cloud-services.xml.jinja │ │ ├── external_permissions/ │ │ │ ├── __init__.py │ │ │ ├── confluence/ │ │ │ │ ├── __init__.py │ │ │ │ ├── constants.py │ │ │ │ ├── doc_sync.py │ │ │ │ ├── group_sync.py │ │ │ │ ├── page_access.py │ │ │ │ └── space_access.py │ │ │ ├── github/ │ │ │ │ ├── doc_sync.py │ │ │ │ ├── group_sync.py │ │ │ │ └── utils.py │ │ │ ├── gmail/ │ │ │ │ └── doc_sync.py │ │ │ ├── google_drive/ │ │ │ │ ├── __init__.py │ │ │ │ ├── doc_sync.py │ │ │ │ ├── folder_retrieval.py │ │ │ │ ├── group_sync.py │ │ │ │ ├── models.py │ │ │ │ └── permission_retrieval.py │ │ │ ├── jira/ │ │ │ │ ├── __init__.py │ │ │ │ ├── doc_sync.py │ │ │ │ ├── group_sync.py │ │ │ │ ├── models.py │ │ │ │ └── page_access.py │ │ │ ├── perm_sync_types.py │ │ │ ├── post_query_censoring.py │ │ │ ├── salesforce/ │ │ │ │ ├── postprocessing.py │ │ │ │ └── utils.py │ │ │ ├── sharepoint/ │ │ │ │ ├── doc_sync.py │ │ │ │ ├── group_sync.py │ │ │ │ └── permission_utils.py │ │ │ ├── slack/ │ │ │ │ ├── channel_access.py │ │ │ │ ├── doc_sync.py │ │ │ │ ├── group_sync.py │ │ │ │ └── utils.py │ │ │ ├── sync_params.py │ │ │ ├── teams/ │ │ │ │ └── doc_sync.py │ │ │ └── utils.py │ │ ├── feature_flags/ │ │ │ ├── __init__.py │ │ │ ├── factory.py │ │ │ └── posthog_provider.py │ │ ├── hooks/ │ │ │ ├── __init__.py │ │ │ └── executor.py │ │ ├── main.py │ │ ├── onyxbot/ │ │ │ └── slack/ │ │ │ └── handlers/ │ │ │ ├── __init__.py │ │ │ └── handle_standard_answers.py │ │ ├── prompts/ │ │ │ ├── __init__.py │ │ │ ├── query_expansion.py │ │ │ └── search_flow_classification.py │ │ ├── search/ │ │ │ └── process_search_query.py │ │ ├── secondary_llm_flows/ │ │ │ ├── __init__.py │ │ │ ├── query_expansion.py │ │ │ └── search_flow_classification.py │ │ ├── server/ │ │ │ ├── __init__.py │ │ │ ├── analytics/ │ │ │ │ └── api.py │ │ │ ├── auth_check.py │ │ │ ├── billing/ │ │ │ │ ├── __init__.py │ │ │ │ ├── api.py │ │ │ │ ├── models.py │ │ │ │ └── service.py │ │ │ ├── documents/ │ │ │ │ └── cc_pair.py │ │ │ ├── enterprise_settings/ │ │ │ │ ├── api.py │ │ │ │ ├── models.py │ │ │ │ └── store.py │ │ │ ├── evals/ │ │ │ │ ├── __init__.py │ │ │ │ └── api.py │ │ │ ├── features/ │ │ │ │ ├── __init__.py │ │ │ │ └── hooks/ │ │ │ │ ├── __init__.py │ │ │ │ └── api.py │ │ │ ├── license/ │ │ │ │ ├── api.py │ │ │ │ └── models.py │ │ │ ├── manage/ │ │ │ │ └── standard_answer.py │ │ │ ├── middleware/ │ │ │ │ ├── license_enforcement.py │ │ │ │ └── tenant_tracking.py │ │ │ ├── oauth/ │ │ │ │ ├── api.py │ │ │ │ ├── api_router.py │ │ │ │ ├── confluence_cloud.py │ │ │ │ ├── google_drive.py │ │ │ │ └── slack.py │ │ │ ├── query_and_chat/ │ │ │ │ ├── __init__.py │ │ │ │ ├── models.py │ │ │ │ ├── query_backend.py │ │ │ │ ├── search_backend.py │ │ │ │ ├── streaming_models.py │ │ │ │ └── token_limit.py │ │ │ ├── query_history/ │ │ │ │ ├── api.py │ │ │ │ └── models.py │ │ │ ├── reporting/ │ │ │ │ ├── usage_export_api.py │ │ │ │ ├── usage_export_generation.py │ │ │ │ └── usage_export_models.py │ │ │ ├── scim/ │ │ │ │ ├── __init__.py │ │ │ │ ├── api.py │ │ │ │ ├── auth.py │ │ │ │ ├── filtering.py │ │ │ │ ├── models.py │ │ │ │ ├── patch.py │ │ │ │ ├── providers/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── base.py │ │ │ │ │ ├── entra.py │ │ │ │ │ └── okta.py │ │ │ │ └── schema_definitions.py │ │ │ ├── seeding.py │ │ │ ├── settings/ │ │ │ │ ├── __init__.py │ │ │ │ └── api.py │ │ │ ├── tenant_usage_limits.py │ │ │ ├── tenants/ │ │ │ │ ├── __init__.py │ │ │ │ ├── access.py │ │ │ │ ├── admin_api.py │ │ │ │ ├── anonymous_user_path.py │ │ │ │ ├── anonymous_users_api.py │ │ │ │ ├── api.py │ │ │ │ ├── billing.py │ │ │ │ ├── billing_api.py │ │ │ │ ├── models.py │ │ │ │ ├── product_gating.py │ │ │ │ ├── provisioning.py │ │ │ │ ├── proxy.py │ │ │ │ ├── schema_management.py │ │ │ │ ├── team_membership_api.py │ │ │ │ ├── tenant_management_api.py │ │ │ │ ├── user_invitations_api.py │ │ │ │ └── user_mapping.py │ │ │ ├── token_rate_limits/ │ │ │ │ └── api.py │ │ │ ├── usage_limits.py │ │ │ └── user_group/ │ │ │ ├── api.py │ │ │ └── models.py │ │ └── utils/ │ │ ├── __init__.py │ │ ├── encryption.py │ │ ├── license.py │ │ ├── posthog_client.py │ │ └── telemetry.py │ ├── generated/ │ │ └── README.md │ ├── keys/ │ │ └── license_public_key.pem │ ├── model_server/ │ │ ├── __init__.py │ │ ├── constants.py │ │ ├── encoders.py │ │ ├── legacy/ │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ ├── custom_models.py │ │ │ ├── onyx_torch_model.py │ │ │ └── reranker.py │ │ ├── main.py │ │ ├── management_endpoints.py │ │ └── utils.py │ ├── onyx/ │ │ ├── __init__.py │ │ ├── access/ │ │ │ ├── __init__.py │ │ │ ├── access.py │ │ │ ├── hierarchy_access.py │ │ │ ├── models.py │ │ │ └── utils.py │ │ ├── auth/ │ │ │ ├── __init__.py │ │ │ ├── anonymous_user.py │ │ │ ├── api_key.py │ │ │ ├── captcha.py │ │ │ ├── constants.py │ │ │ ├── disposable_email_validator.py │ │ │ ├── email_utils.py │ │ │ ├── invited_users.py │ │ │ ├── jwt.py │ │ │ ├── oauth_refresher.py │ │ │ ├── oauth_token_manager.py │ │ │ ├── pat.py │ │ │ ├── permissions.py │ │ │ ├── schemas.py │ │ │ ├── users.py │ │ │ └── utils.py │ │ ├── background/ │ │ │ ├── README.md │ │ │ ├── celery/ │ │ │ │ ├── apps/ │ │ │ │ │ ├── app_base.py │ │ │ │ │ ├── beat.py │ │ │ │ │ ├── client.py │ │ │ │ │ ├── docfetching.py │ │ │ │ │ ├── docprocessing.py │ │ │ │ │ ├── heavy.py │ │ │ │ │ ├── light.py │ │ │ │ │ ├── monitoring.py │ │ │ │ │ ├── primary.py │ │ │ │ │ ├── task_formatters.py │ │ │ │ │ └── user_file_processing.py │ │ │ │ ├── celery_k8s_probe.py │ │ │ │ ├── celery_redis.py │ │ │ │ ├── celery_utils.py │ │ │ │ ├── configs/ │ │ │ │ │ ├── base.py │ │ │ │ │ ├── beat.py │ │ │ │ │ ├── client.py │ │ │ │ │ ├── docfetching.py │ │ │ │ │ ├── docprocessing.py │ │ │ │ │ ├── heavy.py │ │ │ │ │ ├── light.py │ │ │ │ │ ├── monitoring.py │ │ │ │ │ ├── primary.py │ │ │ │ │ └── user_file_processing.py │ │ │ │ ├── memory_monitoring.py │ │ │ │ ├── tasks/ │ │ │ │ │ ├── beat_schedule.py │ │ │ │ │ ├── connector_deletion/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── tasks.py │ │ │ │ │ ├── docfetching/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── task_creation_utils.py │ │ │ │ │ │ └── tasks.py │ │ │ │ │ ├── docprocessing/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── heartbeat.py │ │ │ │ │ │ ├── tasks.py │ │ │ │ │ │ └── utils.py │ │ │ │ │ ├── evals/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── tasks.py │ │ │ │ │ ├── hierarchyfetching/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── tasks.py │ │ │ │ │ ├── llm_model_update/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── tasks.py │ │ │ │ │ ├── models.py │ │ │ │ │ ├── monitoring/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── tasks.py │ │ │ │ │ ├── opensearch_migration/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── constants.py │ │ │ │ │ │ ├── tasks.py │ │ │ │ │ │ └── transformer.py │ │ │ │ │ ├── periodic/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── tasks.py │ │ │ │ │ ├── pruning/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── tasks.py │ │ │ │ │ ├── shared/ │ │ │ │ │ │ ├── RetryDocumentIndex.py │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── tasks.py │ │ │ │ │ ├── user_file_processing/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── tasks.py │ │ │ │ │ └── vespa/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── document_sync.py │ │ │ │ │ └── tasks.py │ │ │ │ └── versioned_apps/ │ │ │ │ ├── beat.py │ │ │ │ ├── client.py │ │ │ │ ├── docfetching.py │ │ │ │ ├── docprocessing.py │ │ │ │ ├── heavy.py │ │ │ │ ├── light.py │ │ │ │ ├── monitoring.py │ │ │ │ ├── primary.py │ │ │ │ └── user_file_processing.py │ │ │ ├── error_logging.py │ │ │ ├── indexing/ │ │ │ │ ├── checkpointing_utils.py │ │ │ │ ├── dask_utils.py │ │ │ │ ├── index_attempt_utils.py │ │ │ │ ├── job_client.py │ │ │ │ ├── memory_tracer.py │ │ │ │ ├── models.py │ │ │ │ └── run_docfetching.py │ │ │ ├── periodic_poller.py │ │ │ └── task_utils.py │ │ ├── cache/ │ │ │ ├── factory.py │ │ │ ├── interface.py │ │ │ ├── postgres_backend.py │ │ │ └── redis_backend.py │ │ ├── chat/ │ │ │ ├── COMPRESSION.md │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ ├── chat_processing_checker.py │ │ │ ├── chat_state.py │ │ │ ├── chat_utils.py │ │ │ ├── citation_processor.py │ │ │ ├── citation_utils.py │ │ │ ├── compression.py │ │ │ ├── emitter.py │ │ │ ├── llm_loop.py │ │ │ ├── llm_step.py │ │ │ ├── models.py │ │ │ ├── process_message.py │ │ │ ├── prompt_utils.py │ │ │ ├── save_chat.py │ │ │ ├── stop_signal_checker.py │ │ │ └── tool_call_args_streaming.py │ │ ├── configs/ │ │ │ ├── __init__.py │ │ │ ├── agent_configs.py │ │ │ ├── app_configs.py │ │ │ ├── chat_configs.py │ │ │ ├── constants.py │ │ │ ├── embedding_configs.py │ │ │ ├── kg_configs.py │ │ │ ├── llm_configs.py │ │ │ ├── model_configs.py │ │ │ ├── onyxbot_configs.py │ │ │ ├── research_configs.py │ │ │ ├── saml_config/ │ │ │ │ └── template.settings.json │ │ │ └── tool_configs.py │ │ ├── connectors/ │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ ├── airtable/ │ │ │ │ └── airtable_connector.py │ │ │ ├── asana/ │ │ │ │ ├── __init__.py │ │ │ │ ├── asana_api.py │ │ │ │ └── connector.py │ │ │ ├── axero/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── bitbucket/ │ │ │ │ ├── __init__.py │ │ │ │ ├── connector.py │ │ │ │ └── utils.py │ │ │ ├── blob/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── bookstack/ │ │ │ │ ├── __init__.py │ │ │ │ ├── client.py │ │ │ │ └── connector.py │ │ │ ├── canvas/ │ │ │ │ ├── __init__.py │ │ │ │ ├── access.py │ │ │ │ ├── client.py │ │ │ │ └── connector.py │ │ │ ├── clickup/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── coda/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── confluence/ │ │ │ │ ├── __init__.py │ │ │ │ ├── access.py │ │ │ │ ├── connector.py │ │ │ │ ├── models.py │ │ │ │ ├── onyx_confluence.py │ │ │ │ ├── user_profile_override.py │ │ │ │ └── utils.py │ │ │ ├── connector_runner.py │ │ │ ├── credentials_provider.py │ │ │ ├── cross_connector_utils/ │ │ │ │ ├── __init__.py │ │ │ │ ├── miscellaneous_utils.py │ │ │ │ └── rate_limit_wrapper.py │ │ │ ├── discord/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── discourse/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── document360/ │ │ │ │ ├── __init__.py │ │ │ │ ├── connector.py │ │ │ │ └── utils.py │ │ │ ├── dropbox/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── drupal_wiki/ │ │ │ │ ├── __init__.py │ │ │ │ ├── connector.py │ │ │ │ ├── models.py │ │ │ │ └── utils.py │ │ │ ├── egnyte/ │ │ │ │ └── connector.py │ │ │ ├── exceptions.py │ │ │ ├── factory.py │ │ │ ├── file/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── fireflies/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── freshdesk/ │ │ │ │ ├── __init__,py │ │ │ │ └── connector.py │ │ │ ├── gitbook/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── github/ │ │ │ │ ├── __init__.py │ │ │ │ ├── connector.py │ │ │ │ ├── models.py │ │ │ │ ├── rate_limit_utils.py │ │ │ │ └── utils.py │ │ │ ├── gitlab/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── gmail/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── gong/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── google_drive/ │ │ │ │ ├── __init__.py │ │ │ │ ├── connector.py │ │ │ │ ├── constants.py │ │ │ │ ├── doc_conversion.py │ │ │ │ ├── file_retrieval.py │ │ │ │ ├── models.py │ │ │ │ └── section_extraction.py │ │ │ ├── google_site/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── google_utils/ │ │ │ │ ├── __init__.py │ │ │ │ ├── google_auth.py │ │ │ │ ├── google_kv.py │ │ │ │ ├── google_utils.py │ │ │ │ ├── resources.py │ │ │ │ └── shared_constants.py │ │ │ ├── guru/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── highspot/ │ │ │ │ ├── __init__.py │ │ │ │ ├── client.py │ │ │ │ ├── connector.py │ │ │ │ └── utils.py │ │ │ ├── hubspot/ │ │ │ │ ├── __init__.py │ │ │ │ ├── connector.py │ │ │ │ └── rate_limit.py │ │ │ ├── imap/ │ │ │ │ ├── __init__.py │ │ │ │ ├── connector.py │ │ │ │ └── models.py │ │ │ ├── interfaces.py │ │ │ ├── jira/ │ │ │ │ ├── __init__.py │ │ │ │ ├── access.py │ │ │ │ ├── connector.py │ │ │ │ └── utils.py │ │ │ ├── linear/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── loopio/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── mediawiki/ │ │ │ │ ├── __init__.py │ │ │ │ ├── family.py │ │ │ │ └── wiki.py │ │ │ ├── microsoft_graph_env.py │ │ │ ├── mock_connector/ │ │ │ │ └── connector.py │ │ │ ├── models.py │ │ │ ├── notion/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── outline/ │ │ │ │ ├── __init__.py │ │ │ │ ├── client.py │ │ │ │ └── connector.py │ │ │ ├── productboard/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── registry.py │ │ │ ├── requesttracker/ │ │ │ │ ├── .gitignore │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── salesforce/ │ │ │ │ ├── __init__.py │ │ │ │ ├── blacklist.py │ │ │ │ ├── connector.py │ │ │ │ ├── doc_conversion.py │ │ │ │ ├── onyx_salesforce.py │ │ │ │ ├── salesforce_calls.py │ │ │ │ ├── shelve_stuff/ │ │ │ │ │ ├── old_test_salesforce_shelves.py │ │ │ │ │ ├── shelve_functions.py │ │ │ │ │ ├── shelve_utils.py │ │ │ │ │ └── test_salesforce_shelves.py │ │ │ │ ├── sqlite_functions.py │ │ │ │ └── utils.py │ │ │ ├── sharepoint/ │ │ │ │ ├── __init__.py │ │ │ │ ├── connector.py │ │ │ │ └── connector_utils.py │ │ │ ├── slab/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── slack/ │ │ │ │ ├── __init__.py │ │ │ │ ├── access.py │ │ │ │ ├── connector.py │ │ │ │ ├── models.py │ │ │ │ ├── onyx_retry_handler.py │ │ │ │ ├── onyx_slack_web_client.py │ │ │ │ └── utils.py │ │ │ ├── teams/ │ │ │ │ ├── __init__.py │ │ │ │ ├── connector.py │ │ │ │ ├── models.py │ │ │ │ └── utils.py │ │ │ ├── testrail/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── web/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── wikipedia/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── xenforo/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ ├── zendesk/ │ │ │ │ ├── __init__.py │ │ │ │ └── connector.py │ │ │ └── zulip/ │ │ │ ├── __init__.py │ │ │ ├── connector.py │ │ │ ├── schemas.py │ │ │ └── utils.py │ │ ├── context/ │ │ │ └── search/ │ │ │ ├── __init__.py │ │ │ ├── enums.py │ │ │ ├── federated/ │ │ │ │ ├── models.py │ │ │ │ ├── slack_search.py │ │ │ │ └── slack_search_utils.py │ │ │ ├── models.py │ │ │ ├── pipeline.py │ │ │ ├── preprocessing/ │ │ │ │ └── access_filters.py │ │ │ ├── retrieval/ │ │ │ │ └── search_runner.py │ │ │ └── utils.py │ │ ├── db/ │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ ├── _deprecated/ │ │ │ │ └── pg_file_store.py │ │ │ ├── api_key.py │ │ │ ├── auth.py │ │ │ ├── background_error.py │ │ │ ├── chat.py │ │ │ ├── chat_search.py │ │ │ ├── chunk.py │ │ │ ├── code_interpreter.py │ │ │ ├── connector.py │ │ │ ├── connector_credential_pair.py │ │ │ ├── constants.py │ │ │ ├── credentials.py │ │ │ ├── dal.py │ │ │ ├── deletion_attempt.py │ │ │ ├── discord_bot.py │ │ │ ├── document.py │ │ │ ├── document_access.py │ │ │ ├── document_set.py │ │ │ ├── engine/ │ │ │ │ ├── __init__.py │ │ │ │ ├── async_sql_engine.py │ │ │ │ ├── connection_warmup.py │ │ │ │ ├── iam_auth.py │ │ │ │ ├── sql_engine.py │ │ │ │ ├── tenant_utils.py │ │ │ │ └── time_utils.py │ │ │ ├── entities.py │ │ │ ├── entity_type.py │ │ │ ├── enums.py │ │ │ ├── federated.py │ │ │ ├── feedback.py │ │ │ ├── file_content.py │ │ │ ├── file_record.py │ │ │ ├── hierarchy.py │ │ │ ├── hook.py │ │ │ ├── image_generation.py │ │ │ ├── index_attempt.py │ │ │ ├── indexing_coordination.py │ │ │ ├── input_prompt.py │ │ │ ├── kg_config.py │ │ │ ├── kg_temp_view.py │ │ │ ├── llm.py │ │ │ ├── mcp.py │ │ │ ├── memory.py │ │ │ ├── models.py │ │ │ ├── notification.py │ │ │ ├── oauth_config.py │ │ │ ├── opensearch_migration.py │ │ │ ├── pat.py │ │ │ ├── permission_sync_attempt.py │ │ │ ├── permissions.py │ │ │ ├── persona.py │ │ │ ├── projects.py │ │ │ ├── pydantic_type.py │ │ │ ├── relationships.py │ │ │ ├── release_notes.py │ │ │ ├── rotate_encryption_key.py │ │ │ ├── saml.py │ │ │ ├── search_settings.py │ │ │ ├── seeding/ │ │ │ │ └── chat_history_seeding.py │ │ │ ├── slack_bot.py │ │ │ ├── slack_channel_config.py │ │ │ ├── swap_index.py │ │ │ ├── sync_record.py │ │ │ ├── tag.py │ │ │ ├── tasks.py │ │ │ ├── token_limit.py │ │ │ ├── tools.py │ │ │ ├── usage.py │ │ │ ├── user_file.py │ │ │ ├── user_preferences.py │ │ │ ├── users.py │ │ │ ├── utils.py │ │ │ ├── voice.py │ │ │ └── web_search.py │ │ ├── deep_research/ │ │ │ ├── __init__.py │ │ │ ├── dr_loop.py │ │ │ ├── dr_mock_tools.py │ │ │ ├── models.py │ │ │ └── utils.py │ │ ├── document_index/ │ │ │ ├── FILTER_SEMANTICS.md │ │ │ ├── __init__.py │ │ │ ├── chunk_content_enrichment.py │ │ │ ├── disabled.py │ │ │ ├── document_index_utils.py │ │ │ ├── factory.py │ │ │ ├── interfaces.py │ │ │ ├── interfaces_new.py │ │ │ ├── opensearch/ │ │ │ │ ├── README.md │ │ │ │ ├── client.py │ │ │ │ ├── cluster_settings.py │ │ │ │ ├── constants.py │ │ │ │ ├── opensearch_document_index.py │ │ │ │ ├── schema.py │ │ │ │ ├── search.py │ │ │ │ └── string_filtering.py │ │ │ ├── vespa/ │ │ │ │ ├── __init__.py │ │ │ │ ├── app_config/ │ │ │ │ │ ├── schemas/ │ │ │ │ │ │ └── danswer_chunk.sd.jinja │ │ │ │ │ ├── services.xml.jinja │ │ │ │ │ └── validation-overrides.xml.jinja │ │ │ │ ├── chunk_retrieval.py │ │ │ │ ├── deletion.py │ │ │ │ ├── index.py │ │ │ │ ├── indexing_utils.py │ │ │ │ ├── kg_interactions.py │ │ │ │ ├── shared_utils/ │ │ │ │ │ ├── utils.py │ │ │ │ │ └── vespa_request_builders.py │ │ │ │ └── vespa_document_index.py │ │ │ └── vespa_constants.py │ │ ├── error_handling/ │ │ │ ├── __init__.py │ │ │ ├── error_codes.py │ │ │ └── exceptions.py │ │ ├── evals/ │ │ │ ├── README.md │ │ │ ├── eval.py │ │ │ ├── eval_cli.py │ │ │ ├── models.py │ │ │ ├── one_off/ │ │ │ │ └── create_braintrust_dataset.py │ │ │ ├── provider.py │ │ │ └── providers/ │ │ │ ├── braintrust.py │ │ │ └── local.py │ │ ├── feature_flags/ │ │ │ ├── __init__.py │ │ │ ├── factory.py │ │ │ ├── feature_flags_keys.py │ │ │ ├── flags.py │ │ │ └── interface.py │ │ ├── federated_connectors/ │ │ │ ├── __init__.py │ │ │ ├── factory.py │ │ │ ├── federated_retrieval.py │ │ │ ├── interfaces.py │ │ │ ├── models.py │ │ │ ├── oauth_utils.py │ │ │ ├── registry.py │ │ │ └── slack/ │ │ │ ├── __init__.py │ │ │ ├── federated_connector.py │ │ │ └── models.py │ │ ├── file_processing/ │ │ │ ├── __init__.py │ │ │ ├── enums.py │ │ │ ├── extract_file_text.py │ │ │ ├── file_types.py │ │ │ ├── html_utils.py │ │ │ ├── image_summarization.py │ │ │ ├── image_utils.py │ │ │ ├── password_validation.py │ │ │ └── unstructured.py │ │ ├── file_store/ │ │ │ ├── README.md │ │ │ ├── constants.py │ │ │ ├── document_batch_storage.py │ │ │ ├── file_store.py │ │ │ ├── models.py │ │ │ ├── postgres_file_store.py │ │ │ ├── s3_key_utils.py │ │ │ └── utils.py │ │ ├── hooks/ │ │ │ ├── __init__.py │ │ │ ├── api_dependencies.py │ │ │ ├── executor.py │ │ │ ├── models.py │ │ │ ├── points/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base.py │ │ │ │ ├── document_ingestion.py │ │ │ │ └── query_processing.py │ │ │ └── registry.py │ │ ├── httpx/ │ │ │ └── httpx_pool.py │ │ ├── image_gen/ │ │ │ ├── __init__.py │ │ │ ├── exceptions.py │ │ │ ├── factory.py │ │ │ ├── interfaces.py │ │ │ └── providers/ │ │ │ ├── azure_img_gen.py │ │ │ ├── openai_img_gen.py │ │ │ └── vertex_img_gen.py │ │ ├── indexing/ │ │ │ ├── __init__.py │ │ │ ├── adapters/ │ │ │ │ ├── document_indexing_adapter.py │ │ │ │ └── user_file_indexing_adapter.py │ │ │ ├── chunk_batch_store.py │ │ │ ├── chunker.py │ │ │ ├── content_classification.py │ │ │ ├── embedder.py │ │ │ ├── indexing_heartbeat.py │ │ │ ├── indexing_pipeline.py │ │ │ ├── models.py │ │ │ └── vector_db_insertion.py │ │ ├── key_value_store/ │ │ │ ├── __init__.py │ │ │ ├── factory.py │ │ │ ├── interface.py │ │ │ └── store.py │ │ ├── kg/ │ │ │ ├── clustering/ │ │ │ │ ├── clustering.py │ │ │ │ └── normalizations.py │ │ │ ├── extractions/ │ │ │ │ └── extraction_processing.py │ │ │ ├── models.py │ │ │ ├── resets/ │ │ │ │ ├── reset_index.py │ │ │ │ ├── reset_source.py │ │ │ │ └── reset_vespa.py │ │ │ ├── setup/ │ │ │ │ └── kg_default_entity_definitions.py │ │ │ ├── utils/ │ │ │ │ ├── embeddings.py │ │ │ │ ├── extraction_utils.py │ │ │ │ ├── formatting_utils.py │ │ │ │ └── lock_utils.py │ │ │ └── vespa/ │ │ │ └── vespa_interactions.py │ │ ├── llm/ │ │ │ ├── __init__.py │ │ │ ├── constants.py │ │ │ ├── cost.py │ │ │ ├── factory.py │ │ │ ├── interfaces.py │ │ │ ├── litellm_singleton/ │ │ │ │ ├── __init__.py │ │ │ │ ├── config.py │ │ │ │ └── monkey_patches.py │ │ │ ├── model_metadata_enrichments.json │ │ │ ├── model_name_parser.py │ │ │ ├── model_response.py │ │ │ ├── models.py │ │ │ ├── multi_llm.py │ │ │ ├── override_models.py │ │ │ ├── prompt_cache/ │ │ │ │ ├── README.md │ │ │ │ ├── __init__.py │ │ │ │ ├── cache_manager.py │ │ │ │ ├── models.py │ │ │ │ ├── processor.py │ │ │ │ ├── providers/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── anthropic.py │ │ │ │ │ ├── base.py │ │ │ │ │ ├── factory.py │ │ │ │ │ ├── noop.py │ │ │ │ │ ├── openai.py │ │ │ │ │ └── vertex.py │ │ │ │ └── utils.py │ │ │ ├── request_context.py │ │ │ ├── utils.py │ │ │ └── well_known_providers/ │ │ │ ├── auto_update_models.py │ │ │ ├── auto_update_service.py │ │ │ ├── constants.py │ │ │ ├── llm_provider_options.py │ │ │ ├── models.py │ │ │ └── recommended-models.json │ │ ├── main.py │ │ ├── mcp_server/ │ │ │ ├── README.md │ │ │ ├── api.py │ │ │ ├── auth.py │ │ │ ├── mcp.json.template │ │ │ ├── resources/ │ │ │ │ ├── __init__.py │ │ │ │ └── indexed_sources.py │ │ │ ├── tools/ │ │ │ │ ├── __init__.py │ │ │ │ └── search.py │ │ │ └── utils.py │ │ ├── mcp_server_main.py │ │ ├── natural_language_processing/ │ │ │ ├── __init__.py │ │ │ ├── constants.py │ │ │ ├── english_stopwords.py │ │ │ ├── exceptions.py │ │ │ ├── search_nlp_models.py │ │ │ └── utils.py │ │ ├── onyxbot/ │ │ │ ├── discord/ │ │ │ │ ├── DISCORD_MULTITENANT_README.md │ │ │ │ ├── api_client.py │ │ │ │ ├── cache.py │ │ │ │ ├── client.py │ │ │ │ ├── constants.py │ │ │ │ ├── exceptions.py │ │ │ │ ├── handle_commands.py │ │ │ │ ├── handle_message.py │ │ │ │ └── utils.py │ │ │ └── slack/ │ │ │ ├── blocks.py │ │ │ ├── config.py │ │ │ ├── constants.py │ │ │ ├── formatting.py │ │ │ ├── handlers/ │ │ │ │ ├── __init__.py │ │ │ │ ├── handle_buttons.py │ │ │ │ ├── handle_message.py │ │ │ │ ├── handle_regular_answer.py │ │ │ │ ├── handle_standard_answers.py │ │ │ │ └── utils.py │ │ │ ├── icons.py │ │ │ ├── listener.py │ │ │ ├── models.py │ │ │ └── utils.py │ │ ├── prompts/ │ │ │ ├── __init__.py │ │ │ ├── basic_memory.py │ │ │ ├── chat_prompts.py │ │ │ ├── chat_tools.py │ │ │ ├── compression_prompts.py │ │ │ ├── constants.py │ │ │ ├── contextual_retrieval.py │ │ │ ├── deep_research/ │ │ │ │ ├── __init__.py │ │ │ │ ├── dr_tool_prompts.py │ │ │ │ ├── orchestration_layer.py │ │ │ │ └── research_agent.py │ │ │ ├── federated_search.py │ │ │ ├── filter_extration.py │ │ │ ├── image_analysis.py │ │ │ ├── kg_prompts.py │ │ │ ├── prompt_template.py │ │ │ ├── prompt_utils.py │ │ │ ├── search_prompts.py │ │ │ ├── tool_prompts.py │ │ │ └── user_info.py │ │ ├── redis/ │ │ │ ├── iam_auth.py │ │ │ ├── redis_connector.py │ │ │ ├── redis_connector_delete.py │ │ │ ├── redis_connector_doc_perm_sync.py │ │ │ ├── redis_connector_ext_group_sync.py │ │ │ ├── redis_connector_index.py │ │ │ ├── redis_connector_prune.py │ │ │ ├── redis_connector_stop.py │ │ │ ├── redis_connector_utils.py │ │ │ ├── redis_document_set.py │ │ │ ├── redis_hierarchy.py │ │ │ ├── redis_object_helper.py │ │ │ ├── redis_pool.py │ │ │ ├── redis_usergroup.py │ │ │ └── redis_utils.py │ │ ├── secondary_llm_flows/ │ │ │ ├── __init__.py │ │ │ ├── chat_session_naming.py │ │ │ ├── document_filter.py │ │ │ ├── memory_update.py │ │ │ ├── query_expansion.py │ │ │ ├── source_filter.py │ │ │ └── time_filter.py │ │ ├── seeding/ │ │ │ └── __init__.py │ │ ├── server/ │ │ │ ├── __init__.py │ │ │ ├── api_key/ │ │ │ │ ├── api.py │ │ │ │ └── models.py │ │ │ ├── api_key_usage.py │ │ │ ├── auth_check.py │ │ │ ├── documents/ │ │ │ │ ├── __init__.py │ │ │ │ ├── cc_pair.py │ │ │ │ ├── connector.py │ │ │ │ ├── credential.py │ │ │ │ ├── document.py │ │ │ │ ├── document_utils.py │ │ │ │ ├── models.py │ │ │ │ ├── private_key_types.py │ │ │ │ └── standard_oauth.py │ │ │ ├── evals/ │ │ │ │ ├── __init__.py │ │ │ │ └── models.py │ │ │ ├── features/ │ │ │ │ ├── __init__.py │ │ │ │ ├── build/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── AGENTS.template.md │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── api.py │ │ │ │ │ │ ├── messages_api.py │ │ │ │ │ │ ├── models.py │ │ │ │ │ │ ├── packet_logger.py │ │ │ │ │ │ ├── packets.py │ │ │ │ │ │ ├── rate_limit.py │ │ │ │ │ │ ├── sessions_api.py │ │ │ │ │ │ ├── subscription_check.py │ │ │ │ │ │ ├── templates/ │ │ │ │ │ │ │ ├── webapp_hmr_fixer.js │ │ │ │ │ │ │ └── webapp_offline.html │ │ │ │ │ │ └── user_library.py │ │ │ │ │ ├── configs.py │ │ │ │ │ ├── db/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── build_session.py │ │ │ │ │ │ ├── rate_limit.py │ │ │ │ │ │ ├── sandbox.py │ │ │ │ │ │ └── user_library.py │ │ │ │ │ ├── indexing/ │ │ │ │ │ │ └── persistent_document_writer.py │ │ │ │ │ ├── s3/ │ │ │ │ │ │ └── s3_client.py │ │ │ │ │ ├── sandbox/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── base.py │ │ │ │ │ │ ├── kubernetes/ │ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ │ ├── docker/ │ │ │ │ │ │ │ │ ├── Dockerfile │ │ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ │ │ ├── generate_agents_md.py │ │ │ │ │ │ │ │ ├── initial-requirements.txt │ │ │ │ │ │ │ │ ├── run-test.sh │ │ │ │ │ │ │ │ ├── skills/ │ │ │ │ │ │ │ │ │ ├── image-generation/ │ │ │ │ │ │ │ │ │ │ ├── SKILL.md │ │ │ │ │ │ │ │ │ │ └── scripts/ │ │ │ │ │ │ │ │ │ │ └── generate.py │ │ │ │ │ │ │ │ │ └── pptx/ │ │ │ │ │ │ │ │ │ ├── SKILL.md │ │ │ │ │ │ │ │ │ ├── editing.md │ │ │ │ │ │ │ │ │ ├── pptxgenjs.md │ │ │ │ │ │ │ │ │ └── scripts/ │ │ │ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ │ │ │ ├── add_slide.py │ │ │ │ │ │ │ │ │ ├── clean.py │ │ │ │ │ │ │ │ │ ├── office/ │ │ │ │ │ │ │ │ │ │ ├── helpers/ │ │ │ │ │ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ │ │ │ │ │ ├── merge_runs.py │ │ │ │ │ │ │ │ │ │ │ └── simplify_redlines.py │ │ │ │ │ │ │ │ │ │ ├── pack.py │ │ │ │ │ │ │ │ │ │ ├── schemas/ │ │ │ │ │ │ │ │ │ │ │ ├── ISO-IEC29500-4_2016/ │ │ │ │ │ │ │ │ │ │ │ │ ├── dml-chart.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── dml-chartDrawing.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── dml-diagram.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── dml-lockedCanvas.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── dml-main.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── dml-picture.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── dml-spreadsheetDrawing.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── dml-wordprocessingDrawing.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── pml.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── shared-additionalCharacteristics.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── shared-bibliography.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── shared-commonSimpleTypes.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── shared-customXmlDataProperties.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── shared-customXmlSchemaProperties.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── shared-documentPropertiesCustom.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── shared-documentPropertiesExtended.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── shared-documentPropertiesVariantTypes.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── shared-math.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── shared-relationshipReference.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── sml.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── vml-main.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── vml-officeDrawing.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── vml-presentationDrawing.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── vml-spreadsheetDrawing.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── vml-wordprocessingDrawing.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── wml.xsd │ │ │ │ │ │ │ │ │ │ │ │ └── xml.xsd │ │ │ │ │ │ │ │ │ │ │ ├── ecma/ │ │ │ │ │ │ │ │ │ │ │ │ └── fouth-edition/ │ │ │ │ │ │ │ │ │ │ │ │ ├── opc-contentTypes.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── opc-coreProperties.xsd │ │ │ │ │ │ │ │ │ │ │ │ ├── opc-digSig.xsd │ │ │ │ │ │ │ │ │ │ │ │ └── opc-relationships.xsd │ │ │ │ │ │ │ │ │ │ │ ├── mce/ │ │ │ │ │ │ │ │ │ │ │ │ └── mc.xsd │ │ │ │ │ │ │ │ │ │ │ └── microsoft/ │ │ │ │ │ │ │ │ │ │ │ ├── wml-2010.xsd │ │ │ │ │ │ │ │ │ │ │ ├── wml-2012.xsd │ │ │ │ │ │ │ │ │ │ │ ├── wml-2018.xsd │ │ │ │ │ │ │ │ │ │ │ ├── wml-cex-2018.xsd │ │ │ │ │ │ │ │ │ │ │ ├── wml-cid-2016.xsd │ │ │ │ │ │ │ │ │ │ │ ├── wml-sdtdatahash-2020.xsd │ │ │ │ │ │ │ │ │ │ │ └── wml-symex-2015.xsd │ │ │ │ │ │ │ │ │ │ ├── soffice.py │ │ │ │ │ │ │ │ │ │ ├── unpack.py │ │ │ │ │ │ │ │ │ │ ├── validate.py │ │ │ │ │ │ │ │ │ │ └── validators/ │ │ │ │ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ │ │ │ │ ├── base.py │ │ │ │ │ │ │ │ │ │ ├── docx.py │ │ │ │ │ │ │ │ │ │ ├── pptx.py │ │ │ │ │ │ │ │ │ │ └── redlining.py │ │ │ │ │ │ │ │ │ ├── preview.py │ │ │ │ │ │ │ │ │ └── thumbnail.py │ │ │ │ │ │ │ │ ├── templates/ │ │ │ │ │ │ │ │ │ └── outputs/ │ │ │ │ │ │ │ │ │ └── web/ │ │ │ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ │ │ │ ├── AGENTS.md │ │ │ │ │ │ │ │ │ ├── app/ │ │ │ │ │ │ │ │ │ │ ├── globals.css │ │ │ │ │ │ │ │ │ │ ├── layout.tsx │ │ │ │ │ │ │ │ │ │ ├── page.tsx │ │ │ │ │ │ │ │ │ │ └── site.webmanifest │ │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ │ ├── component-example.tsx │ │ │ │ │ │ │ │ │ │ ├── example.tsx │ │ │ │ │ │ │ │ │ │ └── ui/ │ │ │ │ │ │ │ │ │ │ ├── accordion.tsx │ │ │ │ │ │ │ │ │ │ ├── alert-dialog.tsx │ │ │ │ │ │ │ │ │ │ ├── alert.tsx │ │ │ │ │ │ │ │ │ │ ├── aspect-ratio.tsx │ │ │ │ │ │ │ │ │ │ ├── avatar.tsx │ │ │ │ │ │ │ │ │ │ ├── badge.tsx │ │ │ │ │ │ │ │ │ │ ├── breadcrumb.tsx │ │ │ │ │ │ │ │ │ │ ├── button-group.tsx │ │ │ │ │ │ │ │ │ │ ├── button.tsx │ │ │ │ │ │ │ │ │ │ ├── calendar.tsx │ │ │ │ │ │ │ │ │ │ ├── card.tsx │ │ │ │ │ │ │ │ │ │ ├── carousel.tsx │ │ │ │ │ │ │ │ │ │ ├── chart.tsx │ │ │ │ │ │ │ │ │ │ ├── checkbox.tsx │ │ │ │ │ │ │ │ │ │ ├── collapsible.tsx │ │ │ │ │ │ │ │ │ │ ├── combobox.tsx │ │ │ │ │ │ │ │ │ │ ├── command.tsx │ │ │ │ │ │ │ │ │ │ ├── context-menu.tsx │ │ │ │ │ │ │ │ │ │ ├── dialog.tsx │ │ │ │ │ │ │ │ │ │ ├── drawer.tsx │ │ │ │ │ │ │ │ │ │ ├── dropdown-menu.tsx │ │ │ │ │ │ │ │ │ │ ├── empty.tsx │ │ │ │ │ │ │ │ │ │ ├── field.tsx │ │ │ │ │ │ │ │ │ │ ├── hover-card.tsx │ │ │ │ │ │ │ │ │ │ ├── input-group.tsx │ │ │ │ │ │ │ │ │ │ ├── input.tsx │ │ │ │ │ │ │ │ │ │ ├── item.tsx │ │ │ │ │ │ │ │ │ │ ├── kbd.tsx │ │ │ │ │ │ │ │ │ │ ├── label.tsx │ │ │ │ │ │ │ │ │ │ ├── menubar.tsx │ │ │ │ │ │ │ │ │ │ ├── native-select.tsx │ │ │ │ │ │ │ │ │ │ ├── navigation-menu.tsx │ │ │ │ │ │ │ │ │ │ ├── pagination.tsx │ │ │ │ │ │ │ │ │ │ ├── popover.tsx │ │ │ │ │ │ │ │ │ │ ├── progress.tsx │ │ │ │ │ │ │ │ │ │ ├── radio-group.tsx │ │ │ │ │ │ │ │ │ │ ├── resizable.tsx │ │ │ │ │ │ │ │ │ │ ├── scroll-area.tsx │ │ │ │ │ │ │ │ │ │ ├── select.tsx │ │ │ │ │ │ │ │ │ │ ├── separator.tsx │ │ │ │ │ │ │ │ │ │ ├── sheet.tsx │ │ │ │ │ │ │ │ │ │ ├── sidebar.tsx │ │ │ │ │ │ │ │ │ │ ├── skeleton.tsx │ │ │ │ │ │ │ │ │ │ ├── slider.tsx │ │ │ │ │ │ │ │ │ │ ├── sonner.tsx │ │ │ │ │ │ │ │ │ │ ├── spinner.tsx │ │ │ │ │ │ │ │ │ │ ├── switch.tsx │ │ │ │ │ │ │ │ │ │ ├── table.tsx │ │ │ │ │ │ │ │ │ │ ├── tabs.tsx │ │ │ │ │ │ │ │ │ │ ├── textarea.tsx │ │ │ │ │ │ │ │ │ │ ├── toggle-group.tsx │ │ │ │ │ │ │ │ │ │ ├── toggle.tsx │ │ │ │ │ │ │ │ │ │ └── tooltip.tsx │ │ │ │ │ │ │ │ │ ├── components.json │ │ │ │ │ │ │ │ │ ├── eslint.config.mjs │ │ │ │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ │ │ │ └── use-mobile.ts │ │ │ │ │ │ │ │ │ ├── lib/ │ │ │ │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ │ │ │ ├── next.config.ts │ │ │ │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ │ │ │ ├── postcss.config.mjs │ │ │ │ │ │ │ │ │ └── tsconfig.json │ │ │ │ │ │ │ │ └── test-job.yaml │ │ │ │ │ │ │ ├── internal/ │ │ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ │ │ └── acp_exec_client.py │ │ │ │ │ │ │ └── kubernetes_sandbox_manager.py │ │ │ │ │ │ ├── local/ │ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ │ ├── agent_client.py │ │ │ │ │ │ │ ├── local_sandbox_manager.py │ │ │ │ │ │ │ ├── process_manager.py │ │ │ │ │ │ │ ├── test_agent_client.py │ │ │ │ │ │ │ └── test_manager.py │ │ │ │ │ │ ├── manager/ │ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ │ ├── directory_manager.py │ │ │ │ │ │ │ ├── snapshot_manager.py │ │ │ │ │ │ │ └── test_directory_manager.py │ │ │ │ │ │ ├── models.py │ │ │ │ │ │ ├── tasks/ │ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ │ └── tasks.py │ │ │ │ │ │ └── util/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── agent_instructions.py │ │ │ │ │ │ ├── build_venv_template.py │ │ │ │ │ │ ├── opencode_config.py │ │ │ │ │ │ └── persona_mapping.py │ │ │ │ │ ├── session/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── manager.py │ │ │ │ │ │ └── prompts.py │ │ │ │ │ └── utils.py │ │ │ │ ├── default_assistant/ │ │ │ │ │ ├── api.py │ │ │ │ │ └── models.py │ │ │ │ ├── document_set/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── api.py │ │ │ │ │ └── models.py │ │ │ │ ├── hierarchy/ │ │ │ │ │ ├── api.py │ │ │ │ │ ├── constants.py │ │ │ │ │ └── models.py │ │ │ │ ├── hooks/ │ │ │ │ │ └── __init__.py │ │ │ │ ├── input_prompt/ │ │ │ │ │ ├── api.py │ │ │ │ │ └── models.py │ │ │ │ ├── mcp/ │ │ │ │ │ ├── api.py │ │ │ │ │ └── models.py │ │ │ │ ├── notifications/ │ │ │ │ │ └── api.py │ │ │ │ ├── oauth_config/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── api.py │ │ │ │ │ └── models.py │ │ │ │ ├── password/ │ │ │ │ │ ├── api.py │ │ │ │ │ └── models.py │ │ │ │ ├── persona/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── api.py │ │ │ │ │ ├── constants.py │ │ │ │ │ └── models.py │ │ │ │ ├── projects/ │ │ │ │ │ ├── api.py │ │ │ │ │ ├── models.py │ │ │ │ │ └── projects_file_utils.py │ │ │ │ ├── release_notes/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── constants.py │ │ │ │ │ ├── models.py │ │ │ │ │ └── utils.py │ │ │ │ ├── tool/ │ │ │ │ │ ├── api.py │ │ │ │ │ ├── models.py │ │ │ │ │ └── tool_visibility.py │ │ │ │ ├── user_oauth_token/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── api.py │ │ │ │ └── web_search/ │ │ │ │ ├── api.py │ │ │ │ └── models.py │ │ │ ├── federated/ │ │ │ │ ├── api.py │ │ │ │ └── models.py │ │ │ ├── kg/ │ │ │ │ ├── api.py │ │ │ │ └── models.py │ │ │ ├── manage/ │ │ │ │ ├── __init__.py │ │ │ │ ├── administrative.py │ │ │ │ ├── code_interpreter/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── api.py │ │ │ │ │ └── models.py │ │ │ │ ├── discord_bot/ │ │ │ │ │ ├── api.py │ │ │ │ │ ├── models.py │ │ │ │ │ └── utils.py │ │ │ │ ├── embedding/ │ │ │ │ │ ├── api.py │ │ │ │ │ └── models.py │ │ │ │ ├── get_state.py │ │ │ │ ├── image_generation/ │ │ │ │ │ ├── api.py │ │ │ │ │ └── models.py │ │ │ │ ├── llm/ │ │ │ │ │ ├── api.py │ │ │ │ │ ├── models.py │ │ │ │ │ └── utils.py │ │ │ │ ├── models.py │ │ │ │ ├── opensearch_migration/ │ │ │ │ │ ├── api.py │ │ │ │ │ └── models.py │ │ │ │ ├── search_settings.py │ │ │ │ ├── slack_bot.py │ │ │ │ ├── users.py │ │ │ │ ├── validate_tokens.py │ │ │ │ ├── voice/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── api.py │ │ │ │ │ ├── models.py │ │ │ │ │ ├── user_api.py │ │ │ │ │ └── websocket_api.py │ │ │ │ └── web_search/ │ │ │ │ ├── api.py │ │ │ │ └── models.py │ │ │ ├── metrics/ │ │ │ │ ├── __init__.py │ │ │ │ ├── celery_task_metrics.py │ │ │ │ ├── indexing_pipeline.py │ │ │ │ ├── indexing_pipeline_setup.py │ │ │ │ ├── indexing_task_metrics.py │ │ │ │ ├── metrics_server.py │ │ │ │ ├── opensearch_search.py │ │ │ │ ├── per_tenant.py │ │ │ │ ├── postgres_connection_pool.py │ │ │ │ ├── prometheus_setup.py │ │ │ │ └── slow_requests.py │ │ │ ├── middleware/ │ │ │ │ ├── latency_logging.py │ │ │ │ └── rate_limiting.py │ │ │ ├── models.py │ │ │ ├── onyx_api/ │ │ │ │ ├── __init__.py │ │ │ │ ├── ingestion.py │ │ │ │ └── models.py │ │ │ ├── pat/ │ │ │ │ ├── __init__.py │ │ │ │ ├── api.py │ │ │ │ └── models.py │ │ │ ├── query_and_chat/ │ │ │ │ ├── __init__.py │ │ │ │ ├── chat_backend.py │ │ │ │ ├── chat_utils.py │ │ │ │ ├── models.py │ │ │ │ ├── placement.py │ │ │ │ ├── query_backend.py │ │ │ │ ├── session_loading.py │ │ │ │ ├── streaming_models.py │ │ │ │ └── token_limit.py │ │ │ ├── runtime/ │ │ │ │ └── onyx_runtime.py │ │ │ ├── saml.py │ │ │ ├── settings/ │ │ │ │ ├── api.py │ │ │ │ ├── models.py │ │ │ │ └── store.py │ │ │ ├── tenant_usage_limits.py │ │ │ ├── token_rate_limits/ │ │ │ │ ├── api.py │ │ │ │ └── models.py │ │ │ ├── usage_limits.py │ │ │ ├── utils.py │ │ │ └── utils_vector_db.py │ │ ├── setup.py │ │ ├── tools/ │ │ │ ├── built_in_tools.py │ │ │ ├── constants.py │ │ │ ├── fake_tools/ │ │ │ │ ├── __init__.py │ │ │ │ └── research_agent.py │ │ │ ├── interface.py │ │ │ ├── models.py │ │ │ ├── tool_constructor.py │ │ │ ├── tool_implementations/ │ │ │ │ ├── custom/ │ │ │ │ │ ├── base_tool_types.py │ │ │ │ │ ├── custom_tool.py │ │ │ │ │ └── openapi_parsing.py │ │ │ │ ├── file_reader/ │ │ │ │ │ └── file_reader_tool.py │ │ │ │ ├── images/ │ │ │ │ │ ├── image_generation_tool.py │ │ │ │ │ └── models.py │ │ │ │ ├── knowledge_graph/ │ │ │ │ │ └── knowledge_graph_tool.py │ │ │ │ ├── mcp/ │ │ │ │ │ ├── mcp_client.py │ │ │ │ │ └── mcp_tool.py │ │ │ │ ├── memory/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── memory_tool.py │ │ │ │ │ └── models.py │ │ │ │ ├── open_url/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── firecrawl.py │ │ │ │ │ ├── models.py │ │ │ │ │ ├── onyx_web_crawler.py │ │ │ │ │ ├── open_url_tool.py │ │ │ │ │ ├── snippet_matcher.py │ │ │ │ │ ├── url_normalization.py │ │ │ │ │ └── utils.py │ │ │ │ ├── python/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── code_interpreter_client.py │ │ │ │ │ └── python_tool.py │ │ │ │ ├── search/ │ │ │ │ │ ├── constants.py │ │ │ │ │ ├── search_tool.py │ │ │ │ │ └── search_utils.py │ │ │ │ ├── search_like_tool_utils.py │ │ │ │ ├── utils.py │ │ │ │ └── web_search/ │ │ │ │ ├── clients/ │ │ │ │ │ ├── brave_client.py │ │ │ │ │ ├── exa_client.py │ │ │ │ │ ├── google_pse_client.py │ │ │ │ │ ├── searxng_client.py │ │ │ │ │ └── serper_client.py │ │ │ │ ├── models.py │ │ │ │ ├── providers.py │ │ │ │ ├── utils.py │ │ │ │ └── web_search_tool.py │ │ │ ├── tool_runner.py │ │ │ └── utils.py │ │ ├── tracing/ │ │ │ ├── braintrust_tracing_processor.py │ │ │ ├── framework/ │ │ │ │ ├── __init__.py │ │ │ │ ├── _error_tracing.py │ │ │ │ ├── create.py │ │ │ │ ├── processor_interface.py │ │ │ │ ├── provider.py │ │ │ │ ├── scope.py │ │ │ │ ├── setup.py │ │ │ │ ├── span_data.py │ │ │ │ ├── spans.py │ │ │ │ ├── traces.py │ │ │ │ └── util.py │ │ │ ├── langfuse_tracing_processor.py │ │ │ ├── llm_utils.py │ │ │ ├── masking.py │ │ │ └── setup.py │ │ ├── utils/ │ │ │ ├── __init__.py │ │ │ ├── b64.py │ │ │ ├── batching.py │ │ │ ├── callbacks.py │ │ │ ├── encryption.py │ │ │ ├── error_handling.py │ │ │ ├── errors.py │ │ │ ├── file.py │ │ │ ├── gpu_utils.py │ │ │ ├── headers.py │ │ │ ├── jsonriver/ │ │ │ │ ├── __init__.py │ │ │ │ ├── parse.py │ │ │ │ └── tokenize.py │ │ │ ├── logger.py │ │ │ ├── long_term_log.py │ │ │ ├── memory_logger.py │ │ │ ├── middleware.py │ │ │ ├── object_size_check.py │ │ │ ├── postgres_sanitization.py │ │ │ ├── pydantic_util.py │ │ │ ├── retry_wrapper.py │ │ │ ├── search_nlp_models_utils.py │ │ │ ├── sensitive.py │ │ │ ├── sitemap.py │ │ │ ├── special_types.py │ │ │ ├── subclasses.py │ │ │ ├── supervisord_watchdog.py │ │ │ ├── telemetry.py │ │ │ ├── tenant.py │ │ │ ├── text_processing.py │ │ │ ├── threadpool_concurrency.py │ │ │ ├── timing.py │ │ │ ├── url.py │ │ │ ├── variable_functionality.py │ │ │ └── web_content.py │ │ └── voice/ │ │ ├── __init__.py │ │ ├── factory.py │ │ ├── interface.py │ │ └── providers/ │ │ ├── __init__.py │ │ ├── azure.py │ │ ├── elevenlabs.py │ │ └── openai.py │ ├── pyproject.toml │ ├── pytest.ini │ ├── requirements/ │ │ ├── README.md │ │ ├── combined.txt │ │ ├── default.txt │ │ ├── dev.txt │ │ ├── ee.txt │ │ └── model_server.txt │ ├── scripts/ │ │ ├── __init__.py │ │ ├── add_connector_creation_script.py │ │ ├── api_inference_sample.py │ │ ├── celery_purge_queue.py │ │ ├── chat_feedback_dump.py │ │ ├── chat_history_seeding.py │ │ ├── chat_loadtest.py │ │ ├── debugging/ │ │ │ ├── debug_usage_limits.py │ │ │ ├── litellm/ │ │ │ │ ├── README │ │ │ │ ├── call_litellm.py │ │ │ │ ├── directly_hit_azure_api.py │ │ │ │ └── payload.json │ │ │ ├── onyx_db.py │ │ │ ├── onyx_list_tenants.py │ │ │ ├── onyx_redis.py │ │ │ ├── onyx_vespa_schemas.py │ │ │ └── opensearch/ │ │ │ ├── benchmark_retrieval.py │ │ │ ├── constants.py │ │ │ ├── embed_and_save.py │ │ │ ├── embedding_io.py │ │ │ ├── opensearch_debug.py │ │ │ └── query_hierarchy_debug.py │ │ ├── decrypt.py │ │ ├── dev_run_background_jobs.py │ │ ├── docker_memory_tracking.sh │ │ ├── force_delete_connector_by_id.py │ │ ├── get_wikidocs.py │ │ ├── hard_delete_chats.py │ │ ├── lib/ │ │ │ └── logger.py │ │ ├── make_foss_repo.sh │ │ ├── onyx_openapi_schema.py │ │ ├── orphan_doc_cleanup_script.py │ │ ├── query_time_check/ │ │ │ ├── seed_dummy_docs.py │ │ │ └── test_query_times.py │ │ ├── reencrypt_secrets.py │ │ ├── reset_indexes.py │ │ ├── reset_postgres.py │ │ ├── restart_containers.sh │ │ ├── resume_paused_connectors.py │ │ ├── run_industryrag_bench_questions.py │ │ ├── save_load_state.py │ │ ├── setup_craft_templates.sh │ │ ├── sources_selection_analysis.py │ │ ├── supervisord_entrypoint.sh │ │ ├── tenant_cleanup/ │ │ │ ├── QUICK_START_NO_BASTION.md │ │ │ ├── README.md │ │ │ ├── analyze_current_tenants.py │ │ │ ├── check_no_bastion_setup.py │ │ │ ├── cleanup_tenants.py │ │ │ ├── cleanup_utils.py │ │ │ ├── mark_connectors_for_deletion.py │ │ │ ├── no_bastion_analyze_tenants.py │ │ │ ├── no_bastion_cleanup_tenants.py │ │ │ ├── no_bastion_cleanup_utils.py │ │ │ ├── no_bastion_mark_connectors.py │ │ │ └── on_pod_scripts/ │ │ │ ├── check_documents_deleted.py │ │ │ ├── cleanup_tenant_schema.py │ │ │ ├── execute_connector_deletion.py │ │ │ ├── get_tenant_connectors.py │ │ │ ├── get_tenant_index_name.py │ │ │ ├── get_tenant_users.py │ │ │ └── understand_tenants.py │ │ ├── test-openapi-key.py │ │ ├── transform_openapi_for_docs.py │ │ └── upload_files_as_connectors.py │ ├── shared_configs/ │ │ ├── __init__.py │ │ ├── configs.py │ │ ├── contextvars.py │ │ ├── enums.py │ │ ├── model_server_models.py │ │ └── utils.py │ ├── slackbot_images/ │ │ └── README.md │ ├── supervisord.conf │ └── tests/ │ ├── README.md │ ├── __init__.py │ ├── api/ │ │ └── test_api.py │ ├── conftest.py │ ├── daily/ │ │ ├── conftest.py │ │ ├── connectors/ │ │ │ ├── airtable/ │ │ │ │ └── test_airtable_basic.py │ │ │ ├── bitbucket/ │ │ │ │ ├── conftest.py │ │ │ │ ├── test_bitbucket_checkpointed.py │ │ │ │ └── test_bitbucket_slim_connector.py │ │ │ ├── blob/ │ │ │ │ └── test_blob_connector.py │ │ │ ├── coda/ │ │ │ │ ├── README.md │ │ │ │ └── test_coda_connector.py │ │ │ ├── confluence/ │ │ │ │ ├── models.py │ │ │ │ ├── test_confluence_basic.py │ │ │ │ ├── test_confluence_permissions_basic.py │ │ │ │ └── test_confluence_user_email_overrides.py │ │ │ ├── conftest.py │ │ │ ├── discord/ │ │ │ │ └── test_discord_connector.py │ │ │ ├── file/ │ │ │ │ └── test_file_connector.py │ │ │ ├── fireflies/ │ │ │ │ ├── test_fireflies_connector.py │ │ │ │ └── test_fireflies_data.json │ │ │ ├── gitbook/ │ │ │ │ └── test_gitbook_connector.py │ │ │ ├── github/ │ │ │ │ └── test_github_basic.py │ │ │ ├── gitlab/ │ │ │ │ └── test_gitlab_basic.py │ │ │ ├── gmail/ │ │ │ │ ├── conftest.py │ │ │ │ └── test_gmail_connector.py │ │ │ ├── gong/ │ │ │ │ └── test_gong.py │ │ │ ├── google_drive/ │ │ │ │ ├── conftest.py │ │ │ │ ├── consts_and_utils.py │ │ │ │ ├── drive_id_mapping.json │ │ │ │ ├── test_admin_oauth.py │ │ │ │ ├── test_drive_perm_sync.py │ │ │ │ ├── test_link_visibility_filter.py │ │ │ │ ├── test_map_test_ids.py │ │ │ │ ├── test_sections.py │ │ │ │ ├── test_service_acct.py │ │ │ │ └── test_user_1_oauth.py │ │ │ ├── highspot/ │ │ │ │ ├── test_highspot_connector.py │ │ │ │ └── test_highspot_data.json │ │ │ ├── hubspot/ │ │ │ │ └── test_hubspot_connector.py │ │ │ ├── imap/ │ │ │ │ ├── models.py │ │ │ │ └── test_imap_connector.py │ │ │ ├── jira/ │ │ │ │ └── test_jira_basic.py │ │ │ ├── notion/ │ │ │ │ └── test_notion_connector.py │ │ │ ├── outline/ │ │ │ │ └── test_outline_connector.py │ │ │ ├── salesforce/ │ │ │ │ ├── test_salesforce_connector.py │ │ │ │ └── test_salesforce_data.json │ │ │ ├── sharepoint/ │ │ │ │ └── test_sharepoint_connector.py │ │ │ ├── slab/ │ │ │ │ ├── test_slab_connector.py │ │ │ │ └── test_slab_data.json │ │ │ ├── slack/ │ │ │ │ ├── conftest.py │ │ │ │ ├── test_slack_connector.py │ │ │ │ └── test_slack_perm_sync.py │ │ │ ├── teams/ │ │ │ │ ├── models.py │ │ │ │ └── test_teams_connector.py │ │ │ ├── utils.py │ │ │ ├── web/ │ │ │ │ └── test_web_connector.py │ │ │ └── zendesk/ │ │ │ ├── test_zendesk_connector.py │ │ │ └── test_zendesk_data.json │ │ ├── embedding/ │ │ │ └── test_embeddings.py │ │ └── llm/ │ │ └── test_bedrock.py │ ├── external_dependency_unit/ │ │ ├── answer/ │ │ │ ├── conftest.py │ │ │ ├── stream_test_assertions.py │ │ │ ├── stream_test_builder.py │ │ │ ├── stream_test_utils.py │ │ │ ├── test_answer_without_openai.py │ │ │ ├── test_current_datetime_replacement.py │ │ │ ├── test_stream_chat_message.py │ │ │ └── test_stream_chat_message_objects.py │ │ ├── background/ │ │ │ ├── test_periodic_task_claim.py │ │ │ └── test_startup_recovery.py │ │ ├── cache/ │ │ │ ├── conftest.py │ │ │ ├── test_cache_backend_parity.py │ │ │ ├── test_kv_store_cache_layer.py │ │ │ └── test_postgres_cache_backend.py │ │ ├── celery/ │ │ │ ├── test_docfetching_priority.py │ │ │ ├── test_docprocessing_priority.py │ │ │ ├── test_persona_file_sync.py │ │ │ ├── test_pruning_hierarchy_nodes.py │ │ │ ├── test_user_file_delete_queue.py │ │ │ ├── test_user_file_indexing_adapter.py │ │ │ └── test_user_file_processing_queue.py │ │ ├── chat/ │ │ │ └── test_user_reminder_message_type.py │ │ ├── conftest.py │ │ ├── connectors/ │ │ │ ├── confluence/ │ │ │ │ ├── conftest.py │ │ │ │ └── test_confluence_group_sync.py │ │ │ ├── google_drive/ │ │ │ │ └── test_google_drive_group_sync.py │ │ │ └── jira/ │ │ │ ├── conftest.py │ │ │ ├── test_jira_doc_sync.py │ │ │ └── test_jira_group_sync.py │ │ ├── constants.py │ │ ├── craft/ │ │ │ ├── conftest.py │ │ │ ├── test_build_packet_storage.py │ │ │ ├── test_file_upload.py │ │ │ ├── test_kubernetes_sandbox.py │ │ │ └── test_persistent_document_writer.py │ │ ├── db/ │ │ │ ├── __init__.py │ │ │ ├── conftest.py │ │ │ ├── test_chat_session_eager_load.py │ │ │ ├── test_credential_sensitive_value.py │ │ │ ├── test_rotate_encryption_key.py │ │ │ ├── test_tag_race_condition.py │ │ │ └── test_user_account_type.py │ │ ├── discord_bot/ │ │ │ ├── conftest.py │ │ │ └── test_discord_events.py │ │ ├── document_index/ │ │ │ ├── conftest.py │ │ │ ├── test_document_index.py │ │ │ └── test_document_index_old.py │ │ ├── feature_flags/ │ │ │ ├── __init__.py │ │ │ └── test_feature_flag_provider_factory.py │ │ ├── file_store/ │ │ │ ├── test_file_store_non_mocked.py │ │ │ └── test_postgres_file_store_non_mocked.py │ │ ├── full_setup.py │ │ ├── hierarchy/ │ │ │ ├── __init__.py │ │ │ └── test_hierarchy_access_filter.py │ │ ├── llm/ │ │ │ ├── test_llm_provider.py │ │ │ ├── test_llm_provider_api_base.py │ │ │ ├── test_llm_provider_auto_mode.py │ │ │ ├── test_llm_provider_called.py │ │ │ ├── test_llm_provider_default_model_protection.py │ │ │ └── test_prompt_caching.py │ │ ├── mock_content_provider.py │ │ ├── mock_image_provider.py │ │ ├── mock_llm.py │ │ ├── mock_search_pipeline.py │ │ ├── mock_search_provider.py │ │ ├── opensearch/ │ │ │ ├── test_assistant_knowledge_filter.py │ │ │ └── test_opensearch_client.py │ │ ├── opensearch_migration/ │ │ │ └── test_opensearch_migration_tasks.py │ │ ├── permission_sync/ │ │ │ ├── test_doc_permission_sync_attempt.py │ │ │ └── test_external_group_permission_sync_attempt.py │ │ ├── search_settings/ │ │ │ └── test_search_settings.py │ │ ├── slack_bot/ │ │ │ ├── __init__.py │ │ │ ├── test_slack_bot_crud.py │ │ │ └── test_slack_bot_federated_search.py │ │ ├── tools/ │ │ │ ├── data/ │ │ │ │ └── financial-sample.xlsx │ │ │ ├── test_image_generation_tool.py │ │ │ ├── test_mcp_passthrough_oauth.py │ │ │ ├── test_memory_tool_integration.py │ │ │ ├── test_oauth_config_crud.py │ │ │ ├── test_oauth_token_manager.py │ │ │ ├── test_oauth_tool_integration.py │ │ │ ├── test_python_tool.py │ │ │ └── test_python_tool_server_enabled.py │ │ └── tracing/ │ │ ├── __init__.py │ │ └── test_llm_span_recording.py │ ├── integration/ │ │ ├── Dockerfile │ │ ├── README.md │ │ ├── __init__.py │ │ ├── common_utils/ │ │ │ ├── chat.py │ │ │ ├── config.py │ │ │ ├── constants.py │ │ │ ├── document_acl.py │ │ │ ├── managers/ │ │ │ │ ├── api_key.py │ │ │ │ ├── cc_pair.py │ │ │ │ ├── chat.py │ │ │ │ ├── connector.py │ │ │ │ ├── credential.py │ │ │ │ ├── discord_bot.py │ │ │ │ ├── document.py │ │ │ │ ├── document_search.py │ │ │ │ ├── document_set.py │ │ │ │ ├── file.py │ │ │ │ ├── image_generation.py │ │ │ │ ├── index_attempt.py │ │ │ │ ├── llm_provider.py │ │ │ │ ├── pat.py │ │ │ │ ├── persona.py │ │ │ │ ├── project.py │ │ │ │ ├── query_history.py │ │ │ │ ├── scim_client.py │ │ │ │ ├── scim_token.py │ │ │ │ ├── settings.py │ │ │ │ ├── tenant.py │ │ │ │ ├── tool.py │ │ │ │ ├── user.py │ │ │ │ └── user_group.py │ │ │ ├── reset.py │ │ │ ├── test_document_utils.py │ │ │ ├── test_file_utils.py │ │ │ ├── test_files/ │ │ │ │ └── three_images.docx │ │ │ ├── test_models.py │ │ │ ├── timeout.py │ │ │ └── vespa.py │ │ ├── conftest.py │ │ ├── connector_job_tests/ │ │ │ ├── github/ │ │ │ │ ├── conftest.py │ │ │ │ ├── test_github_permission_sync.py │ │ │ │ └── utils.py │ │ │ ├── google/ │ │ │ │ ├── google_drive_api_utils.py │ │ │ │ └── test_google_drive_permission_sync.py │ │ │ ├── jira/ │ │ │ │ ├── conftest.py │ │ │ │ └── test_jira_permission_sync_full.py │ │ │ ├── sharepoint/ │ │ │ │ ├── conftest.py │ │ │ │ └── test_sharepoint_permissions.py │ │ │ └── slack/ │ │ │ ├── conftest.py │ │ │ ├── slack_api_utils.py │ │ │ ├── test_permission_sync.py │ │ │ └── test_prune.py │ │ ├── mock_services/ │ │ │ ├── docker-compose.mock-it-services.yml │ │ │ ├── mcp_test_server/ │ │ │ │ ├── run_mcp_server_api_key.py │ │ │ │ ├── run_mcp_server_google_oauth.py │ │ │ │ ├── run_mcp_server_no_auth.py │ │ │ │ ├── run_mcp_server_oauth.py │ │ │ │ └── run_mcp_server_per_user_key.py │ │ │ └── mock_connector_server/ │ │ │ ├── Dockerfile │ │ │ └── main.py │ │ ├── multitenant_tests/ │ │ │ ├── discord_bot/ │ │ │ │ └── test_discord_bot_multitenant.py │ │ │ ├── invitation/ │ │ │ │ └── test_user_invitation.py │ │ │ ├── migrations/ │ │ │ │ └── test_run_multitenant_migrations.py │ │ │ ├── syncing/ │ │ │ │ └── test_search_permissions.py │ │ │ ├── tenants/ │ │ │ │ ├── test_tenant_creation.py │ │ │ │ └── test_tenant_provisioning_rollback.py │ │ │ └── test_get_schemas_needing_migration.py │ │ └── tests/ │ │ ├── anonymous_user/ │ │ │ └── test_anonymous_user.py │ │ ├── api_key/ │ │ │ └── test_api_key.py │ │ ├── auth/ │ │ │ └── test_saml_user_conversion.py │ │ ├── chat/ │ │ │ ├── test_chat_deletion.py │ │ │ └── test_chat_session_access.py │ │ ├── chat_retention/ │ │ │ └── test_chat_retention.py │ │ ├── code_interpreter/ │ │ │ ├── conftest.py │ │ │ └── test_code_interpreter_api.py │ │ ├── connector/ │ │ │ ├── test_connector_creation.py │ │ │ ├── test_connector_deletion.py │ │ │ └── test_last_indexed_time.py │ │ ├── discord_bot/ │ │ │ ├── test_discord_bot_api.py │ │ │ └── test_discord_bot_db.py │ │ ├── document_set/ │ │ │ └── test_syncing.py │ │ ├── image_generation/ │ │ │ ├── test_image_generation_config.py │ │ │ └── test_image_generation_tool_visibility.py │ │ ├── image_indexing/ │ │ │ └── test_indexing_images.py │ │ ├── index_attempt/ │ │ │ └── test_index_attempt_pagination.py │ │ ├── indexing/ │ │ │ ├── conftest.py │ │ │ ├── file_connector/ │ │ │ │ ├── test_file_connector_zip_metadata.py │ │ │ │ └── test_files/ │ │ │ │ ├── .onyx_metadata.json │ │ │ │ ├── sample1.txt │ │ │ │ └── sample2.txt │ │ │ ├── test_checkpointing.py │ │ │ ├── test_initial_permission_sync.py │ │ │ ├── test_polling.py │ │ │ └── test_repeated_error_state.py │ │ ├── ingestion/ │ │ │ └── test_ingestion_api.py │ │ ├── kg/ │ │ │ └── test_kg_api.py │ │ ├── llm_auto_update/ │ │ │ └── test_auto_llm_update.py │ │ ├── llm_provider/ │ │ │ ├── test_llm_provider.py │ │ │ ├── test_llm_provider_access_control.py │ │ │ └── test_llm_provider_persona_access.py │ │ ├── llm_workflows/ │ │ │ ├── test_mock_llm_tool_calls.py │ │ │ ├── test_nightly_provider_chat_workflow.py │ │ │ └── test_tool_policy_enforcement.py │ │ ├── mcp/ │ │ │ ├── test_mcp_client_no_auth_flow.py │ │ │ ├── test_mcp_server_auth.py │ │ │ └── test_mcp_server_search.py │ │ ├── migrations/ │ │ │ ├── conftest.py │ │ │ ├── test_alembic_main.py │ │ │ ├── test_alembic_tenants.py │ │ │ ├── test_assistant_consolidation_migration.py │ │ │ ├── test_migrations.py │ │ │ └── test_tool_seeding.py │ │ ├── no_vectordb/ │ │ │ ├── conftest.py │ │ │ ├── test_no_vectordb_chat.py │ │ │ ├── test_no_vectordb_endpoints.py │ │ │ └── test_no_vectordb_file_lifecycle.py │ │ ├── opensearch_migration/ │ │ │ └── test_opensearch_migration_api.py │ │ ├── pat/ │ │ │ └── test_pat_api.py │ │ ├── permissions/ │ │ │ ├── test_auth_permission_propagation.py │ │ │ ├── test_cc_pair_permissions.py │ │ │ ├── test_connector_permissions.py │ │ │ ├── test_credential_permissions.py │ │ │ ├── test_doc_set_permissions.py │ │ │ ├── test_file_connector_permissions.py │ │ │ ├── test_persona_permissions.py │ │ │ ├── test_user_file_permissions.py │ │ │ ├── test_user_role_permissions.py │ │ │ └── test_whole_curator_flow.py │ │ ├── personalization/ │ │ │ └── test_personalization_flow.py │ │ ├── personas/ │ │ │ ├── test_persona_categories.py │ │ │ ├── test_persona_creation.py │ │ │ ├── test_persona_file_context.py │ │ │ ├── test_persona_label_updates.py │ │ │ ├── test_persona_pagination.py │ │ │ └── test_unified_assistant.py │ │ ├── projects/ │ │ │ └── test_projects.py │ │ ├── pruning/ │ │ │ ├── test_pruning.py │ │ │ └── website/ │ │ │ ├── about.html │ │ │ ├── contact.html │ │ │ ├── courses.html │ │ │ ├── css/ │ │ │ │ ├── animate.css │ │ │ │ ├── custom-fonts.css │ │ │ │ ├── fancybox/ │ │ │ │ │ └── jquery.fancybox.css │ │ │ │ ├── font-awesome.css │ │ │ │ └── style.css │ │ │ ├── fonts/ │ │ │ │ └── fontawesome.otf │ │ │ ├── index.html │ │ │ ├── js/ │ │ │ │ ├── animate.js │ │ │ │ ├── custom.js │ │ │ │ ├── flexslider/ │ │ │ │ │ ├── jquery.flexslider.js │ │ │ │ │ └── setting.js │ │ │ │ ├── google-code-prettify/ │ │ │ │ │ ├── prettify.css │ │ │ │ │ └── prettify.js │ │ │ │ ├── jquery.easing.1.3.js │ │ │ │ ├── jquery.fancybox-media.js │ │ │ │ ├── jquery.fancybox.pack.js │ │ │ │ ├── jquery.flexslider.js │ │ │ │ ├── jquery.js │ │ │ │ ├── portfolio/ │ │ │ │ │ ├── jquery.quicksand.js │ │ │ │ │ └── setting.js │ │ │ │ ├── quicksand/ │ │ │ │ │ ├── jquery.quicksand.js │ │ │ │ │ └── setting.js │ │ │ │ └── validate.js │ │ │ ├── portfolio.html │ │ │ ├── pricing.html │ │ │ └── readme.txt │ │ ├── query_history/ │ │ │ ├── test_query_history.py │ │ │ ├── test_query_history_pagination.py │ │ │ ├── test_usage_reports.py │ │ │ └── utils.py │ │ ├── reporting/ │ │ │ └── test_usage_export_api.py │ │ ├── scim/ │ │ │ ├── test_scim_groups.py │ │ │ ├── test_scim_tokens.py │ │ │ └── test_scim_users.py │ │ ├── search_settings/ │ │ │ └── test_search_settings.py │ │ ├── streaming_endpoints/ │ │ │ ├── test_chat_file_attachment.py │ │ │ └── test_chat_stream.py │ │ ├── tags/ │ │ │ └── test_tags.py │ │ ├── tools/ │ │ │ ├── test_force_tool_use.py │ │ │ └── test_image_generation_streaming.py │ │ ├── usergroup/ │ │ │ ├── test_add_users_to_group.py │ │ │ ├── test_group_membership_updates_user_permissions.py │ │ │ ├── test_new_group_gets_basic_permission.py │ │ │ ├── test_user_group_deletion.py │ │ │ └── test_usergroup_syncing.py │ │ ├── users/ │ │ │ ├── test_default_group_assignment.py │ │ │ ├── test_password_signup_upgrade.py │ │ │ ├── test_reactivation_groups.py │ │ │ ├── test_seat_limit.py │ │ │ ├── test_slack_user_deactivation.py │ │ │ └── test_user_pagination.py │ │ └── web_search/ │ │ └── test_web_search_api.py │ ├── load_env_vars.py │ ├── regression/ │ │ ├── answer_quality/ │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ ├── api_utils.py │ │ │ ├── cli_utils.py │ │ │ ├── file_uploader.py │ │ │ ├── launch_eval_env.py │ │ │ └── search_test_config.yaml.template │ │ └── search_quality/ │ │ ├── README.md │ │ ├── models.py │ │ ├── run_search_eval.py │ │ ├── test_queries.json.template │ │ └── utils.py │ └── unit/ │ ├── __init__.py │ ├── build/ │ │ └── test_rewrite_asset_paths.py │ ├── ee/ │ │ ├── conftest.py │ │ └── onyx/ │ │ ├── db/ │ │ │ ├── test_license.py │ │ │ └── test_user_group_rename.py │ │ ├── external_permissions/ │ │ │ ├── salesforce/ │ │ │ │ └── test_postprocessing.py │ │ │ └── sharepoint/ │ │ │ └── test_permission_utils.py │ │ ├── hooks/ │ │ │ ├── __init__.py │ │ │ └── test_executor.py │ │ ├── server/ │ │ │ ├── __init__.py │ │ │ ├── billing/ │ │ │ │ ├── __init__.py │ │ │ │ ├── conftest.py │ │ │ │ ├── test_billing_api.py │ │ │ │ ├── test_billing_service.py │ │ │ │ └── test_proxy.py │ │ │ ├── features/ │ │ │ │ ├── __init__.py │ │ │ │ └── hooks/ │ │ │ │ ├── __init__.py │ │ │ │ └── test_api.py │ │ │ ├── license/ │ │ │ │ └── test_api.py │ │ │ ├── middleware/ │ │ │ │ └── test_license_enforcement.py │ │ │ ├── settings/ │ │ │ │ └── test_license_enforcement_settings.py │ │ │ └── tenants/ │ │ │ ├── test_billing_api.py │ │ │ ├── test_product_gating.py │ │ │ ├── test_proxy.py │ │ │ └── test_schema_management.py │ │ └── utils/ │ │ ├── test_encryption.py │ │ └── test_license_utils.py │ ├── federated_connector/ │ │ └── slack/ │ │ └── test_slack_federated_connnector.py │ ├── file_store/ │ │ ├── test_file_store.py │ │ └── test_postgres_file_store.py │ ├── model_server/ │ │ └── test_embedding.py │ ├── onyx/ │ │ ├── __init__.py │ │ ├── access/ │ │ │ └── test_user_file_access.py │ │ ├── auth/ │ │ │ ├── conftest.py │ │ │ ├── test_disposable_email_validator.py │ │ │ ├── test_email.py │ │ │ ├── test_is_same_origin.py │ │ │ ├── test_jwt_provisioning.py │ │ │ ├── test_oauth_refresher.py │ │ │ ├── test_oidc_pkce.py │ │ │ ├── test_permissions.py │ │ │ ├── test_single_tenant_jwt_strategy.py │ │ │ ├── test_user_create_schema.py │ │ │ ├── test_user_default_pins.py │ │ │ ├── test_user_registration.py │ │ │ ├── test_verify_auth_setting.py │ │ │ ├── test_verify_email_domain.py │ │ │ └── test_verify_email_invite.py │ │ ├── background/ │ │ │ └── celery/ │ │ │ ├── tasks/ │ │ │ │ ├── tenant_provisioning/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── test_check_available_tenants.py │ │ │ │ ├── test_hierarchyfetching_queue.py │ │ │ │ ├── test_user_file_impl_redis_locking.py │ │ │ │ ├── test_user_file_processing_no_vectordb.py │ │ │ │ └── test_user_file_project_sync_queue.py │ │ │ └── test_celery_redis.py │ │ ├── chat/ │ │ │ ├── test_argument_delta_streaming.py │ │ │ ├── test_chat_utils.py │ │ │ ├── test_citation_processor.py │ │ │ ├── test_citation_utils.py │ │ │ ├── test_compression.py │ │ │ ├── test_context_files.py │ │ │ ├── test_emitter.py │ │ │ ├── test_llm_loop.py │ │ │ ├── test_llm_step.py │ │ │ ├── test_multi_model_streaming.py │ │ │ ├── test_multi_model_types.py │ │ │ ├── test_process_message.py │ │ │ ├── test_process_message_mock_llm.py │ │ │ ├── test_save_chat.py │ │ │ └── test_stop_signal_checker.py │ │ ├── connectors/ │ │ │ ├── airtable/ │ │ │ │ └── test_airtable_index_all.py │ │ │ ├── asana/ │ │ │ │ └── test_asana_connector.py │ │ │ ├── canvas/ │ │ │ │ └── test_canvas_connector.py │ │ │ ├── confluence/ │ │ │ │ ├── test_confluence_checkpointing.py │ │ │ │ ├── test_onyx_confluence.py │ │ │ │ └── test_rate_limit_handler.py │ │ │ ├── cross_connector_utils/ │ │ │ │ ├── test_html_utils.py │ │ │ │ ├── test_rate_limit.py │ │ │ │ └── test_table.html │ │ │ ├── discord/ │ │ │ │ └── test_discord_validation.py │ │ │ ├── github/ │ │ │ │ └── test_github_checkpointing.py │ │ │ ├── gmail/ │ │ │ │ ├── test_connector.py │ │ │ │ └── thread.json │ │ │ ├── google_utils/ │ │ │ │ └── test_rate_limit_detection.py │ │ │ ├── jira/ │ │ │ │ ├── conftest.py │ │ │ │ ├── test_jira_bulk_fetch.py │ │ │ │ ├── test_jira_checkpointing.py │ │ │ │ ├── test_jira_error_handling.py │ │ │ │ ├── test_jira_large_ticket_handling.py │ │ │ │ └── test_jira_permission_sync.py │ │ │ ├── mediawiki/ │ │ │ │ ├── __init__.py │ │ │ │ ├── test_mediawiki_family.py │ │ │ │ └── test_wiki.py │ │ │ ├── notion/ │ │ │ │ └── test_notion_datasource.py │ │ │ ├── salesforce/ │ │ │ │ ├── test_salesforce_custom_config.py │ │ │ │ ├── test_salesforce_sqlite.py │ │ │ │ └── test_yield_doc_batches.py │ │ │ ├── sharepoint/ │ │ │ │ ├── test_delta_checkpointing.py │ │ │ │ ├── test_denylist.py │ │ │ │ ├── test_drive_matching.py │ │ │ │ ├── test_fetch_site_pages.py │ │ │ │ ├── test_hierarchy_helpers.py │ │ │ │ ├── test_rest_client_context_caching.py │ │ │ │ └── test_url_parsing.py │ │ │ ├── slab/ │ │ │ │ └── test_slab_validation.py │ │ │ ├── slack/ │ │ │ │ └── test_message_filtering.py │ │ │ ├── teams/ │ │ │ │ └── test_collect_teams.py │ │ │ ├── test_connector_factory.py │ │ │ ├── test_document_metadata_coercion.py │ │ │ ├── test_microsoft_graph_env.py │ │ │ ├── utils.py │ │ │ └── zendesk/ │ │ │ ├── test_zendesk_checkpointing.py │ │ │ └── test_zendesk_rate_limit.py │ │ ├── context/ │ │ │ └── search/ │ │ │ └── federated/ │ │ │ ├── test_slack_query_construction.py │ │ │ └── test_slack_thread_context.py │ │ ├── db/ │ │ │ ├── __init__.py │ │ │ ├── conftest.py │ │ │ ├── test_assign_default_groups.py │ │ │ ├── test_chat_sessions.py │ │ │ ├── test_dal.py │ │ │ ├── test_delete_user.py │ │ │ ├── test_llm_sync.py │ │ │ ├── test_persona_display_priority.py │ │ │ ├── test_projects_upload_task_expiry.py │ │ │ ├── test_scim_dal.py │ │ │ ├── test_tools.py │ │ │ ├── test_usage.py │ │ │ └── test_voice.py │ │ ├── document_index/ │ │ │ ├── opensearch/ │ │ │ │ ├── test_get_doc_chunk_id.py │ │ │ │ └── test_opensearch_batch_flush.py │ │ │ ├── test_disabled_document_index.py │ │ │ └── vespa/ │ │ │ ├── shared_utils/ │ │ │ │ └── test_utils.py │ │ │ └── test_vespa_batch_flush.py │ │ ├── error_handling/ │ │ │ ├── __init__.py │ │ │ └── test_exceptions.py │ │ ├── federated_connectors/ │ │ │ ├── test_federated_connector_factory.py │ │ │ └── test_oauth_utils.py │ │ ├── file_processing/ │ │ │ ├── __init__.py │ │ │ ├── test_image_summarization_errors.py │ │ │ ├── test_image_summarization_litellm_errors.py │ │ │ ├── test_pdf.py │ │ │ └── test_xlsx_to_text.py │ │ ├── hooks/ │ │ │ ├── __init__.py │ │ │ ├── test_api_dependencies.py │ │ │ ├── test_base_spec.py │ │ │ ├── test_models.py │ │ │ ├── test_query_processing_spec.py │ │ │ └── test_registry.py │ │ ├── image_gen/ │ │ │ └── test_provider_building.py │ │ ├── indexing/ │ │ │ ├── conftest.py │ │ │ ├── test_censoring.py │ │ │ ├── test_chunker.py │ │ │ ├── test_embed_chunks_in_batches.py │ │ │ ├── test_embedder.py │ │ │ ├── test_indexing_pipeline.py │ │ │ ├── test_personas_in_chunks.py │ │ │ └── test_vespa.py │ │ ├── lazy_handling/ │ │ │ └── __init__.py │ │ ├── llm/ │ │ │ ├── conftest.py │ │ │ ├── test_bedrock_token_limit.py │ │ │ ├── test_factory.py │ │ │ ├── test_formatting_reenabled.py │ │ │ ├── test_litellm_monkey_patches.py │ │ │ ├── test_llm_provider_options.py │ │ │ ├── test_model_is_reasoning.py │ │ │ ├── test_model_map.py │ │ │ ├── test_model_name_parser.py │ │ │ ├── test_model_response.py │ │ │ ├── test_multi_llm.py │ │ │ ├── test_reasoning_effort_mapping.py │ │ │ ├── test_request_context.py │ │ │ ├── test_true_openai_model.py │ │ │ └── test_vision_model_selection_logging.py │ │ ├── natural_language_processing/ │ │ │ └── test_search_nlp_models.py │ │ ├── onyxbot/ │ │ │ ├── discord/ │ │ │ │ ├── conftest.py │ │ │ │ ├── test_api_client.py │ │ │ │ ├── test_cache_manager.py │ │ │ │ ├── test_context_builders.py │ │ │ │ ├── test_discord_utils.py │ │ │ │ ├── test_message_utils.py │ │ │ │ └── test_should_respond.py │ │ │ ├── test_handle_regular_answer.py │ │ │ ├── test_slack_blocks.py │ │ │ ├── test_slack_channel_config.py │ │ │ ├── test_slack_formatting.py │ │ │ └── test_slack_gating.py │ │ ├── prompts/ │ │ │ └── test_prompt_utils.py │ │ ├── redis_ca.pem │ │ ├── server/ │ │ │ ├── __init__.py │ │ │ ├── features/ │ │ │ │ ├── __init__.py │ │ │ │ ├── hierarchy/ │ │ │ │ │ └── test_user_access_info.py │ │ │ │ └── hooks/ │ │ │ │ └── __init__.py │ │ │ ├── manage/ │ │ │ │ ├── embedding/ │ │ │ │ │ └── test_embedding_api.py │ │ │ │ ├── llm/ │ │ │ │ │ ├── test_fetch_models_api.py │ │ │ │ │ └── test_llm_provider_utils.py │ │ │ │ ├── test_bulk_invite_limit.py │ │ │ │ └── voice/ │ │ │ │ └── test_voice_api_validation.py │ │ │ ├── scim/ │ │ │ │ ├── __init__.py │ │ │ │ ├── conftest.py │ │ │ │ ├── test_admin.py │ │ │ │ ├── test_auth.py │ │ │ │ ├── test_entra.py │ │ │ │ ├── test_filtering.py │ │ │ │ ├── test_group_endpoints.py │ │ │ │ ├── test_patch.py │ │ │ │ ├── test_providers.py │ │ │ │ └── test_user_endpoints.py │ │ │ ├── test_full_user_snapshot.py │ │ │ ├── test_pool_metrics.py │ │ │ ├── test_projects_file_utils.py │ │ │ ├── test_prometheus_instrumentation.py │ │ │ ├── test_settings_store.py │ │ │ └── test_upload_files.py │ │ ├── test_redis.py │ │ ├── test_startup_validation.py │ │ ├── tools/ │ │ │ ├── __init__.py │ │ │ ├── custom/ │ │ │ │ └── test_custom_tools.py │ │ │ ├── test_construct_tools_no_vectordb.py │ │ │ ├── test_file_reader_tool.py │ │ │ ├── test_no_vectordb.py │ │ │ ├── test_python_tool_availability.py │ │ │ ├── test_search_utils.py │ │ │ ├── test_tool_runner.py │ │ │ ├── test_tool_runner_chat_files.py │ │ │ ├── test_tool_utils.py │ │ │ └── tool_implementations/ │ │ │ ├── open_url/ │ │ │ │ ├── data/ │ │ │ │ │ └── test_snippet_finding_data.json │ │ │ │ ├── test_onyx_web_crawler.py │ │ │ │ ├── test_snippet_matcher.py │ │ │ │ └── test_url_normalization.py │ │ │ ├── python/ │ │ │ │ ├── __init__.py │ │ │ │ ├── test_code_interpreter_client.py │ │ │ │ └── test_python_tool_upload_cache.py │ │ │ └── websearch/ │ │ │ ├── data/ │ │ │ │ └── tartan.txt │ │ │ ├── test_brave_client.py │ │ │ ├── test_web_search_providers.py │ │ │ ├── test_web_search_tool_run.py │ │ │ └── test_websearch_utils.py │ │ ├── tracing/ │ │ │ ├── __init__.py │ │ │ └── test_tracing_setup.py │ │ ├── utils/ │ │ │ ├── test_gpu_utils.py │ │ │ ├── test_json_river.py │ │ │ ├── test_postgres_sanitization.py │ │ │ ├── test_sensitive.py │ │ │ ├── test_sensitive_typing.py │ │ │ ├── test_telemetry.py │ │ │ ├── test_threadpool_concurrency.py │ │ │ ├── test_threadpool_contextvars.py │ │ │ ├── test_url_ssrf.py │ │ │ ├── test_vespa_query.py │ │ │ └── test_vespa_tasks.py │ │ └── voice/ │ │ └── providers/ │ │ ├── test_azure_provider.py │ │ ├── test_azure_ssml.py │ │ ├── test_elevenlabs_provider.py │ │ └── test_openai_provider.py │ ├── scripts/ │ │ └── __init__.py │ ├── server/ │ │ └── metrics/ │ │ ├── test_celery_task_metrics.py │ │ ├── test_indexing_pipeline_collectors.py │ │ ├── test_indexing_pipeline_setup.py │ │ ├── test_indexing_task_metrics.py │ │ ├── test_metrics_server.py │ │ ├── test_opensearch_search_metrics.py │ │ └── test_worker_health.py │ └── tools/ │ ├── __init__.py │ └── test_memory_tool_packets.py ├── contributor_ip_assignment/ │ └── EE_Contributor_IP_Assignment_Agreement.md ├── ct.yaml ├── cubic.yaml ├── deployment/ │ ├── .gitignore │ ├── README.md │ ├── aws_ecs_fargate/ │ │ └── cloudformation/ │ │ ├── README.md │ │ ├── deploy.sh │ │ ├── onyx_acm_template.yaml │ │ ├── onyx_cluster_template.yaml │ │ ├── onyx_config.jsonl │ │ ├── onyx_efs_template.yaml │ │ ├── services/ │ │ │ ├── onyx_backend_api_server_service_template.yaml │ │ │ ├── onyx_backend_background_server_service_template.yaml │ │ │ ├── onyx_model_server_indexing_service_template.yaml │ │ │ ├── onyx_model_server_inference_service_template.yaml │ │ │ ├── onyx_nginx_service_template.yaml │ │ │ ├── onyx_postgres_service_template.yaml │ │ │ ├── onyx_redis_service_template.yaml │ │ │ ├── onyx_vespaengine_service_template.yaml │ │ │ └── onyx_web_server_service_template.yaml │ │ └── uninstall.sh │ ├── data/ │ │ └── nginx/ │ │ ├── app.conf.template │ │ ├── app.conf.template.no-letsencrypt │ │ ├── app.conf.template.prod │ │ ├── mcp.conf.inc.template │ │ ├── mcp_upstream.conf.inc.template │ │ └── run-nginx.sh │ ├── docker_compose/ │ │ ├── README.md │ │ ├── docker-compose.dev.yml │ │ ├── docker-compose.mcp-api-key-test.yml │ │ ├── docker-compose.mcp-oauth-test.yml │ │ ├── docker-compose.multitenant-dev.yml │ │ ├── docker-compose.onyx-lite.yml │ │ ├── docker-compose.prod-cloud.yml │ │ ├── docker-compose.prod-no-letsencrypt.yml │ │ ├── docker-compose.prod.yml │ │ ├── docker-compose.resources.yml │ │ ├── docker-compose.search-testing.yml │ │ ├── docker-compose.yml │ │ ├── env.nginx.template │ │ ├── env.prod.template │ │ ├── env.template │ │ ├── init-letsencrypt.sh │ │ ├── install.ps1 │ │ └── install.sh │ ├── helm/ │ │ ├── README.md │ │ └── charts/ │ │ └── onyx/ │ │ ├── .gitignore │ │ ├── .helmignore │ │ ├── Chart.yaml │ │ ├── ci/ │ │ │ └── ct-values.yaml │ │ ├── dashboards/ │ │ │ └── indexing-pipeline.json │ │ ├── templates/ │ │ │ ├── _helpers.tpl │ │ │ ├── api-deployment.yaml │ │ │ ├── api-hpa.yaml │ │ │ ├── api-scaledobject.yaml │ │ │ ├── api-service.yaml │ │ │ ├── auth-secrets.yaml │ │ │ ├── celery-beat.yaml │ │ │ ├── celery-worker-docfetching-hpa.yaml │ │ │ ├── celery-worker-docfetching-metrics-service.yaml │ │ │ ├── celery-worker-docfetching-scaledobject.yaml │ │ │ ├── celery-worker-docfetching.yaml │ │ │ ├── celery-worker-docprocessing-hpa.yaml │ │ │ ├── celery-worker-docprocessing-metrics-service.yaml │ │ │ ├── celery-worker-docprocessing-scaledobject.yaml │ │ │ ├── celery-worker-docprocessing.yaml │ │ │ ├── celery-worker-heavy-hpa.yaml │ │ │ ├── celery-worker-heavy-scaledobject.yaml │ │ │ ├── celery-worker-heavy.yaml │ │ │ ├── celery-worker-light-hpa.yaml │ │ │ ├── celery-worker-light-scaledobject.yaml │ │ │ ├── celery-worker-light.yaml │ │ │ ├── celery-worker-monitoring-hpa.yaml │ │ │ ├── celery-worker-monitoring-metrics-service.yaml │ │ │ ├── celery-worker-monitoring-scaledobject.yaml │ │ │ ├── celery-worker-monitoring.yaml │ │ │ ├── celery-worker-primary-hpa.yaml │ │ │ ├── celery-worker-primary-scaledobject.yaml │ │ │ ├── celery-worker-primary.yaml │ │ │ ├── celery-worker-servicemonitors.yaml │ │ │ ├── celery-worker-user-file-processing-hpa.yaml │ │ │ ├── celery-worker-user-file-processing-scaledobject.yaml │ │ │ ├── celery-worker-user-file-processing.yaml │ │ │ ├── configmap.yaml │ │ │ ├── discordbot.yaml │ │ │ ├── grafana-dashboards.yaml │ │ │ ├── indexing-model-deployment.yaml │ │ │ ├── indexing-model-service.yaml │ │ │ ├── inference-model-deployment.yaml │ │ │ ├── inference-model-service.yaml │ │ │ ├── ingress-api.yaml │ │ │ ├── ingress-mcp.yaml │ │ │ ├── ingress-webserver.yaml │ │ │ ├── lets-encrypt.yaml │ │ │ ├── mcp-server-deployment.yaml │ │ │ ├── mcp-server-service.yaml │ │ │ ├── nginx-conf.yaml │ │ │ ├── serviceaccount.yaml │ │ │ ├── slackbot.yaml │ │ │ ├── tests/ │ │ │ │ └── test-connection.yaml │ │ │ ├── tooling-pginto-configmap.yaml │ │ │ ├── webserver-deployment.yaml │ │ │ ├── webserver-hpa.yaml │ │ │ ├── webserver-scaledobject.yaml │ │ │ └── webserver-service.yaml │ │ ├── templates_disabled/ │ │ │ ├── background-deployment.yaml │ │ │ ├── background-hpa.yaml │ │ │ └── onyx-secret.yaml │ │ ├── values-lite.yaml │ │ └── values.yaml │ └── terraform/ │ └── modules/ │ └── aws/ │ ├── README.md │ ├── eks/ │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── variables.tf │ ├── onyx/ │ │ ├── main.tf │ │ ├── outputs.tf │ │ ├── variables.tf │ │ └── versions.tf │ ├── opensearch/ │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── variables.tf │ ├── postgres/ │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── variables.tf │ ├── redis/ │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── variables.tf │ ├── s3/ │ │ ├── main.tf │ │ └── variables.tf │ ├── vpc/ │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── variables.tf │ └── waf/ │ ├── main.tf │ ├── outputs.tf │ └── variables.tf ├── desktop/ │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── scripts/ │ │ └── generate-icons.sh │ ├── src/ │ │ ├── index.html │ │ └── titlebar.js │ └── src-tauri/ │ ├── Cargo.toml │ ├── build.rs │ ├── gen/ │ │ └── schemas/ │ │ ├── acl-manifests.json │ │ ├── capabilities.json │ │ ├── desktop-schema.json │ │ └── macOS-schema.json │ ├── icons/ │ │ ├── android/ │ │ │ ├── mipmap-anydpi-v26/ │ │ │ │ └── ic_launcher.xml │ │ │ └── values/ │ │ │ └── ic_launcher_background.xml │ │ └── icon.icns │ ├── src/ │ │ └── main.rs │ └── tauri.conf.json ├── docker-bake.hcl ├── docs/ │ └── METRICS.md ├── examples/ │ ├── assistants-api/ │ │ └── topics_analyzer.py │ └── widget/ │ ├── .eslintrc.json │ ├── .gitignore │ ├── README.md │ ├── next.config.mjs │ ├── package.json │ ├── postcss.config.mjs │ ├── src/ │ │ └── app/ │ │ ├── globals.css │ │ ├── layout.tsx │ │ ├── page.tsx │ │ └── widget/ │ │ └── Widget.tsx │ ├── tailwind.config.ts │ └── tsconfig.json ├── extensions/ │ └── chrome/ │ ├── LICENSE │ ├── README.md │ ├── manifest.json │ ├── service_worker.js │ └── src/ │ ├── pages/ │ │ ├── onyx_home.html │ │ ├── onyx_home.js │ │ ├── options.html │ │ ├── options.js │ │ ├── panel.html │ │ ├── panel.js │ │ ├── popup.html │ │ ├── popup.js │ │ ├── welcome.html │ │ └── welcome.js │ ├── styles/ │ │ ├── selection-icon.css │ │ └── shared.css │ └── utils/ │ ├── constants.js │ ├── content.js │ ├── error-modal.js │ ├── selection-icon.js │ └── storage.js ├── profiling/ │ └── grafana/ │ └── dashboards/ │ └── onyx/ │ └── opensearch-search-latency.json ├── pyproject.toml ├── web/ │ ├── .dockerignore │ ├── .eslintrc.json │ ├── .gitignore │ ├── .prettierignore │ ├── .prettierrc.json │ ├── .storybook/ │ │ ├── Introduction.mdx │ │ ├── README.md │ │ ├── main.ts │ │ ├── mocks/ │ │ │ ├── next-image.tsx │ │ │ ├── next-link.tsx │ │ │ └── next-navigation.tsx │ │ ├── preview-head.html │ │ └── preview.ts │ ├── @types/ │ │ ├── favicon-fetch.d.ts │ │ └── images.d.ts │ ├── AGENTS.md │ ├── Dockerfile │ ├── README.md │ ├── components.json │ ├── jest.config.js │ ├── lib/ │ │ └── opal/ │ │ ├── README.md │ │ ├── package.json │ │ ├── scripts/ │ │ │ ├── README.md │ │ │ ├── convert-svg.sh │ │ │ └── icon-template.js │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ ├── README.md │ │ │ │ ├── buttons/ │ │ │ │ │ ├── Button/ │ │ │ │ │ │ └── Button.stories.tsx │ │ │ │ │ ├── button/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ └── components.tsx │ │ │ │ │ ├── chevron.css │ │ │ │ │ ├── chevron.tsx │ │ │ │ │ ├── filter-button/ │ │ │ │ │ │ ├── FilterButton.stories.tsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ └── components.tsx │ │ │ │ │ ├── icon-wrapper.tsx │ │ │ │ │ ├── line-item-button/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ └── components.tsx │ │ │ │ │ ├── open-button/ │ │ │ │ │ │ ├── OpenButton.stories.tsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ └── components.tsx │ │ │ │ │ ├── select-button/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── components.tsx │ │ │ │ │ │ └── styles.css │ │ │ │ │ └── sidebar-tab/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── SidebarTab.stories.tsx │ │ │ │ │ └── components.tsx │ │ │ │ ├── cards/ │ │ │ │ │ ├── card/ │ │ │ │ │ │ ├── Card.stories.tsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── components.tsx │ │ │ │ │ │ └── styles.css │ │ │ │ │ ├── empty-message-card/ │ │ │ │ │ │ ├── EmptyMessageCard.stories.tsx │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ └── components.tsx │ │ │ │ │ └── select-card/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── SelectCard.stories.tsx │ │ │ │ │ ├── components.tsx │ │ │ │ │ └── styles.css │ │ │ │ ├── index.ts │ │ │ │ ├── pagination/ │ │ │ │ │ ├── Pagination.stories.tsx │ │ │ │ │ ├── README.md │ │ │ │ │ └── components.tsx │ │ │ │ ├── table/ │ │ │ │ │ ├── ActionsContainer.tsx │ │ │ │ │ ├── ColumnSortabilityPopover.tsx │ │ │ │ │ ├── ColumnVisibilityPopover.tsx │ │ │ │ │ ├── DragOverlayRow.tsx │ │ │ │ │ ├── Footer.tsx │ │ │ │ │ ├── QualifierContainer.tsx │ │ │ │ │ ├── README.md │ │ │ │ │ ├── Table.stories.tsx │ │ │ │ │ ├── TableBody.tsx │ │ │ │ │ ├── TableCell.tsx │ │ │ │ │ ├── TableElement.tsx │ │ │ │ │ ├── TableHead.tsx │ │ │ │ │ ├── TableHeader.tsx │ │ │ │ │ ├── TableQualifier.tsx │ │ │ │ │ ├── TableRow.tsx │ │ │ │ │ ├── TableSizeContext.tsx │ │ │ │ │ ├── columns.ts │ │ │ │ │ ├── components.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useColumnWidths.ts │ │ │ │ │ │ ├── useDataTable.ts │ │ │ │ │ │ └── useDraggableRows.ts │ │ │ │ │ ├── styles.css │ │ │ │ │ └── types.ts │ │ │ │ ├── tag/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── Tag.stories.tsx │ │ │ │ │ ├── components.tsx │ │ │ │ │ └── styles.css │ │ │ │ ├── text/ │ │ │ │ │ ├── InlineMarkdown.tsx │ │ │ │ │ ├── README.md │ │ │ │ │ ├── Text.stories.tsx │ │ │ │ │ └── components.tsx │ │ │ │ └── tooltip.css │ │ │ ├── core/ │ │ │ │ ├── README.md │ │ │ │ ├── animations/ │ │ │ │ │ ├── Hoverable.stories.tsx │ │ │ │ │ ├── README.md │ │ │ │ │ ├── components.tsx │ │ │ │ │ └── styles.css │ │ │ │ ├── disabled/ │ │ │ │ │ ├── components.tsx │ │ │ │ │ └── styles.css │ │ │ │ ├── index.ts │ │ │ │ └── interactive/ │ │ │ │ ├── Interactive.stories.tsx │ │ │ │ ├── README.md │ │ │ │ ├── container/ │ │ │ │ │ ├── README.md │ │ │ │ │ └── components.tsx │ │ │ │ ├── foldable/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── components.tsx │ │ │ │ │ └── styles.css │ │ │ │ ├── shared.css │ │ │ │ ├── simple/ │ │ │ │ │ └── components.tsx │ │ │ │ ├── stateful/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── components.tsx │ │ │ │ │ └── styles.css │ │ │ │ ├── stateless/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── components.tsx │ │ │ │ │ └── styles.css │ │ │ │ └── utils.ts │ │ │ ├── icons/ │ │ │ │ ├── DiscordMono.tsx │ │ │ │ ├── actions.tsx │ │ │ │ ├── activity-small.tsx │ │ │ │ ├── activity.tsx │ │ │ │ ├── add-lines.tsx │ │ │ │ ├── alert-circle.tsx │ │ │ │ ├── alert-triangle.tsx │ │ │ │ ├── arrow-down-dot.tsx │ │ │ │ ├── arrow-exchange.tsx │ │ │ │ ├── arrow-left-dot.tsx │ │ │ │ ├── arrow-left.tsx │ │ │ │ ├── arrow-right-circle.tsx │ │ │ │ ├── arrow-right-dot.tsx │ │ │ │ ├── arrow-right.tsx │ │ │ │ ├── arrow-up-circle.tsx │ │ │ │ ├── arrow-up-dot.tsx │ │ │ │ ├── arrow-up-down.tsx │ │ │ │ ├── arrow-up-right.tsx │ │ │ │ ├── arrow-up.tsx │ │ │ │ ├── arrow-wall-right.tsx │ │ │ │ ├── audio-eq-small.tsx │ │ │ │ ├── audio.tsx │ │ │ │ ├── aws.tsx │ │ │ │ ├── azure.tsx │ │ │ │ ├── bar-chart-small.tsx │ │ │ │ ├── bar-chart.tsx │ │ │ │ ├── bell.tsx │ │ │ │ ├── bifrost.tsx │ │ │ │ ├── blocks.tsx │ │ │ │ ├── book-open.tsx │ │ │ │ ├── bookmark.tsx │ │ │ │ ├── books-line-small.tsx │ │ │ │ ├── books-stack-small.tsx │ │ │ │ ├── bracket-curly.tsx │ │ │ │ ├── branch.tsx │ │ │ │ ├── bubble-text.tsx │ │ │ │ ├── calendar.tsx │ │ │ │ ├── check-circle.tsx │ │ │ │ ├── check-small.tsx │ │ │ │ ├── check-square.tsx │ │ │ │ ├── check.tsx │ │ │ │ ├── chevron-down-small.tsx │ │ │ │ ├── chevron-down.tsx │ │ │ │ ├── chevron-left.tsx │ │ │ │ ├── chevron-right.tsx │ │ │ │ ├── chevron-up-small.tsx │ │ │ │ ├── chevron-up.tsx │ │ │ │ ├── circle.tsx │ │ │ │ ├── claude.tsx │ │ │ │ ├── clipboard.tsx │ │ │ │ ├── clock-hands-small.tsx │ │ │ │ ├── clock.tsx │ │ │ │ ├── cloud.tsx │ │ │ │ ├── code.tsx │ │ │ │ ├── column.tsx │ │ │ │ ├── copy.tsx │ │ │ │ ├── corner-right-up-dot.tsx │ │ │ │ ├── cpu.tsx │ │ │ │ ├── credit-card.tsx │ │ │ │ ├── curate.tsx │ │ │ │ ├── dashboard.tsx │ │ │ │ ├── dev-kit.tsx │ │ │ │ ├── download-cloud.tsx │ │ │ │ ├── download.tsx │ │ │ │ ├── edit-big.tsx │ │ │ │ ├── edit.tsx │ │ │ │ ├── empty.tsx │ │ │ │ ├── expand.tsx │ │ │ │ ├── external-link.tsx │ │ │ │ ├── eye-closed.tsx │ │ │ │ ├── eye-off.tsx │ │ │ │ ├── eye.tsx │ │ │ │ ├── file-braces.tsx │ │ │ │ ├── file-broadcast.tsx │ │ │ │ ├── file-chart-pie.tsx │ │ │ │ ├── file-small.tsx │ │ │ │ ├── file-text.tsx │ │ │ │ ├── files.tsx │ │ │ │ ├── filter-plus.tsx │ │ │ │ ├── filter.tsx │ │ │ │ ├── fold.tsx │ │ │ │ ├── folder-in.tsx │ │ │ │ ├── folder-open.tsx │ │ │ │ ├── folder-partial-open.tsx │ │ │ │ ├── folder-plus.tsx │ │ │ │ ├── folder.tsx │ │ │ │ ├── gemini.tsx │ │ │ │ ├── globe.tsx │ │ │ │ ├── handle.tsx │ │ │ │ ├── hard-drive.tsx │ │ │ │ ├── hash-small.tsx │ │ │ │ ├── hash.tsx │ │ │ │ ├── headset-mic.tsx │ │ │ │ ├── history.tsx │ │ │ │ ├── hourglass.tsx │ │ │ │ ├── image-small.tsx │ │ │ │ ├── image.tsx │ │ │ │ ├── import-icon.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── info-small.tsx │ │ │ │ ├── info.tsx │ │ │ │ ├── key.tsx │ │ │ │ ├── keystroke.tsx │ │ │ │ ├── lightbulb-simple.tsx │ │ │ │ ├── line-chart-up.tsx │ │ │ │ ├── link.tsx │ │ │ │ ├── linked-dots.tsx │ │ │ │ ├── litellm.tsx │ │ │ │ ├── lm-studio.tsx │ │ │ │ ├── loader.tsx │ │ │ │ ├── lock.tsx │ │ │ │ ├── log-out.tsx │ │ │ │ ├── maximize-2.tsx │ │ │ │ ├── mcp.tsx │ │ │ │ ├── menu.tsx │ │ │ │ ├── microphone-off.tsx │ │ │ │ ├── microphone.tsx │ │ │ │ ├── minus-circle.tsx │ │ │ │ ├── minus.tsx │ │ │ │ ├── moon.tsx │ │ │ │ ├── more-horizontal.tsx │ │ │ │ ├── music-small.tsx │ │ │ │ ├── network-graph.tsx │ │ │ │ ├── notification-bubble.tsx │ │ │ │ ├── ollama.tsx │ │ │ │ ├── onyx-logo-typed.tsx │ │ │ │ ├── onyx-logo.tsx │ │ │ │ ├── onyx-octagon.tsx │ │ │ │ ├── onyx-typed.tsx │ │ │ │ ├── openai.tsx │ │ │ │ ├── openrouter.tsx │ │ │ │ ├── organization.tsx │ │ │ │ ├── paint-brush.tsx │ │ │ │ ├── paperclip.tsx │ │ │ │ ├── pause-circle.tsx │ │ │ │ ├── pen-small.tsx │ │ │ │ ├── pencil-ruler.tsx │ │ │ │ ├── pie-chart.tsx │ │ │ │ ├── pin.tsx │ │ │ │ ├── pinned.tsx │ │ │ │ ├── play-circle.tsx │ │ │ │ ├── plug.tsx │ │ │ │ ├── plus-circle.tsx │ │ │ │ ├── plus.tsx │ │ │ │ ├── progress-bars.tsx │ │ │ │ ├── progress-circle.tsx │ │ │ │ ├── question-mark-small.tsx │ │ │ │ ├── quote-end.tsx │ │ │ │ ├── quote-start.tsx │ │ │ │ ├── refresh-cw.tsx │ │ │ │ ├── revert.tsx │ │ │ │ ├── search-menu.tsx │ │ │ │ ├── search-small.tsx │ │ │ │ ├── search.tsx │ │ │ │ ├── server.tsx │ │ │ │ ├── settings.tsx │ │ │ │ ├── share-webhook.tsx │ │ │ │ ├── share.tsx │ │ │ │ ├── shield.tsx │ │ │ │ ├── sidebar.tsx │ │ │ │ ├── slack.tsx │ │ │ │ ├── slash.tsx │ │ │ │ ├── sliders-small.tsx │ │ │ │ ├── sliders.tsx │ │ │ │ ├── sort-order.tsx │ │ │ │ ├── sort.tsx │ │ │ │ ├── sparkle.tsx │ │ │ │ ├── star-off.tsx │ │ │ │ ├── star.tsx │ │ │ │ ├── step1.tsx │ │ │ │ ├── step2.tsx │ │ │ │ ├── step3-end.tsx │ │ │ │ ├── step3.tsx │ │ │ │ ├── stop-circle.tsx │ │ │ │ ├── stop.tsx │ │ │ │ ├── sun.tsx │ │ │ │ ├── tag.tsx │ │ │ │ ├── terminal-small.tsx │ │ │ │ ├── terminal.tsx │ │ │ │ ├── text-lines-small.tsx │ │ │ │ ├── text-lines.tsx │ │ │ │ ├── thumbs-down.tsx │ │ │ │ ├── thumbs-up.tsx │ │ │ │ ├── trash.tsx │ │ │ │ ├── two-line-small.tsx │ │ │ │ ├── unplug.tsx │ │ │ │ ├── upload-cloud.tsx │ │ │ │ ├── user-check.tsx │ │ │ │ ├── user-edit.tsx │ │ │ │ ├── user-key.tsx │ │ │ │ ├── user-manage.tsx │ │ │ │ ├── user-minus.tsx │ │ │ │ ├── user-plus.tsx │ │ │ │ ├── user-shield.tsx │ │ │ │ ├── user-speaker.tsx │ │ │ │ ├── user-sync.tsx │ │ │ │ ├── user-x.tsx │ │ │ │ ├── user.tsx │ │ │ │ ├── users.tsx │ │ │ │ ├── volume-off.tsx │ │ │ │ ├── volume.tsx │ │ │ │ ├── wallet.tsx │ │ │ │ ├── workflow.tsx │ │ │ │ ├── x-circle.tsx │ │ │ │ ├── x-octagon.tsx │ │ │ │ ├── x.tsx │ │ │ │ ├── zoom-in.tsx │ │ │ │ └── zoom-out.tsx │ │ │ ├── illustrations/ │ │ │ │ ├── broken-key.tsx │ │ │ │ ├── connect.tsx │ │ │ │ ├── connected.tsx │ │ │ │ ├── disconnected.tsx │ │ │ │ ├── empty.tsx │ │ │ │ ├── end-of-line.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── limit-alert.tsx │ │ │ │ ├── long-wait.tsx │ │ │ │ ├── no-access.tsx │ │ │ │ ├── no-result.tsx │ │ │ │ ├── not-found.tsx │ │ │ │ ├── overflow.tsx │ │ │ │ ├── plug-broken.tsx │ │ │ │ ├── timeout.tsx │ │ │ │ ├── un-plugged.tsx │ │ │ │ └── usage-alert.tsx │ │ │ ├── layouts/ │ │ │ │ ├── README.md │ │ │ │ ├── cards/ │ │ │ │ │ └── header-layout/ │ │ │ │ │ ├── CardHeaderLayout.stories.tsx │ │ │ │ │ ├── README.md │ │ │ │ │ └── components.tsx │ │ │ │ ├── content/ │ │ │ │ │ ├── Content.stories.tsx │ │ │ │ │ ├── ContentLg.tsx │ │ │ │ │ ├── ContentMd.tsx │ │ │ │ │ ├── ContentSm.tsx │ │ │ │ │ ├── ContentXl.tsx │ │ │ │ │ ├── README.md │ │ │ │ │ ├── components.tsx │ │ │ │ │ └── styles.css │ │ │ │ ├── content-action/ │ │ │ │ │ ├── ContentAction.stories.tsx │ │ │ │ │ ├── README.md │ │ │ │ │ └── components.tsx │ │ │ │ ├── illustration-content/ │ │ │ │ │ ├── IllustrationContent.stories.tsx │ │ │ │ │ ├── README.md │ │ │ │ │ └── components.tsx │ │ │ │ └── index.ts │ │ │ ├── shared.ts │ │ │ ├── types.ts │ │ │ └── utils.ts │ │ └── tsconfig.json │ ├── next.config.js │ ├── package.json │ ├── playwright.config.ts │ ├── postcss.config.js │ ├── public/ │ │ └── fonts/ │ │ └── KHTeka-Medium.otf │ ├── sentry.edge.config.ts │ ├── sentry.server.config.ts │ ├── src/ │ │ ├── app/ │ │ │ ├── PostHogPageView.tsx │ │ │ ├── admin/ │ │ │ │ ├── actions/ │ │ │ │ │ ├── edit/ │ │ │ │ │ │ └── [toolId]/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── edit-mcp/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── mcp/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── new/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── open-api/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── add-connector/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── agents/ │ │ │ │ │ ├── CollapsibleSection.tsx │ │ │ │ │ ├── interfaces.ts │ │ │ │ │ ├── lib.ts │ │ │ │ │ └── page.tsx │ │ │ │ ├── billing/ │ │ │ │ │ ├── BillingDetailsView.tsx │ │ │ │ │ ├── CheckoutView.tsx │ │ │ │ │ ├── LicenseActivationCard.tsx │ │ │ │ │ ├── PlansView.tsx │ │ │ │ │ ├── billing.css │ │ │ │ │ ├── page.test.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── bots/ │ │ │ │ │ ├── SlackBotCreationForm.tsx │ │ │ │ │ ├── SlackBotTable.tsx │ │ │ │ │ ├── SlackBotUpdateForm.tsx │ │ │ │ │ ├── SlackTokensForm.tsx │ │ │ │ │ ├── [bot-id]/ │ │ │ │ │ │ ├── SlackChannelConfigsTable.tsx │ │ │ │ │ │ ├── channels/ │ │ │ │ │ │ │ ├── SlackChannelConfigCreationForm.tsx │ │ │ │ │ │ │ ├── SlackChannelConfigFormFields.tsx │ │ │ │ │ │ │ ├── [id]/ │ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ │ └── new/ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── hooks.ts │ │ │ │ │ │ ├── lib.ts │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── new/ │ │ │ │ │ │ ├── lib.ts │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── configuration/ │ │ │ │ │ ├── chat-preferences/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── code-interpreter/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── document-processing/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── image-generation/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── llm/ │ │ │ │ │ │ ├── ModelConfigurationField.tsx │ │ │ │ │ │ ├── ProviderIcon.tsx │ │ │ │ │ │ ├── page.tsx │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── search/ │ │ │ │ │ │ ├── UpgradingPage.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── voice/ │ │ │ │ │ │ ├── VoiceProviderSetupModal.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── web-search/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── connector/ │ │ │ │ │ └── [ccPairId]/ │ │ │ │ │ ├── ConfigDisplay.tsx │ │ │ │ │ ├── DeletionErrorStatus.tsx │ │ │ │ │ ├── IndexAttemptErrorsModal.tsx │ │ │ │ │ ├── IndexAttemptsTable.tsx │ │ │ │ │ ├── InlineFileManagement.tsx │ │ │ │ │ ├── ReIndexModal.tsx │ │ │ │ │ ├── lib.ts │ │ │ │ │ ├── page.tsx │ │ │ │ │ ├── types.ts │ │ │ │ │ └── useStatusChange.tsx │ │ │ │ ├── connectors/ │ │ │ │ │ └── [connector]/ │ │ │ │ │ ├── AddConnectorPage.tsx │ │ │ │ │ ├── ConnectorWrapper.tsx │ │ │ │ │ ├── NavigationRow.tsx │ │ │ │ │ ├── auth/ │ │ │ │ │ │ └── callback/ │ │ │ │ │ │ └── route.ts │ │ │ │ │ ├── oauth/ │ │ │ │ │ │ ├── callback/ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ └── finalize/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── pages/ │ │ │ │ │ ├── Advanced.tsx │ │ │ │ │ ├── ConnectorInput/ │ │ │ │ │ │ ├── FileInput.tsx │ │ │ │ │ │ ├── ListInput.tsx │ │ │ │ │ │ ├── NumberInput.tsx │ │ │ │ │ │ └── SelectInput.tsx │ │ │ │ │ ├── DynamicConnectorCreationForm.tsx │ │ │ │ │ ├── FieldRendering.tsx │ │ │ │ │ ├── gdrive/ │ │ │ │ │ │ ├── Credential.tsx │ │ │ │ │ │ └── GoogleDrivePage.tsx │ │ │ │ │ ├── gmail/ │ │ │ │ │ │ ├── Credential.tsx │ │ │ │ │ │ └── GmailPage.tsx │ │ │ │ │ └── utils/ │ │ │ │ │ ├── files.ts │ │ │ │ │ ├── google_site.ts │ │ │ │ │ └── hooks.ts │ │ │ │ ├── debug/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── discord-bot/ │ │ │ │ │ ├── BotConfigCard.tsx │ │ │ │ │ ├── DiscordGuildsTable.tsx │ │ │ │ │ ├── [guild-id]/ │ │ │ │ │ │ ├── DiscordChannelsTable.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── hooks.ts │ │ │ │ │ ├── lib.ts │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── document-index-migration/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── documents/ │ │ │ │ │ ├── ScoreEditor.tsx │ │ │ │ │ ├── explorer/ │ │ │ │ │ │ ├── DocumentExplorerPage.tsx │ │ │ │ │ │ ├── Explorer.tsx │ │ │ │ │ │ ├── lib.ts │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── DocumentFeedbackTable.tsx │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── lib.ts │ │ │ │ │ └── sets/ │ │ │ │ │ ├── DocumentSetCreationForm.tsx │ │ │ │ │ ├── [documentSetId]/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── hooks.tsx │ │ │ │ │ ├── lib.ts │ │ │ │ │ ├── new/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── embeddings/ │ │ │ │ │ ├── EmbeddingModelSelectionForm.tsx │ │ │ │ │ ├── RerankingFormPage.tsx │ │ │ │ │ ├── interfaces.ts │ │ │ │ │ ├── modals/ │ │ │ │ │ │ ├── AlreadyPickedModal.tsx │ │ │ │ │ │ ├── ChangeCredentialsModal.tsx │ │ │ │ │ │ ├── DeleteCredentialsModal.tsx │ │ │ │ │ │ ├── InstantSwitchConfirmModal.tsx │ │ │ │ │ │ ├── ModelSelectionModal.tsx │ │ │ │ │ │ ├── ProviderCreationModal.tsx │ │ │ │ │ │ └── SelectModelModal.tsx │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── pages/ │ │ │ │ │ ├── AdvancedEmbeddingFormPage.tsx │ │ │ │ │ ├── CloudEmbeddingPage.tsx │ │ │ │ │ ├── EmbeddingFormPage.tsx │ │ │ │ │ ├── OpenEmbeddingPage.tsx │ │ │ │ │ └── utils.ts │ │ │ │ ├── federated/ │ │ │ │ │ └── [id]/ │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── useFederatedConnector.ts │ │ │ │ ├── groups/ │ │ │ │ │ ├── [id]/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── create/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── groups2/ │ │ │ │ │ ├── [id]/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── create/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── hooks/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── indexing/ │ │ │ │ │ └── status/ │ │ │ │ │ ├── CCPairIndexingStatusTable.tsx │ │ │ │ │ ├── ConnectorRowSkeleton.tsx │ │ │ │ │ ├── FilterComponent.tsx │ │ │ │ │ ├── SearchAndFilterControls.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── kg/ │ │ │ │ │ ├── KGEntityTypes.tsx │ │ │ │ │ ├── interfaces.ts │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── utils.ts │ │ │ │ ├── layout.tsx │ │ │ │ ├── scim/ │ │ │ │ │ ├── ScimModal.tsx │ │ │ │ │ ├── ScimSyncCard.tsx │ │ │ │ │ ├── interfaces.ts │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── svc.ts │ │ │ │ ├── service-accounts/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── systeminfo/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── token-rate-limits/ │ │ │ │ │ ├── CreateRateLimitModal.tsx │ │ │ │ │ ├── TokenRateLimitTables.tsx │ │ │ │ │ ├── lib.ts │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── types.ts │ │ │ │ └── users/ │ │ │ │ └── page.tsx │ │ │ ├── anonymous/ │ │ │ │ └── [id]/ │ │ │ │ ├── AnonymousPage.tsx │ │ │ │ └── page.tsx │ │ │ ├── api/ │ │ │ │ ├── [...path]/ │ │ │ │ │ └── route.ts │ │ │ │ └── chat/ │ │ │ │ └── mcp/ │ │ │ │ └── oauth/ │ │ │ │ └── callback/ │ │ │ │ └── route.ts │ │ │ ├── app/ │ │ │ │ ├── agents/ │ │ │ │ │ ├── create/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── edit/ │ │ │ │ │ │ └── [id]/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── components/ │ │ │ │ │ ├── AgentDescription.tsx │ │ │ │ │ ├── AppPopup.tsx │ │ │ │ │ ├── WelcomeMessage.tsx │ │ │ │ │ ├── files/ │ │ │ │ │ │ ├── InputBarPreview.tsx │ │ │ │ │ │ └── images/ │ │ │ │ │ │ ├── FullImageModal.tsx │ │ │ │ │ │ ├── InMessageImage.tsx │ │ │ │ │ │ ├── InputBarPreviewImage.tsx │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── folders/ │ │ │ │ │ │ ├── FolderDropdown.tsx │ │ │ │ │ │ └── interfaces.ts │ │ │ │ │ ├── modifiers/ │ │ │ │ │ │ └── SelectedDocuments.tsx │ │ │ │ │ ├── projects/ │ │ │ │ │ │ ├── ProjectChatSessionList.tsx │ │ │ │ │ │ ├── ProjectContextPanel.tsx │ │ │ │ │ │ └── project_utils.ts │ │ │ │ │ └── tools/ │ │ │ │ │ ├── GeneratingImageDisplay.tsx │ │ │ │ │ └── constants.ts │ │ │ │ ├── interfaces.ts │ │ │ │ ├── layout.tsx │ │ │ │ ├── message/ │ │ │ │ │ ├── BlinkingBar.tsx │ │ │ │ │ ├── CodeBlock.tsx │ │ │ │ │ ├── FileDisplay.tsx │ │ │ │ │ ├── HumanMessage.tsx │ │ │ │ │ ├── MemoizedTextComponents.tsx │ │ │ │ │ ├── MessageSwitcher.tsx │ │ │ │ │ ├── Resubmit.tsx │ │ │ │ │ ├── codeUtils.test.ts │ │ │ │ │ ├── codeUtils.ts │ │ │ │ │ ├── copyingUtils.tsx │ │ │ │ │ ├── custom-code-styles.css │ │ │ │ │ ├── errorHelpers.tsx │ │ │ │ │ ├── hooks.ts │ │ │ │ │ ├── messageComponents/ │ │ │ │ │ │ ├── AgentMessage.tsx │ │ │ │ │ │ ├── CustomToolAuthCard.tsx │ │ │ │ │ │ ├── MessageToolbar.tsx │ │ │ │ │ │ ├── TTSButton.tsx │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ ├── useAuthErrors.ts │ │ │ │ │ │ │ ├── useMessageSwitching.ts │ │ │ │ │ │ │ └── usePacketAnimationAndCollapse.ts │ │ │ │ │ │ ├── interfaces.ts │ │ │ │ │ │ ├── markdownUtils.tsx │ │ │ │ │ │ ├── renderMessageComponent.tsx │ │ │ │ │ │ ├── renderers/ │ │ │ │ │ │ │ ├── CustomToolRenderer.tsx │ │ │ │ │ │ │ ├── ImageToolRenderer.tsx │ │ │ │ │ │ │ └── MessageTextRenderer.tsx │ │ │ │ │ │ ├── timeline/ │ │ │ │ │ │ │ ├── AgentTimeline.tsx │ │ │ │ │ │ │ ├── CollapsedStreamingContent.tsx │ │ │ │ │ │ │ ├── ExpandedTimelineContent.tsx │ │ │ │ │ │ │ ├── ParallelTimelineTabs.tsx │ │ │ │ │ │ │ ├── StepContainer.tsx │ │ │ │ │ │ │ ├── TimelineRendererComponent.tsx │ │ │ │ │ │ │ ├── TimelineStepComposer.tsx │ │ │ │ │ │ │ ├── headers/ │ │ │ │ │ │ │ │ ├── CompletedHeader.tsx │ │ │ │ │ │ │ │ ├── ParallelStreamingHeader.tsx │ │ │ │ │ │ │ │ ├── StoppedHeader.tsx │ │ │ │ │ │ │ │ └── StreamingHeader.tsx │ │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ │ └── testHelpers.ts │ │ │ │ │ │ │ │ ├── packetProcessor.test.ts │ │ │ │ │ │ │ │ ├── packetProcessor.ts │ │ │ │ │ │ │ │ ├── usePacedTurnGroups.test.tsx │ │ │ │ │ │ │ │ ├── usePacedTurnGroups.ts │ │ │ │ │ │ │ │ ├── usePacketProcessor.test.tsx │ │ │ │ │ │ │ │ ├── usePacketProcessor.ts │ │ │ │ │ │ │ │ ├── useStreamingDuration.ts │ │ │ │ │ │ │ │ ├── useTimelineExpansion.ts │ │ │ │ │ │ │ │ ├── useTimelineHeader.ts │ │ │ │ │ │ │ │ ├── useTimelineMetrics.ts │ │ │ │ │ │ │ │ ├── useTimelineStepState.ts │ │ │ │ │ │ │ │ └── useTimelineUIState.ts │ │ │ │ │ │ │ ├── packetHelpers.ts │ │ │ │ │ │ │ ├── primitives/ │ │ │ │ │ │ │ │ ├── TimelineHeaderRow.tsx │ │ │ │ │ │ │ │ ├── TimelineIconColumn.tsx │ │ │ │ │ │ │ │ ├── TimelineRoot.tsx │ │ │ │ │ │ │ │ ├── TimelineRow.tsx │ │ │ │ │ │ │ │ ├── TimelineStepContent.tsx │ │ │ │ │ │ │ │ ├── TimelineSurface.tsx │ │ │ │ │ │ │ │ ├── TimelineTopSpacer.tsx │ │ │ │ │ │ │ │ └── tokens.ts │ │ │ │ │ │ │ ├── renderers/ │ │ │ │ │ │ │ │ ├── code/ │ │ │ │ │ │ │ │ │ └── PythonToolRenderer.tsx │ │ │ │ │ │ │ │ ├── deepresearch/ │ │ │ │ │ │ │ │ │ ├── DeepResearchPlanRenderer.tsx │ │ │ │ │ │ │ │ │ └── ResearchAgentRenderer.tsx │ │ │ │ │ │ │ │ ├── fetch/ │ │ │ │ │ │ │ │ │ ├── FetchToolRenderer.tsx │ │ │ │ │ │ │ │ │ └── fetchStateUtils.ts │ │ │ │ │ │ │ │ ├── filereader/ │ │ │ │ │ │ │ │ │ └── FileReaderToolRenderer.tsx │ │ │ │ │ │ │ │ ├── memory/ │ │ │ │ │ │ │ │ │ ├── MemoryToolRenderer.tsx │ │ │ │ │ │ │ │ │ └── memoryStateUtils.ts │ │ │ │ │ │ │ │ ├── reasoning/ │ │ │ │ │ │ │ │ │ └── ReasoningRenderer.tsx │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── InternalSearchToolRenderer.tsx │ │ │ │ │ │ │ │ │ ├── SearchChipList.tsx │ │ │ │ │ │ │ │ │ ├── WebSearchToolRenderer.tsx │ │ │ │ │ │ │ │ │ └── searchStateUtils.ts │ │ │ │ │ │ │ │ └── sharedMarkdownComponents.tsx │ │ │ │ │ │ │ └── transformers.ts │ │ │ │ │ │ ├── timing.ts │ │ │ │ │ │ └── toolDisplayHelpers.tsx │ │ │ │ │ └── thinkingBox/ │ │ │ │ │ └── ThinkingBox.css │ │ │ │ ├── page.tsx │ │ │ │ ├── projects/ │ │ │ │ │ └── projectsService.ts │ │ │ │ ├── services/ │ │ │ │ │ ├── actionUtils.ts │ │ │ │ │ ├── currentMessageFIFO.ts │ │ │ │ │ ├── fileUtils.ts │ │ │ │ │ ├── lib.tsx │ │ │ │ │ ├── messageTree.ts │ │ │ │ │ ├── packetUtils.test.ts │ │ │ │ │ ├── packetUtils.ts │ │ │ │ │ ├── searchParams.ts │ │ │ │ │ ├── streamingModels.ts │ │ │ │ │ └── thinkingTokens.ts │ │ │ │ ├── settings/ │ │ │ │ │ ├── accounts-access/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── chat-preferences/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── connectors/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── general/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── layout.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── shared/ │ │ │ │ │ └── [chatId]/ │ │ │ │ │ ├── SharedChatDisplay.tsx │ │ │ │ │ └── page.tsx │ │ │ │ └── stores/ │ │ │ │ └── useChatSessionStore.ts │ │ │ ├── auth/ │ │ │ │ ├── create-account/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── error/ │ │ │ │ │ ├── AuthErrorContent.tsx │ │ │ │ │ ├── layout.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── forgot-password/ │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── utils.ts │ │ │ │ ├── impersonate/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── join/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── lib.ts │ │ │ │ ├── libSS.ts │ │ │ │ ├── login/ │ │ │ │ │ ├── EmailPasswordForm.test.tsx │ │ │ │ │ ├── EmailPasswordForm.tsx │ │ │ │ │ ├── LoginPage.tsx │ │ │ │ │ ├── LoginText.tsx │ │ │ │ │ ├── SignInButton.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── logout/ │ │ │ │ │ └── route.ts │ │ │ │ ├── oauth/ │ │ │ │ │ └── callback/ │ │ │ │ │ └── route.ts │ │ │ │ ├── oidc/ │ │ │ │ │ └── callback/ │ │ │ │ │ └── route.ts │ │ │ │ ├── reset-password/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── saml/ │ │ │ │ │ └── callback/ │ │ │ │ │ └── route.ts │ │ │ │ ├── signup/ │ │ │ │ │ ├── ReferralSourceSelector.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── verify-email/ │ │ │ │ │ ├── Verify.tsx │ │ │ │ │ └── page.tsx │ │ │ │ └── waiting-on-verification/ │ │ │ │ ├── RequestNewVerificationEmail.tsx │ │ │ │ └── page.tsx │ │ │ ├── components/ │ │ │ │ └── nrf/ │ │ │ │ └── SettingsPanel.tsx │ │ │ ├── config/ │ │ │ │ └── timeRange.tsx │ │ │ ├── connector/ │ │ │ │ └── oauth/ │ │ │ │ └── callback/ │ │ │ │ └── [source]/ │ │ │ │ └── route.tsx │ │ │ ├── craft/ │ │ │ │ ├── README.md │ │ │ │ ├── components/ │ │ │ │ │ ├── BigButton.tsx │ │ │ │ │ ├── BuildLLMPopover.tsx │ │ │ │ │ ├── BuildMessageList.tsx │ │ │ │ │ ├── BuildWelcome.tsx │ │ │ │ │ ├── ChatPanel.tsx │ │ │ │ │ ├── ConnectDataBanner.tsx │ │ │ │ │ ├── ConnectorBannersRow.tsx │ │ │ │ │ ├── CraftingLoader.tsx │ │ │ │ │ ├── DiffView.tsx │ │ │ │ │ ├── FileBrowser.tsx │ │ │ │ │ ├── FilePreviewModal.tsx │ │ │ │ │ ├── InputBar.tsx │ │ │ │ │ ├── IntroBackground.tsx │ │ │ │ │ ├── IntroContent.tsx │ │ │ │ │ ├── OutputPanel.tsx │ │ │ │ │ ├── RawOutputBlock.tsx │ │ │ │ │ ├── SandboxStatusIndicator.tsx │ │ │ │ │ ├── ShareButton.tsx │ │ │ │ │ ├── SideBar.tsx │ │ │ │ │ ├── SuggestedPrompts.tsx │ │ │ │ │ ├── SuggestionBubbles.tsx │ │ │ │ │ ├── TextChunk.tsx │ │ │ │ │ ├── ThinkingCard.tsx │ │ │ │ │ ├── TodoListCard.tsx │ │ │ │ │ ├── ToggleWarningModal.tsx │ │ │ │ │ ├── ToolCallPill.tsx │ │ │ │ │ ├── TypewriterText.tsx │ │ │ │ │ ├── UpgradePlanModal.tsx │ │ │ │ │ ├── UserMessage.tsx │ │ │ │ │ ├── WorkingLine.tsx │ │ │ │ │ ├── WorkingPill.tsx │ │ │ │ │ └── output-panel/ │ │ │ │ │ ├── ArtifactsTab.tsx │ │ │ │ │ ├── FilePreviewContent.tsx │ │ │ │ │ ├── FilesTab.tsx │ │ │ │ │ ├── ImagePreview.tsx │ │ │ │ │ ├── MarkdownFilePreview.tsx │ │ │ │ │ ├── PdfPreview.tsx │ │ │ │ │ ├── PptxPreview.tsx │ │ │ │ │ ├── PreviewTab.tsx │ │ │ │ │ └── UrlBar.tsx │ │ │ │ ├── constants/ │ │ │ │ │ └── exampleBuildPrompts.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── contexts/ │ │ │ │ │ ├── BuildContext.tsx │ │ │ │ │ └── UploadFilesContext.tsx │ │ │ │ ├── hooks/ │ │ │ │ │ ├── useBuildConnectors.ts │ │ │ │ │ ├── useBuildLlmSelection.ts │ │ │ │ │ ├── useBuildSessionController.ts │ │ │ │ │ ├── useBuildSessionStore.ts │ │ │ │ │ ├── useBuildStreaming.ts │ │ │ │ │ ├── usePreProvisionPolling.ts │ │ │ │ │ └── useUsageLimits.ts │ │ │ │ ├── layout.tsx │ │ │ │ ├── onboarding/ │ │ │ │ │ ├── BuildOnboardingProvider.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── BuildOnboardingModal.tsx │ │ │ │ │ │ ├── NoLlmProvidersModal.tsx │ │ │ │ │ │ ├── NotAllowedModal.tsx │ │ │ │ │ │ ├── OnboardingInfoPages.tsx │ │ │ │ │ │ ├── OnboardingLlmSetup.tsx │ │ │ │ │ │ └── OnboardingUserInfo.tsx │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ └── useOnboardingModal.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── page.tsx │ │ │ │ ├── services/ │ │ │ │ │ ├── apiServices.ts │ │ │ │ │ └── searchParams.ts │ │ │ │ ├── types/ │ │ │ │ │ ├── displayTypes.ts │ │ │ │ │ ├── streamingTypes.ts │ │ │ │ │ └── user-library.ts │ │ │ │ ├── utils/ │ │ │ │ │ ├── packetTypes.ts │ │ │ │ │ ├── parsePacket.ts │ │ │ │ │ ├── pathSanitizer.test.ts │ │ │ │ │ ├── pathSanitizer.ts │ │ │ │ │ └── streamItemHelpers.ts │ │ │ │ └── v1/ │ │ │ │ ├── configure/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── ComingSoonConnectors.tsx │ │ │ │ │ │ ├── ConfigureConnectorModal.tsx │ │ │ │ │ │ ├── ConfigureOverlays.tsx │ │ │ │ │ │ ├── ConnectorCard.tsx │ │ │ │ │ │ ├── ConnectorConfigStep.tsx │ │ │ │ │ │ ├── CreateCredentialInline.tsx │ │ │ │ │ │ ├── CredentialStep.tsx │ │ │ │ │ │ ├── DemoDataConfirmModal.tsx │ │ │ │ │ │ ├── RequestConnectorModal.tsx │ │ │ │ │ │ └── UserLibraryModal.tsx │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── utils/ │ │ │ │ │ └── createBuildConnector.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── layout.tsx │ │ │ │ └── page.tsx │ │ │ ├── css/ │ │ │ │ ├── attachment-button.css │ │ │ │ ├── button.css │ │ │ │ ├── card.css │ │ │ │ ├── code.css │ │ │ │ ├── color-swatch.css │ │ │ │ ├── colors.css │ │ │ │ ├── divider.css │ │ │ │ ├── general-layouts.css │ │ │ │ ├── inputs.css │ │ │ │ ├── knowledge-table.css │ │ │ │ ├── line-item.css │ │ │ │ ├── sizes.css │ │ │ │ ├── square-button.css │ │ │ │ ├── switch.css │ │ │ │ └── z-index.css │ │ │ ├── ee/ │ │ │ │ ├── EEFeatureRedirect.tsx │ │ │ │ ├── LICENSE │ │ │ │ ├── admin/ │ │ │ │ │ ├── billing/ │ │ │ │ │ │ ├── BillingAlerts.tsx │ │ │ │ │ │ ├── BillingInformationPage.tsx │ │ │ │ │ │ ├── InfoItem.tsx │ │ │ │ │ │ ├── SubscriptionSummary.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── groups/ │ │ │ │ │ │ ├── [id]/ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── create/ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── layout.tsx │ │ │ │ │ ├── performance/ │ │ │ │ │ │ ├── custom-analytics/ │ │ │ │ │ │ │ ├── CustomAnalyticsUpdateForm.tsx │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── lib.ts │ │ │ │ │ │ ├── query-history/ │ │ │ │ │ │ │ ├── FeedbackBadge.tsx │ │ │ │ │ │ │ ├── KickoffCSVExport.tsx │ │ │ │ │ │ │ ├── QueryHistoryTable.tsx │ │ │ │ │ │ │ ├── [id]/ │ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ │ ├── page.tsx │ │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ └── usage/ │ │ │ │ │ │ ├── FeedbackChart.tsx │ │ │ │ │ │ ├── OnyxBotChart.tsx │ │ │ │ │ │ ├── PersonaMessagesChart.tsx │ │ │ │ │ │ ├── QueryPerformanceChart.tsx │ │ │ │ │ │ ├── UsageReports.tsx │ │ │ │ │ │ ├── page.tsx │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── standard-answer/ │ │ │ │ │ │ ├── StandardAnswerCreationForm.tsx │ │ │ │ │ │ ├── [id]/ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── hooks.ts │ │ │ │ │ │ ├── lib.ts │ │ │ │ │ │ ├── new/ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── theme/ │ │ │ │ │ ├── AppearanceThemeSettings.tsx │ │ │ │ │ ├── Preview.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── agents/ │ │ │ │ │ └── stats/ │ │ │ │ │ └── [id]/ │ │ │ │ │ ├── AgentStats.tsx │ │ │ │ │ └── page.tsx │ │ │ │ └── layout.tsx │ │ │ ├── federated/ │ │ │ │ └── oauth/ │ │ │ │ └── callback/ │ │ │ │ └── page.tsx │ │ │ ├── global-error.tsx │ │ │ ├── globals.css │ │ │ ├── layout.tsx │ │ │ ├── mcp/ │ │ │ │ ├── [[...path]]/ │ │ │ │ │ └── route.ts │ │ │ │ └── oauth/ │ │ │ │ └── callback/ │ │ │ │ └── page.tsx │ │ │ ├── not-found.tsx │ │ │ ├── nrf/ │ │ │ │ ├── (main)/ │ │ │ │ │ ├── layout.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── NRFChrome.tsx │ │ │ │ ├── NRFPage.tsx │ │ │ │ ├── layout.tsx │ │ │ │ └── side-panel/ │ │ │ │ ├── SidePanelHeader.tsx │ │ │ │ └── page.tsx │ │ │ ├── oauth-config/ │ │ │ │ └── callback/ │ │ │ │ └── page.tsx │ │ │ ├── page.tsx │ │ │ ├── providers.tsx │ │ │ └── web-vitals.tsx │ │ ├── ce.tsx │ │ ├── components/ │ │ │ ├── AdvancedOptionsToggle.tsx │ │ │ ├── AgentsMultiSelect.tsx │ │ │ ├── BasicClickable.tsx │ │ │ ├── Bubble.tsx │ │ │ ├── CollapsibleCard.tsx │ │ │ ├── ConnectorMultiSelect.tsx │ │ │ ├── DeleteButton.tsx │ │ │ ├── Dropdown.tsx │ │ │ ├── EditableStringFieldDisplay.tsx │ │ │ ├── EditableValue.tsx │ │ │ ├── ErrorCallout.tsx │ │ │ ├── FederatedConnectorSelector.tsx │ │ │ ├── Field.tsx │ │ │ ├── FormErrorHelpers.tsx │ │ │ ├── GatedContentWrapper.tsx │ │ │ ├── GenericMultiSelect.tsx │ │ │ ├── GroupsMultiSelect.tsx │ │ │ ├── HoverPopup.tsx │ │ │ ├── IsPublicGroupSelector.tsx │ │ │ ├── Loading.tsx │ │ │ ├── MetadataBadge.tsx │ │ │ ├── MultiSelectDropdown.tsx │ │ │ ├── NonSelectableConnectors.tsx │ │ │ ├── OnyxInitializingLoader.tsx │ │ │ ├── PageSelector.tsx │ │ │ ├── RichTextSubtext.tsx │ │ │ ├── SSRAutoRefresh.tsx │ │ │ ├── SearchResultIcon.tsx │ │ │ ├── SourceIcon.tsx │ │ │ ├── SourceTile.tsx │ │ │ ├── Spinner.tsx │ │ │ ├── Status.tsx │ │ │ ├── WebResultIcon.tsx │ │ │ ├── admin/ │ │ │ │ ├── CardSection.tsx │ │ │ │ ├── ClientLayout.tsx │ │ │ │ ├── Layout.tsx │ │ │ │ ├── Title.tsx │ │ │ │ ├── connectors/ │ │ │ │ │ ├── AccessTypeForm.tsx │ │ │ │ │ ├── AccessTypeGroupSelector.tsx │ │ │ │ │ ├── AutoSyncOptions.tsx │ │ │ │ │ ├── BasicTable.tsx │ │ │ │ │ ├── ConnectorDocsLink.tsx │ │ │ │ │ ├── ConnectorTitle.tsx │ │ │ │ │ ├── CredentialForm.tsx │ │ │ │ │ ├── FileUpload.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── federated/ │ │ │ │ │ └── FederatedConnectorForm.tsx │ │ │ │ └── users/ │ │ │ │ ├── BulkAdd.tsx │ │ │ │ ├── CenteredPageSelector.tsx │ │ │ │ ├── InvitedUserTable.tsx │ │ │ │ ├── PendingUsersTable.tsx │ │ │ │ ├── ResetPasswordModal.tsx │ │ │ │ ├── SignedUpUserTable.tsx │ │ │ │ └── buttons/ │ │ │ │ ├── DeactivateUserButton.tsx │ │ │ │ ├── DeleteUserButton.tsx │ │ │ │ ├── InviteUserButton.tsx │ │ │ │ ├── LeaveOrganizationButton.tsx │ │ │ │ └── UserRoleDropdown.tsx │ │ │ ├── auth/ │ │ │ │ ├── AuthErrorDisplay.tsx │ │ │ │ └── AuthFlowContainer.tsx │ │ │ ├── chat/ │ │ │ │ ├── DynamicBottomSpacer.tsx │ │ │ │ ├── FederatedOAuthModal.tsx │ │ │ │ ├── MCPApiKeyModal.tsx │ │ │ │ ├── MinimalMarkdown.test.tsx │ │ │ │ ├── MinimalMarkdown.tsx │ │ │ │ ├── ProviderContext.tsx │ │ │ │ └── ScrollContainerContext.tsx │ │ │ ├── context/ │ │ │ │ ├── EmbeddingContext.tsx │ │ │ │ ├── FormContext.tsx │ │ │ │ ├── ModalContext.tsx │ │ │ │ └── NRFPreferencesContext.tsx │ │ │ ├── credentials/ │ │ │ │ ├── CredentialFields.tsx │ │ │ │ ├── CredentialSection.tsx │ │ │ │ ├── actions/ │ │ │ │ │ ├── CreateCredential.tsx │ │ │ │ │ ├── CreateStdOAuthCredential.tsx │ │ │ │ │ ├── CredentialFieldsRenderer.tsx │ │ │ │ │ ├── EditCredential.tsx │ │ │ │ │ └── ModifyCredential.tsx │ │ │ │ ├── lib.ts │ │ │ │ └── types.ts │ │ │ ├── dateRangeSelectors/ │ │ │ │ ├── AdminDateRangeSelector.tsx │ │ │ │ ├── SearchDateRangeSelector.tsx │ │ │ │ └── dateUtils.ts │ │ │ ├── dev/ │ │ │ │ ├── StatsOverlay.tsx │ │ │ │ └── StatsOverlayLoader.tsx │ │ │ ├── embedding/ │ │ │ │ ├── CustomEmbeddingModelForm.tsx │ │ │ │ ├── CustomModelForm.tsx │ │ │ │ ├── FailedReIndexAttempts.tsx │ │ │ │ ├── ModelSelector.tsx │ │ │ │ ├── ReindexingProgressTable.tsx │ │ │ │ └── interfaces.tsx │ │ │ ├── errorPages/ │ │ │ │ ├── AccessRestrictedPage.tsx │ │ │ │ ├── CloudErrorPage.tsx │ │ │ │ ├── ErrorPage.tsx │ │ │ │ └── ErrorPageLayout.tsx │ │ │ ├── filters/ │ │ │ │ ├── SourceSelector.tsx │ │ │ │ └── TimeRangeSelector.tsx │ │ │ ├── header/ │ │ │ │ ├── AnnouncementBanner.tsx │ │ │ │ └── HeaderTitle.tsx │ │ │ ├── icons/ │ │ │ │ ├── DynamicFaIcon.tsx │ │ │ │ ├── icons.test.tsx │ │ │ │ └── icons.tsx │ │ │ ├── llm/ │ │ │ │ └── LLMSelector.tsx │ │ │ ├── loading.css │ │ │ ├── modals/ │ │ │ │ ├── AddInstructionModal.tsx │ │ │ │ ├── ConfirmEntityModal.tsx │ │ │ │ ├── CreateProjectModal.tsx │ │ │ │ ├── EditPropertyModal.tsx │ │ │ │ ├── GenericConfirmModal.tsx │ │ │ │ ├── MoveCustomAgentChatModal.tsx │ │ │ │ ├── NewTeamModal.tsx │ │ │ │ ├── NoAgentModal.tsx │ │ │ │ ├── ProviderModal.tsx │ │ │ │ └── UserFilesModal.tsx │ │ │ ├── oauth/ │ │ │ │ └── OAuthCallbackPage.tsx │ │ │ ├── resizable/ │ │ │ │ └── constants.ts │ │ │ ├── search/ │ │ │ │ ├── DocumentDisplay.tsx │ │ │ │ ├── DocumentFeedbackBlock.tsx │ │ │ │ ├── DocumentUpdatedAtBadge.tsx │ │ │ │ ├── filtering/ │ │ │ │ │ └── FilterDropdown.tsx │ │ │ │ └── results/ │ │ │ │ ├── Citation.tsx │ │ │ │ └── ResponseSection.tsx │ │ │ ├── settings/ │ │ │ │ ├── lib.ts │ │ │ │ └── usePaidEnterpriseFeaturesEnabled.ts │ │ │ ├── sidebar/ │ │ │ │ ├── ChatSessionMorePopup.tsx │ │ │ │ └── types.ts │ │ │ ├── spinner.css │ │ │ ├── standardAnswers/ │ │ │ │ ├── StandardAnswerCategoryDropdown.tsx │ │ │ │ └── getStandardAnswerCategoriesIfEE.tsx │ │ │ ├── table/ │ │ │ │ ├── DragHandle.tsx │ │ │ │ ├── DraggableRow.tsx │ │ │ │ ├── DraggableTable.tsx │ │ │ │ └── interfaces.ts │ │ │ ├── theme/ │ │ │ │ └── ThemeProvider.tsx │ │ │ ├── tools/ │ │ │ │ ├── CSVContent.tsx │ │ │ │ ├── ExpandableContentWrapper.tsx │ │ │ │ └── parseCSV.test.ts │ │ │ ├── tooltip/ │ │ │ │ └── CustomTooltip.tsx │ │ │ ├── ui/ │ │ │ │ ├── RadioGroupItemField.tsx │ │ │ │ ├── accordion.tsx │ │ │ │ ├── alert.tsx │ │ │ │ ├── areaChart.tsx │ │ │ │ ├── badge.tsx │ │ │ │ ├── callout.tsx │ │ │ │ ├── card.tsx │ │ │ │ ├── dialog.tsx │ │ │ │ ├── dropdown-menu-with-tooltip.tsx │ │ │ │ ├── dropdown-menu.tsx │ │ │ │ ├── input.tsx │ │ │ │ ├── radio-group.tsx │ │ │ │ ├── scroll-area.tsx │ │ │ │ ├── select.tsx │ │ │ │ ├── slider.tsx │ │ │ │ ├── table.tsx │ │ │ │ ├── title.tsx │ │ │ │ └── tooltip.tsx │ │ │ └── voice/ │ │ │ └── Waveform.tsx │ │ ├── ee/ │ │ │ ├── LICENSE │ │ │ ├── hooks/ │ │ │ │ ├── useHookExecutionLogs.ts │ │ │ │ ├── useHookSpecs.ts │ │ │ │ └── useHooks.ts │ │ │ ├── lib/ │ │ │ │ └── search/ │ │ │ │ └── svc.ts │ │ │ ├── providers/ │ │ │ │ └── QueryControllerProvider.tsx │ │ │ ├── refresh-pages/ │ │ │ │ └── admin/ │ │ │ │ └── HooksPage/ │ │ │ │ ├── HookFormModal.tsx │ │ │ │ ├── HookLogsModal.tsx │ │ │ │ ├── HookStatusPopover.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── interfaces.ts │ │ │ │ └── svc.ts │ │ │ └── sections/ │ │ │ ├── SearchCard.tsx │ │ │ └── SearchUI.tsx │ │ ├── hooks/ │ │ │ ├── __tests__/ │ │ │ │ └── useShowOnboarding.test.tsx │ │ │ ├── appNavigation.ts │ │ │ ├── formHooks.ts │ │ │ ├── useAdminPersonas.ts │ │ │ ├── useAdminUsers.ts │ │ │ ├── useAgentController.ts │ │ │ ├── useAgentPreferences.ts │ │ │ ├── useAgents.ts │ │ │ ├── useAppFocus.ts │ │ │ ├── useAuthTypeMetadata.ts │ │ │ ├── useAvailableTools.ts │ │ │ ├── useBillingInformation.ts │ │ │ ├── useBoundingBox.ts │ │ │ ├── useBrowserInfo.ts │ │ │ ├── useCCPairs.ts │ │ │ ├── useChatController.ts │ │ │ ├── useChatSessionController.ts │ │ │ ├── useChatSessions.ts │ │ │ ├── useClickOutside.ts │ │ │ ├── useCloudSubscription.ts │ │ │ ├── useCodeInterpreter.ts │ │ │ ├── useContainerCenter.ts │ │ │ ├── useContentSize.ts │ │ │ ├── useCurrentUser.ts │ │ │ ├── useDeepResearchToggle.ts │ │ │ ├── useFederatedOAuthStatus.ts │ │ │ ├── useFeedbackController.ts │ │ │ ├── useFilter.ts │ │ │ ├── useGroups.ts │ │ │ ├── useImageDropzone.ts │ │ │ ├── useIsDefaultAgent.ts │ │ │ ├── useKeyPress.ts │ │ │ ├── useLLMProviders.ts │ │ │ ├── useLicense.ts │ │ │ ├── useMcpServers.ts │ │ │ ├── useMcpServersForAgentEditor.ts │ │ │ ├── useMemoryManager.ts │ │ │ ├── useOnMount.ts │ │ │ ├── useOpenApiTools.ts │ │ │ ├── usePaginatedFetch.ts │ │ │ ├── usePromptShortcuts.ts │ │ │ ├── useScimToken.ts │ │ │ ├── useScreenSize.ts │ │ │ ├── useServerTools.ts │ │ │ ├── useSettings.test.ts │ │ │ ├── useSettings.ts │ │ │ ├── useShareableGroups.ts │ │ │ ├── useShareableUsers.ts │ │ │ ├── useShowOnboarding.ts │ │ │ ├── useTags.ts │ │ │ ├── useToast.ts │ │ │ ├── useTokenRefresh.ts │ │ │ ├── useUserCounts.ts │ │ │ ├── useUserPersonalization.ts │ │ │ ├── useUsers.ts │ │ │ ├── useVoicePlayback.ts │ │ │ ├── useVoiceProviders.ts │ │ │ ├── useVoiceRecorder.ts │ │ │ ├── useVoiceStatus.ts │ │ │ └── useWebSocket.ts │ │ ├── instrumentation-client.ts │ │ ├── instrumentation.ts │ │ ├── interfaces/ │ │ │ ├── llm.ts │ │ │ ├── onboarding.ts │ │ │ └── settings.ts │ │ ├── layouts/ │ │ │ ├── actions-layouts.tsx │ │ │ ├── app-layouts.tsx │ │ │ ├── expandable-card-layouts.tsx │ │ │ ├── general-layouts.tsx │ │ │ ├── input-layouts.tsx │ │ │ ├── settings-layouts.tsx │ │ │ └── table-layouts.tsx │ │ ├── lib/ │ │ │ ├── admin/ │ │ │ │ ├── users/ │ │ │ │ │ └── userMutationFetcher.ts │ │ │ │ └── voice/ │ │ │ │ └── svc.ts │ │ │ ├── admin-routes.ts │ │ │ ├── agents.ts │ │ │ ├── agentsSS.ts │ │ │ ├── analytics.ts │ │ │ ├── appSidebarSS.ts │ │ │ ├── auth/ │ │ │ │ ├── redirectValidation.ts │ │ │ │ └── requireAuth.ts │ │ │ ├── azureTargetUri.ts │ │ │ ├── billing/ │ │ │ │ ├── index.ts │ │ │ │ ├── interfaces.ts │ │ │ │ ├── svc.test.ts │ │ │ │ └── svc.ts │ │ │ ├── browserUtilities.tsx │ │ │ ├── build/ │ │ │ │ └── client.ts │ │ │ ├── ccPair.ts │ │ │ ├── chat/ │ │ │ │ ├── fetchAgentData.ts │ │ │ │ ├── fetchBackendChatSessionSS.ts │ │ │ │ ├── greetingMessages.ts │ │ │ │ └── svc.ts │ │ │ ├── clipboard.test.ts │ │ │ ├── clipboard.ts │ │ │ ├── connector.ts │ │ │ ├── connectors/ │ │ │ │ ├── AutoSyncOptionFields.tsx │ │ │ │ ├── connectors.tsx │ │ │ │ ├── credentials.ts │ │ │ │ ├── fileTypes.ts │ │ │ │ └── oauth.ts │ │ │ ├── constants/ │ │ │ │ └── chatBackgrounds.ts │ │ │ ├── constants.ts │ │ │ ├── contains.ts │ │ │ ├── credential.ts │ │ │ ├── dateUtils.ts │ │ │ ├── documentDeletion.ts │ │ │ ├── documentUtils.ts │ │ │ ├── download.ts │ │ │ ├── drag/ │ │ │ │ └── constants.ts │ │ │ ├── error.ts │ │ │ ├── extension/ │ │ │ │ ├── constants.ts │ │ │ │ └── utils.ts │ │ │ ├── fetchUtils.ts │ │ │ ├── fetcher.ts │ │ │ ├── fileConnector.ts │ │ │ ├── filters.ts │ │ │ ├── generated/ │ │ │ │ └── README.md │ │ │ ├── gmail.ts │ │ │ ├── googleConnector.ts │ │ │ ├── googleDrive.ts │ │ │ ├── headers/ │ │ │ │ └── fetchHeaderDataSS.ts │ │ │ ├── hierarchy/ │ │ │ │ ├── interfaces.ts │ │ │ │ └── svc.ts │ │ │ ├── hooks/ │ │ │ │ ├── useCaptcha.ts │ │ │ │ ├── useCustomAnalyticsEnabled.ts │ │ │ │ ├── useDocumentSets.ts │ │ │ │ ├── useForcedTools.ts │ │ │ │ ├── useLLMProviderOptions.ts │ │ │ │ ├── useLLMProviders.test.ts │ │ │ │ ├── useProjects.ts │ │ │ │ └── useToolOAuthStatus.ts │ │ │ ├── hooks.llmResolver.test.ts │ │ │ ├── hooks.ts │ │ │ ├── indexAttempt.ts │ │ │ ├── languages.test.ts │ │ │ ├── languages.ts │ │ │ ├── llmConfig/ │ │ │ │ ├── cache.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── providers.ts │ │ │ │ ├── svc.ts │ │ │ │ ├── utils.ts │ │ │ │ └── visionLLM.ts │ │ │ ├── oauth/ │ │ │ │ └── api.ts │ │ │ ├── oauth_utils.ts │ │ │ ├── redirectSS.ts │ │ │ ├── search/ │ │ │ │ ├── interfaces.ts │ │ │ │ ├── streamingUtils.ts │ │ │ │ ├── utils.ts │ │ │ │ └── utilsSS.ts │ │ │ ├── sources.ts │ │ │ ├── streamingTTS.ts │ │ │ ├── swr-keys.ts │ │ │ ├── time.ts │ │ │ ├── tools/ │ │ │ │ ├── fetchTools.ts │ │ │ │ ├── interfaces.ts │ │ │ │ ├── mcpService.ts │ │ │ │ ├── mcpUtils.tsx │ │ │ │ └── openApiService.ts │ │ │ ├── types.ts │ │ │ ├── typingUtils.ts │ │ │ ├── updateSlackBotField.ts │ │ │ ├── urlBuilder.ts │ │ │ ├── user.test.ts │ │ │ ├── user.ts │ │ │ ├── userSS.ts │ │ │ ├── userSettings.ts │ │ │ ├── utils.test.ts │ │ │ ├── utils.ts │ │ │ ├── utilsSS.ts │ │ │ └── version.ts │ │ ├── providers/ │ │ │ ├── AppBackgroundProvider.tsx │ │ │ ├── AppProvider.tsx │ │ │ ├── AppSidebarProvider.tsx │ │ │ ├── CustomAnalyticsScript.tsx │ │ │ ├── DynamicMetadata.tsx │ │ │ ├── ProductGatingWrapper.tsx │ │ │ ├── ProjectsContext.tsx │ │ │ ├── QueryControllerProvider.tsx │ │ │ ├── SWRConfigProvider.tsx │ │ │ ├── SettingsProvider.tsx │ │ │ ├── ToastProvider.tsx │ │ │ ├── UserProvider.tsx │ │ │ ├── VoiceModeProvider.tsx │ │ │ └── __tests__/ │ │ │ └── ProjectsContext.test.tsx │ │ ├── proxy.ts │ │ ├── refresh-components/ │ │ │ ├── Attachment.stories.tsx │ │ │ ├── Attachment.tsx │ │ │ ├── Calendar.stories.tsx │ │ │ ├── Calendar.tsx │ │ │ ├── CharacterCount.stories.tsx │ │ │ ├── CharacterCount.tsx │ │ │ ├── Chip.stories.tsx │ │ │ ├── Chip.tsx │ │ │ ├── Code.stories.tsx │ │ │ ├── Code.tsx │ │ │ ├── Collapsible.stories.tsx │ │ │ ├── Collapsible.tsx │ │ │ ├── ColorSwatch.stories.tsx │ │ │ ├── ColorSwatch.tsx │ │ │ ├── ConnectionProviderIcon.stories.tsx │ │ │ ├── ConnectionProviderIcon.tsx │ │ │ ├── Divider.stories.tsx │ │ │ ├── Divider.tsx │ │ │ ├── EmptyMessage.stories.tsx │ │ │ ├── EmptyMessage.tsx │ │ │ ├── EnabledCount.stories.tsx │ │ │ ├── EnabledCount.tsx │ │ │ ├── FadingEdgeContainer.stories.tsx │ │ │ ├── FadingEdgeContainer.tsx │ │ │ ├── FrostedDiv.stories.tsx │ │ │ ├── FrostedDiv.tsx │ │ │ ├── InlineExternalLink.stories.tsx │ │ │ ├── InlineExternalLink.tsx │ │ │ ├── Logo.tsx │ │ │ ├── Modal.stories.tsx │ │ │ ├── Modal.tsx │ │ │ ├── OverflowDiv.stories.tsx │ │ │ ├── OverflowDiv.tsx │ │ │ ├── Popover.stories.tsx │ │ │ ├── Popover.tsx │ │ │ ├── PreviewImage.stories.tsx │ │ │ ├── PreviewImage.tsx │ │ │ ├── ScrollIndicatorDiv.stories.tsx │ │ │ ├── ScrollIndicatorDiv.tsx │ │ │ ├── Separator.stories.tsx │ │ │ ├── Separator.tsx │ │ │ ├── ShadowDiv.stories.tsx │ │ │ ├── ShadowDiv.tsx │ │ │ ├── SimpleCollapsible.stories.tsx │ │ │ ├── SimpleCollapsible.tsx │ │ │ ├── SimplePopover.stories.tsx │ │ │ ├── SimplePopover.tsx │ │ │ ├── SimpleTabs.stories.tsx │ │ │ ├── SimpleTabs.tsx │ │ │ ├── SimpleTooltip.stories.tsx │ │ │ ├── SimpleTooltip.tsx │ │ │ ├── Spacer.stories.tsx │ │ │ ├── Spacer.tsx │ │ │ ├── Tabs.stories.tsx │ │ │ ├── Tabs.tsx │ │ │ ├── TextSeparator.stories.tsx │ │ │ ├── TextSeparator.tsx │ │ │ ├── avatars/ │ │ │ │ ├── AgentAvatar.tsx │ │ │ │ ├── CustomAgentAvatar.stories.tsx │ │ │ │ ├── CustomAgentAvatar.tsx │ │ │ │ └── UserAvatar.tsx │ │ │ ├── buttons/ │ │ │ │ ├── AttachmentButton.stories.tsx │ │ │ │ ├── AttachmentButton.tsx │ │ │ │ ├── BackButton.stories.tsx │ │ │ │ ├── BackButton.tsx │ │ │ │ ├── Button.stories.tsx │ │ │ │ ├── Button.tsx │ │ │ │ ├── ButtonRenaming.stories.tsx │ │ │ │ ├── ButtonRenaming.tsx │ │ │ │ ├── CopyIconButton.stories.tsx │ │ │ │ ├── CopyIconButton.tsx │ │ │ │ ├── CreateButton.stories.tsx │ │ │ │ ├── CreateButton.tsx │ │ │ │ ├── IconButton.stories.tsx │ │ │ │ ├── IconButton.tsx │ │ │ │ ├── LineItem.stories.tsx │ │ │ │ ├── LineItem.tsx │ │ │ │ ├── SelectButton.stories.tsx │ │ │ │ ├── SelectButton.tsx │ │ │ │ ├── SquareButton.stories.tsx │ │ │ │ ├── SquareButton.tsx │ │ │ │ ├── Tag.stories.tsx │ │ │ │ ├── Tag.tsx │ │ │ │ └── source-tag/ │ │ │ │ ├── SourceTag.tsx │ │ │ │ ├── SourceTagDetailsCard.tsx │ │ │ │ ├── index.ts │ │ │ │ └── sourceTagUtils.ts │ │ │ ├── cards/ │ │ │ │ ├── Card.stories.tsx │ │ │ │ ├── Card.tsx │ │ │ │ └── index.ts │ │ │ ├── commandmenu/ │ │ │ │ ├── CommandMenu.stories.tsx │ │ │ │ ├── CommandMenu.test.tsx │ │ │ │ ├── CommandMenu.tsx │ │ │ │ └── types.ts │ │ │ ├── contexts/ │ │ │ │ └── ModalContext.tsx │ │ │ ├── form/ │ │ │ │ ├── CheckboxField.tsx │ │ │ │ ├── FieldContext.tsx │ │ │ │ ├── FormField.stories.tsx │ │ │ │ ├── FormField.tsx │ │ │ │ ├── FormikField.tsx │ │ │ │ ├── FormikFields.stories.tsx │ │ │ │ ├── InputDatePickerField.tsx │ │ │ │ ├── InputSelectField.tsx │ │ │ │ ├── InputTextAreaField.tsx │ │ │ │ ├── InputTypeInElementField.tsx │ │ │ │ ├── InputTypeInField.tsx │ │ │ │ ├── Label.stories.tsx │ │ │ │ ├── Label.tsx │ │ │ │ ├── LabeledCheckboxField.tsx │ │ │ │ ├── PasswordInputTypeInField.tsx │ │ │ │ ├── SwitchField.tsx │ │ │ │ └── types.ts │ │ │ ├── inputs/ │ │ │ │ ├── Checkbox.stories.tsx │ │ │ │ ├── Checkbox.test.tsx │ │ │ │ ├── Checkbox.tsx │ │ │ │ ├── InputAvatar.stories.tsx │ │ │ │ ├── InputAvatar.tsx │ │ │ │ ├── InputChipField.stories.tsx │ │ │ │ ├── InputChipField.tsx │ │ │ │ ├── InputComboBox/ │ │ │ │ │ ├── InputComboBox.stories.tsx │ │ │ │ │ ├── InputComboBox.test.tsx │ │ │ │ │ ├── InputComboBox.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── ComboBoxDropdown.tsx │ │ │ │ │ │ ├── OptionItem.tsx │ │ │ │ │ │ └── OptionsList.tsx │ │ │ │ │ ├── hooks.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── aria.ts │ │ │ │ │ └── validation.ts │ │ │ │ ├── InputDatePicker.stories.tsx │ │ │ │ ├── InputDatePicker.tsx │ │ │ │ ├── InputFile.stories.tsx │ │ │ │ ├── InputFile.tsx │ │ │ │ ├── InputImage.stories.tsx │ │ │ │ ├── InputImage.tsx │ │ │ │ ├── InputKeyValue.stories.tsx │ │ │ │ ├── InputKeyValue.tsx │ │ │ │ ├── InputNumber.stories.tsx │ │ │ │ ├── InputNumber.tsx │ │ │ │ ├── InputSearch.stories.tsx │ │ │ │ ├── InputSearch.tsx │ │ │ │ ├── InputSelect.stories.tsx │ │ │ │ ├── InputSelect.tsx │ │ │ │ ├── InputTextArea.stories.tsx │ │ │ │ ├── InputTextArea.tsx │ │ │ │ ├── InputTypeIn.stories.tsx │ │ │ │ ├── InputTypeIn.tsx │ │ │ │ ├── ListFieldInput.stories.tsx │ │ │ │ ├── ListFieldInput.tsx │ │ │ │ ├── PasswordInputTypeIn.stories.tsx │ │ │ │ ├── PasswordInputTypeIn.test.ts │ │ │ │ ├── PasswordInputTypeIn.tsx │ │ │ │ ├── Switch.stories.tsx │ │ │ │ ├── Switch.tsx │ │ │ │ └── styles.ts │ │ │ ├── layouts/ │ │ │ │ ├── ConfirmationModalLayout.stories.tsx │ │ │ │ └── ConfirmationModalLayout.tsx │ │ │ ├── loaders/ │ │ │ │ ├── SimpleLoader.stories.tsx │ │ │ │ └── SimpleLoader.tsx │ │ │ ├── messages/ │ │ │ │ ├── FieldMessage.stories.tsx │ │ │ │ ├── FieldMessage.tsx │ │ │ │ ├── InfoBlock.stories.tsx │ │ │ │ ├── InfoBlock.tsx │ │ │ │ ├── Message.stories.tsx │ │ │ │ └── Message.tsx │ │ │ ├── modals/ │ │ │ │ └── MemoriesModal.tsx │ │ │ ├── popovers/ │ │ │ │ ├── ActionsPopover/ │ │ │ │ │ ├── ActionLineItem.tsx │ │ │ │ │ ├── MCPLineItem.tsx │ │ │ │ │ ├── SwitchList.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── FilePickerPopover.tsx │ │ │ │ ├── LLMPopover.test.tsx │ │ │ │ ├── LLMPopover.tsx │ │ │ │ └── interfaces.ts │ │ │ ├── skeletons/ │ │ │ │ ├── ChatSessionSkeleton.stories.tsx │ │ │ │ ├── ChatSessionSkeleton.tsx │ │ │ │ ├── SidebarTabSkeleton.stories.tsx │ │ │ │ └── SidebarTabSkeleton.tsx │ │ │ ├── texts/ │ │ │ │ ├── ExpandableTextDisplay.stories.tsx │ │ │ │ ├── ExpandableTextDisplay.tsx │ │ │ │ ├── Text.stories.tsx │ │ │ │ ├── Text.tsx │ │ │ │ ├── Truncated.stories.tsx │ │ │ │ └── Truncated.tsx │ │ │ └── tiles/ │ │ │ ├── ButtonTile.stories.tsx │ │ │ ├── ButtonTile.tsx │ │ │ ├── FileTile.stories.tsx │ │ │ └── FileTile.tsx │ │ ├── refresh-pages/ │ │ │ ├── AgentEditorPage.tsx │ │ │ ├── AgentsNavigationPage.tsx │ │ │ ├── AppPage.tsx │ │ │ ├── SettingsPage.tsx │ │ │ └── admin/ │ │ │ ├── AgentsPage/ │ │ │ │ ├── AgentRowActions.tsx │ │ │ │ ├── AgentsTable.tsx │ │ │ │ ├── interfaces.ts │ │ │ │ └── svc.ts │ │ │ ├── AgentsPage.tsx │ │ │ ├── ChatPreferencesPage.tsx │ │ │ ├── CodeInterpreterPage/ │ │ │ │ ├── index.tsx │ │ │ │ └── svc.ts │ │ │ ├── GroupsPage/ │ │ │ │ ├── CreateGroupPage.tsx │ │ │ │ ├── EditGroupPage.tsx │ │ │ │ ├── GroupCard.tsx │ │ │ │ ├── GroupsList.tsx │ │ │ │ ├── SharedGroupResources/ │ │ │ │ │ ├── ResourceContent.tsx │ │ │ │ │ ├── ResourcePopover.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── interfaces.ts │ │ │ │ ├── TokenLimitSection.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── interfaces.ts │ │ │ │ ├── shared.tsx │ │ │ │ ├── svc.ts │ │ │ │ └── utils.ts │ │ │ ├── ImageGenerationPage/ │ │ │ │ ├── ImageGenerationContent.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── forms/ │ │ │ │ │ ├── AzureImageGenForm.tsx │ │ │ │ │ ├── ImageGenFormWrapper.tsx │ │ │ │ │ ├── OpenAIImageGenForm.tsx │ │ │ │ │ ├── VertexImageGenForm.tsx │ │ │ │ │ ├── getImageGenForm.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── index.tsx │ │ │ │ └── svc.ts │ │ │ ├── LLMConfigurationPage.tsx │ │ │ ├── ServiceAccountsPage/ │ │ │ │ ├── ApiKeyFormModal.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── interfaces.ts │ │ │ │ └── svc.ts │ │ │ ├── UsersPage/ │ │ │ │ ├── EditUserModal.tsx │ │ │ │ ├── GroupsCell.tsx │ │ │ │ ├── InviteUsersModal.tsx │ │ │ │ ├── UserActionModals.tsx │ │ │ │ ├── UserFilters.tsx │ │ │ │ ├── UserRoleCell.tsx │ │ │ │ ├── UserRowActions.tsx │ │ │ │ ├── UsersSummary.tsx │ │ │ │ ├── UsersTable.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── interfaces.ts │ │ │ │ └── svc.ts │ │ │ ├── VoiceConfigurationPage.tsx │ │ │ └── WebSearchPage/ │ │ │ ├── WebProviderModalReducer.ts │ │ │ ├── WebProviderSetupModal.tsx │ │ │ ├── connectProviderFlow.ts │ │ │ ├── contentProviderUtils.ts │ │ │ ├── index.tsx │ │ │ ├── interfaces.ts │ │ │ ├── searchProviderUtils.ts │ │ │ └── svc.ts │ │ ├── sections/ │ │ │ ├── AppHealthBanner.tsx │ │ │ ├── Suggestions.tsx │ │ │ ├── actions/ │ │ │ │ ├── ActionCard.tsx │ │ │ │ ├── ActionCardContext.tsx │ │ │ │ ├── ActionCardHeader.tsx │ │ │ │ ├── Actions.tsx │ │ │ │ ├── MCPActionCard.tsx │ │ │ │ ├── MCPPageContent.tsx │ │ │ │ ├── OpenApiActionCard.tsx │ │ │ │ ├── OpenApiPageContent.tsx │ │ │ │ ├── PerUserAuthConfig.tsx │ │ │ │ ├── ToolItem.tsx │ │ │ │ ├── ToolsList.tsx │ │ │ │ ├── ToolsSection.tsx │ │ │ │ ├── modals/ │ │ │ │ │ ├── AddMCPServerModal.tsx │ │ │ │ │ ├── AddOpenAPIActionModal.tsx │ │ │ │ │ ├── DisconnectEntityModal.tsx │ │ │ │ │ ├── MCPAuthenticationModal.tsx │ │ │ │ │ └── OpenAPIAuthenticationModal.tsx │ │ │ │ └── skeleton/ │ │ │ │ ├── ActionCardSkeleton.tsx │ │ │ │ └── ToolItemSkeleton.tsx │ │ │ ├── admin/ │ │ │ │ ├── AdminListHeader.tsx │ │ │ │ └── ProviderCard.tsx │ │ │ ├── cards/ │ │ │ │ ├── AgentCard.tsx │ │ │ │ ├── DocumentSetCard.tsx │ │ │ │ ├── FileCard.tsx │ │ │ │ └── README.md │ │ │ ├── chat/ │ │ │ │ ├── ChatScrollContainer.tsx │ │ │ │ └── ChatUI.tsx │ │ │ ├── document-sidebar/ │ │ │ │ ├── ChatDocumentDisplay.tsx │ │ │ │ └── DocumentsSidebar.tsx │ │ │ ├── input/ │ │ │ │ ├── AppInputBar.tsx │ │ │ │ ├── MicrophoneButton.tsx │ │ │ │ └── SharedAppInputBar.tsx │ │ │ ├── knowledge/ │ │ │ │ ├── AgentKnowledgePane.tsx │ │ │ │ └── SourceHierarchyBrowser.tsx │ │ │ ├── modals/ │ │ │ │ ├── AgentViewerModal.tsx │ │ │ │ ├── FeedbackModal.tsx │ │ │ │ ├── NewTenantModal.tsx │ │ │ │ ├── PreviewModal/ │ │ │ │ │ ├── ExceptionTraceModal.tsx │ │ │ │ │ ├── FloatingFooter.tsx │ │ │ │ │ ├── PreviewModal.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── interfaces.ts │ │ │ │ │ └── variants/ │ │ │ │ │ ├── CodePreview.tsx │ │ │ │ │ ├── codeVariant.tsx │ │ │ │ │ ├── csvVariant.tsx │ │ │ │ │ ├── dataVariant.tsx │ │ │ │ │ ├── docxVariant.tsx │ │ │ │ │ ├── imageVariant.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── markdownVariant.tsx │ │ │ │ │ ├─
Showing preview only (1,962K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (20484 symbols across 3048 files)
FILE: backend/alembic/env.py
function include_object (line 59) | def include_object(
function filter_tenants_by_range (line 78) | def filter_tenants_by_range(
function get_schema_options (line 127) | def get_schema_options() -> (
function do_run_migrations (line 223) | def do_run_migrations(
function provide_iam_token_for_alembic (line 246) | def provide_iam_token_for_alembic(
function run_async_migrations (line 267) | async def run_async_migrations() -> None:
function run_migrations_offline (line 372) | def run_migrations_offline() -> None:
function run_migrations_online (line 466) | def run_migrations_online() -> None:
FILE: backend/alembic/run_multitenant_migrations.py
class Args (line 41) | class Args(NamedTuple):
class BatchResult (line 46) | class BatchResult(NamedTuple):
function run_alembic_for_batch (line 58) | def run_alembic_for_batch(schemas: list[str]) -> BatchResult:
function get_head_revision (line 101) | def get_head_revision() -> str | None:
function run_migrations_parallel (line 108) | def run_migrations_parallel(
function parse_args (line 219) | def parse_args() -> Args:
function main (line 247) | def main() -> int:
FILE: backend/alembic/versions/01f8e6d95a33_populate_flow_mapping_data.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 61) | def downgrade() -> None:
FILE: backend/alembic/versions/027381bce97c_add_shortcut_option_for_users.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 29) | def downgrade() -> None:
FILE: backend/alembic/versions/03bf8be6b53a_rework_kg_config.py
function upgrade (line 27) | def upgrade() -> None:
function downgrade (line 74) | def downgrade() -> None:
FILE: backend/alembic/versions/03d085c5c38d_backfill_account_type.py
function upgrade (line 41) | def upgrade() -> None:
function downgrade (line 106) | def downgrade() -> None:
FILE: backend/alembic/versions/03d710ccf29c_add_permission_sync_attempt_tables.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 124) | def downgrade() -> None:
FILE: backend/alembic/versions/0568ccf46a6b_add_thread_specific_model_selection.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/05c07bf07c00_add_search_doc_relevance_details.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 30) | def downgrade() -> None:
FILE: backend/alembic/versions/07b98176f1de_code_interpreter_seed.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 28) | def downgrade() -> None:
FILE: backend/alembic/versions/0816326d83aa_add_federated_connector_tables.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 68) | def downgrade() -> None:
FILE: backend/alembic/versions/08a1eda20fe1_add_earliest_indexing_to_connector.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/09995b8811eb_add_theme_preference_to_user.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 32) | def downgrade() -> None:
FILE: backend/alembic/versions/0a2b51deb0b8_add_starter_prompts.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 31) | def downgrade() -> None:
FILE: backend/alembic/versions/0a98909f2757_enable_encrypted_fields.py
function upgrade (line 24) | def upgrade() -> None:
function downgrade (line 101) | def downgrade() -> None:
FILE: backend/alembic/versions/0bb4558f35df_add_scim_username_to_scim_user_mapping.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/0cd424f32b1d_user_file_data_preparation_and_backfill.py
function upgrade (line 25) | def upgrade() -> None:
function downgrade (line 346) | def downgrade() -> None:
FILE: backend/alembic/versions/0ebb1d516877_add_ccpair_deletion_failure_message.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/0f7ff6d75b57_add_index_to_index_attempt_time_created.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 34) | def downgrade() -> None:
FILE: backend/alembic/versions/114a638452db_add_default_app_mode_to_user.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 32) | def downgrade() -> None:
FILE: backend/alembic/versions/12635f6655b7_drive_canonical_ids.py
function active_search_settings (line 34) | def active_search_settings() -> tuple[SearchSettings, SearchSettings | N...
function normalize_google_drive_url (line 78) | def normalize_google_drive_url(url: str) -> str:
function get_google_drive_documents_from_database (line 92) | def get_google_drive_documents_from_database() -> list[dict]:
function update_document_id_in_database (line 116) | def update_document_id_in_database(
function _visit_chunks (line 285) | def _visit_chunks(
function delete_document_chunks_from_vespa (line 313) | def delete_document_chunks_from_vespa(index_name: str, doc_id: str) -> N...
function update_document_id_in_vespa (line 352) | def update_document_id_in_vespa(
function delete_document_from_db (line 399) | def delete_document_from_db(current_doc_id: str, index_name: str) -> None:
function upgrade (line 518) | def upgrade() -> None:
function downgrade (line 587) | def downgrade() -> None:
FILE: backend/alembic/versions/15326fcec57e_introduce_onyx_apis.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 36) | def downgrade() -> None:
FILE: backend/alembic/versions/16c37a30adf2_user_file_relationship_migration.py
function upgrade (line 25) | def upgrade() -> None:
function downgrade (line 198) | def downgrade() -> None:
FILE: backend/alembic/versions/173cae5bba26_port_config_store.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 29) | def downgrade() -> None:
FILE: backend/alembic/versions/175ea04c7087_add_user_preferences.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/177de57c21c9_display_custom_llm_models.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 59) | def downgrade() -> None:
FILE: backend/alembic/versions/18b5b2524446_add_is_clarification_to_chat_message.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 28) | def downgrade() -> None:
FILE: backend/alembic/versions/19c0ccb01687_migrate_to_contextual_rag_model.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 57) | def downgrade() -> None:
FILE: backend/alembic/versions/1a03d2c2856b_add_indexes_to_document__tag.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/1b10e1fda030_add_additional_data_to_notifications.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/1b8206b29c5d_add_user_delete_cascades.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 76) | def downgrade() -> None:
FILE: backend/alembic/versions/1d78c0ca7853_remove_voice_provider_deleted_column.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/1f2a3b4c5d6e_add_internet_search_and_content_providers.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 81) | def downgrade() -> None:
FILE: backend/alembic/versions/1f60f60c3401_embedding_model_search_settings.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 95) | def downgrade() -> None:
FILE: backend/alembic/versions/2020d417ec84_single_onyx_craft_migration.py
function upgrade (line 33) | def upgrade() -> None:
function downgrade (line 305) | def downgrade() -> None:
FILE: backend/alembic/versions/213fd978c6d8_notifications.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 44) | def downgrade() -> None:
FILE: backend/alembic/versions/238b84885828_add_foreign_key_to_user__external_user_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 39) | def downgrade() -> None:
FILE: backend/alembic/versions/23957775e5f5_remove_feedback_foreignkey_constraint.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 55) | def downgrade() -> None:
FILE: backend/alembic/versions/25a5501dc766_group_permissions_phase1.py
function upgrade (line 25) | def upgrade() -> None:
function downgrade (line 105) | def downgrade() -> None:
FILE: backend/alembic/versions/2664261bfaab_add_cache_store_table.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 35) | def downgrade() -> None:
FILE: backend/alembic/versions/2666d766cb9b_google_oauth2.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 53) | def downgrade() -> None:
FILE: backend/alembic/versions/26b931506ecb_default_chosen_assistants_to_none.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 43) | def downgrade() -> None:
FILE: backend/alembic/versions/27c6ecc08586_permission_framework.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 145) | def downgrade() -> None:
FILE: backend/alembic/versions/27fb147a843f_add_timestamps_to_user_table.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 41) | def downgrade() -> None:
FILE: backend/alembic/versions/2955778aa44c_add_chunk_count_to_document.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 24) | def downgrade() -> None:
FILE: backend/alembic/versions/2a391f840e85_add_last_refreshed_at_mcp_server.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/2acdef638fc2_add_switchover_type_field.py
function upgrade (line 22) | def upgrade() -> None:
function downgrade (line 50) | def downgrade() -> None:
FILE: backend/alembic/versions/2b75d0a8ffcb_user_file_schema_cleanup.py
function upgrade (line 26) | def upgrade() -> None:
function downgrade (line 156) | def downgrade() -> None:
FILE: backend/alembic/versions/2b90f3af54b8_usage_limits.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 44) | def downgrade() -> None:
FILE: backend/alembic/versions/2c2430828bdf_add_unique_constraint_to_inputprompt_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 40) | def downgrade() -> None:
FILE: backend/alembic/versions/2cdeff6d8c93_set_built_in_to_default.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 32) | def downgrade() -> None:
FILE: backend/alembic/versions/2d2304e27d8c_add_above_below_to_persona.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 31) | def downgrade() -> None:
FILE: backend/alembic/versions/2daa494a0851_add_group_sync_time.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 30) | def downgrade() -> None:
FILE: backend/alembic/versions/2f80c6a2550f_add_chat_session_specific_temperature_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 35) | def downgrade() -> None:
FILE: backend/alembic/versions/2f95e36923e6_add_indexing_coordination.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 100) | def downgrade() -> None:
FILE: backend/alembic/versions/30c1d5744104_persona_datetime_aware.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 32) | def downgrade() -> None:
FILE: backend/alembic/versions/325975216eb3_add_icon_color_and_icon_shape_to_persona.py
function generate_random_shape (line 33) | def generate_random_shape() -> int:
function upgrade (line 43) | def upgrade() -> None:
function downgrade (line 68) | def downgrade() -> None:
FILE: backend/alembic/versions/33cb72ea4d80_single_tool_call_per_message.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 45) | def downgrade() -> None:
FILE: backend/alembic/versions/33ea50e88f24_foreign_key_input_prompts.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 54) | def downgrade() -> None:
FILE: backend/alembic/versions/351faebd379d_add_curator_fields.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 64) | def downgrade() -> None:
FILE: backend/alembic/versions/35e518e0ddf4_properly_cascade.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 74) | def downgrade() -> None:
FILE: backend/alembic/versions/35e6853a51d5_server_default_chosen_assistants.py
function upgrade (line 22) | def upgrade() -> None:
function downgrade (line 58) | def downgrade() -> None:
FILE: backend/alembic/versions/369644546676_add_composite_index_for_index_attempt_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 32) | def downgrade() -> None:
FILE: backend/alembic/versions/36e9220ab794_update_kg_trigger_functions.py
function _get_tenant_contextvar (line 21) | def _get_tenant_contextvar(session: Session) -> str:
function upgrade (line 30) | def upgrade() -> None:
function downgrade (line 135) | def downgrade() -> None:
FILE: backend/alembic/versions/3781a5eb12cb_add_chunk_stats_table.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 50) | def downgrade() -> None:
FILE: backend/alembic/versions/3879338f8ba1_add_tool_table.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 44) | def downgrade() -> None:
FILE: backend/alembic/versions/38eda64af7fe_add_chat_session_sharing.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 41) | def downgrade() -> None:
FILE: backend/alembic/versions/3934b1bc7b62_update_github_connector_repo_name_to_.py
function upgrade (line 23) | def upgrade() -> None:
function downgrade (line 74) | def downgrade() -> None:
FILE: backend/alembic/versions/3a7802814195_add_alternate_assistant_to_chat_message.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 33) | def downgrade() -> None:
FILE: backend/alembic/versions/3a78dba1080a_user_file_legacy_data_cleanup.py
function batch_delete (line 28) | def batch_delete(
function upgrade (line 90) | def upgrade() -> None:
function downgrade (line 288) | def downgrade() -> None:
FILE: backend/alembic/versions/3b25685ff73c_move_is_public_to_cc_pair.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 40) | def downgrade() -> None:
FILE: backend/alembic/versions/3bd4c84fe72f_improved_index.py
function upgrade (line 28) | def upgrade() -> None:
function downgrade (line 73) | def downgrade() -> None:
FILE: backend/alembic/versions/3c5e35aa9af0_polling_document_count.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 50) | def downgrade() -> None:
FILE: backend/alembic/versions/3c6531f32351_add_back_input_prompts.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 58) | def downgrade() -> None:
FILE: backend/alembic/versions/3c9a65f1207f_seed_exa_provider_from_env.py
function _get_internet_search_table (line 29) | def _get_internet_search_table(metadata: sa.MetaData) -> sa.Table:
function upgrade (line 54) | def upgrade() -> None:
function downgrade (line 88) | def downgrade() -> None:
FILE: backend/alembic/versions/3d1cca026fe8_add_oauth_config_and_user_tokens.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 107) | def downgrade() -> None:
FILE: backend/alembic/versions/3fc5d75723b3_add_doc_metadata_field_in_document_model.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 29) | def downgrade() -> None:
FILE: backend/alembic/versions/401c1ac29467_add_tables_for_ui_based_llm_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 47) | def downgrade() -> None:
FILE: backend/alembic/versions/40926a4dab77_reset_userfile_document_id_migrated_.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 25) | def downgrade() -> None:
FILE: backend/alembic/versions/41fa44bef321_remove_default_prompt_shortcuts.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/43cbbb3f5e6a_rename_index_origin_to_index_recursively.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 32) | def downgrade() -> None:
FILE: backend/alembic/versions/44f856ae2a4a_add_cloud_embedding_model.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 53) | def downgrade() -> None:
FILE: backend/alembic/versions/4505fd7302e1_added_is_internet_to_dbdoc.py
function upgrade (line 17) | def upgrade() -> None:
function downgrade (line 22) | def downgrade() -> None:
FILE: backend/alembic/versions/465f78d9b7f9_larger_access_tokens_for_oauth.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 24) | def downgrade() -> None:
FILE: backend/alembic/versions/46625e4745d4_remove_native_enum.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 30) | def downgrade() -> None:
FILE: backend/alembic/versions/46b7a812670f_fix_user__external_user_group_id_fk.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 34) | def downgrade() -> None:
FILE: backend/alembic/versions/4738e4b3bae1_pg_file_store.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 28) | def downgrade() -> None:
FILE: backend/alembic/versions/473a1a7ca408_add_display_model_names_to_llm_provider.py
function upgrade (line 32) | def upgrade() -> None:
function downgrade (line 48) | def downgrade() -> None:
FILE: backend/alembic/versions/47433d30de82_create_indexattempt_table.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 73) | def downgrade() -> None:
FILE: backend/alembic/versions/475fcefe8826_add_name_to_api_key.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 23) | def downgrade() -> None:
FILE: backend/alembic/versions/4794bc13e484_update_prompt_length.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 37) | def downgrade() -> None:
FILE: backend/alembic/versions/47a07e1a38f1_fix_invalid_model_configurations_state.py
class _SimpleModelConfiguration (line 27) | class _SimpleModelConfiguration(BaseModel):
function upgrade (line 38) | def upgrade() -> None:
function downgrade (line 149) | def downgrade() -> None:
FILE: backend/alembic/versions/47e5bef3a1d7_add_persona_categories.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 43) | def downgrade() -> None:
FILE: backend/alembic/versions/48d14957fe80_add_support_for_custom_tools.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 57) | def downgrade() -> None:
FILE: backend/alembic/versions/495cb26ce93e_create_knowlege_graph_tables.py
function upgrade (line 28) | def upgrade() -> None:
function downgrade (line 585) | def downgrade() -> None:
FILE: backend/alembic/versions/4a1e4b1c89d2_add_indexing_to_userfilestatus.py
function _drop_status_check_constraint (line 25) | def _drop_status_check_constraint() -> None:
function upgrade (line 39) | def upgrade() -> None:
function downgrade (line 45) | def downgrade() -> None:
FILE: backend/alembic/versions/4a951134c801_moved_status_to_connector_credential_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 56) | def downgrade() -> None:
FILE: backend/alembic/versions/4b08d97e175a_change_default_prune_freq.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 28) | def downgrade() -> None:
FILE: backend/alembic/versions/4cebcbc9b2ae_add_tab_index_to_tool_call.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/4d58345da04a_lowercase_user_emails.py
function upgrade (line 25) | def upgrade() -> None:
function downgrade (line 60) | def downgrade() -> None:
FILE: backend/alembic/versions/4ea2c93919c1_add_type_to_credentials.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 75) | def downgrade() -> None:
FILE: backend/alembic/versions/4ee1287bd26a_add_multiple_slack_bot_support.py
function upgrade (line 24) | def upgrade() -> None:
function downgrade (line 184) | def downgrade() -> None:
FILE: backend/alembic/versions/4f8a2b3c1d9e_add_open_url_tool.py
function upgrade (line 31) | def upgrade() -> None:
function downgrade (line 101) | def downgrade() -> None:
FILE: backend/alembic/versions/503883791c39_add_effective_permissions.py
function upgrade (line 50) | def upgrade() -> None:
function downgrade (line 103) | def downgrade() -> None:
FILE: backend/alembic/versions/505c488f6662_merge_default_assistants_into_unified.py
class UserRow (line 75) | class UserRow(NamedTuple):
function upgrade (line 85) | def upgrade() -> None:
function downgrade (line 307) | def downgrade() -> None:
FILE: backend/alembic/versions/50b683a8295c_add_additional_retrieval_controls_to_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/52a219fb5233_add_last_synced_and_last_modified_to_document_table.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 63) | def downgrade() -> None:
FILE: backend/alembic/versions/54a74a0417fc_danswerbot_onyxbot.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 23) | def downgrade() -> None:
FILE: backend/alembic/versions/55546a7967ee_assistant_rework.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 63) | def downgrade() -> None:
FILE: backend/alembic/versions/570282d33c49_track_onyxbot_explicitly.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/57122d037335_add_python_tool_on_default.py
function upgrade (line 23) | def upgrade() -> None:
function downgrade (line 50) | def downgrade() -> None:
FILE: backend/alembic/versions/57b53544726e_add_document_set_tables.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 58) | def downgrade() -> None:
FILE: backend/alembic/versions/5809c0787398_add_chat_sessions.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 84) | def downgrade() -> None:
FILE: backend/alembic/versions/58c50ef19f08_add_stale_column_to_user__external_user_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 66) | def downgrade() -> None:
FILE: backend/alembic/versions/5ae8240accb3_add_research_agent_database_tables_and_.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 108) | def downgrade() -> None:
FILE: backend/alembic/versions/5b29123cd710_nullable_search_settings_for_historic_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 42) | def downgrade() -> None:
FILE: backend/alembic/versions/5c3dca366b35_backend_driven_notification_details.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 33) | def downgrade() -> None:
FILE: backend/alembic/versions/5c448911b12f_add_content_type_to_userfile.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 23) | def downgrade() -> None:
FILE: backend/alembic/versions/5c7fdadae813_match_any_keywords_flag_for_standard_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 33) | def downgrade() -> None:
FILE: backend/alembic/versions/5d12a446f5c0_add_api_version_and_deployment_name_to_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 29) | def downgrade() -> None:
FILE: backend/alembic/versions/5e1c073d48a3_add_personal_access_token_table.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 80) | def downgrade() -> None:
FILE: backend/alembic/versions/5e6f7a8b9c0d_update_default_persona_prompt.py
function upgrade (line 38) | def upgrade() -> None:
function downgrade (line 52) | def downgrade() -> None:
FILE: backend/alembic/versions/5e84129c8be3_add_docs_indexed_column_to_index_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 35) | def downgrade() -> None:
FILE: backend/alembic/versions/5f4b8568a221_add_removed_documents_to_index_attempt.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/5fc1f54cc252_hybrid_enum.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 23) | def downgrade() -> None:
FILE: backend/alembic/versions/61ff3651add4_add_permission_syncing.py
function upgrade (line 22) | def upgrade() -> None:
function downgrade (line 87) | def downgrade() -> None:
FILE: backend/alembic/versions/62c3a055a141_add_file_names_to_file_connector_config.py
function upgrade (line 29) | def upgrade() -> None:
function downgrade (line 94) | def downgrade() -> None:
FILE: backend/alembic/versions/631fd2504136_add_approx_chunk_count_in_vespa_to_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 31) | def downgrade() -> None:
FILE: backend/alembic/versions/6436661d5b65_add_created_at_in_project_userfile.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 38) | def downgrade() -> None:
FILE: backend/alembic/versions/643a84a42a33_add_user_configured_names_to_llmprovider.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 44) | def downgrade() -> None:
FILE: backend/alembic/versions/64bd5677aeb6_add_image_input_support_to_model_config.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 36) | def downgrade() -> None:
FILE: backend/alembic/versions/65bc6e0f8500_remove_kg_subtype_from_db.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/6756efa39ada_id_uuid_for_chat_session.py
function upgrade (line 28) | def upgrade() -> None:
function downgrade (line 82) | def downgrade() -> None:
FILE: backend/alembic/versions/689433b0d8de_add_hook_and_hook_execution_log_tables.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 97) | def downgrade() -> None:
FILE: backend/alembic/versions/699221885109_nullify_default_task_prompt.py
function upgrade (line 22) | def upgrade() -> None:
function downgrade (line 45) | def downgrade() -> None:
FILE: backend/alembic/versions/6a804aeb4830_duplicated_no_harm_user_file_migration.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 22) | def downgrade() -> None:
FILE: backend/alembic/versions/6b3b4083c5aa_persona_cleanup_and_featured.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 48) | def downgrade() -> None:
FILE: backend/alembic/versions/6d387b3196c2_basic_auth.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 76) | def downgrade() -> None:
FILE: backend/alembic/versions/6d562f86c78b_remove_default_bot.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 36) | def downgrade() -> None:
FILE: backend/alembic/versions/6f4f86aef280_add_queries_and_is_web_fetch_to_.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 35) | def downgrade() -> None:
FILE: backend/alembic/versions/6fc7886d665d_make_categories_labels_and_many_to_many.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 53) | def downgrade() -> None:
FILE: backend/alembic/versions/703313b75876_add_tokenratelimit_tables.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 60) | def downgrade() -> None:
FILE: backend/alembic/versions/70f00c45c0f2_more_descriptive_filestore.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 65) | def downgrade() -> None:
FILE: backend/alembic/versions/7206234e012a_add_image_generation_config_table.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 46) | def downgrade() -> None:
FILE: backend/alembic/versions/72aa7de2e5cf_make_processing_mode_default_all_caps.py
function upgrade (line 24) | def upgrade() -> None:
function downgrade (line 41) | def downgrade() -> None:
FILE: backend/alembic/versions/72bdc9929a46_permission_auto_sync_framework.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 79) | def downgrade() -> None:
FILE: backend/alembic/versions/73e9983e5091_add_search_query_table.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 44) | def downgrade() -> None:
FILE: backend/alembic/versions/7477a5f5d728_added_model_defaults_for_users.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 23) | def downgrade() -> None:
FILE: backend/alembic/versions/7547d982db8f_chat_folders.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 47) | def downgrade() -> None:
FILE: backend/alembic/versions/7616121f6e97_add_enterprise_fields_to_scim_user_mapping.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 43) | def downgrade() -> None:
FILE: backend/alembic/versions/767f1c2a00eb_count_chat_tokens.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/76b60d407dfb_cc_pair_name_not_unique.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 31) | def downgrade() -> None:
FILE: backend/alembic/versions/776b3bbe9092_remove_remaining_enums.py
function upgrade (line 22) | def upgrade() -> None:
function downgrade (line 50) | def downgrade() -> None:
FILE: backend/alembic/versions/77d07dffae64_forcibly_remove_more_enum_types_from_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 34) | def downgrade() -> None:
FILE: backend/alembic/versions/78dbe7e38469_task_tracking.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 48) | def downgrade() -> None:
FILE: backend/alembic/versions/78ebc66946a0_remove_reranking_from_search_settings.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 28) | def downgrade() -> None:
FILE: backend/alembic/versions/795b20b85b4b_add_llm_group_permissions_control.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 40) | def downgrade() -> None:
FILE: backend/alembic/versions/797089dfb4d2_persona_start_date.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/79acd316403a_add_api_key_table.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 48) | def downgrade() -> None:
FILE: backend/alembic/versions/7a70b7664e37_add_model_configuration_table.py
function _resolve (line 25) | def _resolve(
function upgrade (line 106) | def upgrade() -> None:
function downgrade (line 181) | def downgrade() -> None:
FILE: backend/alembic/versions/7aea705850d5_added_slack_auto_filter.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 35) | def downgrade() -> None:
FILE: backend/alembic/versions/7b9b952abdf6_update_entities.py
function upgrade (line 22) | def upgrade() -> None:
function downgrade (line 297) | def downgrade() -> None:
FILE: backend/alembic/versions/7bd55f264e1b_add_display_name_to_model_configuration.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/7cb492013621_code_interpreter_server_model.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 30) | def downgrade() -> None:
FILE: backend/alembic/versions/7cc3fcc116c1_user_file_uuid_primary_key_swap.py
function upgrade (line 25) | def upgrade() -> None:
function downgrade (line 174) | def downgrade() -> None:
FILE: backend/alembic/versions/7ccea01261f6_store_chat_retrieval_docs.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 31) | def downgrade() -> None:
FILE: backend/alembic/versions/7da0ae5ad583_add_description_to_persona.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 23) | def downgrade() -> None:
FILE: backend/alembic/versions/7da543f5672f_add_slackbotconfig_table.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 38) | def downgrade() -> None:
FILE: backend/alembic/versions/7e490836d179_nullify_default_system_prompt.py
function upgrade (line 37) | def upgrade() -> None:
function downgrade (line 59) | def downgrade() -> None:
FILE: backend/alembic/versions/7ed603b64d5a_add_mcp_server_and_connection_config_.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 187) | def downgrade() -> None:
FILE: backend/alembic/versions/7f726bad5367_slack_followup.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/7f99be1cb9f5_add_index_for_getting_documents_just_by_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 30) | def downgrade() -> None:
FILE: backend/alembic/versions/800f48024ae9_add_id_to_connectorcredentialpair.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 48) | def downgrade() -> None:
FILE: backend/alembic/versions/80696cf850ae_add_chat_session_to_query_event.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 33) | def downgrade() -> None:
FILE: backend/alembic/versions/8188861f4e92_csv_to_tabular_chat_file_type.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 38) | def downgrade() -> None:
FILE: backend/alembic/versions/81c22b1e2e78_hierarchy_nodes_v1.py
function upgrade (line 83) | def upgrade() -> None:
function downgrade (line 311) | def downgrade() -> None:
FILE: backend/alembic/versions/8405ca81cc83_notifications_constraint.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 47) | def downgrade() -> None:
FILE: backend/alembic/versions/849b21c732f8_add_demo_data_enabled_to_build_session.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 31) | def downgrade() -> None:
FILE: backend/alembic/versions/87c52ec39f84_update_default_system_prompt.py
function upgrade (line 38) | def upgrade() -> None:
function downgrade (line 52) | def downgrade() -> None:
FILE: backend/alembic/versions/8818cf73fa1a_drop_include_citations.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 23) | def downgrade() -> None:
FILE: backend/alembic/versions/891cd83c87a8_add_is_visible_to_persona.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 33) | def downgrade() -> None:
FILE: backend/alembic/versions/8987770549c0_add_full_exception_stack_trace.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 25) | def downgrade() -> None:
FILE: backend/alembic/versions/8a87bd6ec550_associate_index_attempts_with_ccpair.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 73) | def downgrade() -> None:
FILE: backend/alembic/versions/8aabb57f3b49_restructure_document_indices.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 25) | def downgrade() -> None:
FILE: backend/alembic/versions/8b5ce697290e_add_discord_bot_tables.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 113) | def downgrade() -> None:
FILE: backend/alembic/versions/8e1ac4f39a9f_enable_contextual_retrieval.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 48) | def downgrade() -> None:
FILE: backend/alembic/versions/8e26726b7683_chat_context_addition.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 38) | def downgrade() -> None:
FILE: backend/alembic/versions/8f43500ee275_add_index.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 31) | def downgrade() -> None:
FILE: backend/alembic/versions/8ffcc2bcfc11_add_needs_persona_sync_to_user_file.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 32) | def downgrade() -> None:
FILE: backend/alembic/versions/904451035c9b_store_tool_details.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 28) | def downgrade() -> None:
FILE: backend/alembic/versions/904e5138fffb_tags.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 59) | def downgrade() -> None:
FILE: backend/alembic/versions/9087b548dd69_seed_default_image_gen_config.py
function upgrade (line 26) | def upgrade() -> None:
function downgrade (line 133) | def downgrade() -> None:
FILE: backend/alembic/versions/90b409d06e50_add_chat_compression_fields.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 35) | def downgrade() -> None:
FILE: backend/alembic/versions/90e3b9af7da4_tag_fix.py
function set_is_list_for_known_tags (line 41) | def set_is_list_for_known_tags() -> None:
function set_is_list_for_list_tags (line 78) | def set_is_list_for_list_tags() -> None:
function log_list_tags (line 104) | def log_list_tags() -> None:
function remove_old_tags (line 121) | def remove_old_tags() -> None:
function active_search_settings (line 171) | def active_search_settings() -> tuple[SearchSettings, SearchSettings | N...
function _get_batch_documents_with_multiple_tags (line 215) | def _get_batch_documents_with_multiple_tags(
function _get_vespa_metadata (line 247) | def _get_vespa_metadata(
function _get_document_tags (line 276) | def _get_document_tags(document_id: str) -> list[tuple[int, str, str]]:
function upgrade (line 291) | def upgrade() -> None:
function downgrade (line 324) | def downgrade() -> None:
FILE: backend/alembic/versions/91a0a4d62b14_milestone.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 45) | def downgrade() -> None:
FILE: backend/alembic/versions/91fd3b470d1a_remove_documentsource_from_tag.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 30) | def downgrade() -> None:
FILE: backend/alembic/versions/91ffac7e65b3_add_expiry_time.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 25) | def downgrade() -> None:
FILE: backend/alembic/versions/93560ba1b118_add_web_ui_option_to_slack_config.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 29) | def downgrade() -> None:
FILE: backend/alembic/versions/93a2e195e25c_add_voice_provider_and_user_voice_prefs.py
function upgrade (line 23) | def upgrade() -> None:
function downgrade (line 107) | def downgrade() -> None:
FILE: backend/alembic/versions/93c15d6a6fbb_add_chunk_error_and_vespa_count_columns_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 41) | def downgrade() -> None:
FILE: backend/alembic/versions/949b4a92a401_remove_rt.py
function upgrade (line 29) | def upgrade() -> None:
function downgrade (line 71) | def downgrade() -> None:
FILE: backend/alembic/versions/94dc3d0236f8_make_document_set_description_optional.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/96a5702df6aa_mcp_tool_enabled.py
function upgrade (line 23) | def upgrade() -> None:
function downgrade (line 42) | def downgrade() -> None:
FILE: backend/alembic/versions/977e834c1427_seed_default_groups.py
function _find_available_name (line 56) | def _find_available_name(conn: sa.engine.Connection, base: str) -> str:
function upgrade (line 77) | def upgrade() -> None:
function downgrade (line 122) | def downgrade() -> None:
FILE: backend/alembic/versions/97dbb53fa8c8_add_syncrecord.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 70) | def downgrade() -> None:
FILE: backend/alembic/versions/98a5008d8711_agent_tracking.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 103) | def downgrade() -> None:
FILE: backend/alembic/versions/9a0296d7421e_add_is_auto_mode_to_llm_provider.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 32) | def downgrade() -> None:
FILE: backend/alembic/versions/9aadf32dfeb4_add_user_files.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 105) | def downgrade() -> None:
FILE: backend/alembic/versions/9b66d3156fc6_user_file_schema_additions.py
function upgrade (line 24) | def upgrade() -> None:
function downgrade (line 203) | def downgrade() -> None:
FILE: backend/alembic/versions/9c00a2bccb83_chat_message_agentic.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 43) | def downgrade() -> None:
FILE: backend/alembic/versions/9c54986124c6_add_scim_tables.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 113) | def downgrade() -> None:
FILE: backend/alembic/versions/9cf5c00f72fe_add_creator_to_cc_pair.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 30) | def downgrade() -> None:
FILE: backend/alembic/versions/9d1543a37106_add_processing_duration_seconds_to_chat_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/9d97fecfab7f_added_retrieved_docs_to_query_event.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 31) | def downgrade() -> None:
FILE: backend/alembic/versions/9drpiiw74ljy_add_config_to_federated_connector.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 96) | def downgrade() -> None:
FILE: backend/alembic/versions/9f696734098f_combine_search_and_chat.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 25) | def downgrade() -> None:
FILE: backend/alembic/versions/a01bf2971c5d_update_default_tool_descriptions.py
function upgrade (line 42) | def upgrade() -> None:
function downgrade (line 53) | def downgrade() -> None:
FILE: backend/alembic/versions/a1b2c3d4e5f6_add_license_table.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 47) | def downgrade() -> None:
FILE: backend/alembic/versions/a1b2c3d4e5f7_drop_agent_search_metrics_table.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 24) | def downgrade() -> None:
FILE: backend/alembic/versions/a2b3c4d5e6f7_remove_fast_default_model_name.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 23) | def downgrade() -> None:
FILE: backend/alembic/versions/a3795dce87be_migration_confluence_to_be_explicit.py
function extract_confluence_keys_from_url (line 20) | def extract_confluence_keys_from_url(wiki_url: str) -> tuple[str, str, s...
function reconstruct_confluence_url (line 59) | def reconstruct_confluence_url(
function upgrade (line 73) | def upgrade() -> None:
function downgrade (line 117) | def downgrade() -> None:
FILE: backend/alembic/versions/a3b8d9e2f1c4_make_scim_external_id_nullable.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/a3bfd0d64902_add_chosen_assistants_to_user_table.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/a3c1a7904cd0_remove_userfile_related_deprecated_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 25) | def downgrade() -> None:
FILE: backend/alembic/versions/a3f8b2c1d4e5_add_preferred_response_id_to_chat_message.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 34) | def downgrade() -> None:
FILE: backend/alembic/versions/a4f23d6b71c8_add_llm_provider_persona_restrictions.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 48) | def downgrade() -> None:
FILE: backend/alembic/versions/a570b80a5f20_usergroup_tables.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 65) | def downgrade() -> None:
FILE: backend/alembic/versions/a6df6b88ef81_remove_recent_assistants.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 24) | def downgrade() -> None:
FILE: backend/alembic/versions/a7688ab35c45_add_public_external_user_group_table.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 31) | def downgrade() -> None:
FILE: backend/alembic/versions/a852cbe15577_new_chat_history.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 195) | def downgrade() -> None:
FILE: backend/alembic/versions/a8c2065484e6_add_auto_scroll_to_user_model.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/abbfec3a5ac5_merge_prompt_into_persona.py
function upgrade (line 23) | def upgrade() -> None:
function downgrade (line 136) | def downgrade() -> None:
FILE: backend/alembic/versions/abe7378b8217_add_indexing_trigger_to_cc_pair.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 30) | def downgrade() -> None:
FILE: backend/alembic/versions/ac5eaac849f9_add_last_pruned_to_connector_table.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/acaab4ef4507_remove_inactive_ccpair_status_on_.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 25) | def downgrade() -> None:
FILE: backend/alembic/versions/ae62505e3acc_add_saml_accounts.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 47) | def downgrade() -> None:
FILE: backend/alembic/versions/aeda5f2df4f6_add_pinned_assistants.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/b082fec533f0_make_last_attempt_status_nullable.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 34) | def downgrade() -> None:
FILE: backend/alembic/versions/b156fa702355_chat_reworked.py
function upgrade (line 36) | def upgrade() -> None:
function downgrade (line 291) | def downgrade() -> None:
FILE: backend/alembic/versions/b30353be4eec_add_mcp_auth_performer.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 120) | def downgrade() -> None:
FILE: backend/alembic/versions/b329d00a9ea6_adding_assistant_specific_user_.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 37) | def downgrade() -> None:
FILE: backend/alembic/versions/b388730a2899_nullable_preferences.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 24) | def downgrade() -> None:
FILE: backend/alembic/versions/b4b7e1028dfd_grant_basic_to_existing_groups.py
function upgrade (line 40) | def upgrade() -> None:
function downgrade (line 71) | def downgrade() -> None:
FILE: backend/alembic/versions/b4ef3ae0bf6e_add_user_oauth_token_to_slack_bot.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 25) | def downgrade() -> None:
FILE: backend/alembic/versions/b51c6844d1df_seed_memory_tool.py
function upgrade (line 29) | def upgrade() -> None:
function downgrade (line 74) | def downgrade() -> None:
FILE: backend/alembic/versions/b558f51620b4_pause_finished_user_file_connectors.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 32) | def downgrade() -> None:
FILE: backend/alembic/versions/b5c4d7e8f9a1_add_hierarchy_node_cc_pair_table.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 46) | def downgrade() -> None:
FILE: backend/alembic/versions/b728689f45b1_rename_persona_is_visible_to_is_listed_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 24) | def downgrade() -> None:
FILE: backend/alembic/versions/b72ed7a5db0e_remove_description_from_starter_messages.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 36) | def downgrade() -> None:
FILE: backend/alembic/versions/b7a7eee5aa15_add_checkpointing_failure_handling.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 79) | def downgrade() -> None:
FILE: backend/alembic/versions/b7bcc991d722_assign_users_to_default_groups.py
function upgrade (line 49) | def upgrade() -> None:
function downgrade (line 122) | def downgrade() -> None:
FILE: backend/alembic/versions/b7c2b63c4a03_add_background_reindex_enabled_field.py
function upgrade (line 22) | def upgrade() -> None:
function downgrade (line 52) | def downgrade() -> None:
FILE: backend/alembic/versions/b7ec9b5b505f_adjust_prompt_length.py
function upgrade (line 23) | def upgrade() -> None:
function downgrade (line 41) | def downgrade() -> None:
FILE: backend/alembic/versions/b85f02ec1308_fix_file_type_migration.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/b896bbd0d5a7_backfill_is_internet_data_to_false.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 23) | def downgrade() -> None:
FILE: backend/alembic/versions/b8c9d0e1f2a3_drop_milestone_table.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 25) | def downgrade() -> None:
FILE: backend/alembic/versions/ba98eba0f66a_add_support_for_litellm_proxy_in_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/baf71f781b9e_add_llm_model_version_override_to_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/bc9771dccadf_create_usage_reports_table.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 51) | def downgrade() -> None:
FILE: backend/alembic/versions/bceb1e139447_add_base_url_to_cloudembeddingprovider.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/bd2921608c3a_non_nullable_default_persona.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 36) | def downgrade() -> None:
FILE: backend/alembic/versions/bd7c3bf8beba_migrate_agent_responses_to_research_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 103) | def downgrade() -> None:
FILE: backend/alembic/versions/be2ab2aa50ee_fix_capitalization.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 36) | def downgrade() -> None:
FILE: backend/alembic/versions/be87a654d5af_persona_new_default_model_configuration_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 35) | def downgrade() -> None:
FILE: backend/alembic/versions/bf7a81109301_delete_input_prompts.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/c0aab6edb6dd_delete_workspace.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 29) | def downgrade() -> None:
FILE: backend/alembic/versions/c0c937d5c9e5_llm_provider_deprecate_fields.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 45) | def downgrade() -> None:
FILE: backend/alembic/versions/c0fd6e4da83a_add_recent_assistants.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 29) | def downgrade() -> None:
FILE: backend/alembic/versions/c18cdf4b497e_add_standard_answer_tables.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 70) | def downgrade() -> None:
FILE: backend/alembic/versions/c1d2e3f4a5b6_add_deep_research_tool.py
function upgrade (line 28) | def upgrade() -> None:
function downgrade (line 41) | def downgrade() -> None:
FILE: backend/alembic/versions/c5b692fa265c_add_index_attempt_errors_table.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 54) | def downgrade() -> None:
FILE: backend/alembic/versions/c5eae4a75a1b_add_chat_message__standard_answer_table.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 36) | def downgrade() -> None:
FILE: backend/alembic/versions/c7bf5721733e_add_has_been_indexed_to_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 43) | def downgrade() -> None:
FILE: backend/alembic/versions/c7e9f4a3b2d1_add_python_tool.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 57) | def downgrade() -> None:
FILE: backend/alembic/versions/c7f2e1b4a9d3_add_sharing_scope_to_build_session.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 30) | def downgrade() -> None:
FILE: backend/alembic/versions/c8a93a2af083_personalization_user_info.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 66) | def downgrade() -> None:
FILE: backend/alembic/versions/c99d76fcd298_add_nullable_to_persona_id_in_chat_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 25) | def downgrade() -> None:
FILE: backend/alembic/versions/c9e2cd766c29_add_s3_file_store_table.py
function upgrade (line 28) | def upgrade() -> None:
function downgrade (line 87) | def downgrade() -> None:
function _migrate_files_to_postgres (line 130) | def _migrate_files_to_postgres() -> None:
function _migrate_files_to_external_storage (line 215) | def _migrate_files_to_external_storage() -> None:
function _set_tenant_contextvar (line 308) | def _set_tenant_contextvar(session: Session) -> None:
FILE: backend/alembic/versions/ca04500b9ee8_add_cascade_deletes_to_agent_tables.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 77) | def downgrade() -> None:
FILE: backend/alembic/versions/cbc03e08d0f3_add_opensearch_migration_tables.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 107) | def downgrade() -> None:
FILE: backend/alembic/versions/cec7ec36c505_kgentity_parent.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 28) | def downgrade() -> None:
FILE: backend/alembic/versions/cf90764725d8_larger_refresh_tokens.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 24) | def downgrade() -> None:
FILE: backend/alembic/versions/d09fc20a3c66_seed_builtin_tools.py
function upgrade (line 69) | def upgrade() -> None:
function downgrade (line 134) | def downgrade() -> None:
FILE: backend/alembic/versions/d1b637d7050a_sync_exa_api_key_to_content_provider.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 54) | def downgrade() -> None:
FILE: backend/alembic/versions/d25168c2beee_tool_name_consistency.py
function upgrade (line 44) | def upgrade() -> None:
function downgrade (line 68) | def downgrade() -> None:
FILE: backend/alembic/versions/d3fd499c829c_add_file_reader_tool.py
function upgrade (line 31) | def upgrade() -> None:
function downgrade (line 82) | def downgrade() -> None:
FILE: backend/alembic/versions/d5645c915d0e_remove_deletion_attempt_table.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/d56ffa94ca32_add_file_content.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 34) | def downgrade() -> None:
FILE: backend/alembic/versions/d5c86e2c6dc6_add_cascade_delete_to_search_query_user_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 31) | def downgrade() -> None:
FILE: backend/alembic/versions/d61e513bef0a_add_total_docs_for_index_attempt.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 29) | def downgrade() -> None:
FILE: backend/alembic/versions/d7111c1238cd_remove_document_ids.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 24) | def downgrade() -> None:
FILE: backend/alembic/versions/d716b0791ddd_combined_slack_id_fields.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 32) | def downgrade() -> None:
FILE: backend/alembic/versions/d8cdfee5df80_add_skipped_to_userfilestatus.py
function _drop_status_check_constraint (line 36) | def _drop_status_check_constraint() -> None:
function upgrade (line 45) | def upgrade() -> None:
function downgrade (line 51) | def downgrade() -> None:
FILE: backend/alembic/versions/d929f0c1c6af_feedback_feature.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 89) | def downgrade() -> None:
FILE: backend/alembic/versions/d961aca62eb3_update_status_length.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 55) | def downgrade() -> None:
FILE: backend/alembic/versions/d9ec13955951_remove__dim_suffix_from_model_name.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 29) | def downgrade() -> None:
FILE: backend/alembic/versions/da42808081e3_migrate_jira_connectors_to_new_format.py
function upgrade (line 27) | def upgrade() -> None:
function downgrade (line 85) | def downgrade() -> None:
FILE: backend/alembic/versions/da4c21c69164_chosen_assistants_changed_to_jsonb.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 47) | def downgrade() -> None:
FILE: backend/alembic/versions/dab04867cd88_add_composite_index_to_document_by_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 29) | def downgrade() -> None:
FILE: backend/alembic/versions/dba7f71618f5_onyx_custom_tool_flow.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 29) | def downgrade() -> None:
FILE: backend/alembic/versions/dbaa756c2ccf_embedding_models.py
function _get_old_default_embedding_model (line 34) | def _get_old_default_embedding_model() -> IndexingSetting:
function _get_new_default_embedding_model (line 60) | def _get_new_default_embedding_model() -> IndexingSetting:
function upgrade (line 75) | def upgrade() -> None:
function downgrade (line 182) | def downgrade() -> None:
FILE: backend/alembic/versions/df0c7ad8a076_added_deletion_attempt_table.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 112) | def downgrade() -> None:
FILE: backend/alembic/versions/df46c75b714e_add_default_vision_provider_to_llm_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 35) | def downgrade() -> None:
FILE: backend/alembic/versions/dfbe9e93d3c7_extended_role_for_non_web.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 30) | def downgrade() -> None:
FILE: backend/alembic/versions/e0a68a81d434_add_chat_feedback.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 44) | def downgrade() -> None:
FILE: backend/alembic/versions/e1392f05e840_added_input_prompts.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 56) | def downgrade() -> None:
FILE: backend/alembic/versions/e209dc5a8156_added_prune_frequency.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 22) | def downgrade() -> None:
FILE: backend/alembic/versions/e4334d5b33ba_add_deployment_name_to_llmprovider.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/e50154680a5c_no_source_enum.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 32) | def downgrade() -> None:
FILE: backend/alembic/versions/e6a4bbc13fe4_add_index_for_retrieving_latest_index_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 28) | def downgrade() -> None:
FILE: backend/alembic/versions/e7f8a9b0c1d2_create_anonymous_user.py
function _dedupe_null_notifications (line 39) | def _dedupe_null_notifications(connection: sa.Connection) -> None:
function upgrade (line 89) | def upgrade() -> None:
function downgrade (line 153) | def downgrade() -> None:
FILE: backend/alembic/versions/e86866a9c78a_add_persona_to_chat_session.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/e8f0d2a38171_add_status_to_mcp_server_and_make_auth_.py
function upgrade (line 25) | def upgrade() -> None:
function downgrade (line 79) | def downgrade() -> None:
FILE: backend/alembic/versions/e91df4e935ef_private_personas_documentsets.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 111) | def downgrade() -> None:
FILE: backend/alembic/versions/eaa3b5593925_add_default_slack_channel_config.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 69) | def downgrade() -> None:
FILE: backend/alembic/versions/ec3ec2eabf7b_index_from_beginning.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/ec85f2b3c544_remove_last_attempt_status_from_cc_pair.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 23) | def downgrade() -> None:
FILE: backend/alembic/versions/ecab2b3f1a3b_add_overrides_to_the_chat_session.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 39) | def downgrade() -> None:
FILE: backend/alembic/versions/ed9e44312505_add_icon_name_field.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 28) | def downgrade() -> None:
FILE: backend/alembic/versions/ee3f4b47fad5_added_alternate_model_to_chat_message.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/ef7da92f7213_add_files_to_chatmessage.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/efb35676026c_standard_answer_match_regex_flag.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 30) | def downgrade() -> None:
FILE: backend/alembic/versions/f11b408e39d3_force_lowercase_all_users.py
function upgrade (line 16) | def upgrade() -> None:
function downgrade (line 31) | def downgrade() -> None:
FILE: backend/alembic/versions/f13db29f3101_add_composite_index_for_last_modified_.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 27) | def downgrade() -> None:
FILE: backend/alembic/versions/f17bf3b0d9f1_embedding_provider_by_provider_type.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 86) | def downgrade() -> None:
FILE: backend/alembic/versions/f1c6478c3fd8_add_pre_defined_feedback.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 25) | def downgrade() -> None:
FILE: backend/alembic/versions/f1ca58b2f2ec_add_passthrough_auth_to_tool.py
function upgrade (line 22) | def upgrade() -> None:
function downgrade (line 32) | def downgrade() -> None:
FILE: backend/alembic/versions/f220515df7b4_add_flow_mapping_table.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 55) | def downgrade() -> None:
FILE: backend/alembic/versions/f32615f71aeb_add_custom_headers_to_tools.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/f39c5794c10a_add_background_errors_table.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 40) | def downgrade() -> None:
FILE: backend/alembic/versions/f5437cc136c5_delete_non_search_assistants.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 23) | def downgrade() -> None:
FILE: backend/alembic/versions/f71470ba9274_add_prompt_length_limit.py
function upgrade (line 16) | def upgrade() -> None:
function downgrade (line 34) | def downgrade() -> None:
FILE: backend/alembic/versions/f7505c5b0284_updated_constraints_for_ccpairs.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 51) | def downgrade() -> None:
FILE: backend/alembic/versions/f7a894b06d02_non_nullbale_slack_bot_id_in_channel_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 33) | def downgrade() -> None:
FILE: backend/alembic/versions/f7ca3e2f45d9_migrate_no_auth_data_to_placeholder.py
function upgrade (line 130) | def upgrade() -> None:
function downgrade (line 236) | def downgrade() -> None:
FILE: backend/alembic/versions/f7e58d357687_add_has_web_column_to_user.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 26) | def downgrade() -> None:
FILE: backend/alembic/versions/f8a9b2c3d4e5_add_research_answer_purpose_to_chat_message.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 28) | def downgrade() -> None:
FILE: backend/alembic/versions/f9b8c7d6e5a4_update_parent_question_id_foreign_key_to_research_agent_iteration.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 40) | def downgrade() -> None:
FILE: backend/alembic/versions/fad14119fb92_delete_tags_with_wrong_enum.py
function upgrade (line 18) | def upgrade() -> None:
function downgrade (line 39) | def downgrade() -> None:
FILE: backend/alembic/versions/fb80bdd256de_add_chat_background_to_user.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 30) | def downgrade() -> None:
FILE: backend/alembic/versions/fcd135795f21_add_slack_bot_display_type.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 39) | def downgrade() -> None:
FILE: backend/alembic/versions/febe9eaa0644_add_document_set_persona_relationship_.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 37) | def downgrade() -> None:
FILE: backend/alembic/versions/fec3db967bf7_add_time_updated_to_usergroup_and_.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 40) | def downgrade() -> None:
FILE: backend/alembic/versions/feead2911109_add_opensearch_tenant_migration_columns.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 62) | def downgrade() -> None:
FILE: backend/alembic/versions/ffc707a226b4_basic_document_metadata.py
function upgrade (line 20) | def upgrade() -> None:
function downgrade (line 35) | def downgrade() -> None:
FILE: backend/alembic_tenants/env.py
function include_object (line 41) | def include_object(
function run_migrations_offline (line 60) | def run_migrations_offline() -> None:
function do_run_migrations (line 84) | def do_run_migrations(connection: Connection) -> None:
function run_async_migrations (line 95) | async def run_async_migrations() -> None:
function run_migrations_online (line 112) | def run_migrations_online() -> None:
FILE: backend/alembic_tenants/versions/14a83a331951_create_usertenantmapping_table.py
function upgrade (line 12) | def upgrade() -> None:
function downgrade (line 23) | def downgrade() -> None:
FILE: backend/alembic_tenants/versions/34e3630c7f32_lowercase_multi_tenant_user_auth.py
function upgrade (line 19) | def upgrade() -> None:
function downgrade (line 36) | def downgrade() -> None:
FILE: backend/alembic_tenants/versions/3b45e0018bf1_add_new_available_tenant_table.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 32) | def downgrade() -> None:
FILE: backend/alembic_tenants/versions/3b9f09038764_add_read_only_kg_user.py
function upgrade (line 23) | def upgrade() -> None:
function downgrade (line 53) | def downgrade() -> None:
FILE: backend/alembic_tenants/versions/a4f6ee863c47_mapping_for_anonymous_user_path.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 31) | def downgrade() -> None:
FILE: backend/alembic_tenants/versions/ac842f85f932_new_column_user_tenant_mapping.py
function upgrade (line 21) | def upgrade() -> None:
function downgrade (line 43) | def downgrade() -> None:
FILE: backend/ee/onyx/access/access.py
function _get_access_for_document (line 27) | def _get_access_for_document(
function _get_access_for_documents (line 44) | def _get_access_for_documents(
function _collect_user_file_group_names (line 122) | def _collect_user_file_group_names(user_file: UserFile) -> set[str]:
function get_access_for_user_files_impl (line 134) | def get_access_for_user_files_impl(
function build_access_for_user_files_impl (line 152) | def build_access_for_user_files_impl(
function _get_acl_for_user (line 184) | def _get_acl_for_user(user: User, db_session: Session) -> set[str]:
FILE: backend/ee/onyx/access/hierarchy_access.py
function _get_user_external_group_ids (line 7) | def _get_user_external_group_ids(db_session: Session, user: User) -> lis...
FILE: backend/ee/onyx/auth/users.py
function verify_auth_setting (line 23) | def verify_auth_setting() -> None:
function get_default_admin_user_emails_ (line 33) | def get_default_admin_user_emails_() -> list[str]:
function current_cloud_superuser (line 40) | async def current_cloud_superuser(
function generate_anonymous_user_jwt_token (line 56) | def generate_anonymous_user_jwt_token(tenant_id: str) -> str:
function decode_anonymous_user_jwt_token (line 66) | def decode_anonymous_user_jwt_token(token: str) -> dict:
FILE: backend/ee/onyx/background/celery/tasks/beat_schedule.py
function get_cloud_tasks_to_schedule (line 98) | def get_cloud_tasks_to_schedule(beat_multiplier: float) -> list[dict[str...
function get_tasks_to_schedule (line 107) | def get_tasks_to_schedule() -> list[dict[str, Any]]:
FILE: backend/ee/onyx/background/celery/tasks/cleanup/tasks.py
function export_query_history_cleanup_task (line 23) | def export_query_history_cleanup_task(*, tenant_id: str) -> None:
FILE: backend/ee/onyx/background/celery/tasks/cloud/tasks.py
function cloud_beat_task_generator (line 27) | def cloud_beat_task_generator(
FILE: backend/ee/onyx/background/celery/tasks/doc_permission_syncing/tasks.py
function _get_fence_validation_block_expiration (line 106) | def _get_fence_validation_block_expiration() -> int:
function _fail_doc_permission_sync_attempt (line 127) | def _fail_doc_permission_sync_attempt(attempt_id: int, error_msg: str) -...
function _is_external_doc_permissions_sync_due (line 135) | def _is_external_doc_permissions_sync_due(cc_pair: ConnectorCredentialPa...
function check_for_doc_permissions_sync (line 184) | def check_for_doc_permissions_sync(self: Task, *, tenant_id: str) -> boo...
function try_creating_permissions_sync_task (line 282) | def try_creating_permissions_sync_task(
function connector_permission_sync_generator_task (line 382) | def connector_permission_sync_generator_task(
function element_update_permissions (line 651) | def element_update_permissions(
function validate_permission_sync_fences (line 732) | def validate_permission_sync_fences(
function validate_permission_sync_fence (line 779) | def validate_permission_sync_fence(
class PermissionSyncCallback (line 931) | class PermissionSyncCallback(IndexingHeartbeatInterface):
method __init__ (line 934) | def __init__(
method should_stop (line 955) | def should_stop(self) -> bool:
method progress (line 974) | def progress(self, tag: str, amount: int) -> None: # noqa: ARG002
function monitor_ccpair_permissions_taskset (line 1004) | def monitor_ccpair_permissions_taskset(
FILE: backend/ee/onyx/background/celery/tasks/external_group_syncing/group_sync_utils.py
function _get_all_cc_pair_ids_to_mark_as_group_synced (line 11) | def _get_all_cc_pair_ids_to_mark_as_group_synced(
function mark_all_relevant_cc_pairs_as_external_group_synced (line 23) | def mark_all_relevant_cc_pairs_as_external_group_synced(
FILE: backend/ee/onyx/background/celery/tasks/external_group_syncing/tasks.py
function _fail_external_group_sync_attempt (line 84) | def _fail_external_group_sync_attempt(attempt_id: int, error_msg: str) -...
function _get_fence_validation_block_expiration (line 92) | def _get_fence_validation_block_expiration() -> int:
function _is_external_group_sync_due (line 110) | def _is_external_group_sync_due(cc_pair: ConnectorCredentialPair) -> bool:
function check_for_external_group_sync (line 161) | def check_for_external_group_sync(self: Task, *, tenant_id: str) -> bool...
function try_creating_external_group_sync_task (line 256) | def try_creating_external_group_sync_task(
function connector_external_group_sync_generator_task (line 343) | def connector_external_group_sync_generator_task(
function _perform_external_group_sync (line 463) | def _perform_external_group_sync(
function validate_external_group_sync_fences (line 603) | def validate_external_group_sync_fences(
function validate_external_group_sync_fence (line 635) | def validate_external_group_sync_fence(
FILE: backend/ee/onyx/background/celery/tasks/hooks/tasks.py
function hook_execution_log_cleanup_task (line 20) | def hook_execution_log_cleanup_task(*, tenant_id: str) -> None: # noqa:...
FILE: backend/ee/onyx/background/celery/tasks/query_history/tasks.py
function export_query_history_task (line 36) | def export_query_history_task(
FILE: backend/ee/onyx/background/celery/tasks/tenant_provisioning/tasks.py
function check_available_tenants (line 48) | def check_available_tenants(self: Task) -> None: # noqa: ARG001
function _migrate_stale_pool_tenants (line 127) | def _migrate_stale_pool_tenants() -> None:
function pre_provision_tenant (line 167) | def pre_provision_tenant() -> bool:
FILE: backend/ee/onyx/background/celery/tasks/ttl_management/tasks.py
function perform_ttl_management_task (line 25) | def perform_ttl_management_task(
function check_ttl_management_task (line 64) | def check_ttl_management_task(*, tenant_id: str) -> None:
FILE: backend/ee/onyx/background/celery/tasks/usage_reporting/tasks.py
function generate_usage_report_task (line 23) | def generate_usage_report_task(
FILE: backend/ee/onyx/background/celery/tasks/vespa/tasks.py
function monitor_usergroup_taskset (line 20) | def monitor_usergroup_taskset(
FILE: backend/ee/onyx/background/celery_utils.py
function should_perform_chat_ttl_check (line 11) | def should_perform_chat_ttl_check(
FILE: backend/ee/onyx/background/task_name_builders.py
function name_chat_ttl_task (line 9) | def name_chat_ttl_task(
function query_history_task_name (line 16) | def query_history_task_name(start: datetime, end: datetime) -> str:
FILE: backend/ee/onyx/connectors/perm_sync_valid.py
function validate_confluence_perm_sync (line 6) | def validate_confluence_perm_sync(connector: ConfluenceConnector) -> None:
function validate_drive_perm_sync (line 12) | def validate_drive_perm_sync(connector: GoogleDriveConnector) -> None:
function validate_perm_sync (line 18) | def validate_perm_sync(connector: BaseConnector) -> None:
FILE: backend/ee/onyx/db/analytics.py
function fetch_query_analytics (line 23) | def fetch_query_analytics(
function fetch_per_user_query_analytics (line 59) | def fetch_per_user_query_analytics(
function fetch_onyxbot_analytics (line 98) | def fetch_onyxbot_analytics(
function fetch_persona_message_analytics (line 187) | def fetch_persona_message_analytics(
function fetch_persona_unique_users (line 216) | def fetch_persona_unique_users(
function fetch_assistant_message_analytics (line 245) | def fetch_assistant_message_analytics(
function fetch_assistant_unique_users (line 276) | def fetch_assistant_unique_users(
function fetch_assistant_unique_users_total (line 307) | def fetch_assistant_unique_users_total(
function user_can_view_assistant_stats (line 338) | def user_can_view_assistant_stats(
FILE: backend/ee/onyx/db/connector.py
function fetch_sources_with_connectors (line 11) | def fetch_sources_with_connectors(db_session: Session) -> list[DocumentS...
FILE: backend/ee/onyx/db/connector_credential_pair.py
function _delete_connector_credential_pair_user_groups_relationship__no_commit (line 16) | def _delete_connector_credential_pair_user_groups_relationship__no_commit(
function get_cc_pairs_by_source (line 35) | def get_cc_pairs_by_source(
function get_all_auto_sync_cc_pairs (line 62) | def get_all_auto_sync_cc_pairs(
FILE: backend/ee/onyx/db/document.py
function upsert_document_external_perms__no_commit (line 13) | def upsert_document_external_perms__no_commit(
function upsert_document_external_perms (line 53) | def upsert_document_external_perms(
FILE: backend/ee/onyx/db/document_set.py
function make_doc_set_private (line 14) | def make_doc_set_private(
function delete_document_set_privacy__no_commit (line 42) | def delete_document_set_privacy__no_commit(
function fetch_document_sets (line 54) | def fetch_document_sets(
FILE: backend/ee/onyx/db/external_perm.py
class ExternalUserGroup (line 22) | class ExternalUserGroup(BaseModel):
function delete_user__ext_group_for_user__no_commit (line 33) | def delete_user__ext_group_for_user__no_commit(
function delete_user__ext_group_for_cc_pair__no_commit (line 44) | def delete_user__ext_group_for_cc_pair__no_commit(
function delete_public_external_group_for_cc_pair__no_commit (line 55) | def delete_public_external_group_for_cc_pair__no_commit(
function mark_old_external_groups_as_stale (line 66) | def mark_old_external_groups_as_stale(
function upsert_external_groups (line 82) | def upsert_external_groups(
function remove_stale_external_groups (line 178) | def remove_stale_external_groups(
function fetch_external_groups_for_user (line 197) | def fetch_external_groups_for_user(
function fetch_external_groups_for_user_email_and_group_ids (line 208) | def fetch_external_groups_for_user_email_and_group_ids(
function fetch_public_external_group_ids (line 226) | def fetch_public_external_group_ids(
FILE: backend/ee/onyx/db/hierarchy.py
function _build_hierarchy_access_filter (line 20) | def _build_hierarchy_access_filter(
function _get_accessible_hierarchy_nodes_for_source (line 43) | def _get_accessible_hierarchy_nodes_for_source(
FILE: backend/ee/onyx/db/license.py
class SeatAvailabilityResult (line 28) | class SeatAvailabilityResult(NamedTuple):
function get_license (line 40) | def get_license(db_session: Session) -> License | None:
function upsert_license (line 53) | def upsert_license(db_session: Session, license_data: str) -> License:
function delete_license (line 81) | def delete_license(db_session: Session) -> bool:
function get_used_seats (line 105) | def get_used_seats(tenant_id: str | None = None) -> int:
function get_cached_license_metadata (line 142) | def get_cached_license_metadata(tenant_id: str | None = None) -> License...
function invalidate_license_cache (line 167) | def invalidate_license_cache(tenant_id: str | None = None) -> None:
function update_license_cache (line 183) | def update_license_cache(
function refresh_license_cache (line 238) | def refresh_license_cache(
function get_license_metadata (line 278) | def get_license_metadata(
function check_seat_availability (line 301) | def check_seat_availability(
FILE: backend/ee/onyx/db/persona.py
function update_persona_access (line 14) | def update_persona_access(
FILE: backend/ee/onyx/db/query_history.py
function _build_filter_conditions (line 27) | def _build_filter_conditions(
function get_total_filtered_chat_sessions_count (line 78) | def get_total_filtered_chat_sessions_count(
function get_page_of_chat_sessions (line 93) | def get_page_of_chat_sessions(
function fetch_chat_sessions_eagerly_by_time (line 133) | def fetch_chat_sessions_eagerly_by_time(
function get_all_query_history_export_tasks (line 179) | def get_all_query_history_export_tasks(
FILE: backend/ee/onyx/db/saml.py
function upsert_saml_account (line 16) | def upsert_saml_account(
function get_saml_account (line 48) | async def get_saml_account(
function expire_saml_account (line 68) | async def expire_saml_account(
FILE: backend/ee/onyx/db/scim.py
class ScimDAL (line 54) | class ScimDAL(DAL):
method create_token (line 66) | def create_token(
method get_active_token (line 97) | def get_active_token(self) -> ScimToken | None:
method get_token_by_hash (line 103) | def get_token_by_hash(self, hashed_token: str) -> ScimToken | None:
method revoke_token (line 109) | def revoke_token(self, token_id: int) -> None:
method update_token_last_used (line 120) | def update_token_last_used(self, token_id: int) -> None:
method create_user_mapping (line 130) | def create_user_mapping(
method get_user_mapping_by_external_id (line 157) | def get_user_mapping_by_external_id(
method get_user_mapping_by_user_id (line 165) | def get_user_mapping_by_user_id(self, user_id: UUID) -> ScimUserMappin...
method list_user_mappings (line 171) | def list_user_mappings(
method update_user_mapping_external_id (line 201) | def update_user_mapping_external_id(
method delete_user_mapping (line 217) | def delete_user_mapping(self, mapping_id: int) -> None:
method get_user (line 229) | def get_user(self, user_id: UUID) -> User | None:
method get_user_by_email (line 235) | def get_user_by_email(self, email: str) -> User | None:
method add_user (line 241) | def add_user(self, user: User) -> None:
method update_user (line 246) | def update_user(
method deactivate_user (line 262) | def deactivate_user(self, user: User) -> None:
method list_users (line 266) | def list_users(
method sync_user_external_id (line 331) | def sync_user_external_id(
method _get_user_mappings_batch (line 370) | def _get_user_mappings_batch(
method get_user_groups (line 381) | def get_user_groups(self, user_id: UUID) -> list[tuple[int, str]]:
method get_users_groups_batch (line 402) | def get_users_groups_batch(
method create_group_mapping (line 441) | def create_group_mapping(
method get_group_mapping_by_external_id (line 452) | def get_group_mapping_by_external_id(
method get_group_mapping_by_group_id (line 460) | def get_group_mapping_by_group_id(
method list_group_mappings (line 470) | def list_group_mappings(
method delete_group_mapping (line 501) | def delete_group_mapping(self, mapping_id: int) -> None:
method get_group (line 513) | def get_group(self, group_id: int) -> UserGroup | None:
method get_group_by_name (line 520) | def get_group_by_name(self, name: str) -> UserGroup | None:
method add_group (line 524) | def add_group(self, group: UserGroup) -> None:
method add_permission_grant_to_group (line 529) | def add_permission_grant_to_group(
method update_group (line 545) | def update_group(
method delete_group (line 556) | def delete_group(self, group: UserGroup) -> None:
method list_groups (line 560) | def list_groups(
method get_group_members (line 606) | def get_group_members(self, group_id: int) -> list[tuple[UUID, str | N...
method validate_member_ids (line 634) | def validate_member_ids(self, uuids: list[UUID]) -> list[UUID]:
method upsert_group_members (line 651) | def upsert_group_members(self, group_id: int, user_ids: list[UUID]) ->...
method replace_group_members (line 666) | def replace_group_members(self, group_id: int, user_ids: list[UUID]) -...
method remove_group_members (line 673) | def remove_group_members(self, group_id: int, user_ids: list[UUID]) ->...
method delete_group_with_members (line 684) | def delete_group_with_members(self, group: UserGroup) -> None:
method sync_group_external_id (line 691) | def sync_group_external_id(
method _get_group_external_ids (line 707) | def _get_group_external_ids(self, group_ids: list[int]) -> dict[int, s...
function _apply_scim_string_op (line 724) | def _apply_scim_string_op(
FILE: backend/ee/onyx/db/search.py
function create_search_query (line 12) | def create_search_query(
function fetch_search_queries_for_user (line 36) | def fetch_search_queries_for_user(
FILE: backend/ee/onyx/db/standard_answer.py
function check_category_validity (line 15) | def check_category_validity(category_name: str) -> bool:
function insert_standard_answer_category (line 29) | def insert_standard_answer_category(
function insert_standard_answer (line 41) | def insert_standard_answer(
function update_standard_answer (line 69) | def update_standard_answer(
function remove_standard_answer (line 102) | def remove_standard_answer(
function update_standard_answer_category (line 116) | def update_standard_answer_category(
function fetch_standard_answer_category (line 141) | def fetch_standard_answer_category(
function fetch_standard_answer_categories_by_ids (line 152) | def fetch_standard_answer_categories_by_ids(
function fetch_standard_answer_categories (line 163) | def fetch_standard_answer_categories(
function fetch_standard_answer (line 169) | def fetch_standard_answer(
function fetch_standard_answers (line 178) | def fetch_standard_answers(db_session: Session) -> Sequence[StandardAnsw...
function create_initial_default_standard_answer_category (line 184) | def create_initial_default_standard_answer_category(db_session: Session)...
function fetch_standard_answer_categories_by_names (line 206) | def fetch_standard_answer_categories_by_names(
function find_matching_standard_answers (line 217) | def find_matching_standard_answers(
FILE: backend/ee/onyx/db/token_limit.py
function _add_user_filters (line 20) | def _add_user_filters(stmt: Select, user: User, get_editable: bool = Tru...
function fetch_all_user_group_token_rate_limits_by_group (line 72) | def fetch_all_user_group_token_rate_limits_by_group(
function insert_user_group_token_rate_limit (line 87) | def insert_user_group_token_rate_limit(
function fetch_user_group_token_rate_limits_for_user (line 110) | def fetch_user_group_token_rate_limits_for_user(
FILE: backend/ee/onyx/db/usage_export.py
function get_empty_chat_messages_entries__paginated (line 23) | def get_empty_chat_messages_entries__paginated(
function get_all_empty_chat_message_entries (line 79) | def get_all_empty_chat_message_entries(
function get_all_usage_reports (line 102) | def get_all_usage_reports(db_session: Session) -> list[UsageReportMetada...
function get_usage_report_data (line 127) | def get_usage_report_data(
function write_usage_report (line 148) | def write_usage_report(
FILE: backend/ee/onyx/db/user_group.py
function _cleanup_user__user_group_relationships__no_commit (line 49) | def _cleanup_user__user_group_relationships__no_commit(
function _cleanup_credential__user_group_relationships__no_commit (line 66) | def _cleanup_credential__user_group_relationships__no_commit(
function _cleanup_llm_provider__user_group_relationships__no_commit (line 76) | def _cleanup_llm_provider__user_group_relationships__no_commit(
function _cleanup_persona__user_group_relationships__no_commit (line 85) | def _cleanup_persona__user_group_relationships__no_commit(
function _cleanup_token_rate_limit__user_group_relationships__no_commit (line 94) | def _cleanup_token_rate_limit__user_group_relationships__no_commit(
function _cleanup_user_group__cc_pair_relationships__no_commit (line 109) | def _cleanup_user_group__cc_pair_relationships__no_commit(
function _cleanup_document_set__user_group_relationships__no_commit (line 125) | def _cleanup_document_set__user_group_relationships__no_commit(
function validate_object_creation_for_user (line 136) | def validate_object_creation_for_user(
function fetch_user_group (line 203) | def fetch_user_group(db_session: Session, user_group_id: int) -> UserGro...
function _add_user_group_snapshot_eager_loads (line 208) | def _add_user_group_snapshot_eager_loads(
function fetch_user_groups (line 258) | def fetch_user_groups(
function fetch_user_groups_for_user (line 292) | def fetch_user_groups_for_user(
function construct_document_id_select_by_usergroup (line 314) | def construct_document_id_select_by_usergroup(
function fetch_documents_for_user_group_paginated (line 350) | def fetch_documents_for_user_group_paginated(
function fetch_user_groups_for_documents (line 391) | def fetch_user_groups_for_documents(
function _check_user_group_is_modifiable (line 435) | def _check_user_group_is_modifiable(user_group: UserGroup) -> None:
function _add_user__user_group_relationships__no_commit (line 442) | def _add_user__user_group_relationships__no_commit(
function _add_user_group__cc_pair_relationships__no_commit (line 469) | def _add_user_group__cc_pair_relationships__no_commit(
function insert_user_group (line 483) | def insert_user_group(db_session: Session, user_group: UserGroupCreate) ...
function _mark_user_group__cc_pair_relationships_outdated__no_commit (line 519) | def _mark_user_group__cc_pair_relationships_outdated__no_commit(
function _validate_curator_status__no_commit (line 532) | def _validate_curator_status__no_commit(
function remove_curator_status__no_commit (line 556) | def remove_curator_status__no_commit(db_session: Session, user: User) ->...
function _validate_curator_relationship_update_requester (line 566) | def _validate_curator_relationship_update_requester(
function _validate_curator_relationship_update_request (line 599) | def _validate_curator_relationship_update_request(
function update_user_curator_relationship (line 642) | def update_user_curator_relationship(
function add_users_to_user_group (line 693) | def add_users_to_user_group(
function update_user_group (line 735) | def update_user_group(
function rename_user_group (line 830) | def rename_user_group(
function prepare_user_group_for_deletion (line 857) | def prepare_user_group_for_deletion(db_session: Session, user_group_id: ...
function delete_user_group (line 915) | def delete_user_group(db_session: Session, user_group: UserGroup) -> None:
function mark_user_group_as_synced (line 923) | def mark_user_group_as_synced(db_session: Session, user_group: UserGroup...
function delete_user_group_cc_pair_relationship__no_commit (line 932) | def delete_user_group_cc_pair_relationship__no_commit(
FILE: backend/ee/onyx/external_permissions/confluence/doc_sync.py
function confluence_doc_sync (line 26) | def confluence_doc_sync(
FILE: backend/ee/onyx/external_permissions/confluence/group_sync.py
function _build_group_member_email_map (line 20) | def _build_group_member_email_map(
function _build_group_member_email_map_from_onyx_users (line 72) | def _build_group_member_email_map_from_onyx_users(
function _build_final_group_to_member_email_map (line 123) | def _build_final_group_to_member_email_map(
function confluence_group_sync (line 158) | def confluence_group_sync(
FILE: backend/ee/onyx/external_permissions/confluence/page_access.py
function _extract_read_access_restrictions (line 15) | def _extract_read_access_restrictions(
function get_page_restrictions (line 72) | def get_page_restrictions(
FILE: backend/ee/onyx/external_permissions/confluence/space_access.py
function _get_server_space_permissions (line 18) | def _get_server_space_permissions(
function _get_cloud_space_permissions (line 78) | def _get_cloud_space_permissions(
function get_space_permission (line 113) | def get_space_permission(
function get_all_space_permissions (line 151) | def get_all_space_permissions(
FILE: backend/ee/onyx/external_permissions/github/doc_sync.py
function github_doc_sync (line 34) | def github_doc_sync(
function _check_repository_for_changes (line 145) | def _check_repository_for_changes(
function _is_repo_visibility_changed_from_groups (line 178) | def _is_repo_visibility_changed_from_groups(
function _teams_updated_from_groups (line 231) | def _teams_updated_from_groups(
FILE: backend/ee/onyx/external_permissions/github/group_sync.py
function github_group_sync (line 14) | def github_group_sync(
FILE: backend/ee/onyx/external_permissions/github/utils.py
class GitHubVisibility (line 28) | class GitHubVisibility(Enum):
function _run_with_retry (line 43) | def _run_with_retry(
class UserInfo (line 76) | class UserInfo(BaseModel):
class TeamInfo (line 84) | class TeamInfo(BaseModel):
function _fetch_organization_members (line 92) | def _fetch_organization_members(
function _fetch_repository_teams_detailed (line 127) | def _fetch_repository_teams_detailed(
function fetch_repository_team_slugs (line 172) | def fetch_repository_team_slugs(
function _get_collaborators_and_outside_collaborators (line 197) | def _get_collaborators_and_outside_collaborators(
function form_collaborators_group_id (line 249) | def form_collaborators_group_id(repository_id: int) -> str:
function form_organization_group_id (line 258) | def form_organization_group_id(organization_id: int) -> str:
function form_outside_collaborators_group_id (line 269) | def form_outside_collaborators_group_id(repository_id: int) -> str:
function get_repository_visibility (line 280) | def get_repository_visibility(repo: Repository) -> GitHubVisibility:
function get_external_access_permission (line 302) | def get_external_access_permission(
function get_external_user_group (line 390) | def get_external_user_group(
FILE: backend/ee/onyx/external_permissions/gmail/doc_sync.py
function _get_slim_doc_generator (line 21) | def _get_slim_doc_generator(
function gmail_doc_sync (line 40) | def gmail_doc_sync(
FILE: backend/ee/onyx/external_permissions/google_drive/doc_sync.py
function _get_slim_doc_generator (line 30) | def _get_slim_doc_generator(
function _merge_permissions_lists (line 49) | def _merge_permissions_lists(
function get_external_access_for_raw_gdrive_file (line 66) | def get_external_access_for_raw_gdrive_file(
function get_external_access_for_folder (line 208) | def get_external_access_for_folder(
function gdrive_doc_sync (line 303) | def gdrive_doc_sync(
FILE: backend/ee/onyx/external_permissions/google_drive/folder_retrieval.py
function get_folder_permissions_by_ids (line 24) | def get_folder_permissions_by_ids(
function get_modified_folders (line 47) | def get_modified_folders(
FILE: backend/ee/onyx/external_permissions/google_drive/group_sync.py
class FolderInfo (line 34) | class FolderInfo(BaseModel):
function _get_all_folders (line 39) | def _get_all_folders(
function _drive_folder_to_onyx_group (line 124) | def _drive_folder_to_onyx_group(
function _get_drive_members (line 164) | def _get_drive_members(
function _drive_member_map_to_onyx_groups (line 229) | def _drive_member_map_to_onyx_groups(
function _get_all_google_groups (line 250) | def _get_all_google_groups(
function _google_group_to_onyx_group (line 268) | def _google_group_to_onyx_group(
function _map_group_email_to_member_emails (line 290) | def _map_group_email_to_member_emails(
function _build_onyx_groups (line 312) | def _build_onyx_groups(
function gdrive_group_sync (line 383) | def gdrive_group_sync(
FILE: backend/ee/onyx/external_permissions/google_drive/models.py
class PermissionType (line 7) | class PermissionType(str, Enum):
class GoogleDrivePermissionDetails (line 14) | class GoogleDrivePermissionDetails(BaseModel):
class GoogleDrivePermission (line 25) | class GoogleDrivePermission(BaseModel):
method from_drive_permission (line 39) | def from_drive_permission(
method inherited_from (line 66) | def inherited_from(self) -> str | None:
FILE: backend/ee/onyx/external_permissions/google_drive/permission_retrieval.py
function get_permissions_by_ids (line 12) | def get_permissions_by_ids(
FILE: backend/ee/onyx/external_permissions/jira/doc_sync.py
function jira_doc_sync (line 18) | def jira_doc_sync(
FILE: backend/ee/onyx/external_permissions/jira/group_sync.py
function _fetch_group_member_page (line 22) | def _fetch_group_member_page(
function _get_group_member_emails (line 59) | def _get_group_member_emails(
function jira_group_sync (line 102) | def jira_group_sync(
FILE: backend/ee/onyx/external_permissions/jira/models.py
class Permission (line 11) | class Permission(BaseModel):
class User (line 17) | class User(BaseModel):
FILE: backend/ee/onyx/external_permissions/jira/page_access.py
function _get_role_id (line 21) | def _get_role_id(holder: Holder) -> str | None:
function _build_holder_map (line 25) | def _build_holder_map(permissions: list[dict]) -> dict[str, list[Holder]]:
function _get_user_emails (line 97) | def _get_user_emails(user_holders: list[Holder]) -> list[str]:
function _get_user_emails_and_groups_from_project_roles (line 119) | def _get_user_emails_and_groups_from_project_roles(
function _build_external_access_from_holder_map (line 189) | def _build_external_access_from_holder_map(
function get_project_permissions (line 254) | def get_project_permissions(
FILE: backend/ee/onyx/external_permissions/perm_sync_types.py
class FetchAllDocumentsFunction (line 17) | class FetchAllDocumentsFunction(Protocol):
method __call__ (line 24) | def __call__(
class FetchAllDocumentsIdsFunction (line 34) | class FetchAllDocumentsIdsFunction(Protocol):
method __call__ (line 41) | def __call__(
FILE: backend/ee/onyx/external_permissions/post_query_censoring.py
function _get_all_censoring_enabled_sources (line 13) | def _get_all_censoring_enabled_sources() -> set[DocumentSource]:
function _post_query_chunk_censoring (line 35) | def _post_query_chunk_censoring(
FILE: backend/ee/onyx/external_permissions/salesforce/postprocessing.py
function _get_dummy_object_access_map (line 25) | def _get_dummy_object_access_map(
function _get_objects_access_for_user_email_from_salesforce (line 37) | def _get_objects_access_for_user_email_from_salesforce(
function _extract_salesforce_object_id_from_url (line 75) | def _extract_salesforce_object_id_from_url(url: str) -> str:
function _get_object_ranges_for_chunk (line 79) | def _get_object_ranges_for_chunk(
function _create_empty_censored_chunk (line 103) | def _create_empty_censored_chunk(uncensored_chunk: InferenceChunk) -> In...
function _update_censored_chunk (line 117) | def _update_censored_chunk(
function censor_salesforce_chunks (line 146) | def censor_salesforce_chunks(
function _get_objects_access_for_user_email (line 219) | def _get_objects_access_for_user_email(
FILE: backend/ee/onyx/external_permissions/salesforce/utils.py
function get_any_salesforce_client_for_doc_id (line 13) | def get_any_salesforce_client_for_doc_id(
function _query_salesforce_user_id (line 46) | def _query_salesforce_user_id(sf_client: Salesforce, user_email: str) ->...
function get_salesforce_user_id_from_email (line 66) | def get_salesforce_user_id_from_email(
function get_objects_access_for_user_id (line 112) | def get_objects_access_for_user_id(
function _get_salesforce_client_for_doc_id (line 142) | def _get_salesforce_client_for_doc_id(db_session: Session, doc_id: str) ...
FILE: backend/ee/onyx/external_permissions/sharepoint/doc_sync.py
function sharepoint_doc_sync (line 18) | def sharepoint_doc_sync(
FILE: backend/ee/onyx/external_permissions/sharepoint/group_sync.py
function sharepoint_group_sync (line 18) | def sharepoint_group_sync(
FILE: backend/ee/onyx/external_permissions/sharepoint/permission_utils.py
function _graph_api_get (line 45) | def _graph_api_get(
function _iter_graph_collection (line 84) | def _iter_graph_collection(
function _normalize_email (line 98) | def _normalize_email(email: str) -> str:
class SharepointGroup (line 104) | class SharepointGroup(BaseModel):
class GroupsResult (line 112) | class GroupsResult(BaseModel):
function _get_azuread_group_guid_by_name (line 117) | def _get_azuread_group_guid_by_name(
function _extract_guid_from_claims_token (line 137) | def _extract_guid_from_claims_token(claims_token: str) -> str | None:
function _get_group_guid_from_identifier (line 155) | def _get_group_guid_from_identifier(
function _get_security_group_owners (line 179) | def _get_security_group_owners(graph_client: GraphClient, group_id: str)...
function _get_sharepoint_list_item_id (line 220) | def _get_sharepoint_list_item_id(drive_item: DriveItem) -> str | None:
function _is_public_item (line 253) | def _is_public_item(
function _is_public_login_name (line 276) | def _is_public_login_name(login_name: str) -> bool:
function _get_group_name_with_suffix (line 292) | def _get_group_name_with_suffix(
function _get_sharepoint_groups (line 299) | def _get_sharepoint_groups(
function _get_azuread_groups (line 348) | def _get_azuread_groups(
function _get_groups_and_members_recursively (line 442) | def _get_groups_and_members_recursively(
function get_external_access_from_sharepoint (line 504) | def get_external_access_from_sharepoint(
function _enumerate_ad_groups_paginated (line 651) | def _enumerate_ad_groups_paginated(
function get_sharepoint_external_groups (line 704) | def get_sharepoint_external_groups(
FILE: backend/ee/onyx/external_permissions/slack/channel_access.py
function get_channel_access (line 10) | def get_channel_access(
FILE: backend/ee/onyx/external_permissions/slack/doc_sync.py
function _fetch_workspace_permissions (line 26) | def _fetch_workspace_permissions(
function _fetch_channel_permissions (line 41) | def _fetch_channel_permissions(
function _get_slack_document_access (line 105) | def _get_slack_document_access(
function slack_doc_sync (line 140) | def slack_doc_sync(
FILE: backend/ee/onyx/external_permissions/slack/group_sync.py
function _get_slack_group_ids (line 22) | def _get_slack_group_ids(
function _get_slack_group_members_email (line 32) | def _get_slack_group_members_email(
function slack_group_sync (line 57) | def slack_group_sync(
FILE: backend/ee/onyx/external_permissions/slack/utils.py
function fetch_user_id_to_email_map (line 6) | def fetch_user_id_to_email_map(
FILE: backend/ee/onyx/external_permissions/sync_params.py
class DocSyncConfig (line 48) | class DocSyncConfig(BaseModel):
class GroupSyncConfig (line 54) | class GroupSyncConfig(BaseModel):
class CensoringConfig (line 60) | class CensoringConfig(BaseModel):
class SyncConfig (line 64) | class SyncConfig(BaseModel):
function mock_doc_sync (line 74) | def mock_doc_sync(
function source_requires_doc_sync (line 185) | def source_requires_doc_sync(source: DocumentSource) -> bool:
function source_requires_external_group_sync (line 192) | def source_requires_external_group_sync(source: DocumentSource) -> bool:
function get_source_perm_sync_config (line 199) | def get_source_perm_sync_config(source: DocumentSource) -> SyncConfig | ...
function source_group_sync_is_cc_pair_agnostic (line 204) | def source_group_sync_is_cc_pair_agnostic(source: DocumentSource) -> bool:
function get_all_cc_pair_agnostic_group_sync_sources (line 216) | def get_all_cc_pair_agnostic_group_sync_sources() -> set[DocumentSource]:
function check_if_valid_sync_source (line 226) | def check_if_valid_sync_source(source_type: DocumentSource) -> bool:
function get_all_censoring_enabled_sources (line 230) | def get_all_censoring_enabled_sources() -> set[DocumentSource]:
function source_should_fetch_permissions_during_indexing (line 239) | def source_should_fetch_permissions_during_indexing(source: DocumentSour...
FILE: backend/ee/onyx/external_permissions/teams/doc_sync.py
function teams_doc_sync (line 19) | def teams_doc_sync(
FILE: backend/ee/onyx/external_permissions/utils.py
function generic_doc_sync (line 19) | def generic_doc_sync(
FILE: backend/ee/onyx/feature_flags/factory.py
function get_posthog_feature_flag_provider (line 5) | def get_posthog_feature_flag_provider() -> FeatureFlagProvider:
FILE: backend/ee/onyx/feature_flags/posthog_provider.py
class PostHogFeatureFlagProvider (line 11) | class PostHogFeatureFlagProvider(FeatureFlagProvider):
method feature_enabled (line 19) | def feature_enabled(
FILE: backend/ee/onyx/hooks/executor.py
class _HttpOutcome (line 89) | class _HttpOutcome(BaseModel):
function _lookup_hook (line 101) | def _lookup_hook(
function _process_response (line 122) | def _process_response(
function _persist_result (line 221) | def _persist_result(
function _execute_hook_inner (line 271) | def _execute_hook_inner(
function _execute_hook_impl (line 357) | def _execute_hook_impl(
FILE: backend/ee/onyx/main.py
function lifespan (line 68) | async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
function get_application (line 81) | def get_application() -> FastAPI:
FILE: backend/ee/onyx/onyxbot/slack/handlers/handle_standard_answers.py
function build_standard_answer_blocks (line 32) | def build_standard_answer_blocks(
function oneoff_standard_answers (line 48) | def oneoff_standard_answers(
function _handle_standard_answers (line 79) | def _handle_standard_answers(
FILE: backend/ee/onyx/search/process_search_query.py
function _run_single_search (line 40) | def _run_single_search(
function stream_search_query (line 66) | def stream_search_query(
function gather_search_stream (line 255) | def gather_search_stream(
FILE: backend/ee/onyx/secondary_llm_flows/query_expansion.py
function _clean_keyword_line (line 17) | def _clean_keyword_line(line: str) -> str:
function expand_keywords (line 30) | def expand_keywords(
FILE: backend/ee/onyx/secondary_llm_flows/search_flow_classification.py
function classify_is_search_flow (line 16) | def classify_is_search_flow(
FILE: backend/ee/onyx/server/analytics/api.py
class QueryAnalyticsResponse (line 32) | class QueryAnalyticsResponse(BaseModel):
function get_query_analytics (line 40) | def get_query_analytics(
class UserAnalyticsResponse (line 65) | class UserAnalyticsResponse(BaseModel):
function get_user_analytics (line 71) | def get_user_analytics(
class OnyxbotAnalyticsResponse (line 98) | class OnyxbotAnalyticsResponse(BaseModel):
function get_onyxbot_analytics (line 105) | def get_onyxbot_analytics(
class PersonaMessageAnalyticsResponse (line 133) | class PersonaMessageAnalyticsResponse(BaseModel):
function get_persona_messages (line 140) | def get_persona_messages(
class PersonaUniqueUsersResponse (line 171) | class PersonaUniqueUsersResponse(BaseModel):
function get_persona_unique_users (line 178) | def get_persona_unique_users(
class AssistantDailyUsageResponse (line 204) | class AssistantDailyUsageResponse(BaseModel):
class AssistantStatsResponse (line 210) | class AssistantStatsResponse(BaseModel):
function get_assistant_stats (line 217) | def get_assistant_stats(
FILE: backend/ee/onyx/server/auth_check.py
function check_ee_router_auth (line 31) | def check_ee_router_auth(
FILE: backend/ee/onyx/server/billing/api.py
function _is_billing_circuit_open (line 81) | def _is_billing_circuit_open() -> bool:
function _open_billing_circuit (line 97) | def _open_billing_circuit() -> None:
function _close_billing_circuit (line 118) | def _close_billing_circuit() -> None:
function _get_license_data (line 132) | def _get_license_data(db_session: Session) -> str | None:
function _get_tenant_id (line 140) | def _get_tenant_id() -> str | None:
function create_checkout_session (line 148) | async def create_checkout_session(
function create_customer_portal_session (line 192) | async def create_customer_portal_session(
function get_billing_information (line 218) | async def get_billing_information(
function update_seats (line 259) | async def update_seats(
function get_stripe_publishable_key (line 297) | async def get_stripe_publishable_key() -> StripePublishableKeyResponse:
class ResetConnectionResponse (line 360) | class ResetConnectionResponse(BaseModel):
function reset_stripe_connection (line 366) | async def reset_stripe_connection(
FILE: backend/ee/onyx/server/billing/models.py
class CreateCheckoutSessionRequest (line 9) | class CreateCheckoutSessionRequest(BaseModel):
class CreateCheckoutSessionResponse (line 17) | class CreateCheckoutSessionResponse(BaseModel):
class CreateCustomerPortalSessionRequest (line 23) | class CreateCustomerPortalSessionRequest(BaseModel):
class CreateCustomerPortalSessionResponse (line 29) | class CreateCustomerPortalSessionResponse(BaseModel):
class BillingInformationResponse (line 35) | class BillingInformationResponse(BaseModel):
class SubscriptionStatusResponse (line 52) | class SubscriptionStatusResponse(BaseModel):
class SeatUpdateRequest (line 58) | class SeatUpdateRequest(BaseModel):
class SeatUpdateResponse (line 64) | class SeatUpdateResponse(BaseModel):
class StripePublishableKeyResponse (line 74) | class StripePublishableKeyResponse(BaseModel):
FILE: backend/ee/onyx/server/billing/service.py
function _get_proxy_headers (line 36) | def _get_proxy_headers(license_data: str | None) -> dict[str, str]:
function _get_direct_headers (line 47) | def _get_direct_headers() -> dict[str, str]:
function _get_base_url (line 59) | def _get_base_url() -> str:
function _get_headers (line 66) | def _get_headers(license_data: str | None) -> dict[str, str]:
function _make_billing_request (line 73) | async def _make_billing_request(
function create_checkout_session (line 137) | async def create_checkout_session(
function create_customer_portal_session (line 178) | async def create_customer_portal_session(
function get_billing_information (line 209) | async def get_billing_information(
function update_seat_count (line 241) | async def update_seat_count(
FILE: backend/ee/onyx/server/documents/cc_pair.py
function get_cc_pair_latest_sync (line 33) | def get_cc_pair_latest_sync(
function sync_cc_pair (line 54) | def sync_cc_pair(
function get_cc_pair_latest_group_sync (line 107) | def get_cc_pair_latest_group_sync(
function sync_cc_pair_groups (line 128) | def sync_cc_pair_groups(
FILE: backend/ee/onyx/server/enterprise_settings/api.py
class RefreshTokenData (line 49) | class RefreshTokenData(BaseModel):
method __init__ (line 55) | def __init__(self, **data: Any) -> None:
function refresh_access_token (line 66) | async def refresh_access_token(
function admin_ee_put_settings (line 122) | def admin_ee_put_settings(
function ee_fetch_settings (line 129) | def ee_fetch_settings() -> EnterpriseSettings:
function put_logo (line 139) | def put_logo(
function fetch_logo_helper (line 147) | def fetch_logo_helper(db_session: Session) -> Response: # noqa: ARG001
function fetch_logotype_helper (line 167) | def fetch_logotype_helper(db_session: Session) -> Response: # noqa: ARG001
function fetch_logotype (line 183) | def fetch_logotype(db_session: Session = Depends(get_session)) -> Response:
function fetch_logo (line 188) | def fetch_logo(
function upload_custom_analytics_script (line 198) | def upload_custom_analytics_script(
function fetch_custom_analytics_script (line 208) | def fetch_custom_analytics_script() -> str | None:
function _get_scim_dal (line 217) | def _get_scim_dal(db_session: Session = Depends(get_session)) -> ScimDAL:
function get_active_scim_token (line 222) | def get_active_scim_token(
function create_scim_token (line 251) | def create_scim_token(
FILE: backend/ee/onyx/server/enterprise_settings/models.py
class NavigationItem (line 9) | class NavigationItem(BaseModel):
method model_validate (line 20) | def model_validate(cls, *args: Any, **kwargs: Any) -> "NavigationItem":
class LogoDisplayStyle (line 27) | class LogoDisplayStyle(str, Enum):
class EnterpriseSettings (line 33) | class EnterpriseSettings(BaseModel):
method check_validity (line 57) | def check_validity(self) -> None:
class AnalyticsScriptUpload (line 61) | class AnalyticsScriptUpload(BaseModel):
FILE: backend/ee/onyx/server/enterprise_settings/store.py
function load_settings (line 28) | def load_settings() -> EnterpriseSettings:
function store_settings (line 48) | def store_settings(settings: EnterpriseSettings) -> None:
function load_runtime_settings (line 54) | def load_runtime_settings() -> EnterpriseSettings:
function load_analytics_script (line 70) | def load_analytics_script() -> str | None:
function store_analytics_script (line 78) | def store_analytics_script(analytics_script_upload: AnalyticsScriptUploa...
function is_valid_file_type (line 88) | def is_valid_file_type(filename: str) -> bool:
function guess_file_type (line 93) | def guess_file_type(filename: str) -> str:
function upload_logo (line 101) | def upload_logo(file: UploadFile | str, is_logotype: bool = False) -> bool:
function get_logo_filename (line 140) | def get_logo_filename() -> str:
function get_logotype_filename (line 144) | def get_logotype_filename() -> str:
FILE: backend/ee/onyx/server/evals/api.py
function eval_run (line 18) | def eval_run(
FILE: backend/ee/onyx/server/features/hooks/api.py
function _check_ssrf_safety (line 43) | def _check_ssrf_safety(endpoint_url: str) -> None:
function _hook_to_response (line 60) | def _hook_to_response(hook: Hook, creator_email: str | None = None) -> H...
function _get_hook_or_404 (line 83) | def _get_hook_or_404(
function _raise_for_validation_failure (line 98) | def _raise_for_validation_failure(validation: HookValidateResponse) -> N...
function _validate_endpoint (line 113) | def _validate_endpoint(
function get_hook_point_specs (line 180) | def get_hook_point_specs(
function list_hooks (line 201) | def list_hooks(
function create_hook (line 211) | def create_hook(
function get_hook (line 247) | def get_hook(
function update_hook (line 258) | def update_hook(
function delete_hook (line 329) | def delete_hook(
function activate_hook (line 340) | def activate_hook(
function validate_hook (line 382) | def validate_hook(
function deactivate_hook (line 410) | def deactivate_hook(
function list_hook_execution_logs (line 432) | def list_hook_execution_logs(
FILE: backend/ee/onyx/server/license/api.py
function _strip_pem_delimiters (line 51) | def _strip_pem_delimiters(content: str) -> str:
function get_license_status (line 62) | async def get_license_status(
function get_seat_usage (line 86) | async def get_seat_usage(
function claim_license (line 108) | async def claim_license(
function upload_license (line 216) | async def upload_license(
function refresh_license_cache_endpoint (line 265) | async def refresh_license_cache_endpoint(
function delete_license (line 294) | async def delete_license(
FILE: backend/ee/onyx/server/license/models.py
class PlanType (line 9) | class PlanType(str, Enum):
class LicenseSource (line 14) | class LicenseSource(str, Enum):
class LicensePayload (line 19) | class LicensePayload(BaseModel):
class LicenseData (line 35) | class LicenseData(BaseModel):
class LicenseMetadata (line 42) | class LicenseMetadata(BaseModel):
class LicenseStatusResponse (line 58) | class LicenseStatusResponse(BaseModel):
class LicenseResponse (line 72) | class LicenseResponse(BaseModel):
class LicenseUploadResponse (line 80) | class LicenseUploadResponse(BaseModel):
class SeatUsageResponse (line 87) | class SeatUsageResponse(BaseModel):
FILE: backend/ee/onyx/server/manage/standard_answer.py
function create_standard_answer (line 27) | def create_standard_answer(
function list_standard_answers (line 44) | def list_standard_answers(
function patch_standard_answer (line 56) | def patch_standard_answer(
function delete_standard_answer (line 83) | def delete_standard_answer(
function create_standard_answer_category (line 95) | def create_standard_answer_category(
function list_standard_answer_categories (line 108) | def list_standard_answer_categories(
function patch_standard_answer_category (line 122) | def patch_standard_answer_category(
FILE: backend/ee/onyx/server/middleware/license_enforcement.py
function _is_path_allowed (line 64) | def _is_path_allowed(path: str) -> bool:
function _is_ee_only_path (line 71) | def _is_ee_only_path(path: str) -> bool:
function add_license_enforcement_middleware (line 76) | def add_license_enforcement_middleware(
FILE: backend/ee/onyx/server/middleware/tenant_tracking.py
function add_api_server_tenant_id_middleware (line 21) | def add_api_server_tenant_id_middleware(
function _get_tenant_id_from_request (line 47) | async def _get_tenant_id_from_request(
FILE: backend/ee/onyx/server/oauth/api.py
function prepare_authorization_request (line 24) | def prepare_authorization_request(
FILE: backend/ee/onyx/server/oauth/confluence_cloud.py
class ConfluenceCloudOAuth (line 38) | class ConfluenceCloudOAuth:
class OAuthSession (line 41) | class OAuthSession(BaseModel):
class TokenResponse (line 47) | class TokenResponse(BaseModel):
class AccessibleResources (line 54) | class AccessibleResources(BaseModel):
method generate_oauth_url (line 99) | def generate_oauth_url(cls, state: str) -> str:
method generate_dev_oauth_url (line 103) | def generate_dev_oauth_url(cls, state: str) -> str:
method _generate_oauth_url_helper (line 110) | def _generate_oauth_url_helper(cls, redirect_uri: str, state: str) -> ...
method session_dump_json (line 126) | def session_dump_json(cls, email: str, redirect_on_success: str | None...
method parse_session (line 136) | def parse_session(cls, session_json: str) -> OAuthSession:
method generate_finalize_url (line 141) | def generate_finalize_url(cls, credential_id: int) -> str:
function confluence_oauth_callback (line 146) | def confluence_oauth_callback(
function confluence_oauth_accessible_resources (line 259) | def confluence_oauth_accessible_resources(
function confluence_oauth_finalize (line 323) | def confluence_oauth_finalize(
FILE: backend/ee/onyx/server/oauth/google_drive.py
class GoogleDriveOAuth (line 43) | class GoogleDriveOAuth:
class OAuthSession (line 47) | class OAuthSession(BaseModel):
method generate_oauth_url (line 71) | def generate_oauth_url(cls, state: str) -> str:
method generate_dev_oauth_url (line 75) | def generate_dev_oauth_url(cls, state: str) -> str:
method _generate_oauth_url_helper (line 83) | def _generate_oauth_url_helper(cls, redirect_uri: str, state: str) -> ...
method session_dump_json (line 98) | def session_dump_json(cls, email: str, redirect_on_success: str | None...
method parse_session (line 108) | def parse_session(cls, session_json: str) -> OAuthSession:
function handle_google_drive_oauth_callback (line 114) | def handle_google_drive_oauth_callback(
FILE: backend/ee/onyx/server/oauth/slack.py
class SlackOAuth (line 27) | class SlackOAuth:
class OAuthSession (line 31) | class OAuthSession(BaseModel):
method generate_oauth_url (line 59) | def generate_oauth_url(cls, state: str) -> str:
method generate_dev_oauth_url (line 63) | def generate_dev_oauth_url(cls, state: str) -> str:
method _generate_oauth_url_helper (line 71) | def _generate_oauth_url_helper(cls, redirect_uri: str, state: str) -> ...
method session_dump_json (line 82) | def session_dump_json(cls, email: str, redirect_on_success: str | None...
method parse_session (line 92) | def parse_session(cls, session_json: str) -> OAuthSession:
function handle_slack_oauth_callback (line 98) | def handle_slack_oauth_callback(
FILE: backend/ee/onyx/server/query_and_chat/models.py
class StandardAnswerRequest (line 13) | class StandardAnswerRequest(BaseModel):
class StandardAnswerResponse (line 18) | class StandardAnswerResponse(BaseModel):
class SearchFlowClassificationRequest (line 22) | class SearchFlowClassificationRequest(BaseModel):
class SearchFlowClassificationResponse (line 26) | class SearchFlowClassificationResponse(BaseModel):
class SendSearchQueryRequest (line 34) | class SendSearchQueryRequest(BaseModel):
class SearchDocWithContent (line 45) | class SearchDocWithContent(SearchDoc):
method from_inference_sections (line 51) | def from_inference_sections(
class SearchFullResponse (line 93) | class SearchFullResponse(BaseModel):
class SearchQueryResponse (line 104) | class SearchQueryResponse(BaseModel):
class SearchHistoryResponse (line 110) | class SearchHistoryResponse(BaseModel):
FILE: backend/ee/onyx/server/query_and_chat/query_backend.py
function get_standard_answer (line 22) | def get_standard_answer(
FILE: backend/ee/onyx/server/query_and_chat/search_backend.py
function search_flow_classification (line 40) | def search_flow_classification(
function handle_send_search_message (line 80) | def handle_send_search_message(
function get_search_history (line 129) | def get_search_history(
FILE: backend/ee/onyx/server/query_and_chat/streaming_models.py
class SearchQueriesPacket (line 9) | class SearchQueriesPacket(BaseModel):
class SearchDocsPacket (line 16) | class SearchDocsPacket(BaseModel):
class SearchErrorPacket (line 23) | class SearchErrorPacket(BaseModel):
class LLMSelectedDocsPacket (line 30) | class LLMSelectedDocsPacket(BaseModel):
FILE: backend/ee/onyx/server/query_and_chat/token_limit.py
function _check_token_rate_limits (line 31) | def _check_token_rate_limits(user: User) -> None:
function _user_is_rate_limited (line 55) | def _user_is_rate_limited(user_id: UUID) -> None:
function _fetch_user_usage (line 72) | def _fetch_user_usage(
function _user_is_rate_limited_by_group (line 96) | def _user_is_rate_limited_by_group(user_id: UUID) -> None:
function _fetch_all_user_group_rate_limits (line 128) | def _fetch_all_user_group_rate_limits(
function _fetch_user_group_usage (line 160) | def _fetch_user_group_usage(
FILE: backend/ee/onyx/server/query_history/api.py
function ensure_query_history_is_enabled (line 60) | def ensure_query_history_is_enabled(
function yield_snapshot_from_chat_session (line 70) | def yield_snapshot_from_chat_session(
function fetch_and_process_chat_session_history (line 77) | def fetch_and_process_chat_session_history(
function snapshot_from_chat_session (line 121) | def snapshot_from_chat_session(
function admin_get_chat_sessions (line 154) | def admin_get_chat_sessions(
function get_chat_session_history (line 193) | def get_chat_session_history(
function get_chat_session_admin (line 235) | def get_chat_session_admin(
function list_all_query_history_exports (line 271) | def list_all_query_history_exports(
function start_query_history_export (line 299) | def start_query_history_export(
function get_query_history_export_status (line 345) | def get_query_history_export_status(
function download_query_history_csv (line 379) | def download_query_history_csv(
FILE: backend/ee/onyx/server/query_history/models.py
class AbridgedSearchDoc (line 19) | class AbridgedSearchDoc(BaseModel):
class MessageSnapshot (line 27) | class MessageSnapshot(BaseModel):
method build (line 37) | def build(cls, message: ChatMessage) -> "MessageSnapshot":
class ChatSessionMinimal (line 75) | class ChatSessionMinimal(BaseModel):
method from_chat_session (line 89) | def from_chat_session(cls, chat_session: ChatSession) -> "ChatSessionM...
class ChatSessionSnapshot (line 148) | class ChatSessionSnapshot(BaseModel):
class QuestionAnswerPairSnapshot (line 159) | class QuestionAnswerPairSnapshot(BaseModel):
method from_chat_session_snapshot (line 175) | def from_chat_session_snapshot(
method to_json (line 205) | def to_json(self) -> dict[str, str | None]:
class QueryHistoryExport (line 226) | class QueryHistoryExport(BaseModel):
method from_task (line 234) | def from_task(
method from_file (line 255) | def from_file(
class QueryHistoryFileMetadata (line 276) | class QueryHistoryFileMetadata(BaseModel):
FILE: backend/ee/onyx/server/reporting/usage_export_api.py
class GenerateUsageReportParams (line 26) | class GenerateUsageReportParams(BaseModel):
function generate_report (line 32) | def generate_report(
function read_usage_report (line 59) | def read_usage_report(
function fetch_usage_reports (line 84) | def fetch_usage_reports(
FILE: backend/ee/onyx/server/reporting/usage_export_generation.py
function generate_chat_messages_report (line 26) | def generate_chat_messages_report(
function generate_user_report (line 90) | def generate_user_report(
function create_new_usage_report (line 122) | def create_new_usage_report(
FILE: backend/ee/onyx/server/reporting/usage_export_models.py
class FlowType (line 8) | class FlowType(str, Enum):
class ChatMessageSkeleton (line 13) | class ChatMessageSkeleton(BaseModel):
class UserSkeleton (line 24) | class UserSkeleton(BaseModel):
class UsageReportMetadata (line 29) | class UsageReportMetadata(BaseModel):
FILE: backend/ee/onyx/server/scim/api.py
class ScimJSONResponse (line 75) | class ScimJSONResponse(JSONResponse):
function register_scim_exception_handlers (line 92) | def register_scim_exception_handlers(app: FastAPI) -> None:
function _get_provider (line 108) | def _get_provider(
function get_service_provider_config (line 126) | def get_service_provider_config() -> ScimServiceProviderConfig:
function get_resource_types (line 132) | def get_resource_types() -> ScimJSONResponse:
function get_schemas (line 151) | def get_schemas() -> ScimJSONResponse:
function _scim_error_response (line 172) | def _scim_error_response(status: int, detail: str) -> ScimJSONResponse:
function _parse_excluded_attributes (line 182) | def _parse_excluded_attributes(raw: str | None) -> set[str]:
function _apply_exclusions (line 192) | def _apply_exclusions(
function _check_seat_availability (line 211) | def _check_seat_availability(dal: ScimDAL) -> str | None:
function _fetch_user_or_404 (line 224) | def _fetch_user_or_404(user_id: str, dal: ScimDAL) -> User | ScimJSONRes...
function _scim_name_to_str (line 236) | def _scim_name_to_str(name: ScimName | None) -> str | None:
function _scim_resource_response (line 252) | def _scim_resource_response(
function _build_list_response (line 264) | def _build_list_response(
function _extract_enterprise_fields (line 296) | def _extract_enterprise_fields(
function _mapping_to_fields (line 308) | def _mapping_to_fields(
function _fields_from_resource (line 323) | def _fields_from_resource(resource: ScimUserResource) -> ScimMappingFields:
function list_users (line 341) | def list_users(
function get_user (line 387) | def get_user(
function create_user (line 423) | def create_user(
function replace_user (line 550) | def replace_user(
function patch_user (line 612) | def patch_user(
function delete_user (line 723) | def delete_user(
function _fetch_group_or_404 (line 761) | def _fetch_group_or_404(group_id: str, dal: ScimDAL) -> UserGroup | Scim...
function _parse_member_uuids (line 773) | def _parse_member_uuids(
function _validate_and_parse_members (line 789) | def _validate_and_parse_members(
function list_groups (line 814) | def list_groups(
function get_group (line 853) | def get_group(
function create_group (line 886) | def create_group(
function replace_group (line 949) | def replace_group(
function patch_group (line 1004) | def patch_group(
function delete_group (line 1080) | def delete_group(
function _is_valid_uuid (line 1114) | def _is_valid_uuid(value: str) -> bool:
FILE: backend/ee/onyx/server/scim/auth.py
class ScimAuthError (line 31) | class ScimAuthError(Exception):
method __init__ (line 39) | def __init__(self, status_code: int, detail: str) -> None:
function _hash_scim_token (line 49) | def _hash_scim_token(token: str) -> str:
function generate_scim_token (line 54) | def generate_scim_token() -> tuple[str, str, str]:
function _get_hashed_scim_token_from_request (line 67) | def _get_hashed_scim_token_from_request(request: Request) -> str | None:
function _get_scim_dal (line 76) | def _get_scim_dal(db_session: Session = Depends(get_session)) -> ScimDAL:
function verify_scim_token (line 80) | def verify_scim_token(
FILE: backend/ee/onyx/server/scim/filtering.py
class ScimFilterOperator (line 31) | class ScimFilterOperator(str, Enum):
class ScimFilter (line 40) | class ScimFilter:
function parse_scim_filter (line 59) | def parse_scim_filter(filter_string: str | None) -> ScimFilter | None:
function _build_filter (line 84) | def _build_filter(match: re.Match[str], raw: str) -> ScimFilter:
FILE: backend/ee/onyx/server/scim/models.py
class ScimName (line 46) | class ScimName(BaseModel):
class ScimEmail (line 54) | class ScimEmail(BaseModel):
class ScimMeta (line 62) | class ScimMeta(BaseModel):
class ScimUserGroupRef (line 71) | class ScimUserGroupRef(BaseModel):
class ScimManagerRef (line 78) | class ScimManagerRef(BaseModel):
class ScimEnterpriseExtension (line 84) | class ScimEnterpriseExtension(BaseModel):
class ScimMappingFields (line 92) | class ScimMappingFields:
class ScimUserResource (line 108) | class ScimUserResource(BaseModel):
class ScimGroupMember (line 134) | class ScimGroupMember(BaseModel):
class ScimGroupResource (line 145) | class ScimGroupResource(BaseModel):
class ScimListResponse (line 156) | class ScimListResponse(BaseModel):
class ScimPatchOperationType (line 166) | class ScimPatchOperationType(str, Enum):
class ScimPatchResourceValue (line 174) | class ScimPatchResourceValue(BaseModel):
class ScimPatchOperation (line 202) | class ScimPatchOperation(BaseModel):
method normalize_operation (line 211) | def normalize_operation(cls, v: object) -> object:
class ScimPatchRequest (line 223) | class ScimPatchRequest(BaseModel):
class ScimError (line 235) | class ScimError(BaseModel):
class ScimSupported (line 249) | class ScimSupported(BaseModel):
class ScimFilterConfig (line 255) | class ScimFilterConfig(BaseModel):
class ScimServiceProviderConfig (line 262) | class ScimServiceProviderConfig(BaseModel):
class ScimSchemaAttribute (line 290) | class ScimSchemaAttribute(BaseModel):
class ScimSchemaDefinition (line 305) | class ScimSchemaDefinition(BaseModel):
class ScimSchemaExtension (line 319) | class ScimSchemaExtension(BaseModel):
class ScimResourceType (line 328) | class ScimResourceType(BaseModel):
class ScimTokenCreate (line 353) | class ScimTokenCreate(BaseModel):
class ScimTokenResponse (line 359) | class ScimTokenResponse(BaseModel):
class ScimTokenCreatedResponse (line 371) | class ScimTokenCreatedResponse(ScimTokenResponse):
FILE: backend/ee/onyx/server/scim/patch.py
class ScimPatchError (line 82) | class ScimPatchError(Exception):
method __init__ (line 85) | def __init__(self, detail: str, status: int = 400) -> None:
class _UserPatchCtx (line 92) | class _UserPatchCtx:
function apply_user_patch (line 105) | def apply_user_patch(
function _apply_user_replace (line 142) | def _apply_user_replace(
function _apply_user_remove (line 162) | def _apply_user_remove(
function _set_user_field (line 185) | def _set_user_field(
function _update_primary_email (line 231) | def _update_primary_email(data: dict[str, Any], value: ScimPatchValue) -...
function _to_dict (line 243) | def _to_dict(value: ScimPatchValue) -> dict | None:
function _set_enterprise_field (line 256) | def _set_enterprise_field(
function apply_group_patch (line 296) | def apply_group_patch(
function _apply_group_replace (line 339) | def _apply_group_replace(
function _members_to_dicts (line 371) | def _members_to_dicts(
function _replace_members (line 380) | def _replace_members(
function _set_group_field (line 396) | def _set_group_field(
function _apply_group_add (line 415) | def _apply_group_add(
function _apply_group_remove (line 440) | def _apply_group_remove(
FILE: backend/ee/onyx/server/scim/providers/base.py
class ScimProvider (line 40) | class ScimProvider(ABC):
method name (line 49) | def name(self) -> str:
method ignored_patch_paths (line 55) | def ignored_patch_paths(self) -> frozenset[str]:
method user_schemas (line 65) | def user_schemas(self) -> list[str]:
method build_user_resource (line 73) | def build_user_resource(
method build_group_resource (line 134) | def build_group_resource(
method build_scim_name (line 152) | def build_scim_name(
function _deserialize_emails (line 185) | def _deserialize_emails(stored_json: str | None, username: str) -> list[...
function serialize_emails (line 199) | def serialize_emails(emails: list[ScimEmail]) -> str | None:
function get_default_provider (line 206) | def get_default_provider() -> ScimProvider:
FILE: backend/ee/onyx/server/scim/providers/entra.py
class EntraProvider (line 13) | class EntraProvider(ScimProvider):
method name (line 27) | def name(self) -> str:
method ignored_patch_paths (line 31) | def ignored_patch_paths(self) -> frozenset[str]:
method user_schemas (line 35) | def user_schemas(self) -> list[str]:
FILE: backend/ee/onyx/server/scim/providers/okta.py
class OktaProvider (line 9) | class OktaProvider(ScimProvider):
method name (line 21) | def name(self) -> str:
method ignored_patch_paths (line 25) | def ignored_patch_paths(self) -> frozenset[str]:
FILE: backend/ee/onyx/server/seeding.py
class CustomToolSeed (line 35) | class CustomToolSeed(BaseModel):
class NavigationItemSeed (line 50) | class NavigationItemSeed(BaseModel):
class SeedConfiguration (line 57) | class SeedConfiguration(BaseModel):
function _parse_env (line 73) | def _parse_env() -> SeedConfiguration | None:
function _seed_custom_tools (line 81) | def _seed_custom_tools(db_session: Session, tools: List[CustomToolSeed])...
function _seed_llms (line 118) | def _seed_llms(
function _seed_personas (line 161) | def _seed_personas(db_session: Session, personas: list[PersonaUpsertRequ...
function _seed_settings (line 190) | def _seed_settings(settings: Settings) -> None:
function _seed_enterprise_settings (line 199) | def _seed_enterprise_settings(seed_config: SeedConfiguration) -> None:
function _seed_logo (line 231) | def _seed_logo(logo_path: str | None) -> None:
function _seed_analytics_script (line 237) | def _seed_analytics_script(seed_config: SeedConfiguration) -> None:
function get_seed_config (line 256) | def get_seed_config() -> SeedConfiguration | None:
function seed_db (line 260) | def seed_db() -> None:
FILE: backend/ee/onyx/server/settings/api.py
function check_ee_features_enabled (line 24) | def check_ee_features_enabled() -> bool:
function apply_license_status_to_settings (line 68) | def apply_license_status_to_settings(settings: Settings) -> Settings:
FILE: backend/ee/onyx/server/tenant_usage_limits.py
function fetch_usage_limit_overrides (line 24) | def fetch_usage_limit_overrides() -> dict[str, TenantUsageLimitOverrides...
function load_usage_limit_overrides (line 67) | def load_usage_limit_overrides() -> None:
function unlimited (line 89) | def unlimited(tenant_id: str) -> TenantUsageLimitOverrides:
function get_tenant_usage_limit_overrides (line 103) | def get_tenant_usage_limit_overrides(
FILE: backend/ee/onyx/server/tenants/access.py
function generate_data_plane_token (line 16) | def generate_data_plane_token() -> str:
function control_plane_dep (line 31) | async def control_plane_dep(request: Request) -> None:
FILE: backend/ee/onyx/server/tenants/admin_api.py
function impersonate_user (line 23) | async def impersonate_user(
FILE: backend/ee/onyx/server/tenants/anonymous_user_path.py
function get_anonymous_user_path (line 7) | def get_anonymous_user_path(tenant_id: str, db_session: Session) -> str ...
function modify_anonymous_user_path (line 20) | def modify_anonymous_user_path(
function get_tenant_id_for_anonymous_user_path (line 42) | def get_tenant_id_for_anonymous_user_path(
function validate_anonymous_user_path (line 57) | def validate_anonymous_user_path(path: str) -> None:
FILE: backend/ee/onyx/server/tenants/anonymous_users_api.py
function get_anonymous_user_path_api (line 30) | async def get_anonymous_user_path_api(
function set_anonymous_user_path_api (line 45) | async def set_anonymous_user_path_api(
function login_as_anonymous_user (line 72) | async def login_as_anonymous_user(
FILE: backend/ee/onyx/server/tenants/billing.py
function fetch_stripe_checkout_session (line 19) | def fetch_stripe_checkout_session(
function fetch_tenant_stripe_information (line 52) | def fetch_tenant_stripe_information(tenant_id: str) -> dict:
function fetch_billing_information (line 65) | def fetch_billing_information(
function fetch_customer_portal_session (line 92) | def fetch_customer_portal_session(tenant_id: str, return_url: str | None...
function register_tenant_users (line 112) | def register_tenant_users(tenant_id: str, number_of_users: int) -> strip...
FILE: backend/ee/onyx/server/tenants/billing_api.py
function gate_product (line 61) | def gate_product(
function gate_product_full_sync (line 81) | def gate_product_full_sync(
function billing_information (line 101) | async def billing_information(
function create_customer_portal_session (line 110) | async def create_customer_portal_session(
function create_checkout_session (line 131) | async def create_checkout_session(
function create_subscription_session (line 154) | async def create_subscription_session(
function get_stripe_publishable_key (line 178) | async def get_stripe_publishable_key() -> StripePublishableKeyResponse:
FILE: backend/ee/onyx/server/tenants/models.py
class CheckoutSessionCreationRequest (line 9) | class CheckoutSessionCreationRequest(BaseModel):
class CreateTenantRequest (line 13) | class CreateTenantRequest(BaseModel):
class ProductGatingRequest (line 18) | class ProductGatingRequest(BaseModel):
class ProductGatingFullSyncRequest (line 23) | class ProductGatingFullSyncRequest(BaseModel):
class SubscriptionStatusResponse (line 27) | class SubscriptionStatusResponse(BaseModel):
class BillingInformation (line 31) | class BillingInformation(BaseModel):
class CreateCheckoutSessionRequest (line 45) | class CreateCheckoutSessionRequest(BaseModel):
class CheckoutSessionCreationResponse (line 51) | class CheckoutSessionCreationResponse(BaseModel):
class ImpersonateRequest (line 55) | class ImpersonateRequest(BaseModel):
class TenantCreationPayload (line 59) | class TenantCreationPayload(BaseModel):
class TenantDeletionPayload (line 65) | class TenantDeletionPayload(BaseModel):
class AnonymousUserPath (line 70) | class AnonymousUserPath(BaseModel):
class ProductGatingResponse (line 74) | class ProductGatingResponse(BaseModel):
class SubscriptionSessionResponse (line 79) | class SubscriptionSessionResponse(BaseModel):
class CreateSubscriptionSessionRequest (line 83) | class CreateSubscriptionSessionRequest(BaseModel):
class TenantByDomainResponse (line 89) | class TenantByDomainResponse(BaseModel):
class TenantByDomainRequest (line 95) | class TenantByDomainRequest(BaseModel):
class RequestInviteRequest (line 99) | class RequestInviteRequest(BaseModel):
class RequestInviteResponse (line 103) | class RequestInviteResponse(BaseModel):
class PendingUserSnapshot (line 108) | class PendingUserSnapshot(BaseModel):
class ApproveUserRequest (line 112) | class ApproveUserRequest(BaseModel):
class StripePublishableKeyResponse (line 116) | class StripePublishableKeyResponse(BaseModel):
FILE: backend/ee/onyx/server/tenants/product_gating.py
function update_tenant_gating (line 16) | def update_tenant_gating(tenant_id: str, status: ApplicationStatus) -> N...
function store_product_gating (line 26) | def store_product_gating(tenant_id: str, application_status: Application...
function overwrite_full_gated_set (line 45) | def overwrite_full_gated_set(tenant_ids: list[str]) -> None:
function get_gated_tenants (line 64) | def get_gated_tenants() -> set[str]:
function is_tenant_gated (line 70) | def is_tenant_gated(tenant_id: str) -> bool:
FILE: backend/ee/onyx/server/tenants/provisioning.py
function get_or_provision_tenant (line 71) | async def get_or_provision_tenant(
function create_tenant (line 145) | async def create_tenant(
function provision_tenant (line 173) | async def provision_tenant(tenant_id: str, email: str) -> None:
function notify_control_plane (line 204) | async def notify_control_plane(
function rollback_tenant_provisioning (line 231) | async def rollback_tenant_provisioning(tenant_id: str) -> None:
function _build_model_configuration_upsert_requests (line 302) | def _build_model_configuration_upsert_requests(
function configure_default_api_keys (line 320) | def configure_default_api_keys(db_session: Session) -> None:
function submit_to_hubspot (line 525) | async def submit_to_hubspot(
function delete_user_from_control_plane (line 558) | async def delete_user_from_control_plane(tenant_id: str, email: str) -> ...
function get_tenant_by_domain_from_control_plane (line 580) | def get_tenant_by_domain_from_control_plane(
function get_available_tenant (line 624) | async def get_available_tenant() -> str | None:
function setup_tenant (line 662) | async def setup_tenant(tenant_id: str) -> None:
function assign_tenant_to_user (line 702) | async def assign_tenant_to_user(
FILE: backend/ee/onyx/server/tenants/proxy.py
function _check_license_enforcement_enabled (line 46) | def _check_license_enforcement_enabled() -> None:
function _extract_license_from_header (line 55) | def _extract_license_from_header(
function verify_license_auth (line 92) | def verify_license_auth(
function get_license_payload (line 121) | async def get_license_payload(
function get_license_payload_allow_expired (line 134) | async def get_license_payload_allow_expired(
function get_optional_license_payload (line 147) | async def get_optional_license_payload(
function forward_to_control_plane (line 164) | async def forward_to_control_plane(
class CreateCheckoutSessionRequest (line 213) | class CreateCheckoutSessionRequest(BaseModel):
class CreateCheckoutSessionResponse (line 223) | class CreateCheckoutSessionResponse(BaseModel):
function proxy_create_checkout_session (line 228) | async def proxy_create_checkout_session(
class ClaimLicenseRequest (line 262) | class ClaimLicenseRequest(BaseModel):
class ClaimLicenseResponse (line 266) | class ClaimLicenseResponse(BaseModel):
function proxy_claim_license (line 273) | async def proxy_claim_license(
class CreateCustomerPortalSessionRequest (line 309) | class CreateCustomerPortalSessionRequest(BaseModel):
class CreateCustomerPortalSessionResponse (line 313) | class CreateCustomerPortalSessionResponse(BaseModel):
function proxy_create_customer_portal_session (line 318) | async def proxy_create_customer_portal_session(
class BillingInformationResponse (line 343) | class BillingInformationResponse(BaseModel):
function proxy_billing_information (line 360) | async def proxy_billing_information(
class LicenseFetchResponse (line 383) | class LicenseFetchResponse(BaseModel):
function proxy_license_fetch (line 389) | async def proxy_license_fetch(
function proxy_seat_update (line 424) | async def proxy_seat_update(
FILE: backend/ee/onyx/server/tenants/schema_management.py
function validate_tenant_id (line 30) | def validate_tenant_id(tenant_id: str) -> bool:
function run_alembic_migrations (line 39) | def run_alembic_migrations(schema_name: str) -> None:
function create_schema_if_not_exists (line 74) | def create_schema_if_not_exists(tenant_id: str) -> bool:
function drop_schema (line 91) | def drop_schema(tenant_id: str) -> None:
function get_current_alembic_version (line 106) | def get_current_alembic_version(tenant_id: str) -> str:
FILE: backend/ee/onyx/server/tenants/team_membership_api.py
function leave_organization (line 25) | async def leave_organization(
FILE: backend/ee/onyx/server/tenants/tenant_management_api.py
function get_existing_tenant_by_domain (line 28) | def get_existing_tenant_by_domain(
FILE: backend/ee/onyx/server/tenants/user_invitations_api.py
function request_invite (line 25) | async def request_invite(
function list_pending_users (line 39) | def list_pending_users(
function approve_user (line 47) | async def approve_user(
function accept_invite (line 56) | async def accept_invite(
function deny_invite (line 71) | async def deny_invite(
FILE: backend/ee/onyx/server/tenants/user_mapping.py
function get_tenant_id_for_email (line 20) | def get_tenant_id_for_email(email: str) -> str:
function user_owns_a_tenant (line 59) | def user_owns_a_tenant(email: str) -> bool:
function add_users_to_tenant (line 69) | def add_users_to_tenant(emails: list[str], tenant_id: str) -> None:
function remove_users_from_tenant (line 137) | def remove_users_from_tenant(emails: list[str], tenant_id: str) -> None:
function remove_all_users_from_tenant (line 160) | def remove_all_users_from_tenant(tenant_id: str) -> None:
function invite_self_to_tenant (line 168) | def invite_self_to_tenant(email: str, tenant_id: str) -> None:
function approve_user_invite (line 179) | def approve_user_invite(email: str, tenant_id: str) -> None:
function accept_user_invite (line 209) | def accept_user_invite(email: str, tenant_id: str) -> None:
function deny_user_invite (line 281) | def deny_user_invite(email: str, tenant_id: str) -> None:
function get_tenant_count (line 315) | def get_tenant_count(tenant_id: str) -> int:
function get_tenant_invitation (line 361) | def get_tenant_invitation(email: str) -> TenantSnapshot | None:
FILE: backend/ee/onyx/server/token_rate_limits/api.py
function get_all_group_token_limit_settings (line 30) | def get_all_group_token_limit_settings(
function get_group_token_limit_settings (line 48) | def get_group_token_limit_settings(
function create_group_token_limit_settings (line 64) | def create_group_token_limit_settings(
function get_user_token_limit_settings (line 88) | def get_user_token_limit_settings(
function create_user_token_limit_settings (line 99) | def create_user_token_limit_settings(
FILE: backend/ee/onyx/server/usage_limits.py
function is_tenant_on_trial (line 12) | def is_tenant_on_trial(tenant_id: str) -> bool:
FILE: backend/ee/onyx/server/user_group/api.py
function list_user_groups (line 45) | def list_user_groups(
function list_minimal_user_groups (line 69) | def list_minimal_user_groups(
function get_user_group_permissions (line 92) | def get_user_group_permissions(
function create_user_group (line 108) | def create_user_group(
function rename_user_group_endpoint (line 125) | def rename_user_group_endpoint(
function patch_user_group (line 154) | def patch_user_group(
function add_users (line 174) | def add_users(
function set_user_curator (line 194) | def set_user_curator(
function delete_user_group (line 213) | def delete_user_group(
function update_group_agents (line 233) | def update_group_agents(
FILE: backend/ee/onyx/server/user_group/models.py
class UserGroup (line 15) | class UserGroup(BaseModel):
method from_model (line 28) | def from_model(cls, user_group_model: UserGroupModel) -> "UserGroup":
class MinimalUserGroupSnapshot (line 82) | class MinimalUserGroupSnapshot(BaseModel):
method from_model (line 88) | def from_model(cls, user_group_model: UserGroupModel) -> "MinimalUserG...
class UserGroupCreate (line 96) | class UserGroupCreate(BaseModel):
class UserGroupUpdate (line 102) | class UserGroupUpdate(BaseModel):
class AddUsersToUserGroupRequest (line 107) | class AddUsersToUserGroupRequest(BaseModel):
class UserGroupRename (line 111) | class UserGroupRename(BaseModel):
class SetCuratorRequest (line 116) | class SetCuratorRequest(BaseModel):
class UpdateGroupAgentsRequest (line 121) | class UpdateGroupAgentsRequest(BaseModel):
FILE: backend/ee/onyx/utils/encryption.py
function _get_trimmed_key (line 18) | def _get_trimmed_key(key: str) -> bytes:
function _encrypt_string (line 33) | def _encrypt_string(input_str: str, key: str | None = None) -> bytes:
function _decrypt_bytes (line 50) | def _decrypt_bytes(input_bytes: bytes, key: str | None = None) -> str:
function encrypt_string_to_bytes (line 89) | def encrypt_string_to_bytes(input_str: str, key: str | None = None) -> b...
function decrypt_bytes_to_string (line 96) | def decrypt_bytes_to_string(input_bytes: bytes, key: str | None = None) ...
function test_encryption (line 103) | def test_encryption() -> None:
FILE: backend/ee/onyx/utils/license.py
function _get_public_key (line 29) | def _get_public_key() -> RSAPublicKey:
function verify_license_signature (line 49) | def verify_license_signature(license_data: str) -> LicensePayload:
function get_license_status (line 106) | def get_license_status(
function is_license_valid (line 136) | def is_license_valid(payload: LicensePayload) -> bool:
FILE: backend/ee/onyx/utils/posthog_client.py
function posthog_on_error (line 17) | def posthog_on_error(error: Any, items: Any) -> None:
function capture_and_sync_with_alternate_posthog (line 50) | def capture_and_sync_with_alternate_posthog(
function alias_user (line 83) | def alias_user(distinct_id: str, anonymous_id: str) -> None:
function get_anon_id_from_request (line 99) | def get_anon_id_from_request(request: Any) -> str | None:
function get_marketing_posthog_cookie_name (line 113) | def get_marketing_posthog_cookie_name() -> str | None:
function parse_posthog_cookie (line 119) | def parse_posthog_cookie(cookie_value: str) -> dict[str, Any] | None:
FILE: backend/ee/onyx/utils/telemetry.py
function event_telemetry (line 9) | def event_telemetry(
function identify_user (line 24) | def identify_user(distinct_id: str, properties: dict[str, Any] | None = ...
FILE: backend/model_server/constants.py
class GPUStatus (line 4) | class GPUStatus:
FILE: backend/model_server/encoders.py
function get_embedding_model (line 28) | def get_embedding_model(
function _concurrent_embedding (line 85) | def _concurrent_embedding(
function embed_text (line 103) | async def embed_text(
function route_bi_encoder_embed (line 171) | async def route_bi_encoder_embed(
function process_embed_request (line 178) | async def process_embed_request(
FILE: backend/model_server/main.py
function _move_files_recursively (line 48) | def _move_files_recursively(source: Path, dest: Path, overwrite: bool = ...
function lifespan (line 70) | async def lifespan(app: FastAPI) -> AsyncGenerator:
function get_model_app (line 94) | def get_model_app() -> FastAPI:
FILE: backend/model_server/management_endpoints.py
function healthcheck (line 11) | async def healthcheck() -> Response:
function route_gpu_status (line 16) | async def route_gpu_status() -> dict[str, bool | str]:
FILE: backend/model_server/utils.py
function simple_log_function_time (line 22) | def simple_log_function_time(
function get_gpu_type (line 66) | def get_gpu_type() -> str:
FILE: backend/onyx/access/access.py
function _get_access_for_document (line 19) | def _get_access_for_document(
function get_access_for_document (line 39) | def get_access_for_document(
function get_null_document_access (line 49) | def get_null_document_access() -> DocumentAccess:
function _get_access_for_documents (line 59) | def _get_access_for_documents(
function get_access_for_documents (line 88) | def get_access_for_documents(
function _get_acl_for_user (line 99) | def _get_acl_for_user(
function get_acl_for_user (line 114) | def get_acl_for_user(user: User, db_session: Session | None = None) -> s...
function source_should_fetch_permissions_during_indexing (line 121) | def source_should_fetch_permissions_during_indexing(source: DocumentSour...
function get_access_for_user_files (line 133) | def get_access_for_user_files(
function get_access_for_user_files_impl (line 143) | def get_access_for_user_files_impl(
function build_access_for_user_files (line 151) | def build_access_for_user_files(
function build_access_for_user_files_impl (line 163) | def build_access_for_user_files_impl(
function collect_user_file_access (line 179) | def collect_user_file_access(user_file: UserFile) -> tuple[set[str], bool]:
FILE: backend/onyx/access/hierarchy_access.py
function _get_user_external_group_ids (line 7) | def _get_user_external_group_ids(
function get_user_external_group_ids (line 14) | def get_user_external_group_ids(db_session: Session, user: User) -> list...
FILE: backend/onyx/access/models.py
class ExternalAccess (line 10) | class ExternalAccess:
method __str__ (line 22) | def __str__(self) -> str:
method num_entries (line 39) | def num_entries(self) -> int:
method public (line 43) | def public(cls) -> "ExternalAccess":
method empty (line 51) | def empty(cls) -> "ExternalAccess":
class DocExternalAccess (line 68) | class DocExternalAccess:
method to_dict (line 78) | def to_dict(self) -> dict:
method from_dict (line 91) | def from_dict(cls, data: dict) -> "DocExternalAccess":
class NodeExternalAccess (line 108) | class NodeExternalAccess:
method to_dict (line 120) | def to_dict(self) -> dict:
method from_dict (line 134) | def from_dict(cls, data: dict) -> "NodeExternalAccess":
class DocumentAccess (line 158) | class DocumentAccess(ExternalAccess):
method __init__ (line 169) | def __init__(self) -> None:
method to_acl (line 174) | def to_acl(self) -> set[str]:
method build (line 200) | def build(
FILE: backend/onyx/access/utils.py
function prefix_user_email (line 4) | def prefix_user_email(user_email: str) -> str:
function prefix_user_group (line 11) | def prefix_user_group(user_group_name: str) -> str:
function prefix_external_group (line 17) | def prefix_external_group(ext_group_name: str) -> str:
function build_ext_group_name_for_onyx (line 22) | def build_ext_group_name_for_onyx(ext_group_name: str, source: DocumentS...
FILE: backend/onyx/auth/anonymous_user.py
function set_anonymous_user_preferences (line 17) | def set_anonymous_user_preferences(
function set_anonymous_user_personalization (line 23) | def set_anonymous_user_personalization(
function load_anonymous_user_preferences (line 29) | def load_anonymous_user_preferences(store: KeyValueStore) -> UserPrefere...
function fetch_anonymous_user_info (line 41) | def fetch_anonymous_user_info(store: KeyValueStore) -> UserInfo:
FILE: backend/onyx/auth/api_key.py
class ApiKeyDescriptor (line 19) | class ApiKeyDescriptor(BaseModel):
function generate_api_key (line 29) | def generate_api_key(tenant_id: str | None = None) -> str:
function _deprecated_hash_api_key (line 37) | def _deprecated_hash_api_key(api_key: str) -> str:
function hash_api_key (line 41) | def hash_api_key(api_key: str) -> str:
function build_displayable_api_key (line 53) | def build_displayable_api_key(api_key: str) -> str:
function get_hashed_api_key_from_request (line 60) | def get_hashed_api_key_from_request(request: Request) -> str | None:
FILE: backend/onyx/auth/captcha.py
class CaptchaVerificationError (line 17) | class CaptchaVerificationError(Exception):
class RecaptchaResponse (line 21) | class RecaptchaResponse(BaseModel):
function is_captcha_enabled (line 32) | def is_captcha_enabled() -> bool:
function verify_captcha_token (line 37) | async def verify_captcha_token(
FILE: backend/onyx/auth/disposable_email_validator.py
class DisposableEmailValidator (line 21) | class DisposableEmailValidator:
method __new__ (line 31) | def __new__(cls) -> "DisposableEmailValidator":
method __init__ (line 38) | def __init__(self) -> None:
method _should_refresh (line 69) | def _should_refresh(self) -> bool:
method _fetch_domains (line 73) | def _fetch_domains(self) -> Set[str]:
method get_domains (line 119) | def get_domains(self) -> Set[str]:
method is_disposable (line 141) | def is_disposable(self, email: str) -> bool:
function is_disposable_email (line 170) | def is_disposable_email(email: str) -> bool:
function refresh_disposable_domains (line 185) | def refresh_disposable_domains() -> None:
FILE: backend/onyx/auth/email_utils.py
function build_html_email (line 157) | def build_html_email(
function send_email (line 183) | def send_email(
function send_email_with_sendgrid (line 205) | def send_email_with_sendgrid(
function send_email_with_smtplib (line 249) | def send_email_with_smtplib(
function send_subscription_cancellation_email (line 298) | def send_subscription_cancellation_email(user_email: str) -> None:
function build_user_email_invite (line 343) | def build_user_email_invite(
function send_user_email_invite (line 388) | def send_user_email_invite(
function send_forgot_password_email (line 417) | def send_forgot_password_email(
function send_user_verification_email (line 462) | def send_user_verification_email(
FILE: backend/onyx/auth/invited_users.py
function remove_user_from_invited_users (line 10) | def remove_user_from_invited_users(email: str) -> int:
function get_invited_users (line 21) | def get_invited_users() -> list[str]:
function write_invited_users (line 29) | def write_invited_users(emails: list[str]) -> int:
function get_pending_users (line 35) | def get_pending_users() -> list[str]:
function write_pending_users (line 43) | def write_pending_users(emails: list[str]) -> int:
FILE: backend/onyx/auth/jwt.py
class PublicKeyFormat (line 25) | class PublicKeyFormat(Enum):
function _fetch_public_key_payload (line 31) | def _fetch_public_key_payload() -> tuple[str | dict[str, Any], PublicKey...
function get_public_key (line 70) | def get_public_key(token: str) -> RSAPublicKey | str | None:
function _resolve_public_key_from_jwks (line 86) | def _resolve_public_key_from_jwks(
function verify_jwt_token (line 131) | async def verify_jwt_token(token: str) -> dict[str, Any] | None:
FILE: backend/onyx/auth/oauth_refresher.py
function _test_expire_oauth_token (line 30) | async def _test_expire_oauth_token(
function refresh_oauth_token (line 59) | async def refresh_oauth_token(
function check_and_refresh_oauth_tokens (line 147) | async def check_and_refresh_oauth_tokens(
function check_oauth_account_has_refresh_token (line 184) | async def check_oauth_account_has_refresh_token(
function get_oauth_accounts_requiring_refresh_token (line 195) | async def get_oauth_accounts_requiring_refresh_token(user: User) -> List...
FILE: backend/onyx/auth/oauth_token_manager.py
class OAuthTokenManager (line 20) | class OAuthTokenManager:
method __init__ (line 23) | def __init__(self, oauth_config: OAuthConfig, user_id: UUID, db_sessio...
method get_valid_access_token (line 28) | def get_valid_access_token(self) -> str | None:
method refresh_token (line 56) | def refresh_token(self, user_token: OAuthUserToken) -> str:
method token_expiration_time (line 109) | def token_expiration_time(cls, token_data: dict[str, Any]) -> int | None:
method is_token_expired (line 118) | def is_token_expired(cls, token_data: dict[str, Any]) -> bool:
method exchange_code_for_token (line 127) | def exchange_code_for_token(self, code: str, redirect_uri: str) -> dic...
method build_authorization_url (line 162) | def build_authorization_url(
method _unwrap_sensitive_str (line 192) | def _unwrap_sensitive_str(value: SensitiveValue[str] | str) -> str:
method _unwrap_token_data (line 198) | def _unwrap_token_data(
FILE: backend/onyx/auth/pat.py
function generate_pat (line 18) | def generate_pat(tenant_id: str | None = None) -> str:
function hash_pat (line 26) | def hash_pat(token: str) -> str:
function build_displayable_pat (line 31) | def build_displayable_pat(token: str) -> str:
function get_hashed_pat_from_request (line 40) | def get_hashed_pat_from_request(request: Request) -> str | None:
function calculate_expiration (line 53) | def calculate_expiration(days: int | None) -> datetime | None:
FILE: backend/onyx/auth/permissions.py
function resolve_effective_permissions (line 51) | def resolve_effective_permissions(granted: set[str]) -> set[str]:
function get_effective_permissions (line 71) | def get_effective_permissions(user: User) -> set[Permission]:
function require_permission (line 85) | def require_permission(
FILE: backend/onyx/auth/schemas.py
class UserRole (line 11) | class UserRole(str, Enum):
method is_web_login (line 33) | def is_web_login(self) -> bool:
class UserRead (line 40) | class UserRead(schemas.BaseUser[uuid.UUID]):
class UserCreate (line 44) | class UserCreate(schemas.BaseUserCreate):
method create_update_dict (line 53) | def create_update_dict(self) -> dict[str, Any]:
method create_update_dict_superuser (line 62) | def create_update_dict_superuser(self) -> dict[str, Any]:
class UserUpdate (line 69) | class UserUpdate(schemas.BaseUserUpdate):
class AuthBackend (line 76) | class AuthBackend(str, Enum):
FILE: backend/onyx/auth/users.py
function is_user_admin (line 159) | def is_user_admin(user: User) -> bool:
function verify_auth_setting (line 163) | def verify_auth_setting() -> None:
function get_display_email (line 182) | def get_display_email(email: str | None, space_less: bool = False) -> str:
function generate_password (line 196) | def generate_password() -> str:
function user_needs_to_be_verified (line 220) | def user_needs_to_be_verified() -> bool:
function anonymous_user_enabled (line 229) | def anonymous_user_enabled(*, tenant_id: str | None = None) -> bool:
function workspace_invite_only_enabled (line 241) | def workspace_invite_only_enabled() -> bool:
function verify_email_is_invited (line 246) | def verify_email_is_invited(email: str) -> None:
function verify_email_in_whitelist (line 285) | def verify_email_in_whitelist(email: str, tenant_id: str) -> None:
function verify_email_domain (line 291) | def verify_email_domain(email: str, *, is_registration: bool = False) ->...
function enforce_seat_limit (line 334) | def enforce_seat_limit(db_session: Session, seats_needed: int = 1) -> None:
class UserManager (line 350) | class UserManager(UUIDIDMixin, BaseUserManager[User, uuid.UUID]):
method get_by_email (line 356) | async def get_by_email(self, user_email: str) -> User:
method create (line 374) | async def create(
method _assign_default_pinned_assistants (line 554) | async def _assign_default_pinned_assistants(
method _upgrade_user_to_standard__sync (line 583) | def _upgrade_user_to_standard__sync(
method validate_password (line 615) | async def validate_password(self, password: str, _: schemas.UC | model...
method oauth_callback (line 646) | async def oauth_callback(
method on_after_login (line 817) | async def on_after_login(
method on_after_register (line 848) | async def on_after_register(
method on_after_forgot_password (line 961) | async def on_after_forgot_password(
method on_after_request_verify (line 983) | async def on_after_request_verify(
method authenticate (line 1000) | async def authenticate(
method reset_password_as_admin (line 1057) | async def reset_password_as_admin(self, user_id: uuid.UUID) -> str:
method change_password_if_old_matches (line 1064) | async def change_password_if_old_matches(
function get_user_manager (line 1091) | async def get_user_manager(
class RefreshableStrategy (line 1109) | class RefreshableStrategy(Protocol):
method refresh_token (line 1112) | async def refresh_token(self, token: Optional[str], user: Any) -> str:
class TenantAwareRedisStrategy (line 1120) | class TenantAwareRedisStrategy(RedisStrategy[User, uuid.UUID]):
method __init__ (line 1126) | def __init__(
method write_token (line 1134) | async def write_token(self, user: User) -> str:
method read_token (line 1155) | async def read_token(
method destroy_token (line 1171) | async def destroy_token(self, token: str, user: User) -> None: # noqa...
method refresh_token (line 1176) | async def refresh_token(self, token: Optional[str], user: User) -> str:
class RefreshableDatabaseStrategy (line 1202) | class RefreshableDatabaseStrategy(DatabaseStrategy[User, uuid.UUID, Acce...
method __init__ (line 1205) | def __init__(
method refresh_token (line 1213) | async def refresh_token(self, token: Optional[str], user: User) -> str:
class SingleTenantJWTStrategy (line 1234) | class SingleTenantJWTStrategy(JWTStrategy[User, uuid.UUID]):
method __init__ (line 1247) | def __init__(
method write_token (line 1263) | async def write_token(self, user: User) -> str:
method destroy_token (line 1273) | async def destroy_token(self, token: str, user: User) -> None: # noqa...
method refresh_token (line 1282) | async def refresh_token(
function get_redis_strategy (line 1291) | def get_redis_strategy() -> TenantAwareRedisStrategy:
function get_database_strategy (line 1295) | def get_database_strategy(
function get_jwt_strategy (line 1303) | def get_jwt_strategy() -> SingleTenantJWTStrategy:
class FastAPIUserWithLogoutRouter (line 1334) | class FastAPIUserWithLogoutRouter(FastAPIUsers[models.UP, models.ID]):
method get_logout_router (line 1335) | def get_logout_router(
method get_refresh_router (line 1371) | def get_refresh_router(
function _extract_email_from_jwt (line 1469) | def _extract_email_from_jwt(payload: dict[str, Any]) -> str | None:
function _sync_jwt_oidc_expiry (line 1483) | async def _sync_jwt_oidc_expiry(
function _get_or_create_user_from_jwt (line 1509) | async def _get_or_create_user_from_jwt(
function _check_for_saml_and_jwt (line 1567) | async def _check_for_saml_and_jwt(
function optional_user (line 1586) | async def optional_user(
function get_anonymous_user (line 1608) | def get_anonymous_user() -> User:
function double_check_user (line 1625) | async def double_check_user(
function current_user_with_expired_token (line 1657) | async def current_user_with_expired_token(
function current_limited_user (line 1663) | async def current_limited_user(
function current_chat_accessible_user (line 1669) | async def current_chat_accessible_user(
function current_user (line 1679) | async def current_user(
function current_curator_or_admin_user (line 1691) | async def current_curator_or_admin_user(
function current_admin_user (line 1703) | async def current_admin_user(user: User = Depends(current_user)) -> User:
function _get_user_from_token_data (line 1712) | async def _get_user_from_token_data(token_data: dict) -> User | None:
function _is_same_origin (line 1740) | def _is_same_origin(actual: str, expected: str) -> bool:
function current_user_from_websocket (line 1764) | async def current_user_from_websocket(
function get_default_admin_user_emails_ (line 1831) | def get_default_admin_user_emails_() -> list[str]:
class OAuth2AuthorizeResponse (line 1843) | class OAuth2AuthorizeResponse(BaseModel):
function generate_state_token (line 1847) | def generate_state_token(
function generate_csrf_token (line 1857) | def generate_csrf_token() -> str:
function _base64url_encode (line 1861) | def _base64url_encode(data: bytes) -> str:
function generate_pkce_pair (line 1865) | def generate_pkce_pair() -> tuple[str, str]:
function get_pkce_cookie_name (line 1871) | def get_pkce_cookie_name(state: str) -> str:
function create_onyx_oauth_router (line 1877) | def create_onyx_oauth_router(
function get_oauth_router (line 1898) | def get_oauth_router(
FILE: backend/onyx/auth/utils.py
function get_hashed_bearer_token_from_request (line 16) | def get_hashed_bearer_token_from_request(
function _extract_tenant_from_bearer_token (line 57) | def _extract_tenant_from_bearer_token(
function extract_tenant_from_auth_header (line 97) | def extract_tenant_from_auth_header(request: Request) -> str | None:
FILE: backend/onyx/background/celery/apps/app_base.py
class TenantAwareTask (line 76) | class TenantAwareTask(Task):
method __call__ (line 81) | def __call__(self, *args: Any, **kwargs: Any) -> Any:
function on_task_prerun (line 98) | def on_task_prerun(
function on_task_postrun (line 115) | def on_task_postrun(
function on_celeryd_init (line 214) | def on_celeryd_init(
function wait_for_redis (line 251) | def wait_for_redis(sender: Any, **kwargs: Any) -> None: # noqa: ARG001
function wait_for_db (line 291) | def wait_for_db(sender: Any, **kwargs: Any) -> None: # noqa: ARG001
function on_secondary_worker_init (line 330) | def on_secondary_worker_init(sender: Any, **kwargs: Any) -> None: # noq...
function on_worker_ready (line 359) | def on_worker_ready(sender: Any, **kwargs: Any) -> None: # noqa: ARG001
function on_worker_shutdown (line 372) | def on_worker_shutdown(sender: Any, **kwargs: Any) -> None: # noqa: ARG001
function on_setup_logging (line 402) | def on_setup_logging(
function set_task_finished_log_level (line 482) | def set_task_finished_log_level(logLevel: int) -> None:
class TenantContextFilter (line 488) | class TenantContextFilter(logging.Filter):
method filter (line 491) | def filter(self, record: logging.LogRecord) -> bool:
function reset_tenant_id (line 507) | def reset_tenant_id(
function wait_for_vespa_or_shutdown (line 519) | def wait_for_vespa_or_shutdown(
class LivenessProbe (line 545) | class LivenessProbe(bootsteps.StartStopStep):
method __init__ (line 548) | def __init__(self, worker: Any, **kwargs: Any) -> None:
method start (line 554) | def start(self, worker: Any) -> None:
method stop (line 562) | def stop(self, worker: Any) -> None: # noqa: ARG002
method update_liveness_file (line 567) | def update_liveness_file(self, worker: Any) -> None: # noqa: ARG002
function get_bootsteps (line 571) | def get_bootsteps() -> list[type]:
function filter_task_modules (line 596) | def filter_task_modules(modules: list[str]) -> list[str]:
FILE: backend/onyx/background/celery/apps/beat.py
class DynamicTenantScheduler (line 27) | class DynamicTenantScheduler(PersistentScheduler):
method __init__ (line 33) | def __init__(self, *args: Any, **kwargs: Any) -> None:
method setup_schedule (line 57) | def setup_schedule(self) -> None:
method tick (line 60) | def tick(self) -> float:
method _generate_schedule (line 81) | def _generate_schedule(
method _try_updating_schedule (line 147) | def _try_updating_schedule(self) -> None:
method _compare_schedules (line 227) | def _compare_schedules(schedule1: dict, schedule2: dict) -> bool:
function on_beat_init (line 236) | def on_beat_init(sender: Any, **kwargs: Any) -> None:
function on_setup_logging (line 254) | def on_setup_logging(
FILE: backend/onyx/background/celery/apps/docfetching.py
function on_task_prerun (line 36) | def on_task_prerun(
function on_task_postrun (line 50) | def on_task_postrun(
function on_task_retry (line 66) | def on_task_retry(sender: Any | None = None, **kwargs: Any) -> None: # ...
function on_task_revoked (line 74) | def on_task_revoked(sender: Any | None = None, **kwargs: Any) -> None:
function on_task_rejected (line 80) | def on_task_rejected(sender: Any | None = None, **kwargs: Any) -> None: ...
function on_celeryd_init (line 94) | def on_celeryd_init(sender: str, conf: Any = None, **kwargs: Any) -> None:
function on_worker_init (line 99) | def on_worker_init(sender: Worker, **kwargs: Any) -> None:
function on_worker_ready (line 118) | def on_worker_ready(sender: Any, **kwargs: Any) -> None:
function on_worker_shutdown (line 124) | def on_worker_shutdown(sender: Any, **kwargs: Any) -> None:
function on_setup_logging (line 129) | def on_setup_logging(
FILE: backend/onyx/background/celery/apps/docprocessing.py
function on_task_prerun (line 37) | def on_task_prerun(
function on_task_postrun (line 51) | def on_task_postrun(
function on_task_retry (line 67) | def on_task_retry(sender: Any | None = None, **kwargs: Any) -> None: # ...
function on_task_revoked (line 75) | def on_task_revoked(sender: Any | None = None, **kwargs: Any) -> None:
function on_task_rejected (line 81) | def on_task_rejected(sender: Any | None = None, **kwargs: Any) -> None: ...
function on_celeryd_init (line 95) | def on_celeryd_init(sender: str, conf: Any = None, **kwargs: Any) -> None:
function on_worker_init (line 100) | def on_worker_init(sender: Worker, **kwargs: Any) -> None:
function on_worker_ready (line 124) | def on_worker_ready(sender: Any, **kwargs: Any) -> None:
function on_worker_shutdown (line 130) | def on_worker_shutdown(sender: Any, **kwargs: Any) -> None:
function init_worker (line 141) | def init_worker(**kwargs: Any) -> None: # noqa: ARG001
function on_setup_logging (line 146) | def on_setup_logging(
FILE: backend/onyx/background/celery/apps/heavy.py
function on_task_prerun (line 28) | def on_task_prerun(
function on_task_postrun (line 40) | def on_task_postrun(
function on_celeryd_init (line 54) | def on_celeryd_init(sender: str, conf: Any = None, **kwargs: Any) -> None:
function on_worker_init (line 59) | def on_worker_init(sender: Worker, **kwargs: Any) -> None:
function on_worker_ready (line 78) | def on_worker_ready(sender: Any, **kwargs: Any) -> None:
function on_worker_shutdown (line 83) | def on_worker_shutdown(sender: Any, **kwargs: Any) -> None:
function on_setup_logging (line 88) | def on_setup_logging(
FILE: backend/onyx/background/celery/apps/light.py
function on_task_prerun (line 30) | def on_task_prerun(
function on_task_postrun (line 42) | def on_task_postrun(
function on_celeryd_init (line 56) | def on_celeryd_init(sender: str, conf: Any = None, **kwargs: Any) -> None:
function on_worker_init (line 61) | def on_worker_init(sender: Worker, **kwargs: Any) -> None:
function on_worker_ready (line 92) | def on_worker_ready(sender: Any, **kwargs: Any) -> None:
function on_worker_shutdown (line 97) | def on_worker_shutdown(sender: Any, **kwargs: Any) -> None:
function on_setup_logging (line 102) | def on_setup_logging(
FILE: backend/onyx/background/celery/apps/monitoring.py
function on_task_prerun (line 27) | def on_task_prerun(
function on_task_postrun (line 39) | def on_task_postrun(
function on_celeryd_init (line 53) | def on_celeryd_init(sender: Any = None, conf: Any = None, **kwargs: Any)...
function on_worker_init (line 62) | def on_worker_init(sender: Any, **kwargs: Any) -> None:
function _setup_prometheus_collectors (line 83) | def _setup_prometheus_collectors(sender: Any) -> bool:
function on_worker_ready (line 105) | def on_worker_ready(sender: Any, **kwargs: Any) -> None:
function on_worker_shutdown (line 118) | def on_worker_shutdown(sender: Any, **kwargs: Any) -> None:
function on_setup_logging (line 123) | def on_setup_logging(
FILE: backend/onyx/background/celery/apps/primary.py
function on_task_prerun (line 53) | def on_task_prerun(
function on_task_postrun (line 65) | def on_task_postrun(
function on_celeryd_init (line 79) | def on_celeryd_init(sender: str, conf: Any = None, **kwargs: Any) -> None:
function on_worker_init (line 84) | def on_worker_init(sender: Worker, **kwargs: Any) -> None:
function on_worker_ready (line 214) | def on_worker_ready(sender: Any, **kwargs: Any) -> None:
function on_worker_shutdown (line 219) | def on_worker_shutdown(sender: Any, **kwargs: Any) -> None:
function on_setup_logging (line 224) | def on_setup_logging(
class HubPeriodicTask (line 234) | class HubPeriodicTask(bootsteps.StartStopStep):
method __init__ (line 245) | def __init__(self, worker: Any, **kwargs: Any) -> None: # noqa: ARG002
method start (line 249) | def start(self, worker: Any) -> None:
method run_periodic_task (line 262) | def run_periodic_task(self, worker: Any) -> None:
method stop (line 300) | def stop(self, worker: Any) -> None: # noqa: ARG002
FILE: backend/onyx/background/celery/apps/task_formatters.py
class CeleryTaskPlainFormatter (line 9) | class CeleryTaskPlainFormatter(PlainFormatter):
method format (line 10) | def format(self, record: logging.LogRecord) -> str:
class CeleryTaskColoredFormatter (line 19) | class CeleryTaskColoredFormatter(ColoredFormatter):
method format (line 20) | def format(self, record: logging.LogRecord) -> str:
FILE: backend/onyx/background/celery/apps/user_file_processing.py
function on_task_prerun (line 29) | def on_task_prerun(
function on_task_postrun (line 41) | def on_task_postrun(
function on_celeryd_init (line 55) | def on_celeryd_init(sender: str, conf: Any = None, **kwargs: Any) -> None:
function on_worker_init (line 60) | def on_worker_init(sender: Worker, **kwargs: Any) -> None:
function on_worker_ready (line 84) | def on_worker_ready(sender: Any, **kwargs: Any) -> None:
function on_worker_shutdown (line 89) | def on_worker_shutdown(sender: Any, **kwargs: Any) -> None:
function init_worker (line 94) | def init_worker(**kwargs: Any) -> None: # noqa: ARG001
function on_setup_logging (line 99) | def on_setup_logging(
FILE: backend/onyx/background/celery/celery_k8s_probe.py
function main_readiness (line 9) | def main_readiness(filename: str) -> int:
function main_liveness (line 18) | def main_liveness(filename: str) -> int:
FILE: backend/onyx/background/celery/celery_redis.py
function celery_get_broker_client (line 21) | def celery_get_broker_client(app: Celery) -> Redis:
function celery_get_unacked_length (line 66) | def celery_get_unacked_length(r: Redis) -> int:
function celery_get_unacked_task_ids (line 79) | def celery_get_unacked_task_ids(queue: str, r: Redis) -> set[str]:
function celery_get_queue_length (line 107) | def celery_get_queue_length(queue: str, r: Redis) -> int:
function celery_find_task (line 125) | def celery_find_task(task_id: str, queue: str, r: Redis) -> int:
function celery_get_queued_task_ids (line 147) | def celery_get_queued_task_ids(queue: str, r: Redis) -> set[str]:
function celery_inspect_get_workers (line 170) | def celery_inspect_get_workers(name_filter: str | None, app: Celery) -> ...
function celery_inspect_get_reserved (line 199) | def celery_inspect_get_reserved(worker_names: list[str], app: Celery) ->...
function celery_inspect_get_active (line 220) | def celery_inspect_get_active(worker_names: list[str], app: Celery) -> s...
FILE: backend/onyx/background/celery/celery_utils.py
class SlimConnectorExtractionResult (line 41) | class SlimConnectorExtractionResult(BaseModel):
function _checkpointed_batched_items (line 52) | def _checkpointed_batched_items(
function _get_failure_id (line 91) | def _get_failure_id(failure: ConnectorFailure) -> str | None:
class BatchResult (line 100) | class BatchResult(BaseModel):
function _extract_from_batch (line 105) | def _extract_from_batch(
function extract_ids_from_runnable_connector (line 130) | def extract_ids_from_runnable_connector(
function celery_is_listening_to_queue (line 204) | def celery_is_listening_to_queue(worker: Any, name: str) -> bool:
function celery_is_worker_primary (line 217) | def celery_is_worker_primary(worker: Any) -> bool:
function httpx_init_vespa_pool (line 229) | def httpx_init_vespa_pool(
function make_probe_path (line 251) | def make_probe_path(probe: str, hostname: str) -> Path:
FILE: backend/onyx/background/celery/memory_monitoring.py
function emit_process_memory (line 48) | def emit_process_memory(
FILE: backend/onyx/background/celery/tasks/beat_schedule.py
function make_cloud_generator_task (line 253) | def make_cloud_generator_task(task: dict[str, Any]) -> dict[str, Any]:
function generate_cloud_tasks (line 365) | def generate_cloud_tasks(
function get_cloud_tasks_to_schedule (line 398) | def get_cloud_tasks_to_schedule(beat_multiplier: float) -> list[dict[str...
function get_tasks_to_schedule (line 402) | def get_tasks_to_schedule() -> list[dict[str, Any]]:
FILE: backend/onyx/background/celery/tasks/connector_deletion/tasks.py
class TaskDependencyError (line 68) | class TaskDependencyError(RuntimeError):
function revoke_tasks_blocking_deletion (line 73) | def revoke_tasks_blocking_deletion(
function check_for_connector_deletion_task (line 133) | def check_for_connector_deletion_task(self: Task, *, tenant_id: str) -> ...
function try_generate_document_cc_pair_cleanup_tasks (line 236) | def try_generate_document_cc_pair_cleanup_tasks(
function monitor_connector_deletion_taskset (line 366) | def monitor_connector_deletion_taskset(
function validate_connector_deletion_fences (line 557) | def validate_connector_deletion_fences(
function validate_connector_deletion_fence (line 597) | def validate_connector_deletion_fence(
FILE: backend/onyx/background/celery/tasks/docfetching/task_creation_utils.py
function try_creating_docfetching_task (line 20) | def try_creating_docfetching_task(
FILE: backend/onyx/background/celery/tasks/docfetching/tasks.py
function _verify_indexing_attempt (line 44) | def _verify_indexing_attempt(
function docfetching_task (line 100) | def docfetching_task(
function _docfetching_task (line 127) | def _docfetching_task(
function process_job_result (line 255) | def process_job_result(
function docfetching_proxy_task (line 306) | def docfetching_proxy_task(
FILE: backend/onyx/background/celery/tasks/docprocessing/heartbeat.py
function start_heartbeat (line 14) | def start_heartbeat(index_attempt_id: int) -> tuple[threading.Thread, th...
function stop_heartbeat (line 41) | def stop_heartbeat(thread: threading.Thread, stop_event: threading.Event...
FILE: backend/onyx/background/celery/tasks/docprocessing/tasks.py
function _get_fence_validation_block_expiration (line 131) | def _get_fence_validation_block_expiration() -> int:
function validate_active_indexing_attempts (line 149) | def validate_active_indexing_attempts(
class ConnectorIndexingLogBuilder (line 265) | class ConnectorIndexingLogBuilder:
method __init__ (line 266) | def __init__(self, ctx: DocProcessingContext):
method build (line 269) | def build(self, msg: str, **kwargs: Any) -> str:
function monitor_indexing_attempt_progress (line 286) | def monitor_indexing_attempt_progress(
function _resolve_indexing_entity_errors (line 380) | def _resolve_indexing_entity_errors(
function check_indexing_completion (line 396) | def check_indexing_completion(
function active_indexing_attempt (line 575) | def active_indexing_attempt(
function _kickoff_indexing_tasks (line 611) | def _kickoff_indexing_tasks(
function check_for_indexing (line 713) | def check_for_indexing(self: Task, *, tenant_id: str) -> int | None:
function check_for_checkpoint_cleanup (line 1015) | def check_for_checkpoint_cleanup(self: Task, *, tenant_id: str) -> None:
function cleanup_checkpoint_task (line 1063) | def cleanup_checkpoint_task(
function check_for_index_attempt_cleanup (line 1090) | def check_for_index_attempt_cleanup(self: Task, *, tenant_id: str) -> None:
function cleanup_index_attempt_task (line 1152) | def cleanup_index_attempt_task(
class DocumentProcessingBatch (line 1175) | class DocumentProcessingBatch(BaseModel):
function _check_failure_threshold (line 1185) | def _check_failure_threshold(
function _resolve_indexing_document_errors (line 1213) | def _resolve_indexing_document_errors(
function docprocessing_task (line 1259) | def docprocessing_task(
function _check_chunk_usage_limit (line 1282) | def _check_chunk_usage_limit(tenant_id: str) -> None:
function _docprocessing_task (line 1302) | def _docprocessing_task(
FILE: backend/onyx/background/celery/tasks/docprocessing/utils.py
class IndexingCallbackBase (line 31) | class IndexingCallbackBase(IndexingHeartbeatInterface):
method __init__ (line 34) | def __init__(
method should_stop (line 58) | def should_stop(self) -> bool:
method progress (line 79) | def progress(self, tag: str, amount: int) -> None: # noqa: ARG002
class IndexingCallback (line 124) | class IndexingCallback(IndexingHeartbeatInterface):
method __init__ (line 125) | def __init__(
method should_stop (line 131) | def should_stop(self) -> bool:
method progress (line 137) | def progress(self, tag: str, amount: int) -> None:
function is_in_repeated_error_state (line 146) | def is_in_repeated_error_state(
function should_index (line 171) | def should_index(
FILE: backend/onyx/background/celery/tasks/evals/tasks.py
function eval_run_task (line 28) | def eval_run_task(
function scheduled_eval_task (line 51) | def scheduled_eval_task(self: Task, **kwargs: Any) -> None: # noqa: ARG001
FILE: backend/onyx/background/celery/tasks/hierarchyfetching/tasks.py
function _connector_supports_hierarchy_fetching (line 60) | def _connector_supports_hierarchy_fetching(
function _is_hierarchy_fetching_due (line 80) | def _is_hierarchy_fetching_due(cc_pair: ConnectorCredentialPair) -> bool:
function _try_creating_hierarchy_fetching_task (line 104) | def _try_creating_hierarchy_fetching_task(
function check_for_hierarchy_fetching (line 172) | def check_for_hierarchy_fetching(self: Task, *, tenant_id: str) -> int |...
function _run_hierarchy_extraction (line 250) | def _run_hierarchy_extraction(
function connector_hierarchy_fetching_task (line 355) | def connector_hierarchy_fetching_task(
FILE: backend/onyx/background/celery/tasks/llm_model_update/tasks.py
function check_for_auto_llm_updates (line 20) | def check_for_auto_llm_updates(
FILE: backend/onyx/background/celery/tasks/models.py
class DocProcessingContext (line 6) | class DocProcessingContext(BaseModel):
class IndexingWatchdogTerminalStatus (line 13) | class IndexingWatchdogTerminalStatus(str, Enum):
method code (line 59) | def code(self) -> int:
method from_code (line 77) | def from_code(cls, code: int) -> "IndexingWatchdogTerminalStatus":
class SimpleJobResult (line 98) | class SimpleJobResult:
method __init__ (line 101) | def __init__(self) -> None:
FILE: backend/onyx/background/celery/tasks/monitoring/tasks.py
function _mark_metric_as_emitted (line 74) | def _mark_metric_as_emitted(redis_std: Redis, key: str) -> None:
function _has_metric_been_emitted (line 79) | def _has_metric_been_emitted(redis_std: Redis, key: str) -> bool:
class Metric (line 84) | class Metric(BaseModel):
method log (line 92) | def log(self) -> None:
method emit (line 101) | def emit(self, tenant_id: str) -> None:
function _collect_queue_metrics (line 144) | def _collect_queue_metrics(redis_celery: Redis) -> list[Metric]:
function _build_connector_start_latency_metric (line 183) | def _build_connector_start_latency_metric(
function _build_connector_final_metrics (line 242) | def _build_connector_final_metrics(
function _collect_connector_metrics (line 333) | def _collect_connector_metrics(db_session: Session, redis_std: Redis) ->...
function _collect_sync_metrics (line 432) | def _collect_sync_metrics(db_session: Session, redis_std: Redis) -> list...
function build_job_id (line 653) | def build_job_id(
function monitor_background_processes (line 676) | def monitor_background_processes(self: Task, *, tenant_id: str) -> None:
function cloud_check_alembic (line 741) | def cloud_check_alembic() -> bool | None:
function cloud_monitor_celery_queues (line 873) | def cloud_monitor_celery_queues(
function monitor_celery_queues (line 880) | def monitor_celery_queues(self: Task, *, tenant_id: str) -> None: # noq...
function monitor_celery_queues_helper (line 884) | def monitor_celery_queues_helper(
function _get_cmdline_for_process (line 974) | def _get_cmdline_for_process(process: psutil.Process) -> str | None:
function monitor_process_memory (line 989) | def monitor_process_memory(self: Task, *, tenant_id: str) -> None: # no...
function cloud_monitor_celery_pidbox (line 1062) | def cloud_monitor_celery_pidbox(
FILE: backend/onyx/background/celery/tasks/opensearch_migration/tasks.py
function is_continuation_token_done_for_all_slices (line 60) | def is_continuation_token_done_for_all_slices(
function migrate_chunks_from_vespa_to_opensearch_task (line 85) | def migrate_chunks_from_vespa_to_opensearch_task(
FILE: backend/onyx/background/celery/tasks/opensearch_migration/transformer.py
function _extract_content_vector (line 71) | def _extract_content_vector(embeddings: Any) -> list[float]:
function _extract_title_vector (line 116) | def _extract_title_vector(title_embedding: Any | None) -> list[float] | ...
function _transform_vespa_document_sets_to_opensearch_document_sets (line 163) | def _transform_vespa_document_sets_to_opensearch_document_sets(
function _transform_vespa_acl_to_opensearch_acl (line 171) | def _transform_vespa_acl_to_opensearch_acl(
function transform_vespa_chunks_to_opensearch_chunks (line 183) | def transform_vespa_chunks_to_opensearch_chunks(
FILE: backend/onyx/background/celery/tasks/periodic/tasks.py
function kombu_message_cleanup_task (line 27) | def kombu_message_cleanup_task(self: Any, tenant_id: str) -> int: # noq...
function kombu_message_cleanup_task_helper (line 66) | def kombu_message_cleanup_task_helper(ctx: dict, db_session: Session) ->...
FILE: backend/onyx/background/celery/tasks/pruning/tasks.py
function _get_pruning_block_expiration (line 86) | def _get_pruning_block_expiration() -> int:
function _get_fence_validation_block_expiration (line 104) | def _get_fence_validation_block_expiration() -> int:
class PruneCallback (line 122) | class PruneCallback(IndexingCallbackBase):
method progress (line 123) | def progress(self, tag: str, amount: int) -> None:
function _resolve_and_update_document_parents (line 128) | def _resolve_and_update_document_parents(
function _is_pruning_due (line 162) | def _is_pruning_due(cc_pair: ConnectorCredentialPair) -> bool:
function check_for_pruning (line 204) | def check_for_pruning(self: Task, *, tenant_id: str) -> bool | None:
function try_creating_prune_generator_task (line 305) | def try_creating_prune_generator_task(
function connector_pruning_generator_task (line 447) | def connector_pruning_generator_task(
function monitor_ccpair_pruning_taskset (line 731) | def monitor_ccpair_pruning_taskset(
function validate_pruning_fences (line 782) | def validate_pruning_fences(
function validate_pruning_fence (line 830) | def validate_pruning_fence(
FILE: backend/onyx/background/celery/tasks/shared/RetryDocumentIndex.py
class RetryDocumentIndex (line 12) | class RetryDocumentIndex:
method __init__ (line 24) | def __init__(self, index: DocumentIndex):
method delete_single (line 32) | def delete_single(
method update_single (line 50) | def update_single(
FILE: backend/onyx/background/celery/tasks/shared/tasks.py
class OnyxCeleryTaskCompletionStatus (line 42) | class OnyxCeleryTaskCompletionStatus(str, Enum):
function document_by_cc_pair_cleanup_task (line 67) | def document_by_cc_pair_cleanup_task(
function celery_beat_heartbeat (line 273) | def celery_beat_heartbeat(self: Task, *, tenant_id: str) -> None: # noq...
FILE: backend/onyx/background/celery/tasks/user_file_processing/tasks.py
function _as_uuid (line 65) | def _as_uuid(value: str | UUID) -> UUID:
function _user_file_lock_key (line 70) | def _user_file_lock_key(user_file_id: str | UUID) -> str:
function _user_file_queued_key (line 74) | def _user_file_queued_key(user_file_id: str | UUID) -> str:
function user_file_project_sync_lock_key (line 85) | def user_file_project_sync_lock_key(user_file_id: str | UUID) -> str:
function _user_file_project_sync_queued_key (line 89) | def _user_file_project_sync_queued_key(user_file_id: str | UUID) -> str:
function _user_file_delete_lock_key (line 93) | def _user_file_delete_lock_key(user_file_id: str | UUID) -> str:
function _user_file_delete_queued_key (line 97) | def _user_file_delete_queued_key(user_file_id: str | UUID) -> str:
function get_user_file_project_sync_queue_depth (line 108) | def get_user_file_project_sync_queue_depth(celery_app: Celery) -> int:
function enqueue_user_file_project_sync_task (line 115) | def enqueue_user_file_project_sync_task(
function _visit_chunks (line 153) | def _visit_chunks(
function _get_document_chunk_count (line 176) | def _get_document_chunk_count(
function check_user_file_processing (line 204) | def check_user_file_processing(self: Task, *, tenant_id: str) -> None:
function _process_user_file_without_vector_db (line 307) | def _process_user_file_without_vector_db(
function _process_user_file_with_indexing (line 357) | def _process_user_file_with_indexing(
function process_user_file_impl (line 428) | def process_user_file_impl(
function process_single_user_file (line 545) | def process_single_user_file(
function check_for_user_file_delete (line 562) | def check_for_user_file_delete(self: Task, *, tenant_id: str) -> None:
function delete_user_file_impl (line 654) | def delete_user_file_impl(
function process_single_user_file_delete (line 755) | def process_single_user_file_delete(
function check_for_user_file_project_sync (line 772) | def check_for_user_file_project_sync(self: Task, *, tenant_id: str) -> N...
function project_sync_user_file_impl (line 834) | def project_sync_user_file_impl(
function process_single_user_file_project_sync (line 942) | def process_single_user_file_project_sync(
FILE: backend/onyx/background/celery/tasks/vespa/document_sync.py
function is_document_sync_fenced (line 30) | def is_document_sync_fenced(r: Redis) -> bool:
function get_document_sync_payload (line 35) | def get_document_sync_payload(r: Redis) -> int | None:
function get_document_sync_remaining (line 43) | def get_document_sync_remaining(r: Redis) -> int:
function set_document_sync_fence (line 48) | def set_document_sync_fence(r: Redis, payload: int | None) -> None:
function delete_document_sync_taskset (line 59) | def delete_document_sync_taskset(r: Redis) -> None:
function reset_document_sync (line 64) | def reset_document_sync(r: Redis) -> None:
function generate_document_sync_tasks (line 71) | def generate_document_sync_tasks(
function try_generate_stale_document_sync_tasks (line 135) | def try_generate_stale_document_sync_tasks(
FILE: backend/onyx/background/celery/tasks/vespa/tasks.py
function check_for_vespa_sync_task (line 82) | def check_for_vespa_sync_task(self: Task, *, tenant_id: str) -> bool | N...
function try_generate_document_set_sync_tasks (line 211) | def try_generate_document_set_sync_tasks(
function try_generate_user_group_sync_tasks (line 287) | def try_generate_user_group_sync_tasks(
function monitor_document_sync_taskset (line 363) | def monitor_document_sync_taskset(r: Redis) -> None:
function monitor_document_set_taskset (line 377) | def monitor_document_set_taskset(
function vespa_metadata_sync_task (line 456) | def vespa_metadata_sync_task(self: Task, document_id: str, *, tenant_id:...
FILE: backend/onyx/background/celery/versioned_apps/client.py
function get_app (line 15) | def get_app() -> Celery:
FILE: backend/onyx/background/celery/versioned_apps/docfetching.py
function get_app (line 12) | def get_app() -> Celery:
FILE: backend/onyx/background/celery/versioned_apps/docprocessing.py
function get_app (line 12) | def get_app() -> Celery:
FILE: backend/onyx/background/celery/versioned_apps/user_file_processing.py
function get_app (line 10) | def get_app() -> Celery:
FILE: backend/onyx/background/error_logging.py
function emit_background_error (line 7) | def emit_background_error(
FILE: backend/onyx/background/indexing/checkpointing_utils.py
function _build_checkpoint_pointer (line 27) | def _build_checkpoint_pointer(index_attempt_id: int) -> str:
function save_checkpoint (line 31) | def save_checkpoint(
function load_checkpoint (line 55) | def load_checkpoint(
function get_latest_valid_checkpoint (line 68) | def get_latest_valid_checkpoint(
function get_index_attempts_with_old_checkpoints (line 166) | def get_index_attempts_with_old_checkpoints(
function cleanup_checkpoint (line 195) | def cleanup_checkpoint(db_session: Session, index_attempt_id: int) -> None:
function check_checkpoint_size (line 214) | def check_checkpoint_size(checkpoint: ConnectorCheckpoint) -> None:
FILE: backend/onyx/background/indexing/dask_utils.py
class ResourceLogger (line 12) | class ResourceLogger(WorkerPlugin):
method __init__ (line 13) | def __init__(self, log_interval: int = 60 * 5):
method setup (line 16) | def setup(self, worker: Worker) -> None:
method log_resources (line 21) | async def log_resources(self) -> None:
FILE: backend/onyx/background/indexing/index_attempt_utils.py
function get_old_index_attempts (line 16) | def get_old_index_attempts(
function cleanup_index_attempts (line 54) | def cleanup_index_attempts(db_session: Session, index_attempt_ids: list[...
FILE: backend/onyx/background/indexing/job_client.py
class SimpleJobException (line 28) | class SimpleJobException(Exception):
method __init__ (line 31) | def __init__(self, *args: Any, **kwargs: Any) -> None:
function _initializer (line 46) | def _initializer(
function _run_in_process
Copy disabled (too large)
Download .json
Condensed preview — 4225 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (28,232K chars).
[
{
"path": ".git-blame-ignore-revs",
"chars": 508,
"preview": "# Exclude these commits from git blame (e.g. mass reformatting).\n# These are ignored by GitHub automatically.\n# To enabl"
},
{
"path": ".github/CODEOWNERS",
"chars": 306,
"preview": "* @onyx-dot-app/onyx-core-team\n# Helm charts Owners\n/helm/ @justin-tahara\n\n# Web standards updates\n/web/STANDARDS.md @ra"
},
{
"path": ".github/actionlint.yml",
"chars": 1724,
"preview": "self-hosted-runner:\n # Labels of self-hosted runner in array of strings.\n labels:\n - extras=ecr-cache\n - extras="
},
{
"path": ".github/actions/build-backend-image/action.yml",
"chars": 2875,
"preview": "name: \"Build Backend Image\"\ndescription: \"Builds and pushes the backend Docker image with cache reuse\"\ninputs:\n runs-on"
},
{
"path": ".github/actions/build-integration-image/action.yml",
"chars": 3455,
"preview": "name: \"Build Integration Image\"\ndescription: \"Builds and pushes the integration test image with docker bake\"\ninputs:\n r"
},
{
"path": ".github/actions/build-model-server-image/action.yml",
"chars": 2762,
"preview": "name: \"Build Model Server Image\"\ndescription: \"Builds and pushes the model server Docker image with cache reuse\"\ninputs:"
},
{
"path": ".github/actions/run-nightly-provider-chat-test/action.yml",
"chars": 4847,
"preview": "name: \"Run Nightly Provider Chat Test\"\ndescription: \"Starts required compose services and runs nightly provider integrat"
},
{
"path": ".github/actions/setup-playwright/action.yml",
"chars": 641,
"preview": "name: \"Setup Playwright\"\ndescription: \"Sets up Playwright and system deps (assumes Python and Playwright are installed)\""
},
{
"path": ".github/actions/setup-python-and-install-dependencies/action.yml",
"chars": 2623,
"preview": "name: \"Setup Python and Install Dependencies\"\ndescription: \"Sets up Python with uv and installs deps\"\ninputs:\n requirem"
},
{
"path": ".github/actions/slack-notify/action.yml",
"chars": 5502,
"preview": "name: \"Slack Notify\"\ndescription: \"Sends a Slack notification for workflow events\"\ninputs:\n webhook-url:\n descriptio"
},
{
"path": ".github/actions/slack-notify/user-mappings.json",
"chars": 495,
"preview": "{\n \"U05SAGZPEA1\": \"yuhongsun96\",\n \"U05SAH6UGUD\": \"Weves\",\n \"U07PWEQB7A5\": \"evan-onyx\",\n \"U07V1SM68KF\": \"joachim-dans"
},
{
"path": ".github/dependabot.yml",
"chars": 499,
"preview": "version: 2\nupdates:\n - package-ecosystem: \"github-actions\"\n directory: \"/\"\n schedule:\n interval: \"weekly\"\n "
},
{
"path": ".github/pull_request_template.md",
"chars": 311,
"preview": "## Description\n\n<!--- Provide a brief description of the changes in this PR --->\n\n## How Has This Been Tested?\n\n<!--- De"
},
{
"path": ".github/runs-on.yml",
"chars": 25,
"preview": "_extend: .github-private\n"
},
{
"path": ".github/workflows/deployment.yml",
"chars": 72494,
"preview": "name: Build and Push Docker Images on Tag\n\non:\n push:\n tags:\n - \"*\"\n workflow_dispatch:\n\n# Set restrictive def"
},
{
"path": ".github/workflows/docker-tag-beta.yml",
"chars": 1883,
"preview": "# This workflow is set up to be manually triggered via the GitHub Action tab.\n# Given a version, it will tag those backe"
},
{
"path": ".github/workflows/docker-tag-latest.yml",
"chars": 1888,
"preview": "# This workflow is set up to be manually triggered via the GitHub Action tab.\n# Given a version, it will tag those backe"
},
{
"path": ".github/workflows/helm-chart-releases.yml",
"chars": 2051,
"preview": "name: Release Onyx Helm Charts\n\non:\n push:\n branches:\n - main\n\npermissions: write-all\n\njobs:\n release:\n per"
},
{
"path": ".github/workflows/merge-group.yml",
"chars": 1249,
"preview": "name: Merge Group-Specific\n\non:\n merge_group:\n\npermissions:\n contents: read\n\njobs:\n # This job immediately succeeds t"
},
{
"path": ".github/workflows/nightly-close-stale-issues.yml",
"chars": 1092,
"preview": "name: 'Nightly - Close stale issues and PRs'\non:\n schedule:\n - cron: '0 11 * * *' # Runs every day at 3 AM PST / 4 A"
},
{
"path": ".github/workflows/nightly-llm-provider-chat.yml",
"chars": 1740,
"preview": "name: Nightly LLM Provider Chat Tests\nconcurrency:\n group: Nightly-LLM-Provider-Chat-${{ github.workflow }}-${{ github."
},
{
"path": ".github/workflows/post-merge-beta-cherry-pick.yml",
"chars": 13019,
"preview": "name: Post-Merge Beta Cherry-Pick\n\non:\n pull_request_target:\n types:\n - closed\n\n# SECURITY NOTE:\n# This workflo"
},
{
"path": ".github/workflows/pr-database-tests.yml",
"chars": 2074,
"preview": "name: Database Tests\nconcurrency:\n group: Database-Tests-${{ github.workflow }}-${{ github.head_ref || github.event.wor"
},
{
"path": ".github/workflows/pr-desktop-build.yml",
"chars": 3441,
"preview": "name: Build Desktop App\nconcurrency:\n group: Build-Desktop-App-${{ github.workflow }}-${{ github.head_ref || github.eve"
},
{
"path": ".github/workflows/pr-external-dependency-unit-tests.yml",
"chars": 6470,
"preview": "name: External Dependency Unit Tests\nconcurrency:\n group: External-Dependency-Unit-Tests-${{ github.workflow }}-${{ git"
},
{
"path": ".github/workflows/pr-golang-tests.yml",
"chars": 1575,
"preview": "name: Golang Tests\nconcurrency:\n group: Golang-Tests-${{ github.workflow }}-${{ github.head_ref || github.event.workflo"
},
{
"path": ".github/workflows/pr-helm-chart-testing.yml",
"chars": 11234,
"preview": "name: Helm - Lint and Test Charts\nconcurrency:\n group: Helm-Lint-and-Test-Charts-${{ github.workflow }}-${{ github.head"
},
{
"path": ".github/workflows/pr-integration-tests.yml",
"chars": 32271,
"preview": "name: Run Integration Tests v2\nconcurrency:\n group: Run-Integration-Tests-${{ github.workflow }}-${{ github.head_ref ||"
},
{
"path": ".github/workflows/pr-jest-tests.yml",
"chars": 1429,
"preview": "name: Run Jest Tests\nconcurrency:\n group: Run-Jest-Tests-${{ github.workflow }}-${{ github.head_ref || github.event.wor"
},
{
"path": ".github/workflows/pr-labeler.yml",
"chars": 1326,
"preview": "name: PR Labeler\n\non:\n pull_request:\n branches:\n - main\n types:\n - opened\n - reopened\n - sync"
},
{
"path": ".github/workflows/pr-linear-check.yml",
"chars": 1121,
"preview": "name: Ensure PR references Linear\nconcurrency:\n group: Ensure-PR-references-Linear-${{ github.workflow }}-${{ github.he"
},
{
"path": ".github/workflows/pr-playwright-tests.yml",
"chars": 31686,
"preview": "name: Run Playwright Tests\nconcurrency:\n group: Run-Playwright-Tests-${{ github.workflow }}-${{ github.head_ref || gith"
},
{
"path": ".github/workflows/pr-python-checks.yml",
"chars": 2307,
"preview": "name: Python Checks\nconcurrency:\n group: Python-Checks-${{ github.workflow }}-${{ github.head_ref || github.event.workf"
},
{
"path": ".github/workflows/pr-python-connector-tests.yml",
"chars": 9632,
"preview": "name: Connector Tests\nconcurrency:\n group: Connector-Tests-${{ github.workflow }}-${{ github.head_ref || github.event.w"
},
{
"path": ".github/workflows/pr-python-model-tests.yml",
"chars": 4787,
"preview": "name: Model Server Tests\n\non:\n schedule:\n # This cron expression runs the job daily at 16:00 UTC (9am PT)\n - cron"
},
{
"path": ".github/workflows/pr-python-tests.yml",
"chars": 1590,
"preview": "name: Python Unit Tests\nconcurrency:\n group: Python-Unit-Tests-${{ github.workflow }}-${{ github.head_ref || github.eve"
},
{
"path": ".github/workflows/pr-quality-checks.yml",
"chars": 2032,
"preview": "name: Quality Checks PR\nconcurrency:\n group: Quality-Checks-PR-${{ github.workflow }}-${{ github.head_ref || github.eve"
},
{
"path": ".github/workflows/preview.yml",
"chars": 2635,
"preview": "name: Preview Deployment\nenv:\n VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}\n VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJ"
},
{
"path": ".github/workflows/release-cli.yml",
"chars": 7492,
"preview": "name: Release CLI\n\non:\n push:\n tags:\n - \"cli/v*.*.*\"\n\njobs:\n pypi:\n runs-on: ubuntu-latest\n environment:"
},
{
"path": ".github/workflows/release-devtools.yml",
"chars": 1128,
"preview": "name: Release Devtools\n\non:\n push:\n tags:\n - \"ods/v*.*.*\"\n\njobs:\n pypi:\n runs-on: ubuntu-latest\n environ"
},
{
"path": ".github/workflows/reusable-nightly-llm-provider-chat.yml",
"chars": 11564,
"preview": "name: Reusable Nightly LLM Provider Chat Tests\n\non:\n workflow_call:\n inputs:\n openai_models:\n descriptio"
},
{
"path": ".github/workflows/sandbox-deployment.yml",
"chars": 10589,
"preview": "name: Build and Push Sandbox Image on Tag\n\non:\n push:\n tags:\n - \"experimental-cc4a.*\"\n\n# Restrictive defaults; "
},
{
"path": ".github/workflows/storybook-deploy.yml",
"chars": 2092,
"preview": "name: Storybook Deploy\nenv:\n VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}\n VERCEL_PROJECT_ID: prj_sG49mVsA25UsxIPhN2pmB"
},
{
"path": ".github/workflows/sync_foss.yml",
"chars": 1425,
"preview": "name: Sync FOSS Repo\n\non:\n schedule:\n # Run daily at 3am PT (11am UTC during PST)\n - cron: '0 11 * * *'\n workflo"
},
{
"path": ".github/workflows/tag-nightly.yml",
"chars": 2306,
"preview": "name: Nightly Tag Push\n\non:\n schedule:\n - cron: \"0 10 * * *\" # Runs every day at 2 AM PST / 3 AM PDT / 10 AM UTC\n w"
},
{
"path": ".github/workflows/zizmor.yml",
"chars": 1158,
"preview": "name: Run Zizmor\n\non:\n push:\n branches: [\"main\"]\n pull_request:\n branches: [\"**\"]\n paths:\n - \".github/**"
},
{
"path": ".gitignore",
"chars": 1057,
"preview": "# editors\n.vscode/*\n!/.vscode/env_template.txt\n!/.vscode/env.web_template.txt\n!/.vscode/launch.json\n!/.vscode/tasks.temp"
},
{
"path": ".greptile/config.json",
"chars": 2602,
"preview": "{\n \"labels\": [],\n \"comment\": \"\",\n \"fixWithAI\": true,\n \"hideFooter\": false,\n \"strictness\": 3,\n \"statusC"
},
{
"path": ".greptile/files.json",
"chars": 1661,
"preview": "[\n {\n \"scope\": [],\n \"path\": \"contributing_guides/best_practices.md\",\n \"description\": \"Best practices for contr"
},
{
"path": ".greptile/rules.md",
"chars": 3449,
"preview": "# Greptile Review Rules\n\n## Type Annotations\n\nUse explicit type annotations for variables to enhance code clarity, espec"
},
{
"path": ".pre-commit-config.yaml",
"chars": 6296,
"preview": "default_install_hook_types:\n - pre-commit\n - post-checkout\n - post-merge\n - post-rewrite\nrepos:\n - repo: https://gi"
},
{
"path": ".prettierignore",
"chars": 48,
"preview": "backend/tests/integration/tests/pruning/website\n"
},
{
"path": ".vscode/env.web_template.txt",
"chars": 501,
"preview": "# Copy this file to .env.web in the .vscode folder.\n# Fill in the <REPLACE THIS> values as needed\n# Web Server specific "
},
{
"path": ".vscode/env_template.txt",
"chars": 2387,
"preview": "# Copy this file to .env in the .vscode folder.\n# Fill in the <REPLACE THIS> values as needed; it is recommended to set "
},
{
"path": ".vscode/launch.json",
"chars": 18562,
"preview": "{\n // Use IntelliSense to learn about possible attributes.\n // Hover to view descriptions of existing attributes.\n //"
},
{
"path": ".vscode/tasks.template.jsonc",
"chars": 2967,
"preview": "{\n \"version\": \"2.0.0\",\n \"tasks\": [\n {\n \"type\": \"austin\",\n \"label\": \"Profile celery be"
},
{
"path": "AGENTS.md",
"chars": 14073,
"preview": "# PROJECT KNOWLEDGE BASE\n\nThis file provides guidance to AI agents when working with code in this repository.\n\n## KEY NO"
},
{
"path": "CONTRIBUTING.md",
"chars": 20122,
"preview": "# Contributing to Onyx\n\nHey there! We are so excited that you're interested in Onyx.\n\n## Table of Contents\n\n- [Contribut"
},
{
"path": "LICENSE",
"chars": 1675,
"preview": "Copyright (c) 2023-present DanswerAI, Inc.\n\nPortions of this software are licensed as follows:\n\n- All content that resid"
},
{
"path": "README.md",
"chars": 6039,
"preview": "<a name=\"readme-top\"></a>\n\n<h2 align=\"center\">\n <a href=\"https://www.onyx.app/?utm_source=onyx_repo&utm_medium=github"
},
{
"path": "backend/.dockerignore",
"chars": 340,
"preview": "**/__pycache__\nvenv/\nenv/\n*.egg-info\n.cache\n.git/\n.svn/\n.vscode/\n.idea/\n*.log\nlog/\n.env\nsecrets.yaml\nbuild/\ndist/\n.cover"
},
{
"path": "backend/.gitignore",
"chars": 203,
"preview": "__pycache__/\n.mypy_cache\n.idea/\nsite_crawls/\n.ipynb_checkpoints/\napi_keys.py\n*ipynb\n.env*\nvespa-app.zip\ndynamic_config_s"
},
{
"path": "backend/.trivyignore",
"chars": 976,
"preview": "# https://github.com/madler/zlib/issues/868\n# Pulled in with base Debian image, it's part of the contrib folder but unus"
},
{
"path": "backend/Dockerfile",
"chars": 7266,
"preview": "FROM python:3.11.7-slim-bookworm\n\nLABEL com.danswer.maintainer=\"founders@onyx.app\"\nLABEL com.danswer.description=\"This i"
},
{
"path": "backend/Dockerfile.model_server",
"chars": 2572,
"preview": "# Base stage with dependencies\nFROM python:3.11.7-slim-bookworm AS base\n\nENV DANSWER_RUNNING_IN_DOCKER=\"true\" \\\n HF_H"
},
{
"path": "backend/alembic/README.md",
"chars": 2169,
"preview": "<!-- ONYX_METADATA={\"link\": \"https://github.com/onyx-dot-app/onyx/blob/main/backend/alembic/README.md\"} -->\n\n# Alembic D"
},
{
"path": "backend/alembic/env.py",
"chars": 18429,
"preview": "from typing import Any, Literal\nfrom onyx.db.engine.iam_auth import get_iam_auth_token\nfrom onyx.configs.app_configs imp"
},
{
"path": "backend/alembic/run_multitenant_migrations.py",
"chars": 9255,
"preview": "#!/usr/bin/env python3\n\"\"\"Parallel Alembic Migration Runner\n\nUpgrades tenant schemas to head in batched, parallel alembi"
},
{
"path": "backend/alembic/script.py.mako",
"chars": 510,
"preview": "\"\"\"${message}\n\nRevision ID: ${up_revision}\nRevises: ${down_revision | comma,n}\nCreate Date: ${create_date}\n\n\"\"\"\nfrom ale"
},
{
"path": "backend/alembic/versions/01f8e6d95a33_populate_flow_mapping_data.py",
"chars": 3506,
"preview": "\"\"\"Populate flow mapping data\n\nRevision ID: 01f8e6d95a33\nRevises: d5c86e2c6dc6\nCreate Date: 2026-01-31 17:37:10.485558\n\n"
},
{
"path": "backend/alembic/versions/027381bce97c_add_shortcut_option_for_users.py",
"chars": 569,
"preview": "\"\"\"add shortcut option for users\n\nRevision ID: 027381bce97c\nRevises: 6fc7886d665d\nCreate Date: 2025-01-14 12:14:00.81439"
},
{
"path": "backend/alembic/versions/03bf8be6b53a_rework_kg_config.py",
"chars": 3918,
"preview": "\"\"\"rework-kg-config\n\nRevision ID: 03bf8be6b53a\nRevises: 65bc6e0f8500\nCreate Date: 2025-06-16 10:52:34.815335\n\n\"\"\"\n\nimpor"
},
{
"path": "backend/alembic/versions/03d085c5c38d_backfill_account_type.py",
"chars": 2939,
"preview": "\"\"\"backfill_account_type\n\nRevision ID: 03d085c5c38d\nRevises: 977e834c1427\nCreate Date: 2026-03-25 16:00:00.000000\n\n\"\"\"\n\n"
},
{
"path": "backend/alembic/versions/03d710ccf29c_add_permission_sync_attempt_tables.py",
"chars": 5181,
"preview": "\"\"\"add permission sync attempt tables\n\nRevision ID: 03d710ccf29c\nRevises: 96a5702df6aa\nCreate Date: 2025-09-11 13:30:00."
},
{
"path": "backend/alembic/versions/0568ccf46a6b_add_thread_specific_model_selection.py",
"chars": 568,
"preview": "\"\"\"Add thread specific model selection\n\nRevision ID: 0568ccf46a6b\nRevises: e209dc5a8156\nCreate Date: 2024-06-19 14:25:36"
},
{
"path": "backend/alembic/versions/05c07bf07c00_add_search_doc_relevance_details.py",
"chars": 715,
"preview": "\"\"\"add search doc relevance details\n\nRevision ID: 05c07bf07c00\nRevises: b896bbd0d5a7\nCreate Date: 2024-07-10 17:48:15.88"
},
{
"path": "backend/alembic/versions/07b98176f1de_code_interpreter_seed.py",
"chars": 676,
"preview": "\"\"\"code interpreter seed\n\nRevision ID: 07b98176f1de\nRevises: 7cb492013621\nCreate Date: 2026-02-23 15:55:07.606784\n\n\"\"\"\n\n"
},
{
"path": "backend/alembic/versions/0816326d83aa_add_federated_connector_tables.py",
"chars": 2489,
"preview": "\"\"\"add federated connector tables\n\nRevision ID: 0816326d83aa\nRevises: 12635f6655b7\nCreate Date: 2025-06-29 14:09:45.1095"
},
{
"path": "backend/alembic/versions/08a1eda20fe1_add_earliest_indexing_to_connector.py",
"chars": 534,
"preview": "\"\"\"add_indexing_start_to_connector\n\nRevision ID: 08a1eda20fe1\nRevises: 8a87bd6ec550\nCreate Date: 2024-07-23 11:12:39.462"
},
{
"path": "backend/alembic/versions/09995b8811eb_add_theme_preference_to_user.py",
"chars": 641,
"preview": "\"\"\"add theme_preference to user\n\nRevision ID: 09995b8811eb\nRevises: 3d1cca026fe8\nCreate Date: 2025-10-24 08:58:50.246949"
},
{
"path": "backend/alembic/versions/0a2b51deb0b8_add_starter_prompts.py",
"chars": 646,
"preview": "\"\"\"Add starter prompts\n\nRevision ID: 0a2b51deb0b8\nRevises: 5f4b8568a221\nCreate Date: 2024-03-02 23:23:49.960309\n\n\"\"\"\n\nfr"
},
{
"path": "backend/alembic/versions/0a98909f2757_enable_encrypted_fields.py",
"chars": 3414,
"preview": "\"\"\"Enable Encrypted Fields\n\nRevision ID: 0a98909f2757\nRevises: 570282d33c49\nCreate Date: 2024-05-05 19:30:34.317972\n\n\"\"\""
},
{
"path": "backend/alembic/versions/0bb4558f35df_add_scim_username_to_scim_user_mapping.py",
"chars": 550,
"preview": "\"\"\"add scim_username to scim_user_mapping\n\nRevision ID: 0bb4558f35df\nRevises: 631fd2504136\nCreate Date: 2026-02-20 10:45"
},
{
"path": "backend/alembic/versions/0cd424f32b1d_user_file_data_preparation_and_backfill.py",
"chars": 13900,
"preview": "\"\"\"Migration 2: User file data preparation and backfill\n\nRevision ID: 0cd424f32b1d\nRevises: 9b66d3156fc6\nCreate Date: 20"
},
{
"path": "backend/alembic/versions/0ebb1d516877_add_ccpair_deletion_failure_message.py",
"chars": 585,
"preview": "\"\"\"add ccpair deletion failure message\n\nRevision ID: 0ebb1d516877\nRevises: 52a219fb5233\nCreate Date: 2024-09-10 15:03:48"
},
{
"path": "backend/alembic/versions/0f7ff6d75b57_add_index_to_index_attempt_time_created.py",
"chars": 811,
"preview": "\"\"\"add index to index_attempt.time_created\n\nRevision ID: 0f7ff6d75b57\nRevises: 369644546676\nCreate Date: 2025-01-10 14:0"
},
{
"path": "backend/alembic/versions/114a638452db_add_default_app_mode_to_user.py",
"chars": 603,
"preview": "\"\"\"add default_app_mode to user\n\nRevision ID: 114a638452db\nRevises: feead2911109\nCreate Date: 2026-02-09 18:57:08.274640"
},
{
"path": "backend/alembic/versions/12635f6655b7_drive_canonical_ids.py",
"chars": 22059,
"preview": "\"\"\"drive-canonical-ids\n\nRevision ID: 12635f6655b7\nRevises: 58c50ef19f08\nCreate Date: 2025-06-20 14:44:54.241159\n\n\"\"\"\n\nfr"
},
{
"path": "backend/alembic/versions/15326fcec57e_introduce_onyx_apis.py",
"chars": 943,
"preview": "\"\"\"Introduce Onyx APIs\n\nRevision ID: 15326fcec57e\nRevises: 77d07dffae64\nCreate Date: 2023-11-11 20:51:24.228999\n\n\"\"\"\n\nfr"
},
{
"path": "backend/alembic/versions/16c37a30adf2_user_file_relationship_migration.py",
"chars": 9487,
"preview": "\"\"\"Migration 3: User file relationship migration\n\nRevision ID: 16c37a30adf2\nRevises: 0cd424f32b1d\nCreate Date: 2025-09-2"
},
{
"path": "backend/alembic/versions/173cae5bba26_port_config_store.py",
"chars": 679,
"preview": "\"\"\"Port Config Store\n\nRevision ID: 173cae5bba26\nRevises: e50154680a5c\nCreate Date: 2024-03-19 15:30:44.425436\n\n\"\"\"\n\nfrom"
},
{
"path": "backend/alembic/versions/175ea04c7087_add_user_preferences.py",
"chars": 509,
"preview": "\"\"\"add_user_preferences\n\nRevision ID: 175ea04c7087\nRevises: d56ffa94ca32\nCreate Date: 2026-02-04 18:16:24.830873\n\n\"\"\"\n\nf"
},
{
"path": "backend/alembic/versions/177de57c21c9_display_custom_llm_models.py",
"chars": 1585,
"preview": "\"\"\"display custom llm models\n\nRevision ID: 177de57c21c9\nRevises: 4ee1287bd26a\nCreate Date: 2024-11-21 11:49:04.488677\n\n\""
},
{
"path": "backend/alembic/versions/18b5b2524446_add_is_clarification_to_chat_message.py",
"chars": 575,
"preview": "\"\"\"add is_clarification to chat_message\n\nRevision ID: 18b5b2524446\nRevises: 87c52ec39f84\nCreate Date: 2025-01-16\n\n\"\"\"\n\nf"
},
{
"path": "backend/alembic/versions/19c0ccb01687_migrate_to_contextual_rag_model.py",
"chars": 2065,
"preview": "\"\"\"Migrate to contextual rag model\n\nRevision ID: 19c0ccb01687\nRevises: 9c54986124c6\nCreate Date: 2026-02-12 11:21:41.798"
},
{
"path": "backend/alembic/versions/1a03d2c2856b_add_indexes_to_document__tag.py",
"chars": 566,
"preview": "\"\"\"Add indexes to document__tag\n\nRevision ID: 1a03d2c2856b\nRevises: 9c00a2bccb83\nCreate Date: 2025-02-18 10:45:13.957807"
},
{
"path": "backend/alembic/versions/1b10e1fda030_add_additional_data_to_notifications.py",
"chars": 582,
"preview": "\"\"\"add additional data to notifications\n\nRevision ID: 1b10e1fda030\nRevises: 6756efa39ada\nCreate Date: 2024-10-15 19:26:4"
},
{
"path": "backend/alembic/versions/1b8206b29c5d_add_user_delete_cascades.py",
"chars": 3002,
"preview": "\"\"\"add_user_delete_cascades\n\nRevision ID: 1b8206b29c5d\nRevises: 35e6853a51d5\nCreate Date: 2024-09-18 11:48:59.418726\n\n\"\""
},
{
"path": "backend/alembic/versions/1d78c0ca7853_remove_voice_provider_deleted_column.py",
"chars": 757,
"preview": "\"\"\"remove voice_provider deleted column\n\nRevision ID: 1d78c0ca7853\nRevises: a3f8b2c1d4e5\nCreate Date: 2026-03-26 11:30:5"
},
{
"path": "backend/alembic/versions/1f2a3b4c5d6e_add_internet_search_and_content_providers.py",
"chars": 2742,
"preview": "\"\"\"add internet search and content provider tables\n\nRevision ID: 1f2a3b4c5d6e\nRevises: 9drpiiw74ljy\nCreate Date: 2025-11"
},
{
"path": "backend/alembic/versions/1f60f60c3401_embedding_model_search_settings.py",
"chars": 3926,
"preview": "\"\"\"embedding model -> search settings\n\nRevision ID: 1f60f60c3401\nRevises: f17bf3b0d9f1\nCreate Date: 2024-08-25 12:39:51."
},
{
"path": "backend/alembic/versions/2020d417ec84_single_onyx_craft_migration.py",
"chars": 10841,
"preview": "\"\"\"single onyx craft migration\n\nConsolidates all buildmode/onyx craft tables into a single migration.\n\nTables created:\n-"
},
{
"path": "backend/alembic/versions/213fd978c6d8_notifications.py",
"chars": 1063,
"preview": "\"\"\"notifications\n\nRevision ID: 213fd978c6d8\nRevises: 5fc1f54cc252\nCreate Date: 2024-08-10 11:13:36.070790\n\n\"\"\"\n\nfrom ale"
},
{
"path": "backend/alembic/versions/238b84885828_add_foreign_key_to_user__external_user_.py",
"chars": 1075,
"preview": "\"\"\"Add foreign key to user__external_user_group_id\n\nRevision ID: 238b84885828\nRevises: a7688ab35c45\nCreate Date: 2025-05"
},
{
"path": "backend/alembic/versions/23957775e5f5_remove_feedback_foreignkey_constraint.py",
"chars": 2218,
"preview": "\"\"\"remove-feedback-foreignkey-constraint\n\nRevision ID: 23957775e5f5\nRevises: bc9771dccadf\nCreate Date: 2024-06-27 16:04:"
},
{
"path": "backend/alembic/versions/25a5501dc766_group_permissions_phase1.py",
"chars": 2940,
"preview": "\"\"\"group_permissions_phase1\n\nRevision ID: 25a5501dc766\nRevises: b728689f45b1\nCreate Date: 2026-03-23 11:41:25.557442\n\n\"\""
},
{
"path": "backend/alembic/versions/2664261bfaab_add_cache_store_table.py",
"chars": 922,
"preview": "\"\"\"add cache_store table\n\nRevision ID: 2664261bfaab\nRevises: 4a1e4b1c89d2\nCreate Date: 2026-02-27 00:00:00.000000\n\n\"\"\"\n\n"
},
{
"path": "backend/alembic/versions/2666d766cb9b_google_oauth2.py",
"chars": 1709,
"preview": "\"\"\"Google OAuth2\n\nRevision ID: 2666d766cb9b\nRevises: 6d387b3196c2\nCreate Date: 2023-05-05 15:49:35.716016\n\n\"\"\"\n\nimport f"
},
{
"path": "backend/alembic/versions/26b931506ecb_default_chosen_assistants_to_none.py",
"chars": 1477,
"preview": "\"\"\"default chosen assistants to none\n\nRevision ID: 26b931506ecb\nRevises: 2daa494a0851\nCreate Date: 2024-11-12 13:23:29.8"
},
{
"path": "backend/alembic/versions/27c6ecc08586_permission_framework.py",
"chars": 5907,
"preview": "\"\"\"Permission Framework\n\nRevision ID: 27c6ecc08586\nRevises: 2666d766cb9b\nCreate Date: 2023-05-24 18:45:17.244495\n\n\"\"\"\n\ni"
},
{
"path": "backend/alembic/versions/27fb147a843f_add_timestamps_to_user_table.py",
"chars": 861,
"preview": "\"\"\"add timestamps to user table\n\nRevision ID: 27fb147a843f\nRevises: b5c4d7e8f9a1\nCreate Date: 2026-03-08 17:18:40.828644"
},
{
"path": "backend/alembic/versions/2955778aa44c_add_chunk_count_to_document.py",
"chars": 495,
"preview": "\"\"\"add chunk count to document\n\nRevision ID: 2955778aa44c\nRevises: c0aab6edb6dd\nCreate Date: 2025-01-04 11:39:43.268612\n"
},
{
"path": "backend/alembic/versions/2a391f840e85_add_last_refreshed_at_mcp_server.py",
"chars": 551,
"preview": "\"\"\"add last refreshed at mcp server\n\nRevision ID: 2a391f840e85\nRevises: 4cebcbc9b2ae\nCreate Date: 2025-12-06 15:19:59.76"
},
{
"path": "backend/alembic/versions/2acdef638fc2_add_switchover_type_field.py",
"chars": 1948,
"preview": "\"\"\"add switchover_type field and remove background_reindex_enabled\n\nRevision ID: 2acdef638fc2\nRevises: a4f23d6b71c8\nCrea"
},
{
"path": "backend/alembic/versions/2b75d0a8ffcb_user_file_schema_cleanup.py",
"chars": 7804,
"preview": "\"\"\"Migration 6: User file schema cleanup\n\nRevision ID: 2b75d0a8ffcb\nRevises: 3a78dba1080a\nCreate Date: 2025-09-22 10:09:"
},
{
"path": "backend/alembic/versions/2b90f3af54b8_usage_limits.py",
"chars": 1333,
"preview": "\"\"\"usage_limits\n\nRevision ID: 2b90f3af54b8\nRevises: 9a0296d7421e\nCreate Date: 2026-01-03 16:55:30.449692\n\n\"\"\"\n\nfrom alem"
},
{
"path": "backend/alembic/versions/2c2430828bdf_add_unique_constraint_to_inputprompt_.py",
"chars": 1202,
"preview": "\"\"\"add_unique_constraint_to_inputprompt_prompt_user_id\n\nRevision ID: 2c2430828bdf\nRevises: fb80bdd256de\nCreate Date: 202"
},
{
"path": "backend/alembic/versions/2cdeff6d8c93_set_built_in_to_default.py",
"chars": 689,
"preview": "\"\"\"set built in to default\n\nRevision ID: 2cdeff6d8c93\nRevises: f5437cc136c5\nCreate Date: 2025-02-11 14:57:51.308775\n\n\"\"\""
},
{
"path": "backend/alembic/versions/2d2304e27d8c_add_above_below_to_persona.py",
"chars": 902,
"preview": "\"\"\"Add Above Below to Persona\n\nRevision ID: 2d2304e27d8c\nRevises: 4b08d97e175a\nCreate Date: 2024-08-21 19:15:15.762948\n\n"
},
{
"path": "backend/alembic/versions/2daa494a0851_add_group_sync_time.py",
"chars": 640,
"preview": "\"\"\"add-group-sync-time\n\nRevision ID: 2daa494a0851\nRevises: c0fd6e4da83a\nCreate Date: 2024-11-11 10:57:22.991157\n\n\"\"\"\n\nfr"
},
{
"path": "backend/alembic/versions/2f80c6a2550f_add_chat_session_specific_temperature_.py",
"chars": 819,
"preview": "\"\"\"add chat session specific temperature override\n\nRevision ID: 2f80c6a2550f\nRevises: 33ea50e88f24\nCreate Date: 2025-01-"
},
{
"path": "backend/alembic/versions/2f95e36923e6_add_indexing_coordination.py",
"chars": 3335,
"preview": "\"\"\"add_indexing_coordination\n\nRevision ID: 2f95e36923e6\nRevises: 0816326d83aa\nCreate Date: 2025-07-10 16:17:57.762182\n\n\""
},
{
"path": "backend/alembic/versions/30c1d5744104_persona_datetime_aware.py",
"chars": 963,
"preview": "\"\"\"Persona Datetime Aware\n\nRevision ID: 30c1d5744104\nRevises: 7f99be1cb9f5\nCreate Date: 2023-10-16 23:21:01.283424\n\n\"\"\"\n"
},
{
"path": "backend/alembic/versions/325975216eb3_add_icon_color_and_icon_shape_to_persona.py",
"chars": 1996,
"preview": "\"\"\"Add icon_color and icon_shape to Persona\n\nRevision ID: 325975216eb3\nRevises: 91ffac7e65b3\nCreate Date: 2024-07-24 21:"
},
{
"path": "backend/alembic/versions/33cb72ea4d80_single_tool_call_per_message.py",
"chars": 1186,
"preview": "\"\"\"single tool call per message\n\nRevision ID: 33cb72ea4d80\nRevises: 5b29123cd710\nCreate Date: 2024-11-01 12:51:01.535003"
},
{
"path": "backend/alembic/versions/33ea50e88f24_foreign_key_input_prompts.py",
"chars": 1796,
"preview": "\"\"\"foreign key input prompts\n\nRevision ID: 33ea50e88f24\nRevises: a6df6b88ef81\nCreate Date: 2025-01-29 10:54:22.141765\n\n\""
},
{
"path": "backend/alembic/versions/351faebd379d_add_curator_fields.py",
"chars": 2747,
"preview": "\"\"\"Add curator fields\n\nRevision ID: 351faebd379d\nRevises: ee3f4b47fad5\nCreate Date: 2024-08-15 22:37:08.397052\n\n\"\"\"\n\nfro"
},
{
"path": "backend/alembic/versions/35e518e0ddf4_properly_cascade.py",
"chars": 3176,
"preview": "\"\"\"properly_cascade\n\nRevision ID: 35e518e0ddf4\nRevises: 91a0a4d62b14\nCreate Date: 2024-09-20 21:24:04.891018\n\n\"\"\"\n\nfrom "
},
{
"path": "backend/alembic/versions/35e6853a51d5_server_default_chosen_assistants.py",
"chars": 1822,
"preview": "\"\"\"server default chosen assistants\n\nRevision ID: 35e6853a51d5\nRevises: c99d76fcd298\nCreate Date: 2024-09-13 13:20:32.88"
},
{
"path": "backend/alembic/versions/369644546676_add_composite_index_for_index_attempt_.py",
"chars": 803,
"preview": "\"\"\"add composite index for index attempt time updated\n\nRevision ID: 369644546676\nRevises: 2955778aa44c\nCreate Date: 2025"
},
{
"path": "backend/alembic/versions/36e9220ab794_update_kg_trigger_functions.py",
"chars": 4263,
"preview": "\"\"\"update_kg_trigger_functions\n\nRevision ID: 36e9220ab794\nRevises: c9e2cd766c29\nCreate Date: 2025-06-22 17:33:25.833733\n"
},
{
"path": "backend/alembic/versions/3781a5eb12cb_add_chunk_stats_table.py",
"chars": 1403,
"preview": "\"\"\"add chunk stats table\n\nRevision ID: 3781a5eb12cb\nRevises: df46c75b714e\nCreate Date: 2025-03-10 10:02:30.586666\n\n\"\"\"\n\n"
},
{
"path": "backend/alembic/versions/3879338f8ba1_add_tool_table.py",
"chars": 1169,
"preview": "\"\"\"Add tool table\n\nRevision ID: 3879338f8ba1\nRevises: f1c6478c3fd8\nCreate Date: 2024-05-11 16:11:23.718084\n\n\"\"\"\n\nfrom al"
},
{
"path": "backend/alembic/versions/38eda64af7fe_add_chat_session_sharing.py",
"chars": 897,
"preview": "\"\"\"Add chat session sharing\n\nRevision ID: 38eda64af7fe\nRevises: 776b3bbe9092\nCreate Date: 2024-03-27 19:41:29.073594\n\n\"\""
},
{
"path": "backend/alembic/versions/3934b1bc7b62_update_github_connector_repo_name_to_.py",
"chars": 3724,
"preview": "\"\"\"Update GitHub connector repo_name to repositories\n\nRevision ID: 3934b1bc7b62\nRevises: b7c2b63c4a03\nCreate Date: 2025-"
},
{
"path": "backend/alembic/versions/3a7802814195_add_alternate_assistant_to_chat_message.py",
"chars": 812,
"preview": "\"\"\"add alternate assistant to chat message\n\nRevision ID: 3a7802814195\nRevises: 23957775e5f5\nCreate Date: 2024-06-05 11:1"
},
{
"path": "backend/alembic/versions/3a78dba1080a_user_file_legacy_data_cleanup.py",
"chars": 10065,
"preview": "\"\"\"Migration 5: User file legacy data cleanup\n\nRevision ID: 3a78dba1080a\nRevises: 7cc3fcc116c1\nCreate Date: 2025-09-22 1"
},
{
"path": "backend/alembic/versions/3b25685ff73c_move_is_public_to_cc_pair.py",
"chars": 1543,
"preview": "\"\"\"Move is_public to cc_pair\n\nRevision ID: 3b25685ff73c\nRevises: e0a68a81d434\nCreate Date: 2023-10-05 18:47:09.582849\n\n\""
},
{
"path": "backend/alembic/versions/3bd4c84fe72f_improved_index.py",
"chars": 2497,
"preview": "\"\"\"improved index\n\nRevision ID: 3bd4c84fe72f\nRevises: 8f43500ee275\nCreate Date: 2025-02-26 13:07:56.217791\n\n\"\"\"\n\nfrom al"
},
{
"path": "backend/alembic/versions/3c5e35aa9af0_polling_document_count.py",
"chars": 1304,
"preview": "\"\"\"Polling Document Count\n\nRevision ID: 3c5e35aa9af0\nRevises: 27c6ecc08586\nCreate Date: 2023-06-14 23:45:51.760440\n\n\"\"\"\n"
},
{
"path": "backend/alembic/versions/3c6531f32351_add_back_input_prompts.py",
"chars": 1677,
"preview": "\"\"\"add back input prompts\n\nRevision ID: 3c6531f32351\nRevises: aeda5f2df4f6\nCreate Date: 2025-01-13 12:49:51.705235\n\n\"\"\"\n"
},
{
"path": "backend/alembic/versions/3c9a65f1207f_seed_exa_provider_from_env.py",
"chars": 2118,
"preview": "\"\"\"seed_exa_provider_from_env\n\nRevision ID: 3c9a65f1207f\nRevises: 1f2a3b4c5d6e\nCreate Date: 2025-11-20 19:18:00.000000\n\n"
},
{
"path": "backend/alembic/versions/3d1cca026fe8_add_oauth_config_and_user_tokens.py",
"chars": 3786,
"preview": "\"\"\"add_oauth_config_and_user_tokens\n\nRevision ID: 3d1cca026fe8\nRevises: c8a93a2af083\nCreate Date: 2025-10-21 13:27:34.27"
},
{
"path": "backend/alembic/versions/3fc5d75723b3_add_doc_metadata_field_in_document_model.py",
"chars": 624,
"preview": "\"\"\"add_doc_metadata_field_in_document_model\n\nRevision ID: 3fc5d75723b3\nRevises: 2f95e36923e6\nCreate Date: 2025-07-28 18:"
},
{
"path": "backend/alembic/versions/401c1ac29467_add_tables_for_ui_based_llm_.py",
"chars": 1515,
"preview": "\"\"\"Add tables for UI-based LLM configuration\n\nRevision ID: 401c1ac29467\nRevises: 703313b75876\nCreate Date: 2024-04-13 18"
},
{
"path": "backend/alembic/versions/40926a4dab77_reset_userfile_document_id_migrated_.py",
"chars": 554,
"preview": "\"\"\"reset userfile document_id_migrated field\n\nRevision ID: 40926a4dab77\nRevises: 64bd5677aeb6\nCreate Date: 2025-10-06 16"
},
{
"path": "backend/alembic/versions/41fa44bef321_remove_default_prompt_shortcuts.py",
"chars": 744,
"preview": "\"\"\"remove default prompt shortcuts\n\nRevision ID: 41fa44bef321\nRevises: 2c2430828bdf\nCreate Date: 2025-01-21\n\n\"\"\"\n\nfrom a"
},
{
"path": "backend/alembic/versions/43cbbb3f5e6a_rename_index_origin_to_index_recursively.py",
"chars": 1006,
"preview": "\"\"\"Rename index_origin to index_recursively\n\nRevision ID: 1d6ad76d1f37\nRevises: e1392f05e840\nCreate Date: 2024-08-01 12:"
},
{
"path": "backend/alembic/versions/44f856ae2a4a_add_cloud_embedding_model.py",
"chars": 1822,
"preview": "\"\"\"add cloud embedding model and update embedding_model\n\nRevision ID: 44f856ae2a4a\nRevises: d716b0791ddd\nCreate Date: 20"
},
{
"path": "backend/alembic/versions/4505fd7302e1_added_is_internet_to_dbdoc.py",
"chars": 582,
"preview": "\"\"\"added is_internet to DBDoc\n\nRevision ID: 4505fd7302e1\nRevises: c18cdf4b497e\nCreate Date: 2024-06-18 20:46:09.095034\n\n"
},
{
"path": "backend/alembic/versions/465f78d9b7f9_larger_access_tokens_for_oauth.py",
"chars": 532,
"preview": "\"\"\"Larger Access Tokens for OAUTH\n\nRevision ID: 465f78d9b7f9\nRevises: 3c5e35aa9af0\nCreate Date: 2023-07-18 17:33:40.3650"
},
{
"path": "backend/alembic/versions/46625e4745d4_remove_native_enum.py",
"chars": 1024,
"preview": "\"\"\"Remove Native Enum\n\nRevision ID: 46625e4745d4\nRevises: 9d97fecfab7f\nCreate Date: 2023-10-27 11:38:33.803145\n\n\"\"\"\n\nfro"
},
{
"path": "backend/alembic/versions/46b7a812670f_fix_user__external_user_group_id_fk.py",
"chars": 1193,
"preview": "\"\"\"fix_user__external_user_group_id_fk\n\nRevision ID: 46b7a812670f\nRevises: f32615f71aeb\nCreate Date: 2024-09-23 12:58:03"
},
{
"path": "backend/alembic/versions/4738e4b3bae1_pg_file_store.py",
"chars": 610,
"preview": "\"\"\"PG File Store\n\nRevision ID: 4738e4b3bae1\nRevises: e91df4e935ef\nCreate Date: 2024-03-20 18:53:32.461518\n\n\"\"\"\n\nfrom ale"
},
{
"path": "backend/alembic/versions/473a1a7ca408_add_display_model_names_to_llm_provider.py",
"chars": 1361,
"preview": "\"\"\"Add display_model_names to llm_provider\n\nRevision ID: 473a1a7ca408\nRevises: 325975216eb3\nCreate Date: 2024-07-25 14:3"
},
{
"path": "backend/alembic/versions/47433d30de82_create_indexattempt_table.py",
"chars": 1917,
"preview": "\"\"\"Create IndexAttempt table\n\nRevision ID: 47433d30de82\nRevises:\nCreate Date: 2023-05-04 00:55:32.971991\n\n\"\"\"\n\nimport sq"
},
{
"path": "backend/alembic/versions/475fcefe8826_add_name_to_api_key.py",
"chars": 481,
"preview": "\"\"\"Add name to api_key\n\nRevision ID: 475fcefe8826\nRevises: ecab2b3f1a3b\nCreate Date: 2024-04-11 11:05:18.414438\n\n\"\"\"\n\nfr"
},
{
"path": "backend/alembic/versions/4794bc13e484_update_prompt_length.py",
"chars": 1061,
"preview": "\"\"\"update prompt length\n\nRevision ID: 4794bc13e484\nRevises: f7505c5b0284\nCreate Date: 2025-04-02 11:26:36.180328\n\n\"\"\"\n\nf"
},
{
"path": "backend/alembic/versions/47a07e1a38f1_fix_invalid_model_configurations_state.py",
"chars": 4961,
"preview": "\"\"\"Fix invalid model-configurations state\n\nRevision ID: 47a07e1a38f1\nRevises: 7a70b7664e37\nCreate Date: 2025-04-23 15:39"
},
{
"path": "backend/alembic/versions/47e5bef3a1d7_add_persona_categories.py",
"chars": 1173,
"preview": "\"\"\"add persona categories\n\nRevision ID: 47e5bef3a1d7\nRevises: dfbe9e93d3c7\nCreate Date: 2024-11-05 18:55:02.221064\n\n\"\"\"\n"
},
{
"path": "backend/alembic/versions/48d14957fe80_add_support_for_custom_tools.py",
"chars": 1649,
"preview": "\"\"\"Add support for custom tools\n\nRevision ID: 48d14957fe80\nRevises: b85f02ec1308\nCreate Date: 2024-06-09 14:58:19.946509"
},
{
"path": "backend/alembic/versions/495cb26ce93e_create_knowlege_graph_tables.py",
"chars": 27021,
"preview": "\"\"\"create knowledge graph tables\n\nRevision ID: 495cb26ce93e\nRevises: ca04500b9ee8\nCreate Date: 2025-03-19 08:51:14.34198"
},
{
"path": "backend/alembic/versions/4a1e4b1c89d2_add_indexing_to_userfilestatus.py",
"chars": 1602,
"preview": "\"\"\"Add INDEXING to UserFileStatus\n\nRevision ID: 4a1e4b1c89d2\nRevises: 6b3b4083c5aa\nCreate Date: 2026-02-28 00:00:00.0000"
},
{
"path": "backend/alembic/versions/4a951134c801_moved_status_to_connector_credential_.py",
"chars": 2147,
"preview": "\"\"\"Moved status to connector credential pair\n\nRevision ID: 4a951134c801\nRevises: 7477a5f5d728\nCreate Date: 2024-08-10 19"
},
{
"path": "backend/alembic/versions/4b08d97e175a_change_default_prune_freq.py",
"chars": 623,
"preview": "\"\"\"change default prune_freq\n\nRevision ID: 4b08d97e175a\nRevises: d9ec13955951\nCreate Date: 2024-08-20 15:28:52.993827\n\n\""
},
{
"path": "backend/alembic/versions/4cebcbc9b2ae_add_tab_index_to_tool_call.py",
"chars": 531,
"preview": "\"\"\"add tab_index to tool_call\n\nRevision ID: 4cebcbc9b2ae\nRevises: a1b2c3d4e5f6\nCreate Date: 2025-12-16\n\n\"\"\"\n\nfrom alembi"
},
{
"path": "backend/alembic/versions/4d58345da04a_lowercase_user_emails.py",
"chars": 1887,
"preview": "\"\"\"lowercase_user_emails\n\nRevision ID: 4d58345da04a\nRevises: f1ca58b2f2ec\nCreate Date: 2025-01-29 07:48:46.784041\n\n\"\"\"\n\n"
},
{
"path": "backend/alembic/versions/4ea2c93919c1_add_type_to_credentials.py",
"chars": 2169,
"preview": "\"\"\"Add type to credentials\n\nRevision ID: 4ea2c93919c1\nRevises: 473a1a7ca408\nCreate Date: 2024-07-18 13:07:13.655895\n\n\"\"\""
},
{
"path": "backend/alembic/versions/4ee1287bd26a_add_multiple_slack_bot_support.py",
"chars": 9151,
"preview": "\"\"\"add_multiple_slack_bot_support\n\nRevision ID: 4ee1287bd26a\nRevises: 47e5bef3a1d7\nCreate Date: 2024-11-06 13:15:53.3026"
},
{
"path": "backend/alembic/versions/4f8a2b3c1d9e_add_open_url_tool.py",
"chars": 2951,
"preview": "\"\"\"add_open_url_tool\n\nRevision ID: 4f8a2b3c1d9e\nRevises: a852cbe15577\nCreate Date: 2025-11-24 12:00:00.000000\n\n\"\"\"\n\nfrom"
},
{
"path": "backend/alembic/versions/503883791c39_add_effective_permissions.py",
"chars": 2703,
"preview": "\"\"\"add_effective_permissions\n\nAdds a JSONB column `effective_permissions` to the user table to store\ndirectly granted pe"
},
{
"path": "backend/alembic/versions/505c488f6662_merge_default_assistants_into_unified.py",
"chars": 12296,
"preview": "\"\"\"merge_default_assistants_into_unified\n\nRevision ID: 505c488f6662\nRevises: d09fc20a3c66\nCreate Date: 2025-09-09 19:00:"
},
{
"path": "backend/alembic/versions/50b683a8295c_add_additional_retrieval_controls_to_.py",
"chars": 701,
"preview": "\"\"\"Add additional retrieval controls to Persona\n\nRevision ID: 50b683a8295c\nRevises: 7da0ae5ad583\nCreate Date: 2023-11-27"
},
{
"path": "backend/alembic/versions/52a219fb5233_add_last_synced_and_last_modified_to_document_table.py",
"chars": 1739,
"preview": "\"\"\"Add last synced and last modified to document table\n\nRevision ID: 52a219fb5233\nRevises: f7e58d357687\nCreate Date: 202"
},
{
"path": "backend/alembic/versions/54a74a0417fc_danswerbot_onyxbot.py",
"chars": 508,
"preview": "\"\"\"danswerbot -> onyxbot\n\nRevision ID: 54a74a0417fc\nRevises: 94dc3d0236f8\nCreate Date: 2024-12-11 18:05:05.490737\n\n\"\"\"\n\n"
},
{
"path": "backend/alembic/versions/55546a7967ee_assistant_rework.py",
"chars": 2505,
"preview": "\"\"\"assistant_rework\n\nRevision ID: 55546a7967ee\nRevises: 61ff3651add4\nCreate Date: 2024-09-18 17:00:23.755399\n\n\"\"\"\n\nfrom "
},
{
"path": "backend/alembic/versions/570282d33c49_track_onyxbot_explicitly.py",
"chars": 673,
"preview": "\"\"\"Track Onyxbot Explicitly\n\nRevision ID: 570282d33c49\nRevises: 7547d982db8f\nCreate Date: 2024-05-04 17:49:28.568109\n\n\"\""
},
{
"path": "backend/alembic/versions/57122d037335_add_python_tool_on_default.py",
"chars": 1371,
"preview": "\"\"\"add python tool on default\n\nRevision ID: 57122d037335\nRevises: c0c937d5c9e5\nCreate Date: 2026-02-27 10:10:40.124925\n\n"
},
{
"path": "backend/alembic/versions/57b53544726e_add_document_set_tables.py",
"chars": 1755,
"preview": "\"\"\"Add document set tables\n\nRevision ID: 57b53544726e\nRevises: 800f48024ae9\nCreate Date: 2023-09-20 16:59:39.097177\n\n\"\"\""
},
{
"path": "backend/alembic/versions/5809c0787398_add_chat_sessions.py",
"chars": 2406,
"preview": "\"\"\"Add Chat Sessions\n\nRevision ID: 5809c0787398\nRevises: d929f0c1c6af\nCreate Date: 2023-09-04 15:29:44.002164\n\n\"\"\"\n\nimpo"
},
{
"path": "backend/alembic/versions/58c50ef19f08_add_stale_column_to_user__external_user_.py",
"chars": 2640,
"preview": "\"\"\"add stale column to external user group tables\n\nRevision ID: 58c50ef19f08\nRevises: 7b9b952abdf6\nCreate Date: 2025-06-"
},
{
"path": "backend/alembic/versions/5ae8240accb3_add_research_agent_database_tables_and_.py",
"chars": 3806,
"preview": "\"\"\"add research agent database tables and chat message research fields\n\nRevision ID: 5ae8240accb3\nRevises: b558f51620b4\n"
},
{
"path": "backend/alembic/versions/5b29123cd710_nullable_search_settings_for_historic_.py",
"chars": 1731,
"preview": "\"\"\"nullable search settings for historic index attempts\n\nRevision ID: 5b29123cd710\nRevises: 949b4a92a401\nCreate Date: 20"
},
{
"path": "backend/alembic/versions/5c3dca366b35_backend_driven_notification_details.py",
"chars": 759,
"preview": "\"\"\"backend driven notification details\n\nRevision ID: 5c3dca366b35\nRevises: 9087b548dd69\nCreate Date: 2026-01-06 16:03:11"
},
{
"path": "backend/alembic/versions/5c448911b12f_add_content_type_to_userfile.py",
"chars": 510,
"preview": "\"\"\"Add content type to UserFile\n\nRevision ID: 5c448911b12f\nRevises: 47a07e1a38f1\nCreate Date: 2025-04-25 16:59:48.182672"
},
{
"path": "backend/alembic/versions/5c7fdadae813_match_any_keywords_flag_for_standard_.py",
"chars": 851,
"preview": "\"\"\"match_any_keywords flag for standard answers\n\nRevision ID: 5c7fdadae813\nRevises: efb35676026c\nCreate Date: 2024-09-13"
},
{
"path": "backend/alembic/versions/5d12a446f5c0_add_api_version_and_deployment_name_to_.py",
"chars": 727,
"preview": "\"\"\"add api_version and deployment_name to search settings\n\nRevision ID: 5d12a446f5c0\nRevises: e4334d5b33ba\nCreate Date: "
},
{
"path": "backend/alembic/versions/5e1c073d48a3_add_personal_access_token_table.py",
"chars": 2274,
"preview": "\"\"\"add_personal_access_token_table\n\nRevision ID: 5e1c073d48a3\nRevises: 09995b8811eb\nCreate Date: 2025-10-30 17:30:24.308"
},
{
"path": "backend/alembic/versions/5e6f7a8b9c0d_update_default_persona_prompt.py",
"chars": 1994,
"preview": "\"\"\"update_default_persona_prompt\n\nRevision ID: 5e6f7a8b9c0d\nRevises: 4f8a2b3c1d9e\nCreate Date: 2025-11-30 12:00:00.00000"
},
{
"path": "backend/alembic/versions/5e84129c8be3_add_docs_indexed_column_to_index_.py",
"chars": 796,
"preview": "\"\"\"Add docs_indexed_column + time_started to index_attempt table\n\nRevision ID: 5e84129c8be3\nRevises: e6a4bbc13fe4\nCreate"
},
{
"path": "backend/alembic/versions/5f4b8568a221_add_removed_documents_to_index_attempt.py",
"chars": 630,
"preview": "\"\"\"add removed documents to index_attempt\n\nRevision ID: 5f4b8568a221\nRevises: dbaa756c2ccf\nCreate Date: 2024-02-16 15:02"
},
{
"path": "backend/alembic/versions/5fc1f54cc252_hybrid_enum.py",
"chars": 611,
"preview": "\"\"\"hybrid-enum\n\nRevision ID: 5fc1f54cc252\nRevises: 1d6ad76d1f37\nCreate Date: 2024-08-06 15:35:40.278485\n\n\"\"\"\n\nfrom alemb"
},
{
"path": "backend/alembic/versions/61ff3651add4_add_permission_syncing.py",
"chars": 5098,
"preview": "\"\"\"Add Permission Syncing\n\nRevision ID: 61ff3651add4\nRevises: 1b8206b29c5d\nCreate Date: 2024-09-05 13:57:11.770413\n\n\"\"\"\n"
},
{
"path": "backend/alembic/versions/62c3a055a141_add_file_names_to_file_connector_config.py",
"chars": 3508,
"preview": "\"\"\"add file names to file connector config\n\nRevision ID: 62c3a055a141\nRevises: 3fc5d75723b3\nCreate Date: 2025-07-30 17:0"
},
{
"path": "backend/alembic/versions/631fd2504136_add_approx_chunk_count_in_vespa_to_.py",
"chars": 684,
"preview": "\"\"\"add approx_chunk_count_in_vespa to opensearch tenant migration\n\nRevision ID: 631fd2504136\nRevises: c7f2e1b4a9d3\nCreat"
},
{
"path": "backend/alembic/versions/6436661d5b65_add_created_at_in_project_userfile.py",
"chars": 1158,
"preview": "\"\"\"add_created_at_in_project_userfile\n\nRevision ID: 6436661d5b65\nRevises: c7e9f4a3b2d1\nCreate Date: 2025-11-24 11:50:24."
},
{
"path": "backend/alembic/versions/643a84a42a33_add_user_configured_names_to_llmprovider.py",
"chars": 1668,
"preview": "\"\"\"Add user-configured names to LLMProvider\n\nRevision ID: 643a84a42a33\nRevises: 0a98909f2757\nCreate Date: 2024-05-07 14:"
},
{
"path": "backend/alembic/versions/64bd5677aeb6_add_image_input_support_to_model_config.py",
"chars": 886,
"preview": "\"\"\"Add image input support to model config\n\nRevision ID: 64bd5677aeb6\nRevises: b30353be4eec\nCreate Date: 2025-09-28 15:4"
},
{
"path": "backend/alembic/versions/65bc6e0f8500_remove_kg_subtype_from_db.py",
"chars": 1104,
"preview": "\"\"\"remove kg subtype from db\n\nRevision ID: 65bc6e0f8500\nRevises: cec7ec36c505\nCreate Date: 2025-06-13 10:04:27.705976\n\n\""
},
{
"path": "backend/alembic/versions/6756efa39ada_id_uuid_for_chat_session.py",
"chars": 4138,
"preview": "\"\"\"Migrate chat_session and chat_message tables to use UUID primary keys\n\nRevision ID: 6756efa39ada\nRevises: 5d12a446f5c"
}
]
// ... and 4025 more files (download for full content)
About this extraction
This page contains the full source code of the onyx-dot-app/onyx GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 4225 files (25.4 MB), approximately 6.9M tokens, and a symbol index with 20484 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.