django-spire 0.18.3__py3-none-any.whl → 0.19.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_spire/ai/admin.py +1 -0
- django_spire/ai/chat/apps.py +1 -8
- django_spire/ai/chat/intelligence/decoders/tools.py +29 -0
- django_spire/ai/chat/intelligence/prompts.py +13 -7
- django_spire/ai/chat/intelligence/workflows/chat_workflow.py +55 -57
- django_spire/ai/chat/models.py +2 -1
- django_spire/ai/chat/querysets.py +1 -3
- django_spire/ai/chat/responses.py +5 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/card/chat_card.html +2 -2
- django_spire/ai/chat/templates/django_spire/ai/chat/dropdown/ellipsis_dropdown.html +1 -1
- django_spire/ai/chat/templates/django_spire/ai/chat/element/recent_chat_select_element.html +82 -44
- django_spire/ai/chat/templates/django_spire/ai/chat/message/loading_response_message.html +9 -4
- django_spire/ai/chat/templates/django_spire/ai/chat/message/message.html +33 -33
- django_spire/ai/chat/templates/django_spire/ai/chat/message/request_message.html +5 -8
- django_spire/ai/chat/templates/django_spire/ai/chat/message/response_message.html +14 -10
- django_spire/ai/chat/templates/django_spire/ai/chat/page/chat_page.html +35 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/widget/dialog_widget.html +72 -24
- django_spire/ai/chat/templates/django_spire/ai/chat/widget/selection_widget.html +42 -0
- django_spire/ai/chat/tests/test_urls/test_json_urls.py +4 -2
- django_spire/ai/chat/urls/__init__.py +1 -1
- django_spire/ai/chat/urls/json_urls.py +1 -1
- django_spire/ai/chat/urls/page_urls.py +1 -1
- django_spire/ai/chat/urls/{template_urls.py → template/template_urls.py} +1 -1
- django_spire/ai/chat/views/json_views.py +4 -3
- django_spire/ai/chat/views/message_request_views.py +32 -14
- django_spire/ai/chat/views/message_response_views.py +14 -11
- django_spire/ai/chat/views/message_views.py +7 -1
- django_spire/ai/chat/views/page_views.py +2 -2
- django_spire/ai/chat/views/{template_views.py → template/template_views.py} +1 -7
- django_spire/ai/context/__init__.py +0 -0
- django_spire/ai/context/admin.py +15 -0
- django_spire/ai/context/apps.py +16 -0
- django_spire/ai/context/choices.py +11 -0
- django_spire/ai/context/intelligence/__init__.py +0 -0
- django_spire/ai/context/intelligence/prompts/__init__.py +0 -0
- django_spire/ai/context/intelligence/prompts/organization_prompts.py +19 -0
- django_spire/ai/context/migrations/0001_initial.py +67 -0
- django_spire/ai/context/migrations/__init__.py +0 -0
- django_spire/ai/context/models.py +67 -0
- django_spire/ai/context/querysets.py +15 -0
- django_spire/ai/context/seeding/__init__.py +0 -0
- django_spire/ai/context/seeding/seed.py +24 -0
- django_spire/ai/prompt/system/bots.py +3 -5
- django_spire/ai/prompt/tuning/bots.py +5 -10
- django_spire/ai/sms/admin.py +2 -0
- django_spire/ai/sms/apps.py +2 -7
- django_spire/ai/sms/decorators.py +2 -2
- django_spire/ai/sms/intelligence/workflows/sms_conversation_workflow.py +18 -18
- django_spire/ai/sms/tests/test_webhook.py +5 -4
- django_spire/ai/sms/urls.py +3 -0
- django_spire/ai/sms/views.py +3 -5
- django_spire/ai/urls.py +2 -0
- django_spire/auth/templates/django_spire/auth/form/login_form.html +25 -0
- django_spire/auth/templates/django_spire/auth/page/auth_page.html +2 -3
- django_spire/auth/templates/django_spire/auth/page/login_page.html +1 -25
- django_spire/conf.py +1 -3
- django_spire/consts.py +1 -7
- django_spire/contrib/seeding/intelligence/bots/seeder_generator_bot.py +3 -2
- django_spire/contrib/utils.py +2 -0
- django_spire/core/management/commands/spire_startapp_pkg/__init__.py +4 -20
- django_spire/core/management/commands/spire_startapp_pkg/builder.py +2 -2
- django_spire/core/management/commands/spire_startapp_pkg/config.py +2 -2
- django_spire/core/management/commands/spire_startapp_pkg/filesystem.py +1 -19
- django_spire/core/management/commands/spire_startapp_pkg/generator.py +8 -8
- django_spire/core/management/commands/spire_startapp_pkg/processor.py +3 -3
- django_spire/core/management/commands/spire_startapp_pkg/registry.py +0 -16
- django_spire/core/management/commands/spire_startapp_pkg/reporter.py +1 -21
- django_spire/core/management/commands/spire_startapp_pkg/resolver.py +0 -15
- django_spire/core/management/commands/spire_startapp_pkg/template/app/views/form_views.py.template +2 -2
- django_spire/core/management/commands/spire_startapp_pkg/template/app/views/page_views.py.template +2 -2
- django_spire/core/management/commands/spire_startapp_pkg/validator.py +9 -9
- django_spire/core/static/django_spire/css/app-button.css +11 -1
- django_spire/core/static/django_spire/css/app-import.css +2 -0
- django_spire/core/static/django_spire/css/app-layout.css +15 -0
- django_spire/core/static/django_spire/css/app-navigation.css +24 -2
- django_spire/core/static/django_spire/css/app-page.css +8 -0
- django_spire/core/static/django_spire/css/app-side-panel.css +102 -0
- django_spire/core/static/django_spire/css/app-text.css +19 -1
- django_spire/core/static/django_spire/css/bootstrap-extension.css +128 -7
- django_spire/core/static/django_spire/css/bootstrap-override.css +161 -111
- django_spire/core/static/django_spire/css/themes/ayu/app-dark.css +0 -4
- django_spire/core/static/django_spire/css/themes/ayu/app-light.css +0 -4
- django_spire/core/static/django_spire/css/themes/catppuccin/app-dark.css +0 -4
- django_spire/core/static/django_spire/css/themes/catppuccin/app-light.css +0 -4
- django_spire/core/static/django_spire/css/themes/default/app-dark.css +0 -4
- django_spire/core/static/django_spire/css/themes/default/app-light.css +0 -4
- django_spire/core/static/django_spire/css/themes/dracula/app-dark.css +0 -4
- django_spire/core/static/django_spire/css/themes/dracula/app-light.css +0 -4
- django_spire/core/static/django_spire/css/themes/gruvbox/app-dark.css +0 -4
- django_spire/core/static/django_spire/css/themes/gruvbox/app-light.css +0 -4
- django_spire/core/static/django_spire/css/themes/material/app-dark.css +0 -4
- django_spire/core/static/django_spire/css/themes/material/app-light.css +0 -4
- django_spire/core/static/django_spire/css/themes/nord/app-dark.css +0 -4
- django_spire/core/static/django_spire/css/themes/nord/app-light.css +0 -4
- django_spire/core/static/django_spire/css/themes/oceanic-next/app-dark.css +0 -4
- django_spire/core/static/django_spire/css/themes/oceanic-next/app-light.css +0 -4
- django_spire/core/static/django_spire/css/themes/one-dark/app-dark.css +0 -4
- django_spire/core/static/django_spire/css/themes/one-dark/app-light.css +0 -4
- django_spire/core/static/django_spire/css/themes/palenight/app-dark.css +0 -4
- django_spire/core/static/django_spire/css/themes/palenight/app-light.css +0 -4
- django_spire/core/static/django_spire/css/themes/rose-pine/app-dark.css +0 -4
- django_spire/core/static/django_spire/css/themes/rose-pine/app-light.css +0 -4
- django_spire/core/static/django_spire/css/themes/synthwave/app-dark.css +0 -4
- django_spire/core/static/django_spire/css/themes/synthwave/app-light.css +0 -4
- django_spire/core/static/django_spire/css/themes/tokyo-night/app-dark.css +0 -4
- django_spire/core/static/django_spire/css/themes/tokyo-night/app-light.css +0 -4
- django_spire/core/static/django_spire/font/Poppins-Black.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-BlackItalic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-Bold.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-BoldItalic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-ExtraBold.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-ExtraBoldItalic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-ExtraLight.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-ExtraLightItalic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-Italic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-Light.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-LightItalic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-Medium.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-MediumItalic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-SemiBold.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-SemiBoldItalic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-Thin.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-ThinItalic.ttf +0 -0
- django_spire/core/static/django_spire/js/ui.js +12 -0
- django_spire/core/templates/django_spire/button/base_button.html +1 -1
- django_spire/core/templates/django_spire/button/primary_dark_outlined_button.html +3 -0
- django_spire/core/templates/django_spire/dropdown/element/dropdown_link_element.html +12 -8
- django_spire/core/templates/django_spire/dropdown/element/ellipsis_dropdown_modal_link_element.html +2 -1
- django_spire/core/templates/django_spire/dropdown/ellipsis_dropdown.html +2 -1
- django_spire/core/templates/django_spire/navigation/accordion/nav_accordion.html +1 -1
- django_spire/core/templates/django_spire/navigation/elements/nav_link.html +1 -1
- django_spire/core/templates/django_spire/navigation/elements/nav_title_divider.html +1 -1
- django_spire/core/templates/django_spire/navigation/side_navigation.html +52 -8
- django_spire/core/templates/django_spire/navigation/top_navigation.html +8 -2
- django_spire/core/templates/django_spire/page/full_page.html +223 -11
- django_spire/core/utils.py +26 -2
- django_spire/knowledge/collection/models.py +24 -0
- django_spire/knowledge/collection/services/transformation_service.py +2 -1
- django_spire/knowledge/collection/tests/test_services/test_transformation_service.py +44 -42
- django_spire/knowledge/collection/urls/form_urls.py +1 -0
- django_spire/knowledge/collection/urls/page_urls.py +1 -0
- django_spire/knowledge/collection/views/form_views.py +13 -2
- django_spire/knowledge/collection/views/page_views.py +36 -4
- django_spire/knowledge/entry/models.py +32 -0
- django_spire/knowledge/entry/services/transformation_services.py +10 -10
- django_spire/knowledge/entry/version/block/data/data.py +2 -1
- django_spire/knowledge/entry/version/block/data/heading_data.py +2 -2
- django_spire/knowledge/entry/version/block/data/list/data.py +3 -4
- django_spire/knowledge/entry/version/block/data/maps.py +3 -5
- django_spire/knowledge/entry/version/block/data/text_data.py +2 -2
- django_spire/knowledge/entry/version/block/models.py +10 -7
- django_spire/knowledge/entry/version/block/services/factory_service.py +11 -10
- django_spire/knowledge/entry/version/block/tests/factories.py +6 -5
- django_spire/knowledge/entry/version/converters/docx_converter.py +1 -1
- django_spire/knowledge/entry/version/intelligence/bots/markdown_format_llm_bot.py +14 -12
- django_spire/knowledge/entry/version/seeding/seeder.py +3 -3
- django_spire/knowledge/entry/version/services/processor_service.py +36 -10
- django_spire/knowledge/entry/version/tests/test_converters/test_docx_converter.py +1 -1
- django_spire/knowledge/entry/version/tests/test_urls/test_page_urls.py +1 -1
- django_spire/knowledge/entry/version/urls/page_urls.py +1 -1
- django_spire/knowledge/entry/version/views/json_views.py +5 -3
- django_spire/knowledge/entry/version/views/page_views.py +11 -12
- django_spire/knowledge/entry/version/views/redirect_views.py +1 -1
- django_spire/knowledge/entry/views/form_views.py +1 -1
- django_spire/knowledge/intelligence/bots/entry_search_llm_bot.py +33 -11
- django_spire/knowledge/intelligence/decoders/__init__.py +0 -0
- django_spire/knowledge/intelligence/{maps/collection_map.py → decoders/collection_decoder.py} +5 -5
- django_spire/knowledge/intelligence/{maps/entry_map.py → decoders/entry_decoder.py} +3 -3
- django_spire/knowledge/intelligence/intel/collection_intel.py +1 -0
- django_spire/knowledge/intelligence/intel/entry_intel.py +5 -2
- django_spire/knowledge/intelligence/intel/message_intel.py +2 -0
- django_spire/knowledge/intelligence/workflows/knowledge_workflow.py +43 -51
- django_spire/knowledge/migrations/0007_alter_collection_options.py +17 -0
- django_spire/knowledge/static/django_spire/knowledge/entry/version/js/editor.js +24 -5
- django_spire/knowledge/templates/django_spire/knowledge/collection/card/top_level_list_card.html +21 -0
- django_spire/knowledge/templates/django_spire/knowledge/collection/component/x_collection_navigation.html +15 -6
- django_spire/knowledge/templates/django_spire/knowledge/collection/element/ellipsis_dropdown.html +22 -0
- django_spire/knowledge/templates/django_spire/knowledge/collection/form/form.html +21 -9
- django_spire/knowledge/templates/django_spire/knowledge/collection/item/collection_item.html +19 -0
- django_spire/knowledge/templates/django_spire/knowledge/collection/page/display_page.html +49 -0
- django_spire/knowledge/templates/django_spire/knowledge/collection/page/form_page.html +1 -1
- django_spire/knowledge/templates/django_spire/knowledge/container/container.html +33 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/file/page/list_page.html +1 -1
- django_spire/knowledge/templates/django_spire/knowledge/entry/item/list_item.html +2 -2
- django_spire/knowledge/templates/django_spire/knowledge/entry/page/form_page.html +1 -1
- django_spire/knowledge/templates/django_spire/knowledge/entry/page/import_form_page.html +1 -1
- django_spire/knowledge/templates/django_spire/knowledge/entry/version/container/detail_container.html +51 -45
- django_spire/knowledge/templates/django_spire/knowledge/entry/version/page/editor_page.html +54 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/version/page/form_page.html +1 -1
- django_spire/knowledge/templates/django_spire/knowledge/message/knowledge_message_intel.html +18 -1
- django_spire/knowledge/templates/django_spire/knowledge/page/full_page.html +37 -0
- django_spire/knowledge/templates/django_spire/knowledge/page/home_page.html +2 -2
- django_spire/knowledge/templates/django_spire/knowledge/sub_navigation/item/collection_sub_navigation_item.html +29 -0
- django_spire/knowledge/templates/django_spire/knowledge/sub_navigation/item/entry_sub_navigation_item.html +20 -0
- django_spire/knowledge/templates/django_spire/knowledge/{navigation/content/navigation_content.html → sub_navigation/widget/collection_entry_sub_navigation_widget.html} +42 -19
- django_spire/knowledge/views/page_views.py +4 -4
- django_spire/settings.py +3 -3
- django_spire/theme/templates/django_spire/theme/card/badges_preview_card.html +0 -1
- django_spire/theme/templates/django_spire/theme/card/base_preview_card.html +1 -0
- django_spire/theme/templates/django_spire/theme/card/typography_preview_card.html +1 -1
- django_spire/theme/templates/django_spire/theme/example/form/example_form.html +2 -0
- django_spire/theme/templates/django_spire/theme/example/form/example_form_card.html +5 -0
- django_spire/theme/templates/django_spire/theme/page/badges_page.html +7 -9
- django_spire/theme/templates/django_spire/theme/page/borders_page.html +6 -9
- django_spire/theme/templates/django_spire/theme/page/buttons_page.html +6 -9
- django_spire/theme/templates/django_spire/theme/page/colors_page.html +6 -6
- django_spire/theme/templates/django_spire/theme/page/dashboard_page.html +57 -0
- django_spire/theme/templates/django_spire/theme/page/django_glue_page.html +7 -9
- django_spire/theme/templates/django_spire/theme/page/theme_page.html +24 -0
- django_spire/theme/templates/django_spire/theme/page/typography_page.html +6 -9
- django_spire/theme/templates/django_spire/theme/section/badge_section_card.html +5 -0
- django_spire/theme/templates/django_spire/theme/section/border_section_card.html +5 -0
- django_spire/theme/templates/django_spire/theme/section/button_section.html +1 -0
- django_spire/theme/templates/django_spire/theme/section/button_section_card.html +5 -0
- django_spire/theme/templates/django_spire/theme/section/color_section.html +10 -10
- django_spire/theme/templates/django_spire/theme/section/color_section_card.html +5 -0
- django_spire/theme/templates/django_spire/theme/section/typography_section.html +41 -1
- django_spire/theme/templates/django_spire/theme/section/typography_section_card.html +5 -0
- {django_spire-0.18.3.dist-info → django_spire-0.19.1.dist-info}/METADATA +3 -3
- {django_spire-0.18.3.dist-info → django_spire-0.19.1.dist-info}/RECORD +229 -190
- django_spire/ai/chat/intelligence/bots/chat_bot.py +0 -8
- django_spire/ai/chat/intelligence/maps/intent_llm_map.py +0 -10
- django_spire/ai/chat/templates/django_spire/ai/chat/page/home_page.html +0 -9
- django_spire/ai/chat/templates/django_spire/ai/chat/widget/chat_widget.html +0 -64
- django_spire/ai/chat/templates/django_spire/ai/chat/widget/search_chat_results_widget.html +0 -25
- django_spire/ai/chat/templates/django_spire/ai/chat/widget/search_chat_widget.html +0 -39
- django_spire/ai/chat/templates/django_spire/ai/chat/widget/select_chat_widget.html +0 -24
- django_spire/ai/chat/tools.py +0 -57
- django_spire/ai/sms/tools.py +0 -57
- django_spire/core/static/django_spire/font/Karla-Bold.ttf +0 -0
- django_spire/core/static/django_spire/font/Merriweather.ttf +0 -0
- django_spire/knowledge/context_processors.py +0 -18
- django_spire/knowledge/templates/django_spire/knowledge/entry/version/page/detail_page.html +0 -25
- django_spire/knowledge/templates/django_spire/knowledge/navigation/card/navigation_card.html +0 -9
- django_spire/knowledge/templates/django_spire/knowledge/navigation/item/collection/collection_item.html +0 -29
- django_spire/knowledge/templates/django_spire/knowledge/navigation/item/entry/entry_item.html +0 -18
- django_spire/knowledge/templates/django_spire/knowledge/navigation/page/full_page.html +0 -90
- /django_spire/ai/chat/intelligence/{bots → decoders}/__init__.py +0 -0
- /django_spire/ai/chat/{intelligence/maps → urls/template}/__init__.py +0 -0
- /django_spire/{knowledge/intelligence/maps → ai/chat/views/template}/__init__.py +0 -0
- /django_spire/knowledge/entry/version/{constants.py → consts.py} +0 -0
- /django_spire/knowledge/templates/django_spire/knowledge/{navigation/item/collection/dropdown/navigation_ellipsis_dropdown.html → sub_navigation/element/collection_sub_navigation_ellipsis_dropdown.html} +0 -0
- /django_spire/knowledge/templates/django_spire/knowledge/{navigation/item/entry/dropdown/navigation_ellipsis_dropdown.html → sub_navigation/element/entry_sub_navigation_ellipsis_dropdown.html} +0 -0
- {django_spire-0.18.3.dist-info → django_spire-0.19.1.dist-info}/WHEEL +0 -0
- {django_spire-0.18.3.dist-info → django_spire-0.19.1.dist-info}/licenses/LICENSE.md +0 -0
- {django_spire-0.18.3.dist-info → django_spire-0.19.1.dist-info}/top_level.txt +0 -0
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
{% extends 'django_spire/speech/speech_synthesis.html' %}
|
|
2
|
-
|
|
3
|
-
{% block speech_synthesis_content %}
|
|
4
|
-
|
|
5
|
-
<div x-data="{
|
|
6
|
-
chat_object_id: '',
|
|
7
|
-
chat_content_type: '',
|
|
8
|
-
select_chat_visible: false,
|
|
9
|
-
chat_dialog_visible: true,
|
|
10
|
-
chat_load_ajax_view: new ViewGlue('{% url "django_spire:ai:chat:template:load" %}'),
|
|
11
|
-
chat_load_recent_view: new ViewGlue('{% url "django_spire:ai:chat:template:recent" %}'),
|
|
12
|
-
|
|
13
|
-
init() {
|
|
14
|
-
if(window.innerWidth >= 576) {
|
|
15
|
-
this.select_chat_visible = true
|
|
16
|
-
this.chat_dialog_visible = true
|
|
17
|
-
}
|
|
18
|
-
this.load_chat(0)
|
|
19
|
-
},
|
|
20
|
-
close_chat_select() {
|
|
21
|
-
if(window.innerWidth < 576) {
|
|
22
|
-
this.select_chat_visible = false
|
|
23
|
-
this.chat_dialog_visible = true
|
|
24
|
-
} else {
|
|
25
|
-
this.select_chat_visible = true
|
|
26
|
-
this.chat_dialog_visible = true
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
load_recent_chats() {
|
|
30
|
-
this.chat_load_recent_view.render_inner(this.$refs.chat_recent_list)
|
|
31
|
-
},
|
|
32
|
-
async load_chat(chat_id) {
|
|
33
|
-
await this.chat_load_ajax_view.render_inner(this.$refs.chat_dialog, {
|
|
34
|
-
chat_id: chat_id
|
|
35
|
-
}
|
|
36
|
-
)
|
|
37
|
-
this.load_recent_chats()
|
|
38
|
-
},
|
|
39
|
-
open_chat_select() {
|
|
40
|
-
this.select_chat_visible = true
|
|
41
|
-
this.chat_dialog_visible = false
|
|
42
|
-
}
|
|
43
|
-
}" class="row">
|
|
44
|
-
<div class="col-auto border-end px-3" x-show="select_chat_visible">
|
|
45
|
-
<div class="row h-100">
|
|
46
|
-
<div
|
|
47
|
-
class="col ps-0 pe-2"
|
|
48
|
-
x-transition:enter.duration.300ms
|
|
49
|
-
x-transition:leave.duration.0ms
|
|
50
|
-
>
|
|
51
|
-
{% include 'django_spire/ai/chat/widget/select_chat_widget.html' %}
|
|
52
|
-
</div>
|
|
53
|
-
<div class="col-auto px-0 h-100 d-block d-md-none text-app-primary"
|
|
54
|
-
style="font-size: 1.6rem; margin-top: -0.2rem;">
|
|
55
|
-
<i x-show="select_chat_visible" @click="close_chat_select()" class="bi bi-x-lg"></i>
|
|
56
|
-
</div>
|
|
57
|
-
</div>
|
|
58
|
-
</div>
|
|
59
|
-
<div x-ref="chat_dialog" x-show="chat_dialog_visible" class="col">
|
|
60
|
-
No Chat Loaded
|
|
61
|
-
</div>
|
|
62
|
-
</div>
|
|
63
|
-
|
|
64
|
-
{% endblock %}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
<div x-data="{
|
|
2
|
-
load_chat_from_search(chat_id) {
|
|
3
|
-
load_chat(chat_id)
|
|
4
|
-
load_recent_chats()
|
|
5
|
-
}
|
|
6
|
-
}" class="row m-0">
|
|
7
|
-
<div class="col-12">
|
|
8
|
-
|
|
9
|
-
{% for search_result in search_results %}
|
|
10
|
-
|
|
11
|
-
<div class="row py-2">
|
|
12
|
-
<div class="col pt-2">
|
|
13
|
-
{{ search_result.name }}
|
|
14
|
-
</div>
|
|
15
|
-
<div class="col-auto">
|
|
16
|
-
<span class="btn btn-app-primary" @click="load_chat_from_search('{{ search_result.id }}')">
|
|
17
|
-
<i class="bi bi-chat-dots-fill"></i>
|
|
18
|
-
</span>
|
|
19
|
-
</div>
|
|
20
|
-
</div>
|
|
21
|
-
|
|
22
|
-
{% endfor %}
|
|
23
|
-
|
|
24
|
-
</div>
|
|
25
|
-
</div>
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
<div x-data="{
|
|
2
|
-
search_query:'',
|
|
3
|
-
search_view: new ViewGlue('{% url "django_spire:ai:chat:template:search_chats" %}'),
|
|
4
|
-
|
|
5
|
-
async submit_user_input() {
|
|
6
|
-
await this.search_view.render_inner(this.$refs.search_results, {query: this.search_query.trim()})
|
|
7
|
-
}
|
|
8
|
-
}">
|
|
9
|
-
<div class="position-relative"
|
|
10
|
-
x-data="{ expanded: false }"
|
|
11
|
-
@click.away="expanded = false"
|
|
12
|
-
@keydown.escape.window="expanded = false">
|
|
13
|
-
|
|
14
|
-
<input
|
|
15
|
-
x-model="search_query"
|
|
16
|
-
type="text"
|
|
17
|
-
name="query"
|
|
18
|
-
class="form-control"
|
|
19
|
-
placeholder="Search..."
|
|
20
|
-
@input.debounce.300ms="submit_user_input"
|
|
21
|
-
@keydown.down="$focus.within($refs.search_results).first()"
|
|
22
|
-
id="searchInput"
|
|
23
|
-
x-ref="search_input"
|
|
24
|
-
@click="expanded = true"
|
|
25
|
-
autocomplete="off"
|
|
26
|
-
>
|
|
27
|
-
|
|
28
|
-
<div
|
|
29
|
-
@keydown.down="$focus.wrap().next()"
|
|
30
|
-
@keydown.up="$focus.wrap().previous()"
|
|
31
|
-
x-show="expanded && search_query.trim() !== ''"
|
|
32
|
-
|
|
33
|
-
class="position-absolute overflow-auto top-100 start-0 w-100 border border-bottom-2 rounded-bottom-1 shadow p-0 m-0"
|
|
34
|
-
style="z-index: 1100;"
|
|
35
|
-
x-ref="search_results">
|
|
36
|
-
|
|
37
|
-
</div>
|
|
38
|
-
</div>
|
|
39
|
-
</div>
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
<div x-data="{
|
|
2
|
-
}" x-init="load_recent_chats()" class="row">
|
|
3
|
-
<div class="col-12">
|
|
4
|
-
{# <div class="row pb-2">#}
|
|
5
|
-
{# <div class="col">#}
|
|
6
|
-
{# {% include 'django_spire/ai/chat/widget/chat_search_widget.html' %}#}
|
|
7
|
-
{# </div>#}
|
|
8
|
-
{# </div>#}
|
|
9
|
-
|
|
10
|
-
<div class="row">
|
|
11
|
-
<div class="col-12">
|
|
12
|
-
<button x-on:click="load_chat(0)" class="btn btn-sm btn-app-primary-outlined w-100">
|
|
13
|
-
<i class="bi bi-plus-lg"></i> Create New Chat
|
|
14
|
-
</button>
|
|
15
|
-
</div>
|
|
16
|
-
</div>
|
|
17
|
-
|
|
18
|
-
<div class="row mt-2">
|
|
19
|
-
<div x-ref="chat_recent_list" class="col-12 overflow-auto" style="height: calc(100vh - 30px - var(--app-top-navigation-height));">
|
|
20
|
-
No Recent Chats
|
|
21
|
-
</div>
|
|
22
|
-
</div>
|
|
23
|
-
</div>
|
|
24
|
-
</div>
|
django_spire/ai/chat/tools.py
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from importlib import import_module
|
|
4
|
-
from typing import TYPE_CHECKING
|
|
5
|
-
|
|
6
|
-
from django.conf import settings
|
|
7
|
-
|
|
8
|
-
from django_spire.ai.chat.message_intel import BaseMessageIntel
|
|
9
|
-
from django_spire.ai.decorators import log_ai_interaction_from_recorder
|
|
10
|
-
from django_spire.consts import AI_CHAT_WORKFLOW_CLASS_SETTINGS_NAME
|
|
11
|
-
|
|
12
|
-
if TYPE_CHECKING:
|
|
13
|
-
from dandy.llm.request.message import MessageHistory
|
|
14
|
-
from django.core.handlers.wsgi import WSGIRequest
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def chat_workflow_process(
|
|
18
|
-
request: WSGIRequest,
|
|
19
|
-
user_input: str | None = None,
|
|
20
|
-
message_history: MessageHistory | None = None
|
|
21
|
-
) -> BaseMessageIntel:
|
|
22
|
-
if user_input is None:
|
|
23
|
-
message = 'user_input is required'
|
|
24
|
-
raise ValueError(message)
|
|
25
|
-
|
|
26
|
-
chat_workflow_class = getattr(settings, AI_CHAT_WORKFLOW_CLASS_SETTINGS_NAME)
|
|
27
|
-
|
|
28
|
-
if chat_workflow_class is None:
|
|
29
|
-
message = f'"{AI_CHAT_WORKFLOW_CLASS_SETTINGS_NAME}" must be set in the django settings.'
|
|
30
|
-
raise ValueError(message)
|
|
31
|
-
|
|
32
|
-
module_name = '.'.join(chat_workflow_class.split('.')[:-1])
|
|
33
|
-
object_name = chat_workflow_class.split('.')[-1]
|
|
34
|
-
|
|
35
|
-
try:
|
|
36
|
-
workflow_module = import_module(module_name)
|
|
37
|
-
except ImportError:
|
|
38
|
-
message = f'Could not import workflow module: {module_name}'
|
|
39
|
-
raise ImportError(message) from None
|
|
40
|
-
|
|
41
|
-
ChatWorkFlow = getattr(workflow_module, object_name)
|
|
42
|
-
|
|
43
|
-
@log_ai_interaction_from_recorder(request.user)
|
|
44
|
-
def run_workflow_process() -> BaseMessageIntel:
|
|
45
|
-
return ChatWorkFlow.process(
|
|
46
|
-
request=request,
|
|
47
|
-
user_input=user_input,
|
|
48
|
-
message_history=message_history,
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
output_intel = run_workflow_process()
|
|
52
|
-
|
|
53
|
-
if not issubclass(output_intel.__class__, BaseMessageIntel):
|
|
54
|
-
message = f'{ChatWorkFlow.__class__.__module__}.{ChatWorkFlow.__class__.__qualname__}.process must return an instance of a {BaseMessageIntel.__name__} sub class.'
|
|
55
|
-
raise TypeError(message)
|
|
56
|
-
|
|
57
|
-
return output_intel
|
django_spire/ai/sms/tools.py
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from importlib import import_module
|
|
4
|
-
|
|
5
|
-
from dandy.llm.request.message import MessageHistory
|
|
6
|
-
from django.conf import settings
|
|
7
|
-
from django.contrib.auth.base_user import AbstractBaseUser
|
|
8
|
-
from django.core.handlers.wsgi import WSGIRequest
|
|
9
|
-
|
|
10
|
-
from django_spire.ai.decorators import log_ai_interaction_from_recorder
|
|
11
|
-
from django_spire.ai.sms.intel import SmsIntel
|
|
12
|
-
from django_spire.consts import AI_SMS_CONVERSATION_WORKFLOW_CLASS_SETTINGS_NAME
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def sms_workflow_process(
|
|
16
|
-
request: WSGIRequest,
|
|
17
|
-
user_input: str | None = None,
|
|
18
|
-
message_history: MessageHistory | None = None,
|
|
19
|
-
user: AbstractBaseUser | None = None,
|
|
20
|
-
actor: str | None = None
|
|
21
|
-
) -> SmsIntel:
|
|
22
|
-
if user_input is None:
|
|
23
|
-
message = 'SMS user_input is required'
|
|
24
|
-
raise ValueError(message)
|
|
25
|
-
|
|
26
|
-
sms_workflow_class = getattr(settings, AI_SMS_CONVERSATION_WORKFLOW_CLASS_SETTINGS_NAME)
|
|
27
|
-
|
|
28
|
-
if sms_workflow_class is None:
|
|
29
|
-
message = f'"{AI_SMS_CONVERSATION_WORKFLOW_CLASS_SETTINGS_NAME}" must be set in the django settings.'
|
|
30
|
-
raise ValueError(message)
|
|
31
|
-
|
|
32
|
-
module_name = '.'.join(sms_workflow_class.split('.')[:-1])
|
|
33
|
-
object_name = sms_workflow_class.split('.')[-1]
|
|
34
|
-
|
|
35
|
-
try:
|
|
36
|
-
workflow_module = import_module(module_name)
|
|
37
|
-
except ImportError:
|
|
38
|
-
message = f'Could not import workflow module: {module_name}'
|
|
39
|
-
raise ImportError(message) from None
|
|
40
|
-
|
|
41
|
-
SmsWorkFlow = getattr(workflow_module, object_name)
|
|
42
|
-
|
|
43
|
-
@log_ai_interaction_from_recorder(user=user, actor=actor)
|
|
44
|
-
def run_workflow_process() -> SmsIntel:
|
|
45
|
-
return SmsWorkFlow.process(
|
|
46
|
-
request=request,
|
|
47
|
-
user_input=user_input,
|
|
48
|
-
message_history=message_history,
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
output_intel = run_workflow_process()
|
|
52
|
-
|
|
53
|
-
if not issubclass(output_intel.__class__, SmsIntel):
|
|
54
|
-
message = f'{SmsWorkFlow.__class__.__module__}.{SmsWorkFlow.__class__.__qualname__}.process must return an instance of a {SmsIntel.__name__}.'
|
|
55
|
-
raise TypeError(message)
|
|
56
|
-
|
|
57
|
-
return output_intel
|
|
Binary file
|
|
Binary file
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import Any
|
|
4
|
-
|
|
5
|
-
from django.core.handlers.wsgi import WSGIRequest
|
|
6
|
-
|
|
7
|
-
from django_spire.knowledge.collection.models import Collection
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def django_spire_knowledge(request: WSGIRequest) -> dict[str, Any]:
|
|
11
|
-
if not request.user.is_authenticated:
|
|
12
|
-
return {}
|
|
13
|
-
|
|
14
|
-
return {
|
|
15
|
-
'collection_tree_json': Collection.services.transformation.to_hierarchy_json(
|
|
16
|
-
request=request,
|
|
17
|
-
)
|
|
18
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
{% extends 'django_spire/knowledge/navigation/page/full_page.html' %}
|
|
2
|
-
|
|
3
|
-
{% load static %}
|
|
4
|
-
|
|
5
|
-
{% block base_body_top_js %}
|
|
6
|
-
{{ block.super }}
|
|
7
|
-
<script src="https://cdn.jsdelivr.net/npm/@editorjs/editorjs@2.31.0/dist/editorjs.umd.min.js"></script>
|
|
8
|
-
<script src="https://cdn.jsdelivr.net/npm/@editorjs/paragraph@2.11.7/dist/paragraph.umd.min.js"></script>
|
|
9
|
-
<script src="https://cdn.jsdelivr.net/npm/@editorjs/list@2.0.8/dist/editorjs-list.umd.min.js"></script>
|
|
10
|
-
<script src="https://cdn.jsdelivr.net/npm/@editorjs/header@2.8.8/dist/header.umd.min.js"></script>
|
|
11
|
-
{% endblock %}
|
|
12
|
-
|
|
13
|
-
{% block knowledge_full_page_content %}
|
|
14
|
-
<div class="row justify-content-center ps-3">
|
|
15
|
-
<div class="col-12 col-xl-8">
|
|
16
|
-
{% include 'django_spire/knowledge/entry/version/container/detail_container.html' %}
|
|
17
|
-
</div>
|
|
18
|
-
</div>
|
|
19
|
-
{% endblock %}
|
|
20
|
-
|
|
21
|
-
{% block base_body_additional_bottom_js %}
|
|
22
|
-
{{ block.super }}
|
|
23
|
-
<script type="application/javascript" src="{% static 'django_spire/knowledge/entry/version/js/null_paragraph.js' %}?v={{ DJANGO_SPIRE_VERSION }}"></script>
|
|
24
|
-
<script type="application/javascript" src="{% static 'django_spire/knowledge/entry/version/js/editor.js' %}?v={{ DJANGO_SPIRE_VERSION }}"></script>
|
|
25
|
-
{% endblock %}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
<div class="knowledge-nav-item cursor-pointer row">
|
|
2
|
-
<div
|
|
3
|
-
class="col text-start"
|
|
4
|
-
{% if AuthController.knowledge.can_view %}
|
|
5
|
-
@click="collection.toggle_show_details({value: !collection.show_details})"
|
|
6
|
-
{% endif %}
|
|
7
|
-
>
|
|
8
|
-
<i
|
|
9
|
-
:class="collection.show_details ? 'bi bi-chevron-down' : 'bi bi-chevron-right'"
|
|
10
|
-
{% if hide_chevron %}
|
|
11
|
-
style="visibility: hidden"
|
|
12
|
-
{% else %}
|
|
13
|
-
:style="{visibility: (collection.has_child_collections() || collection.has_entries()) ? 'visible' : 'hidden'}"
|
|
14
|
-
{% endif %}
|
|
15
|
-
></i>
|
|
16
|
-
<i class="bi bi-folder2 fs-5"></i>
|
|
17
|
-
<span
|
|
18
|
-
:class="collection.id === {{ collection.pk|default:0 }} ? 'text-app-accent' : ''"
|
|
19
|
-
x-text="collection.name"
|
|
20
|
-
></span>
|
|
21
|
-
</div>
|
|
22
|
-
{% if AuthController.knowledge.can_view %}
|
|
23
|
-
<div class="col-auto">
|
|
24
|
-
<div class="d-flex h-100 justify-content-center align-items-center">
|
|
25
|
-
{% include 'django_spire/knowledge/navigation/item/collection/dropdown/navigation_ellipsis_dropdown.html' %}
|
|
26
|
-
</div>
|
|
27
|
-
</div>
|
|
28
|
-
{% endif %}
|
|
29
|
-
</div>
|
django_spire/knowledge/templates/django_spire/knowledge/navigation/item/entry/entry_item.html
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
<div class="row ms-4 knowledge-nav-item cursor-pointer">
|
|
2
|
-
<a
|
|
3
|
-
class="col text-decoration-none text-app-default-text-color"
|
|
4
|
-
{% if AuthController.knowledge.can_view %}
|
|
5
|
-
:href="'{% url "django_spire:knowledge:entry:version:page:detail" pk=0 %}'.replace(0, entry.version_id)"
|
|
6
|
-
{% endif %}
|
|
7
|
-
>
|
|
8
|
-
<i class="bi bi-file-earmark-text"></i>
|
|
9
|
-
<span class="fw-normal" x-text="entry.name"></span>
|
|
10
|
-
</a>
|
|
11
|
-
{% if AuthController.knowledge.can_view %}
|
|
12
|
-
<div class="col-auto">
|
|
13
|
-
<div class="d-flex h-100 justify-content-center align-items-center">
|
|
14
|
-
{% include 'django_spire/knowledge/navigation/item/entry/dropdown/navigation_ellipsis_dropdown.html' %}
|
|
15
|
-
</div>
|
|
16
|
-
</div>
|
|
17
|
-
{% endif %}
|
|
18
|
-
</div>
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
{% extends 'django_spire/page/full_page.html' %}
|
|
2
|
-
|
|
3
|
-
{% load static %}
|
|
4
|
-
|
|
5
|
-
{% block base_head_additional_css %}
|
|
6
|
-
<link rel="stylesheet" href="{% static 'django_spire/knowledge/css/navigation_items.css' %}?v={{ DJANGO_SPIRE_VERSION }}">
|
|
7
|
-
{% endblock %}
|
|
8
|
-
|
|
9
|
-
{% block base_body_top_js %}
|
|
10
|
-
<script type="application/javascript" src="{% static 'django_spire/knowledge/collection/js/managers.js' %}?v={{ DJANGO_SPIRE_VERSION }}"></script>
|
|
11
|
-
{% endblock %}
|
|
12
|
-
|
|
13
|
-
{% block full_page_content %}
|
|
14
|
-
<div
|
|
15
|
-
class="row h-100 position-relative"
|
|
16
|
-
x-data="{
|
|
17
|
-
nav_toggle_type: null,
|
|
18
|
-
show_side_nav: false,
|
|
19
|
-
|
|
20
|
-
set_nav_toggle_type() {
|
|
21
|
-
this.nav_toggle_type = window.innerWidth > 768 ? 'collapse' : 'offcanvas'
|
|
22
|
-
},
|
|
23
|
-
handle_resize() {
|
|
24
|
-
this.set_nav_toggle_type()
|
|
25
|
-
if (this.nav_toggle_type === 'offcanvas') {
|
|
26
|
-
document.getElementById('side-nav').classList.remove('show')
|
|
27
|
-
this.show_side_nav = false
|
|
28
|
-
}
|
|
29
|
-
if (this.nav_toggle_type === 'collapse') {
|
|
30
|
-
document.getElementById('side-nav').classList.add('show')
|
|
31
|
-
this.show_side_nav = true
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}"
|
|
35
|
-
x-init="set_nav_toggle_type()"
|
|
36
|
-
@resize.window="handle_resize()"
|
|
37
|
-
>
|
|
38
|
-
<div class="col">
|
|
39
|
-
{% block knowledge_full_page_content %}
|
|
40
|
-
{% endblock %}
|
|
41
|
-
</div>
|
|
42
|
-
<div class="col-auto position-relative border-start">
|
|
43
|
-
<div
|
|
44
|
-
@click="show_side_nav = !show_side_nav"
|
|
45
|
-
class="position-absolute"
|
|
46
|
-
style="top: 10vh; left: -10px;"
|
|
47
|
-
>
|
|
48
|
-
|
|
49
|
-
<i
|
|
50
|
-
:class="show_side_nav && nav_toggle_type === 'collapse' ? 'bi-arrow-right-circle-fill' : 'bi-arrow-left-circle-fill'"
|
|
51
|
-
type="button"
|
|
52
|
-
class="bi fs-4 text-app-default-text-color"
|
|
53
|
-
:data-bs-toggle="nav_toggle_type"
|
|
54
|
-
data-bs-target="#side-nav"
|
|
55
|
-
aria-expanded="false"
|
|
56
|
-
aria-controls="side-nav"
|
|
57
|
-
></i>
|
|
58
|
-
</div>
|
|
59
|
-
</div>
|
|
60
|
-
<div
|
|
61
|
-
class="col-auto bg-app-layer-one ps-0"
|
|
62
|
-
:class="nav_toggle_type === 'collapse' ? 'collapse collapse-horizontal' : 'offcanvas offcanvas-end'"
|
|
63
|
-
data-bs-backdrop="false"
|
|
64
|
-
id="side-nav"
|
|
65
|
-
x-cloak
|
|
66
|
-
>
|
|
67
|
-
<div
|
|
68
|
-
class="position-relative h-100"
|
|
69
|
-
:style="nav_toggle_type === 'collapse' && 'width: 400px'"
|
|
70
|
-
>
|
|
71
|
-
<template x-if="nav_toggle_type === 'offcanvas'"> {# Needs to be template, x-show doesn't work here #}
|
|
72
|
-
<div class="w-100 d-flex justify-content-end pb-2">
|
|
73
|
-
<i
|
|
74
|
-
class="bi bi-x-lg cursor-pointer fs-5"
|
|
75
|
-
style="padding-top: 10px; padding-right: calc(var(--bs-gutter-x) * .5);"
|
|
76
|
-
data-bs-toggle="offcanvas"
|
|
77
|
-
>
|
|
78
|
-
</i>
|
|
79
|
-
</div>
|
|
80
|
-
</template>
|
|
81
|
-
{% include 'django_spire/knowledge/navigation/content/navigation_content.html' %}
|
|
82
|
-
</div>
|
|
83
|
-
</div>
|
|
84
|
-
</div>
|
|
85
|
-
|
|
86
|
-
{% endblock %}
|
|
87
|
-
|
|
88
|
-
{% block base_body_additional_bottom_js %}
|
|
89
|
-
<script type="application/javascript" src="{% static 'django_spire/knowledge/collection/js/x_component.js' %}?v={{ DJANGO_SPIRE_VERSION }}"></script>
|
|
90
|
-
{% endblock %}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|