Skip to content

Commit b606c7a

Browse files
authored
Merge branch '1Panel-dev:main' into main
2 parents 980c039 + 49d90e0 commit b606c7a

File tree

24 files changed

+221
-75
lines changed

24 files changed

+221
-75
lines changed

apps/application/flow/step_node/application_node/i_application_node.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class ApplicationNodeSerializer(serializers.Serializer):
1212
question_reference_address = serializers.ListField(required=True, error_messages=ErrMessage.list("用户问题"))
1313
api_input_field_list = serializers.ListField(required=False, error_messages=ErrMessage.list("api输入字段"))
1414
user_input_field_list = serializers.ListField(required=False, error_messages=ErrMessage.uuid("用户输入字段"))
15+
image_list = serializers.ListField(required=False, error_messages=ErrMessage.list("图片"))
16+
document_list = serializers.ListField(required=False, error_messages=ErrMessage.list("文档"))
1517

1618

1719
class IApplicationNode(INode):
@@ -31,10 +33,27 @@ def _run(self):
3133
for user_input_field in self.node_params_serializer.data.get('user_input_field_list', []):
3234
kwargs[user_input_field['field']] = self.workflow_manage.get_reference_field(user_input_field['value'][0],
3335
user_input_field['value'][1:])
34-
36+
# 判断是否包含这个属性
37+
app_document_list = self.node_params_serializer.data.get('document_list', [])
38+
if app_document_list and len(app_document_list) > 0:
39+
app_document_list = self.workflow_manage.get_reference_field(
40+
app_document_list[0],
41+
app_document_list[1:])
42+
for document in app_document_list:
43+
if 'file_id' not in document:
44+
raise ValueError("参数值错误: 上传的文档中缺少file_id")
45+
app_image_list = self.node_params_serializer.data.get('image_list', [])
46+
if app_image_list and len(app_image_list) > 0:
47+
app_image_list = self.workflow_manage.get_reference_field(
48+
app_image_list[0],
49+
app_image_list[1:])
50+
for image in app_image_list:
51+
if 'file_id' not in image:
52+
raise ValueError("参数值错误: 上传的图片中缺少file_id")
3553
return self.execute(**self.node_params_serializer.data, **self.flow_params_serializer.data,
54+
app_document_list=app_document_list, app_image_list=app_image_list,
3655
message=str(question), **kwargs)
3756

3857
def execute(self, application_id, message, chat_id, chat_record_id, stream, re_chat, client_id, client_type,
39-
**kwargs) -> NodeResult:
58+
app_document_list=None, app_image_list=None, **kwargs) -> NodeResult:
4059
pass

apps/application/flow/step_node/application_node/impl/base_application_node.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def save_context(self, details, workflow_manage):
7171
self.answer_text = details.get('answer')
7272

7373
def execute(self, application_id, message, chat_id, chat_record_id, stream, re_chat, client_id, client_type,
74+
app_document_list=None, app_image_list=None,
7475
**kwargs) -> NodeResult:
7576
from application.serializers.chat_message_serializers import ChatMessageSerializer
7677
# 生成嵌入应用的chat_id
@@ -79,13 +80,20 @@ def execute(self, application_id, message, chat_id, chat_record_id, stream, re_c
7980
'application_id': application_id,
8081
'abstract': message
8182
})
83+
if app_document_list is None:
84+
app_document_list = []
85+
if app_image_list is None:
86+
app_image_list = []
8287
response = ChatMessageSerializer(
8388
data={'chat_id': current_chat_id, 'message': message,
8489
're_chat': re_chat,
8590
'stream': stream,
8691
'application_id': application_id,
8792
'client_id': client_id,
88-
'client_type': client_type, 'form_data': kwargs}).chat(base_to_response=OpenaiToResponse())
93+
'client_type': client_type,
94+
'document_list': app_document_list,
95+
'image_list': app_image_list,
96+
'form_data': kwargs}).chat(base_to_response=OpenaiToResponse())
8997
if response.status_code == 200:
9098
if stream:
9199
content_generator = response.streaming_content
@@ -126,5 +134,7 @@ def get_details(self, index: int, **kwargs):
126134
'answer_tokens': self.context.get('answer_tokens'),
127135
'status': self.status,
128136
'err_message': self.err_message,
129-
'global_fields': global_fields
137+
'global_fields': global_fields,
138+
'document_list': self.workflow_manage.document_list,
139+
'image_list': self.workflow_manage.image_list
130140
}

apps/application/flow/step_node/image_understand_step_node/impl/base_image_understand_node.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,17 @@ def generate_prompt_question(self, prompt):
116116

117117
def generate_message_list(self, image_model, system: str, prompt: str, history_message, image):
118118
if image is not None and len(image) > 0:
119-
file_id = image[0]['file_id']
120-
file = QuerySet(File).filter(id=file_id).first()
121-
base64_image = base64.b64encode(file.get_byte()).decode("utf-8")
119+
# 处理多张图片
120+
images = []
121+
for img in image:
122+
file_id = img['file_id']
123+
file = QuerySet(File).filter(id=file_id).first()
124+
base64_image = base64.b64encode(file.get_byte()).decode("utf-8")
125+
images.append({'type': 'image_url', 'image_url': {'url': f'data:image/jpeg;base64,{base64_image}'}})
122126
messages = [HumanMessage(
123127
content=[
124128
{'type': 'text', 'text': self.workflow_manage.generate_prompt(prompt)},
125-
{'type': 'image_url', 'image_url': {'url': f'data:image/jpeg;base64,{base64_image}'}},
129+
*images
126130
])]
127131
else:
128132
messages = [HumanMessage(self.workflow_manage.generate_prompt(prompt))]

apps/application/flow/step_node/start_node/impl/base_start_node.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,5 +77,6 @@ def get_details(self, index: int, **kwargs):
7777
'status': self.status,
7878
'err_message': self.err_message,
7979
'image_list': self.context.get('image'),
80+
'document_list': self.context.get('document'),
8081
'global_fields': global_fields
8182
}

apps/application/flow/workflow_manage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def __init__(self, _id: str, _type: str, x: int, y: int, properties: dict, **kwa
5252
self.__setattr__(keyword, kwargs.get(keyword))
5353

5454

55-
end_nodes = ['ai-chat-node', 'reply-node', 'function-node', 'function-lib-node', 'application-node']
55+
end_nodes = ['ai-chat-node', 'reply-node', 'function-node', 'function-lib-node', 'application-node', 'image-understand-node']
5656

5757

5858
class Flow:

apps/application/serializers/chat_serializers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
from common.util.file_util import get_file_content
3939
from common.util.lock import try_lock, un_lock
4040
from dataset.models import Document, Problem, Paragraph, ProblemParagraphMapping
41-
from dataset.serializers.common_serializers import get_embedding_model_id_by_dataset_id
41+
from dataset.serializers.common_serializers import get_embedding_model_id_by_dataset_id, update_document_char_length
4242
from dataset.serializers.paragraph_serializers import ParagraphSerializers
4343
from embedding.task import embedding_by_paragraph, embedding_by_paragraph_list
4444
from setting.models import Model
@@ -620,6 +620,7 @@ def improve(self, instance: Dict, with_valid=True):
620620
# 插入关联问题
621621
problem_paragraph_mapping.save()
622622
chat_record.improve_paragraph_id_list.append(paragraph.id)
623+
update_document_char_length(document_id)
623624
# 添加标注
624625
chat_record.save()
625626
return ChatRecordSerializerModel(chat_record).data, paragraph.id, dataset_id
@@ -718,5 +719,6 @@ def post_improve(self, instance: Dict):
718719

719720
# 批量保存聊天记录
720721
ChatRecord.objects.bulk_update(chat_record_list, ['improve_paragraph_id_list'])
722+
update_document_char_length(document_id)
721723

722724
return paragraph_ids, dataset_id

apps/setting/models_provider/impl/openai_model_provider/credential/image.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ def is_valid(self, model_type: str, model_name, model_credential: Dict[str, obje
2929
return False
3030
try:
3131
model = provider.get_model(model_type, model_name, model_credential)
32-
model.stream([HumanMessage(content=[{"type": "text", "text": "你好"}])])
32+
res = model.stream([HumanMessage(content=[{"type": "text", "text": "你好"}])])
33+
for chunk in res:
34+
print(chunk)
3335
except Exception as e:
3436
if isinstance(e, AppApiException):
3537
raise e

apps/setting/models_provider/impl/openai_model_provider/model/image.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ class OpenAIImage(MaxKBBaseModel, ChatOpenAI):
1717
def new_instance(model_type, model_name, model_credential: Dict[str, object], **model_kwargs):
1818
optional_params = MaxKBBaseModel.filter_optional_params(model_kwargs)
1919
return OpenAIImage(
20-
model=model_name,
20+
model_name=model_name,
2121
openai_api_base=model_credential.get('api_base'),
2222
openai_api_key=model_credential.get('api_key'),
23-
stream_options={"include_usage": True},
23+
# stream_options={"include_usage": True},
24+
streaming=True,
2425
**optional_params,
2526
)

apps/setting/models_provider/impl/qwen_model_provider/credential/image.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ def is_valid(self, model_type: str, model_name, model_credential: Dict[str, obje
5050
return False
5151
try:
5252
model = provider.get_model(model_type, model_name, model_credential)
53-
model.stream([HumanMessage(content=[{"type": "text", "text": "你好"}])])
53+
res = model.stream([HumanMessage(content=[{"type": "text", "text": "你好"}])])
54+
for chunk in res:
55+
print(chunk)
5456
except Exception as e:
5557
if isinstance(e, AppApiException):
5658
raise e

apps/setting/models_provider/impl/qwen_model_provider/model/image.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ class QwenVLChatModel(MaxKBBaseModel, ChatOpenAI):
1313
def new_instance(model_type, model_name, model_credential: Dict[str, object], **model_kwargs):
1414
optional_params = MaxKBBaseModel.filter_optional_params(model_kwargs)
1515
chat_tong_yi = QwenVLChatModel(
16-
model=model_name,
16+
model_name=model_name,
1717
openai_api_key=model_credential.get('api_key'),
1818
openai_api_base='https://dashscope.aliyuncs.com/compatible-mode/v1',
19-
stream_options={"include_usage": True},
19+
# stream_options={"include_usage": True},
20+
streaming=True,
2021
model_kwargs=optional_params,
2122
)
2223
return chat_tong_yi

0 commit comments

Comments
 (0)