+```
+
+### 表单样式文件
+
+* 可以在 `/src/styles` 目录下添加 `.scss` 样式文件
+
+### 调试表单
+
+```bash
+npm install
+npm start
+```
+
+* 模拟数据 `app.tsx`:
+
+```ts
+receiveData: {
+ data: { a: "你好", b: "Demo1" },
+ uniqueId: 10,
+ origin: "http://127.0.0.1:3350",
+ tenantId: "fh47kl"
+}
+```
+
+### 打包
+
+```bash
+npm run build
+```
+
+## 表单输入输出参 config.json
+
+### 基础规范
+
+* 格式需符合[json schema规范](https://json-schema.apifox.cn/)
+
+* 格式示例:
+
+```json
+{
+ "schema": {
+ "parameters": {
+ "type": "object",
+ "required": ["a", "b"],
+ "properties": {
+ "a": { "type": "string", "default": "haha" },
+ "b": { "type": "string", "default": "heihei" }
+ }
+ },
+ "return": {
+ "type": "object",
+ "properties": {
+ "a": { "type": "string" },
+ "b": { "type": "string" }
+ }
+ }
+ }
+}
+```
+
+* 最外层 `parameters` 字段是入参,入参第一层必须 `type` 为 `object`。
+
+* 必须包含 `name`,支持中文、英文、数字、空格、中划线、下划线组合。
+
+* 可以包含 `description`,对参数进行描述。
+
+* 必须包含 `parameters`。
+
+* 必须包含 `required`,内容不可以为 `properties` 下参数名之外的参数名。
+
+* 可以包含 `order`,若写必须为 `properties` 下所有参数名的列表;若不写,则默认按照 `properties` 下所有参数名的顺序。
+
+* 必须包含 `return`,`return` 字段是出参。
+
+## 表单预览图
+
+* 名称: form.jpg/png/jpeg
+
+* 大小: 不超过 1M
+
+## 打包规则
+
+* 包含 build/、config.json、form.png
+
+* 将build文件夹、config.json、form.png打成zip压缩包,压缩包名称支持大小写英文、中文和数字的字符串,可以包含中划线(-)和下划线(_),但不能以中划线(-)和下划线(_)开头或结尾。
diff --git a/app-builder/builtin/form/model-config-form/config.json b/app-builder/builtin/form/model-config-form/config.json
new file mode 100644
index 0000000000..70424e55b9
--- /dev/null
+++ b/app-builder/builtin/form/model-config-form/config.json
@@ -0,0 +1,48 @@
+{
+ "schema": {
+ "name": "模型管理表单",
+ "parameters": {
+ "type": "object",
+ "required": ["models"],
+ "properties": {
+ "models": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "createdAt": { "type": "string" },
+ "modelName": { "type": "string" },
+ "modelId": { "type": "string" },
+ "baseUrl": { "type": "string" },
+ "isDefault": { "type": "integer" },
+ "userId": { "type": "string" }
+ },
+ "required": ["modelId", "isDefault", "userId"]
+ }
+ }
+ }
+ },
+ "return": {
+ "type": "object",
+ "properties": {
+ "action": {
+ "type": "string",
+ "enum": ["add", "delete", "switch", "quit"]
+ },
+ "info": {
+ "type": "object",
+ "properties": {
+ "modelName": { "type": "string" },
+ "modelId": { "type": "string" },
+ "baseUrl": { "type": "string" },
+ "isDefault": { "type": "integer" },
+ "userId": { "type": "string" },
+ "apiKey": { "type": "string" }
+ },
+ "required": ["modelName", "modelId", "baseUrl", "isDefault", "userId", "apiKey"]
+ }
+ },
+ "required": ["action", "info"]
+ }
+ }
+}
diff --git a/app-builder/builtin/form/model-config-form/form.png b/app-builder/builtin/form/model-config-form/form.png
new file mode 100644
index 0000000000..b39ef9e073
Binary files /dev/null and b/app-builder/builtin/form/model-config-form/form.png differ
diff --git a/app-builder/builtin/form/model-config-form/package.json b/app-builder/builtin/form/model-config-form/package.json
new file mode 100644
index 0000000000..3965a296e9
--- /dev/null
+++ b/app-builder/builtin/form/model-config-form/package.json
@@ -0,0 +1,58 @@
+{
+ "name": "remote-component",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "start": "webpack serve --progress --profile --mode development --host 127.0.0.1 --port 3351 --config webpack.dev.js",
+ "build": "webpack --mode production --config webpack.prod.js"
+ },
+ "license": "ISC",
+ "devDependencies": {
+ "@ant-design/icons": "4.8.3",
+ "@babel/core": "^7.20.12",
+ "@babel/plugin-transform-runtime": "^7.12.17",
+ "@babel/preset-env": "^7.12.13",
+ "@babel/preset-react": "^7.12.13",
+ "@babel/preset-typescript": "^7.24.7",
+ "@types/node": "^20.12.12",
+ "@types/react": "^18.2.74",
+ "@types/react-dom": "^16.9.2",
+ "babel-loader": "^8.2.2",
+ "babel-plugin-dynamic-import-webpack": "^1.1.0",
+ "clean-webpack-plugin": "^3.0.0",
+ "copy-webpack-plugin": "^10.2.0",
+ "css-loader": "^6.8.1",
+ "cssnano": "^5.1.15",
+ "eslint": "^7.32.0",
+ "file-loader": "^6.2.0",
+ "happypack": "^5.0.1",
+ "html-webpack-plugin": "^5.5.0",
+ "less": "4.2.0",
+ "less-loader": "12.2.0",
+ "lodash": "4.17.21",
+ "mini-css-extract-plugin": "^1.6.2",
+ "postcss-import": "^14.0.0",
+ "postcss-loader": "^4.0.4",
+ "prettier": "3.2.5",
+ "sass": "^1.69.5",
+ "sass-loader": "^13.3.2",
+ "style-loader": "^2.0.0",
+ "typescript": "^5.4.5",
+ "uglifyjs-webpack-plugin": "^2.2.0",
+ "url-loader": "^4.1.1",
+ "webpack": "5.89.0",
+ "webpack-cli": "5.1.4",
+ "webpack-dev-server": "4.15.1",
+ "webpack-merge": "5.10.0",
+ "webpack-subresource-integrity": "5.1.0"
+ },
+ "dependencies": {
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "antd": "4.24.13",
+ "react": "^18.1.0",
+ "react-dom": "^18.1.0",
+ "react-i18next": "^11.8.13",
+ "uuid": "^11.1.0"
+ }
+}
diff --git a/app-builder/builtin/form/model-config-form/src/app.tsx b/app-builder/builtin/form/model-config-form/src/app.tsx
new file mode 100644
index 0000000000..60a8ee82e8
--- /dev/null
+++ b/app-builder/builtin/form/model-config-form/src/app.tsx
@@ -0,0 +1,71 @@
+/*************************************************请勿修改或删除该文件**************************************************/
+import React, { useState, useEffect, useRef } from 'react';
+import { inIframe, getQueryParams } from './utils/index';
+import { DataContext } from './context';
+import Form from './components/form';
+
+export default function App() {
+ const [receiveData, setReceiveData] = useState你确定要删除这个模型吗?
+模型名称:{record.modelName}
+ > + ), + okText: '确认删除', + cancelText: '取消', + okType: 'danger', + onOk: () => { + const payload = buildOutputInfo({ + ...record, + apiKey: '' + }); + resumingClick({ + params: { + action: 'delete', + info: payload + } + }); + }, + }); + }; + + const handleSwitchDefault = (record: any) => { + confirm({ + title: '切换默认模型', + icon: