1131 lines
28 KiB
Go
1131 lines
28 KiB
Go
/*
|
|
* Copyright 2025 coze-dev Authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
// Code generated by hertz generator.
|
|
|
|
package coze
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
|
|
"github.com/cloudwego/eino/schema"
|
|
"github.com/cloudwego/hertz/pkg/app"
|
|
"github.com/cloudwego/hertz/pkg/protocol/consts"
|
|
"github.com/cloudwego/hertz/pkg/protocol/sse"
|
|
|
|
"github.com/coze-dev/coze-studio/backend/api/model/workflow"
|
|
appworkflow "github.com/coze-dev/coze-studio/backend/application/workflow"
|
|
"github.com/coze-dev/coze-studio/backend/domain/workflow/entity/vo"
|
|
"github.com/coze-dev/coze-studio/backend/pkg/lang/ptr"
|
|
"github.com/coze-dev/coze-studio/backend/pkg/logs"
|
|
"github.com/coze-dev/coze-studio/backend/pkg/sonic"
|
|
)
|
|
|
|
// CreateWorkflow .
|
|
// @router /api/workflow_api/create [POST]
|
|
func CreateWorkflow(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.CreateWorkflowRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.CreateWorkflow(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetCanvasInfo .
|
|
// @router /api/workflow_api/canvas [POST]
|
|
func GetCanvasInfo(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetCanvasInfoRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.GetCanvasInfo(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// SaveWorkflow .
|
|
// @router /api/workflow_api/save [POST]
|
|
func SaveWorkflow(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.SaveWorkflowRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.SaveWorkflow(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// UpdateWorkflowMeta .
|
|
// @router /api/workflow_api/update_meta [POST]
|
|
func UpdateWorkflowMeta(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.UpdateWorkflowMetaRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
resp, err := appworkflow.SVC.UpdateWorkflowMeta(ctx, &req)
|
|
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// DeleteWorkflow .
|
|
// @router /api/workflow_api/delete [POST]
|
|
func DeleteWorkflow(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.DeleteWorkflowRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.DeleteWorkflow(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// BatchDeleteWorkflow .
|
|
// @router /api/workflow_api/batch_delete [POST]
|
|
func BatchDeleteWorkflow(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.BatchDeleteWorkflowRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.BatchDeleteWorkflow(ctx, &req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetDeleteStrategy .
|
|
// @router /api/workflow_api/delete_strategy [POST]
|
|
func GetDeleteStrategy(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetDeleteStrategyRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.GetDeleteStrategyResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// PublishWorkflow .
|
|
// @router /api/workflow_api/publish [POST]
|
|
func PublishWorkflow(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.PublishWorkflowRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
resp, err := appworkflow.SVC.PublishWorkflow(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// CopyWorkflow .
|
|
// @router /api/workflow_api/copy [POST]
|
|
func CopyWorkflow(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.CopyWorkflowRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
resp, err := appworkflow.SVC.CopyWorkflow(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// CopyWkTemplateApi .
|
|
// @router /api/workflow_api/copy_wk_template [POST]
|
|
func CopyWkTemplateApi(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.CopyWkTemplateApiRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
resp, err := appworkflow.SVC.CopyWkTemplateApi(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetReleasedWorkflows .
|
|
// @router /api/workflow_api/released_workflows [POST]
|
|
func GetReleasedWorkflows(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetReleasedWorkflowsRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.GetReleasedWorkflowsResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetWorkflowReferences
|
|
// @router /api/workflow_api/workflow_references [POST]
|
|
func GetWorkflowReferences(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetWorkflowReferencesRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
resp, err := appworkflow.SVC.GetWorkflowReferences(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetWorkFlowList .
|
|
// @router /api/workflow_api/workflow_list [POST]
|
|
func GetWorkFlowList(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetWorkFlowListRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
resp, err := appworkflow.SVC.ListWorkflow(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// QueryWorkflowNodeTypes .
|
|
// @router /api/workflow_api/node_type [POST]
|
|
func QueryWorkflowNodeTypes(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.QueryWorkflowNodeTypeRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
resp, err := appworkflow.SVC.QueryWorkflowNodeTypes(ctx, &req)
|
|
if err != nil {
|
|
c.String(consts.StatusInternalServerError, err.Error())
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// NodeTemplateList .
|
|
// @router /api/workflow_api/node_template_list [POST]
|
|
func NodeTemplateList(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.NodeTemplateListRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.GetNodeTemplateList(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// NodePanelSearch .
|
|
// @router /api/workflow_api/node_panel_search [POST]
|
|
func NodePanelSearch(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.NodePanelSearchRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.NodePanelSearchResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetLLMNodeFCSettingsMerged .
|
|
// @router /api/workflow_api/llm_fc_setting_merged [POST]
|
|
func GetLLMNodeFCSettingsMerged(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetLLMNodeFCSettingsMergedRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.GetLLMNodeFCSettingsMerged(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetLLMNodeFCSettingDetail .
|
|
// @router /api/workflow_api/llm_fc_setting_detail [POST]
|
|
func GetLLMNodeFCSettingDetail(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetLLMNodeFCSettingDetailRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.GetLLMNodeFCSettingDetail(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// WorkFlowTestRun .
|
|
// @router /api/workflow_api/test_run [POST]
|
|
func WorkFlowTestRun(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.WorkFlowTestRunRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.TestRun(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// WorkFlowTestResume .
|
|
// @router /api/workflow_api/test_resume [POST]
|
|
func WorkFlowTestResume(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.WorkflowTestResumeRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.TestResume(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// CancelWorkFlow .
|
|
// @router /api/workflow_api/cancel [POST]
|
|
func CancelWorkFlow(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.CancelWorkFlowRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.Cancel(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetWorkFlowProcess .
|
|
// @router /api/workflow_api/get_process [GET]
|
|
func GetWorkFlowProcess(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetWorkflowProcessRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.GetProcess(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetNodeExecuteHistory .
|
|
// @router /api/workflow_api/get_node_execute_history [GET]
|
|
func GetNodeExecuteHistory(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetNodeExecuteHistoryRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.GetNodeExecuteHistory(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetApiDetail .
|
|
// @router /api/workflow_api/apiDetail [GET]
|
|
func GetApiDetail(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetApiDetailRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
toolDetailInfo, err := appworkflow.SVC.GetApiDetail(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
response := map[string]interface{}{
|
|
"data": toolDetailInfo,
|
|
"code": 0,
|
|
"msg": "",
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, response)
|
|
}
|
|
|
|
// WorkflowNodeDebugV2 .
|
|
// @router /api/workflow_api/nodeDebug [POST]
|
|
func WorkflowNodeDebugV2(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.WorkflowNodeDebugV2Request
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.NodeDebug(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// SignImageURL .
|
|
// @router /api/workflow_api/sign_image_url [POST]
|
|
func SignImageURL(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.SignImageURLRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.SignImageURL(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// CreateProjectConversationDef .
|
|
// @router /api/workflow_api/project_conversation/create [POST]
|
|
func CreateProjectConversationDef(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.CreateProjectConversationDefRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.CreateProjectConversationDefResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// UpdateProjectConversationDef .
|
|
// @router /api/workflow_api/project_conversation/update [POST]
|
|
func UpdateProjectConversationDef(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.UpdateProjectConversationDefRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.UpdateProjectConversationDefResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// DeleteProjectConversationDef .
|
|
// @router /api/workflow_api/project_conversation/delete [POST]
|
|
func DeleteProjectConversationDef(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.DeleteProjectConversationDefRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.DeleteProjectConversationDefResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// ListProjectConversationDef .
|
|
// @router /api/workflow_api/project_conversation/list [GET]
|
|
func ListProjectConversationDef(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.ListProjectConversationRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.ListProjectConversationResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// ListRootSpans .
|
|
// @router /api/workflow_api/list_spans [POST]
|
|
func ListRootSpans(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.ListRootSpansRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.ListRootSpansResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetTraceSDK .
|
|
// @router /api/workflow_api/get_trace [POST]
|
|
func GetTraceSDK(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetTraceSDKRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.GetTraceSDKResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetWorkflowDetail .
|
|
// @router /api/workflow_api/workflow_detail [POST]
|
|
func GetWorkflowDetail(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetWorkflowDetailRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
workflowDetailDataList, err := appworkflow.SVC.GetWorkflowDetail(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
response := map[string]any{
|
|
"data": workflowDetailDataList,
|
|
"code": 0,
|
|
"message": "",
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, response)
|
|
}
|
|
|
|
// GetWorkflowDetailInfo .
|
|
// @router /api/workflow_api/workflow_detail_info [POST]
|
|
func GetWorkflowDetailInfo(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetWorkflowDetailInfoRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
workflowDetailInfoDataList, err := appworkflow.SVC.GetWorkflowDetailInfo(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
response := map[string]any{
|
|
"data": workflowDetailInfoDataList,
|
|
"code": 0,
|
|
"message": "",
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, response)
|
|
}
|
|
|
|
// ValidateTree .
|
|
// @router /api/workflow_api/validate_tree [POST]
|
|
func ValidateTree(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.ValidateTreeRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.ValidateTree(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetChatFlowRole .
|
|
// @router /api/workflow_api/chat_flow_role/get [GET]
|
|
func GetChatFlowRole(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetChatFlowRoleRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.GetChatFlowRoleResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// CreateChatFlowRole .
|
|
// @router /api/workflow_api/chat_flow_role/create [POST]
|
|
func CreateChatFlowRole(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.CreateChatFlowRoleRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.CreateChatFlowRoleResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// DeleteChatFlowRole .
|
|
// @router /api/workflow_api/chat_flow_role/delete [POST]
|
|
func DeleteChatFlowRole(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.DeleteChatFlowRoleRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.DeleteChatFlowRoleResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// ListPublishWorkflow .
|
|
// @router /api/workflow_api/list_publish_workflow [POST]
|
|
func ListPublishWorkflow(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.ListPublishWorkflowRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.ListPublishWorkflowResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetWorkflowUploadAuthToken .
|
|
// @router /api/workflow_api/upload/auth_token [POST]
|
|
func GetWorkflowUploadAuthToken(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetUploadAuthTokenRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.GetWorkflowUploadAuthToken(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
func preprocessWorkflowRequestBody(_ context.Context, c *app.RequestContext) error {
|
|
// Read the raw request body
|
|
rawData, err := c.Request.BodyE()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to read request body: %w", err)
|
|
}
|
|
|
|
// Unmarshal into a temporary map
|
|
var bodyData map[string]interface{}
|
|
if err = sonic.Unmarshal(rawData, &bodyData); err != nil {
|
|
return fmt.Errorf("failed to unmarshal request body: %w", err)
|
|
}
|
|
|
|
// Process 'parameters' field
|
|
if parameters, ok := bodyData["parameters"]; ok {
|
|
if _, isString := parameters.(string); !isString {
|
|
// It's not a string, needs modification.
|
|
paramsBytes, marshalErr := sonic.Marshal(parameters)
|
|
if marshalErr != nil {
|
|
return fmt.Errorf("failed to marshal parameters: %w", marshalErr)
|
|
}
|
|
bodyData["parameters"] = string(paramsBytes)
|
|
|
|
newRawData, err := sonic.Marshal(bodyData)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to marshal modified body: %w", err)
|
|
}
|
|
c.Request.SetBodyRaw(newRawData)
|
|
return nil
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// OpenAPIRunFlow .
|
|
// @router /v1/workflow/run [POST]
|
|
func OpenAPIRunFlow(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
|
|
if err = preprocessWorkflowRequestBody(ctx, c); err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
var req workflow.OpenAPIRunFlowRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.OpenAPIRun(ctx, &req)
|
|
if err != nil {
|
|
var se vo.WorkflowError
|
|
if errors.As(err, &se) {
|
|
resp = new(workflow.OpenAPIRunFlowResponse)
|
|
resp.Code = int64(se.OpenAPICode())
|
|
resp.Msg = ptr.Of(se.Msg())
|
|
debugURL := se.DebugURL()
|
|
if debugURL != "" {
|
|
resp.DebugUrl = ptr.Of(debugURL)
|
|
}
|
|
c.JSON(consts.StatusOK, resp)
|
|
return
|
|
}
|
|
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
type streamRunData struct {
|
|
Content *string `json:"content,omitempty"`
|
|
ContentType *string `json:"content_type,omitempty"`
|
|
NodeSeqID *string `json:"node_seq_id,omitempty"`
|
|
NodeID *string `json:"node_id,omitempty"`
|
|
NodeIsFinish *bool `json:"node_is_finish,omitempty"`
|
|
NodeType *string `json:"node_type,omitempty"`
|
|
NodeTitle *string `json:"node_title,omitempty"`
|
|
Token *int64 `json:"token,omitempty"`
|
|
DebugURL *string `json:"debug_url,omitempty"`
|
|
ErrorCode *int64 `json:"error_code,omitempty"`
|
|
ErrorMessage *string `json:"error_message,omitempty"`
|
|
InterruptData *interruptData `json:"interrupt_data,omitempty"`
|
|
}
|
|
|
|
type interruptData struct {
|
|
EventID string `json:"event_id"`
|
|
Type int64 `json:"type"`
|
|
Data string `json:"data"`
|
|
}
|
|
|
|
func convertStreamRunData(msg *workflow.OpenAPIStreamRunFlowResponse) *streamRunData {
|
|
var ie *interruptData
|
|
if msg.InterruptData != nil {
|
|
ie = &interruptData{
|
|
EventID: msg.InterruptData.EventID,
|
|
Type: int64(msg.InterruptData.Type),
|
|
Data: msg.InterruptData.InData,
|
|
}
|
|
}
|
|
|
|
return &streamRunData{
|
|
Content: msg.Content,
|
|
ContentType: msg.ContentType,
|
|
NodeSeqID: msg.NodeSeqID,
|
|
NodeID: msg.NodeID,
|
|
NodeIsFinish: msg.NodeIsFinish,
|
|
NodeType: msg.NodeType,
|
|
NodeTitle: msg.NodeTitle,
|
|
Token: msg.Token,
|
|
DebugURL: msg.DebugUrl,
|
|
ErrorCode: msg.ErrorCode,
|
|
ErrorMessage: msg.ErrorMessage,
|
|
InterruptData: ie,
|
|
}
|
|
}
|
|
|
|
func sendStreamRunSSE(ctx context.Context, w *sse.Writer, sr *schema.StreamReader[*workflow.OpenAPIStreamRunFlowResponse]) {
|
|
defer func() {
|
|
_ = w.Close()
|
|
sr.Close()
|
|
}()
|
|
|
|
for {
|
|
msg, err := sr.Recv()
|
|
if err != nil {
|
|
if errors.Is(err, io.EOF) {
|
|
// finish
|
|
break
|
|
}
|
|
|
|
event := &sse.Event{
|
|
Type: "error",
|
|
Data: []byte(err.Error()),
|
|
}
|
|
|
|
if err = w.Write(event); err != nil {
|
|
logs.CtxErrorf(ctx, "publish stream event failed, err:%v", err)
|
|
}
|
|
return
|
|
}
|
|
|
|
converted := convertStreamRunData(msg)
|
|
msgBytes, err := sonic.Marshal(converted)
|
|
if err != nil {
|
|
event := &sse.Event{
|
|
Type: "error",
|
|
Data: []byte(err.Error()),
|
|
}
|
|
if err = w.Write(event); err != nil {
|
|
logs.CtxErrorf(ctx, "publish stream event failed, err:%v", err)
|
|
}
|
|
return
|
|
}
|
|
|
|
event := &sse.Event{
|
|
ID: msg.ID,
|
|
Type: msg.Event,
|
|
Data: msgBytes,
|
|
}
|
|
|
|
if err = w.Write(event); err != nil {
|
|
logs.CtxErrorf(ctx, "publish stream event failed, err:%v", err)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
// OpenAPIStreamRunFlow .
|
|
// @router /v1/workflow/stream_run [POST]
|
|
func OpenAPIStreamRunFlow(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
|
|
if err = preprocessWorkflowRequestBody(ctx, c); err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
var req workflow.OpenAPIRunFlowRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
w := sse.NewWriter(c)
|
|
|
|
c.SetContentType("text/event-stream; charset=utf-8")
|
|
c.Response.Header.Set("Cache-Control", "no-cache")
|
|
c.Response.Header.Set("Connection", "keep-alive")
|
|
c.Response.Header.Set("Access-Control-Allow-Origin", "*")
|
|
|
|
sr, err := appworkflow.SVC.OpenAPIStreamRun(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
sendStreamRunSSE(ctx, w, sr)
|
|
}
|
|
|
|
// OpenAPIStreamResumeFlow .
|
|
// @router /v1/workflow/stream_resume [POST]
|
|
func OpenAPIStreamResumeFlow(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.OpenAPIStreamResumeFlowRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
w := sse.NewWriter(c)
|
|
|
|
c.SetContentType("text/event-stream; charset=utf-8")
|
|
c.Response.Header.Set("Cache-Control", "no-cache")
|
|
c.Response.Header.Set("Connection", "keep-alive")
|
|
c.Response.Header.Set("Access-Control-Allow-Origin", "*")
|
|
|
|
sr, err := appworkflow.SVC.OpenAPIStreamResume(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
sendStreamRunSSE(ctx, w, sr)
|
|
}
|
|
|
|
// OpenAPIGetWorkflowRunHistory .
|
|
// @router /v1/workflow/get_run_history [GET]
|
|
func OpenAPIGetWorkflowRunHistory(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetWorkflowRunHistoryRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.OpenAPIGetWorkflowRunHistory(ctx, &req)
|
|
if err != nil {
|
|
var se vo.WorkflowError
|
|
if errors.As(err, &se) {
|
|
resp = new(workflow.GetWorkflowRunHistoryResponse)
|
|
resp.Code = ptr.Of(int64(se.OpenAPICode()))
|
|
resp.Msg = ptr.Of(se.Msg())
|
|
c.JSON(consts.StatusOK, resp)
|
|
return
|
|
}
|
|
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// OpenAPIChatFlowRun .
|
|
// @router /v1/workflows/chat [POST]
|
|
func OpenAPIChatFlowRun(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.ChatFlowRunRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.ChatFlowRunResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// OpenAPIGetWorkflowInfo .
|
|
// @router /v1/workflows/:workflow_id [GET]
|
|
func OpenAPIGetWorkflowInfo(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.OpenAPIGetWorkflowInfoRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp := new(workflow.OpenAPIGetWorkflowInfoResponse)
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetHistorySchema .
|
|
// @router /api/workflow_api/history_schema [POST]
|
|
func GetHistorySchema(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetHistorySchemaRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.GetHistorySchema(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|
|
|
|
// GetExampleWorkFlowList .
|
|
// @router /api/workflow_api/example_workflow_list [POST]
|
|
func GetExampleWorkFlowList(ctx context.Context, c *app.RequestContext) {
|
|
var err error
|
|
var req workflow.GetExampleWorkFlowListRequest
|
|
err = c.BindAndValidate(&req)
|
|
if err != nil {
|
|
invalidParamRequestResponse(c, err.Error())
|
|
return
|
|
}
|
|
|
|
resp, err := appworkflow.SVC.GetExampleWorkFlowList(ctx, &req)
|
|
if err != nil {
|
|
internalServerErrorResponse(ctx, c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(consts.StatusOK, resp)
|
|
}
|