fix file render

This commit is contained in:
takatost
2024-03-18 20:59:11 +08:00
parent d5a404236a
commit a2195c813c
15 changed files with 160 additions and 90 deletions

View File

@ -10,7 +10,7 @@ from core.app.app_config.features.suggested_questions_after_answer.manager impor
SuggestedQuestionsAfterAnswerConfigManager,
)
from core.app.app_config.features.text_to_speech.manager import TextToSpeechConfigManager
from models.model import AppModelConfig
from models.model import AppMode, AppModelConfig
class BaseAppConfigManager:
@ -33,11 +33,12 @@ class BaseAppConfigManager:
return config_dict
@classmethod
def convert_features(cls, config_dict: dict) -> AppAdditionalFeatures:
def convert_features(cls, config_dict: dict, app_mode: AppMode) -> AppAdditionalFeatures:
"""
Convert app config to app model config
:param config_dict: app config
:param app_mode: app mode
"""
config_dict = config_dict.copy()
@ -47,7 +48,8 @@ class BaseAppConfigManager:
)
additional_features.file_upload = FileUploadConfigManager.convert(
config=config_dict
config=config_dict,
is_vision=app_mode in [AppMode.CHAT, AppMode.COMPLETION, AppMode.AGENT_CHAT]
)
additional_features.opening_statement, additional_features.suggested_questions = \

View File

@ -5,22 +5,27 @@ from core.app.app_config.entities import FileExtraConfig
class FileUploadConfigManager:
@classmethod
def convert(cls, config: dict) -> Optional[FileExtraConfig]:
def convert(cls, config: dict, is_vision: bool = True) -> Optional[FileExtraConfig]:
"""
Convert model config to model config
:param config: model config args
:param is_vision: if True, the feature is vision feature
"""
file_upload_dict = config.get('file_upload')
if file_upload_dict:
if 'image' in file_upload_dict and file_upload_dict['image']:
if 'enabled' in file_upload_dict['image'] and file_upload_dict['image']['enabled']:
image_config = {
'number_limits': file_upload_dict['image']['number_limits'],
'transfer_methods': file_upload_dict['image']['transfer_methods']
}
if is_vision:
image_config['detail'] = file_upload_dict['image']['detail']
return FileExtraConfig(
image_config={
'number_limits': file_upload_dict['image']['number_limits'],
'detail': file_upload_dict['image']['detail'],
'transfer_methods': file_upload_dict['image']['transfer_methods']
}
image_config=image_config
)
return None

View File

@ -28,10 +28,11 @@ class AdvancedChatAppConfigManager(BaseAppConfigManager):
workflow: Workflow) -> AdvancedChatAppConfig:
features_dict = workflow.features_dict
app_mode = AppMode.value_of(app_model.mode)
app_config = AdvancedChatAppConfig(
tenant_id=app_model.tenant_id,
app_id=app_model.id,
app_mode=AppMode.value_of(app_model.mode),
app_mode=app_mode,
workflow_id=workflow.id,
sensitive_word_avoidance=SensitiveWordAvoidanceConfigManager.convert(
config=features_dict
@ -39,7 +40,7 @@ class AdvancedChatAppConfigManager(BaseAppConfigManager):
variables=WorkflowVariablesConfigManager.convert(
workflow=workflow
),
additional_features=cls.convert_features(features_dict)
additional_features=cls.convert_features(features_dict, app_mode)
)
return app_config

View File

@ -67,7 +67,7 @@ class AdvancedChatAppGenerator(MessageBasedAppGenerator):
# parse files
files = args['files'] if 'files' in args and args['files'] else []
message_file_parser = MessageFileParser(tenant_id=app_model.tenant_id, app_id=app_model.id)
file_extra_config = FileUploadConfigManager.convert(workflow.features_dict)
file_extra_config = FileUploadConfigManager.convert(workflow.features_dict, is_vision=False)
if file_extra_config:
file_objs = message_file_parser.validate_and_transform_files_arg(
files,

View File

@ -485,63 +485,85 @@ class AdvancedChatAppGenerateTaskPipeline(BasedGenerateTaskPipeline, WorkflowCyc
value_selector = route_chunk.value_selector
route_chunk_node_id = value_selector[0]
# check chunk node id is before current node id or equal to current node id
if route_chunk_node_id not in self._task_state.ran_node_execution_infos:
break
if route_chunk_node_id == 'sys':
# system variable
value = self._workflow_system_variables.get(SystemVariable.value_of(value_selector[1]))
# new_value = []
# if isinstance(value, list):
# for item in value:
# if isinstance(item, FileVar):
# new_value.append(item.to_dict())
#
# if new_value:
# value = new_value
else:
# check chunk node id is before current node id or equal to current node id
if route_chunk_node_id not in self._task_state.ran_node_execution_infos:
break
latest_node_execution_info = self._task_state.latest_node_execution_info
latest_node_execution_info = self._task_state.latest_node_execution_info
# get route chunk node execution info
route_chunk_node_execution_info = self._task_state.ran_node_execution_infos[route_chunk_node_id]
if (route_chunk_node_execution_info.node_type == NodeType.LLM
and latest_node_execution_info.node_type == NodeType.LLM):
# only LLM support chunk stream output
self._task_state.current_stream_generate_state.current_route_position += 1
continue
# get route chunk node execution info
route_chunk_node_execution_info = self._task_state.ran_node_execution_infos[route_chunk_node_id]
if (route_chunk_node_execution_info.node_type == NodeType.LLM
and latest_node_execution_info.node_type == NodeType.LLM):
# only LLM support chunk stream output
self._task_state.current_stream_generate_state.current_route_position += 1
continue
# get route chunk node execution
route_chunk_node_execution = db.session.query(WorkflowNodeExecution).filter(
WorkflowNodeExecution.id == route_chunk_node_execution_info.workflow_node_execution_id).first()
# get route chunk node execution
route_chunk_node_execution = db.session.query(WorkflowNodeExecution).filter(
WorkflowNodeExecution.id == route_chunk_node_execution_info.workflow_node_execution_id).first()
outputs = route_chunk_node_execution.outputs_dict
outputs = route_chunk_node_execution.outputs_dict
# get value from outputs
value = None
for key in value_selector[1:]:
if not value:
value = outputs.get(key)
else:
value = value.get(key)
# get value from outputs
value = None
for key in value_selector[1:]:
if not value:
value = outputs.get(key)
else:
value = value.get(key)
if value:
text = None
text = ''
if isinstance(value, str | int | float):
text = str(value)
elif isinstance(value, dict | list):
# handle files
file_vars = self._fetch_files_from_variable_value(value)
for file_var in file_vars:
try:
file_var_obj = FileVar(**file_var)
except Exception as e:
logger.error(f'Error creating file var: {e}')
continue
elif isinstance(value, dict):
# other types
text = json.dumps(value, ensure_ascii=False)
elif isinstance(value, FileVar):
# convert file to markdown
text = value.to_markdown()
elif isinstance(value, list):
for item in value:
if isinstance(item, FileVar):
text += item.to_markdown() + ' '
# convert file to markdown
text = file_var_obj.to_markdown()
text = text.strip()
if not text:
# # handle files
# file_vars = self._fetch_files_from_variable_value(value)
# for file_var in file_vars:
# try:
# file_var_obj = FileVar(**file_var)
# except Exception as e:
# logger.error(f'Error creating file var: {e}')
# continue
#
# # convert file to markdown
# text = file_var_obj.to_markdown()
if not text and value:
# other types
text = json.dumps(value, ensure_ascii=False)
if text:
for token in text:
self._queue_manager.publish(
QueueTextChunkEvent(
text=token
), PublishFrom.TASK_PIPELINE
)
time.sleep(0.01)
self._queue_manager.publish(
QueueTextChunkEvent(
text=text
), PublishFrom.TASK_PIPELINE
)
self._task_state.current_stream_generate_state.current_route_position += 1

View File

@ -58,10 +58,11 @@ class AgentChatAppConfigManager(BaseAppConfigManager):
else:
config_dict = override_config_dict
app_mode = AppMode.value_of(app_model.mode)
app_config = AgentChatAppConfig(
tenant_id=app_model.tenant_id,
app_id=app_model.id,
app_mode=AppMode.value_of(app_model.mode),
app_mode=app_mode,
app_model_config_from=config_from,
app_model_config_id=app_model_config.id,
app_model_config_dict=config_dict,
@ -80,7 +81,7 @@ class AgentChatAppConfigManager(BaseAppConfigManager):
agent=AgentConfigManager.convert(
config=config_dict
),
additional_features=cls.convert_features(config_dict)
additional_features=cls.convert_features(config_dict, app_mode)
)
app_config.variables, app_config.external_data_variables = BasicVariablesConfigManager.convert(

View File

@ -52,10 +52,11 @@ class ChatAppConfigManager(BaseAppConfigManager):
else:
config_dict = override_config_dict
app_mode = AppMode.value_of(app_model.mode)
app_config = ChatAppConfig(
tenant_id=app_model.tenant_id,
app_id=app_model.id,
app_mode=AppMode.value_of(app_model.mode),
app_mode=app_mode,
app_model_config_from=config_from,
app_model_config_id=app_model_config.id,
app_model_config_dict=config_dict,
@ -71,7 +72,7 @@ class ChatAppConfigManager(BaseAppConfigManager):
dataset=DatasetConfigManager.convert(
config=config_dict
),
additional_features=cls.convert_features(config_dict)
additional_features=cls.convert_features(config_dict, app_mode)
)
app_config.variables, app_config.external_data_variables = BasicVariablesConfigManager.convert(

View File

@ -43,10 +43,11 @@ class CompletionAppConfigManager(BaseAppConfigManager):
else:
config_dict = override_config_dict
app_mode = AppMode.value_of(app_model.mode)
app_config = CompletionAppConfig(
tenant_id=app_model.tenant_id,
app_id=app_model.id,
app_mode=AppMode.value_of(app_model.mode),
app_mode=app_mode,
app_model_config_from=config_from,
app_model_config_id=app_model_config.id,
app_model_config_dict=config_dict,
@ -62,7 +63,7 @@ class CompletionAppConfigManager(BaseAppConfigManager):
dataset=DatasetConfigManager.convert(
config=config_dict
),
additional_features=cls.convert_features(config_dict)
additional_features=cls.convert_features(config_dict, app_mode)
)
app_config.variables, app_config.external_data_variables = BasicVariablesConfigManager.convert(

View File

@ -20,10 +20,11 @@ class WorkflowAppConfigManager(BaseAppConfigManager):
def get_app_config(cls, app_model: App, workflow: Workflow) -> WorkflowAppConfig:
features_dict = workflow.features_dict
app_mode = AppMode.value_of(app_model.mode)
app_config = WorkflowAppConfig(
tenant_id=app_model.tenant_id,
app_id=app_model.id,
app_mode=AppMode.value_of(app_model.mode),
app_mode=app_mode,
workflow_id=workflow.id,
sensitive_word_avoidance=SensitiveWordAvoidanceConfigManager.convert(
config=features_dict
@ -31,7 +32,7 @@ class WorkflowAppConfigManager(BaseAppConfigManager):
variables=WorkflowVariablesConfigManager.convert(
workflow=workflow
),
additional_features=cls.convert_features(features_dict)
additional_features=cls.convert_features(features_dict, app_mode)
)
return app_config

View File

@ -50,7 +50,7 @@ class WorkflowAppGenerator(BaseAppGenerator):
# parse files
files = args['files'] if 'files' in args and args['files'] else []
message_file_parser = MessageFileParser(tenant_id=app_model.tenant_id, app_id=app_model.id)
file_extra_config = FileUploadConfigManager.convert(workflow.features_dict)
file_extra_config = FileUploadConfigManager.convert(workflow.features_dict, is_vision=False)
if file_extra_config:
file_objs = message_file_parser.validate_and_transform_files_arg(
files,

View File

@ -519,7 +519,7 @@ class WorkflowCycleManage:
return None
if isinstance(value, dict):
if '__variant' in value and value['__variant'] == FileVar.__class__.__name__:
if '__variant' in value and value['__variant'] == FileVar.__name__:
return value
return None