This is an automated email from the ASF dual-hosted git repository.

xiaoyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new 5dcc2a30c8 [type:feat] ai proxy selector config (#5942)
5dcc2a30c8 is described below

commit 5dcc2a30c81b36068751c19067cb76021519e3c3
Author: aias00 <[email protected]>
AuthorDate: Thu Feb 27 12:06:08 2025 +0800

    [type:feat] ai proxy selector config (#5942)
    
    * [type:feature] ai proxy selector config
    
    * [type:feature] ai proxy selector config
    
    * [type:feature] ai proxy selector config
    
    * [type:feature] ai proxy selector config / refactor model invoke
    
    * [type:feature] ai proxy selector config / refactor model invoke
    
    * [type:feature] ai proxy selector config / refactor model invoke
---
 db/init/mysql/schema.sql                           |  33 ++++-
 db/init/ob/schema.sql                              |  34 ++++-
 db/init/og/create-table.sql                        |  33 ++++-
 db/init/oracle/schema.sql                          |  86 +++++++++++-
 db/init/pg/create-table.sql                        |  32 ++++-
 db/upgrade/2.7.0-upgrade-2.7.1-mysql.sql           |  35 ++++-
 db/upgrade/2.7.0-upgrade-2.7.1-ob.sql              |  35 ++++-
 db/upgrade/2.7.0-upgrade-2.7.1-og.sql              |  35 ++++-
 db/upgrade/2.7.0-upgrade-2.7.1-oracle.sql          |  88 +++++++++++-
 db/upgrade/2.7.0-upgrade-2.7.1-pg.sql              |  35 ++++-
 .../common/dto/convert/rule/AiProxyHandle.java     | 102 ++++++++------
 .../org/apache/shenyu/common/enums/PluginEnum.java |   2 +-
 .../apache/shenyu/common/enums/RpcTypeEnum.java    |   7 +-
 .../shenyu/common/utils/PluginNameAdapterTest.java |   3 +-
 .../shenyu/plugin/ai/proxy/AiProxyPlugin.java      |  91 ++++++++----
 .../ai/proxy/handler/AiProxyPluginHandler.java     |  25 ++--
 .../shenyu/plugin/ai/proxy/strategy/AiModel.java   |  15 +-
 .../plugin/ai/proxy/strategy/openai/OpenAI.java    | 152 +++++----------------
 .../org/apache/shenyu/plugin/api/ShenyuPlugin.java |   2 +-
 .../strategy/NettyClientMessageWriter.java         |   2 +-
 .../response/strategy/WebClientMessageWriter.java  |   2 +-
 .../ai/proxy/AiProxyPluginConfiguration.java       |   6 +-
 22 files changed, 637 insertions(+), 218 deletions(-)

diff --git a/db/init/mysql/schema.sql b/db/init/mysql/schema.sql
index cfbecafc5d..4059214b5d 100644
--- a/db/init/mysql/schema.sql
+++ b/db/init/mysql/schema.sql
@@ -860,6 +860,17 @@ INSERT INTO `permission` VALUES ('1697146375754129471', 
'1346358560427216896', '
 INSERT INTO `permission` VALUES ('1697146617543248162', '1346358560427216896', 
'1844025989214130176', '2023-08-31 07:22:07', '2023-08-31 07:22:07');
 INSERT INTO `permission` VALUES ('1697146860569542740', '1346358560427216896', 
'1844026099075534848', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
 
+INSERT INTO `permission` VALUES ('1697146860569542741', '1346358560427216896', 
'1844026099075534849', '2023-08-31 06:59:01', '2023-08-31 06:59:01');
+INSERT INTO `permission` VALUES ('1697146860569542742', '1346358560427216896', 
'1844026099075534850', '2023-08-31 07:22:07', '2023-08-31 07:22:07');
+INSERT INTO `permission` VALUES ('1697146860569542743', '1346358560427216896', 
'1844026099075534851', '2023-08-31 07:14:26', '2023-08-31 07:14:26');
+INSERT INTO `permission` VALUES ('1697146860569542744', '1346358560427216896', 
'1844026099075534852', '2023-08-31 07:22:07', '2023-08-31 07:22:07');
+INSERT INTO `permission` VALUES ('1697146860569542745', '1346358560427216896', 
'1844026099075534853', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542746', '1346358560427216896', 
'1844026099075534854', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542747', '1346358560427216896', 
'1844026099075534855', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542748', '1346358560427216896', 
'1844026099075534856', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542749', '1346358560427216896', 
'1844026099075534857', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542750', '1346358560427216896', 
'1844026099075534858', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+
 
 -- ----------------------------
 -- Table structure for plugin
@@ -923,7 +934,7 @@ INSERT INTO `plugin` VALUES ('42', 'tcp', NULL, 'Proxy', 
320, 1, '2023-05-30 18:
 INSERT INTO `plugin` VALUES ('43', 'loggingHuaweiLts', 
'{\"totalSizeInBytes\":\"104857600\",\"maxBlockMs\":\"0\",\"ioThreadCount\":\"1\",\"batchSizeThresholdInBytes\":\"524288\",\"batchCountThreshold\":\"4096\",\"lingerMs\":\"2000\",\"retries\":\"100\",\"baseRetryBackoffMs\":\"100\",\"maxRetryBackoffMs\":\"100\",\"enableLocalTest\":\"true\",\"setGiveUpExtraLongSingleLog\":\"false\"}',
 'Logging', 177, 0, '2023-07-05 14:03:53.686', '2023-07-06 12:42:07.234', NULL);
 INSERT INTO `plugin` VALUES ('44', 'basicAuth', 
'{\"defaultHandleJson\":\"{\\\"authorization\\\":\\\"test:test123\\\"}\"}', 
'Authentication', 150, 0, '2022-07-24 19:00:00', '2022-07-24 19:00:00', null);
 INSERT INTO `plugin` VALUES ('45', 'loggingRabbitMQ', 
'{\"host\":\"127.0.0.1\",\"port\":5672,\"password\":\"admin\",\"username\":\"admin\",\"exchangeName\":\"exchange.logging.plugin\",\"queueName\":\"queue.logging.plugin\",\"routingKey\":\"topic.logging\",\"virtualHost\":\"/\",\"exchangeType\":\"direct\",\"durable\":\"true\",\"exclusive\":\"false\",\"autoDelete\":\"false\"}',
 'Logging', 171, 0, '2023-11-06 15:49:56.454', '2023-11-10 10:40:58.447', NULL);
-INSERT INTO `plugin` VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 171, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
+INSERT INTO `plugin` VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 200, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
 
 -- ----------------------------
 -- Table structure for plugin_handle
@@ -1311,6 +1322,15 @@ INSERT INTO `plugin_handle` VALUES 
('1722804548510507038', '50', 'maxTokens', 'm
 INSERT INTO `plugin_handle` VALUES ('1722804548510507039', '50', 'stream', 
'stream', 3, 3, 7, '{\"defaultValue\":\"false\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
 INSERT INTO `plugin_handle` VALUES ('1722804548510507040', '50', 'prompt', 
'prompt', 2, 3, 8, '{\"required\":\"0\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
 
+INSERT INTO `plugin_handle` VALUES ('1722804548510507041', '50', 'provider', 
'provider', 3, 1, 0, 
'{\"required\":\"1\",\"defaultValue\":\"OpenAI\",\"placeholder\":\"provider\",\"rule\":\"\"}',
 '2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507042', '50', 'baseUrl', 
'baseUrl', 2, 1, 1, '{\"required\":\"1\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507043', '50', 'model', 
'model', 2, 1, 2, '{\"required\":\"1\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507044', '50', 'apiKey', 
'apiKey', 2, 1, 3, '{\"required\":\"1\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507045', '50', 
'temperature', 'temperature', 2, 1, 4, '{\"required\":\"0\",\"rule\":\"\"}', 
'2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507046', '50', 'maxTokens', 
'maxTokens', 2, 1, 5, '{\"required\":\"0\",\"rule\":\"\", 
\"placeholder\":\"optional,0,0.01~1\"}', '2024-01-02 17:20:50.233', '2024-01-02 
17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507047', '50', 'stream', 
'stream', 3, 1, 6, '{\"defaultValue\":\"false\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507048', '50', 'prompt', 
'prompt', 2, 1, 7, '{\"required\":\"0\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+
 -- ----------------------------
 -- Table structure for resource
 -- ----------------------------
@@ -1856,6 +1876,17 @@ INSERT INTO `resource` VALUES ('1844025850382667776', 
'1844015648095666176', 'SH
 INSERT INTO `resource` VALUES ('1844025989214130176', '1844015648095666176', 
'SHENYU.BUTTON.SYSTEM.DELETE', '', '', '', 2, 0, 'delete', 1, 0, 
'system:scale:delete', 1, '2024-10-09 22:43:50.831000', '2024-10-09 
22:43:50.831705');
 INSERT INTO `resource` VALUES ('1844026099075534848', '1844015648095666176', 
'SHENYU.BUTTON.SYSTEM.EDIT', '', '', '', 2, 0, 'edit', 1, 0, 
'system:scale:edit', 1, '2024-10-09 22:44:17.024000', '2024-10-09 
22:44:17.024555');
 
+INSERT INTO `resource` VALUES ('1844026099075534849', '1346775491550474240', 
'aiProxy', 'aiProxy', '/plug/aiProxy', 'aiProxy', 1, 0, 'pic-center', 0, 0, '', 
1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534850', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.ADD', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:add', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534851', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.QUERY', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:query', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534852', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.EDIT', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:edit', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534853', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.DELETE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:delete', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534854', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.ADD', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:add', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534855', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.QUERY', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:query', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534856', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.EDIT', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:edit', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534857', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.DELETE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:delete', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534858', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SYNCHRONIZE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxy:modify', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+
 -- ----------------------------
 -- Table structure for role
 -- ----------------------------
diff --git a/db/init/ob/schema.sql b/db/init/ob/schema.sql
index a90a39bb6f..6842d16f41 100644
--- a/db/init/ob/schema.sql
+++ b/db/init/ob/schema.sql
@@ -854,6 +854,17 @@ INSERT INTO `permission` VALUES 
('1792779493541343249','1346358560427216896','17
 INSERT INTO `permission` VALUES 
('1792779493541343250','1346358560427216896','1792749362441646348', '2022-05-25 
18:02:58', '2022-05-25 18:02:58');
 INSERT INTO `permission` VALUES 
('1792779493541343251','1346358560427216896','1792749362441646349', '2022-05-25 
18:02:58', '2022-05-25 18:02:58');
 
+INSERT INTO `permission` VALUES ('1697146860569542741', '1346358560427216896', 
'1844026099075534849', '2023-08-31 06:59:01', '2023-08-31 06:59:01');
+INSERT INTO `permission` VALUES ('1697146860569542742', '1346358560427216896', 
'1844026099075534850', '2023-08-31 07:22:07', '2023-08-31 07:22:07');
+INSERT INTO `permission` VALUES ('1697146860569542743', '1346358560427216896', 
'1844026099075534851', '2023-08-31 07:14:26', '2023-08-31 07:14:26');
+INSERT INTO `permission` VALUES ('1697146860569542744', '1346358560427216896', 
'1844026099075534852', '2023-08-31 07:22:07', '2023-08-31 07:22:07');
+INSERT INTO `permission` VALUES ('1697146860569542745', '1346358560427216896', 
'1844026099075534853', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542746', '1346358560427216896', 
'1844026099075534854', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542747', '1346358560427216896', 
'1844026099075534855', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542748', '1346358560427216896', 
'1844026099075534856', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542749', '1346358560427216896', 
'1844026099075534857', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542750', '1346358560427216896', 
'1844026099075534858', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+
 -- ----------------------------
 -- Table structure for plugin
 -- ----------------------------
@@ -916,7 +927,7 @@ INSERT INTO `plugin` VALUES ('42', 'tcp', NULL, 'Proxy', 
320, 1, '2023-05-30 18:
 INSERT INTO `plugin` VALUES ('43', 'loggingHuaweiLts', 
'{\"totalSizeInBytes\":\"104857600\",\"maxBlockMs\":\"0\",\"ioThreadCount\":\"1\",\"batchSizeThresholdInBytes\":\"524288\",\"batchCountThreshold\":\"4096\",\"lingerMs\":\"2000\",\"retries\":\"100\",\"baseRetryBackoffMs\":\"100\",\"maxRetryBackoffMs\":\"100\",\"enableLocalTest\":\"true\",\"setGiveUpExtraLongSingleLog\":\"false\"}',
 'Logging', 177, 0, '2023-07-05 14:03:53.686', '2023-07-06 12:42:07.234', NULL);
 INSERT INTO `plugin` VALUES ('44', 'basicAuth', 
'{\"defaultHandleJson\":\"{\\\"authorization\\\":\\\"test:test123\\\"}\"}', 
'Authentication', 150, 0, '2022-07-24 19:00:00', '2022-07-24 19:00:00', null);
 INSERT INTO `plugin` VALUES ('45', 'loggingRabbitMQ', 
'{\"host\":\"127.0.0.1\",\"port\":5672,\"password\":\"admin\",\"username\":\"admin\",\"exchangeName\":\"exchange.logging.plugin\",\"queueName\":\"queue.logging.plugin\",\"routingKey\":\"topic.logging\",\"virtualHost\":\"/\",\"exchangeType\":\"direct\",\"durable\":\"true\",\"exclusive\":\"false\",\"autoDelete\":\"false\"}',
 'Logging', 171, 0, '2023-11-06 15:49:56.454', '2023-11-10 10:40:58.447', NULL);
-INSERT INTO `plugin` VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 171, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
+INSERT INTO `plugin` VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 200, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
 
 -- ----------------------------
 -- Table structure for plugin_handle
@@ -1303,6 +1314,16 @@ INSERT INTO `plugin_handle` VALUES 
('1722804548510507037', '50', 'temperature',
 INSERT INTO `plugin_handle` VALUES ('1722804548510507038', '50', 'maxTokens', 
'maxTokens', 2, 3, 6, '{\"required\":\"0\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
 INSERT INTO `plugin_handle` VALUES ('1722804548510507039', '50', 'stream', 
'stream', 3, 3, 7, '{\"defaultValue\":\"false\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
 INSERT INTO `plugin_handle` VALUES ('1722804548510507040', '50', 'prompt', 
'prompt', 2, 3, 8, '{\"required\":\"0\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+
+INSERT INTO `plugin_handle` VALUES ('1722804548510507041', '50', 'provider', 
'provider', 3, 1, 0, 
'{\"required\":\"1\",\"defaultValue\":\"OpenAI\",\"placeholder\":\"provider\",\"rule\":\"\"}',
 '2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507042', '50', 'baseUrl', 
'baseUrl', 2, 1, 1, '{\"required\":\"1\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507043', '50', 'model', 
'model', 2, 1, 2, '{\"required\":\"1\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507044', '50', 'apiKey', 
'apiKey', 2, 1, 3, '{\"required\":\"1\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507045', '50', 
'temperature', 'temperature', 2, 1, 4, '{\"required\":\"0\",\"rule\":\"\"}', 
'2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507046', '50', 'maxTokens', 
'maxTokens', 2, 1, 5, '{\"required\":\"0\",\"rule\":\"\", 
\"placeholder\":\"optional,0,0.01~1\"}', '2024-01-02 17:20:50.233', '2024-01-02 
17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507047', '50', 'stream', 
'stream', 3, 1, 6, '{\"defaultValue\":\"false\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507048', '50', 'prompt', 
'prompt', 2, 1, 7, '{\"required\":\"0\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+
 -- ----------------------------
 -- Table structure for resource
 -- ----------------------------
@@ -1842,6 +1863,17 @@ INSERT INTO `resource` VALUES ('1792749362441646347', 
'1792749362361954333', 'SH
 INSERT INTO `resource` VALUES ('1792749362441646348', '1792749362361954333', 
'SHENYU.BUTTON.PLUGIN.RULE.DELETE', '', '', '', 2, 0, '', 1, 0, 
'plugin:mockRule:delete', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
 INSERT INTO `resource` VALUES ('1792749362441646349', '1792749362361954333', 
'SHENYU.BUTTON.PLUGIN.SYNCHRONIZE', '', '', '', 2, 0, '', 1, 0, 
'plugin:mock:modify', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
 
+INSERT INTO `resource` VALUES ('1844026099075534849', '1346775491550474240', 
'aiProxy', 'aiProxy', '/plug/aiProxy', 'aiProxy', 1, 0, 'pic-center', 0, 0, '', 
1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534850', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.ADD', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:add', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534851', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.QUERY', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:query', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534852', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.EDIT', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:edit', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534853', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.DELETE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:delete', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534854', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.ADD', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:add', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534855', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.QUERY', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:query', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534856', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.EDIT', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:edit', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534857', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.DELETE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:delete', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534858', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SYNCHRONIZE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxy:modify', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+
 -- ----------------------------
 -- Table structure for role
 -- ----------------------------
diff --git a/db/init/og/create-table.sql b/db/init/og/create-table.sql
index 975bd8051f..40e476d58d 100644
--- a/db/init/og/create-table.sql
+++ b/db/init/og/create-table.sql
@@ -988,7 +988,7 @@ INSERT INTO "public"."plugin" VALUES ('42', 'tcp', null, 
'Proxy', 320, 1, '2022-
 INSERT INTO "public"."plugin" VALUES ('43', 'loggingHuaweiLts', '{ 
"totalSizeInBytes": 
"104857600","maxBlockMs":"0","ioThreadCount":"1","batchSizeThresholdInBytes":"524288","batchCountThreshold":"4096","lingerMs":"2000","retries":"100","baseRetryBackoffMs":"100","maxRetryBackoffMs":"100","enableLocalTest":"true","setGiveUpExtraLongSingleLog":"false"}',
 'Logging', 177, 0, '2023-07-05 14:03:53', '2023-07-06 12:42:07', null);
 INSERT INTO "public"."plugin" VALUES ('44', 'basicAuth', 
'{"defaultHandleJson":"{"authorization":"test:test123"}"}', 'Authentication', 
150, 0, '2022-07-24 19:00:00', '2022-07-24 19:00:00', null);
 INSERT INTO "public"."plugin" VALUES ('45', 'loggingRabbitMQ', 
'{"host":"127.0.0.1","port":5672,"password":"admin","username":"admin","exchangeName":"exchange.logging.plugin","queueName":"queue.logging.plugin","routingKey":"topic.logging","virtualHost":"/","exchangeType":"direct","durable":"true","exclusive":"false","autoDelete":"false"}',
 'Logging', 171, 0, '2023-11-06 15:49:56.454', '2023-11-10 10:40:58.447', NULL);
-INSERT INTO "public"."plugin" VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 171, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
+INSERT INTO "public"."plugin" VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 200, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
 
 -- ----------------------------
 -- Table structure for plugin_handle
@@ -2815,3 +2815,34 @@ COMMENT ON COLUMN 
"public"."namespace_user_rel"."user_id" IS 'user_id';
 COMMENT ON COLUMN "public"."namespace_user_rel"."date_created" IS 'create 
time';
 COMMENT ON COLUMN "public"."namespace_user_rel"."date_updated" IS 'update 
time';
 
+
+INSERT INTO "public"."resource" VALUES ('1844026099075534849', 
'1346775491550474240', 'aiProxy', 'aiProxy', '/plug/aiProxy', 'aiProxy', 1, 0, 
'pic-center', 0, 0, '', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534850', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.ADD', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxySelector:add', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534851', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.QUERY', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxySelector:query', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534852', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.EDIT', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxySelector:edit', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534853', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.DELETE', '', '', '', 2, 
0, '', 1, 0, 'plugin:aiProxySelector:delete', 1, '2022-05-25 18:02:58', 
'2022-05-25 18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534854', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.ADD', '', '', '', 2, 0, '', 
1, 0, 'plugin:aiProxyRule:add', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534855', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.QUERY', '', '', '', 2, 0, '', 
1, 0, 'plugin:aiProxyRule:query', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534856', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.EDIT', '', '', '', 2, 0, '', 
1, 0, 'plugin:aiProxyRule:edit', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534857', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.DELETE', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxyRule:delete', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534858', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SYNCHRONIZE', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxy:modify', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+
+INSERT INTO "public"."permission" VALUES ('1697146860569542741', 
'1346358560427216896', '1844026099075534849', '2023-08-31 06:59:01', 
'2023-08-31 06:59:01');
+INSERT INTO "public"."permission" VALUES ('1697146860569542742', 
'1346358560427216896', '1844026099075534850', '2023-08-31 07:22:07', 
'2023-08-31 07:22:07');
+INSERT INTO "public"."permission" VALUES ('1697146860569542743', 
'1346358560427216896', '1844026099075534851', '2023-08-31 07:14:26', 
'2023-08-31 07:14:26');
+INSERT INTO "public"."permission" VALUES ('1697146860569542744', 
'1346358560427216896', '1844026099075534852', '2023-08-31 07:22:07', 
'2023-08-31 07:22:07');
+INSERT INTO "public"."permission" VALUES ('1697146860569542745', 
'1346358560427216896', '1844026099075534853', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542746', 
'1346358560427216896', '1844026099075534854', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542747', 
'1346358560427216896', '1844026099075534855', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542748', 
'1346358560427216896', '1844026099075534856', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542749', 
'1346358560427216896', '1844026099075534857', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542750', 
'1346358560427216896', '1844026099075534858', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507041', '50', 
'provider', 'provider', 3, 1, 0, 
'{"required":"1","defaultValue":"OpenAI","placeholder":"provider","rule":""}', 
'2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507042', '50', 
'baseUrl', 'baseUrl', 2, 1, 1, '{"required":"1","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507043', '50', 
'model', 'model', 2, 1, 2, '{"required":"1","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507044', '50', 
'apiKey', 'apiKey', 2, 1, 3, '{"required":"1","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507045', '50', 
'temperature', 'temperature', 2, 1, 4, '{"required":"0","rule":""}', 
'2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507046', '50', 
'maxTokens', 'maxTokens', 2, 1, 5, '{"required":"0","rule":"", 
"placeholder":"optional,0,0.01~1"}', '2024-01-02 17:20:50.233', '2024-01-02 
17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507047', '50', 
'stream', 'stream', 3, 1, 6, '{"defaultValue":"false","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507048', '50', 
'prompt', 'prompt', 2, 1, 7, '{"required":"0","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
diff --git a/db/init/oracle/schema.sql b/db/init/oracle/schema.sql
index a821df5682..3e298b6777 100644
--- a/db/init/oracle/schema.sql
+++ b/db/init/oracle/schema.sql
@@ -1169,7 +1169,7 @@ INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin(id)) */ INTO 
plugin (id, name, role
 INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin(id)) */ INTO plugin (id, name, 
role, sort, config, enabled) VALUES ('43', 'loggingHuaweiLts', 'Logging', 177, 
'{"totalSizeInBytes":"104857600","maxBlockMs":"0","ioThreadCount":"1","batchSizeThresholdInBytes":"524288","batchCountThreshold":"4096","lingerMs":"2000","retries":"100","baseRetryBackoffMs":"100","maxRetryBackoffMs":"100","enableLocalTest":"true","setGiveUpExtraLongSingleLog":"false"}','0');
 INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin(id)) */ INTO plugin (id, name, 
role, sort, config, enabled) VALUES ('44', 'basicAuth', 'Authentication', 150, 
'{"defaultHandleJson":"{\"authorization\":\"test:test123\"}"}','0');
 INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin(id)) */ INTO plugin (id, name, 
role, sort, config, enabled) VALUES ('45', 'loggingRabbitmq', 'Logging', 171, 
'{"host":"127.0.0.1","port":5672,"password":"admin","username":"admin","exchangeName":"exchange.logging.plugin","queueName":"queue.logging.plugin","routingKey":"topic.logging","virtualHost":"/","exchangeType":"direct","durable":"true","exclusive":"false","autoDelete":"false"}',
 '0');
-INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin(id)) */ INTO plugin (id, name, 
config, role, sort, enabled) VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 171, 0);
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin(id)) */ INTO plugin (id, name, 
config, role, sort, enabled) VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 200, 0);
 
 
 /*insert plugin_handle data for sentinel*/
@@ -3083,3 +3083,87 @@ comment on column NAMESPACE_USER_REL.date_created
 comment on column NAMESPACE_USER_REL.date_updated
     is 'update time';
 
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534849', '1346775491550474240', 'aiProxy', 'aiProxy', 
'/plug/aiProxy', 'aiProxy', 1, 0, 'pic-center', 0, 0, '', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534850', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.ADD', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:add', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534851', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.QUERY', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:query', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534852', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.EDIT', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:edit', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534853', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.DELETE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:delete', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534854', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.ADD', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:add', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534855', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.QUERY', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:query', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534856', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.EDIT', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:edit', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534857', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.DELETE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:delete', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534858', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SYNCHRONIZE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxy:modify', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542741', '1346358560427216896', '1844026099075534849');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542742', '1346358560427216896', '1844026099075534850');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542743', '1346358560427216896', '1844026099075534851');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542744', '1346358560427216896', '1844026099075534852');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542745', '1346358560427216896', '1844026099075534853');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542746', '1346358560427216896', '1844026099075534854');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542747', '1346358560427216896', '1844026099075534855');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542748', '1346358560427216896', '1844026099075534856');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542749', '1346358560427216896', '1844026099075534857');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542750', '1346358560427216896', '1844026099075534858');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507041', '50', 'provider', 'provider', 3, 1, 0, 
'{"required":"1","defaultValue":"OpenAI","placeholder":"provider","rule":""}', 
to_timestamp('2024-01-02 17:20:50.233', 'YYYY-MM-DD HH24:MI:SS.FF3'), 
to_timestamp('2024-01-02 17:20:50.233', 'YYYY-MM-DD HH24:MI:SS.FF3'));
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507042', '50', 'baseUrl', 'baseUrl', 2, 1, 1, 
'{"required":"1","rule":""}', to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'), to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'));
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507043', '50', 'model', 'model', 2, 1, 2, 
'{"required":"1","rule":""}', to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'), to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'));
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507044', '50', 'apiKey', 'apiKey', 2, 1, 3, 
'{"required":"1","rule":""}', to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'), to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'));
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507045', '50', 'temperature', 'temperature', 2, 1, 4, 
'{"required":"0","rule":""}', to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'), to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'));
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507046', '50', 'maxTokens', 'maxTokens', 2, 1, 5, 
'{"required":"0","rule":"", "placeholder":"optional,0,0.01~1"}', 
to_timestamp('2024-01-02 17:20:50.233', 'YYYY-MM-DD HH24:MI:SS.FF3'), 
to_timestamp('2024-01-02 17:20:50.233', 'YYYY-MM-DD HH24:MI:SS.FF3'));
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507047', '50', 'stream', 'stream', 3, 1, 6, 
'{"defaultValue":"false","rule":""}', to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'), to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'));
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507048', '50', 'prompt', 'prompt', 2, 1, 7, 
'{"required":"0","rule":""}', to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'), to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'));
diff --git a/db/init/pg/create-table.sql b/db/init/pg/create-table.sql
index f1f468c9f9..1895160012 100644
--- a/db/init/pg/create-table.sql
+++ b/db/init/pg/create-table.sql
@@ -1049,7 +1049,7 @@ INSERT INTO "public"."plugin" VALUES ('42', 'tcp', null, 
'Proxy', 320, 1, '2022-
 INSERT INTO "public"."plugin" VALUES ('43', 'loggingHuaweiLts', '{ 
"totalSizeInBytes": 
"104857600","maxBlockMs":"0","ioThreadCount":"1","batchSizeThresholdInBytes":"524288","batchCountThreshold":"4096","lingerMs":"2000","retries":"100","baseRetryBackoffMs":"100","maxRetryBackoffMs":"100","enableLocalTest":"true","setGiveUpExtraLongSingleLog":"false"}',
 'Logging', 177, 0, '2023-07-05 14:03:53', '2023-07-06 12:42:07', null);
 INSERT INTO "public"."plugin" VALUES ('44', 'basicAuth', 
'{"defaultHandleJson":"{\"authorization\":\"test:test123\"}"}', 
'Authentication', 150, 0, '2022-07-24 19:00:00', '2022-07-24 19:00:00', null);
 INSERT INTO "public"."plugin" VALUES ('45', 'loggingRabbitMQ', 
'{"host":"127.0.0.1","port":5672,"password":"admin","username":"admin","exchangeName":"exchange.logging.plugin","queueName":"queue.logging.plugin","routingKey":"topic.logging","virtualHost":"/","exchangeType":"direct","durable":"true","exclusive":"false","autoDelete":"false"}',
 'Logging', 171, 0, '2023-11-06 15:49:56.454', '2023-11-10 10:40:58.447', NULL);
-INSERT INTO "public"."plugin" VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 171, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
+INSERT INTO "public"."plugin" VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 200, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
 
 -- ----------------------------
 -- Table structure for plugin_handle
@@ -2936,3 +2936,33 @@ COMMENT ON COLUMN 
"public"."namespace_user_rel"."user_id" IS 'user_id';
 COMMENT ON COLUMN "public"."namespace_user_rel"."date_created" IS 'create 
time';
 COMMENT ON COLUMN "public"."namespace_user_rel"."date_updated" IS 'update 
time';
 
+INSERT INTO "public"."resource" VALUES ('1844026099075534849', 
'1346775491550474240', 'aiProxy', 'aiProxy', '/plug/aiProxy', 'aiProxy', 1, 0, 
'pic-center', 0, 0, '', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534850', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.ADD', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxySelector:add', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534851', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.QUERY', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxySelector:query', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534852', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.EDIT', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxySelector:edit', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534853', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.DELETE', '', '', '', 2, 
0, '', 1, 0, 'plugin:aiProxySelector:delete', 1, '2022-05-25 18:02:58', 
'2022-05-25 18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534854', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.ADD', '', '', '', 2, 0, '', 
1, 0, 'plugin:aiProxyRule:add', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534855', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.QUERY', '', '', '', 2, 0, '', 
1, 0, 'plugin:aiProxyRule:query', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534856', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.EDIT', '', '', '', 2, 0, '', 
1, 0, 'plugin:aiProxyRule:edit', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534857', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.DELETE', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxyRule:delete', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534858', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SYNCHRONIZE', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxy:modify', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+
+INSERT INTO "public"."permission" VALUES ('1697146860569542741', 
'1346358560427216896', '1844026099075534849', '2023-08-31 06:59:01', 
'2023-08-31 06:59:01');
+INSERT INTO "public"."permission" VALUES ('1697146860569542742', 
'1346358560427216896', '1844026099075534850', '2023-08-31 07:22:07', 
'2023-08-31 07:22:07');
+INSERT INTO "public"."permission" VALUES ('1697146860569542743', 
'1346358560427216896', '1844026099075534851', '2023-08-31 07:14:26', 
'2023-08-31 07:14:26');
+INSERT INTO "public"."permission" VALUES ('1697146860569542744', 
'1346358560427216896', '1844026099075534852', '2023-08-31 07:22:07', 
'2023-08-31 07:22:07');
+INSERT INTO "public"."permission" VALUES ('1697146860569542745', 
'1346358560427216896', '1844026099075534853', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542746', 
'1346358560427216896', '1844026099075534854', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542747', 
'1346358560427216896', '1844026099075534855', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542748', 
'1346358560427216896', '1844026099075534856', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542749', 
'1346358560427216896', '1844026099075534857', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542750', 
'1346358560427216896', '1844026099075534858', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507041', '50', 
'provider', 'provider', 3, 1, 0, 
'{"required":"1","defaultValue":"OpenAI","placeholder":"provider","rule":""}', 
'2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507042', '50', 
'baseUrl', 'baseUrl', 2, 1, 1, '{"required":"1","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507043', '50', 
'model', 'model', 2, 1, 2, '{"required":"1","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507044', '50', 
'apiKey', 'apiKey', 2, 1, 3, '{"required":"1","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507045', '50', 
'temperature', 'temperature', 2, 1, 4, '{"required":"0","rule":""}', 
'2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507046', '50', 
'maxTokens', 'maxTokens', 2, 1, 5, '{"required":"0","rule":"", 
"placeholder":"optional,0,0.01~1"}', '2024-01-02 17:20:50.233', '2024-01-02 
17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507047', '50', 
'stream', 'stream', 3, 1, 6, '{"defaultValue":"false","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507048', '50', 
'prompt', 'prompt', 2, 1, 7, '{"required":"0","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
diff --git a/db/upgrade/2.7.0-upgrade-2.7.1-mysql.sql 
b/db/upgrade/2.7.0-upgrade-2.7.1-mysql.sql
index 891e7bb26a..bef1339ff5 100755
--- a/db/upgrade/2.7.0-upgrade-2.7.1-mysql.sql
+++ b/db/upgrade/2.7.0-upgrade-2.7.1-mysql.sql
@@ -17,7 +17,7 @@
 -- this file works for MySQL.
 INSERT INTO `plugin_handle` VALUES ('1722804548510507032', '19', 'handleType', 
'handleType', 2, 3, 1, '{"required":"0","rule":""}', '2025-01-02 17:20:50.233', 
'2025-01-02 17:20:50.233');
 
-INSERT INTO `plugin` VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 171, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
+INSERT INTO `plugin` VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 200, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
 
 INSERT INTO `plugin_handle` VALUES ('1722804548510507033', '50', 'provider', 
'provider', 3, 3, 1, 
'{\"required\":\"1\",\"defaultValue\":\"OpenAI\",\"placeholder\":\"provider\",\"rule\":\"\"}',
 '2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
 INSERT INTO `plugin_handle` VALUES ('1722804548510507034', '50', 'baseUrl', 
'baseUrl', 2, 3, 2, '{\"required\":\"1\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
@@ -34,4 +34,35 @@ INSERT INTO `shenyu_dict` VALUES ('1679002911061737484', 
'provider', 'PROVIDER_T
 INSERT INTO `shenyu_dict` VALUES ('1679002911061737485', 'provider', 
'PROVIDER_TYPE_OPENAPI', 'OpenAPI', 'OpenAPI', 'OpenAPI', 3, 1, '2024-02-07 
14:31:49', '2024-02-07 14:31:49');
 INSERT INTO `shenyu_dict` VALUES ('1679002911061737486', 'provider', 
'PROVIDER_TYPE_ALIYUN', 'ALiYun', 'ALiYun', 'ALiYun', 4, 1, '2024-02-07 
14:31:49', '2024-02-07 14:31:49');
 
-INSERT INTO `namespace_plugin_rel` (`id`,`namespace_id`,`plugin_id`, `config`, 
`sort`, `enabled`, `date_created`, `date_updated`) VALUES 
('1801816010882822187','649330b6-c2d7-4edc-be8e-8a54df9eb385','50', 
'{\"provider\":\"OpenAI\",\"baseUrl\":\"https://api.openai.com/v1/chat/completions\",\"model\":\"gpt-4o-mini\",\"apiKey\":\"your_api_key\",\"temperature\":\"0.5\",\"maxTokens\":\"1000\",\"stream\":\"false\",\"prompt\":\"\"}',
 171, 0, '2022-05-25 18:02:53.000', '2022-05-25 18:02:53.000');
\ No newline at end of file
+INSERT INTO `namespace_plugin_rel` (`id`,`namespace_id`,`plugin_id`, `config`, 
`sort`, `enabled`, `date_created`, `date_updated`) VALUES 
('1801816010882822187','649330b6-c2d7-4edc-be8e-8a54df9eb385','50', 
'{\"provider\":\"OpenAI\",\"baseUrl\":\"https://api.openai.com/v1/chat/completions\",\"model\":\"gpt-4o-mini\",\"apiKey\":\"your_api_key\",\"temperature\":\"0.5\",\"maxTokens\":\"1000\",\"stream\":\"false\",\"prompt\":\"\"}',
 171, 0, '2022-05-25 18:02:53.000', '2022-05-25 18:02:53.000');
+
+INSERT INTO `resource` VALUES ('1844026099075534849', '1346775491550474240', 
'aiProxy', 'aiProxy', '/plug/aiProxy', 'aiProxy', 1, 0, 'pic-center', 0, 0, '', 
1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534850', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.ADD', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:add', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534851', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.QUERY', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:query', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534852', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.EDIT', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:edit', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534853', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.DELETE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:delete', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534854', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.ADD', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:add', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534855', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.QUERY', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:query', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534856', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.EDIT', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:edit', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534857', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.DELETE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:delete', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534858', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SYNCHRONIZE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxy:modify', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+
+INSERT INTO `permission` VALUES ('1697146860569542741', '1346358560427216896', 
'1844026099075534849', '2023-08-31 06:59:01', '2023-08-31 06:59:01');
+INSERT INTO `permission` VALUES ('1697146860569542742', '1346358560427216896', 
'1844026099075534850', '2023-08-31 07:22:07', '2023-08-31 07:22:07');
+INSERT INTO `permission` VALUES ('1697146860569542743', '1346358560427216896', 
'1844026099075534851', '2023-08-31 07:14:26', '2023-08-31 07:14:26');
+INSERT INTO `permission` VALUES ('1697146860569542744', '1346358560427216896', 
'1844026099075534852', '2023-08-31 07:22:07', '2023-08-31 07:22:07');
+INSERT INTO `permission` VALUES ('1697146860569542745', '1346358560427216896', 
'1844026099075534853', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542746', '1346358560427216896', 
'1844026099075534854', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542747', '1346358560427216896', 
'1844026099075534855', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542748', '1346358560427216896', 
'1844026099075534856', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542749', '1346358560427216896', 
'1844026099075534857', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542750', '1346358560427216896', 
'1844026099075534858', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+
+INSERT INTO `plugin_handle` VALUES ('1722804548510507041', '50', 'provider', 
'provider', 3, 1, 0, 
'{\"required\":\"1\",\"defaultValue\":\"OpenAI\",\"placeholder\":\"provider\",\"rule\":\"\"}',
 '2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507042', '50', 'baseUrl', 
'baseUrl', 2, 1, 1, '{\"required\":\"1\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507043', '50', 'model', 
'model', 2, 1, 2, '{\"required\":\"1\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507044', '50', 'apiKey', 
'apiKey', 2, 1, 3, '{\"required\":\"1\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507045', '50', 
'temperature', 'temperature', 2, 1, 4, '{\"required\":\"0\",\"rule\":\"\"}', 
'2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507046', '50', 'maxTokens', 
'maxTokens', 2, 1, 5, '{\"required\":\"0\",\"rule\":\"\", 
\"placeholder\":\"optional,0,0.01~1\"}', '2024-01-02 17:20:50.233', '2024-01-02 
17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507047', '50', 'stream', 
'stream', 3, 1, 6, '{\"defaultValue\":\"false\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507048', '50', 'prompt', 
'prompt', 2, 1, 7, '{\"required\":\"0\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
diff --git a/db/upgrade/2.7.0-upgrade-2.7.1-ob.sql 
b/db/upgrade/2.7.0-upgrade-2.7.1-ob.sql
index c8b055b950..e0fec551fd 100755
--- a/db/upgrade/2.7.0-upgrade-2.7.1-ob.sql
+++ b/db/upgrade/2.7.0-upgrade-2.7.1-ob.sql
@@ -17,7 +17,7 @@
 -- this file works for Oceanbase.
 INSERT INTO `plugin_handle` VALUES ('1722804548510507032', '19', 'handleType', 
'handleType', 2, 3, 1, '{"required":"0","rule":""}', '2025-01-02 17:20:50.233', 
'2025-01-02 17:20:50.233');
 
-INSERT INTO `plugin` VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 171, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
+INSERT INTO `plugin` VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 200, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
 
 INSERT INTO `plugin_handle` VALUES ('1722804548510507033', '50', 'provider', 
'provider', 3, 3, 1, 
'{\"required\":\"1\",\"defaultValue\":\"OpenAI\",\"placeholder\":\"provider\",\"rule\":\"\"}',
 '2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
 INSERT INTO `plugin_handle` VALUES ('1722804548510507034', '50', 'baseUrl', 
'baseUrl', 2, 3, 2, '{\"required\":\"1\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
@@ -34,4 +34,35 @@ INSERT INTO `shenyu_dict` VALUES ('1679002911061737484', 
'provider', 'PROVIDER_T
 INSERT INTO `shenyu_dict` VALUES ('1679002911061737485', 'provider', 
'PROVIDER_TYPE_OPENAPI', 'OpenAPI', 'OpenAPI', 'OpenAPI', 3, 1, '2024-02-07 
14:31:49', '2024-02-07 14:31:49');
 INSERT INTO `shenyu_dict` VALUES ('1679002911061737486', 'provider', 
'PROVIDER_TYPE_ALIYUN', 'ALiYun', 'ALiYun', 'ALiYun', 4, 1, '2024-02-07 
14:31:49', '2024-02-07 14:31:49');
 
-INSERT INTO `namespace_plugin_rel` (`id`,`namespace_id`,`plugin_id`, `config`, 
`sort`, `enabled`, `date_created`, `date_updated`) VALUES 
('1801816010882822187','649330b6-c2d7-4edc-be8e-8a54df9eb385','50', 
'{\"provider\":\"OpenAI\",\"baseUrl\":\"https://api.openai.com/v1/chat/completions\",\"model\":\"gpt-4o-mini\",\"apiKey\":\"your_api_key\",\"temperature\":\"0.5\",\"maxTokens\":\"1000\",\"stream\":\"false\",\"prompt\":\"\"}',
 171, 0, '2022-05-25 18:02:53.000', '2022-05-25 18:02:53.000');
\ No newline at end of file
+INSERT INTO `namespace_plugin_rel` (`id`,`namespace_id`,`plugin_id`, `config`, 
`sort`, `enabled`, `date_created`, `date_updated`) VALUES 
('1801816010882822187','649330b6-c2d7-4edc-be8e-8a54df9eb385','50', 
'{\"provider\":\"OpenAI\",\"baseUrl\":\"https://api.openai.com/v1/chat/completions\",\"model\":\"gpt-4o-mini\",\"apiKey\":\"your_api_key\",\"temperature\":\"0.5\",\"maxTokens\":\"1000\",\"stream\":\"false\",\"prompt\":\"\"}',
 171, 0, '2022-05-25 18:02:53.000', '2022-05-25 18:02:53.000');
+
+INSERT INTO `resource` VALUES ('1844026099075534849', '1346775491550474240', 
'aiProxy', 'aiProxy', '/plug/aiProxy', 'aiProxy', 1, 0, 'pic-center', 0, 0, '', 
1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534850', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.ADD', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:add', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534851', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.QUERY', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:query', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534852', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.EDIT', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:edit', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534853', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.DELETE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:delete', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534854', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.ADD', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:add', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534855', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.QUERY', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:query', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534856', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.EDIT', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:edit', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534857', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.DELETE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:delete', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO `resource` VALUES ('1844026099075534858', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SYNCHRONIZE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxy:modify', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+
+INSERT INTO `permission` VALUES ('1697146860569542741', '1346358560427216896', 
'1844026099075534849', '2023-08-31 06:59:01', '2023-08-31 06:59:01');
+INSERT INTO `permission` VALUES ('1697146860569542742', '1346358560427216896', 
'1844026099075534850', '2023-08-31 07:22:07', '2023-08-31 07:22:07');
+INSERT INTO `permission` VALUES ('1697146860569542743', '1346358560427216896', 
'1844026099075534851', '2023-08-31 07:14:26', '2023-08-31 07:14:26');
+INSERT INTO `permission` VALUES ('1697146860569542744', '1346358560427216896', 
'1844026099075534852', '2023-08-31 07:22:07', '2023-08-31 07:22:07');
+INSERT INTO `permission` VALUES ('1697146860569542745', '1346358560427216896', 
'1844026099075534853', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542746', '1346358560427216896', 
'1844026099075534854', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542747', '1346358560427216896', 
'1844026099075534855', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542748', '1346358560427216896', 
'1844026099075534856', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542749', '1346358560427216896', 
'1844026099075534857', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+INSERT INTO `permission` VALUES ('1697146860569542750', '1346358560427216896', 
'1844026099075534858', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+
+INSERT INTO `plugin_handle` VALUES ('1722804548510507041', '50', 'provider', 
'provider', 3, 1, 0, 
'{\"required\":\"1\",\"defaultValue\":\"OpenAI\",\"placeholder\":\"provider\",\"rule\":\"\"}',
 '2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507042', '50', 'baseUrl', 
'baseUrl', 2, 1, 1, '{\"required\":\"1\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507043', '50', 'model', 
'model', 2, 1, 2, '{\"required\":\"1\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507044', '50', 'apiKey', 
'apiKey', 2, 1, 3, '{\"required\":\"1\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507045', '50', 
'temperature', 'temperature', 2, 1, 4, '{\"required\":\"0\",\"rule\":\"\"}', 
'2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507046', '50', 'maxTokens', 
'maxTokens', 2, 1, 5, '{\"required\":\"0\",\"rule\":\"\", 
\"placeholder\":\"optional,0,0.01~1\"}', '2024-01-02 17:20:50.233', '2024-01-02 
17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507047', '50', 'stream', 
'stream', 3, 1, 6, '{\"defaultValue\":\"false\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO `plugin_handle` VALUES ('1722804548510507048', '50', 'prompt', 
'prompt', 2, 1, 7, '{\"required\":\"0\",\"rule\":\"\"}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
diff --git a/db/upgrade/2.7.0-upgrade-2.7.1-og.sql 
b/db/upgrade/2.7.0-upgrade-2.7.1-og.sql
index e6a15c39dc..35334e9cf4 100644
--- a/db/upgrade/2.7.0-upgrade-2.7.1-og.sql
+++ b/db/upgrade/2.7.0-upgrade-2.7.1-og.sql
@@ -18,7 +18,7 @@
 INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507032', '19', 
'handleType', 'handleType', 2, 3, 1, '{"required":"0","rule":""}', '2025-01-02 
17:20:50.233', '2025-01-02 17:20:50.233');
 
 
-INSERT INTO "public"."plugin" VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 171, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
+INSERT INTO "public"."plugin" VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 200, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
 
 INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507033', '50', 
'provider', 'provider', 3, 3, 1, 
'{"required":"1","defaultValue":"OpenAI","placeholder":"provider","rule":""}', 
'2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
 INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507034', '50', 
'baseUrl', 'baseUrl', 2, 3, 2, '{"required":"1","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
@@ -35,4 +35,35 @@ INSERT INTO "public"."shenyu_dict" VALUES 
('1679002911061737484', 'provider', 'P
 INSERT INTO "public"."shenyu_dict" VALUES ('1679002911061737485', 'provider', 
'PROVIDER_TYPE_OPENAPI', 'OpenAPI', 'OpenAPI', 'OpenAPI', 3, 1, '2024-02-07 
14:31:49', '2024-02-07 14:31:49');
 INSERT INTO "public"."shenyu_dict" VALUES ('1679002911061737486', 'provider', 
'PROVIDER_TYPE_ALIYUN', 'ALiYun', 'ALiYun', 'ALiYun', 4, 1, '2024-02-07 
14:31:49', '2024-02-07 14:31:49');
 
-INSERT INTO "public"."namespace_plugin_rel" VALUES 
('1801816010882822187','649330b6-c2d7-4edc-be8e-8a54df9eb385','50', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 171, 0, '2022-05-25 18:02:53.000', '2022-05-25 18:02:53.000');
\ No newline at end of file
+INSERT INTO "public"."namespace_plugin_rel" VALUES 
('1801816010882822187','649330b6-c2d7-4edc-be8e-8a54df9eb385','50', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 171, 0, '2022-05-25 18:02:53.000', '2022-05-25 18:02:53.000');
+
+INSERT INTO "public"."resource" VALUES ('1844026099075534849', 
'1346775491550474240', 'aiProxy', 'aiProxy', '/plug/aiProxy', 'aiProxy', 1, 0, 
'pic-center', 0, 0, '', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534850', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.ADD', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxySelector:add', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534851', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.QUERY', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxySelector:query', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534852', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.EDIT', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxySelector:edit', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534853', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.DELETE', '', '', '', 2, 
0, '', 1, 0, 'plugin:aiProxySelector:delete', 1, '2022-05-25 18:02:58', 
'2022-05-25 18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534854', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.ADD', '', '', '', 2, 0, '', 
1, 0, 'plugin:aiProxyRule:add', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534855', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.QUERY', '', '', '', 2, 0, '', 
1, 0, 'plugin:aiProxyRule:query', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534856', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.EDIT', '', '', '', 2, 0, '', 
1, 0, 'plugin:aiProxyRule:edit', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534857', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.DELETE', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxyRule:delete', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534858', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SYNCHRONIZE', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxy:modify', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+
+INSERT INTO "public"."permission" VALUES ('1697146860569542741', 
'1346358560427216896', '1844026099075534849', '2023-08-31 06:59:01', 
'2023-08-31 06:59:01');
+INSERT INTO "public"."permission" VALUES ('1697146860569542742', 
'1346358560427216896', '1844026099075534850', '2023-08-31 07:22:07', 
'2023-08-31 07:22:07');
+INSERT INTO "public"."permission" VALUES ('1697146860569542743', 
'1346358560427216896', '1844026099075534851', '2023-08-31 07:14:26', 
'2023-08-31 07:14:26');
+INSERT INTO "public"."permission" VALUES ('1697146860569542744', 
'1346358560427216896', '1844026099075534852', '2023-08-31 07:22:07', 
'2023-08-31 07:22:07');
+INSERT INTO "public"."permission" VALUES ('1697146860569542745', 
'1346358560427216896', '1844026099075534853', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542746', 
'1346358560427216896', '1844026099075534854', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542747', 
'1346358560427216896', '1844026099075534855', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542748', 
'1346358560427216896', '1844026099075534856', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542749', 
'1346358560427216896', '1844026099075534857', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542750', 
'1346358560427216896', '1844026099075534858', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507041', '50', 
'provider', 'provider', 3, 1, 0, 
'{"required":"1","defaultValue":"OpenAI","placeholder":"provider","rule":""}', 
'2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507042', '50', 
'baseUrl', 'baseUrl', 2, 1, 1, '{"required":"1","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507043', '50', 
'model', 'model', 2, 1, 2, '{"required":"1","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507044', '50', 
'apiKey', 'apiKey', 2, 1, 3, '{"required":"1","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507045', '50', 
'temperature', 'temperature', 2, 1, 4, '{"required":"0","rule":""}', 
'2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507046', '50', 
'maxTokens', 'maxTokens', 2, 1, 5, '{"required":"0","rule":"", 
"placeholder":"optional,0,0.01~1"}', '2024-01-02 17:20:50.233', '2024-01-02 
17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507047', '50', 
'stream', 'stream', 3, 1, 6, '{"defaultValue":"false","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507048', '50', 
'prompt', 'prompt', 2, 1, 7, '{"required":"0","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
diff --git a/db/upgrade/2.7.0-upgrade-2.7.1-oracle.sql 
b/db/upgrade/2.7.0-upgrade-2.7.1-oracle.sql
index 6e816981a3..deaab20389 100755
--- a/db/upgrade/2.7.0-upgrade-2.7.1-oracle.sql
+++ b/db/upgrade/2.7.0-upgrade-2.7.1-oracle.sql
@@ -18,7 +18,7 @@
 insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(plugin_id, field, type)) 
*/ into plugin_handle (ID, PLUGIN_ID, FIELD, LABEL, DATA_TYPE, TYPE, SORT, 
EXT_OBJ)
 values ('1722804548510507032', '19', 'handleType', 'handleType', 2, 3, 1, 
'{"required":"0","rule":""}');
 
-INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin(id)) */ INTO plugin (id, name, 
config, role, sort, enabled) VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 171, 0);
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin(id)) */ INTO plugin (id, name, 
config, role, sort, enabled) VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 200, 0);
 
 insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(plugin_id, field, type)) 
*/ into plugin_handle (ID, PLUGIN_ID, FIELD, LABEL, DATA_TYPE, TYPE, SORT, 
EXT_OBJ)
 values ('1722804548510507033', '50', 'provider', 'provider', 3, 3, 1, 
'{"required":"1","defaultValue":"OpenAI","placeholder":"provider","rule":""}');
@@ -59,4 +59,88 @@ VALUES ('1679002911061737485', 'provider', 
'PROVIDER_TYPE_OPENAPI', 'OpenAPI', '
 insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(shenyu_dict(type, dict_code, dict_name)) 
*/ into SHENYU_DICT (ID, TYPE, DICT_CODE, DICT_NAME, DICT_VALUE, "desc", SORT, 
ENABLED)
 VALUES ('1679002911061737486', 'provider', 'PROVIDER_TYPE_ALIYUN', 'ALiYun', 
'ALiYun', 'ALiYun', 4, 1);
 
-INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX (namespace_plugin_rel(id)) */ INTO 
namespace_plugin_rel (id,namespace_id,plugin_id, config, sort, enabled) VALUES 
('1801816010882822187','649330b6-c2d7-4edc-be8e-8a54df9eb385','50', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 171, 0);
\ No newline at end of file
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX (namespace_plugin_rel(id)) */ INTO 
namespace_plugin_rel (id,namespace_id,plugin_id, config, sort, enabled) VALUES 
('1801816010882822187','649330b6-c2d7-4edc-be8e-8a54df9eb385','50', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 171, 0);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534849', '1346775491550474240', 'aiProxy', 'aiProxy', 
'/plug/aiProxy', 'aiProxy', 1, 0, 'pic-center', 0, 0, '', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534850', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.ADD', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:add', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534851', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.QUERY', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:query', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534852', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.EDIT', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:edit', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534853', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SELECTOR.DELETE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxySelector:delete', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534854', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.ADD', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:add', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534855', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.QUERY', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:query', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534856', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.EDIT', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:edit', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534857', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.RULE.DELETE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxyRule:delete', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id, 
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf, 
is_route, perms, status) 
+VALUES ('1844026099075534858', '1844026099075534849', 
'SHENYU.BUTTON.PLUGIN.SYNCHRONIZE', '', '', '', 2, 0, '', 1, 0, 
'plugin:aiProxy:modify', 1);
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542741', '1346358560427216896', '1844026099075534849');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542742', '1346358560427216896', '1844026099075534850');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542743', '1346358560427216896', '1844026099075534851');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542744', '1346358560427216896', '1844026099075534852');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542745', '1346358560427216896', '1844026099075534853');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542746', '1346358560427216896', '1844026099075534854');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542747', '1346358560427216896', '1844026099075534855');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542748', '1346358560427216896', '1844026099075534856');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542749', '1346358560427216896', '1844026099075534857');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(permission(id)) */ INTO permission (id, 
object_id, resource_id) 
+VALUES ('1697146860569542750', '1346358560427216896', '1844026099075534858');
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507041', '50', 'provider', 'provider', 3, 1, 0, 
'{"required":"1","defaultValue":"OpenAI","placeholder":"provider","rule":""}', 
to_timestamp('2024-01-02 17:20:50.233', 'YYYY-MM-DD HH24:MI:SS.FF3'), 
to_timestamp('2024-01-02 17:20:50.233', 'YYYY-MM-DD HH24:MI:SS.FF3'));
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507042', '50', 'baseUrl', 'baseUrl', 2, 1, 1, 
'{"required":"1","rule":""}', to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'), to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'));
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507043', '50', 'model', 'model', 2, 1, 2, 
'{"required":"1","rule":""}', to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'), to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'));
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507044', '50', 'apiKey', 'apiKey', 2, 1, 3, 
'{"required":"1","rule":""}', to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'), to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'));
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507045', '50', 'temperature', 'temperature', 2, 1, 4, 
'{"required":"0","rule":""}', to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'), to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'));
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507046', '50', 'maxTokens', 'maxTokens', 2, 1, 5, 
'{"required":"0","rule":"", "placeholder":"optional,0,0.01~1"}', 
to_timestamp('2024-01-02 17:20:50.233', 'YYYY-MM-DD HH24:MI:SS.FF3'), 
to_timestamp('2024-01-02 17:20:50.233', 'YYYY-MM-DD HH24:MI:SS.FF3'));
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507047', '50', 'stream', 'stream', 3, 1, 6, 
'{"defaultValue":"false","rule":""}', to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'), to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'));
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(plugin_handle(id)) */ INTO plugin_handle 
(id, plugin_id, field, label, data_type, type, sort, ext_obj, date_created, 
date_updated)
+VALUES ('1722804548510507048', '50', 'prompt', 'prompt', 2, 1, 7, 
'{"required":"0","rule":""}', to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'), to_timestamp('2024-01-02 17:20:50.233', 
'YYYY-MM-DD HH24:MI:SS.FF3'));
diff --git a/db/upgrade/2.7.0-upgrade-2.7.1-pg.sql 
b/db/upgrade/2.7.0-upgrade-2.7.1-pg.sql
index 01a8fd5f64..c333b38cd1 100755
--- a/db/upgrade/2.7.0-upgrade-2.7.1-pg.sql
+++ b/db/upgrade/2.7.0-upgrade-2.7.1-pg.sql
@@ -17,7 +17,7 @@
 -- this file works for PostgreSQL, can not use "`" syntax.
 INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507032', '19', 
'handleType', 'handleType', 2, 3, 1, '{"required":"0","rule":""}', '2025-01-02 
17:20:50.233', '2025-01-02 17:20:50.233');
 
-INSERT INTO "public"."plugin" VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 171, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
+INSERT INTO "public"."plugin" VALUES ('50', 'aiProxy', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 'Ai', 200, 0, '2023-12-20 18:02:53', '2023-12-20 18:02:53', null);
 
 INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507033', '50', 
'provider', 'provider', 3, 3, 1, 
'{"required":"1","defaultValue":"OpenAI","placeholder":"provider","rule":""}', 
'2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
 INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507034', '50', 
'baseUrl', 'baseUrl', 2, 3, 2, '{"required":"1","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
@@ -34,4 +34,35 @@ INSERT INTO "public"."shenyu_dict" VALUES 
('1679002911061737484', 'provider', 'P
 INSERT INTO "public"."shenyu_dict" VALUES ('1679002911061737485', 'provider', 
'PROVIDER_TYPE_OPENAPI', 'OpenAPI', 'OpenAPI', 'OpenAPI', 3, 1, '2024-02-07 
14:31:49', '2024-02-07 14:31:49');
 INSERT INTO "public"."shenyu_dict" VALUES ('1679002911061737486', 'provider', 
'PROVIDER_TYPE_ALIYUN', 'ALiYun', 'ALiYun', 'ALiYun', 4, 1, '2024-02-07 
14:31:49', '2024-02-07 14:31:49');
 
-INSERT INTO "public"."namespace_plugin_rel" VALUES 
('1801816010882822187','649330b6-c2d7-4edc-be8e-8a54df9eb385','50', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 171, 0, '2022-05-25 18:02:53.000', '2022-05-25 18:02:53.000');
\ No newline at end of file
+INSERT INTO "public"."namespace_plugin_rel" VALUES 
('1801816010882822187','649330b6-c2d7-4edc-be8e-8a54df9eb385','50', 
'{"provider":"OpenAI","baseUrl":"https://api.openai.com/v1/chat/completions","model":"gpt-4o-mini","apiKey":"your_api_key","temperature":"0.5","maxTokens":"1000","stream":"false","prompt":""}',
 171, 0, '2022-05-25 18:02:53.000', '2022-05-25 18:02:53.000');
+
+INSERT INTO "public"."resource" VALUES ('1844026099075534849', 
'1346775491550474240', 'aiProxy', 'aiProxy', '/plug/aiProxy', 'aiProxy', 1, 0, 
'pic-center', 0, 0, '', 1, '2022-05-25 18:02:58', '2022-05-25 18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534850', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.ADD', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxySelector:add', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534851', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.QUERY', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxySelector:query', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534852', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.EDIT', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxySelector:edit', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534853', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SELECTOR.DELETE', '', '', '', 2, 
0, '', 1, 0, 'plugin:aiProxySelector:delete', 1, '2022-05-25 18:02:58', 
'2022-05-25 18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534854', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.ADD', '', '', '', 2, 0, '', 
1, 0, 'plugin:aiProxyRule:add', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534855', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.QUERY', '', '', '', 2, 0, '', 
1, 0, 'plugin:aiProxyRule:query', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534856', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.EDIT', '', '', '', 2, 0, '', 
1, 0, 'plugin:aiProxyRule:edit', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534857', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.RULE.DELETE', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxyRule:delete', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+INSERT INTO "public"."resource" VALUES ('1844026099075534858', 
'1844026099075534849', 'SHENYU.BUTTON.PLUGIN.SYNCHRONIZE', '', '', '', 2, 0, 
'', 1, 0, 'plugin:aiProxy:modify', 1, '2022-05-25 18:02:58', '2022-05-25 
18:02:58');
+
+INSERT INTO "public"."permission" VALUES ('1697146860569542741', 
'1346358560427216896', '1844026099075534849', '2023-08-31 06:59:01', 
'2023-08-31 06:59:01');
+INSERT INTO "public"."permission" VALUES ('1697146860569542742', 
'1346358560427216896', '1844026099075534850', '2023-08-31 07:22:07', 
'2023-08-31 07:22:07');
+INSERT INTO "public"."permission" VALUES ('1697146860569542743', 
'1346358560427216896', '1844026099075534851', '2023-08-31 07:14:26', 
'2023-08-31 07:14:26');
+INSERT INTO "public"."permission" VALUES ('1697146860569542744', 
'1346358560427216896', '1844026099075534852', '2023-08-31 07:22:07', 
'2023-08-31 07:22:07');
+INSERT INTO "public"."permission" VALUES ('1697146860569542745', 
'1346358560427216896', '1844026099075534853', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542746', 
'1346358560427216896', '1844026099075534854', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542747', 
'1346358560427216896', '1844026099075534855', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542748', 
'1346358560427216896', '1844026099075534856', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542749', 
'1346358560427216896', '1844026099075534857', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+INSERT INTO "public"."permission" VALUES ('1697146860569542750', 
'1346358560427216896', '1844026099075534858', '2023-08-31 07:18:37', 
'2023-08-31 07:18:37');
+
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507041', '50', 
'provider', 'provider', 3, 1, 0, 
'{"required":"1","defaultValue":"OpenAI","placeholder":"provider","rule":""}', 
'2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507042', '50', 
'baseUrl', 'baseUrl', 2, 1, 1, '{"required":"1","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507043', '50', 
'model', 'model', 2, 1, 2, '{"required":"1","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507044', '50', 
'apiKey', 'apiKey', 2, 1, 3, '{"required":"1","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507045', '50', 
'temperature', 'temperature', 2, 1, 4, '{"required":"0","rule":""}', 
'2024-01-02 17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507046', '50', 
'maxTokens', 'maxTokens', 2, 1, 5, '{"required":"0","rule":"", 
"placeholder":"optional,0,0.01~1"}', '2024-01-02 17:20:50.233', '2024-01-02 
17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507047', '50', 
'stream', 'stream', 3, 1, 6, '{"defaultValue":"false","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
+INSERT INTO "public"."plugin_handle" VALUES ('1722804548510507048', '50', 
'prompt', 'prompt', 2, 1, 7, '{"required":"0","rule":""}', '2024-01-02 
17:20:50.233', '2024-01-02 17:20:50.233');
diff --git 
a/shenyu-common/src/main/java/org/apache/shenyu/common/dto/convert/rule/AiProxyHandle.java
 
b/shenyu-common/src/main/java/org/apache/shenyu/common/dto/convert/rule/AiProxyHandle.java
index d9cf581a9d..d6e52f0918 100644
--- 
a/shenyu-common/src/main/java/org/apache/shenyu/common/dto/convert/rule/AiProxyHandle.java
+++ 
b/shenyu-common/src/main/java/org/apache/shenyu/common/dto/convert/rule/AiProxyHandle.java
@@ -17,71 +17,89 @@
 
 package org.apache.shenyu.common.dto.convert.rule;
 
+import org.apache.shenyu.common.enums.AiModelProviderEnum;
+
 import java.util.Objects;
 
 /**
  * this is Ai Proxy plugin handle.
  */
 public class AiProxyHandle {
-
+    
     /**
-     * type.
+     * provider.
      */
-    private String type;
-
+    private String provider;
+    
     /**
      * base url.
      */
     private String baseUrl;
-
+    
     /**
      * api key.
      */
     private String apiKey;
-
+    
     /**
      * model.
      */
     private String model;
-
+    
     /**
      * temperature.
      */
-    private Double temperature;
-
+    private Double temperature = 0.8;
+    
     /**
      * max tokens.
      */
     private Integer maxTokens;
-
+    
     /**
      * prompt.
      */
     private String prompt;
-
+    
     /**
      * stream.
      */
     private Boolean stream = false;
-
+    
     /**
-     * get type.
+     * new default instance.
      *
-     * @return type
+     * @return AiProxyHandle
      */
-    public String getType() {
-        return type;
+    public static AiProxyHandle newDefaultInstance() {
+        AiProxyHandle aiProxyHandle = new AiProxyHandle();
+        aiProxyHandle.setProvider(AiModelProviderEnum.OPEN_AI.getName());
+        aiProxyHandle.setBaseUrl("https://api.openai.com";);
+        aiProxyHandle.setApiKey("your-api-key");
+        aiProxyHandle.setModel("gpt-4o-mini");
+        aiProxyHandle.setTemperature(0.8);
+        aiProxyHandle.setStream(false);
+        return aiProxyHandle;
     }
-
+    
     /**
-     * set type.
+     * get provider.
      *
-     * @param type type
+     * @return provider
      */
-    public void setType(final String type) {
-        this.type = type;
+    public String getProvider() {
+        return provider;
     }
-
+    
+    /**
+     * set provider.
+     *
+     * @param provider provider
+     */
+    public void setProvider(final String provider) {
+        this.provider = provider;
+    }
+    
     /**
      * get base url.
      *
@@ -90,7 +108,7 @@ public class AiProxyHandle {
     public String getBaseUrl() {
         return baseUrl;
     }
-
+    
     /**
      * set base url.
      *
@@ -99,7 +117,7 @@ public class AiProxyHandle {
     public void setBaseUrl(final String baseUrl) {
         this.baseUrl = baseUrl;
     }
-
+    
     /**
      * get api key.
      *
@@ -108,7 +126,7 @@ public class AiProxyHandle {
     public String getApiKey() {
         return apiKey;
     }
-
+    
     /**
      * set api key.
      *
@@ -117,7 +135,7 @@ public class AiProxyHandle {
     public void setApiKey(final String apiKey) {
         this.apiKey = apiKey;
     }
-
+    
     /**
      * get model.
      *
@@ -126,7 +144,7 @@ public class AiProxyHandle {
     public String getModel() {
         return model;
     }
-
+    
     /**
      * set model.
      *
@@ -135,7 +153,7 @@ public class AiProxyHandle {
     public void setModel(final String model) {
         this.model = model;
     }
-
+    
     /**
      * get temperature.
      *
@@ -144,7 +162,7 @@ public class AiProxyHandle {
     public Double getTemperature() {
         return temperature;
     }
-
+    
     /**
      * set temperature.
      *
@@ -153,7 +171,7 @@ public class AiProxyHandle {
     public void setTemperature(final Double temperature) {
         this.temperature = temperature;
     }
-
+    
     /**
      * get max tokens.
      *
@@ -162,7 +180,7 @@ public class AiProxyHandle {
     public Integer getMaxTokens() {
         return maxTokens;
     }
-
+    
     /**
      * set max tokens.
      *
@@ -171,7 +189,7 @@ public class AiProxyHandle {
     public void setMaxTokens(final Integer maxTokens) {
         this.maxTokens = maxTokens;
     }
-
+    
     /**
      * get prompt.
      *
@@ -180,7 +198,7 @@ public class AiProxyHandle {
     public String getPrompt() {
         return prompt;
     }
-
+    
     /**
      * set prompt.
      *
@@ -189,7 +207,7 @@ public class AiProxyHandle {
     public void setPrompt(final String prompt) {
         this.prompt = prompt;
     }
-
+    
     /**
      * get stream.
      *
@@ -198,7 +216,7 @@ public class AiProxyHandle {
     public Boolean getStream() {
         return stream;
     }
-
+    
     /**
      * set stream.
      *
@@ -207,7 +225,7 @@ public class AiProxyHandle {
     public void setStream(final Boolean stream) {
         this.stream = stream;
     }
-
+    
     @Override
     public boolean equals(final Object o) {
         if (this == o) {
@@ -217,7 +235,7 @@ public class AiProxyHandle {
             return false;
         }
         AiProxyHandle that = (AiProxyHandle) o;
-        return Objects.equals(type, that.type)
+        return Objects.equals(provider, that.provider)
                 && Objects.equals(baseUrl, that.baseUrl)
                 && Objects.equals(apiKey, that.apiKey)
                 && Objects.equals(model, that.model)
@@ -226,16 +244,16 @@ public class AiProxyHandle {
                 && Objects.equals(prompt, that.prompt)
                 && Objects.equals(stream, that.stream);
     }
-
+    
     @Override
     public int hashCode() {
-        return Objects.hash(type, baseUrl, apiKey, model, temperature, 
maxTokens, prompt, stream);
+        return Objects.hash(provider, baseUrl, apiKey, model, temperature, 
maxTokens, prompt, stream);
     }
-
+    
     @Override
     public String toString() {
-        return "AiProxyHandle{" + "type='" + type + '\'' + "baseUrl='" + 
baseUrl + '\'' + ", apiKey='" + apiKey + '\''
-                + ", model='" + model
+        return "AiProxyHandle{" + "provider='" + provider + '\'' + "baseUrl='" 
+ baseUrl + '\'' + ", apiKey='" + apiKey
+                + '\'' + ", model='" + model
                 + '\''
                 + ", temperature=" + temperature + ", maxTokens=" + maxTokens
                 + ", prompt='" + prompt + '\'' + ", stream=" + stream + '}';
diff --git 
a/shenyu-common/src/main/java/org/apache/shenyu/common/enums/PluginEnum.java 
b/shenyu-common/src/main/java/org/apache/shenyu/common/enums/PluginEnum.java
index c588aaa937..23b21352d2 100644
--- a/shenyu-common/src/main/java/org/apache/shenyu/common/enums/PluginEnum.java
+++ b/shenyu-common/src/main/java/org/apache/shenyu/common/enums/PluginEnum.java
@@ -270,7 +270,7 @@ public enum PluginEnum {
     /**
      * Ai-proxy plugin enum.
      */
-    AI_PROXY(440, 0, "aiProxy"),
+    AI_PROXY(200, 0, "aiProxy"),
     
     /**
      * Basic-auth plugin enum.
diff --git 
a/shenyu-common/src/main/java/org/apache/shenyu/common/enums/RpcTypeEnum.java 
b/shenyu-common/src/main/java/org/apache/shenyu/common/enums/RpcTypeEnum.java
index 2a513882f2..9292dbbafc 100644
--- 
a/shenyu-common/src/main/java/org/apache/shenyu/common/enums/RpcTypeEnum.java
+++ 
b/shenyu-common/src/main/java/org/apache/shenyu/common/enums/RpcTypeEnum.java
@@ -66,7 +66,12 @@ public enum RpcTypeEnum {
     /**
      * grpc.
      */
-    GRPC("grpc", true);
+    GRPC("grpc", true),
+
+    /**
+     * ai.
+     */
+    AI("ai", true);
 
     private final String name;
 
diff --git 
a/shenyu-common/src/test/java/org/apache/shenyu/common/utils/PluginNameAdapterTest.java
 
b/shenyu-common/src/test/java/org/apache/shenyu/common/utils/PluginNameAdapterTest.java
index 2b83082e4c..212ef64471 100644
--- 
a/shenyu-common/src/test/java/org/apache/shenyu/common/utils/PluginNameAdapterTest.java
+++ 
b/shenyu-common/src/test/java/org/apache/shenyu/common/utils/PluginNameAdapterTest.java
@@ -30,7 +30,8 @@ public class PluginNameAdapterTest {
     @Test
     public void testRpcTypeAdapter() {
         Arrays.stream(RpcTypeEnum.values())
-                .filter(rpcTypeEnum -> 
!RpcTypeEnum.HTTP.getName().equals(rpcTypeEnum.getName()))
+                .filter(rpcTypeEnum -> 
!RpcTypeEnum.HTTP.getName().equals(rpcTypeEnum.getName())
+                        && 
!RpcTypeEnum.AI.getName().equals(rpcTypeEnum.getName()))
                 .forEach(rpcTypeEnum -> 
assertEquals(PluginNameAdapter.rpcTypeAdapter(rpcTypeEnum.getName()),
                         
PluginEnum.getPluginEnumByName(rpcTypeEnum.getName()).getName()));
 
diff --git 
a/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/AiProxyPlugin.java
 
b/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/AiProxyPlugin.java
index ec6a4c72fa..d11f2939d7 100644
--- 
a/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/AiProxyPlugin.java
+++ 
b/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/AiProxyPlugin.java
@@ -17,59 +17,104 @@
 
 package org.apache.shenyu.plugin.ai.proxy;
 
+import org.apache.shenyu.common.constant.Constants;
 import org.apache.shenyu.common.dto.RuleData;
 import org.apache.shenyu.common.dto.SelectorData;
 import org.apache.shenyu.common.dto.convert.plugin.AiProxyConfig;
+import org.apache.shenyu.common.dto.convert.rule.AiProxyHandle;
 import org.apache.shenyu.common.enums.AiModelProviderEnum;
 import org.apache.shenyu.common.enums.PluginEnum;
+import org.apache.shenyu.common.enums.RpcTypeEnum;
 import org.apache.shenyu.common.utils.Singleton;
+import org.apache.shenyu.plugin.ai.proxy.handler.AiProxyPluginHandler;
 import org.apache.shenyu.plugin.ai.proxy.strategy.AiModel;
 import org.apache.shenyu.plugin.ai.proxy.strategy.AiModelFactory;
 import org.apache.shenyu.plugin.api.ShenyuPluginChain;
+import org.apache.shenyu.plugin.api.context.ShenyuContext;
 import org.apache.shenyu.plugin.base.AbstractShenyuPlugin;
-import org.springframework.core.io.buffer.DataBufferUtils;
+import org.apache.shenyu.plugin.base.utils.CacheKeyUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.codec.HttpMessageReader;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
-import java.nio.charset.StandardCharsets;
+import java.util.List;
 import java.util.Objects;
 
 /**
  * this is ai proxy plugin.
  */
 public class AiProxyPlugin extends AbstractShenyuPlugin {
-
+    
+    private static final Logger LOG = 
LoggerFactory.getLogger(AiProxyPlugin.class);
+    
+    private final List<HttpMessageReader<?>> messageReaders;
+    
+    public AiProxyPlugin(final List<HttpMessageReader<?>> messageReaders) {
+        this.messageReaders = messageReaders;
+    }
+    
     @Override
     protected Mono<Void> doExecute(final ServerWebExchange exchange, final 
ShenyuPluginChain chain,
-            final SelectorData selector, final RuleData rule) {
+                                   final SelectorData selector, final RuleData 
rule) {
         AiProxyConfig aiProxyConfig = Singleton.INST.get(AiProxyConfig.class);
         if (Objects.isNull(aiProxyConfig)) {
             return chain.execute(exchange);
         }
-
-        return DataBufferUtils.join(exchange.getRequest().getBody())
-                .flatMap(dataBuffer -> {
-                    byte[] bytes = new byte[dataBuffer.readableByteCount()];
-                    dataBuffer.read(bytes);
-                    DataBufferUtils.release(dataBuffer);
-                    String requestBody = new String(bytes, 
StandardCharsets.UTF_8);
-                    
-                    // choose the model by provider
-                    String provider = aiProxyConfig.getProvider();
-                    AiModelProviderEnum providerEnum = 
AiModelProviderEnum.getByName(provider);
-                    assert Objects.nonNull(providerEnum);
-                    AiModel aiModel = 
AiModelFactory.createAiModel(providerEnum);
-                    assert Objects.nonNull(aiModel);
-                    return aiModel.invoke(aiProxyConfig, exchange, 
requestBody);
-                });
+        final ShenyuContext shenyuContext = 
exchange.getAttribute(Constants.CONTEXT);
+        assert Objects.nonNull(shenyuContext);
+        
+        String rpcType = shenyuContext.getRpcType();
+        String realUrl = shenyuContext.getRealUrl();
+        LOG.info("AiProxyPlugin rpcType:{} realUrl:{}", rpcType, realUrl);
+        // Get selector handle from cache
+        AiProxyHandle selectorHandle = 
AiProxyPluginHandler.SELECTOR_CACHED_HANDLE.get()
+                .obtainHandle(CacheKeyUtils.INST.getKey(selector.getId(), 
Constants.DEFAULT_RULE));
+        
+        // Create final config with selector handle taking precedence
+        if (Objects.nonNull(selectorHandle)) {
+            aiProxyConfig.setProvider(selectorHandle.getProvider());
+            aiProxyConfig.setBaseUrl(selectorHandle.getBaseUrl());
+            aiProxyConfig.setApiKey(selectorHandle.getApiKey());
+            aiProxyConfig.setModel(selectorHandle.getModel());
+            aiProxyConfig.setTemperature(selectorHandle.getTemperature());
+            aiProxyConfig.setMaxTokens(selectorHandle.getMaxTokens());
+            aiProxyConfig.setPrompt(selectorHandle.getPrompt());
+            aiProxyConfig.setStream(selectorHandle.getStream());
+        }
+        
+        shenyuContext.setRpcType(RpcTypeEnum.AI.getName());
+        exchange.getAttributes().put(Constants.CONTEXT, shenyuContext);
+        
+        // set domain
+        // TODO fix the domain
+        //        String domain = aiProxyConfig.getBaseUrl() + realUrl;
+        
+        exchange.getAttributes().put(Constants.HTTP_DOMAIN, 
aiProxyConfig.getBaseUrl());
+        // set the http timeout
+        exchange.getAttributes().put(Constants.HTTP_TIME_OUT, 60 * 3000L);
+        exchange.getAttributes().put(Constants.HTTP_RETRY, 0);
+        
+        String provider = aiProxyConfig.getProvider();
+        AiModelProviderEnum providerEnum = 
AiModelProviderEnum.getByName(provider);
+        if (Objects.isNull(providerEnum)) {
+            return Mono.error(new IllegalArgumentException("Invalid AI model 
provider"));
+        }
+        AiModel aiModel = AiModelFactory.createAiModel(providerEnum);
+        if (Objects.isNull(aiModel)) {
+            return Mono.error(new IllegalStateException("Failed to create AI 
model"));
+        }
+        return aiModel.invoke(aiProxyConfig, exchange, chain, messageReaders);
+        
     }
-
-
+    
+    
     @Override
     public int getOrder() {
         return PluginEnum.AI_PROXY.getCode();
     }
-
+    
     @Override
     public String named() {
         return PluginEnum.AI_PROXY.getName();
diff --git 
a/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/handler/AiProxyPluginHandler.java
 
b/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/handler/AiProxyPluginHandler.java
index e7dff639b5..ad9b49d843 100644
--- 
a/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/handler/AiProxyPluginHandler.java
+++ 
b/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/handler/AiProxyPluginHandler.java
@@ -17,8 +17,9 @@
 
 package org.apache.shenyu.plugin.ai.proxy.handler;
 
+import org.apache.shenyu.common.constant.Constants;
 import org.apache.shenyu.common.dto.PluginData;
-import org.apache.shenyu.common.dto.RuleData;
+import org.apache.shenyu.common.dto.SelectorData;
 import org.apache.shenyu.common.dto.convert.plugin.AiProxyConfig;
 import org.apache.shenyu.common.dto.convert.rule.AiProxyHandle;
 import org.apache.shenyu.common.enums.PluginEnum;
@@ -30,15 +31,14 @@ import org.apache.shenyu.plugin.base.utils.BeanHolder;
 import org.apache.shenyu.plugin.base.utils.CacheKeyUtils;
 
 import java.util.Objects;
-import java.util.Optional;
 import java.util.function.Supplier;
 
 /**
- * this is ai proxy plugin.
+ * this is ai proxy plugin handler.
  */
 public class AiProxyPluginHandler implements PluginDataHandler {
     
-    public static final Supplier<CommonHandleCache<String, AiProxyHandle>> 
CACHED_HANDLE = new BeanHolder<>(CommonHandleCache::new);
+    public static final Supplier<CommonHandleCache<String, AiProxyHandle>> 
SELECTOR_CACHED_HANDLE = new BeanHolder<>(CommonHandleCache::new);
     
     @Override
     public void handlerPlugin(final PluginData pluginData) {
@@ -52,18 +52,17 @@ public class AiProxyPluginHandler implements 
PluginDataHandler {
     }
     
     @Override
-    public void handlerRule(final RuleData ruleData) {
-        Optional.ofNullable(ruleData.getHandle())
-                .ifPresent(s -> {
-                    AiProxyHandle aiProxyHandle = 
GsonUtils.getInstance().fromJson(s, AiProxyHandle.class);
-                    
CACHED_HANDLE.get().cachedHandle(CacheKeyUtils.INST.getKey(ruleData), 
aiProxyHandle);
-                });
+    public void handlerSelector(final SelectorData selectorData) {
+        if (Objects.isNull(selectorData.getHandle())) {
+            return;
+        }
+        AiProxyHandle aiProxyHandle = 
GsonUtils.getInstance().fromJson(selectorData.getHandle(), AiProxyHandle.class);
+        
SELECTOR_CACHED_HANDLE.get().cachedHandle(CacheKeyUtils.INST.getKey(selectorData.getId(),
 Constants.DEFAULT_RULE), aiProxyHandle);
     }
     
     @Override
-    public void removeRule(final RuleData ruleData) {
-        Optional.ofNullable(ruleData)
-                .ifPresent(s -> 
CACHED_HANDLE.get().removeHandle(CacheKeyUtils.INST.getKey(ruleData)));
+    public void removeSelector(final SelectorData selectorData) {
+        
SELECTOR_CACHED_HANDLE.get().removeHandle(CacheKeyUtils.INST.getKey(selectorData.getId(),
 Constants.DEFAULT_RULE));
     }
     
     @Override
diff --git 
a/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/strategy/AiModel.java
 
b/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/strategy/AiModel.java
index d08332c60b..b30adf4a55 100644
--- 
a/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/strategy/AiModel.java
+++ 
b/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/strategy/AiModel.java
@@ -18,13 +18,26 @@
 package org.apache.shenyu.plugin.ai.proxy.strategy;
 
 import org.apache.shenyu.common.dto.convert.plugin.AiProxyConfig;
+import org.apache.shenyu.plugin.api.ShenyuPluginChain;
+import org.springframework.http.codec.HttpMessageReader;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
+import java.util.List;
+
 /**
  * The interface Ai model.
  */
 public interface AiModel {
     
-    Mono<Void> invoke(AiProxyConfig aiProxyConfig, ServerWebExchange exchange, 
String requestBody);
+    /**
+     * Invoke mono.
+     *
+     * @param aiProxyConfig  the ai proxy config
+     * @param exchange       the exchange
+     * @param chain          the chain
+     * @param messageReaders the message readers
+     * @return the mono
+     */
+    Mono<Void> invoke(AiProxyConfig aiProxyConfig, ServerWebExchange exchange, 
ShenyuPluginChain chain, List<HttpMessageReader<?>> messageReaders);
 }
diff --git 
a/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/strategy/openai/OpenAI.java
 
b/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/strategy/openai/OpenAI.java
index 1e1c41ce53..a1c7b84e13 100644
--- 
a/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/strategy/openai/OpenAI.java
+++ 
b/shenyu-plugin/shenyu-plugin-ai-proxy/src/main/java/org/apache/shenyu/plugin/ai/proxy/strategy/openai/OpenAI.java
@@ -17,145 +17,65 @@
 
 package org.apache.shenyu.plugin.ai.proxy.strategy.openai;
 
-import okhttp3.Call;
-import okhttp3.Callback;
-import okhttp3.MediaType;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.RequestBody;
-import okhttp3.Response;
-import okhttp3.ResponseBody;
-import okio.BufferedSource;
 import org.apache.shenyu.common.constant.Constants;
 import org.apache.shenyu.common.dto.convert.plugin.AiProxyConfig;
 import org.apache.shenyu.common.utils.GsonUtils;
 import org.apache.shenyu.plugin.ai.proxy.strategy.AiModel;
-import org.jetbrains.annotations.NotNull;
-import org.reactivestreams.Publisher;
-import org.springframework.core.io.buffer.DataBuffer;
+import org.apache.shenyu.plugin.api.ShenyuPluginChain;
+import org.apache.shenyu.plugin.api.exception.ResponsiveException;
+import org.apache.shenyu.plugin.api.utils.WebFluxResultUtils;
+import org.apache.shenyu.plugin.base.utils.ServerWebExchangeUtils;
 import org.springframework.http.HttpHeaders;
-import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.http.MediaType;
+import org.springframework.http.codec.HttpMessageReader;
 import org.springframework.web.server.ServerWebExchange;
-import reactor.core.publisher.Flux;
-import reactor.core.publisher.FluxSink;
 import reactor.core.publisher.Mono;
 
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
+import java.util.List;
 import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.TimeUnit;
 
 /**
  * The OpenAI model.
  */
 public class OpenAI implements AiModel {
     
-    private final OkHttpClient client = new OkHttpClient.Builder()
-            .connectTimeout(30, TimeUnit.SECONDS)
-            .writeTimeout(5, TimeUnit.MINUTES)
-            .readTimeout(5, TimeUnit.MINUTES)
-            .build();
-    
     @Override
     public Mono<Void> invoke(final AiProxyConfig aiProxyConfig, final 
ServerWebExchange exchange,
-                             final String requestBody) {
-        Map<String, Object> paramMap = 
GsonUtils.getInstance().convertToMap(requestBody);
-        paramMap.put(Constants.MODEL, aiProxyConfig.getModel());
-        paramMap.put(Constants.STREAM, aiProxyConfig.getStream());
-        paramMap.put(Constants.PROMPT, aiProxyConfig.getPrompt());
-        
-        RequestBody body = 
RequestBody.create(MediaType.parse("application/json"),
-                GsonUtils.getInstance().toJson(paramMap));
-        Request request = buildRequest(aiProxyConfig, body);
-        
-        return aiProxyConfig.getStream()
-                ? handleStreamResponse(exchange, request)
-                : handleNormalResponse(exchange, request);
-    }
-    
-    private Request buildRequest(final AiProxyConfig config, final RequestBody 
body) {
-        return new Request.Builder()
-                .url(config.getBaseUrl())
-                .post(body)
-                .addHeader("Content-Type", "application/json")
-                .addHeader("Authorization", "Bearer " + config.getApiKey())
+                             final ShenyuPluginChain chain,
+                             final List<HttpMessageReader<?>> messageReaders) {
+        ServerWebExchange modifiedExchange = exchange.mutate()
+                .request(originalRequest -> originalRequest
+                        .headers(httpHeaders -> convertHeader(httpHeaders, 
aiProxyConfig))
+                        .method(exchange.getRequest().getMethod())
+                )
                 .build();
+        return ServerWebExchangeUtils.rewriteRequestBody(modifiedExchange, 
messageReaders, originalBody ->
+                        Mono.just(convertBody(originalBody, aiProxyConfig))
+                ).flatMap(chain::execute)
+                .onErrorResume(error -> {
+                    if (error instanceof ResponsiveException) {
+                        return 
WebFluxResultUtils.failedResult((ResponsiveException) error);
+                    }
+                    return Mono.error(error);
+                });
     }
     
-    private Mono<Void> handleStreamResponse(final ServerWebExchange exchange, 
final Request request) {
-        ServerHttpResponse exchangeResponse = exchange.getResponse();
-        exchangeResponse.getHeaders().set(HttpHeaders.CONTENT_TYPE,
-                org.springframework.http.MediaType.TEXT_EVENT_STREAM_VALUE);
-        exchangeResponse.getHeaders().set(HttpHeaders.CACHE_CONTROL, 
"no-cache");
-        exchangeResponse.getHeaders().set(HttpHeaders.CONNECTION, 
"keep-alive");
-        
-        return exchangeResponse.writeAndFlushWith(
-                Flux.<Publisher<DataBuffer>>create(
-                        sink -> client.newCall(request).enqueue(new 
StreamResponseCallback(sink, exchangeResponse)),
-                        FluxSink.OverflowStrategy.BUFFER));
-    }
     
-    private Mono<Void> handleNormalResponse(final ServerWebExchange exchange, 
final Request request) {
-        return Mono.create(sink -> {
-            try (Response response = client.newCall(request).execute()) {
-                if (!response.isSuccessful()) {
-                    sink.error(new IOException("Request failed: " + response));
-                    return;
-                }
-                
-                String responseBody = response.body().string();
-                
exchange.getResponse().getHeaders().setContentType(org.springframework.http.MediaType.APPLICATION_JSON);
-                exchange.getResponse().writeWith(
-                                
Mono.just(exchange.getResponse().bufferFactory()
-                                        
.wrap(responseBody.getBytes(StandardCharsets.UTF_8))))
-                        .subscribe(v -> sink.success(), sink::error);
-            } catch (IOException e) {
-                sink.error(e);
-            }
-        });
+    private static void convertHeader(final HttpHeaders httpHeaders, final 
AiProxyConfig aiProxyConfig) {
+        httpHeaders.add("Authorization", "Bearer " + 
aiProxyConfig.getApiKey());
+        if (aiProxyConfig.getStream()) {
+            httpHeaders.add(HttpHeaders.CONTENT_TYPE, 
MediaType.TEXT_EVENT_STREAM_VALUE);
+            httpHeaders.add(HttpHeaders.CACHE_CONTROL, "no-cache");
+            httpHeaders.add(HttpHeaders.CONNECTION, "keep-alive");
+        }
     }
     
-    private record StreamResponseCallback(FluxSink<Publisher<DataBuffer>> 
sink, ServerHttpResponse response) implements Callback {
-        
-        @Override
-        public void onFailure(@NotNull final Call call, @NotNull final 
IOException e) {
-            sink.error(e);
-        }
-        
-        @Override
-        public void onResponse(@NotNull final Call call, @NotNull final 
Response response) {
-            try (ResponseBody responseBody = response.body()) {
-                if (!response.isSuccessful() || Objects.isNull(responseBody)) {
-                    sink.error(new IOException("Request failed: " + response));
-                    return;
-                }
-                
-                processStreamResponse(responseBody);
-                sink.complete();
-            } catch (IOException e) {
-                sink.error(e);
-            }
-        }
-        
-        private void processStreamResponse(final ResponseBody responseBody) 
throws IOException {
-            BufferedSource source = responseBody.source();
-            while (!source.exhausted()) {
-                String line = source.readUtf8Line();
-                if (Objects.isNull(line)) {
-                    break;
-                }
-                
-                if (line.startsWith("data: ")) {
-                    String data = line.substring(6).trim();
-                    if (!"[DONE]".equals(data)) {
-                        DataBuffer buffer = response.bufferFactory()
-                                .wrap((data + 
"\n").getBytes(StandardCharsets.UTF_8));
-                        sink.next(Flux.just(buffer));
-                    }
-                }
-            }
-        }
+    private String convertBody(final String originalBody, final AiProxyConfig 
aiProxyConfig) {
+        Map<String, Object> requestBodyMap = 
GsonUtils.getInstance().convertToMap(originalBody);
+        requestBodyMap.put(Constants.MODEL, aiProxyConfig.getModel());
+        requestBodyMap.put(Constants.STREAM, aiProxyConfig.getStream());
+        requestBodyMap.put(Constants.PROMPT, aiProxyConfig.getPrompt());
+        return GsonUtils.getInstance().toJson(requestBodyMap);
     }
     
 }
diff --git 
a/shenyu-plugin/shenyu-plugin-api/src/main/java/org/apache/shenyu/plugin/api/ShenyuPlugin.java
 
b/shenyu-plugin/shenyu-plugin-api/src/main/java/org/apache/shenyu/plugin/api/ShenyuPlugin.java
index bf08236c94..1d1fbe7c4a 100644
--- 
a/shenyu-plugin/shenyu-plugin-api/src/main/java/org/apache/shenyu/plugin/api/ShenyuPlugin.java
+++ 
b/shenyu-plugin/shenyu-plugin-api/src/main/java/org/apache/shenyu/plugin/api/ShenyuPlugin.java
@@ -129,7 +129,7 @@ public interface ShenyuPlugin {
      * @return http/spring cloud return true, others false.
      */
     default boolean skipExceptHttpLike(ServerWebExchange exchange) {
-        return !skip(exchange, RpcTypeEnum.HTTP, RpcTypeEnum.SPRING_CLOUD);
+        return !skip(exchange, RpcTypeEnum.HTTP, RpcTypeEnum.SPRING_CLOUD, 
RpcTypeEnum.AI);
     }
 
     /**
diff --git 
a/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/NettyClientMessageWriter.java
 
b/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/NettyClientMessageWriter.java
index 93ce9cb511..c548a77166 100644
--- 
a/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/NettyClientMessageWriter.java
+++ 
b/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/NettyClientMessageWriter.java
@@ -84,7 +84,7 @@ public class NettyClientMessageWriter implements 
MessageWriter {
     
     @Override
     public List<String> supportTypes() {
-        return Lists.newArrayList(RpcTypeEnum.HTTP.getName(), 
RpcTypeEnum.SPRING_CLOUD.getName(), RpcTypeEnum.WEB_SOCKET.getName());
+        return Lists.newArrayList(RpcTypeEnum.HTTP.getName(), 
RpcTypeEnum.SPRING_CLOUD.getName(), RpcTypeEnum.WEB_SOCKET.getName(), 
RpcTypeEnum.AI.getName());
     }
     
     private void cleanup(final ServerWebExchange exchange) {
diff --git 
a/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/WebClientMessageWriter.java
 
b/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/WebClientMessageWriter.java
index c55cc2930d..c3f9de6b8a 100644
--- 
a/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/WebClientMessageWriter.java
+++ 
b/shenyu-plugin/shenyu-plugin-response/src/main/java/org/apache/shenyu/plugin/response/strategy/WebClientMessageWriter.java
@@ -97,7 +97,7 @@ public class WebClientMessageWriter implements MessageWriter {
 
     @Override
     public List<String> supportTypes() {
-        return Lists.newArrayList(RpcTypeEnum.HTTP.getName(), 
RpcTypeEnum.SPRING_CLOUD.getName(), RpcTypeEnum.WEB_SOCKET.getName());
+        return Lists.newArrayList(RpcTypeEnum.HTTP.getName(), 
RpcTypeEnum.SPRING_CLOUD.getName(), RpcTypeEnum.WEB_SOCKET.getName(), 
RpcTypeEnum.AI.getName());
     }
 
     private void redrawResponseHeaders(final ServerHttpResponse response,
diff --git 
a/shenyu-spring-boot-starter/shenyu-spring-boot-starter-plugin/shenyu-spring-boot-starter-plugin-ai-proxy/src/main/java/org/apache/shenyu/springboot/starter/plugin/ai/proxy/AiProxyPluginConfiguration.java
 
b/shenyu-spring-boot-starter/shenyu-spring-boot-starter-plugin/shenyu-spring-boot-starter-plugin-ai-proxy/src/main/java/org/apache/shenyu/springboot/starter/plugin/ai/proxy/AiProxyPluginConfiguration.java
index 70e4c0b493..e8759d575e 100644
--- 
a/shenyu-spring-boot-starter/shenyu-spring-boot-starter-plugin/shenyu-spring-boot-starter-plugin-ai-proxy/src/main/java/org/apache/shenyu/springboot/starter/plugin/ai/proxy/AiProxyPluginConfiguration.java
+++ 
b/shenyu-spring-boot-starter/shenyu-spring-boot-starter-plugin/shenyu-spring-boot-starter-plugin-ai-proxy/src/main/java/org/apache/shenyu/springboot/starter/plugin/ai/proxy/AiProxyPluginConfiguration.java
@@ -23,6 +23,7 @@ import org.apache.shenyu.plugin.api.ShenyuPlugin;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.http.codec.ServerCodecConfigurer;
 
 /**
  * The type ai proxy plugin configuration.
@@ -34,11 +35,12 @@ public class AiProxyPluginConfiguration {
     /**
      * Ai proxy plugin.
      *
+     * @param configurer the configurer
      * @return the shenyu plugin
      */
     @Bean
-    public ShenyuPlugin aiProxyPlugin() {
-        return new AiProxyPlugin();
+    public ShenyuPlugin aiProxyPlugin(final ServerCodecConfigurer configurer) {
+        return new AiProxyPlugin(configurer.getReaders());
     }
     
     /**

Reply via email to