diff --git a/api/core/workflow/nodes/llm/knowledge_resource.py b/api/core/workflow/nodes/llm/knowledge_resource.py
index 7ecc97c39b..aa1c1bb755 100644
--- a/api/core/workflow/nodes/llm/knowledge_resource.py
+++ b/api/core/workflow/nodes/llm/knowledge_resource.py
@@ -14,3 +14,12 @@ class KnowledgeResource(BaseModel):
score: Optional[float] = None
metadata: Optional[dict[str, Any]] = None
+ def to_dict(self):
+ return {
+ 'content': self.content,
+ 'title': self.title,
+ 'url': self.url,
+ 'icon': self.icon,
+ 'score': self.score,
+ 'metadata': self.metadata
+ }
diff --git a/api/core/workflow/nodes/llm/llm_node.py b/api/core/workflow/nodes/llm/llm_node.py
index c1f29b272f..32c3a7ab01 100644
--- a/api/core/workflow/nodes/llm/llm_node.py
+++ b/api/core/workflow/nodes/llm/llm_node.py
@@ -22,6 +22,7 @@ from core.workflow.entities.node_entities import NodeRunMetadataKey, NodeRunResu
from core.workflow.entities.variable_pool import VariablePool
from core.workflow.nodes.base_node import BaseNode
from core.workflow.nodes.llm.entities import LLMNodeData, ModelConfig
+from core.workflow.nodes.llm.knowledge_resource import KnowledgeResource
from core.workflow.utils.variable_template_parser import VariableTemplateParser
from extensions.ext_database import db
from models.model import Conversation
@@ -262,7 +263,7 @@ class LLMNode(BaseNode):
for item in context_value:
if isinstance(item, str):
context_str += item + '\n'
- else:
+ elif isinstance(item, dict):
if 'content' not in item:
raise ValueError(f'Invalid context structure: {item}')
@@ -271,6 +272,12 @@ class LLMNode(BaseNode):
retriever_resource = self._convert_to_original_retriever_resource(item)
if retriever_resource:
original_retriever_resource.append(retriever_resource)
+ elif isinstance(item, KnowledgeResource):
+ context_str += item.content + '\n'
+
+ retriever_resource = self._convert_to_original_retriever_resource(item.to_dict())
+ if retriever_resource:
+ original_retriever_resource.append(retriever_resource)
if self.callbacks and original_retriever_resource:
for callback in self.callbacks:
diff --git a/api/core/workflow/nodes/question_classifier/template_prompts.py b/api/core/workflow/nodes/question_classifier/template_prompts.py
index ea24baa522..9c59a88dc9 100644
--- a/api/core/workflow/nodes/question_classifier/template_prompts.py
+++ b/api/core/workflow/nodes/question_classifier/template_prompts.py
@@ -6,7 +6,7 @@ QUESTION_CLASSIFIER_SYSTEM_PROMPT = """
### Task
Your task is to assign one categories ONLY to the input text and only one category may be assigned returned in the output.Additionally, you need to extract the key words from the text that are related to the classification.
### Format
- The input text is in the variable text_field.Categories are specified as a category list in the variable categories or left empty for automatic determination.Classification instructions may be included to improve the classification accuracy.
+ The input text is in the variable text_field.Categories are specified as a category list with two filed category_id and category_name in the variable categories .Classification instructions may be included to improve the classification accuracy.
### Constraint
DO NOT include anything other than the JSON array in your response.
### Memory
@@ -24,7 +24,8 @@ QUESTION_CLASSIFIER_USER_PROMPT_1 = """
QUESTION_CLASSIFIER_ASSISTANT_PROMPT_1 = """
```json
- {"category_id": "f5660049-284f-41a7-b301-fd24176a711c",
+ {"keywords": ["recently", "great experience", "company", "service", "prompt", "staff", "friendly"],
+ "category_id": "f5660049-284f-41a7-b301-fd24176a711c",
"category_name": "Customer Service"}
```
"""
@@ -37,7 +38,8 @@ QUESTION_CLASSIFIER_USER_PROMPT_2 = """
QUESTION_CLASSIFIER_ASSISTANT_PROMPT_2 = """
```json
- {"category_id": "f6ff5bc3-aca0-4e4a-8627-e760d0aca78f",
+ {"keywords": ["bad service", "slow", "food", "tip", "terrible", "waitresses"],
+ "category_id": "f6ff5bc3-aca0-4e4a-8627-e760d0aca78f",
"category_name": "Experience"}
```
"""
@@ -61,9 +63,9 @@ DO NOT include anything other than the JSON array in your response.
Here is the chat example between human and assistant, inside XML tags.
User:{{"input_text": ["I recently had a great experience with your company. The service was prompt and the staff was very friendly."], "categories": [{{"category_id":"f5660049-284f-41a7-b301-fd24176a711c","category_name":"Customer Service"}},{{"category_id":"8d007d06-f2c9-4be5-8ff6-cd4381c13c60","category_name":"Satisfaction"}},{{"category_id":"5fbbbb18-9843-466d-9b8e-b9bfbb9482c8","category_name":"Sales"}},{{"category_id":"23623c75-7184-4a2e-8226-466c2e4631e4","category_name":"Product"}}], "classification_instructions": ["classify the text based on the feedback provided by customer"]}}
-Assistant:{{"category_id": "f5660049-284f-41a7-b301-fd24176a711c","category_name": "Customer Service"}}
+Assistant:{{"keywords": ["recently", "great experience", "company", "service", "prompt", "staff", "friendly"],"category_id": "f5660049-284f-41a7-b301-fd24176a711c","category_name": "Customer Service"}}
User:{{"input_text": ["bad service, slow to bring the food"], "categories": [{{"category_id":"80fb86a0-4454-4bf5-924c-f253fdd83c02","category_name":"Food Quality"}},{{"category_id":"f6ff5bc3-aca0-4e4a-8627-e760d0aca78f","category_name":"Experience"}},{{"category_id":"cc771f63-74e7-4c61-882e-3eda9d8ba5d7","category_name":"Price"}}], "classification_instructions": []}}
-Assistant:{{"category_id": "f6ff5bc3-aca0-4e4a-8627-e760d0aca78f","category_name": "Customer Service"}}
+Assistant:{{"keywords": ["bad service", "slow", "food", "tip", "terrible", "waitresses"],"category_id": "f6ff5bc3-aca0-4e4a-8627-e760d0aca78f","category_name": "Customer Service"}}
### Memory
Here is the chat histories between human and assistant, inside XML tags.
diff --git a/api/core/workflow/nodes/tool/tool_node.py b/api/core/workflow/nodes/tool/tool_node.py
index 2d6a982f28..6ec16e32f4 100644
--- a/api/core/workflow/nodes/tool/tool_node.py
+++ b/api/core/workflow/nodes/tool/tool_node.py
@@ -200,7 +200,7 @@ class ToolNode(BaseNode):
chunk.metadata = {
'_source': 'tool'
}
- all_chunks.append(chunk)
+ all_chunks.append(chunk.to_dict())
return all_chunks