Feat/workflow phase2 (#4687)

This commit is contained in:
Yeuoly
2024-05-27 22:01:11 +08:00
committed by GitHub
parent 45deaee762
commit e852a21634
139 changed files with 5997 additions and 779 deletions

View File

@@ -100,7 +100,7 @@ class App(db.Model):
return None
@property
def workflow(self):
def workflow(self) -> Optional['Workflow']:
if self.workflow_id:
from .workflow import Workflow
return db.session.query(Workflow).filter(Workflow.id == self.workflow_id).first()

View File

@@ -3,8 +3,8 @@ import json
from sqlalchemy import ForeignKey
from core.tools.entities.common_entities import I18nObject
from core.tools.entities.tool_bundle import ApiBasedToolBundle
from core.tools.entities.tool_entities import ApiProviderSchemaType
from core.tools.entities.tool_bundle import ApiToolBundle
from core.tools.entities.tool_entities import ApiProviderSchemaType, WorkflowToolParameterConfiguration
from extensions.ext_database import db
from models import StringUUID
from models.model import Account, App, Tenant
@@ -118,8 +118,8 @@ class ApiToolProvider(db.Model):
return ApiProviderSchemaType.value_of(self.schema_type_str)
@property
def tools(self) -> list[ApiBasedToolBundle]:
return [ApiBasedToolBundle(**tool) for tool in json.loads(self.tools_str)]
def tools(self) -> list[ApiToolBundle]:
return [ApiToolBundle(**tool) for tool in json.loads(self.tools_str)]
@property
def credentials(self) -> dict:
@@ -132,7 +132,84 @@ class ApiToolProvider(db.Model):
@property
def tenant(self) -> Tenant:
return db.session.query(Tenant).filter(Tenant.id == self.tenant_id).first()
class ToolLabelBinding(db.Model):
"""
The table stores the labels for tools.
"""
__tablename__ = 'tool_label_bindings'
__table_args__ = (
db.PrimaryKeyConstraint('id', name='tool_label_bind_pkey'),
db.UniqueConstraint('tool_id', 'label_name', name='unique_tool_label_bind'),
)
id = db.Column(StringUUID, server_default=db.text('uuid_generate_v4()'))
# tool id
tool_id = db.Column(db.String(64), nullable=False)
# tool type
tool_type = db.Column(db.String(40), nullable=False)
# label name
label_name = db.Column(db.String(40), nullable=False)
class WorkflowToolProvider(db.Model):
"""
The table stores the workflow providers.
"""
__tablename__ = 'tool_workflow_providers'
__table_args__ = (
db.PrimaryKeyConstraint('id', name='tool_workflow_provider_pkey'),
db.UniqueConstraint('name', 'tenant_id', name='unique_workflow_tool_provider'),
db.UniqueConstraint('tenant_id', 'app_id', name='unique_workflow_tool_provider_app_id'),
)
id = db.Column(StringUUID, server_default=db.text('uuid_generate_v4()'))
# name of the workflow provider
name = db.Column(db.String(40), nullable=False)
# label of the workflow provider
label = db.Column(db.String(255), nullable=False, server_default='')
# icon
icon = db.Column(db.String(255), nullable=False)
# app id of the workflow provider
app_id = db.Column(StringUUID, nullable=False)
# version of the workflow provider
version = db.Column(db.String(255), nullable=False, server_default='')
# who created this tool
user_id = db.Column(StringUUID, nullable=False)
# tenant id
tenant_id = db.Column(StringUUID, nullable=False)
# description of the provider
description = db.Column(db.Text, nullable=False)
# parameter configuration
parameter_configuration = db.Column(db.Text, nullable=False, server_default='[]')
# privacy policy
privacy_policy = db.Column(db.String(255), nullable=True, server_default='')
created_at = db.Column(db.DateTime, nullable=False, server_default=db.text('CURRENT_TIMESTAMP(0)'))
updated_at = db.Column(db.DateTime, nullable=False, server_default=db.text('CURRENT_TIMESTAMP(0)'))
@property
def schema_type(self) -> ApiProviderSchemaType:
return ApiProviderSchemaType.value_of(self.schema_type_str)
@property
def user(self) -> Account:
return db.session.query(Account).filter(Account.id == self.user_id).first()
@property
def tenant(self) -> Tenant:
return db.session.query(Tenant).filter(Tenant.id == self.tenant_id).first()
@property
def parameter_configurations(self) -> list[WorkflowToolParameterConfiguration]:
return [
WorkflowToolParameterConfiguration(**config)
for config in json.loads(self.parameter_configuration)
]
@property
def app(self) -> App:
return db.session.query(App).filter(App.id == self.app_id).first()
class ToolModelInvoke(db.Model):
"""
store the invoke logs from tool invoke

View File

@@ -2,7 +2,6 @@ import json
from enum import Enum
from typing import Optional, Union
from core.tools.tool_manager import ToolManager
from extensions.ext_database import db
from libs import helper
from models import StringUUID
@@ -171,6 +170,12 @@ class Workflow(db.Model):
return helper.generate_text_hash(json.dumps(entity, sort_keys=True))
@property
def tool_published(self) -> bool:
from models.tools import WorkflowToolProvider
return db.session.query(WorkflowToolProvider).filter(
WorkflowToolProvider.app_id == self.app_id
).first() is not None
class WorkflowRunTriggeredFrom(Enum):
"""
@@ -473,6 +478,7 @@ class WorkflowNodeExecution(db.Model):
@property
def extras(self):
from core.tools.tool_manager import ToolManager
extras = {}
if self.execution_metadata_dict:
from core.workflow.entities.node_entities import NodeType