Skip to content

插件无法传递对象参数 #2515

@jim19770812

Description

@jim19770812

coze-studio 版本:0.5.0
os: rocklinux 9.6
python: 3.11.9
flask: 3.1.2

插件配置

{
  "schema_version": "v1",
  "name_for_model": "dd",
  "name_for_human": "dd",
  "description_for_model": "222",
  "description_for_human": "222",
  "auth": {
    "type": "none",
    "sub_type": "",
    "payload": ""
  },
  "logo_url": "default_icon/plugin_default_icon.png",
  "api": {
    "type": "openapi"
  },
  "common_params": {
    "header": [
      {
        "name": "User-Agent",
        "value": "Coze/1.0"
      }
    ]
  }
}
openapi: 3.0.1
info:
    title: dd
    description: "222"
    version: v1
paths:
    /test2:
        post:
            summary: test2
            operationId: test2
            requestBody:
                content:
                    application/json:
                        schema:
                            type: object
                            required:
                                - extra_params
                                - model_name
                            properties:
                                extra_params:
                                    type: object
                                    description: "111"
                                    properties:
                                        _:
                                            type: string
                                            description: _
                                model_name:
                                    type: string
                                    description: model_name
            responses:
                "200":
                    description: description is required
                    content:
                        application/json:
                            schema:
                                type: object
                                properties:
                                    data:
                                        type: object
                                        properties:
                                            uuid:
                                                type: string
                                    message:
                                        type: string
                                    status:
                                        type: integer
servers:
    - url: http://10.64.202.80:10082/util

测试插件代码

import json
from flask import Flask, request, jsonify
from typing import Dict, Any

def _(text):
    return text
class Result:
    """用于构造响应的 Result 对象。"""

    def __init__(self, status: int, message: str, data: Any = None):
        self.status = status
        self.message = message
        self.data = data if data is not None else {}

    @staticmethod
    def succ(message: str = "", data: Any = None):
        return Result(1, message, data)

    def set_data(self, data: Dict[str, Any]):
        self.data = data
        return self

    def to_succ_resp(self):
        """返回符合响应结构的字典"""
        return {
            "status": self.status,
            "message": self.message,
            "data": self.data
        }
app = Flask(__name__)
app.config['JSON_SORT_KEYS'] = False

@app.route('/utils/test2', methods=['POST'])
def test2_resource():
    try:
        payload = request.get_json()
        if payload is None:
            return jsonify({"status": 0, "message": "Invalid JSON payload"}), 400

    except Exception as e:
        return jsonify({"status": 0, "message": f"Error parsing JSON: {e}"}), 400
    print(f"/test2 payload is : {json.dumps(payload, ensure_ascii=False, indent=4)}")
    extra_params = payload.get("extra_params", {})
    # 虽然在纯 Flask 中没有自动的模型校验,但我们仍可以检查 model_name 是否存在
    model_name = payload.get("model_name")
    if not model_name:
        return jsonify({"status": 0, "message": "Missing required field: model_name"}), 400
    print(f"extra_params type: {type(extra_params)}, value: {extra_params}")
    json_str = json.dumps(extra_params, ensure_ascii=False)
    result = Result.succ("").set_data({
        "json_str": json_str
    })
    return jsonify(result.to_succ_resp())

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=10082)

用curl命令验证

$ curl -X 'POST' \
  'http://127.0.0.1:10082/utils/test2' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "model_name": "string",
  "extra_params": {"a":100}
}'

输出信息

{
  "data": {
    "json_str": "{\"a\": 100}"
  },
  "message": "",
  "status": 1
}

可以看到返回结果 json_str是正常的

但在coze里,在代码的payload处设置断点,却没有传入extra_params对象,导致在coze-studio里看到的插件执行结果是{}

最后附上coze-server的执行日志

2025/11/29 04:41:14.985403 log.go:77: [Info] [log-id: bda26438-3abf-4157-b41c-2b4587ac4919] | http | 10.64.16.121:8888 | 200 | 1.385164ms | 10.64.202.80 | POST | /api/plugin_api/get_oauth_status | coze.GetOAuthStatus | 0 | en-US 
2025/11/29 04:41:14.985429 log.go:78: [Debug] [log-id: bda26438-3abf-4157-b41c-2b4587ac4919] query :  
req : {"plugin_id":"7577987767741710336"} 
resp: {"is_oauth":false,"status":0,"content":"","code":0,"msg":"","BaseResp":null}
2025/11/29 04:41:15.121869 log.go:77: [Info] [log-id: c9f23bad-379a-4ac2-94ea-7ac74e6d7c59] | http | 10.64.16.121:8888 | 200 | 1.178992ms | 10.64.202.80 | POST | /api/workflow_api/validate_tree | coze.ValidateTree | 0 | en-US 
2025/11/29 04:41:15.121901 log.go:78: [Debug] [log-id: c9f23bad-379a-4ac2-94ea-7ac74e6d7c59] query :  
req : {"workflow_id":"7577986938502643712","bind_project_id":"7575369590465626112","schema":"{\"nodes\":[{\"id\":\"100001\",\"type\":\"1\",\"meta\":{\"position\":{\"x\":0,\"y\":0}},\"data\":{\"nodeMeta\":{\"description\":\"工作流的起始节点,用于设定启动工作流需要的信息\",\"icon\":\"http://10.64.16.121:8888/local_storage/opencoze/default_icon/workflow_icon/icon-start.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20251129%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251129T033312Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=c23a98798d0b0140e578b6e084d075777fd5be56fffd2a8672951503f483c759\",\"subTitle\":\"\",\"title\":\"开始\"},\"outputs\":[{\"type\":\"object\",\"name\":\"extra_params\",\"schema\":[{\"type\":\"string\",\"name\":\"value1\",\"required\":true},{\"type\":\"string\",\"name\":\"value2\",\"required\":true}],\"required\":true}],\"trigger_parameters\":[]}},{\"id\":\"900001\",\"type\":\"2\",\"meta\":{\"position\":{\"x\":999,\"y\":-12.950000000000003}},\"data\":{\"nodeMeta\":{\"description\":\"工作流的最终节点,用于返回工作流运行后的结果信息\",\"icon\":\"http://10.64.16.121:8888/local_storage/opencoze/default_icon/workflow_icon/icon-end.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20251129%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251129T033312Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=f79824ae0e05e42a0a7ebd42131a8159cdd602aaf21f03ebffe9a86ff48763e7\",\"subTitle\":\"\",\"title\":\"结束\"},\"inputs\":{\"terminatePlan\":\"returnVariables\",\"inputParameters\":[{\"name\":\"output\",\"input\":{\"type\":\"string\",\"value\":{\"type\":\"ref\",\"content\":{\"source\":\"block-output\",\"blockID\":\"110138\",\"name\":\"data.json_str\"},\"rawMeta\":{\"type\":1}}}}]}}},{\"id\":\"110138\",\"type\":\"4\",\"meta\":{\"position\":{\"x\":499.5,\"y\":-25.199999999999996}},\"data\":{\"nodeMeta\":{\"title\":\"test2\",\"icon\":\"http://10.64.16.121:8888/local_storage/opencoze/default_icon/workflow_icon/icon-plugin.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20251129%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251129T033312Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=853d7d991133081fe618d9cf03045bc9f3946471bf3d7db352647dafbb230ce8\",\"subtitle\":\"dd:test2\",\"description\":\"test2\"},\"inputs\":{\"apiParam\":[{\"name\":\"apiID\",\"input\":{\"type\":\"string\",\"value\":{\"type\":\"literal\",\"content\":\"7577988068565581824\",\"rawMeta\":{\"type\":1}}}},{\"name\":\"apiName\",\"input\":{\"type\":\"string\",\"value\":{\"type\":\"literal\",\"content\":\"dd\",\"rawMeta\":{\"type\":1}}}},{\"name\":\"pluginID\",\"input\":{\"type\":\"string\",\"value\":{\"type\":\"literal\",\"content\":\"7577987767741710336\",\"rawMeta\":{\"type\":1}}}},{\"name\":\"pluginName\",\"input\":{\"type\":\"string\",\"value\":{\"type\":\"literal\",\"content\":\"dd\",\"rawMeta\":{\"type\":1}}}},{\"name\":\"pluginVersion\",\"input\":{\"type\":\"string\",\"value\":{\"type\":\"literal\",\"content\":\ 
resp: {"data":[],"code":0,"msg":"","BaseResp":null}

2025/11/29 04:41:15 /app/domain/workflow/internal/repo/repository.go:448
[0.463ms] [rows:1] SELECT * FROM `workflow_meta` WHERE `workflow_meta`.`id` = 7577986938502643712 AND `workflow_meta`.`deleted_at` IS NULL ORDER BY `workflow_meta`.`id` LIMIT 1
2025/11/29 04:41:15.257762 log.go:77: [Info] [log-id: d1b0a215-edb0-4237-9458-40c1b2aafcb9] | http | 10.64.16.121:8888 | 200 | 14.039782ms | 10.64.202.80 | POST | /api/workflow_api/test_run | coze.WorkFlowTestRun | 0 | en-US 
2025/11/29 04:41:15.257788 log.go:78: [Debug] [log-id: d1b0a215-edb0-4237-9458-40c1b2aafcb9] query :  
req : {"workflow_id":"7577986938502643712","input":{"extra_params":"{\n  \"value1\": \"111\",\n  \"value2\": \"222\"\n}"},"space_id":"7534610813617700864","commit_id":"","project_id":"7575369590465626112"} 
resp: {"data":{"workflow_id":"7577986938502643712","execute_id":"7578002824508735488","session_id":""},"code":0,"msg":"","BaseResp":null}
2025/11/29 04:41:15.258224 event_handle.go:724: [Info] [log-id: d1b0a215-edb0-4237-9458-40c1b2aafcb9] receiving event type= workflow_start, workflowID= 7577986938502643712, nodeType= , nodeKey = 
2025/11/29 04:41:15.259296 event_handle.go:724: [Info] [log-id: d1b0a215-edb0-4237-9458-40c1b2aafcb9] receiving event type= node_start, workflowID= 7577986938502643712, nodeType= Entry, nodeKey = 100001
2025/11/29 04:41:15.267591 event_handle.go:724: [Info] [log-id: d1b0a215-edb0-4237-9458-40c1b2aafcb9] receiving event type= node_end, workflowID= 7577986938502643712, nodeType= Entry, nodeKey = 100001
2025/11/29 04:41:15.275239 event_handle.go:724: [Info] [log-id: d1b0a215-edb0-4237-9458-40c1b2aafcb9] receiving event type= node_start, workflowID= 7577986938502643712, nodeType= Plugin, nodeKey = 110138
2025/11/29 04:41:15.277525 invocation_http.go:109: [Debug] [log-id: d1b0a215-edb0-4237-9458-40c1b2aafcb9] [execute] url=http://10.64.202.80:10082/utils/test2, header=map[Content-Type:[application/json] User-Agent:[Coze/1.0] X-Aiplugin-Connector-Identifier:[7534610813596729344] X-Tt-Logid:[d1b0a215-edb0-4237-9458-40c1b2aafcb9]], method=POST, body={"model_name":"test"}
2025/11/29 04:41:15.377142 log.go:77: [Info] [log-id: 5441b4d3-9fc2-4716-85ee-a44f4ea7b00c] | http | 10.64.16.121:8888 | 200 | 3.22281ms | 10.64.202.80 | GET | /api/workflow_api/get_process | coze.GetWorkFlowProcess | 0 | en-US 
2025/11/29 04:41:15.377170 log.go:78: [Debug] [log-id: 5441b4d3-9fc2-4716-85ee-a44f4ea7b00c] query : workflow_id=7577986938502643712&space_id=7534610813617700864&execute_id=7578002824508735488&need_async=true 
req :  
resp: {"code":0,"msg":"","data":{"workFlowId":"7577986938502643712","executeId":"7578002824508735488","executeStatus":1,"nodeResults":[{"nodeId":"100001","NodeType":"Start","NodeName":"开始","nodeStatus":3,"errorInfo":"","input":"{\"extra_params\":{\"value1\":\"111\",\"value2\":\"222\"}}","output":"{\"extra_params\":{\"value1\":\"111\",\"value2\":\"222\"}}","nodeExeCost":"0.001s","tokenAndCost":{"inputTokens":"0 Tokens","outputTokens":"0 Tokens","totalTokens":"0 Tokens"},"raw_output":"{\"extra_params\":{\"value1\":\"111\",\"value2\":\"222\"}}","errorLevel":"","logVersion":0,"extra":"{\"current_sub_execute_id\":7578002824508735488}"},{"nodeId":"110138","NodeType":"Api","NodeName":"test2","nodeStatus":2,"errorInfo":"","input":"{\"extra_params\":{\"value1\":\"111\",\"value2\":\"222\"},\"model_name\":\"test\"}","output":"","nodeExeCost":"0.000s","tokenAndCost":{"inputTokens":"0 Tokens","outputTokens":"0 Tokens","totalTokens":"0 Tokens"},"raw_output":"","errorLevel":"","logVersion":0,"extra":"{\"current_sub_execute_id\":7578002824508735488}"}],"rate":"0.33","exeHistoryStatus":2,"workflowExeCost":"0.000s","tokenAndCost":{"inputTokens":"0 Tokens","outputTokens":"0 Tokens","totalTokens":"0 Tokens"},"reason":"","logID":"d1b0a215-edb0-4237-9458-40c1b2aafcb9","nodeEvents":[],"projectId":"7575369590465626112"},"BaseResp":null}
2025/11/29 04:41:15.498295 invocation_http.go:117: [Debug] [log-id: d1b0a215-edb0-4237-9458-40c1b2aafcb9] [execute] status=200 OK, response={
  "data": {
    "json_str": "{}"
  },
  "message": "",
  "status": 1
}
2025/11/29 04:41:15.498558 event_handle.go:724: [Info] [log-id: d1b0a215-edb0-4237-9458-40c1b2aafcb9] receiving event type= node_end, workflowID= 7577986938502643712, nodeType= Plugin, nodeKey = 110138
2025/11/29 04:41:15.507055 event_handle.go:724: [Info] [log-id: d1b0a215-edb0-4237-9458-40c1b2aafcb9] receiving event type= node_start, workflowID= 7577986938502643712, nodeType= Exit, nodeKey = 900001
2025/11/29 04:41:15.514580 event_handle.go:724: [Info] [log-id: d1b0a215-edb0-4237-9458-40c1b2aafcb9] receiving event type= node_end, workflowID= 7577986938502643712, nodeType= Exit, nodeKey = 900001
2025/11/29 04:41:15.524959 event_handle.go:724: [Info] [log-id: d1b0a215-edb0-4237-9458-40c1b2aafcb9] receiving event type= workflow_success, workflowID= 7577986938502643712, nodeType= , nodeKey = 
2025/11/29 04:41:15.537641 event_handle.go:765: [Info] [log-id: d1b0a215-edb0-4237-9458-40c1b2aafcb9] [handleExecuteEvent] cancellable finish, returned event type: workflow_success, workflow id: 7577986938502643712
2025/11/29 04:41:15.537666 event_handle.go:768: [Info] [log-id: d1b0a215-edb0-4237-9458-40c1b2aafcb9] [handleExecuteEvent] cancellable wait until tool finished done, workflow id: 7577986938502643712
2025/11/29 04:41:15.781827 log.go:77: [Info] [log-id: cb7c6ef3-b80c-466f-8700-20691e6cf80e] | http | 10.64.16.121:8888 | 200 | 3.130619ms | 10.64.202.80 | GET | /api/workflow_api/get_process | coze.GetWorkFlowProcess | 0 | en-US 
2025/11/29 04:41:15.781878 log.go:78: [Debug] [log-id: cb7c6ef3-b80c-466f-8700-20691e6cf80e] query : workflow_id=7577986938502643712&space_id=7534610813617700864&execute_id=7578002824508735488&need_async=true 
req :  
resp: {"code":0,"msg":"","data":{"workFlowId":"7577986938502643712","executeId":"7578002824508735488","executeStatus":2,"nodeResults":[{"nodeId":"100001","NodeType":"Start","NodeName":"开始","nodeStatus":3,"errorInfo":"","input":"{\"extra_params\":{\"value1\":\"111\",\"value2\":\"222\"}}","output":"{\"extra_params\":{\"value1\":\"111\",\"value2\":\"222\"}}","nodeExeCost":"0.001s","tokenAndCost":{"inputTokens":"0 Tokens","outputTokens":"0 Tokens","totalTokens":"0 Tokens"},"raw_output":"{\"extra_params\":{\"value1\":\"111\",\"value2\":\"222\"}}","errorLevel":"","logVersion":0,"extra":"{\"current_sub_execute_id\":7578002824508735488}"},{"nodeId":"110138","NodeType":"Api","NodeName":"test2","nodeStatus":3,"errorInfo":"","input":"{\"extra_params\":{\"value1\":\"111\",\"value2\":\"222\"},\"model_name\":\"test\"}","output":"{\"data\":{\"json_str\":\"{}\"},\"message\":\"\",\"status\":1}","nodeExeCost":"0.230s","tokenAndCost":{"inputTokens":"0 Tokens","outputTokens":"0 Tokens","totalTokens":"0 Tokens"},"raw_output":"{\"data\":{\"json_str\":\"{}\"},\"message\":\"\",\"status\":1}","errorLevel":"","logVersion":0,"extra":"{\"current_sub_execute_id\":7578002824508735488}"},{"nodeId":"900001","NodeType":"End","NodeName":"结束","nodeStatus":3,"errorInfo":"","input":"{\"output\":\"{}\"}","output":"{\"output\":\"{}\"}","nodeExeCost":"0.008s","tokenAndCost":{"inputTokens":"0 Tokens","outputTokens":"0 Tokens","totalTokens":"0 Tokens"},"raw_output":"{\"output\":\"{}\"}","errorLevel":"","logVersion":0,"extra":"{\"current_sub_execute_id\":7578002824508735488}"}],"rate":"1.00","exeHistoryStatus":2,"workflowExeCost":"0.257s","tokenAndCost":{"inputTokens":"0 Tokens","outputTokens":"0 Tokens","totalTokens":"0 Tokens"},"reason":"","logID":"d1b0a215-edb0-4237-9458-40c1b2aafcb9","nodeEvents":[],"projectId":"7575369590465626112"},"BaseResp":null}

2025/11/29 04:41:15 /app/domain/workflow/internal/repo/repository.go:448
[0.435ms] [rows:1] SELECT * FROM `workflow_meta` WHERE `workflow_meta`.`id` = 7577986938502643712 AND `workflow_meta`.`deleted_at` IS NULL ORDER BY `workflow_meta`.`id` LIMIT 1
2025/11/29 04:41:15.916976 log.go:77: [Info] [log-id: 579546dd-4287-43b1-acf7-32adefc9dbc7] | http | 10.64.16.121:8888 | 200 | 2.995879ms | 10.64.202.80 | POST | /api/workflow_api/canvas | coze.GetCanvasInfo | 0 | en-US 
2025/11/29 04:41:15.917011 log.go:78: [Debug] [log-id: 579546dd-4287-43b1-acf7-32adefc9dbc7] query :  
req : {"space_id":"7534610813617700864","workflow_id":"7577986938502643712"} 
resp: {"data":{"workflow":{"workflow_id":"7577986938502643712","name":"test2","desc":"ee","url":"http://minio:9000/opencoze/default_icon/default_workflow_icon.png?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Credential=minioadmin%2F20251129%2Fus-east-1%2Fs3%2Faws4_request\u0026X-Amz-Date=20251129T044115Z\u0026X-Amz-Expires=604800\u0026X-Amz-SignedHeaders=host\u0026X-Amz-Signature=dd8e86241f06ceed33da3bafa505e75605929f339d25db3f005521ec852774a8","icon_uri":"default_icon/default_workflow_icon.png","status":2,"type":0,"plugin_id":"0","create_time":1764387576,"update_time":1764391275,"schema_type":0,"space_id":"7534610813617700864","schema_json":"{\"nodes\":[{\"id\":\"100001\",\"type\":\"1\",\"meta\":{\"position\":{\"x\":0,\"y\":0}},\"data\":{\"nodeMeta\":{\"description\":\"工作流的起始节点,用于设定启动工作流需要的信息\",\"icon\":\"http://10.64.16.121:8888/local_storage/opencoze/default_icon/workflow_icon/icon-start.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Credential=minioadmin%2F20251129%2Fus-east-1%2Fs3%2Faws4_request\u0026X-Amz-Date=20251129T033312Z\u0026X-Amz-Expires=604800\u0026X-Amz-SignedHeaders=host\u0026X-Amz-Signature=c23a98798d0b0140e578b6e084d075777fd5be56fffd2a8672951503f483c759\",\"subTitle\":\"\",\"title\":\"开始\"},\"outputs\":[{\"type\":\"object\",\"name\":\"extra_params\",\"schema\":[{\"type\":\"string\",\"name\":\"value1\",\"required\":true},{\"type\":\"string\",\"name\":\"value2\",\"required\":true}],\"required\":true}],\"trigger_parameters\":[]}},{\"id\":\"900001\",\"type\":\"2\",\"meta\":{\"position\":{\"x\":999,\"y\":-12.950000000000003}},\"data\":{\"nodeMeta\":{\"description\":\"工作流的最终节点,用于返回工作流运行后的结果信息\",\"icon\":\"http://10.64.16.121:8888/local_storage/opencoze/default_icon/workflow_icon/icon-end.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Credential=minioadmin%2F20251129%2Fus-east-1%2Fs3%2Faws4_request\u0026X-Amz-Date=20251129T033312Z\u0026X-Amz-Expires=604800\u0026X-Amz-SignedHeaders=host\u0026X-Amz-Signature=f79824ae0e05e42a0a7ebd42131a8159cdd602aaf21f03ebffe9a86ff48763e7\",\"subTitle\":\"\",\"title\":\"结束\"},\"inputs\":{\"terminatePlan\":\"returnVariables\",\"inputParameters\":[{\"name\":\"output\",\"input\":{\"type\":\"string\",\"value\":{\"type\":\"ref\",\"content\":{\"source\":\"block-output\",\"blockID\":\"110138\",\"name\":\"data.json_str\"},\"rawMeta\":{\"type\":1}}}}]}}},{\"id\":\"110138\",\"type\":\"4\",\"meta\":{\"position\":{\"x\":499.5,\"y\":-25.199999999999996}},\"data\":{\"nodeMeta\":{\"title\":\"test2\",\"icon\":\"http://10.64.16.121:8888/local_storage/opencoze/default_icon/workflow_icon/icon-plugin.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Credential=minioadmin%2F20251129%2Fus-east-1%2Fs3%2Faws4_request\u0026X-Amz-Date=20251129T033312Z\u0026X-Amz-Expires=604800\u0026X-Amz-SignedHeaders=host\u0026X-Amz-Signature=853d7d991133081fe618d9cf03045bc9f3946471bf3d7db352647dafbb230ce8\",\"subtitle\":\"dd:test2\",\"description\":\"test2\"},\"inputs\":{\"apiParam\":[{\"name\":\"apiID\",\"input\":{\"typ

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions