django-spire 0.23.2__py3-none-any.whl → 0.23.3__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/consts.py CHANGED
@@ -1,4 +1,4 @@
1
- __VERSION__ = '0.23.2'
1
+ __VERSION__ = '0.23.3'
2
2
 
3
3
  MAINTENANCE_MODE_SETTINGS_NAME = 'MAINTENANCE_MODE'
4
4
 
@@ -0,0 +1,44 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from dandy import Bot, Prompt
6
+
7
+ from django_spire.knowledge.intelligence.intel.answer_intel import AnswerIntel
8
+
9
+ if TYPE_CHECKING:
10
+ from django_spire.knowledge.entry.models import Entry
11
+
12
+
13
+ class KnowledgeAnswerBot(Bot):
14
+ llm_role = 'Knowledge Entry Search Assistant'
15
+ llm_task = 'Read through the knowledge and answer the users request.'
16
+ llm_guidelines = (
17
+ Prompt()
18
+ .list([
19
+ 'Make sure the answer is relevant and reflects knowledge entries.',
20
+ 'Do not make up information use the provided knowledge entries as a source of truth.',
21
+ 'Use line breaks to separate sections of the answer and use 2 if you need to separate the section from the previous.'
22
+ ])
23
+ )
24
+ llm_intel_class = AnswerIntel
25
+
26
+ def process(self, user_input: str, entries: list[Entry]) -> AnswerIntel:
27
+
28
+ entry_prompt = Prompt()
29
+ entry_prompt.sub_heading('User Request')
30
+ entry_prompt.line_break()
31
+ entry_prompt.text(f'{user_input}')
32
+ entry_prompt.line_break()
33
+ entry_prompt.sub_heading('Knowledge')
34
+ entry_prompt.line_break()
35
+
36
+ for entry in entries:
37
+ for version_block in entry.current_version.blocks.all():
38
+ if version_block.render_to_text() != '\n':
39
+ entry_prompt.text(f'{version_block.render_to_text()}')
40
+
41
+ return self.llm.prompt_to_intel(
42
+ prompt=entry_prompt,
43
+ )
44
+
@@ -1,4 +1,5 @@
1
1
  from __future__ import annotations
2
+
2
3
  from typing import TYPE_CHECKING
3
4
 
4
5
  from dandy import Bot, Prompt
@@ -9,14 +10,14 @@ if TYPE_CHECKING:
9
10
  from django_spire.knowledge.entry.models import Entry
10
11
 
11
12
 
12
- class EntriesSearchBot(Bot):
13
+ class KnowledgeEntriesBot(Bot):
13
14
  llm_role = 'Knowledge Entry Search Assistant'
14
- llm_task = 'Read through the knowledge and return information and the block id that relevant to the information request.'
15
+ llm_task = 'Read through the knowledge entries and return the most relevant for the user request.'
15
16
  llm_guidelines = (
16
17
  Prompt()
17
18
  .list([
18
- 'Please read through all the blocks and return 2 of the most relevant ones.',
19
- 'You can add any of the text in the knowledge entries to the 2 responses if it helps.',
19
+ 'Return 1 to 5 of the most relevant knowledge entries using block ids.',
20
+ 'The relevant headings should be the nearest heading above the selected knowledge entry block.',
20
21
  'Make sure the relevant heading text is from a heading with mark down formatting.',
21
22
  'When returning the relevant heading remove any of the markdown formating characters.',
22
23
  ])
@@ -26,7 +27,7 @@ class EntriesSearchBot(Bot):
26
27
  def process(self, user_input: str, entries: list[Entry]) -> EntriesIntel:
27
28
 
28
29
  entry_prompt = Prompt()
29
- entry_prompt.sub_heading('Information Request')
30
+ entry_prompt.sub_heading('User Request')
30
31
  entry_prompt.line_break()
31
32
  entry_prompt.text(f'{user_input}')
32
33
  entry_prompt.line_break()
@@ -0,0 +1,6 @@
1
+ from dandy import BaseIntel
2
+
3
+
4
+
5
+ class AnswerIntel(BaseIntel):
6
+ answer: str
@@ -1,28 +1,17 @@
1
1
  from __future__ import annotations
2
2
 
3
- from enum import Enum
4
3
 
5
4
  from dandy import BaseIntel, BaseListIntel
6
5
 
7
6
  from django_spire.knowledge.entry.models import Entry
8
7
 
9
8
 
10
- class EntryRelevancy(str, Enum):
11
- EXTREMELY = 'Extremely'
12
- VERY = 'Very'
13
- SOMEWHAT = 'Somewhat'
14
- NOT_SO_MUCH = 'Not so much'
15
- NO_RELEVANCE = 'No Relevance'
16
-
17
-
18
9
  class EntryIntel(BaseIntel):
19
10
  relevant_heading_text: str
20
- relevant_text: str
21
11
  relevant_block_id: int
22
- relevancy: EntryRelevancy
23
12
 
24
13
  def __str__(self):
25
- return self.relevant_heading_text + ' ' + self.relevant_text
14
+ return self.relevant_heading_text
26
15
 
27
16
  @property
28
17
  def collection(self):
@@ -1,13 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from django_spire.ai.chat.message_intel import BaseMessageIntel
4
+ from django_spire.knowledge.intelligence.intel.answer_intel import AnswerIntel
4
5
  from django_spire.knowledge.intelligence.intel.entry_intel import EntriesIntel
5
6
 
6
7
 
7
8
  class KnowledgeMessageIntel(BaseMessageIntel):
8
9
  _template: str = 'django_spire/knowledge/message/knowledge_message_intel.html'
9
- body: str
10
+ answer_intel: AnswerIntel
10
11
  entries_intel: EntriesIntel
11
12
 
12
13
  def render_to_str(self) -> str:
13
- return self.body
14
+ return self.answer_intel.answer
@@ -7,7 +7,8 @@ from django.core.handlers.wsgi import WSGIRequest
7
7
  from django_spire.ai.chat.message_intel import DefaultMessageIntel, BaseMessageIntel
8
8
  from django_spire.core.tag.intelligence.tag_set_bot import TagSetBot
9
9
  from django_spire.knowledge.collection.models import Collection
10
- from django_spire.knowledge.intelligence.bots.entries_search_llm_bot import EntriesSearchBot
10
+ from django_spire.knowledge.intelligence.bots.knowledge_answer_bot import KnowledgeAnswerBot
11
+ from django_spire.knowledge.intelligence.bots.knowledge_entries_bot import KnowledgeEntriesBot
11
12
  from django_spire.knowledge.intelligence.intel.message_intel import KnowledgeMessageIntel
12
13
 
13
14
  if TYPE_CHECKING:
@@ -65,12 +66,19 @@ def knowledge_search_workflow(
65
66
  if not entries:
66
67
  return NO_KNOWLEDGE_MESSAGE_INTEL
67
68
 
68
- entries_intel = EntriesSearchBot(llm_temperature=0.0).process(
69
+ answer_intel_future = KnowledgeAnswerBot(llm_temperature=0.5).process_to_future(
69
70
  user_input=user_input,
70
71
  entries=entries
71
72
  )
72
73
 
74
+ entries_intel_future = KnowledgeEntriesBot(llm_temperature=0.5).process_to_future(
75
+ user_input=user_input,
76
+ entries=entries
77
+ )
78
+
79
+ print(entries_intel_future.result)
80
+
73
81
  return KnowledgeMessageIntel(
74
- body=f'{" ".join([str(entry) for entry in entries_intel])}',
75
- entries_intel=entries_intel,
82
+ answer_intel=answer_intel_future.result,
83
+ entries_intel=entries_intel_future.result,
76
84
  )
@@ -74,13 +74,13 @@ function create_editorjs_instance({holder_id, update_url, initial_editor_blocks}
74
74
 
75
75
  if (block_id) {
76
76
  setTimeout(() => {
77
- const element = document.querySelector(`[data-id="${block_id}"]`)
77
+ const element = document.querySelector(`[data-id="${block_id}"]`)?.firstElementChild
78
78
  if (element) {
79
79
  element.scrollIntoView({behavior: 'smooth', block: 'center'})
80
- element.style.transition = 'background-color 1s ease'
81
- element.classList.add('bg-app-accent-soft', 'mx-3', 'rounded-3')
80
+ element.style.transition = 'background-color 1s ease, padding 1s ease'
81
+ element.classList.add('bg-app-accent-soft', 'ps-2', 'rounded-3')
82
82
  setTimeout(() => {
83
- element.classList.remove('bg-app-accent-soft')
83
+ element.classList.remove('bg-app-accent-soft', 'ps-2')
84
84
  }, 4000)
85
85
  }
86
86
  }, 100)
@@ -1,30 +1,32 @@
1
1
  {% extends 'django_spire/ai/chat/message/message.html' %}
2
2
 
3
3
  {% block message_content %}
4
- {% for entry_intel in message_intel.entries_intel %}
5
-
6
- <div class="row">
7
- <div class="col">
8
- {{ entry_intel.relevant_text|linebreaksbr }}
9
- </div>
4
+ <div class="row">
5
+ <div class="col">
6
+ {{ message_intel.answer_intel.answer|linebreaksbr }}
10
7
  </div>
8
+ </div>
11
9
 
12
- <div class="row">
13
- <div class="col pt-1 pb-3 fs-7">
14
- <a href="{% url 'django_spire:knowledge:entry:version:page:editor' pk=entry_intel.entry.id %}?show_sub_nav=false&block_id={{ entry_intel.relevant_block_id }}"
15
- target="_blank">
16
- {{ entry_intel.relevant_heading_text }}
17
- </a>
18
- </div>
19
- </div>
10
+ <div class="row mt-2 p-1" x-data="{show_resources: false}">
11
+ <div class="col-auto mx-2 ps-1 pe-2 py-1 fs-7 rounded-3 border border-primary-subtle">
12
+ <span class="text-muted cursor-pointer" x-on:click="show_resources = !show_resources">
13
+ <i class="bi bi-caret-right" x-show="!show_resources"></i>
14
+ <i class="bi bi-caret-down" x-show="show_resources"></i>
15
+ Sources
16
+ </span>
20
17
 
21
- {% endfor %}
18
+ <ul class="my-0 me-3" x-show="show_resources">
19
+ {% for entry_intel in message_intel.entries_intel %}
20
+ <li class="pb-1">
21
+ <a href="{% url 'django_spire:knowledge:entry:version:page:editor' pk=entry_intel.entry.id %}?show_sub_nav=false&block_id={{ entry_intel.relevant_block_id }}"
22
+ target="_blank">
23
+ {{ entry_intel.relevant_heading_text }}
24
+ </a>
25
+ </li>
26
+ {% endfor %}
27
+ </ul>
22
28
 
23
- <div class="row">
24
- <div class="col">
25
- Is there anything else I can help with?
26
29
  </div>
27
30
  </div>
28
31
 
29
-
30
32
  {% endblock %}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-spire
3
- Version: 0.23.2
3
+ Version: 0.23.3
4
4
  Summary: A project for Django Spire
5
5
  Author-email: Brayden Carlson <braydenc@stratusadv.com>, Nathan Johnson <nathanj@stratusadv.com>
6
6
  License: Copyright (c) 2024 Stratus Advanced Technologies and Contributors.
@@ -1,6 +1,6 @@
1
1
  django_spire/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  django_spire/conf.py,sha256=c5Hs-7lk9T15254tOasiQ2ZTFLQIVJof9_QJDfm1PAI,933
3
- django_spire/consts.py,sha256=gvinNQud8bYSX-PURLRcfJBJmBVQWlEp4R7rxv9E_y0,171
3
+ django_spire/consts.py,sha256=D5oVj-bY46n7ixDPRAWLe0rXEDktcI1whmswDjdKZOE,171
4
4
  django_spire/exceptions.py,sha256=L5ndRO5ftMmh0pHkO2z_NG3LSGZviJ-dDHNT73SzTNw,48
5
5
  django_spire/settings.py,sha256=B4GPqBGt_dmkt0Ay0j-IP-SZ6mY44m2Ap5kVSON5YLA,1005
6
6
  django_spire/urls.py,sha256=mKeZszb5U4iIGqddMb5Tt5fRC72U2wABEOi6mvOfEBU,656
@@ -966,12 +966,14 @@ django_spire/knowledge/entry/views/template_views.py,sha256=Y-3JnslI_hj4WesN8dJb
966
966
  django_spire/knowledge/intelligence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
967
967
  django_spire/knowledge/intelligence/router.py,sha256=4nPcIJJPHtwGgBXrLZiZaSNrfHDADrE5wCznvQOOm2s,802
968
968
  django_spire/knowledge/intelligence/bots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
969
- django_spire/knowledge/intelligence/bots/entries_search_llm_bot.py,sha256=Pnpbu9mzEm2_vKvUNz4DIqZL_XzZx4L44LQ2vIqDPnk,1664
969
+ django_spire/knowledge/intelligence/bots/knowledge_answer_bot.py,sha256=VGS8w25OoJjflBIrPOo9WOvWxceSIIwJ77c-FxSExJk,1501
970
+ django_spire/knowledge/intelligence/bots/knowledge_entries_bot.py,sha256=B8GBBZdpN-PIu1o_N1X55yvelJWC8U7yxRu_0ruwvxU,1642
970
971
  django_spire/knowledge/intelligence/intel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
971
- django_spire/knowledge/intelligence/intel/entry_intel.py,sha256=7B7qLqNl39VFQKq_e5m1ShhSNgN2AV2gqesKRCnXid0,844
972
- django_spire/knowledge/intelligence/intel/message_intel.py,sha256=iYXdOkS1KfP3QH3-KsTSJ_BspRh1vPw-zG7uJMNOWf8,419
972
+ django_spire/knowledge/intelligence/intel/answer_intel.py,sha256=wEo6uqj4bbv6IoYYPA1fD3Q-8UocS2dURa_jJHYuRcU,77
973
+ django_spire/knowledge/intelligence/intel/entry_intel.py,sha256=VgP8l5i8JML6G12kj2nwxP85Cknv00ktb6nrKzInJTE,569
974
+ django_spire/knowledge/intelligence/intel/message_intel.py,sha256=24z1dindbrHGLJH0e8oILxOQopnggLJeam8MMvdgUTc,529
973
975
  django_spire/knowledge/intelligence/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
974
- django_spire/knowledge/intelligence/workflows/knowledge_workflow.py,sha256=55e_zFeeKBglQ73hi3d71Zc7WLUuWO5SwvFLCP5rUDg,2449
976
+ django_spire/knowledge/intelligence/workflows/knowledge_workflow.py,sha256=zfEEDB6b4OI07YtAvzzpCHTssIrdt7twg2_t7iofIpY,2745
975
977
  django_spire/knowledge/migrations/0001_initial.py,sha256=0oAx4e0Tu1wbcMwQZ4I_B2X_EGdEA9Qz_UBdVNGc3yE,5487
976
978
  django_spire/knowledge/migrations/0002_alter_entryversionblock_type.py,sha256=Eg8tLjDO0nJ3go_jgVvoqwYKFOpYUUyNtZtLI2V3IQQ,527
977
979
  django_spire/knowledge/migrations/0003_alter_collection_order_alter_entry_order_and_more.py,sha256=nIIUg1lHQ1iLbPlOulwZgzHrP1erGMYVXDaEdDXv4ik,749
@@ -987,7 +989,7 @@ django_spire/knowledge/static/django_spire/knowledge/collection/js/managers.js,s
987
989
  django_spire/knowledge/static/django_spire/knowledge/collection/js/x_component.js,sha256=avczuHac3i58k06wA-LPpgupedCYbuDVTjTYVjEho18,898
988
990
  django_spire/knowledge/static/django_spire/knowledge/css/editor.css,sha256=9iDzPcMvf462CjfnOkdAFHBfRFt2io8HAyIQfwoSlug,2189
989
991
  django_spire/knowledge/static/django_spire/knowledge/css/navigation_items.css,sha256=jhjW4fiQI13PUAkSupLrLn-Fu9nzAVqMezK8EkJnGZ8,178
990
- django_spire/knowledge/static/django_spire/knowledge/entry/version/js/editor.js,sha256=zDK9PNO7XR0j95I17uBmfguSF8LzYijx3irM2my3IqA,3798
992
+ django_spire/knowledge/static/django_spire/knowledge/entry/version/js/editor.js,sha256=uxkJKCHyAgvVGv3s1MpDvcEYhAuecuoVMFOQMmIe7E0,3842
991
993
  django_spire/knowledge/static/django_spire/knowledge/entry/version/js/managers.js,sha256=q-HiSnOnMMomxU0EAWSbQO55HMVvb8wPxA0KCP3VyP4,2772
992
994
  django_spire/knowledge/static/django_spire/knowledge/entry/version/js/null_paragraph.js,sha256=Bc0oslLdlLcncbcUklhU1RF4PGiByC-mH-ENq1S1Niw,211
993
995
  django_spire/knowledge/templates/django_spire/knowledge/collection/card/form_card.html,sha256=Fm1PFgMJO0B1ji86pjeL_KbGkKq-ho7n6v9gtCODlzU,154
@@ -1015,7 +1017,7 @@ django_spire/knowledge/templates/django_spire/knowledge/entry/page/form_page.htm
1015
1017
  django_spire/knowledge/templates/django_spire/knowledge/entry/page/import_form_page.html,sha256=TK8Bc7mUZwsmV1Xm9FPyWz7Hws68Ijy4c55orvNoOC4,308
1016
1018
  django_spire/knowledge/templates/django_spire/knowledge/entry/version/container/editor_container.html,sha256=-fPVVnCdDUMA0AoKjQ3bA7gRrbnggPRlRlPqYvgIoKA,3153
1017
1019
  django_spire/knowledge/templates/django_spire/knowledge/entry/version/page/editor_page.html,sha256=uAIz2OP9AXah7xbZv_ukjGuKwPH330CqTBmnWGNXBMs,3262
1018
- django_spire/knowledge/templates/django_spire/knowledge/message/knowledge_message_intel.html,sha256=kOSsRJHkh8hFYp1k1Y0wc-wh75VVjdXldEKErkfANGY,855
1020
+ django_spire/knowledge/templates/django_spire/knowledge/message/knowledge_message_intel.html,sha256=n7Lbe_wvLR30B4Ko0Of_Ry20H8IzU4lQ1BsJyaX4J08,1283
1019
1021
  django_spire/knowledge/templates/django_spire/knowledge/page/full_page.html,sha256=vz3WQ6SAL43QALRf0haaLfNkUfIQQemR0FAZQ2tznV4,1331
1020
1022
  django_spire/knowledge/templates/django_spire/knowledge/page/home_page.html,sha256=LMGSoPuP4N0NMX9QB1r5qJaExDvt6IKlJNp69Dt2EeQ,293
1021
1023
  django_spire/knowledge/templates/django_spire/knowledge/sub_navigation/element/collection_sub_navigation_ellipsis_dropdown.html,sha256=DeM7yRcjRN25eRvdOK-3Ae0kbYaMWvk7Ufbc8AZphgk,1023
@@ -1193,8 +1195,8 @@ django_spire/theme/urls/page_urls.py,sha256=S8nkKkgbhG3XHI3uMUL-piOjXIrRkuY2UlM_
1193
1195
  django_spire/theme/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1194
1196
  django_spire/theme/views/json_views.py,sha256=PWwVTaty0BVGbj65L5cxex6JNhc-xVAI_rEYjbJWqEM,1893
1195
1197
  django_spire/theme/views/page_views.py,sha256=WenjOa6Welpu3IMolY56ZwBjy4aK9hpbiMNuygjAl1A,3922
1196
- django_spire-0.23.2.dist-info/licenses/LICENSE.md,sha256=tlTbOtgKoy-xAQpUk9gPeh9O4oRXCOzoWdW3jJz0wnA,1091
1197
- django_spire-0.23.2.dist-info/METADATA,sha256=7x2HFXnglT6gwdbs_JxDzGbWqwZIfxsT6p9dzDCh-AY,5127
1198
- django_spire-0.23.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1199
- django_spire-0.23.2.dist-info/top_level.txt,sha256=xf3QV1e--ONkVpgMDQE9iqjQ1Vg4--_6C8wmO-KxPHQ,13
1200
- django_spire-0.23.2.dist-info/RECORD,,
1198
+ django_spire-0.23.3.dist-info/licenses/LICENSE.md,sha256=tlTbOtgKoy-xAQpUk9gPeh9O4oRXCOzoWdW3jJz0wnA,1091
1199
+ django_spire-0.23.3.dist-info/METADATA,sha256=jiN0athZqM7GqaqMwLkR09-VP5oNYXUUT3PnQfGzbAw,5127
1200
+ django_spire-0.23.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1201
+ django_spire-0.23.3.dist-info/top_level.txt,sha256=xf3QV1e--ONkVpgMDQE9iqjQ1Vg4--_6C8wmO-KxPHQ,13
1202
+ django_spire-0.23.3.dist-info/RECORD,,