From 9d6446410fc7b0cfa0e6258e0c711570277e56a4 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Mon, 3 Aug 2026 16:12:29 +0800 Subject: [PATCH] refactor: extract pipeline_core and pipeline_task as independent modules - pipeline_core moved to independent repo pipeline_core.git - pipeline_task symlink fixed to relative path - All modules now cloned independently under pkgs/ - Removed embedded module source from umbrella repo --- .gitignore | 1 + pipeline_core/init/data.json | 24 -- pipeline_core/json/llm.json | 18 - pipeline_core/json/pipeline_steps.json | 27 -- pipeline_core/json/pipeline_versions.json | 27 -- pipeline_core/json/pipelines.json | 21 -- pipeline_core/models/llm.json | 25 -- pipeline_core/models/pipeline_steps.json | 122 ------- pipeline_core/models/pipeline_versions.json | 94 ----- pipeline_core/models/pipelines.json | 139 -------- pipeline_core/mysql.ddl.sql | 115 ------ pipeline_core/pipeline_core/__init__.py | 14 - pipeline_core/pipeline_core/init.py | 331 ------------------ pipeline_core/pyproject.toml | 9 - pipeline_core/scripts/load_path.py | 70 ---- .../wwwroot/api/pipeline_publish.dspy | 5 - .../wwwroot/api/pipeline_steps_create.dspy | 5 - .../wwwroot/api/pipeline_steps_delete.dspy | 5 - .../wwwroot/api/pipeline_steps_update.dspy | 5 - .../wwwroot/api/pipeline_versions_create.dspy | 5 - .../wwwroot/api/pipeline_versions_delete.dspy | 5 - .../wwwroot/api/pipeline_versions_update.dspy | 5 - .../wwwroot/api/pipelines_create.dspy | 5 - .../wwwroot/api/pipelines_delete.dspy | 5 - .../wwwroot/api/pipelines_update.dspy | 5 - pipeline_core/wwwroot/index.ui | 254 -------------- .../wwwroot/pipeline_editor/index.ui | 85 ----- .../wwwroot/pipeline_editor/save_steps.dspy | 47 --- .../pipeline_steps/add_pipeline_steps.dspy | 37 -- .../pipeline_steps/delete_pipeline_steps.dspy | 33 -- .../pipeline_steps/get_pipeline_steps.dspy | 14 - .../wwwroot/pipeline_steps/get_pipelines.dspy | 13 - .../pipeline_steps/get_step_types.dspy | 18 - pipeline_core/wwwroot/pipeline_steps/index.ui | 241 ------------- .../pipeline_steps/update_pipeline_steps.dspy | 36 -- .../add_pipeline_versions.dspy | 37 -- .../delete_pipeline_versions.dspy | 33 -- .../get_pipeline_versions.dspy | 113 ------ .../wwwroot/pipeline_versions/index.ui | 210 ----------- .../update_pipeline_versions.dspy | 36 -- .../wwwroot/pipelines/add_pipelines.dspy | 54 --- .../wwwroot/pipelines/delete_pipelines.dspy | 47 --- .../wwwroot/pipelines/get_pipelines.dspy | 165 --------- pipeline_core/wwwroot/pipelines/index.ui | 244 ------------- .../wwwroot/pipelines/update_pipelines.dspy | 73 ---- wwwroot/pipeline_core | 2 +- wwwroot/pipeline_task | 2 +- 47 files changed, 3 insertions(+), 2878 deletions(-) delete mode 100644 pipeline_core/init/data.json delete mode 100644 pipeline_core/json/llm.json delete mode 100644 pipeline_core/json/pipeline_steps.json delete mode 100644 pipeline_core/json/pipeline_versions.json delete mode 100644 pipeline_core/json/pipelines.json delete mode 100644 pipeline_core/models/llm.json delete mode 100644 pipeline_core/models/pipeline_steps.json delete mode 100644 pipeline_core/models/pipeline_versions.json delete mode 100644 pipeline_core/models/pipelines.json delete mode 100644 pipeline_core/mysql.ddl.sql delete mode 100644 pipeline_core/pipeline_core/__init__.py delete mode 100644 pipeline_core/pipeline_core/init.py delete mode 100644 pipeline_core/pyproject.toml delete mode 100644 pipeline_core/scripts/load_path.py delete mode 100644 pipeline_core/wwwroot/api/pipeline_publish.dspy delete mode 100644 pipeline_core/wwwroot/api/pipeline_steps_create.dspy delete mode 100644 pipeline_core/wwwroot/api/pipeline_steps_delete.dspy delete mode 100644 pipeline_core/wwwroot/api/pipeline_steps_update.dspy delete mode 100644 pipeline_core/wwwroot/api/pipeline_versions_create.dspy delete mode 100644 pipeline_core/wwwroot/api/pipeline_versions_delete.dspy delete mode 100644 pipeline_core/wwwroot/api/pipeline_versions_update.dspy delete mode 100644 pipeline_core/wwwroot/api/pipelines_create.dspy delete mode 100644 pipeline_core/wwwroot/api/pipelines_delete.dspy delete mode 100644 pipeline_core/wwwroot/api/pipelines_update.dspy delete mode 100644 pipeline_core/wwwroot/index.ui delete mode 100644 pipeline_core/wwwroot/pipeline_editor/index.ui delete mode 100644 pipeline_core/wwwroot/pipeline_editor/save_steps.dspy delete mode 100644 pipeline_core/wwwroot/pipeline_steps/add_pipeline_steps.dspy delete mode 100644 pipeline_core/wwwroot/pipeline_steps/delete_pipeline_steps.dspy delete mode 100644 pipeline_core/wwwroot/pipeline_steps/get_pipeline_steps.dspy delete mode 100644 pipeline_core/wwwroot/pipeline_steps/get_pipelines.dspy delete mode 100644 pipeline_core/wwwroot/pipeline_steps/get_step_types.dspy delete mode 100644 pipeline_core/wwwroot/pipeline_steps/index.ui delete mode 100644 pipeline_core/wwwroot/pipeline_steps/update_pipeline_steps.dspy delete mode 100644 pipeline_core/wwwroot/pipeline_versions/add_pipeline_versions.dspy delete mode 100644 pipeline_core/wwwroot/pipeline_versions/delete_pipeline_versions.dspy delete mode 100644 pipeline_core/wwwroot/pipeline_versions/get_pipeline_versions.dspy delete mode 100644 pipeline_core/wwwroot/pipeline_versions/index.ui delete mode 100644 pipeline_core/wwwroot/pipeline_versions/update_pipeline_versions.dspy delete mode 100644 pipeline_core/wwwroot/pipelines/add_pipelines.dspy delete mode 100644 pipeline_core/wwwroot/pipelines/delete_pipelines.dspy delete mode 100644 pipeline_core/wwwroot/pipelines/get_pipelines.dspy delete mode 100644 pipeline_core/wwwroot/pipelines/index.ui delete mode 100644 pipeline_core/wwwroot/pipelines/update_pipelines.dspy diff --git a/.gitignore b/.gitignore index e085d23..7a44437 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ conf/config.json pipeline.pid pkgs/ bricks +pipeline_core/ diff --git a/pipeline_core/init/data.json b/pipeline_core/init/data.json deleted file mode 100644 index 2f01ed4..0000000 --- a/pipeline_core/init/data.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "appcodes": [ - { - "parentid": "pipeline_type", - "parentname": "产线类型", - "items": [ - {"k": "text", "v": "文本"}, - {"k": "audio", "v": "音频"}, - {"k": "video", "v": "视频"}, - {"k": "image", "v": "图片"}, - {"k": "multimodal", "v": "多模态"} - ] - }, - { - "parentid": "pipeline_status", - "parentname": "产线状态", - "items": [ - {"k": "draft", "v": "草稿"}, - {"k": "published", "v": "已发布"}, - {"k": "archived", "v": "已归档"} - ] - } - ] -} diff --git a/pipeline_core/json/llm.json b/pipeline_core/json/llm.json deleted file mode 100644 index 0a4e63e..0000000 --- a/pipeline_core/json/llm.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "tblname": "llm", - "title": "大语言模型管理", - "params": { - "sortby": "created_at", - "browserfields": { - "exclouded": ["id", "api_key"], - "cwidth": {} - }, - "editexclouded": ["id", "created_at", "updated_at"], - "editable": { - "new_data_url": "{{entire_url('./add_llm.dspy')}}", - "update_data_url": "{{entire_url('./update_llm.dspy')}}", - "delete_data_url": "{{entire_url('./delete_llm.dspy')}}" - }, - "confidential_fields": ["api_key"] - } -} diff --git a/pipeline_core/json/pipeline_steps.json b/pipeline_core/json/pipeline_steps.json deleted file mode 100644 index 253b6fa..0000000 --- a/pipeline_core/json/pipeline_steps.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "tblname": "pipeline_steps", - "title": "产线步骤", - "params": { - "sortby": "step_order", - "browserfields": { - "exclouded": ["id", "step_config", "input_schema", "output_schema"], - "cwidth": {} - }, - "editexclouded": [ - "id", "created_at" - ], - "editable": { - "new_data_url": "{{entire_url('../api/pipeline_steps_create.dspy')}}", - "update_data_url": "{{entire_url('../api/pipeline_steps_update.dspy')}}", - "delete_data_url": "{{entire_url('../api/pipeline_steps_delete.dspy')}}" - }, - "confidential_fields": [], - "subtables": [ - { - "field": "pipeline_id", - "title": "所属产线", - "subtable": "pipelines" - } - ] - } -} diff --git a/pipeline_core/json/pipeline_versions.json b/pipeline_core/json/pipeline_versions.json deleted file mode 100644 index 965d81a..0000000 --- a/pipeline_core/json/pipeline_versions.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "tblname": "pipeline_versions", - "title": "发布记录", - "params": { - "sortby": "created_at", - "browserfields": { - "exclouded": ["id", "config_snapshot"], - "cwidth": {} - }, - "editexclouded": [ - "id", "created_at" - ], - "editable": { - "new_data_url": "{{entire_url('../api/pipeline_versions_create.dspy')}}", - "update_data_url": "{{entire_url('../api/pipeline_versions_update.dspy')}}", - "delete_data_url": "{{entire_url('../api/pipeline_versions_delete.dspy')}}" - }, - "confidential_fields": [], - "subtables": [ - { - "field": "pipeline_id", - "title": "所属产线", - "subtable": "pipelines" - } - ] - } -} diff --git a/pipeline_core/json/pipelines.json b/pipeline_core/json/pipelines.json deleted file mode 100644 index 7bae2bd..0000000 --- a/pipeline_core/json/pipelines.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "tblname": "pipelines", - "title": "产线定义", - "params": { - "sortby": "created_at", - "logined_userorgid": "org_id", - "browserfields": { - "exclouded": ["id", "model_api_key", "pipeline_config"], - "cwidth": {} - }, - "editexclouded": [ - "id", "created_at", "updated_at" - ], - "editable": { - "new_data_url": "{{entire_url('../api/pipelines_create.dspy')}}", - "update_data_url": "{{entire_url('../api/pipelines_update.dspy')}}", - "delete_data_url": "{{entire_url('../api/pipelines_delete.dspy')}}" - }, - "confidential_fields": ["model_api_key"] - } -} diff --git a/pipeline_core/models/llm.json b/pipeline_core/models/llm.json deleted file mode 100644 index c4aee72..0000000 --- a/pipeline_core/models/llm.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "summary": [ - { - "name": "llm", - "title": "大语言模型表", - "primary": ["id"] - } - ], - "fields": [ - {"name": "id", "title": "主键", "type": "str", "length": 32, "nullable": "no"}, - {"name": "name", "title": "模型名称", "type": "str", "length": 100, "nullable": "no"}, - {"name": "provider", "title": "供应商", "type": "str", "length": 50, "nullable": "no"}, - {"name": "model_id", "title": "模型标识", "type": "str", "length": 100}, - {"name": "api_base", "title": "API地址", "type": "str", "length": 500}, - {"name": "api_key", "title": "API密钥", "type": "str", "length": 500}, - {"name": "max_tokens", "title": "最大Token", "type": "int", "default": "8192"}, - {"name": "status", "title": "状态", "type": "str", "length": 20, "default": "active"}, - {"name": "description", "title": "描述", "type": "text"}, - {"name": "created_at", "title": "创建时间", "type": "timestamp"}, - {"name": "updated_at", "title": "更新时间", "type": "timestamp"} - ], - "indexes": [ - {"name": "idx_llm_status", "idxtype": "index", "idxfields": ["status"]} - ] -} diff --git a/pipeline_core/models/pipeline_steps.json b/pipeline_core/models/pipeline_steps.json deleted file mode 100644 index 3763d8a..0000000 --- a/pipeline_core/models/pipeline_steps.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "summary": [ - { - "name": "pipeline_steps", - "title": "产线步骤表", - "primary": [ - "id" - ] - } - ], - "fields": [ - { - "name": "id", - "title": "id", - "type": "str", - "length": 32, - "nullable": "no", - "uitype": "hidden" - }, - { - "name": "pipeline_id", - "title": "所属产线", - "type": "str", - "length": 32, - "nullable": "no", - "uitype": "select" - }, - { - "name": "step_order", - "title": "步骤序号", - "type": "int", - "nullable": "no", - "uitype": "number" - }, - { - "name": "step_name", - "title": "步骤名称", - "type": "str", - "length": 100, - "nullable": "no", - "uitype": "text" - }, - { - "name": "step_type", - "title": "步骤类型", - "type": "str", - "length": 50, - "nullable": "no", - "uitype": "select" - }, - { - "name": "model_name", - "title": "调用模型名称", - "type": "str", - "length": 100, - "uitype": "text" - }, - { - "name": "step_config", - "title": "步骤配置JSON", - "type": "text", - "uitype": "textarea" - }, - { - "name": "input_schema", - "title": "输入定义JSON", - "type": "text", - "uitype": "textarea" - }, - { - "name": "output_schema", - "title": "输出定义JSON", - "type": "text", - "uitype": "textarea" - }, - { - "name": "timeout_seconds", - "title": "超时秒数", - "type": "int", - "default": "300", - "uitype": "number" - }, - { - "name": "retry_count", - "title": "重试次数", - "type": "int", - "default": "0", - "uitype": "number" - }, - { - "name": "created_at", - "title": "创建时间", - "type": "timestamp", - "uitype": "timestamp" - } - ], - "indexes": [ - { - "name": "idx_steps_pipeline", - "idxtype": "index", - "idxfields": [ - "pipeline_id" - ] - }, - { - "name": "idx_steps_order", - "idxtype": "unique", - "idxfields": [ - "pipeline_id", - "step_order" - ] - } - ], - "codes": [ - { - "field": "pipeline_id", - "table": "pipelines", - "valuefield": "id", - "textfield": "name" - } - ] -} \ No newline at end of file diff --git a/pipeline_core/models/pipeline_versions.json b/pipeline_core/models/pipeline_versions.json deleted file mode 100644 index a1ed0cc..0000000 --- a/pipeline_core/models/pipeline_versions.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "summary": [ - { - "name": "pipeline_versions", - "title": "产线发布记录表", - "primary": [ - "id" - ] - } - ], - "fields": [ - { - "name": "id", - "title": "id", - "type": "str", - "length": 32, - "nullable": "no", - "uitype": "hidden" - }, - { - "name": "pipeline_id", - "title": "产线ID", - "type": "str", - "length": 32, - "nullable": "no", - "uitype": "hidden" - }, - { - "name": "version", - "title": "版本号", - "type": "str", - "length": 20, - "nullable": "no", - "uitype": "text" - }, - { - "name": "publish_status", - "title": "发布状态", - "type": "str", - "length": 20, - "nullable": "no", - "default": "pending", - "uitype": "select" - }, - { - "name": "published_by", - "title": "发布人", - "type": "str", - "length": 32, - "uitype": "text" - }, - { - "name": "published_at", - "title": "发布时间", - "type": "timestamp", - "uitype": "timestamp" - }, - { - "name": "changelog", - "title": "变更说明", - "type": "text", - "uitype": "textarea" - }, - { - "name": "config_snapshot", - "title": "配置快照JSON", - "type": "text", - "uitype": "textarea" - }, - { - "name": "created_at", - "title": "创建时间", - "type": "timestamp", - "uitype": "timestamp" - } - ], - "indexes": [ - { - "name": "idx_versions_pipeline", - "idxtype": "index", - "idxfields": [ - "pipeline_id" - ] - } - ], - "codes": [ - { - "field": "pipeline_id", - "table": "pipelines", - "valuefield": "id", - "textfield": "name" - } - ] -} \ No newline at end of file diff --git a/pipeline_core/models/pipelines.json b/pipeline_core/models/pipelines.json deleted file mode 100644 index 893f0a7..0000000 --- a/pipeline_core/models/pipelines.json +++ /dev/null @@ -1,139 +0,0 @@ -{ - "summary": [ - { - "name": "pipelines", - "title": "产线定义表", - "primary": [ - "id" - ] - } - ], - "fields": [ - { - "name": "id", - "title": "id", - "type": "str", - "length": 32, - "nullable": "no", - "uitype": "hidden" - }, - { - "name": "name", - "title": "产线名称", - "type": "str", - "length": 200, - "nullable": "no", - "uitype": "text" - }, - { - "name": "description", - "title": "产线描述", - "type": "text", - "uitype": "textarea" - }, - { - "name": "pipeline_type", - "title": "产线类型", - "type": "str", - "length": 50, - "nullable": "no", - "uitype": "select" - }, - { - "name": "version", - "title": "当前版本", - "type": "str", - "length": 20, - "default": "1.0.0", - "uitype": "text" - }, - { - "name": "status", - "title": "状态", - "type": "str", - "length": 20, - "nullable": "no", - "default": "draft", - "uitype": "select" - }, - { - "name": "pipeline_config", - "title": "产线配置JSON", - "type": "text", - "uitype": "textarea" - }, - { - "name": "model_api_url", - "title": "模型API地址", - "type": "str", - "length": 500, - "uitype": "text" - }, - { - "name": "model_api_key", - "title": "模型API密钥", - "type": "str", - "length": 500, - "uitype": "text" - }, - { - "name": "org_id", - "title": "所属机构ID", - "type": "str", - "length": 32, - "default": "0", - "uitype": "text" - }, - { - "name": "created_by", - "title": "创建人", - "type": "str", - "length": 32, - "uitype": "hidden" - }, - { - "name": "created_at", - "title": "创建时间", - "type": "timestamp", - "uitype": "timestamp" - }, - { - "name": "updated_at", - "title": "更新时间", - "type": "timestamp", - "uitype": "timestamp" - } - ], - "indexes": [ - { - "name": "idx_pipelines_name", - "idxtype": "index", - "idxfields": [ - "name" - ] - }, - { - "name": "idx_pipelines_status", - "idxtype": "index", - "idxfields": [ - "status" - ] - } - ], - "codes": [ - { - "field": "pipeline_type", - "table": "appcodes_kv", - "valuefield": "k", - "textfield": "v", - "cond": "parentid='pipeline_type'" - }, - { - "field": "status", - "table": "appcodes_kv", - "valuefield": "k", - "textfield": "v", - "cond": "parentid='pipeline_status'" - } - ] -} \ No newline at end of file diff --git a/pipeline_core/mysql.ddl.sql b/pipeline_core/mysql.ddl.sql deleted file mode 100644 index 5a337b8..0000000 --- a/pipeline_core/mysql.ddl.sql +++ /dev/null @@ -1,115 +0,0 @@ - --- models/pipeline_versions.json - - - - - --- 建库时请用以下语句,支持emoji字符 --- CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -drop table if exists pipeline_versions; -CREATE TABLE pipeline_versions -( - - `id` VARCHAR(32) NOT NULL comment 'id', - `pipeline_id` VARCHAR(32) NOT NULL comment '产线ID', - `version` VARCHAR(20) NOT NULL comment '版本号', - `publish_status` VARCHAR(20) NOT NULL DEFAULT 'pending' comment '发布状态', - `published_by` VARCHAR(32) comment '发布人', - `published_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP comment '发布时间', - `changelog` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci comment '变更说明', - `config_snapshot` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci comment '配置快照JSON', - `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP comment '创建时间' - - -,primary key(id) - - -) -CHARACTER SET utf8mb4 -COLLATE utf8mb4_unicode_ci -engine=innodb -comment '产线发布记录表' -; - -CREATE INDEX pipeline_versions_idx_versions_pipeline ON pipeline_versions(pipeline_id); - --- models/pipelines.json - - - - - --- 建库时请用以下语句,支持emoji字符 --- CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -drop table if exists pipelines; -CREATE TABLE pipelines -( - - `id` VARCHAR(32) NOT NULL comment 'id', - `name` VARCHAR(200) NOT NULL comment '产线名称', - `description` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci comment '产线描述', - `pipeline_type` VARCHAR(50) NOT NULL comment '产线类型', - `version` VARCHAR(20) DEFAULT '1.0.0' comment '当前版本', - `status` VARCHAR(20) NOT NULL DEFAULT 'draft' comment '状态', - `pipeline_config` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci comment '产线配置JSON', - `model_api_url` VARCHAR(500) comment '模型API地址', - `model_api_key` VARCHAR(500) comment '模型API密钥', - `org_id` VARCHAR(32) DEFAULT '0' comment '所属机构ID', - `created_by` VARCHAR(32) comment '创建人', - `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP comment '创建时间', - `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP comment '更新时间' - - -,primary key(id) - - -) -CHARACTER SET utf8mb4 -COLLATE utf8mb4_unicode_ci -engine=innodb -comment '产线定义表' -; - -CREATE INDEX pipelines_idx_pipelines_name ON pipelines(name); -CREATE INDEX pipelines_idx_pipelines_status ON pipelines(status); - --- models/pipeline_steps.json - - - - - --- 建库时请用以下语句,支持emoji字符 --- CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -drop table if exists pipeline_steps; -CREATE TABLE pipeline_steps -( - - `id` VARCHAR(32) NOT NULL comment 'id', - `pipeline_id` VARCHAR(32) NOT NULL comment '所属产线', - `step_order` int NOT NULL comment '步骤序号', - `step_name` VARCHAR(100) NOT NULL comment '步骤名称', - `step_type` VARCHAR(50) NOT NULL comment '步骤类型', - `model_name` VARCHAR(100) comment '调用模型名称', - `step_config` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci comment '步骤配置JSON', - `input_schema` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci comment '输入定义JSON', - `output_schema` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci comment '输出定义JSON', - `timeout_seconds` int DEFAULT '300' comment '超时秒数', - `retry_count` int DEFAULT '0' comment '重试次数', - `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP comment '创建时间' - - -,primary key(id) - - -) -CHARACTER SET utf8mb4 -COLLATE utf8mb4_unicode_ci -engine=innodb -comment '产线步骤表' -; - -CREATE INDEX pipeline_steps_idx_steps_pipeline ON pipeline_steps(pipeline_id); -CREATE UNIQUE INDEX pipeline_steps_idx_steps_order ON pipeline_steps(pipeline_id,step_order); - diff --git a/pipeline_core/pipeline_core/__init__.py b/pipeline_core/pipeline_core/__init__.py deleted file mode 100644 index 34a9d89..0000000 --- a/pipeline_core/pipeline_core/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# pipeline_core/__init__.py -from .init import ( - create_pipeline, - update_pipeline, - delete_pipeline, - create_pipeline_step, - update_pipeline_step, - delete_pipeline_step, - create_pipeline_version, - update_pipeline_version, - delete_pipeline_version, - publish_pipeline, - load_pipeline_core, -) diff --git a/pipeline_core/pipeline_core/init.py b/pipeline_core/pipeline_core/init.py deleted file mode 100644 index 74c9550..0000000 --- a/pipeline_core/pipeline_core/init.py +++ /dev/null @@ -1,331 +0,0 @@ -"""pipeline_core 模块 - 产线管理核心模块""" -import json -from appPublic.uniqueID import getID -from sqlor.dbpools import DBPools -from ahserver.serverenv import ServerEnv -from appPublic.log import debug - - -MODULE_NAME = 'pipeline_core' -DBNAME = 'pipeline' - - -def _get_sor(): - """Get database pool and dbname for pipeline_core module.""" - return DBPools(), DBNAME - - -async def create_pipeline(params_kw): - """创建产线记录""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - data = params_kw.copy() - data.pop('page', None) - data.pop('rows', None) - data.pop('data_filter', None) - data['id'] = getID() - await sor.C('pipelines', data) - result['success'] = True - result['message'] = '创建成功' - result['id'] = data['id'] - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def update_pipeline(params_kw): - """更新产线记录""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - data = params_kw.copy() - data.pop('page', None) - data.pop('rows', None) - data.pop('data_filter', None) - record_id = data.pop('id', None) - if not record_id: - result['message'] = '缺少id' - else: - await sor.U('pipelines', {**data, 'id': record_id}) - result['success'] = True - result['message'] = '更新成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def delete_pipeline(params_kw): - """删除产线记录""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - record_id = params_kw.get('id') - if not record_id: - result['message'] = '缺少id' - else: - await sor.D('pipelines', {'id': record_id}) - result['success'] = True - result['message'] = '删除成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def create_pipeline_step(params_kw): - """创建产线步骤""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - data = params_kw.copy() - data.pop('page', None) - data.pop('rows', None) - data.pop('data_filter', None) - data['id'] = getID() - await sor.C('pipeline_steps', data) - result['success'] = True - result['message'] = '创建成功' - result['id'] = data['id'] - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def update_pipeline_step(params_kw): - """更新产线步骤""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - data = params_kw.copy() - data.pop('page', None) - data.pop('rows', None) - data.pop('data_filter', None) - record_id = data.pop('id', None) - if not record_id: - result['message'] = '缺少id' - else: - await sor.U('pipeline_steps', {**data, 'id': record_id}) - result['success'] = True - result['message'] = '更新成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def delete_pipeline_step(params_kw): - """删除产线步骤""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - record_id = params_kw.get('id') - if not record_id: - result['message'] = '缺少id' - else: - await sor.D('pipeline_steps', {'id': record_id}) - result['success'] = True - result['message'] = '删除成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def create_pipeline_version(params_kw): - """创建产线发布记录""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - data = params_kw.copy() - data.pop('page', None) - data.pop('rows', None) - data.pop('data_filter', None) - data['id'] = getID() - await sor.C('pipeline_versions', data) - result['success'] = True - result['message'] = '创建成功' - result['id'] = data['id'] - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def update_pipeline_version(params_kw): - """更新产线发布记录""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - data = params_kw.copy() - data.pop('page', None) - data.pop('rows', None) - data.pop('data_filter', None) - record_id = data.pop('id', None) - if not record_id: - result['message'] = '缺少id' - else: - await sor.U('pipeline_versions', {**data, 'id': record_id}) - result['success'] = True - result['message'] = '更新成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def delete_pipeline_version(params_kw): - """删除产线发布记录""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - record_id = params_kw.get('id') - if not record_id: - result['message'] = '缺少id' - else: - await sor.D('pipeline_versions', {'id': record_id}) - result['success'] = True - result['message'] = '删除成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def publish_pipeline(params_kw): - """发布产线 - 创建发布记录并更新产线状态""" - result = {'success': False, 'message': ''} - try: - pipeline_id = params_kw.get('pipeline_id') - if not pipeline_id: - result['message'] = '缺少pipeline_id' - return json.dumps(result, ensure_ascii=False, default=str) - - changelog = params_kw.get('changelog', '') - published_by = params_kw.get('published_by', '') - - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - # Get current pipeline - recs = await sor.R('pipelines', {'id': pipeline_id}) - if not recs: - result['message'] = f'产线不存在: {pipeline_id}' - return json.dumps(result, ensure_ascii=False, default=str) - - pipeline = recs[0] - current_version = pipeline.get('version', '1.0.0') if hasattr(pipeline, 'get') else getattr(pipeline, 'version', '1.0.0') - - # Build config snapshot from current pipeline data - config_snapshot = json.dumps({ - 'pipeline_config': getattr(pipeline, 'pipeline_config', None), - 'model_api_url': getattr(pipeline, 'model_api_url', None), - 'version': current_version, - }, ensure_ascii=False, default=str) - - # Create version record - version_id = getID() - version_data = { - 'id': version_id, - 'pipeline_id': pipeline_id, - 'version': current_version, - 'publish_status': 'published', - 'published_by': published_by, - 'changelog': changelog, - 'config_snapshot': config_snapshot, - } - await sor.C('pipeline_versions', version_data) - - # Update pipeline status to published - await sor.U('pipelines', {'id': pipeline_id, 'status': 'published'}) - - result['success'] = True - result['message'] = '发布成功' - result['version_id'] = version_id - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def create_llm(params_kw): - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - data = params_kw.copy() - data.pop('page', None) - data.pop('rows', None) - data.pop('data_filter', None) - data['id'] = getID() - await sor.C('llm', data) - result['success'] = True - result['message'] = '创建成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def update_llm(params_kw): - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - data = params_kw.copy() - data.pop('page', None) - data.pop('rows', None) - data.pop('data_filter', None) - await sor.U('llm', data) - result['success'] = True - result['message'] = '更新成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def delete_llm(params_kw): - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - await sor.D('llm', {'id': params_kw.get('id')}) - result['success'] = True - result['message'] = '删除成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -def load_pipeline_core(): - """注册函数到 ServerEnv""" - env = ServerEnv() - # Pipelines - env.create_pipeline = create_pipeline - env.create_pipelines = create_pipeline - env.update_pipeline = update_pipeline - env.update_pipelines = update_pipeline - env.delete_pipeline = delete_pipeline - env.delete_pipelines = delete_pipeline - # LLM - env.create_llm = create_llm - env.update_llm = update_llm - env.delete_llm = delete_llm - # Pipeline Steps - env.create_pipeline_step = create_pipeline_step - env.create_pipeline_steps = create_pipeline_step - env.update_pipeline_step = update_pipeline_step - env.update_pipeline_steps = update_pipeline_step - env.delete_pipeline_step = delete_pipeline_step - env.delete_pipeline_steps = delete_pipeline_step - # Pipeline Versions - env.create_pipeline_version = create_pipeline_version - env.create_pipeline_versions = create_pipeline_version - env.update_pipeline_version = update_pipeline_version - env.update_pipeline_versions = update_pipeline_version - env.delete_pipeline_version = delete_pipeline_version - env.delete_pipeline_versions = delete_pipeline_version - # Publish - env.publish_pipeline = publish_pipeline - debug(f'[{MODULE_NAME}] module loaded') - return True diff --git a/pipeline_core/pyproject.toml b/pipeline_core/pyproject.toml deleted file mode 100644 index a80fdb7..0000000 --- a/pipeline_core/pyproject.toml +++ /dev/null @@ -1,9 +0,0 @@ -[project] -name = "pipeline_core" -version = "0.1.0" -description = "产线管理核心模块" -dependencies = ["sqlor", "bricks_for_python"] - -[tool.setuptools.packages.find] -where = ["."] -include = ["pipeline_core*"] diff --git a/pipeline_core/scripts/load_path.py b/pipeline_core/scripts/load_path.py deleted file mode 100644 index d2c4241..0000000 --- a/pipeline_core/scripts/load_path.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python3 -"""RBAC path registration for pipeline_core module.""" -import os, sys, subprocess - -MOD = "pipeline_core" - -PATHS_ANY = [ - f"/{MOD}/index.ui", -] - -PATHS_LOGINED = [ - f"/{MOD}", - # Pipelines CRUD - f"/{MOD}/pipelines/index.ui", - f"/{MOD}/pipelines/get_pipelines.dspy", - f"/{MOD}/pipelines/add_pipelines.dspy", - f"/{MOD}/pipelines/update_pipelines.dspy", - f"/{MOD}/pipelines/delete_pipelines.dspy", - # Pipeline Steps CRUD - f"/{MOD}/pipeline_steps/index.ui", - f"/{MOD}/pipeline_steps/get_pipeline_steps.dspy", - f"/{MOD}/pipeline_steps/add_pipeline_steps.dspy", - f"/{MOD}/pipeline_steps/update_pipeline_steps.dspy", - f"/{MOD}/pipeline_steps/delete_pipeline_steps.dspy", - # Pipeline Versions - f"/{MOD}/pipeline_versions/index.ui", - f"/{MOD}/pipeline_versions/get_pipeline_versions.dspy", - f"/{MOD}/pipeline_versions/add_pipeline_versions.dspy", - f"/{MOD}/pipeline_versions/update_pipeline_versions.dspy", - f"/{MOD}/pipeline_versions/delete_pipeline_versions.dspy", - # Pipeline Editor - f"/{MOD}/pipeline_editor/index.ui", - f"/{MOD}/pipeline_editor/save_steps.dspy", - # Data sources - f"/{MOD}/pipeline_steps/get_pipelines.dspy", - f"/{MOD}/pipeline_steps/get_step_types.dspy", - # API - f"/{MOD}/api/pipeline_publish.dspy", - f"/{MOD}/api/pipeline_steps_create.dspy", - f"/{MOD}/api/pipeline_steps_update.dspy", - f"/{MOD}/api/pipeline_steps_delete.dspy", - f"/{MOD}/api/pipeline_versions_create.dspy", - f"/{MOD}/api/pipeline_versions_update.dspy", - f"/{MOD}/api/pipeline_versions_delete.dspy", - f"/{MOD}/api/pipelines_create.dspy", - f"/{MOD}/api/pipelines_update.dspy", - f"/{MOD}/api/pipelines_delete.dspy", -] - - -def main(): - root = os.path.expanduser("~/pipeline") - if not os.path.isfile(os.path.join(root, "set_role_perm.py")): - print("ERROR: pipeline root not found") - sys.exit(1) - set_perm = os.path.join(root, "set_role_perm.py") - py = sys.executable - count = 0 - for role, paths in [("any", PATHS_ANY), ("logined", PATHS_LOGINED)]: - for path in paths: - r = subprocess.run([py, set_perm, role, path], capture_output=True, text=True, cwd=root) - if r.returncode == 0: - count += 1 - else: - print(f" WARN: {path} -> {r.stderr.strip()[-80:]}") - print(f"Registered {count}/{len(PATHS_ANY)+len(PATHS_LOGINED)} paths for {MOD}") - - -if __name__ == "__main__": - main() diff --git a/pipeline_core/wwwroot/api/pipeline_publish.dspy b/pipeline_core/wwwroot/api/pipeline_publish.dspy deleted file mode 100644 index 7e4afaa..0000000 --- a/pipeline_core/wwwroot/api/pipeline_publish.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = publish_pipeline -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/pipeline_core/wwwroot/api/pipeline_steps_create.dspy b/pipeline_core/wwwroot/api/pipeline_steps_create.dspy deleted file mode 100644 index 851c278..0000000 --- a/pipeline_core/wwwroot/api/pipeline_steps_create.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = create_pipeline_step -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/pipeline_core/wwwroot/api/pipeline_steps_delete.dspy b/pipeline_core/wwwroot/api/pipeline_steps_delete.dspy deleted file mode 100644 index d73053c..0000000 --- a/pipeline_core/wwwroot/api/pipeline_steps_delete.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = delete_pipeline_step -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/pipeline_core/wwwroot/api/pipeline_steps_update.dspy b/pipeline_core/wwwroot/api/pipeline_steps_update.dspy deleted file mode 100644 index 998289d..0000000 --- a/pipeline_core/wwwroot/api/pipeline_steps_update.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = update_pipeline_step -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/pipeline_core/wwwroot/api/pipeline_versions_create.dspy b/pipeline_core/wwwroot/api/pipeline_versions_create.dspy deleted file mode 100644 index 3567ff2..0000000 --- a/pipeline_core/wwwroot/api/pipeline_versions_create.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = create_pipeline_version -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/pipeline_core/wwwroot/api/pipeline_versions_delete.dspy b/pipeline_core/wwwroot/api/pipeline_versions_delete.dspy deleted file mode 100644 index 31e496b..0000000 --- a/pipeline_core/wwwroot/api/pipeline_versions_delete.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = delete_pipeline_version -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/pipeline_core/wwwroot/api/pipeline_versions_update.dspy b/pipeline_core/wwwroot/api/pipeline_versions_update.dspy deleted file mode 100644 index 6618b2e..0000000 --- a/pipeline_core/wwwroot/api/pipeline_versions_update.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = update_pipeline_version -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/pipeline_core/wwwroot/api/pipelines_create.dspy b/pipeline_core/wwwroot/api/pipelines_create.dspy deleted file mode 100644 index ef6e24b..0000000 --- a/pipeline_core/wwwroot/api/pipelines_create.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = create_pipeline -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/pipeline_core/wwwroot/api/pipelines_delete.dspy b/pipeline_core/wwwroot/api/pipelines_delete.dspy deleted file mode 100644 index 3a07d83..0000000 --- a/pipeline_core/wwwroot/api/pipelines_delete.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = delete_pipeline -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/pipeline_core/wwwroot/api/pipelines_update.dspy b/pipeline_core/wwwroot/api/pipelines_update.dspy deleted file mode 100644 index ed3b6c0..0000000 --- a/pipeline_core/wwwroot/api/pipelines_update.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = update_pipeline -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/pipeline_core/wwwroot/index.ui b/pipeline_core/wwwroot/index.ui deleted file mode 100644 index 7a49d8c..0000000 --- a/pipeline_core/wwwroot/index.ui +++ /dev/null @@ -1,254 +0,0 @@ -{ - "widgettype": "VBox", - "options": { - "width": "100%", - "height": "100%", - "padding": "0" - }, - "subwidgets": [ - { - "widgettype": "HBox", - "options": { - "width": "100%", - "alignItems": "center", - "padding": "24px 24px 12px 24px", - "cheight": 6 - }, - "subwidgets": [ - { - "widgettype": "Title2", - "options": { - "text": "产线管理" - } - }, - { - "widgettype": "Filler" - }, - { - "widgettype": "Text", - "options": { - "text": "产线定义、步骤配置与发布管理", - "cfontsize": 1.2 - } - } - ] - }, - { - "widgettype": "HBox", - "options": { - "width": "100%", - "padding": "12px 24px 12px 24px", - "cheight": 18 - }, - "subwidgets": [ - { - "widgettype": "ResponsableBox", - "options": { - "gap": "24px", - "minWidth": "260px" - }, - "subwidgets": [ - { - "widgettype": "Text", - "options": { - "text": "EDITOR CARD HERE" - } - }, - { - "widgettype": "VBox", - "options": { - "css": "card", - "cwidth": 23, - "cheight": 12, - "padding": "24px", - "cursor": "pointer", - "bgcolor": "#fff" - }, - "binds": [ - { - "wid": "self", - "event": "click", - "actiontype": "urlwidget", - "target": "app.main_content", - "options": { - "url": "{{entire_url('/pipeline_core/pipelines/')}}" - }, - "mode": "replace" - } - ], - "subwidgets": [ - { - "widgettype": "VBox", - "options": { - "width": "44px", - "height": "44px", - "bgcolor": "#EFF6FF", - "borderRadius": "12px", - "alignItems": "center", - "justifyContent": "center", - "marginBottom": "12px" - }, - "subwidgets": [ - { - "widgettype": "Svg", - "options": { - "svg": "", - "width": "24px", - "height": "24px" - } - } - ] - }, - { - "widgettype": "Title3", - "options": { - "text": "产线定义", - "marginBottom": "4px" - } - }, - { - "widgettype": "Text", - "options": { - "text": "管理产线基本信息与配置", - "cfontsize": 1.2 - } - } - ] - }, - { - "widgettype": "VBox", - "options": { - "css": "card", - "cwidth": 23, - "cheight": 12, - "padding": "24px", - "cursor": "pointer", - "bgcolor": "#fff" - }, - "binds": [ - { - "wid": "self", - "event": "click", - "actiontype": "urlwidget", - "target": "app.main_content", - "options": { - "url": "{{entire_url('/pipeline_core/pipeline_steps/')}}" - }, - "mode": "replace" - } - ], - "subwidgets": [ - { - "widgettype": "VBox", - "options": { - "width": "44px", - "height": "44px", - "bgcolor": "#F0FDF4", - "borderRadius": "12px", - "alignItems": "center", - "justifyContent": "center", - "marginBottom": "12px" - }, - "subwidgets": [ - { - "widgettype": "Svg", - "options": { - "svg": "", - "width": "24px", - "height": "24px" - } - } - ] - }, - { - "widgettype": "Title3", - "options": { - "text": "产线步骤", - "marginBottom": "4px" - } - }, - { - "widgettype": "Text", - "options": { - "text": "配置产线执行步骤与参数", - "cfontsize": 1.2 - } - } - ] - }, - { - "widgettype": "VBox", - "options": { - "css": "card", - "cwidth": 23, - "cheight": 12, - "padding": "24px", - "cursor": "pointer", - "bgcolor": "#fff" - }, - "binds": [ - { - "wid": "self", - "event": "click", - "actiontype": "urlwidget", - "target": "app.main_content", - "options": { - "url": "{{entire_url('/pipeline_core/pipeline_versions/')}}" - }, - "mode": "replace" - } - ], - "subwidgets": [ - { - "widgettype": "VBox", - "options": { - "width": "44px", - "height": "44px", - "bgcolor": "#FFFBEB", - "borderRadius": "12px", - "alignItems": "center", - "justifyContent": "center", - "marginBottom": "12px" - }, - "subwidgets": [ - { - "widgettype": "Svg", - "options": { - "svg": "", - "width": "24px", - "height": "24px" - } - } - ] - }, - { - "widgettype": "Title3", - "options": { - "text": "发布记录", - "marginBottom": "4px" - } - }, - { - "widgettype": "Text", - "options": { - "text": "查看产线版本发布历史", - "cfontsize": 1.2 - } - } - ] - } - ] - } - ] - }, - { - "widgettype": "VScrollPanel", - "id": "pipeline_core_content", - "options": { - "css": "filler", - "width": "100%", - "height": "100%" - } - } - ] -} \ No newline at end of file diff --git a/pipeline_core/wwwroot/pipeline_editor/index.ui b/pipeline_core/wwwroot/pipeline_editor/index.ui deleted file mode 100644 index 6812015..0000000 --- a/pipeline_core/wwwroot/pipeline_editor/index.ui +++ /dev/null @@ -1,85 +0,0 @@ -{ - "widgettype": "VBox", - "options": {"width": "100%", "height": "100%", "padding": "24px", "gap": "20px"}, - "subwidgets": [ - { - "widgettype": "HBox", - "options": {"alignItems": "center", "gap": "16px", "padding": "0 0 16px 0", "borderBottom": "1px solid #334155"}, - "subwidgets": [ - {"widgettype": "Title2", "options": {"text": "产线编排画布"}}, - {"widgettype": "Filler"}, - { - "widgettype": "Button", - "options": {"label": "发布版本", "bgcolor": "#6366f1", "color": "#fff"}, - "binds": [{"wid": "self", "event": "click", "actiontype": "method", "target": "app.pipeline_editor", "method": "publish"}] - } - ] - }, - { - "widgettype": "HBox", - "options": {"gap": "12px", "alignItems": "center"}, - "subwidgets": [ - {"widgettype": "Text", "options": {"text": "选择产线:", "cfontsize": 1, "color": "#e2e8f0"}}, - { - "widgettype": "DataSelector", - "id": "ds_pipelines", - "options": { - "data_url": "{{entire_url('/pipeline_core/pipeline_steps/get_pipelines.dspy')}}", - "valueField": "id", - "textField": "name", - "width": "300px", - "placeholder": "选择要编辑的产线..." - }, - "binds": [{"wid": "self", "event": "change", "actiontype": "method", "target": "app.pipeline_editor", "method": "load_steps"}] - }, - { - "widgettype": "DataSelector", - "id": "ds_step_types", - "options": { - "data_url": "{{entire_url('/pipeline_core/pipeline_steps/get_step_types.dspy')}}", - "valueField": "step_type", - "textField": "display_name", - "width": "240px", - "placeholder": "添加步骤类型..." - } - }, - { - "widgettype": "Button", - "options": {"label": "+ 添加步骤", "bgcolor": "#4ade80", "color": "#000"}, - "binds": [{"wid": "self", "event": "click", "actiontype": "method", "target": "app.pipeline_editor", "method": "add_step"}] - } - ] - }, - { - "widgettype": "DataViewer", - "id": "dv_steps", - "options": { - "data_url": "", - "width": "100%", - "columns": ["id", "step_order", "step_name", "step_type"] - } - }, - { - "widgettype": "VBox", - "id": "steps_canvas", - "options": {"width": "100%", "gap": "8px", "padding": "0", "minHeight": "300px"}, - "subwidgets": [ - { - "widgettype": "Text", - "options": {"text": "选择产线后,步骤将在此显示。可以拖拽排序、点击编辑。", "cfontsize": 1, "color": "#64748b", "padding": "40px", "alignItems": "center"} - } - ] - }, - { - "widgettype": "HBox", - "options": {"gap": "12px", "justifyContent": "flex-end", "padding": "16px 0 0 0", "borderTop": "1px solid #334155"}, - "subwidgets": [ - { - "widgettype": "Button", - "options": {"label": "保存排序", "bgcolor": "#3b82f6", "color": "#fff"}, - "binds": [{"wid": "self", "event": "click", "actiontype": "method", "target": "app.pipeline_editor", "method": "save_order"}] - } - ] - } - ] -} diff --git a/pipeline_core/wwwroot/pipeline_editor/save_steps.dspy b/pipeline_core/wwwroot/pipeline_editor/save_steps.dspy deleted file mode 100644 index c0cb516..0000000 --- a/pipeline_core/wwwroot/pipeline_editor/save_steps.dspy +++ /dev/null @@ -1,47 +0,0 @@ -""" -Pipeline Editor: Save step order after reordering -POST params: pipeline_id, steps (JSON array of {id, step_order}) -""" -from sqlor.dbpools import DBPools - -async def main(): - userid = await get_user() - if not userid: - return {'error': 'unauthorized'} - - pipeline_id = params_kw.pipeline_id - steps = params_kw.steps # JSON array - - if not pipeline_id or not steps: - return {'error': 'missing pipeline_id or steps'} - - if isinstance(steps, str): - import json - steps = json.loads(steps) - - dbname = get_module_dbname('pipeline_core') - async with DBPools().sqlorContext(dbname) as sor: - for i, step in enumerate(steps): - await sor.U('pipeline_steps', { - 'id': step['id'], - 'step_order': i + 1, - 'step_name': step.get('step_name', ''), - 'step_type': step.get('step_type', ''), - 'step_config': step.get('step_config', '{}'), - 'timeout_seconds': step.get('timeout_seconds', 300), - 'retry_count': step.get('retry_count', 0) - }) - - # Create version record - from appPublic.uniqueID import getID - vid = getID() - await sor.C('pipeline_versions', { - 'id': vid, - 'pipeline_id': pipeline_id, - 'version': f"v{len(steps)}.0", - 'publish_status': 'draft', - 'changelog': 'Editor save', - 'config_snapshot': json.dumps(steps, ensure_ascii=False) if 'json' in dir() else str(steps) - }) - - return {'success': True, 'version_id': vid, 'step_count': len(steps)} diff --git a/pipeline_core/wwwroot/pipeline_steps/add_pipeline_steps.dspy b/pipeline_core/wwwroot/pipeline_steps/add_pipeline_steps.dspy deleted file mode 100644 index 098b2fc..0000000 --- a/pipeline_core/wwwroot/pipeline_steps/add_pipeline_steps.dspy +++ /dev/null @@ -1,37 +0,0 @@ - -ns = params_kw.copy() -for k,v in ns.items(): - if v == 'NaN' or v == 'null': - ns[k] = None -id = params_kw.id -if not id or len(id) > 32: - id = uuid() -ns['id'] = id - - - -db = DBPools() -dbname = get_module_dbname('pipeline_core') -async with db.sqlorContext(dbname) as sor: - r = await sor.C('pipeline_steps', ns.copy()) - return { - "widgettype":"Message", - "options":{ - "cwidth":16, - "cheight":9, - "title":"Add Success", - "timeout":3, - "message":"ok" - } - } - -return { - "widgettype":"Error", - "options":{ - "title":"Add Error", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"failed" - } -} \ No newline at end of file diff --git a/pipeline_core/wwwroot/pipeline_steps/delete_pipeline_steps.dspy b/pipeline_core/wwwroot/pipeline_steps/delete_pipeline_steps.dspy deleted file mode 100644 index d659f20..0000000 --- a/pipeline_core/wwwroot/pipeline_steps/delete_pipeline_steps.dspy +++ /dev/null @@ -1,33 +0,0 @@ - -ns = { - 'id':params_kw['id'], -} - - -db = DBPools() -dbname = get_module_dbname('pipeline_core') -async with db.sqlorContext(dbname) as sor: - r = await sor.D('pipeline_steps', ns) - debug('delete success'); - return { - "widgettype":"Message", - "options":{ - "title":"Delete Success", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"ok" - } - } - -debug('Delete failed'); -return { - "widgettype":"Error", - "options":{ - "title":"Delete Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"failed" - } -} \ No newline at end of file diff --git a/pipeline_core/wwwroot/pipeline_steps/get_pipeline_steps.dspy b/pipeline_core/wwwroot/pipeline_steps/get_pipeline_steps.dspy deleted file mode 100644 index 5a6875b..0000000 --- a/pipeline_core/wwwroot/pipeline_steps/get_pipeline_steps.dspy +++ /dev/null @@ -1,14 +0,0 @@ - -from sqlor.dbpools import DBPools - -async def main(): - pipeline_id = params_kw.pipeline_id or params_kw.id - dbname = get_module_dbname('pipeline_core') - async with DBPools().sqlorContext(dbname) as sor: - if pipeline_id: - recs = await sor.R('pipeline_steps', {'pipeline_id': pipeline_id}) - else: - recs = await sor.R('pipeline_steps', {}) - # Sort by step_order - recs = sorted(recs, key=lambda r: r.step_order if hasattr(r,'step_order') else 0) - return recs diff --git a/pipeline_core/wwwroot/pipeline_steps/get_pipelines.dspy b/pipeline_core/wwwroot/pipeline_steps/get_pipelines.dspy deleted file mode 100644 index 2034836..0000000 --- a/pipeline_core/wwwroot/pipeline_steps/get_pipelines.dspy +++ /dev/null @@ -1,13 +0,0 @@ - -from sqlor.dbpools import DBPools - -async def main(): - dbname = get_module_dbname('pipeline_core') - async with DBPools().sqlorContext(dbname) as sor: - recs = await sor.R('pipelines', {'status': 'published'}) - if not recs: - recs = await sor.R('pipelines', {}) - result = [] - for r in recs: - result.append({'id': r.id, 'name': r.name, 'text': r.name, 'value': r.id}) - return result diff --git a/pipeline_core/wwwroot/pipeline_steps/get_step_types.dspy b/pipeline_core/wwwroot/pipeline_steps/get_step_types.dspy deleted file mode 100644 index 85881c1..0000000 --- a/pipeline_core/wwwroot/pipeline_steps/get_step_types.dspy +++ /dev/null @@ -1,18 +0,0 @@ - -from sqlor.dbpools import DBPools - -async def main(): - dbname = get_module_dbname('pipeline_core') - async with DBPools().sqlorContext(dbname) as sor: - recs = await sor.R('pipeline_step_types', {}) - result = [] - for r in recs: - result.append({ - 'step_type': r.step_type, - 'display_name': r.display_name, - 'text': f"{r.display_name} ({r.step_type})", - 'value': r.step_type, - 'category': r.category, - 'is_interactive': r.is_interactive - }) - return result diff --git a/pipeline_core/wwwroot/pipeline_steps/index.ui b/pipeline_core/wwwroot/pipeline_steps/index.ui deleted file mode 100644 index f0e6f1f..0000000 --- a/pipeline_core/wwwroot/pipeline_steps/index.ui +++ /dev/null @@ -1,241 +0,0 @@ - -{ - "widgettype":"VBox", - "options":{"cheight":40,"width":"100%"}, - "subwidgets":[{ - "id":"pipeline_steps_tbl", - "widgettype":"Tabular", - "options":{ - "width":"100%", - "height":"100%", - - - "title":"产线步骤表", - - - - - "toolbar":{ - "tools": [ - { - "selected_row": true, - "name": "pipelines", - "icon": "{{entire_url('/imgs/pipelines.svg')}}", - "label": "所属产线" - } - ] -}, - - "css":"card", - - - "editable":{ - - "new_data_url":"{{entire_url('add_pipeline_steps.dspy')}}", - - - "delete_data_url":"{{entire_url('delete_pipeline_steps.dspy')}}", - - - "update_data_url":"{{entire_url('update_pipeline_steps.dspy')}}" - - }, - - - "data_url":"{{entire_url('./get_pipeline_steps.dspy')}}", - - "data_method":"GET", - "data_params":{{json.dumps(params_kw, indent=4, ensure_ascii=False)}}, - "row_options":{ - - - - "browserfields": { - "exclouded": [ - "id", - "step_config", - "input_schema", - "output_schema" - ], - "cwidth": {} -}, - - - "editexclouded":[ - "id", - "created_at" -], - - "fields":[ - { - "name": "id", - "title": "id", - "type": "str", - "length": 32, - "nullable": "no", - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "id" - }, - { - "name": "pipeline_id", - "title": "所属产线", - "type": "str", - "length": 32, - "nullable": "no", - "label": "所属产线", - "uitype": "code", - "valueField": "pipeline_id", - "textField": "pipeline_id_text", - "params": { - "dbname": "{{'sage'}}", - "table": "pipelines", - "tblvalue": "id", - "tbltext": "name", - "valueField": "pipeline_id", - "textField": "pipeline_id_text" - }, - "dataurl": "{{entire_url('/appbase/get_code.dspy')}}" - }, - { - "name": "step_order", - "title": "步骤序号", - "type": "int", - "nullable": "no", - "length": 0, - "uitype": "int", - "datatype": "int", - "label": "步骤序号" - }, - { - "name": "step_name", - "title": "步骤名称", - "type": "str", - "length": 100, - "nullable": "no", - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "步骤名称" - }, - { - "name": "step_type", - "title": "步骤类型", - "type": "str", - "length": 50, - "nullable": "no", - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "步骤类型" - }, - { - "name": "model_name", - "title": "调用模型名称", - "type": "str", - "length": 100, - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "调用模型名称" - }, - { - "name": "step_config", - "title": "步骤配置JSON", - "type": "text", - "length": 0, - "uitype": "text", - "datatype": "text", - "label": "步骤配置JSON" - }, - { - "name": "input_schema", - "title": "输入定义JSON", - "type": "text", - "length": 0, - "uitype": "text", - "datatype": "text", - "label": "输入定义JSON" - }, - { - "name": "output_schema", - "title": "输出定义JSON", - "type": "text", - "length": 0, - "uitype": "text", - "datatype": "text", - "label": "输出定义JSON" - }, - { - "name": "timeout_seconds", - "title": "超时秒数", - "type": "int", - "default": "300", - "length": 0, - "uitype": "int", - "datatype": "int", - "label": "超时秒数" - }, - { - "name": "retry_count", - "title": "重试次数", - "type": "int", - "default": "0", - "length": 0, - "uitype": "int", - "datatype": "int", - "label": "重试次数" - }, - { - "name": "created_at", - "title": "创建时间", - "type": "timestamp", - "length": 0, - "uitype": "str", - "datatype": "timestamp", - "label": "创建时间" - } -] - }, - - - - - - - - "page_rows":160, - "cache_limit":5 - } - - ,"binds":[ - { - "wid": "self", - "event": "pipelines", - "actiontype": "urlwidget", - "target": "PopupWindow", - "popup_options": { - "title": "所属产线", - "icon": "{{entire_url('/appbase/get_icon.dspy')}}?id=pipelines", - "resizable": true, - "height": "70%", - "width": "70%" - }, - "params_mapping": { - "mapping": { - "id": "pipeline_id", - "referer_widget": "referer_widget" - }, - "need_other": false - }, - "options": { - "method": "POST", - "params": {}, - "url": "{{entire_url('../pipelines')}}" - } - } -] - -}] -} \ No newline at end of file diff --git a/pipeline_core/wwwroot/pipeline_steps/update_pipeline_steps.dspy b/pipeline_core/wwwroot/pipeline_steps/update_pipeline_steps.dspy deleted file mode 100644 index 9c095da..0000000 --- a/pipeline_core/wwwroot/pipeline_steps/update_pipeline_steps.dspy +++ /dev/null @@ -1,36 +0,0 @@ - -ns = params_kw.copy() -for k,v in ns.items(): - if v == 'NaN' or v == 'null': - ns[k] = None - - - - -db = DBPools() -dbname = get_module_dbname('pipeline_core') -async with db.sqlorContext(dbname) as sor: - - r = await sor.U('pipeline_steps', ns) - debug('update success'); - return { - "widgettype":"Message", - "options":{ - "title":"Update Success", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"ok" - } - } - -return { - "widgettype":"Error", - "options":{ - "title":"Update Error", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"failed" - } -} \ No newline at end of file diff --git a/pipeline_core/wwwroot/pipeline_versions/add_pipeline_versions.dspy b/pipeline_core/wwwroot/pipeline_versions/add_pipeline_versions.dspy deleted file mode 100644 index 15c2ddb..0000000 --- a/pipeline_core/wwwroot/pipeline_versions/add_pipeline_versions.dspy +++ /dev/null @@ -1,37 +0,0 @@ - -ns = params_kw.copy() -for k,v in ns.items(): - if v == 'NaN' or v == 'null': - ns[k] = None -id = params_kw.id -if not id or len(id) > 32: - id = uuid() -ns['id'] = id - - - -db = DBPools() -dbname = get_module_dbname('pipeline_core') -async with db.sqlorContext(dbname) as sor: - r = await sor.C('pipeline_versions', ns.copy()) - return { - "widgettype":"Message", - "options":{ - "cwidth":16, - "cheight":9, - "title":"Add Success", - "timeout":3, - "message":"ok" - } - } - -return { - "widgettype":"Error", - "options":{ - "title":"Add Error", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"failed" - } -} \ No newline at end of file diff --git a/pipeline_core/wwwroot/pipeline_versions/delete_pipeline_versions.dspy b/pipeline_core/wwwroot/pipeline_versions/delete_pipeline_versions.dspy deleted file mode 100644 index 42a6efb..0000000 --- a/pipeline_core/wwwroot/pipeline_versions/delete_pipeline_versions.dspy +++ /dev/null @@ -1,33 +0,0 @@ - -ns = { - 'id':params_kw['id'], -} - - -db = DBPools() -dbname = get_module_dbname('pipeline_core') -async with db.sqlorContext(dbname) as sor: - r = await sor.D('pipeline_versions', ns) - debug('delete success'); - return { - "widgettype":"Message", - "options":{ - "title":"Delete Success", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"ok" - } - } - -debug('Delete failed'); -return { - "widgettype":"Error", - "options":{ - "title":"Delete Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"failed" - } -} \ No newline at end of file diff --git a/pipeline_core/wwwroot/pipeline_versions/get_pipeline_versions.dspy b/pipeline_core/wwwroot/pipeline_versions/get_pipeline_versions.dspy deleted file mode 100644 index b039ebd..0000000 --- a/pipeline_core/wwwroot/pipeline_versions/get_pipeline_versions.dspy +++ /dev/null @@ -1,113 +0,0 @@ - -ns = params_kw.copy() - - -debug(f'get_pipeline_versions.dspy:{ns=}') -if not ns.get('page'): - ns['page'] = 1 -if not ns.get('sort'): - - - ns['sort'] = 'created_at' - - - -sql = '''select a.*, b.pipeline_id_text -from (select * from pipeline_versions where 1=1 [[filterstr]]) a left join (select id as pipeline_id, - name as pipeline_id_text from pipelines where 1 = 1) b on a.pipeline_id = b.pipeline_id''' - -filterjson = params_kw.get('data_filter') -if filterjson and isinstance(filterjson, str): - try: - filterjson = json.loads(filterjson) - except (json.JSONDecodeError, TypeError): - filterjson = None -fields_str=r'''[ - { - "name": "id", - "title": "id", - "type": "str", - "length": 32, - "nullable": "no" - }, - { - "name": "pipeline_id", - "title": "产线ID", - "type": "str", - "length": 32, - "nullable": "no" - }, - { - "name": "version", - "title": "版本号", - "type": "str", - "length": 20, - "nullable": "no" - }, - { - "name": "publish_status", - "title": "发布状态", - "type": "str", - "length": 20, - "nullable": "no", - "default": "pending" - }, - { - "name": "published_by", - "title": "发布人", - "type": "str", - "length": 32 - }, - { - "name": "published_at", - "title": "发布时间", - "type": "timestamp" - }, - { - "name": "changelog", - "title": "变更说明", - "type": "text" - }, - { - "name": "config_snapshot", - "title": "配置快照JSON", - "type": "text" - }, - { - "name": "created_at", - "title": "创建时间", - "type": "timestamp" - } -]''' -ori_fields = json.loads(fields_str) -if not filterjson: - fields = [ f['name'] for f in ori_fields ] - filterjson = default_filterjson(fields, ns) - -filterdic = ns.copy() -filterdic['filterstr'] = '' -filterdic['userorgid'] = '${userorgid}$' -filterdic['userid'] = '${userid}$' -if filterjson: - dbf = DBFilter(filterjson) - conds = dbf.gen(ns) - if conds: - ns.update(dbf.consts) - conds = f' and {conds}' - filterdic['filterstr'] = conds -ac = ArgsConvert('[[', ']]') -vars = ac.findAllVariables(sql) -NameSpace = {v:'${' + v + '}$' for v in vars if v != 'filterstr' } -filterdic.update(NameSpace) -sql = ac.convert(sql, filterdic) - -debug(f'{sql=}') -db = DBPools() -dbname = get_module_dbname('pipeline_core') -async with db.sqlorContext(dbname) as sor: - r = await sor.sqlPaging(sql, ns) - return r -return { - "total":0, - "rows":[] -} \ No newline at end of file diff --git a/pipeline_core/wwwroot/pipeline_versions/index.ui b/pipeline_core/wwwroot/pipeline_versions/index.ui deleted file mode 100644 index 79265b7..0000000 --- a/pipeline_core/wwwroot/pipeline_versions/index.ui +++ /dev/null @@ -1,210 +0,0 @@ - -{ - "widgettype":"VBox", - "options":{"cheight":40,"width":"100%"}, - "subwidgets":[{ - "id":"pipeline_versions_tbl", - "widgettype":"Tabular", - "options":{ - "width":"100%", - "height":"100%", - - - "title":"产线发布记录表", - - - - - "toolbar":{ - "tools": [ - { - "selected_row": true, - "name": "pipelines", - "icon": "{{entire_url('/imgs/pipelines.svg')}}", - "label": "所属产线" - } - ] -}, - - "css":"card", - - - "editable":{ - - "new_data_url":"{{entire_url('add_pipeline_versions.dspy')}}", - - - "delete_data_url":"{{entire_url('delete_pipeline_versions.dspy')}}", - - - "update_data_url":"{{entire_url('update_pipeline_versions.dspy')}}" - - }, - - - "data_url":"{{entire_url('./get_pipeline_versions.dspy')}}", - - "data_method":"GET", - "data_params":{{json.dumps(params_kw, indent=4, ensure_ascii=False)}}, - "row_options":{ - - - - "browserfields": { - "exclouded": [ - "id", - "config_snapshot" - ], - "cwidth": {} -}, - - - "editexclouded":[ - "id", - "created_at" -], - - "fields":[ - { - "name": "id", - "title": "id", - "type": "str", - "length": 32, - "nullable": "no", - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "id" - }, - { - "name": "pipeline_id", - "title": "产线ID", - "type": "str", - "length": 32, - "nullable": "no", - "label": "产线ID", - "uitype": "code", - "valueField": "pipeline_id", - "textField": "pipeline_id_text", - "params": { - "dbname": "{{'sage'}}", - "table": "pipelines", - "tblvalue": "id", - "tbltext": "name", - "valueField": "pipeline_id", - "textField": "pipeline_id_text" - }, - "dataurl": "{{entire_url('/appbase/get_code.dspy')}}" - }, - { - "name": "version", - "title": "版本号", - "type": "str", - "length": 20, - "nullable": "no", - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "版本号" - }, - { - "name": "publish_status", - "title": "发布状态", - "type": "str", - "length": 20, - "nullable": "no", - "default": "pending", - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "发布状态" - }, - { - "name": "published_by", - "title": "发布人", - "type": "str", - "length": 32, - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "发布人" - }, - { - "name": "published_at", - "title": "发布时间", - "type": "timestamp", - "length": 0, - "uitype": "str", - "datatype": "timestamp", - "label": "发布时间" - }, - { - "name": "changelog", - "title": "变更说明", - "type": "text", - "length": 0, - "uitype": "text", - "datatype": "text", - "label": "变更说明" - }, - { - "name": "config_snapshot", - "title": "配置快照JSON", - "type": "text", - "length": 0, - "uitype": "text", - "datatype": "text", - "label": "配置快照JSON" - }, - { - "name": "created_at", - "title": "创建时间", - "type": "timestamp", - "length": 0, - "uitype": "str", - "datatype": "timestamp", - "label": "创建时间" - } -] - }, - - - - - - - - "page_rows":160, - "cache_limit":5 - } - - ,"binds":[ - { - "wid": "self", - "event": "pipelines", - "actiontype": "urlwidget", - "target": "PopupWindow", - "popup_options": { - "title": "所属产线", - "icon": "{{entire_url('/appbase/get_icon.dspy')}}?id=pipelines", - "resizable": true, - "height": "70%", - "width": "70%" - }, - "params_mapping": { - "mapping": { - "id": "pipeline_id", - "referer_widget": "referer_widget" - }, - "need_other": false - }, - "options": { - "method": "POST", - "params": {}, - "url": "{{entire_url('../pipelines')}}" - } - } -] - -}] -} \ No newline at end of file diff --git a/pipeline_core/wwwroot/pipeline_versions/update_pipeline_versions.dspy b/pipeline_core/wwwroot/pipeline_versions/update_pipeline_versions.dspy deleted file mode 100644 index 74b8082..0000000 --- a/pipeline_core/wwwroot/pipeline_versions/update_pipeline_versions.dspy +++ /dev/null @@ -1,36 +0,0 @@ - -ns = params_kw.copy() -for k,v in ns.items(): - if v == 'NaN' or v == 'null': - ns[k] = None - - - - -db = DBPools() -dbname = get_module_dbname('pipeline_core') -async with db.sqlorContext(dbname) as sor: - - r = await sor.U('pipeline_versions', ns) - debug('update success'); - return { - "widgettype":"Message", - "options":{ - "title":"Update Success", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"ok" - } - } - -return { - "widgettype":"Error", - "options":{ - "title":"Update Error", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"failed" - } -} \ No newline at end of file diff --git a/pipeline_core/wwwroot/pipelines/add_pipelines.dspy b/pipeline_core/wwwroot/pipelines/add_pipelines.dspy deleted file mode 100644 index 9972d78..0000000 --- a/pipeline_core/wwwroot/pipelines/add_pipelines.dspy +++ /dev/null @@ -1,54 +0,0 @@ - -ns = params_kw.copy() -for k,v in ns.items(): - if v == 'NaN' or v == 'null': - ns[k] = None -id = params_kw.id -if not id or len(id) > 32: - id = uuid() -ns['id'] = id - -if params_kw.get('model_api_key'): - ns['model_api_key'] = password_encode(params_kw.get('model_api_key')) - - - -userorgid = await get_userorgid() -if not userorgid: - return { - "widgettype":"Error", - "options":{ - "title":"Authorization Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"Please login" - } - } -ns['org_id'] = userorgid - -db = DBPools() -dbname = get_module_dbname('pipeline_core') -async with db.sqlorContext(dbname) as sor: - r = await sor.C('pipelines', ns.copy()) - return { - "widgettype":"Message", - "options":{ - "cwidth":16, - "cheight":9, - "title":"Add Success", - "timeout":3, - "message":"ok" - } - } - -return { - "widgettype":"Error", - "options":{ - "title":"Add Error", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"failed" - } -} \ No newline at end of file diff --git a/pipeline_core/wwwroot/pipelines/delete_pipelines.dspy b/pipeline_core/wwwroot/pipelines/delete_pipelines.dspy deleted file mode 100644 index f2318f0..0000000 --- a/pipeline_core/wwwroot/pipelines/delete_pipelines.dspy +++ /dev/null @@ -1,47 +0,0 @@ - -ns = { - 'id':params_kw['id'], -} - - -userorgid = await get_userorgid() -if not userorgid: - return { - "widgettype":"Error", - "options":{ - "title":"Authorization Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"Please login" - } - } -ns['org_id'] = userorgid - -db = DBPools() -dbname = get_module_dbname('pipeline_core') -async with db.sqlorContext(dbname) as sor: - r = await sor.D('pipelines', ns) - debug('delete success'); - return { - "widgettype":"Message", - "options":{ - "title":"Delete Success", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"ok" - } - } - -debug('Delete failed'); -return { - "widgettype":"Error", - "options":{ - "title":"Delete Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"failed" - } -} \ No newline at end of file diff --git a/pipeline_core/wwwroot/pipelines/get_pipelines.dspy b/pipeline_core/wwwroot/pipelines/get_pipelines.dspy deleted file mode 100644 index 129b5d1..0000000 --- a/pipeline_core/wwwroot/pipelines/get_pipelines.dspy +++ /dev/null @@ -1,165 +0,0 @@ - -ns = params_kw.copy() - - -userorgid = await get_userorgid() -if not userorgid: - return { - "widgettype":"Error", - "options":{ - "title":"Authorization Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"Please login" - } - } -ns['org_id'] = userorgid -ns['userorgid'] = userorgid - -debug(f'get_pipelines.dspy:{ns=}') -if not ns.get('page'): - ns['page'] = 1 -if not ns.get('sort'): - - - ns['sort'] = 'created_at' - - - -sql = '''select a.*, b.pipeline_type_text, c.status_text -from (select * from pipelines where 1=1 [[filterstr]]) a left join (select k as pipeline_type, - v as pipeline_type_text from appcodes_kv where parentid='pipeline_type') b on a.pipeline_type = b.pipeline_type left join (select k as status, - v as status_text from appcodes_kv where parentid='pipeline_status') c on a.status = c.status''' - -filterjson = params_kw.get('data_filter') -if filterjson and isinstance(filterjson, str): - try: - filterjson = json.loads(filterjson) - except (json.JSONDecodeError, TypeError): - filterjson = None -fields_str=r'''[ - { - "name": "id", - "title": "id", - "type": "str", - "length": 32, - "nullable": "no" - }, - { - "name": "name", - "title": "产线名称", - "type": "str", - "length": 200, - "nullable": "no" - }, - { - "name": "description", - "title": "产线描述", - "type": "text" - }, - { - "name": "pipeline_type", - "title": "产线类型", - "type": "str", - "length": 50, - "nullable": "no" - }, - { - "name": "version", - "title": "当前版本", - "type": "str", - "length": 20, - "default": "1.0.0" - }, - { - "name": "status", - "title": "状态", - "type": "str", - "length": 20, - "nullable": "no", - "default": "draft" - }, - { - "name": "pipeline_config", - "title": "产线配置JSON", - "type": "text" - }, - { - "name": "model_api_url", - "title": "模型API地址", - "type": "str", - "length": 500 - }, - { - "name": "model_api_key", - "title": "模型API密钥", - "type": "str", - "length": 500 - }, - { - "name": "org_id", - "title": "所属机构ID", - "type": "str", - "length": 32, - "default": "0" - }, - { - "name": "created_by", - "title": "创建人", - "type": "str", - "length": 32 - }, - { - "name": "created_at", - "title": "创建时间", - "type": "timestamp" - }, - { - "name": "updated_at", - "title": "更新时间", - "type": "timestamp" - } -]''' -ori_fields = json.loads(fields_str) -if not filterjson: - fields = [ f['name'] for f in ori_fields ] - filterjson = default_filterjson(fields, ns) - -# 确保 logined 过滤条件始终生效 -if filterjson: - if not isinstance(filterjson, dict) or 'AND' not in filterjson: - filterjson = {'AND': [filterjson] if filterjson else []} - - filterjson['AND'].append({'field': 'org_id', 'op': '=', 'var': '__logined_orgid__'}) - ns['__logined_orgid__'] = userorgid - - - -filterdic = ns.copy() -filterdic['filterstr'] = '' -filterdic['userorgid'] = '${userorgid}$' -filterdic['userid'] = '${userid}$' -if filterjson: - dbf = DBFilter(filterjson) - conds = dbf.gen(ns) - if conds: - ns.update(dbf.consts) - conds = f' and {conds}' - filterdic['filterstr'] = conds -ac = ArgsConvert('[[', ']]') -vars = ac.findAllVariables(sql) -NameSpace = {v:'${' + v + '}$' for v in vars if v != 'filterstr' } -filterdic.update(NameSpace) -sql = ac.convert(sql, filterdic) - -debug(f'{sql=}') -db = DBPools() -dbname = get_module_dbname('pipeline_core') -async with db.sqlorContext(dbname) as sor: - r = await sor.sqlPaging(sql, ns) - return r -return { - "total":0, - "rows":[] -} \ No newline at end of file diff --git a/pipeline_core/wwwroot/pipelines/index.ui b/pipeline_core/wwwroot/pipelines/index.ui deleted file mode 100644 index 1f7e465..0000000 --- a/pipeline_core/wwwroot/pipelines/index.ui +++ /dev/null @@ -1,244 +0,0 @@ - -{ - "widgettype":"VBox", - "options":{"cheight":40,"width":"100%"}, - "subwidgets":[{ - "id":"pipelines_tbl", - "widgettype":"Tabular", - "options":{ - "width":"100%", - "height":"100%", - - - "title":"产线定义表", - - - - - "css":"card", - - - "toolbar":{ - "tools":[ - { - "name":"publish", - "label":"发布", - "selected_row":true - } - ] - }, - - "editable":{ - - "new_data_url":"{{entire_url('add_pipelines.dspy')}}", - - - "delete_data_url":"{{entire_url('delete_pipelines.dspy')}}", - - - "update_data_url":"{{entire_url('update_pipelines.dspy')}}" - - }, - - - "data_url":"{{entire_url('./get_pipelines.dspy')}}", - - "data_method":"GET", - "data_params":{{json.dumps(params_kw, indent=4, ensure_ascii=False)}}, - "row_options":{ - - - - "browserfields": { - "exclouded": [ - "id", - "model_api_key", - "pipeline_config" - ], - "cwidth": {} -}, - - - "editexclouded":[ - "id", - "created_at", - "updated_at" -], - - "fields":[ - { - "name": "id", - "title": "id", - "type": "str", - "length": 32, - "nullable": "no", - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "id" - }, - { - "name": "name", - "title": "产线名称", - "type": "str", - "length": 200, - "nullable": "no", - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "产线名称" - }, - { - "name": "description", - "title": "产线描述", - "type": "text", - "length": 0, - "uitype": "text", - "datatype": "text", - "label": "产线描述" - }, - { - "name": "pipeline_type", - "title": "产线类型", - "type": "str", - "length": 50, - "nullable": "no", - "label": "产线类型", - "uitype": "code", - "valueField": "pipeline_type", - "textField": "pipeline_type_text", - "params": { - "dbname": "{{{{get_module_dbname('pipeline_core')}}}}", - "table": "appcodes_kv", - "tblvalue": "k", - "tbltext": "v", - "valueField": "pipeline_type", - "textField": "pipeline_type_text", - "cond": "parentid='pipeline_type'" - }, - "dataurl": "{{entire_url('/appbase/get_code.dspy')}}" - }, - { - "name": "version", - "title": "当前版本", - "type": "str", - "length": 20, - "default": "1.0.0", - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "当前版本" - }, - { - "name": "status", - "title": "状态", - "type": "str", - "length": 20, - "nullable": "no", - "default": "draft", - "label": "状态", - "uitype": "code", - "valueField": "status", - "textField": "status_text", - "params": { - "dbname": "{{{{get_module_dbname('pipeline_core')}}}}", - "table": "appcodes_kv", - "tblvalue": "k", - "tbltext": "v", - "valueField": "status", - "textField": "status_text", - "cond": "parentid='pipeline_status'" - }, - "dataurl": "{{entire_url('/appbase/get_code.dspy')}}" - }, - { - "name": "pipeline_config", - "title": "产线配置JSON", - "type": "text", - "length": 0, - "uitype": "text", - "datatype": "text", - "label": "产线配置JSON" - }, - { - "name": "model_api_url", - "title": "模型API地址", - "type": "str", - "length": 500, - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "模型API地址" - }, - { - "name": "model_api_key", - "title": "模型API密钥", - "type": "str", - "length": 500, - "cwidth": 18, - "uitype": "password", - "datatype": "str", - "label": "模型API密钥" - }, - { - "name": "org_id", - "title": "所属机构ID", - "type": "str", - "length": 32, - "default": "0", - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "所属机构ID" - }, - { - "name": "created_by", - "title": "创建人", - "type": "str", - "length": 32, - "cwidth": 18, - "uitype": "str", - "datatype": "str", - "label": "创建人" - }, - { - "name": "created_at", - "title": "创建时间", - "type": "timestamp", - "length": 0, - "uitype": "str", - "datatype": "timestamp", - "label": "创建时间" - }, - { - "name": "updated_at", - "title": "更新时间", - "type": "timestamp", - "length": 0, - "uitype": "str", - "datatype": "timestamp", - "label": "更新时间" - } -] - }, - - - - - - - - "page_rows":160, - "cache_limit":5 - } - - ,"binds":[{ - "wid":"self", - "event":"publish", - "actiontype":"script", - "target":"self", - "script":"var d=this.select_row.user_data;fetch('{{entire_url('../api/pipeline_publish.dspy')}}',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:'pipeline_id='+encodeURIComponent(d.id)}).then(function(r){return r.json()}).then(function(r){if(r.success){this.render({})}else{bricks.show_error({title:'发布失败',message:r.message||'未知错误'})}}.bind(this))" - }] - -}] -} \ No newline at end of file diff --git a/pipeline_core/wwwroot/pipelines/update_pipelines.dspy b/pipeline_core/wwwroot/pipelines/update_pipelines.dspy deleted file mode 100644 index b777b85..0000000 --- a/pipeline_core/wwwroot/pipelines/update_pipelines.dspy +++ /dev/null @@ -1,73 +0,0 @@ - -ns = params_kw.copy() -for k,v in ns.items(): - if v == 'NaN' or v == 'null': - ns[k] = None - - -userorgid = await get_userorgid() -if not userorgid: - return { - "widgettype":"Error", - "options":{ - "title":"Authorization Error", - "timeout":3, - "cwidth":16, - "cheight":9, - "message":"Please login" - } - } -ns['org_id'] = userorgid - - -if params_kw.get('model_api_key'): - ns['model_api_key'] = password_encode(params_kw.get('model_api_key')) - - -db = DBPools() -dbname = get_module_dbname('pipeline_core') -async with db.sqlorContext(dbname) as sor: - - ns1 = { - - "org_id": userorgid, - - - "id": params_kw.id - } - recs = await sor.R('pipelines', ns1) - if len(recs) < 1: - return { - "widgettype":"Error", - "options":{ - "title":"Update Error", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"Record no exist or with wrong ownership" - } - } - - r = await sor.U('pipelines', ns) - debug('update success'); - return { - "widgettype":"Message", - "options":{ - "title":"Update Success", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"ok" - } - } - -return { - "widgettype":"Error", - "options":{ - "title":"Update Error", - "cwidth":16, - "cheight":9, - "timeout":3, - "message":"failed" - } -} \ No newline at end of file diff --git a/wwwroot/pipeline_core b/wwwroot/pipeline_core index 1dd2050..4c3ac3d 120000 --- a/wwwroot/pipeline_core +++ b/wwwroot/pipeline_core @@ -1 +1 @@ -/d/apitest/pipeline-app/pkgs/pipeline_core/wwwroot \ No newline at end of file +../pkgs/pipeline_core/wwwroot \ No newline at end of file diff --git a/wwwroot/pipeline_task b/wwwroot/pipeline_task index d49245e..2ba8517 120000 --- a/wwwroot/pipeline_task +++ b/wwwroot/pipeline_task @@ -1 +1 @@ -/d/apitest/pipeline-app/pkgs/pipeline-task/wwwroot \ No newline at end of file +../pkgs/pipeline-task/wwwroot \ No newline at end of file