-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Open
Description
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
Labels
No labels