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.
Files changed (246) hide show
  1. django_spire/ai/admin.py +1 -0
  2. django_spire/ai/chat/apps.py +1 -8
  3. django_spire/ai/chat/intelligence/decoders/tools.py +29 -0
  4. django_spire/ai/chat/intelligence/prompts.py +13 -7
  5. django_spire/ai/chat/intelligence/workflows/chat_workflow.py +55 -57
  6. django_spire/ai/chat/models.py +2 -1
  7. django_spire/ai/chat/querysets.py +1 -3
  8. django_spire/ai/chat/responses.py +5 -0
  9. django_spire/ai/chat/templates/django_spire/ai/chat/card/chat_card.html +2 -2
  10. django_spire/ai/chat/templates/django_spire/ai/chat/dropdown/ellipsis_dropdown.html +1 -1
  11. django_spire/ai/chat/templates/django_spire/ai/chat/element/recent_chat_select_element.html +82 -44
  12. django_spire/ai/chat/templates/django_spire/ai/chat/message/loading_response_message.html +9 -4
  13. django_spire/ai/chat/templates/django_spire/ai/chat/message/message.html +33 -33
  14. django_spire/ai/chat/templates/django_spire/ai/chat/message/request_message.html +5 -8
  15. django_spire/ai/chat/templates/django_spire/ai/chat/message/response_message.html +14 -10
  16. django_spire/ai/chat/templates/django_spire/ai/chat/page/chat_page.html +35 -0
  17. django_spire/ai/chat/templates/django_spire/ai/chat/widget/dialog_widget.html +72 -24
  18. django_spire/ai/chat/templates/django_spire/ai/chat/widget/selection_widget.html +42 -0
  19. django_spire/ai/chat/tests/test_urls/test_json_urls.py +4 -2
  20. django_spire/ai/chat/urls/__init__.py +1 -1
  21. django_spire/ai/chat/urls/json_urls.py +1 -1
  22. django_spire/ai/chat/urls/page_urls.py +1 -1
  23. django_spire/ai/chat/urls/{template_urls.py → template/template_urls.py} +1 -1
  24. django_spire/ai/chat/views/json_views.py +4 -3
  25. django_spire/ai/chat/views/message_request_views.py +32 -14
  26. django_spire/ai/chat/views/message_response_views.py +14 -11
  27. django_spire/ai/chat/views/message_views.py +7 -1
  28. django_spire/ai/chat/views/page_views.py +2 -2
  29. django_spire/ai/chat/views/{template_views.py → template/template_views.py} +1 -7
  30. django_spire/ai/context/__init__.py +0 -0
  31. django_spire/ai/context/admin.py +15 -0
  32. django_spire/ai/context/apps.py +16 -0
  33. django_spire/ai/context/choices.py +11 -0
  34. django_spire/ai/context/intelligence/__init__.py +0 -0
  35. django_spire/ai/context/intelligence/prompts/__init__.py +0 -0
  36. django_spire/ai/context/intelligence/prompts/organization_prompts.py +19 -0
  37. django_spire/ai/context/migrations/0001_initial.py +67 -0
  38. django_spire/ai/context/migrations/__init__.py +0 -0
  39. django_spire/ai/context/models.py +67 -0
  40. django_spire/ai/context/querysets.py +15 -0
  41. django_spire/ai/context/seeding/__init__.py +0 -0
  42. django_spire/ai/context/seeding/seed.py +24 -0
  43. django_spire/ai/prompt/system/bots.py +3 -5
  44. django_spire/ai/prompt/tuning/bots.py +5 -10
  45. django_spire/ai/sms/admin.py +2 -0
  46. django_spire/ai/sms/apps.py +2 -7
  47. django_spire/ai/sms/decorators.py +2 -2
  48. django_spire/ai/sms/intelligence/workflows/sms_conversation_workflow.py +18 -18
  49. django_spire/ai/sms/tests/test_webhook.py +5 -4
  50. django_spire/ai/sms/urls.py +3 -0
  51. django_spire/ai/sms/views.py +3 -5
  52. django_spire/ai/urls.py +2 -0
  53. django_spire/auth/templates/django_spire/auth/form/login_form.html +25 -0
  54. django_spire/auth/templates/django_spire/auth/page/auth_page.html +2 -3
  55. django_spire/auth/templates/django_spire/auth/page/login_page.html +1 -25
  56. django_spire/conf.py +1 -3
  57. django_spire/consts.py +1 -7
  58. django_spire/contrib/seeding/intelligence/bots/seeder_generator_bot.py +3 -2
  59. django_spire/contrib/utils.py +2 -0
  60. django_spire/core/management/commands/spire_startapp_pkg/__init__.py +4 -20
  61. django_spire/core/management/commands/spire_startapp_pkg/builder.py +2 -2
  62. django_spire/core/management/commands/spire_startapp_pkg/config.py +2 -2
  63. django_spire/core/management/commands/spire_startapp_pkg/filesystem.py +1 -19
  64. django_spire/core/management/commands/spire_startapp_pkg/generator.py +8 -8
  65. django_spire/core/management/commands/spire_startapp_pkg/processor.py +3 -3
  66. django_spire/core/management/commands/spire_startapp_pkg/registry.py +0 -16
  67. django_spire/core/management/commands/spire_startapp_pkg/reporter.py +1 -21
  68. django_spire/core/management/commands/spire_startapp_pkg/resolver.py +0 -15
  69. django_spire/core/management/commands/spire_startapp_pkg/template/app/views/form_views.py.template +2 -2
  70. django_spire/core/management/commands/spire_startapp_pkg/template/app/views/page_views.py.template +2 -2
  71. django_spire/core/management/commands/spire_startapp_pkg/validator.py +9 -9
  72. django_spire/core/static/django_spire/css/app-button.css +11 -1
  73. django_spire/core/static/django_spire/css/app-import.css +2 -0
  74. django_spire/core/static/django_spire/css/app-layout.css +15 -0
  75. django_spire/core/static/django_spire/css/app-navigation.css +24 -2
  76. django_spire/core/static/django_spire/css/app-page.css +8 -0
  77. django_spire/core/static/django_spire/css/app-side-panel.css +102 -0
  78. django_spire/core/static/django_spire/css/app-text.css +19 -1
  79. django_spire/core/static/django_spire/css/bootstrap-extension.css +128 -7
  80. django_spire/core/static/django_spire/css/bootstrap-override.css +161 -111
  81. django_spire/core/static/django_spire/css/themes/ayu/app-dark.css +0 -4
  82. django_spire/core/static/django_spire/css/themes/ayu/app-light.css +0 -4
  83. django_spire/core/static/django_spire/css/themes/catppuccin/app-dark.css +0 -4
  84. django_spire/core/static/django_spire/css/themes/catppuccin/app-light.css +0 -4
  85. django_spire/core/static/django_spire/css/themes/default/app-dark.css +0 -4
  86. django_spire/core/static/django_spire/css/themes/default/app-light.css +0 -4
  87. django_spire/core/static/django_spire/css/themes/dracula/app-dark.css +0 -4
  88. django_spire/core/static/django_spire/css/themes/dracula/app-light.css +0 -4
  89. django_spire/core/static/django_spire/css/themes/gruvbox/app-dark.css +0 -4
  90. django_spire/core/static/django_spire/css/themes/gruvbox/app-light.css +0 -4
  91. django_spire/core/static/django_spire/css/themes/material/app-dark.css +0 -4
  92. django_spire/core/static/django_spire/css/themes/material/app-light.css +0 -4
  93. django_spire/core/static/django_spire/css/themes/nord/app-dark.css +0 -4
  94. django_spire/core/static/django_spire/css/themes/nord/app-light.css +0 -4
  95. django_spire/core/static/django_spire/css/themes/oceanic-next/app-dark.css +0 -4
  96. django_spire/core/static/django_spire/css/themes/oceanic-next/app-light.css +0 -4
  97. django_spire/core/static/django_spire/css/themes/one-dark/app-dark.css +0 -4
  98. django_spire/core/static/django_spire/css/themes/one-dark/app-light.css +0 -4
  99. django_spire/core/static/django_spire/css/themes/palenight/app-dark.css +0 -4
  100. django_spire/core/static/django_spire/css/themes/palenight/app-light.css +0 -4
  101. django_spire/core/static/django_spire/css/themes/rose-pine/app-dark.css +0 -4
  102. django_spire/core/static/django_spire/css/themes/rose-pine/app-light.css +0 -4
  103. django_spire/core/static/django_spire/css/themes/synthwave/app-dark.css +0 -4
  104. django_spire/core/static/django_spire/css/themes/synthwave/app-light.css +0 -4
  105. django_spire/core/static/django_spire/css/themes/tokyo-night/app-dark.css +0 -4
  106. django_spire/core/static/django_spire/css/themes/tokyo-night/app-light.css +0 -4
  107. django_spire/core/static/django_spire/font/Poppins-Black.ttf +0 -0
  108. django_spire/core/static/django_spire/font/Poppins-BlackItalic.ttf +0 -0
  109. django_spire/core/static/django_spire/font/Poppins-Bold.ttf +0 -0
  110. django_spire/core/static/django_spire/font/Poppins-BoldItalic.ttf +0 -0
  111. django_spire/core/static/django_spire/font/Poppins-ExtraBold.ttf +0 -0
  112. django_spire/core/static/django_spire/font/Poppins-ExtraBoldItalic.ttf +0 -0
  113. django_spire/core/static/django_spire/font/Poppins-ExtraLight.ttf +0 -0
  114. django_spire/core/static/django_spire/font/Poppins-ExtraLightItalic.ttf +0 -0
  115. django_spire/core/static/django_spire/font/Poppins-Italic.ttf +0 -0
  116. django_spire/core/static/django_spire/font/Poppins-Light.ttf +0 -0
  117. django_spire/core/static/django_spire/font/Poppins-LightItalic.ttf +0 -0
  118. django_spire/core/static/django_spire/font/Poppins-Medium.ttf +0 -0
  119. django_spire/core/static/django_spire/font/Poppins-MediumItalic.ttf +0 -0
  120. django_spire/core/static/django_spire/font/Poppins-SemiBold.ttf +0 -0
  121. django_spire/core/static/django_spire/font/Poppins-SemiBoldItalic.ttf +0 -0
  122. django_spire/core/static/django_spire/font/Poppins-Thin.ttf +0 -0
  123. django_spire/core/static/django_spire/font/Poppins-ThinItalic.ttf +0 -0
  124. django_spire/core/static/django_spire/js/ui.js +12 -0
  125. django_spire/core/templates/django_spire/button/base_button.html +1 -1
  126. django_spire/core/templates/django_spire/button/primary_dark_outlined_button.html +3 -0
  127. django_spire/core/templates/django_spire/dropdown/element/dropdown_link_element.html +12 -8
  128. django_spire/core/templates/django_spire/dropdown/element/ellipsis_dropdown_modal_link_element.html +2 -1
  129. django_spire/core/templates/django_spire/dropdown/ellipsis_dropdown.html +2 -1
  130. django_spire/core/templates/django_spire/navigation/accordion/nav_accordion.html +1 -1
  131. django_spire/core/templates/django_spire/navigation/elements/nav_link.html +1 -1
  132. django_spire/core/templates/django_spire/navigation/elements/nav_title_divider.html +1 -1
  133. django_spire/core/templates/django_spire/navigation/side_navigation.html +52 -8
  134. django_spire/core/templates/django_spire/navigation/top_navigation.html +8 -2
  135. django_spire/core/templates/django_spire/page/full_page.html +223 -11
  136. django_spire/core/utils.py +26 -2
  137. django_spire/knowledge/collection/models.py +24 -0
  138. django_spire/knowledge/collection/services/transformation_service.py +2 -1
  139. django_spire/knowledge/collection/tests/test_services/test_transformation_service.py +44 -42
  140. django_spire/knowledge/collection/urls/form_urls.py +1 -0
  141. django_spire/knowledge/collection/urls/page_urls.py +1 -0
  142. django_spire/knowledge/collection/views/form_views.py +13 -2
  143. django_spire/knowledge/collection/views/page_views.py +36 -4
  144. django_spire/knowledge/entry/models.py +32 -0
  145. django_spire/knowledge/entry/services/transformation_services.py +10 -10
  146. django_spire/knowledge/entry/version/block/data/data.py +2 -1
  147. django_spire/knowledge/entry/version/block/data/heading_data.py +2 -2
  148. django_spire/knowledge/entry/version/block/data/list/data.py +3 -4
  149. django_spire/knowledge/entry/version/block/data/maps.py +3 -5
  150. django_spire/knowledge/entry/version/block/data/text_data.py +2 -2
  151. django_spire/knowledge/entry/version/block/models.py +10 -7
  152. django_spire/knowledge/entry/version/block/services/factory_service.py +11 -10
  153. django_spire/knowledge/entry/version/block/tests/factories.py +6 -5
  154. django_spire/knowledge/entry/version/converters/docx_converter.py +1 -1
  155. django_spire/knowledge/entry/version/intelligence/bots/markdown_format_llm_bot.py +14 -12
  156. django_spire/knowledge/entry/version/seeding/seeder.py +3 -3
  157. django_spire/knowledge/entry/version/services/processor_service.py +36 -10
  158. django_spire/knowledge/entry/version/tests/test_converters/test_docx_converter.py +1 -1
  159. django_spire/knowledge/entry/version/tests/test_urls/test_page_urls.py +1 -1
  160. django_spire/knowledge/entry/version/urls/page_urls.py +1 -1
  161. django_spire/knowledge/entry/version/views/json_views.py +5 -3
  162. django_spire/knowledge/entry/version/views/page_views.py +11 -12
  163. django_spire/knowledge/entry/version/views/redirect_views.py +1 -1
  164. django_spire/knowledge/entry/views/form_views.py +1 -1
  165. django_spire/knowledge/intelligence/bots/entry_search_llm_bot.py +33 -11
  166. django_spire/knowledge/intelligence/decoders/__init__.py +0 -0
  167. django_spire/knowledge/intelligence/{maps/collection_map.py → decoders/collection_decoder.py} +5 -5
  168. django_spire/knowledge/intelligence/{maps/entry_map.py → decoders/entry_decoder.py} +3 -3
  169. django_spire/knowledge/intelligence/intel/collection_intel.py +1 -0
  170. django_spire/knowledge/intelligence/intel/entry_intel.py +5 -2
  171. django_spire/knowledge/intelligence/intel/message_intel.py +2 -0
  172. django_spire/knowledge/intelligence/workflows/knowledge_workflow.py +43 -51
  173. django_spire/knowledge/migrations/0007_alter_collection_options.py +17 -0
  174. django_spire/knowledge/static/django_spire/knowledge/entry/version/js/editor.js +24 -5
  175. django_spire/knowledge/templates/django_spire/knowledge/collection/card/top_level_list_card.html +21 -0
  176. django_spire/knowledge/templates/django_spire/knowledge/collection/component/x_collection_navigation.html +15 -6
  177. django_spire/knowledge/templates/django_spire/knowledge/collection/element/ellipsis_dropdown.html +22 -0
  178. django_spire/knowledge/templates/django_spire/knowledge/collection/form/form.html +21 -9
  179. django_spire/knowledge/templates/django_spire/knowledge/collection/item/collection_item.html +19 -0
  180. django_spire/knowledge/templates/django_spire/knowledge/collection/page/display_page.html +49 -0
  181. django_spire/knowledge/templates/django_spire/knowledge/collection/page/form_page.html +1 -1
  182. django_spire/knowledge/templates/django_spire/knowledge/container/container.html +33 -0
  183. django_spire/knowledge/templates/django_spire/knowledge/entry/file/page/list_page.html +1 -1
  184. django_spire/knowledge/templates/django_spire/knowledge/entry/item/list_item.html +2 -2
  185. django_spire/knowledge/templates/django_spire/knowledge/entry/page/form_page.html +1 -1
  186. django_spire/knowledge/templates/django_spire/knowledge/entry/page/import_form_page.html +1 -1
  187. django_spire/knowledge/templates/django_spire/knowledge/entry/version/container/detail_container.html +51 -45
  188. django_spire/knowledge/templates/django_spire/knowledge/entry/version/page/editor_page.html +54 -0
  189. django_spire/knowledge/templates/django_spire/knowledge/entry/version/page/form_page.html +1 -1
  190. django_spire/knowledge/templates/django_spire/knowledge/message/knowledge_message_intel.html +18 -1
  191. django_spire/knowledge/templates/django_spire/knowledge/page/full_page.html +37 -0
  192. django_spire/knowledge/templates/django_spire/knowledge/page/home_page.html +2 -2
  193. django_spire/knowledge/templates/django_spire/knowledge/sub_navigation/item/collection_sub_navigation_item.html +29 -0
  194. django_spire/knowledge/templates/django_spire/knowledge/sub_navigation/item/entry_sub_navigation_item.html +20 -0
  195. django_spire/knowledge/templates/django_spire/knowledge/{navigation/content/navigation_content.html → sub_navigation/widget/collection_entry_sub_navigation_widget.html} +42 -19
  196. django_spire/knowledge/views/page_views.py +4 -4
  197. django_spire/settings.py +3 -3
  198. django_spire/theme/templates/django_spire/theme/card/badges_preview_card.html +0 -1
  199. django_spire/theme/templates/django_spire/theme/card/base_preview_card.html +1 -0
  200. django_spire/theme/templates/django_spire/theme/card/typography_preview_card.html +1 -1
  201. django_spire/theme/templates/django_spire/theme/example/form/example_form.html +2 -0
  202. django_spire/theme/templates/django_spire/theme/example/form/example_form_card.html +5 -0
  203. django_spire/theme/templates/django_spire/theme/page/badges_page.html +7 -9
  204. django_spire/theme/templates/django_spire/theme/page/borders_page.html +6 -9
  205. django_spire/theme/templates/django_spire/theme/page/buttons_page.html +6 -9
  206. django_spire/theme/templates/django_spire/theme/page/colors_page.html +6 -6
  207. django_spire/theme/templates/django_spire/theme/page/dashboard_page.html +57 -0
  208. django_spire/theme/templates/django_spire/theme/page/django_glue_page.html +7 -9
  209. django_spire/theme/templates/django_spire/theme/page/theme_page.html +24 -0
  210. django_spire/theme/templates/django_spire/theme/page/typography_page.html +6 -9
  211. django_spire/theme/templates/django_spire/theme/section/badge_section_card.html +5 -0
  212. django_spire/theme/templates/django_spire/theme/section/border_section_card.html +5 -0
  213. django_spire/theme/templates/django_spire/theme/section/button_section.html +1 -0
  214. django_spire/theme/templates/django_spire/theme/section/button_section_card.html +5 -0
  215. django_spire/theme/templates/django_spire/theme/section/color_section.html +10 -10
  216. django_spire/theme/templates/django_spire/theme/section/color_section_card.html +5 -0
  217. django_spire/theme/templates/django_spire/theme/section/typography_section.html +41 -1
  218. django_spire/theme/templates/django_spire/theme/section/typography_section_card.html +5 -0
  219. {django_spire-0.18.3.dist-info → django_spire-0.19.1.dist-info}/METADATA +3 -3
  220. {django_spire-0.18.3.dist-info → django_spire-0.19.1.dist-info}/RECORD +229 -190
  221. django_spire/ai/chat/intelligence/bots/chat_bot.py +0 -8
  222. django_spire/ai/chat/intelligence/maps/intent_llm_map.py +0 -10
  223. django_spire/ai/chat/templates/django_spire/ai/chat/page/home_page.html +0 -9
  224. django_spire/ai/chat/templates/django_spire/ai/chat/widget/chat_widget.html +0 -64
  225. django_spire/ai/chat/templates/django_spire/ai/chat/widget/search_chat_results_widget.html +0 -25
  226. django_spire/ai/chat/templates/django_spire/ai/chat/widget/search_chat_widget.html +0 -39
  227. django_spire/ai/chat/templates/django_spire/ai/chat/widget/select_chat_widget.html +0 -24
  228. django_spire/ai/chat/tools.py +0 -57
  229. django_spire/ai/sms/tools.py +0 -57
  230. django_spire/core/static/django_spire/font/Karla-Bold.ttf +0 -0
  231. django_spire/core/static/django_spire/font/Merriweather.ttf +0 -0
  232. django_spire/knowledge/context_processors.py +0 -18
  233. django_spire/knowledge/templates/django_spire/knowledge/entry/version/page/detail_page.html +0 -25
  234. django_spire/knowledge/templates/django_spire/knowledge/navigation/card/navigation_card.html +0 -9
  235. django_spire/knowledge/templates/django_spire/knowledge/navigation/item/collection/collection_item.html +0 -29
  236. django_spire/knowledge/templates/django_spire/knowledge/navigation/item/entry/entry_item.html +0 -18
  237. django_spire/knowledge/templates/django_spire/knowledge/navigation/page/full_page.html +0 -90
  238. /django_spire/ai/chat/intelligence/{bots → decoders}/__init__.py +0 -0
  239. /django_spire/ai/chat/{intelligence/maps → urls/template}/__init__.py +0 -0
  240. /django_spire/{knowledge/intelligence/maps → ai/chat/views/template}/__init__.py +0 -0
  241. /django_spire/knowledge/entry/version/{constants.py → consts.py} +0 -0
  242. /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
  243. /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
  244. {django_spire-0.18.3.dist-info → django_spire-0.19.1.dist-info}/WHEEL +0 -0
  245. {django_spire-0.18.3.dist-info → django_spire-0.19.1.dist-info}/licenses/LICENSE.md +0 -0
  246. {django_spire-0.18.3.dist-info → django_spire-0.19.1.dist-info}/top_level.txt +0 -0
@@ -1,8 +0,0 @@
1
- from dandy import Bot
2
-
3
-
4
- class ChatBot(Bot):
5
- llm_config = 'ADVANCED'
6
- llm_task = (
7
- 'Use the following information to the answer the user\'s question or concern.'
8
- )
@@ -1,10 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import ClassVar
4
-
5
- from dandy import Decoder
6
-
7
-
8
- class IntentDecoder(Decoder):
9
- mapping_keys_description = 'The user\'s chat intent'
10
- mapping: ClassVar = {}
@@ -1,9 +0,0 @@
1
- {% extends 'django_spire/page/full_page.html' %}
2
-
3
- {% block full_page_content %}
4
- <div class="row">
5
- <div class="col-12">
6
- {% include 'django_spire/ai/chat/card/chat_card.html' %}
7
- </div>
8
- </div>
9
- {% endblock %}
@@ -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>
@@ -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
@@ -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
@@ -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,9 +0,0 @@
1
- {% extends 'django_spire/card/card.html' %}
2
-
3
- {% block card_padding %}
4
- px-0 py-3
5
- {% endblock %}
6
-
7
- {% block card_content %}
8
- {% include 'django_spire/knowledge/navigation/content/navigation_content.html' %}
9
- {% 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>
@@ -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 %}