@cloudbase/manager-node 5.2.0-beta.1 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,9 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(TCB_BASE_URL=https://tcb.pre.tencentcloudapi.woa.com npm test -- --testPathPattern=cloudApp 2>&1)",
5
+ "Bash(TCB_BASE_URL=https://tcb.pre.tencentcloudapi.woa.com npm test 2>&1)",
6
+ "Bash(TCB_BASE_URL=https://tcb.pre.tencentcloudapi.woa.com npm test -- --testPathPattern=cloudApp --testNamePattern=\"获取版本列表\")"
7
+ ]
8
+ }
9
+ }
@@ -0,0 +1,8 @@
1
+ root = true
2
+ [*]
3
+ indent_style = space
4
+ indent_size = 4
5
+ end_of_line = lf
6
+ charset = utf-8
7
+ trim_trailing_whitespace = true
8
+ insert_final_newline = true
@@ -0,0 +1,3 @@
1
+ lib/
2
+ types/
3
+ node_modules
@@ -0,0 +1,27 @@
1
+ module.exports = {
2
+ extends: ['alloy', 'alloy/typescript'],
3
+ rules: {
4
+ indent: ['error', 4],
5
+ semi: ['error', 'never'],
6
+ complexity: ['error', { max: 40 }],
7
+ 'no-useless-constructor': 'off',
8
+ '@typescript-eslint/explicit-member-accessibility': 'off',
9
+ '@typescript-eslint/explicit-function-return-type': 'off',
10
+ '@typescript-eslint/interface-name-prefix': 'off',
11
+ '@typescript-eslint/no-useless-constructor': 'off',
12
+ '@typescript-eslint/no-duplicate-imports': 'off'
13
+ },
14
+ env: {
15
+ es6: true,
16
+ node: true,
17
+ jest: true
18
+ },
19
+ overrides: [
20
+ {
21
+ files: ['*.js'],
22
+ rules: {
23
+ '@typescript-eslint/no-var-requires': 'off'
24
+ }
25
+ }
26
+ ]
27
+ }
@@ -0,0 +1,31 @@
1
+ module.exports = {
2
+ // 一行最多 100 字符
3
+ printWidth: 100,
4
+ // 使用 4 个空格缩进
5
+ tabWidth: 4,
6
+ // 不使用缩进符,而使用空格
7
+ useTabs: false,
8
+ // 行尾需要有分号
9
+ semi: false,
10
+ // 使用单引号
11
+ singleQuote: true,
12
+ // 对象的 key 仅在必要时用引号
13
+ quoteProps: 'as-needed',
14
+ // 末尾不需要逗号
15
+ trailingComma: 'none',
16
+ // 大括号内的首尾需要空格
17
+ bracketSpacing: true,
18
+ // 每个文件格式化的范围是文件的全部内容
19
+ rangeStart: 0,
20
+ rangeEnd: Infinity,
21
+ // 不需要写文件开头的 @prettier
22
+ requirePragma: false,
23
+ // 不需要自动在文件开头插入 @prettier
24
+ insertPragma: false,
25
+ // 使用默认的折行标准
26
+ proseWrap: 'preserve',
27
+ // 换行符使用 lf
28
+ endOfLine: 'lf',
29
+ // 箭头括号
30
+ arrowParens: 'avoid'
31
+ }
@@ -0,0 +1,109 @@
1
+ # 4.0.0
2
+ - 升级 https-proxy-agent 3->5 修复 https://github.com/TencentCloud/tencentcloud-sdk-nodejs/issues/47
3
+
4
+
5
+ # v3.9.2-beta
6
+ - 扩展禁用用户接口为变更用户状态接口
7
+ - 增加修改用户信息接口
8
+
9
+ # v3.5.0
10
+
11
+ - 新增获取云开发用户列表接口
12
+ - 新增停用云开发用户接口
13
+ - 新增批量删除云开发用户接口
14
+
15
+ # v3.4.0
16
+
17
+ - 增加云接入服务
18
+ - 创建函数支持同时创建云接入
19
+ - 优化请求错误栈
20
+
21
+ # v3.3.2
22
+
23
+ - 函数轮询状态时间修复 30s => 300s
24
+
25
+ # v3.3.0
26
+
27
+ - 静态托管支持配置重定向规则
28
+ - 新增删除静态托管自定义域名接口
29
+ - 新增获取静态网站配置接口
30
+ - 新增获取域名配置接口
31
+ - 新增域名配置接口
32
+
33
+ # v3.2.0
34
+
35
+ - 新增静态托管查询文件,配置文档,绑定自定义域名接口
36
+
37
+ # v3.1.1
38
+
39
+ - 优化文件夹删除接口
40
+ - 增加批量上传文件接口
41
+ - 修复静态网站上传单个文件没有回调的问题
42
+
43
+ # v3.0.0
44
+
45
+ - [fix] common 方法改造
46
+ - [add] 支持数据库 CRUD
47
+
48
+ # v2.4.1
49
+
50
+ - [fix] 修复并行调用 createFunction 接口报错的问题
51
+ - [add] 支持通过指定函数路径创建函数
52
+
53
+ # v2.4.0
54
+
55
+ - [add] 新增安全来源 API
56
+ - [fix] 修复云函数环境下取环境变量 bug (入口函数外部调用,未取到报错)
57
+
58
+ # v2.3.4
59
+
60
+ - [fix] 修复函数配置更新问题
61
+
62
+ # v2.3.2
63
+
64
+ - [fix] 修复更新函数 VPC 配置导致无法访问公网的问题
65
+
66
+ # v2.3.1
67
+
68
+ - [fix] 修复创建函数、更新函数代码,代码保护参数遗漏的问题
69
+
70
+ # v2.3.0
71
+
72
+ - [add] 支持文件层
73
+ - [add] 支持查询修改存储安全规则异步任务状态
74
+ - [fix] 文档订正
75
+
76
+ # v2.2.1
77
+
78
+ - [fix] 修复查询所有集合信息接口,集合为空时报错
79
+ - [fix] updateFunctionCode 支持自动安装依赖
80
+
81
+ # v2.2.0
82
+
83
+ - [fix] 修复上传文件夹等接口 `onFileFinish` 参数 TS 定义错误
84
+ - [add] 创建云函数返回 RequestId 响应值
85
+ - [add] 支持 L5 选项
86
+
87
+ # v2.1.0
88
+
89
+ - [add] 支持上传或更新函数时 等待依赖安装完成
90
+ - [add] 支持增量上传函数代码
91
+ - [add] 新增创建自定义登录私钥
92
+ - [add] 新增 HTTP Service API
93
+ - [add] 新增安全规则 API
94
+
95
+ # v2.0.0
96
+
97
+ - [refactor] 重构 storage , function 接口(breaking change)
98
+ - [add] 支持闭环完成环境创建
99
+ - [add] 支持函数操作代码保护
100
+ - [fix] 修复 windows 下上传文件路径 bug
101
+
102
+ # v1.3.0
103
+
104
+ - [add] 支持获取云函数代码下载链接
105
+
106
+ # v1.2.0
107
+
108
+ - [deprecated] env 创建环境功能暂时停用
109
+ - [add] 支持创建云函数自动安装依赖
@@ -0,0 +1,6 @@
1
+ ISC License (ISC)
2
+ Copyright <2019> <Tencent Cloud Base>
3
+
4
+ Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
5
+
6
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,46 @@
1
+ # cloudbase-manager-node
2
+
3
+ 云开发 manager-node 支持开发者通过接口形式对云开发提供的云函数、数据库、文件存储等资源进行创建、管理、配置等操作。更多源码内容请参见 [cloudbase-manager-node](https://github.com/TencentCloudBase/cloudbase-manager-node)。
4
+
5
+ ## 安装
6
+
7
+ npm
8
+
9
+ ```bash
10
+ npm install @cloudbase/manager-node
11
+ ```
12
+
13
+ yarn
14
+
15
+ ```bash
16
+ yarn add @cloudbase/manager-node
17
+ ```
18
+
19
+ ## 使用
20
+
21
+ 要在你的代码内使用该模块:
22
+
23
+ ```js
24
+ const CloudBase = require('@cloudbase/manager-node')
25
+ ```
26
+
27
+
28
+
29
+ ```js
30
+ import CloudBase from '@cloudbase/manager-node'
31
+ ```
32
+
33
+ 初始化
34
+
35
+ ```js
36
+ const app = CloudBase.init({
37
+ secretId: 'Your SecretId',
38
+ secretKey: 'Your SecretKey',
39
+ token: 'Your SecretToken', // 使用临时凭证需要此字段
40
+ envId: 'Your envId' // 云环境 ID,可在腾讯云-云开发控制台获取
41
+ })
42
+ ```
43
+
44
+ ## 文档
45
+
46
+ 请访问新的[文档站点](https://docs.cloudbase.net/api-reference/manager/node/introduction.html)查看详细的文档。
@@ -0,0 +1,18 @@
1
+ module.exports = {
2
+ roots: ['<rootDir>/test'],
3
+ globals: {
4
+ 'ts-jest': {
5
+ tsConfig: 'tsconfig.test.json'
6
+ }
7
+ },
8
+ transform: {
9
+ '^.+\\.ts?$': 'ts-jest'
10
+ },
11
+ transformIgnorePatterns: ['node_modules'],
12
+ testEnvironment: 'node',
13
+ forceExit: true,
14
+ // https://github.com/facebook/jest/issues/5164
15
+ globalSetup: './test/global-setup-hook.ts',
16
+ // globalTeardown: './test/global-teardown-hook.js',
17
+ coverageReporters: ['json', 'lcov', 'clover', 'text-summary']
18
+ }
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@cloudbase/manager-node",
3
+ "version": "5.3.0",
4
+ "description": "The node manage service api for cloudbase.",
5
+ "main": "lib/index.js",
6
+ "scripts": {
7
+ "build": "rimraf lib types && npx tsc",
8
+ "test:coverage": "jest --runInBand --detectOpenHandles --coverage --testTimeout=100000",
9
+ "test": "jest --runInBand --detectOpenHandles --testTimeout=100000",
10
+ "lint": "eslint \"./**/*.ts\"",
11
+ "lint:fix": "eslint --fix \"./**/*.ts\"",
12
+ "prepublishOnly": "npm run build",
13
+ "watch": "rimraf lib types && tsc -w",
14
+ "link": "node scripts/link.js",
15
+ "unlink": "node scripts/link.js -d"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://github.com/TencentCloudBase/cloudbase-manager-node.git"
20
+ },
21
+ "author": "Tencent CloudBase Team",
22
+ "license": "ISC",
23
+ "typings": "types/index.d.ts",
24
+ "devDependencies": {
25
+ "@lerna/create-symlink": "^6.4.1",
26
+ "@types/fs-extra": "^11.0.4",
27
+ "@types/jest": "^24.0.18",
28
+ "@types/node": "^12.7.4",
29
+ "@types/node-fetch": "^2.5.0",
30
+ "@types/unzipper": "^0.10.11",
31
+ "@typescript-eslint/eslint-plugin": "^3.7.1",
32
+ "@typescript-eslint/parser": "^3.7.1",
33
+ "eslint": "^7.6.0",
34
+ "eslint-config-alloy": "^3.7.4",
35
+ "husky": "^3.0.5",
36
+ "jest": "^24.9.0",
37
+ "lint-staged": "^9.2.5",
38
+ "rimraf": "^3.0.0",
39
+ "ts-jest": "^24.1.0",
40
+ "typescript": "^5.8.3"
41
+ },
42
+ "dependencies": {
43
+ "@cloudbase/database": "^0.6.2",
44
+ "archiver": "^3.1.1",
45
+ "cos-nodejs-sdk-v5": "^2.14.0",
46
+ "del": "^5.1.0",
47
+ "fs-extra": "^11.3.0",
48
+ "https-proxy-agent": "^5.0.1",
49
+ "lodash": "^4.17.21",
50
+ "make-dir": "^3.0.0",
51
+ "micromatch": "^4.0.2",
52
+ "node-fetch": "^2.6.0",
53
+ "query-string": "^6.8.3",
54
+ "unzipper": "^0.12.3",
55
+ "uuid": "^9.0.0",
56
+ "walkdir": "^0.4.1"
57
+ },
58
+ "husky": {
59
+ "hooks": {
60
+ "pre-commit": "npm run build && git add . && lint-staged"
61
+ }
62
+ },
63
+ "lint-staged": {
64
+ "*.ts": [
65
+ "eslint --fix",
66
+ "git add"
67
+ ]
68
+ },
69
+ "packageManager": "yarn@1.22.22"
70
+ }
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Tencent is pleased to support the open source community by making CloudBaseFramework - 云原生一体化部署工具 available.
3
+ *
4
+ * Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
5
+ *
6
+ * Please refer to license text included with this package for license details.
7
+ */
8
+
9
+ const os = require('os')
10
+ const fs = require('fs')
11
+ const fse = require('fs-extra')
12
+ const del = require('del')
13
+ const path = require('path')
14
+ const mkdirp = require('mkdirp')
15
+ const { execSync } = require('child_process')
16
+ const { createSymlink } = require('@lerna/create-symlink')
17
+
18
+ const globalNpmPath = execSync('npm root -g', {
19
+ encoding: 'utf-8'
20
+ }).trim()
21
+ // 如果不支持workspace 可以用下面写死
22
+ // const globalNpmPath = '/usr/local/lib/node_modules';
23
+
24
+ async function main() {
25
+ const unlink = process.argv?.[2] === '-d'
26
+ await linkCore(unlink)
27
+ }
28
+
29
+ async function linkCore(unlink = false) {
30
+ const jsonString = await fs.readFileSync(path.join(__dirname, '../package.json'))
31
+ const { name } = JSON.parse(jsonString)
32
+ await link(path.join(process.cwd()), path.join(globalNpmPath, '@cloudbase/cli'), name, unlink)
33
+ }
34
+
35
+ function isSymlink(path) {
36
+ const stats = fs.lstatSync(path)
37
+ return stats.isSymbolicLink()
38
+ }
39
+
40
+ // 将 global tcb cli 工具中的 framework-core link 到 packages/framework-core
41
+ async function link(src, dest, packageName, unlink = false) {
42
+ const prevCwd = process.cwd()
43
+ const destPlugin = path.join(dest, 'node_modules', '@cloudbase')
44
+ // 确保目录存在
45
+ mkdirp.sync(destPlugin)
46
+ // 切换 cwd
47
+ process.chdir(destPlugin)
48
+
49
+ const pathName = packageName.replace('@cloudbase/', '')
50
+ const backupPathName = `${pathName}_backup`
51
+
52
+ if (unlink) {
53
+ if (fs.existsSync(pathName) && !isSymlink(pathName)) {
54
+ console.log(`【失败】${pathName} 不是软链接`, process.cwd())
55
+ return
56
+ }
57
+
58
+ if (fs.existsSync(pathName) && fs.existsSync(backupPathName)) {
59
+ // 删除软链接
60
+ del.sync([pathName])
61
+
62
+ // 恢复备份
63
+ fse.moveSync(backupPathName, pathName)
64
+
65
+ // 删除软链接
66
+ console.log('【成功】删除软链接:', process.cwd())
67
+ } else {
68
+ console.info(
69
+ `不存在 ${pathName} 或 ${backupPathName},请重装安装 npm i @cloudbase/cli -g`,
70
+ process.cwd()
71
+ )
72
+ }
73
+ } else {
74
+ // 创建软链接
75
+
76
+ if (fs.existsSync(pathName)) {
77
+ if (!fs.existsSync(backupPathName)) {
78
+ // 不存在备份则进行备份
79
+
80
+ if (!isSymlink(pathName)) {
81
+ // 不是软链接才备份
82
+ fse.moveSync(pathName, backupPathName)
83
+ }
84
+ } else {
85
+ // 存在备份则直接删除
86
+ del.sync([pathName])
87
+ }
88
+ }
89
+
90
+ await createSymlink(src, pathName, 'junction')
91
+ console.log('【成功】创建软链接:', process.cwd())
92
+ }
93
+
94
+ // 切回源目录
95
+ process.chdir(prevCwd)
96
+ }
97
+
98
+ main()
@@ -0,0 +1,19 @@
1
+ {
2
+ "compileOnSave": true,
3
+ "compilerOptions": {
4
+ "module": "commonjs",
5
+ "target": "ES2017",
6
+ "moduleResolution": "node",
7
+ "outDir": "lib",
8
+ "removeComments": false,
9
+ "types": ["node"],
10
+ "esModuleInterop": true,
11
+ "declaration": true,
12
+ "declarationDir": "./types",
13
+ "experimentalDecorators": true,
14
+ "newLine": "LF",
15
+ "skipLibCheck": true
16
+ },
17
+ "include": ["src/**/*"],
18
+ "exclude": ["node_modules", "test"]
19
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "compileOnSave": true,
3
+ "compilerOptions": {
4
+ "experimentalDecorators": true,
5
+ "module": "commonjs",
6
+ "target": "ES2017",
7
+ "moduleResolution": "node",
8
+ "outDir": "lib",
9
+ "types": ["node", "jest"],
10
+ "esModuleInterop": true
11
+ },
12
+ "include": ["src/**/*", "test/**/*"],
13
+ "exclude": ["node_modules"]
14
+ }
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AiModelService = void 0;
10
+ const utils_1 = require("../utils");
11
+ class AiModelService {
12
+ constructor(environment) {
13
+ this.environment = environment;
14
+ this.tcbService = new utils_1.CloudService(environment.cloudBaseContext, 'tcb', '2018-06-08');
15
+ }
16
+ /**
17
+ * 创建 AI 模型配置分组
18
+ */
19
+ async createAIModel(options) {
20
+ const { EnvId } = this.environment.lazyEnvironmentConfig;
21
+ const { envId, groupName, baseUrl, models, remark, status, secret } = options;
22
+ if (!groupName || groupName.trim().length === 0) {
23
+ throw new Error('groupName is required');
24
+ }
25
+ if (groupName.toLowerCase().startsWith('cloudbase')) {
26
+ throw new Error('groupName cannot start with cloudbase');
27
+ }
28
+ if (status !== undefined && status !== 1 && status !== 2) {
29
+ throw new Error('status must be 1 or 2');
30
+ }
31
+ return this.tcbService.request('CreateAIModel', Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ EnvId: envId || EnvId, GroupName: groupName }, (baseUrl !== undefined ? { BaseUrl: baseUrl } : {})), (models !== undefined ? { Models: models } : {})), (remark !== undefined ? { Remark: remark } : {})), (status !== undefined ? { Status: status } : {})), (secret !== undefined ? { Secret: secret } : {})));
32
+ }
33
+ /**
34
+ * 更新 AI 模型配置分组
35
+ */
36
+ async updateAIModel(options) {
37
+ const { EnvId } = this.environment.lazyEnvironmentConfig;
38
+ const { envId, groupName, baseUrl, models, remark, status, secret } = options;
39
+ if (!groupName || groupName.trim().length === 0) {
40
+ throw new Error('groupName is required');
41
+ }
42
+ if (status !== undefined && status !== 1 && status !== 2) {
43
+ throw new Error('status must be 1 or 2');
44
+ }
45
+ return this.tcbService.request('UpdateAIModel', Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ EnvId: envId || EnvId, GroupName: groupName }, (baseUrl !== undefined ? { BaseUrl: baseUrl } : {})), (models !== undefined ? { Models: models } : {})), (remark !== undefined ? { Remark: remark } : {})), (status !== undefined ? { Status: status } : {})), (secret !== undefined ? { Secret: secret } : {})));
46
+ }
47
+ /**
48
+ * 删除 AI 模型配置分组,支持批量删除
49
+ */
50
+ async deleteAIModel(options) {
51
+ const { EnvId } = this.environment.lazyEnvironmentConfig;
52
+ const { envId, groupNames } = options;
53
+ if (!Array.isArray(groupNames) || groupNames.length === 0) {
54
+ throw new Error('groupNames is required');
55
+ }
56
+ const invalidGroupName = groupNames.find(item => typeof item !== 'string' || item.trim().length === 0);
57
+ if (invalidGroupName !== undefined) {
58
+ throw new Error('groupNames contains invalid item');
59
+ }
60
+ return this.tcbService.request('DeleteAIModel', {
61
+ EnvId: envId || EnvId,
62
+ GroupNames: groupNames
63
+ });
64
+ }
65
+ /**
66
+ * 查询指定云开发环境下已配置的 AI 模型分组列表
67
+ */
68
+ async describeAIModels(options = {}) {
69
+ const { EnvId } = this.environment.lazyEnvironmentConfig;
70
+ const { envId } = options;
71
+ return this.tcbService.request('DescribeAIModels', {
72
+ EnvId: envId || EnvId
73
+ });
74
+ }
75
+ /**
76
+ * 查询云开发平台支持的托管类型 AI 模型列表
77
+ */
78
+ async describeManagedAIModelList(options = {}) {
79
+ const { EnvId } = this.environment.lazyEnvironmentConfig;
80
+ const { envId } = options;
81
+ return this.tcbService.request('DescribeManagedAIModelList', {
82
+ EnvId: envId || EnvId
83
+ });
84
+ }
85
+ }
86
+ exports.AiModelService = AiModelService;
87
+ __decorate([
88
+ (0, utils_1.preLazy)()
89
+ ], AiModelService.prototype, "createAIModel", null);
90
+ __decorate([
91
+ (0, utils_1.preLazy)()
92
+ ], AiModelService.prototype, "updateAIModel", null);
93
+ __decorate([
94
+ (0, utils_1.preLazy)()
95
+ ], AiModelService.prototype, "deleteAIModel", null);
96
+ __decorate([
97
+ (0, utils_1.preLazy)()
98
+ ], AiModelService.prototype, "describeAIModels", null);
99
+ __decorate([
100
+ (0, utils_1.preLazy)()
101
+ ], AiModelService.prototype, "describeManagedAIModelList", null);
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -21,6 +21,7 @@ const mysql_1 = require("./mysql");
21
21
  const cloudApp_1 = require("./cloudApp");
22
22
  const permission_1 = require("./permission");
23
23
  const sandbox_1 = require("./sandbox");
24
+ const aiModel_1 = require("./aiModel");
24
25
  class Environment {
25
26
  constructor(context, envId) {
26
27
  this.inited = false;
@@ -45,6 +46,7 @@ class Environment {
45
46
  this.permissionService = new permission_1.PermissionService(this);
46
47
  this.cloudAppService = new cloudApp_1.CloudAppService(this);
47
48
  this.sandboxService = new sandbox_1.SandboxService(this);
49
+ this.aiModelService = new aiModel_1.AiModelService(this);
48
50
  }
49
51
  async lazyInit() {
50
52
  if (!this.inited) {
@@ -116,6 +118,9 @@ class Environment {
116
118
  getSandboxService() {
117
119
  return this.sandboxService;
118
120
  }
121
+ getAiModelService() {
122
+ return this.aiModelService;
123
+ }
119
124
  getCommonService(serviceType = 'tcb', serviceVersion) {
120
125
  return new common_1.CommonService(this, serviceType, serviceVersion);
121
126
  }
package/lib/index.js CHANGED
@@ -119,6 +119,9 @@ class CloudBase {
119
119
  get sandbox() {
120
120
  return this.currentEnvironment().getSandboxService();
121
121
  }
122
+ get aiModel() {
123
+ return this.currentEnvironment().getAiModelService();
124
+ }
122
125
  get docs() {
123
126
  if (!this.docsService) {
124
127
  this.docsService = new docs_1.DocsService();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudbase/manager-node",
3
- "version": "5.2.0-beta.1",
3
+ "version": "5.3.0",
4
4
  "description": "The node manage service api for cloudbase.",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -0,0 +1,27 @@
1
+ import { Environment } from '../environment';
2
+ import { CreateAIModelOptions, CreateAIModelResp, UpdateAIModelOptions, UpdateAIModelResp, DeleteAIModelOptions, DeleteAIModelResp, DescribeAIModelsOptions, DescribeAIModelsResp, DescribeManagedAIModelListOptions, DescribeManagedAIModelListResp } from './type';
3
+ export declare class AiModelService {
4
+ private environment;
5
+ private tcbService;
6
+ constructor(environment: Environment);
7
+ /**
8
+ * 创建 AI 模型配置分组
9
+ */
10
+ createAIModel(options: CreateAIModelOptions): Promise<CreateAIModelResp>;
11
+ /**
12
+ * 更新 AI 模型配置分组
13
+ */
14
+ updateAIModel(options: UpdateAIModelOptions): Promise<UpdateAIModelResp>;
15
+ /**
16
+ * 删除 AI 模型配置分组,支持批量删除
17
+ */
18
+ deleteAIModel(options: DeleteAIModelOptions): Promise<DeleteAIModelResp>;
19
+ /**
20
+ * 查询指定云开发环境下已配置的 AI 模型分组列表
21
+ */
22
+ describeAIModels(options?: DescribeAIModelsOptions): Promise<DescribeAIModelsResp>;
23
+ /**
24
+ * 查询云开发平台支持的托管类型 AI 模型列表
25
+ */
26
+ describeManagedAIModelList(options?: DescribeManagedAIModelListOptions): Promise<DescribeManagedAIModelListResp>;
27
+ }
@@ -0,0 +1,205 @@
1
+ import { IResponseInfo } from '../interfaces';
2
+ /** 模型状态,1:开启,2:关闭 */
3
+ export type AIModelStatus = 1 | 2;
4
+ /** AI 模型信息 */
5
+ export interface AIModel {
6
+ /** 模型名,示例值:huanyuan-v1 */
7
+ Model?: string;
8
+ /** 是否开启 MCP,示例值:false */
9
+ EnableMCP?: boolean;
10
+ /** 标签 */
11
+ Tags?: string[];
12
+ }
13
+ /** AI 模型密钥信息 */
14
+ export interface AIModelSecret {
15
+ /** 密钥来源,示例值:custom */
16
+ SecretSource?: string;
17
+ /** 密钥 ID,和 SecretKey 一一对应 */
18
+ SecretId?: string;
19
+ /** 密钥 Key,和 SecretId 一一对应 */
20
+ SecretKey?: string;
21
+ /** ApiKey,SecretKey 和 ApiKey 二选一 */
22
+ ApiKey?: string;
23
+ }
24
+ /** AI 模型分组类型 */
25
+ export type AIModelGroupType = 'builtin' | 'custom';
26
+ /** AI 模型分组信息 */
27
+ export interface AIModelGroup {
28
+ /**
29
+ * 模型分组
30
+ * 枚举值:
31
+ * - hunyuan-exp
32
+ * - hunyuan-image
33
+ * - deepseek
34
+ * - cloudbase
35
+ * - custom-xxxx
36
+ */
37
+ GroupName?: string;
38
+ /**
39
+ * 模型列表
40
+ * 注意:此字段可能返回 null,表示取不到有效值
41
+ */
42
+ Models?: AIModel[] | null;
43
+ /** 模型类型:builtin 内置模型分组类别,custom 用户自定义模型分组类别 */
44
+ Type?: AIModelGroupType;
45
+ /** 原始模型类型:builtin 内置模型类型,custom 用户自定义模型类型 */
46
+ OriginType?: AIModelGroupType;
47
+ /** 备注 */
48
+ Remark?: string;
49
+ /** 模型地址 */
50
+ BaseUrl?: string;
51
+ /** 模型状态,1:开启,2:关闭 */
52
+ Status?: AIModelStatus;
53
+ /**
54
+ * 模型密钥
55
+ * 注意:此字段可能返回 null,表示取不到有效值
56
+ */
57
+ Secret?: AIModelSecret | null;
58
+ /** 创建时间,ISO8601 格式 */
59
+ CreateTime?: string;
60
+ /** 更新时间,ISO8601 格式 */
61
+ UpdateTime?: string;
62
+ }
63
+ /** 托管 AI 模型计费类型 */
64
+ export type ManagedAIModelChargingType = 'Uniform' | 'Tiered';
65
+ /** 托管 AI 模型参数规格 */
66
+ export interface ManagedAIModelSpec {
67
+ /** 最大输入 Token,示例值:192k */
68
+ MaxInputToken?: string;
69
+ /** 最大输出 Token,示例值:32k */
70
+ MaxOutputToken?: string;
71
+ /** 上下文长度,示例值:128k */
72
+ ContextLength?: string;
73
+ }
74
+ /** 托管 AI 模型计费信息 */
75
+ export interface ManagedAIModelChargingInfo {
76
+ /** 计费类型:Uniform 固定计费,Tiered 分段计费 */
77
+ Type?: ManagedAIModelChargingType;
78
+ /** 分组名称,示例值:0-16k */
79
+ Name?: string;
80
+ /** 输入 Token 价格,示例值:1.2 */
81
+ InputPrice?: string;
82
+ /** 输出 Token 价格,示例值:4 */
83
+ OutputPrice?: string;
84
+ /** 命中缓存价格,示例值:0.4 */
85
+ CachePrice?: string;
86
+ /** 计费单位,示例值:千tokens */
87
+ InputOutputUnit?: string;
88
+ }
89
+ /** 托管型 AI 模型信息 */
90
+ export interface ManagedAIModel {
91
+ /** 模型名,示例值:hy3-preview */
92
+ Model?: string;
93
+ /** 是否开启 MCP,示例值:true */
94
+ EnableMCP?: boolean;
95
+ /** 模型规格 */
96
+ ModelSpec?: ManagedAIModelSpec;
97
+ /** 模型计费信息 */
98
+ ModelChargingInfo?: ManagedAIModelChargingInfo[];
99
+ }
100
+ /** 云开发内置 AI 模型分组信息 */
101
+ export interface ManagedAIModelGroup {
102
+ /** 模型分组,示例值:cloudbase */
103
+ GroupName?: string;
104
+ /**
105
+ * 模型列表
106
+ * 注意:此字段可能返回 null,表示取不到有效值
107
+ */
108
+ Models?: ManagedAIModel[] | null;
109
+ /** 备注,示例值:腾讯云开发 */
110
+ Remark?: string;
111
+ }
112
+ /**
113
+ * CreateAIModel 用户入参
114
+ */
115
+ export interface CreateAIModelOptions {
116
+ /** 环境 ID。不传则使用当前环境 ID */
117
+ envId?: string;
118
+ /**
119
+ * 分组名
120
+ * 入参限制:不允许以 cloudbase 为前缀
121
+ */
122
+ groupName: string;
123
+ /** 模型服务地址,示例值:http://xxx */
124
+ baseUrl?: string;
125
+ /** 模型名列表 */
126
+ models?: AIModel[];
127
+ /** 分组备注 */
128
+ remark?: string;
129
+ /** 模型状态,1:开启,2:关闭 */
130
+ status?: AIModelStatus;
131
+ /** 模型密钥 */
132
+ secret?: AIModelSecret;
133
+ }
134
+ /** CreateAIModel 返回结果 */
135
+ export interface CreateAIModelResp extends IResponseInfo {
136
+ /** 创建数量 */
137
+ Count: number;
138
+ }
139
+ /**
140
+ * UpdateAIModel 用户入参
141
+ */
142
+ export interface UpdateAIModelOptions {
143
+ /** 环境 ID。不传则使用当前环境 ID */
144
+ envId?: string;
145
+ /** 分组名 */
146
+ groupName: string;
147
+ /** 模型地址,示例值:http://xxx */
148
+ baseUrl?: string;
149
+ /**
150
+ * 模型名列表
151
+ * 注意:Models 列表更新采用全量替换
152
+ */
153
+ models?: AIModel[];
154
+ /** 备注 */
155
+ remark?: string;
156
+ /** 模型状态,1:开启,2:关闭 */
157
+ status?: AIModelStatus;
158
+ /** 模型密钥 */
159
+ secret?: AIModelSecret;
160
+ }
161
+ /** UpdateAIModel 返回结果 */
162
+ export interface UpdateAIModelResp extends IResponseInfo {
163
+ /** 更新数量 */
164
+ Count: number;
165
+ }
166
+ /**
167
+ * DeleteAIModel 用户入参
168
+ */
169
+ export interface DeleteAIModelOptions {
170
+ /** 环境 ID。不传则使用当前环境 ID */
171
+ envId?: string;
172
+ /** 分组名列表 */
173
+ groupNames: string[];
174
+ }
175
+ /** DeleteAIModel 返回结果 */
176
+ export interface DeleteAIModelResp extends IResponseInfo {
177
+ /** 成功删除数量 */
178
+ Count: number;
179
+ }
180
+ /** DescribeAIModels 用户入参 */
181
+ export interface DescribeAIModelsOptions {
182
+ /** 环境 ID。不传则使用当前环境 ID */
183
+ envId?: string;
184
+ }
185
+ /** DescribeAIModels 返回结果 */
186
+ export interface DescribeAIModelsResp extends IResponseInfo {
187
+ /**
188
+ * 模型列表
189
+ * 注意:此字段可能返回 null,表示取不到有效值
190
+ */
191
+ AIModels: AIModelGroup[] | null;
192
+ }
193
+ /** DescribeManagedAIModelList 用户入参 */
194
+ export interface DescribeManagedAIModelListOptions {
195
+ /** 环境 ID。不传则使用当前环境 ID */
196
+ envId?: string;
197
+ }
198
+ /** DescribeManagedAIModelList 返回结果 */
199
+ export interface DescribeManagedAIModelListResp extends IResponseInfo {
200
+ /**
201
+ * 托管模型列表
202
+ * 注意:此字段可能返回 null,表示取不到有效值
203
+ */
204
+ ManagedAIModelList: ManagedAIModelGroup[] | null;
205
+ }
@@ -17,6 +17,7 @@ import { CloudAppService } from './cloudApp';
17
17
  import { EnvInfo } from './interfaces';
18
18
  import { PermissionService } from './permission';
19
19
  import { SandboxService } from './sandbox';
20
+ import { AiModelService } from './aiModel';
20
21
  export declare class Environment {
21
22
  inited: boolean;
22
23
  cloudBaseContext: CloudBaseContext;
@@ -39,6 +40,7 @@ export declare class Environment {
39
40
  private permissionService;
40
41
  private cloudAppService;
41
42
  private sandboxService;
43
+ private aiModelService;
42
44
  constructor(context: CloudBaseContext, envId: string);
43
45
  lazyInit(): Promise<any>;
44
46
  getEnvId(): string;
@@ -59,6 +61,7 @@ export declare class Environment {
59
61
  getCloudAppService(): CloudAppService;
60
62
  getPermissionService(): PermissionService;
61
63
  getSandboxService(): SandboxService;
64
+ getAiModelService(): AiModelService;
62
65
  getCommonService(serviceType: string, serviceVersion: any): CommonService;
63
66
  getServicesEnvInfo(): Promise<any>;
64
67
  getAuthConfig(): {
package/types/index.d.ts CHANGED
@@ -18,6 +18,7 @@ import { DocsService } from './docs';
18
18
  import { PermissionService } from './permission';
19
19
  import { SandboxService } from './sandbox';
20
20
  import { CloudAppService } from './cloudApp';
21
+ import { AiModelService } from './aiModel';
21
22
  interface CloudBaseConfig {
22
23
  secretId?: string;
23
24
  secretKey?: string;
@@ -82,6 +83,7 @@ declare class CloudBase {
82
83
  get user(): UserService;
83
84
  get permission(): PermissionService;
84
85
  get sandbox(): SandboxService;
86
+ get aiModel(): AiModelService;
85
87
  get docs(): DocsService;
86
88
  getEnvironmentManager(): EnvironmentManager;
87
89
  getManagerConfig(): CloudBaseConfig;