diff --git a/packages/app/package.json b/packages/app/package.json
index 448eadc33..529e8ce4d 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -4,11 +4,10 @@
   "scripts": {
     "start": "concurrently \"cd ../../ && npm run start-server\" \"umi dev\"",
     "start-client": "umi dev",
-    "start-server": "nodemon",
+    "start-server": "ts-node-dev -r dotenv/config --project tsconfig.apis.json ./src/apis/index.ts",
     "build": "npm run build-server && npm run build-client",
     "build-client": "umi build",
-    "nocobase": "cross-env TS_NODE_PROJECT=\"tsconfig.api.json\" ts-node ./src/api/index.ts",
-    "build-server": "rimraf -rf lib && tsc --project tsconfig.api.json",
+    "build-server": "rimraf -rf lib && tsc --project tsconfig.apis.json",
     "postinstall": "umi generate tmp",
     "prettier": "prettier --write '**/*.{js,jsx,tsx,ts,less,md,json}'",
     "test": "umi-test",
@@ -27,10 +26,20 @@
   },
   "dependencies": {
     "@nocobase/client": "^0.4.0-alpha.7",
-    "@nocobase/preset-nocobase": "^0.4.0-alpha.7",
+    "@nocobase/plugin-action-logs": "^0.4.0-alpha.7",
+    "@nocobase/plugin-automations": "^0.4.0-alpha.7",
+    "@nocobase/plugin-china-region": "^0.4.0-alpha.7",
+    "@nocobase/plugin-collections": "^0.4.0-alpha.7",
+    "@nocobase/plugin-file-manager": "^0.4.0-alpha.7",
+    "@nocobase/plugin-pages": "^0.4.0-alpha.7",
+    "@nocobase/plugin-permissions": "^0.4.0-alpha.7",
+    "@nocobase/plugin-ui-router": "^0.4.0-alpha.7",
+    "@nocobase/plugin-ui-schema": "^0.4.0-alpha.7",
+    "@nocobase/plugin-users": "^0.4.0-alpha.7",
+    "@nocobase/plugin-saas": "^0.4.0-alpha.7",
+    "@nocobase/server": "^0.4.0-alpha.7",
     "@umijs/preset-react": "1.x",
     "koa-mount": "^4.0.0",
-    "ts-node-dev": "^1.1.8",
     "umi": "^3.0.0"
   },
   "devDependencies": {
@@ -40,11 +49,11 @@
     "concurrently": "^5.3.0",
     "cross-env": "^7.0.3",
     "mockjs": "^1.1.0",
-    "nodemon": "^2.0.12",
     "prettier": "^2.2.0",
     "react": "17.x",
     "react-dom": "17.x",
     "ts-node": "^10.2.1",
+    "ts-node-dev": "^1.1.8",
     "yorkie": "^2.0.0"
   }
 }
diff --git a/packages/app/src/api/index.ts b/packages/app/src/apis/index.ts
similarity index 90%
rename from packages/app/src/api/index.ts
rename to packages/app/src/apis/index.ts
index 58e06fe30..b9a25ae69 100644
--- a/packages/app/src/api/index.ts
+++ b/packages/app/src/apis/index.ts
@@ -1,4 +1,10 @@
 import Server from '@nocobase/server';
+import dotenv from 'dotenv';
+import path from 'path';
+
+dotenv.config({
+  path: path.resolve(__dirname, '../../../../.env'),
+});
 
 const start = Date.now();
 
@@ -35,6 +41,7 @@ const api = new Server({
 });
 
 const plugins = [
+  '@nocobase/plugin-saas',
   '@nocobase/plugin-collections',
   '@nocobase/plugin-ui-router',
   '@nocobase/plugin-ui-schema',
diff --git a/packages/app/tsconfig.api.json b/packages/app/tsconfig.apis.json
similarity index 66%
rename from packages/app/tsconfig.api.json
rename to packages/app/tsconfig.apis.json
index 4b14009ec..980bc92f5 100644
--- a/packages/app/tsconfig.api.json
+++ b/packages/app/tsconfig.apis.json
@@ -1,9 +1,9 @@
 {
   "extends": "../../tsconfig.json",
   "compilerOptions": {
-    "outDir": "./lib/api"
+    "outDir": "./lib/apis"
   },
   "include": [
-    "src/api",
+    "src/apis",
   ]
 }
\ No newline at end of file
diff --git a/packages/client/src/ClientSDK.ts b/packages/client/src/ClientSDK.ts
new file mode 100644
index 000000000..755d5d2bb
--- /dev/null
+++ b/packages/client/src/ClientSDK.ts
@@ -0,0 +1,19 @@
+import { RequestMethod, RequestOptionsInit } from 'umi-request';
+
+export class ClientSDK {
+  options: any;
+
+  constructor(options) {
+    this.options = options;
+  }
+
+  request(url: string, options?: RequestOptionsInit): RequestMethod {
+    return this.options.request(url, options);
+  }
+
+  resource(name) {
+
+  }
+}
+
+export default ClientSDK;
diff --git a/packages/client/src/components/admin-layout/Permissions/MenuPermissionTable.tsx b/packages/client/src/components/admin-layout/Permissions/MenuPermissionTable.tsx
index afd0d9d1e..9bf94a1e2 100644
--- a/packages/client/src/components/admin-layout/Permissions/MenuPermissionTable.tsx
+++ b/packages/client/src/components/admin-layout/Permissions/MenuPermissionTable.tsx
@@ -2,7 +2,6 @@ import React from 'react';
 import { observer } from '@formily/react';
 import { Table, Checkbox, Spin } from 'antd';
 import { useRequest } from 'ahooks';
-import { request } from '../../../schemas';
 import { Resource } from '../../../resource';
 import { useContext } from 'react';
 import { RoleContext } from '.';
@@ -23,7 +22,7 @@ export const MenuPermissionTable = observer((props) => {
   const [allUiSchemaKyes, setAllUiSchemaKyes] = useState([]);
   const [uiSchemaKyes, setUiSchemaKeys] = useState([]);
   const { data, loading } = useRequest(
-    () => request('ui_schemas:getMenuItems'),
+    'ui_schemas:getMenuItems',
     {
       formatResult: (data) => data?.data,
       onSuccess(data) {
diff --git a/packages/client/src/constate/Client.tsx b/packages/client/src/constate/Client.tsx
new file mode 100644
index 000000000..c1a6ec828
--- /dev/null
+++ b/packages/client/src/constate/Client.tsx
@@ -0,0 +1,25 @@
+import React, { createContext, useContext } from 'react';
+import { UseRequestProvider } from 'ahooks';
+
+const ClientContext = createContext({
+  client: null,
+});
+
+export function ClientProvider(props) {
+  const { client } = props;
+  return (
+    
+       client.request(service),
+        }}
+      >
+        {props.children}
+      
+    
+  );
+}
+
+export function useClient() {
+  return useContext(ClientContext);
+}
diff --git a/packages/client/src/constate/index.tsx b/packages/client/src/constate/index.tsx
index 8ab5bbd88..08bb03048 100644
--- a/packages/client/src/constate/index.tsx
+++ b/packages/client/src/constate/index.tsx
@@ -2,3 +2,4 @@ export * from './Collections';
 export * from './DesignableSwitch';
 export * from './DisplayedMap';
 export * from './PageTitle';
+export * from './Client';
diff --git a/packages/client/src/demos/RequestProvider.tsx b/packages/client/src/demos/RequestProvider.tsx
deleted file mode 100644
index 307fb08ee..000000000
--- a/packages/client/src/demos/RequestProvider.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { useRequest } from 'ahooks';
-import { Spin } from 'antd';
-import React, { useMemo } from 'react';
-import { MemoryRouter as Router } from 'react-router-dom';
-import {
-  createRouteSwitch,
-  RouteRedirectProps,
-  AdminLayout,
-  AuthLayout,
-  RouteSchemaRenderer,
-} from '../';
-import { UseRequestProvider } from 'ahooks';
-import { extend } from 'umi-request';
-
-const request = extend({
-  prefix: process.env.API_URL,
-  timeout: 30000,
-});
-
-request.use(async (ctx, next) => {
-  const { headers } = ctx.req.options as any;
-  const token = localStorage.getItem('NOCOBASE_TOKEN');
-  if (token) {
-    headers['Authorization'] = `Bearer ${token}`;
-  }
-  await next();
-});
-
-export const RequestProvider = (props) => {
-  return (
-     request(service),
-      }}
-    >
-      {props.children}
-    
-  );
-};
diff --git a/packages/client/src/demos/api/index.ts b/packages/client/src/demos/api/index.ts
deleted file mode 100644
index c73f53e15..000000000
--- a/packages/client/src/demos/api/index.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-const api = {
-  '/api/routes:getAccessible': require('./routes-getAccessible').default,
-  // '/api/blocks:getSchema/login': require('./blocks-getSchema/login').default,
-  // '/api/blocks:getSchema/register': require('./blocks-getSchema/register').default,
-  // '/api/blocks:getSchema/item1': require('./blocks-getSchema/item1').default,
-  // '/api/blocks:getSchema/item2': require('./blocks-getSchema/item2').default,
-  // '/api/blocks:getSchema/item22': require('./blocks-getSchema/item22').default,
-  // '/api/blocks:getSchema/item3': require('./blocks-getSchema/item3').default,
-  // '/api/blocks:getSchema/item4': require('./blocks-getSchema/item4').default,
-  // '/api/blocks:getSchema/item5': require('./blocks-getSchema/item5').default,
-  // '/api/blocks:getSchema/menu': require('./blocks-getSchema/menu').default,
-  '/api/ui-schemas:getTree/login': require('./ui-schemas-getTree/login').default,
-  '/api/ui-schemas:getTree/register': require('./ui-schemas-getTree/register').default,
-  '/api/ui-schemas:getTree/menu': require('./ui-schemas-getTree/menu').default,
-}
-
-export function request(service) {
-  let url = null;
-  if (typeof service === 'string') {
-    url = service;
-  } else if (typeof service === 'object' && service.url) {
-    url = service.url;
-  }
-
-  console.log('request.url', url)
-
-  return new Promise((resolve, reject) => {
-    setTimeout(() => {
-      if (api[url]) {
-        resolve({
-          data: api[url],
-        })
-      } else {
-        resolve({ data: {} });
-      }
-    }, 100)
-  })
-}
\ No newline at end of file
diff --git a/packages/client/src/demos/api/routes-getAccessible.ts b/packages/client/src/demos/api/routes-getAccessible.ts
deleted file mode 100644
index 9fd1bb7f7..000000000
--- a/packages/client/src/demos/api/routes-getAccessible.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-export default [
-  {
-    type: 'redirect',
-    from: '/',
-    to: '/admin',
-    exact: true,
-  },
-  {
-    type: 'route',
-    path: '/admin/:name(.+)?',
-    component: 'AdminLayout',
-    title: `后台`,
-    uiSchemaKey: 'qqzzjakwkwl',
-  },
-  {
-    type: 'route',
-    component: 'AuthLayout',
-    children: [
-      {
-        type: 'route',
-        path: '/login',
-        component: 'RouteSchemaRenderer',
-        title: `登录`,
-        uiSchemaKey: 'dtf9j0b8p9u',
-      },
-      {
-        type: 'route',
-        path: '/register',
-        component: 'RouteSchemaRenderer',
-        title: `注册`,
-        uiSchemaKey: '46qlxqam3xk',
-      },
-    ],
-  },
-];
diff --git a/packages/client/src/demos/api/ui-schemas-getTree/item1.ts b/packages/client/src/demos/api/ui-schemas-getTree/item1.ts
deleted file mode 100644
index cfb8d780d..000000000
--- a/packages/client/src/demos/api/ui-schemas-getTree/item1.ts
+++ /dev/null
@@ -1,157 +0,0 @@
-import { ISchema } from '@formily/json-schema';
-import { uid } from '@formily/shared';
-
-export default {
-  type: 'object',
-  properties: {
-    [uid()]: {
-      type: 'void',
-      'x-component': 'Grid',
-      properties: {
-        [uid()]: {
-          type: 'void',
-          'x-component': 'Grid.Row',
-          properties: {
-            [uid()]: {
-              type: 'void',
-              'x-component': 'Grid.Col',
-              properties: {
-                [uid()]: {
-                  type: 'void',
-                  'x-decorator': 'BlockItem',
-                  'x-component': 'Form',
-                  properties: {
-                    [uid()]: {
-                      type: 'void',
-                      'x-decorator': 'Card',
-                      'x-component': 'Grid',
-                      properties: {
-                        [uid()]: {
-                          type: 'void',
-                          'x-component': 'Grid.Row',
-                          properties: {
-                            [uid()]: {
-                              type: 'void',
-                              'x-component': 'Grid.Col',
-
-                              properties: {
-                                [uid()]: {
-                                  type: 'string',
-                                  required: true,
-                                  title: '字段1',
-                                  'x-decorator': 'FormItem',
-                                  'x-component': 'Input',
-                                },
-                              },
-                            },
-                            [uid()]: {
-                              type: 'void',
-                              'x-component': 'Grid.Col',
-                              properties: {
-                                [uid()]: {
-                                  type: 'string',
-                                  required: true,
-                                  title: '字段2',
-                                  'x-decorator': 'FormItem',
-                                  'x-component': 'Input',
-                                },
-                              },
-                            },
-                          },
-                        },
-                        [uid()]: {
-                          type: 'void',
-                          'x-component': 'Grid.Row',
-                          properties: {
-                            [uid()]: {
-                              type: 'void',
-                              'x-component': 'Grid.Col',
-                              properties: {
-
-                                [uid()]: {
-                                  type: 'string',
-                                  required: true,
-                                  title: '字段3',
-                                  'x-decorator': 'FormItem',
-                                  'x-component': 'Input',
-                                },
-                              },
-                            },
-                            [uid()]: {
-                              type: 'void',
-                              'x-component': 'Grid.Col',
-                              properties: {
-                                [uid()]: {
-                                  type: 'string',
-                                  required: true,
-                                  title: '字段4',
-                                  'x-decorator': 'FormItem',
-                                  'x-component': 'Input',
-                                },
-                              },
-                            },
-                          },
-                        },
-                        [uid()]: {
-                          type: 'void',
-                          'x-component': 'Grid.Row',
-                          properties: {
-                            [uid()]: {
-                              type: 'void',
-                              'x-component': 'Grid.Col',
-                              properties: {
-                                [uid()]: {
-                                  type: 'string',
-                                  required: true,
-                                  title: '字段5',
-                                  'x-decorator': 'FormItem',
-                                  'x-component': 'Input',
-                                },
-                              },
-                            },
-                          },
-                        },
-                      },
-                    },
-                    actions: {
-                      type: 'void',
-                      // 'x-decorator': 'Div',
-                      'x-component': 'Space',
-                      properties: {
-                        submit: {
-                          type: 'void',
-                          'x-component': 'Action',
-                          'x-component-props': {
-                            // block: true,
-                            type: 'primary',
-                            useAction: '{{ useLogin }}',
-                            style: {
-                              // width: '100%',
-                            },
-                          },
-                          title: '提交',
-                        },
-                        reset: {
-                          type: 'void',
-                          'x-component': 'Action',
-                          'x-component-props': {
-                            // block: true,
-                            useAction: '{{ useLogin }}',
-                            style: {
-                              // width: '100%',
-                            },
-                          },
-                          title: '重置',
-                        },
-                      },
-                    },
-                  },
-                },
-              },
-            },
-          },
-        },
-      },
-    },
-  },
-} as ISchema;
diff --git a/packages/client/src/demos/api/ui-schemas-getTree/item2.ts b/packages/client/src/demos/api/ui-schemas-getTree/item2.ts
deleted file mode 100644
index 84218c353..000000000
--- a/packages/client/src/demos/api/ui-schemas-getTree/item2.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { ISchema } from '@formily/json-schema';
-import { uid } from '@formily/shared';
-
-export default {
-  type: 'object',
-  properties: {
-    [uid()]: {
-      type: 'void',
-      'x-decorator': 'Card',
-      'x-component': 'Grid',
-      properties: {
-        [uid()]: {
-          type: 'void',
-          'x-component': 'Grid.Row',
-          properties: {
-            [uid()]: {
-              type: 'void',
-              'x-component': 'Grid.Col',
-              properties: {
-                [uid()]: {
-                  type: 'void',
-                  'x-component': 'AddNew.BlockItem',
-                },
-              },
-            },
-          },
-        },
-      },
-    },
-  },
-} as ISchema;
diff --git a/packages/client/src/demos/api/ui-schemas-getTree/item22.ts b/packages/client/src/demos/api/ui-schemas-getTree/item22.ts
deleted file mode 100644
index 088287438..000000000
--- a/packages/client/src/demos/api/ui-schemas-getTree/item22.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-export default {
-  type: 'object',
-  properties: {
-    input: {
-      type: 'string',
-      required: true,
-      'x-decorator': 'FormItem',
-      'x-component': 'Input',
-      'x-component-props': {
-        placeholder: '邮箱或用户名',
-        style: {
-          // width: 240,
-        },
-      },
-    },
-    textarea: {
-      type: 'string',
-      required: true,
-      'x-decorator': 'FormItem',
-      'x-component': 'Password',
-      'x-component-props': {
-        placeholder: '密码',
-        style: {
-          // width: 240,
-        },
-      },
-    },
-    actions: {
-      type: 'void',
-      // 'x-decorator': 'Div',
-      'x-component': 'Div',
-      properties: {
-        submit: {
-          type: 'void',
-          'x-component': 'Action',
-          'x-component-props': {
-            block: true,
-            type: 'primary',
-            useAction: '{{ useLogin }}',
-            style: {
-              width: '100%',
-            },
-          },
-          title: '登录',
-        },
-      },
-    },
-    registerlink: {
-      type: 'void',
-      'x-component': 'Div',
-      properties: {
-        link: {
-          type: 'void',
-          'x-component': 'Action.Link',
-          'x-component-props': {
-            to: '/register',
-          },
-          title: '注册账号',
-        },
-      },
-    },
-  },
-}
\ No newline at end of file
diff --git a/packages/client/src/demos/api/ui-schemas-getTree/item3.ts b/packages/client/src/demos/api/ui-schemas-getTree/item3.ts
deleted file mode 100644
index dd2ca5683..000000000
--- a/packages/client/src/demos/api/ui-schemas-getTree/item3.ts
+++ /dev/null
@@ -1,139 +0,0 @@
-import { uid } from '@formily/shared';
-
-const schema = {
-  type: 'object',
-  properties: {
-    [uid()]: {
-      type: 'void',
-      'x-component': 'Form',
-      properties: {
-        [uid()]: {
-          type: 'void',
-          'x-decorator': 'Card',
-          'x-component': 'Grid',
-          properties: {
-            [uid()]: {
-              type: 'void',
-              'x-component': 'Grid.Row',
-              properties: {
-                [uid()]: {
-                  type: 'void',
-                  'x-component': 'Grid.Col',
-
-                  properties: {
-                    [uid()]: {
-                      type: 'string',
-                      required: true,
-                      title: '字段1',
-                      'x-decorator': 'FormItem',
-                      'x-component': 'Input',
-                    },
-                  },
-                },
-                [uid()]: {
-                  type: 'void',
-                  'x-component': 'Grid.Col',
-                  properties: {
-                    [uid()]: {
-                      type: 'string',
-                      required: true,
-                      title: '字段2',
-                      'x-decorator': 'FormItem',
-                      'x-component': 'Input',
-                    },
-                  },
-                },
-              },
-            },
-            [uid()]: {
-              type: 'void',
-              'x-component': 'Grid.Row',
-              properties: {
-                [uid()]: {
-                  type: 'void',
-                  'x-component': 'Grid.Col',
-                  properties: {
-
-                    [uid()]: {
-                      type: 'string',
-                      required: true,
-                      title: '字段3',
-                      'x-decorator': 'FormItem',
-                      'x-component': 'Input',
-                    },
-                  },
-                },
-                [uid()]: {
-                  type: 'void',
-                  'x-component': 'Grid.Col',
-                  properties: {
-                    [uid()]: {
-                      type: 'string',
-                      required: true,
-                      title: '字段4',
-                      'x-decorator': 'FormItem',
-                      'x-component': 'Input',
-                    },
-                  },
-                },
-              },
-            },
-            [uid()]: {
-              type: 'void',
-              'x-component': 'Grid.Row',
-              properties: {
-                [uid()]: {
-                  type: 'void',
-                  'x-component': 'Grid.Col',
-                  properties: {
-                    [uid()]: {
-                      type: 'string',
-                      required: true,
-                      title: '字段5',
-                      'x-decorator': 'FormItem',
-                      'x-component': 'Input',
-                    },
-                  },
-                },
-              },
-            },
-          },
-        },
-        actions: {
-          type: 'void',
-          // 'x-decorator': 'Div',
-          'x-component': 'Space',
-          properties: {
-            submit: {
-              type: 'void',
-              'x-component': 'Action',
-              'x-component-props': {
-                // block: true,
-                type: 'primary',
-                useAction: '{{ useLogin }}',
-                style: {
-                  // width: '100%',
-                },
-              },
-              title: '提交',
-            },
-            reset: {
-              type: 'void',
-              'x-component': 'Action',
-              'x-component-props': {
-                // block: true,
-                useAction: '{{ useLogin }}',
-                style: {
-                  // width: '100%',
-                },
-              },
-              title: '重置',
-            },
-          },
-        },
-      },
-    },
-  },
-};
-
-export default schema;
diff --git a/packages/client/src/demos/api/ui-schemas-getTree/item4.ts b/packages/client/src/demos/api/ui-schemas-getTree/item4.ts
deleted file mode 100644
index 0ef8bb70e..000000000
--- a/packages/client/src/demos/api/ui-schemas-getTree/item4.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-export default {
-  type: 'object',
-  properties: {
-    input: {
-      type: 'string',
-      required: true,
-      'x-decorator': 'FormItem',
-      'x-component': 'Input',
-      'x-component-props': {
-        placeholder: '邮箱或用户名',
-        style: {
-          // width: 240,
-        },
-      },
-    },
-  },
-}
\ No newline at end of file
diff --git a/packages/client/src/demos/api/ui-schemas-getTree/item5.ts b/packages/client/src/demos/api/ui-schemas-getTree/item5.ts
deleted file mode 100644
index de67b77d5..000000000
--- a/packages/client/src/demos/api/ui-schemas-getTree/item5.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-export default {
-  name: 'arr',
-  type: 'array',
-  'x-component': 'Table',
-  default: [{ field1: 'a', field2: 'b' }, { field1: 'a', field2: 'b' }],
-  'x-component-props': {},
-  properties: {
-    actionBar1: {
-      type: 'void',
-      'x-component': 'Table.ActionBar',
-      properties: {
-        action1: {
-          type: 'object',
-          title: '按钮1',
-          'x-component': 'Table.Action.Popover',
-          'x-component-props': {
-          },
-          properties: {
-
-          },
-        },
-        action2: {
-          type: 'void',
-          title: '按钮2',
-          'x-component': 'Table.Action.Button',
-          'x-component-props': {
-            label: '按钮2',
-          },
-        },
-      },
-    },
-    actionBar2: {
-      type: 'void',
-      'x-component': 'Table.ActionBar',
-      'x-component-props': {
-        align: 'bottom',
-      },
-      properties: {
-        pagination: {
-          type: 'void',
-          'x-component': 'Table.Pagination',
-          'x-component-props': {
-            defaultCurrent: 1,
-            total: 50,
-          },
-        },
-      },
-    },
-    details: {
-      type: 'void',
-      'x-component': 'Table.Details',
-      properties: {},
-    },
-    col1: {
-      type: 'void',
-      title: '字段1',
-      'x-component': 'Table.Column',
-      'x-component-props': {
-        title: 'z1',
-        width: 100,
-      },
-      properties: {
-        field1: {
-          type: 'string',
-          required: true,
-          'x-decorator-props': {
-            feedbackLayout: 'popover',
-          },
-          'x-decorator': 'FormItem',
-          'x-component': 'Input',
-        },
-      },
-    },
-    col2: {
-      type: 'void',
-      title: '字段2',
-      'x-component': 'Table.Column',
-      properties: {
-        field2: {
-          type: 'string',
-          title: '字段2',
-          required: true,
-          'x-decorator-props': {
-            feedbackLayout: 'popover',
-          },
-          'x-decorator': 'FormItem',
-          'x-component': 'Input',
-        },
-      },
-    },
-  },
-}
\ No newline at end of file
diff --git a/packages/client/src/demos/api/ui-schemas-getTree/login.ts b/packages/client/src/demos/api/ui-schemas-getTree/login.ts
deleted file mode 100644
index b427552b5..000000000
--- a/packages/client/src/demos/api/ui-schemas-getTree/login.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-export default {
-  type: 'object',
-  properties: {
-    email: {
-      type: 'string',
-      required: true,
-      'x-decorator': 'FormItem',
-      'x-component': 'Input',
-      'x-component-props': {
-        placeholder: '邮箱或用户名',
-        style: {
-          // width: 240,
-        },
-      },
-    },
-    password: {
-      type: 'string',
-      required: true,
-      'x-decorator': 'FormItem',
-      'x-component': 'Password',
-      'x-component-props': {
-        placeholder: '密码',
-        style: {
-          // width: 240,
-        },
-      },
-    },
-    actions: {
-      type: 'void',
-      'x-component': 'Div',
-      properties: {
-        submit: {
-          type: 'void',
-          'x-component': 'Action',
-          'x-component-props': {
-            block: true,
-            type: 'primary',
-            useAction: '{{ useLogin }}',
-            style: {
-              width: '100%',
-            },
-          },
-          title: '登录',
-        },
-      },
-    },
-    registerlink: {
-      type: 'void',
-      'x-component': 'Div',
-      properties: {
-        link: {
-          type: 'void',
-          'x-component': 'Action.Link',
-          'x-component-props': {
-            to: '/register',
-          },
-          title: '注册账号',
-        },
-      },
-    },
-  },
-};
diff --git a/packages/client/src/demos/api/ui-schemas-getTree/menu.ts b/packages/client/src/demos/api/ui-schemas-getTree/menu.ts
deleted file mode 100644
index 068759f8b..000000000
--- a/packages/client/src/demos/api/ui-schemas-getTree/menu.ts
+++ /dev/null
@@ -1,107 +0,0 @@
-import { uid } from '@formily/shared';
-
-export default {
-  type: 'void',
-  name: `menu_${uid()}`,
-  'x-component': 'Menu',
-  'x-designable-bar': 'Menu.DesignableBar',
-  'x-component-props': {
-    mode: 'mix',
-    theme: 'dark',
-    defaultSelectedKeys: '{{ selectedKeys }}',
-    sideMenuRef: '{{ sideMenuRef }}',
-    onSelect: '{{ onSelect }}',
-  },
-  properties: {
-    [uid()]: {
-      type: 'void',
-      title: `菜单2`,
-      'x-component': 'Menu.Link',
-      'x-component-props': {
-        icon: 'MailOutlined',
-      },
-    },
-    [uid()]: {
-      type: 'void',
-      title: `菜单22`,
-      'x-component': 'Menu.Link',
-      'x-component-props': {
-        icon: 'AppstoreOutlined',
-        // url: 'https://www.google.com',
-      },
-    },
-    [uid()]: {
-      type: 'void',
-      title: '菜单组1',
-      'x-component': 'Menu.SubMenu',
-      'x-component-props': {
-        icon: 'SettingOutlined',
-      },
-    },
-    [uid()]: {
-      type: 'void',
-      title: '菜单组2',
-      'x-component': 'Menu.SubMenu',
-      'x-component-props': {
-        icon: 'SettingOutlined',
-      },
-      properties: {
-        [uid()]: {
-          type: 'void',
-          title: '菜单6',
-          'x-component': 'Menu.SubMenu',
-          'x-component-props': {
-            icon: 'AppstoreOutlined',
-          },
-          properties: {
-            [uid()]: {
-              type: 'void',
-              title: '菜单9',
-              'x-component': 'Menu.SubMenu',
-              properties: {
-                [uid()]: {
-                  type: 'void',
-                  title: `子菜单10`,
-                  'x-component': 'Menu.Link',
-                },
-                [uid()]: {
-                  type: 'void',
-                  title: `子菜单11`,
-                  'x-component': 'Menu.Link',
-                },
-              }
-            },
-            [uid()]: {
-              type: 'void',
-              title: `子菜单7`,
-              'x-component': 'Menu.Link',
-            },
-            [uid()]: {
-              type: 'void',
-              title: `子菜单8`,
-              'x-component': 'Menu.Link',
-            },
-          }
-        },
-        [uid()]: {
-          type: 'void',
-          title: `子菜单1`,
-          'x-component': 'Menu.Link',
-        },
-        [uid()]: {
-          type: 'void',
-          title: `子菜单2`,
-          'x-component': 'Menu.Link',
-        },
-      }
-    },
-    [uid()]: {
-      type: 'void',
-      title: `菜单1`,
-      'x-component': 'Menu.Link',
-      'x-component-props': {
-        icon: 'SettingOutlined',
-      },
-    },
-  },
-}
\ No newline at end of file
diff --git a/packages/client/src/demos/api/ui-schemas-getTree/register.ts b/packages/client/src/demos/api/ui-schemas-getTree/register.ts
deleted file mode 100644
index f7b427dd9..000000000
--- a/packages/client/src/demos/api/ui-schemas-getTree/register.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-export default {
-  type: 'object',
-  properties: {
-    username: {
-      type: 'string',
-      required: true,
-      'x-decorator': 'FormItem',
-      'x-component': 'Input',
-      'x-component-props': {
-        placeholder: '用户名',
-        style: {
-          // width: 240,
-        },
-      },
-    },
-    pwd1: {
-      type: 'string',
-      required: true,
-      'x-decorator': 'FormItem',
-      'x-component': 'Password',
-      'x-component-props': {
-        placeholder: '密码',
-        checkStrength: true,
-        style: {
-          // width: 240,
-        },
-      },
-    },
-    pwd2: {
-      type: 'string',
-      required: true,
-      'x-decorator': 'FormItem',
-      'x-component': 'Password',
-      'x-component-props': {
-        placeholder: '密码',
-        checkStrength: true,
-        style: {
-          // width: 240,
-        },
-      },
-    },
-    actions: {
-      type: 'void',
-      'x-component': 'Div',
-      properties: {
-        submit: {
-          type: 'void',
-          title: '注册',
-          'x-component': 'Action',
-          'x-component-props': {
-            block: true,
-            type: 'primary',
-            useAction: '{{ useRegister }}',
-            style: {
-              width: '100%',
-            },
-          },
-        },
-      },
-    },
-    registerlink: {
-      type: 'void',
-      'x-component': 'Div',
-      properties: {
-        link: {
-          type: 'void',
-          'x-component': 'Action.Link',
-          'x-component-props': {
-            to: '/login',
-          },
-          title: '使用已有账号登录',
-        },
-      },
-    },
-  },
-}
diff --git a/packages/client/src/demos/demo1.tsx b/packages/client/src/demos/demo1.tsx
index 2ff13d323..d9145e709 100644
--- a/packages/client/src/demos/demo1.tsx
+++ b/packages/client/src/demos/demo1.tsx
@@ -10,6 +10,8 @@ import {
   AdminLayout,
   AuthLayout,
   RouteSchemaRenderer,
+  ClientProvider,
+  ClientSDK
 } from '../';
 import { UseRequestProvider } from 'ahooks';
 import { extend } from 'umi-request';
@@ -28,6 +30,10 @@ request.use(async (ctx, next) => {
   await next();
 });
 
+const client = new ClientSDK({
+  request,
+});
+
 console.log('process.env.API_URL', process.env.API_URL);
 
 // console.log = () => {}
@@ -60,12 +66,8 @@ const App = () => {
 
 export default () => {
   return (
-     request(service),
-      }}
-    >
+    
       
-    
+    
   );
 }
diff --git a/packages/client/src/index.tsx b/packages/client/src/index.tsx
index e183ef860..abfca1cd8 100644
--- a/packages/client/src/index.tsx
+++ b/packages/client/src/index.tsx
@@ -3,3 +3,5 @@ export * from './components/admin-layout';
 export * from './components/auth-layout';
 export * from './components/route-schema-renderer';
 export * from './schemas';
+export * from './constate';
+export * from './ClientSDK';
\ No newline at end of file
diff --git a/packages/client/src/schemas/action/index.md b/packages/client/src/schemas/action/index.md
index 7158456b6..33e1c41b0 100644
--- a/packages/client/src/schemas/action/index.md
+++ b/packages/client/src/schemas/action/index.md
@@ -2,10 +2,11 @@
 title: Action - 操作
 nav:
   title: 组件
-  path: /schemas
+  path: /client
 group:
-  title: 组件
-  path: /schemas
+  order: 1
+  title: Schemas
+  path: /client/schemas
 ---
 
 # Action - 操作
diff --git a/packages/client/src/schemas/select/demos/demo1.tsx b/packages/client/src/schemas/select/demos/demo1.tsx
index 101a87306..d54575fd3 100644
--- a/packages/client/src/schemas/select/demos/demo1.tsx
+++ b/packages/client/src/schemas/select/demos/demo1.tsx
@@ -2,7 +2,6 @@ import React from 'react';
 import { ISchema, SchemaRenderer } from '../../';
 import { useSelect, useOptionTagValues } from '../';
 import { uid } from '@formily/shared';
-import { RequestProvider } from '@nocobase/client/src/demos/RequestProvider';
 import { CollectionsProvider } from '@nocobase/client/src/constate';
 
 console.log({ useSelect });
@@ -194,13 +193,11 @@ const schema: ISchema = {
 
 export default () => {
   return (
-    
-      
+    
       
     
-    
   );
 };
diff --git a/packages/client/src/schemas/table/demos/demo3.tsx b/packages/client/src/schemas/table/demos/demo3.tsx
index 7ba486237..50a639eb4 100644
--- a/packages/client/src/schemas/table/demos/demo3.tsx
+++ b/packages/client/src/schemas/table/demos/demo3.tsx
@@ -7,7 +7,6 @@ import {
   CollectionsProvider,
   DesignableSwitchProvider,
 } from '@nocobase/client/src/constate';
-import { RequestProvider } from '@nocobase/client/src/demos/RequestProvider';
 
 const schema = {
   name: 'table1',
@@ -222,13 +221,11 @@ const schema = {
 export default () => {
   return (
     
-      
-        
-          
-            
-          
-        
-      
+      
+        
+          
+        
+      
     
   );
 };