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

urfree pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git


The following commit(s) were added to refs/heads/main by this push:
     new 13052ff1e77 Docs sync done from apache/pulsar(#c642731)
13052ff1e77 is described below

commit 13052ff1e778bd3430ce1d31de62a1193fb14e66
Author: Pulsar Site Updater <[email protected]>
AuthorDate: Tue May 31 06:05:46 2022 +0000

    Docs sync done from apache/pulsar(#c642731)
---
 site2/website-next/docs/admin-api-brokers.md       |  36 ++---
 site2/website-next/docs/admin-api-clusters.md      |  36 ++---
 site2/website-next/docs/admin-api-functions.md     |  48 +++---
 site2/website-next/docs/admin-api-namespaces.md    |  64 ++++----
 site2/website-next/docs/admin-api-overview.md      |   2 +-
 site2/website-next/docs/admin-api-packages.md      |  42 +++---
 site2/website-next/docs/admin-api-permissions.md   |   6 +-
 site2/website-next/docs/admin-api-tenants.md       |  30 ++--
 site2/website-next/docs/admin-api-topics.md        | 162 ++++++++++-----------
 site2/website-next/docs/administration-geo.md      |   2 +-
 .../website-next/docs/administration-isolation.md  |  12 +-
 site2/website-next/docs/client-libraries-java.md   |   8 +-
 site2/website-next/docs/concepts-messaging.md      |   2 +-
 .../docs/concepts-proxy-sni-routing.md             |   2 +-
 .../docs/cookbooks-retention-expiry.md             |  16 +-
 site2/website-next/docs/functions-develop.md       |  26 ++--
 site2/website-next/docs/io-overview.md             |   4 +-
 site2/website-next/docs/io-use.md                  |  40 ++---
 site2/website-next/docs/schema-manage.md           |  22 +--
 site2/website-next/docs/security-encryption.md     |   4 +-
 site2/website-next/docs/security-extending.md      |  18 ++-
 site2/website-next/docs/security-jwt.md            |   2 +-
 site2/website-next/docs/security-overview.md       |   2 +-
 23 files changed, 300 insertions(+), 286 deletions(-)

diff --git a/site2/website-next/docs/admin-api-brokers.md 
b/site2/website-next/docs/admin-api-brokers.md
index adaeb73cece..2066d1510d1 100644
--- a/site2/website-next/docs/admin-api-brokers.md
+++ b/site2/website-next/docs/admin-api-brokers.md
@@ -42,9 +42,9 @@ In addition to being configurable when you start them up, 
brokers can also be [d
 Fetch all available active brokers that are serving traffic.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 ```shell
@@ -65,7 +65,7 @@ broker1.use.org.com:8080
 {@inject: 
endpoint|GET|/admin/v2/brokers/:cluster|operation/getActiveBrokers?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
@@ -83,9 +83,9 @@ admin.brokers().getActiveBrokers(clusterName)
 Fetch the information of the leader broker, for example, the service url.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 ```shell
@@ -106,7 +106,7 @@ BrokerInfo(serviceUrl=broker1.use.org.com:8080)
 {@inject: 
endpoint|GET|/admin/v2/brokers/leaderBroker?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
@@ -126,9 +126,9 @@ For the detail of the code above, see 
[here](https://github.com/apache/pulsar/bl
 It finds all namespaces which are owned and served by a given broker.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 ```shell
@@ -156,7 +156,7 @@ $ pulsar-admin brokers namespaces use \
 {@inject: 
endpoint|GET|/admin/v2/brokers/:cluster/:broker/ownedNamespaces|operation/getOwnedNamespaes?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
@@ -181,9 +181,9 @@ But since all broker configuration in Pulsar is stored in 
ZooKeeper, configurati
 ### Update dynamic configuration
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 The [`update-dynamic-config`](/tools/pulsar-admin/) subcommand will update 
existing configuration. It takes two arguments: the name of the parameter and 
the new value using the `config` and `value` flag respectively. Here's an 
example for the 
[`brokerShutdownTimeoutMs`](reference-configuration.md#broker-brokerShutdownTimeoutMs)
 parameter:
@@ -200,7 +200,7 @@ $ pulsar-admin brokers update-dynamic-config --config 
brokerShutdownTimeoutMs --
 {@inject: 
endpoint|POST|/admin/v2/brokers/configuration/:configName/:configValue|operation/updateDynamicConfiguration?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
@@ -217,9 +217,9 @@ admin.brokers().updateDynamicConfiguration(configName, 
configValue);
 
 Fetch a list of all potentially updatable configuration parameters.
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 ```shell
@@ -235,7 +235,7 @@ brokerShutdownTimeoutMs
 {@inject: 
endpoint|GET|/admin/v2/brokers/configuration|operation/getDynamicConfigurationName?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
@@ -253,9 +253,9 @@ admin.brokers().getDynamicConfigurationNames();
 Fetch a list of all parameters that have been dynamically updated.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 ```shell
@@ -271,7 +271,7 @@ brokerShutdownTimeoutMs:100
 {@inject: 
endpoint|GET|/admin/v2/brokers/configuration/values|operation/getAllDynamicConfigurations?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
diff --git a/site2/website-next/docs/admin-api-clusters.md 
b/site2/website-next/docs/admin-api-clusters.md
index 64875cde8b5..2a5fb33743c 100644
--- a/site2/website-next/docs/admin-api-clusters.md
+++ b/site2/website-next/docs/admin-api-clusters.md
@@ -38,9 +38,9 @@ New clusters can be provisioned using the admin interface.
 > Please note that this operation requires superuser privileges.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 You can provision a new cluster using the [`create`](/tools/pulsar-admin/) 
subcommand. Here's an example:
@@ -59,7 +59,7 @@ $ pulsar-admin clusters create cluster-1 \
 {@inject: 
endpoint|PUT|/admin/v2/clusters/:cluster|operation/createCluster?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
@@ -119,9 +119,9 @@ You'll need to use `--*-tls` flags only if you're using 
[TLS authentication](sec
 You can fetch the [configuration](reference-configuration) for an existing 
cluster at any time.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 Use the [`get`](/tools/pulsar-admin/) subcommand and specify the name of the 
cluster. Here's an example:
@@ -145,7 +145,7 @@ $ pulsar-admin clusters get cluster-1
 {@inject: 
endpoint|GET|/admin/v2/clusters/:cluster|operation/getCluster?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
@@ -163,9 +163,9 @@ admin.clusters().getCluster(clusterName);
 You can update the configuration for an existing cluster at any time.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 Use the [`update`](/tools/pulsar-admin/) subcommand and specify new 
configuration values using flags.
@@ -184,7 +184,7 @@ $ pulsar-admin clusters update cluster-1 \
 {@inject: 
endpoint|POST|/admin/v2/clusters/:cluster|operation/updateCluster?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
@@ -208,9 +208,9 @@ admin.clusters().updateCluster(clusterName, clusterData);
 Clusters can be deleted from a Pulsar 
[instance](reference-terminology.md#instance).
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 Use the [`delete`](/tools/pulsar-admin/) subcommand and specify the name of 
the cluster.
@@ -227,7 +227,7 @@ $ pulsar-admin clusters delete cluster-1
 {@inject: 
endpoint|DELETE|/admin/v2/clusters/:cluster|operation/deleteCluster?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
@@ -245,9 +245,9 @@ admin.clusters().deleteCluster(clusterName);
 You can fetch a list of all clusters in a Pulsar 
[instance](reference-terminology.md#instance).
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 Use the [`list`](/tools/pulsar-admin/) subcommand.
@@ -266,7 +266,7 @@ cluster-2
 {@inject: 
endpoint|GET|/admin/v2/clusters|operation/getClusters?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
@@ -284,9 +284,9 @@ admin.clusters().getClusters();
 Peer clusters can be configured for a given cluster in a Pulsar 
[instance](reference-terminology.md#instance).
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 Use the [`update-peer-clusters`](/tools/pulsar-admin/) subcommand and specify 
the list of peer-cluster names.
@@ -303,7 +303,7 @@ $ pulsar-admin update-peer-clusters cluster-1 
--peer-clusters cluster-2
 {@inject: 
endpoint|POST|/admin/v2/clusters/:cluster/peers|operation/setPeerClusterNames?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
diff --git a/site2/website-next/docs/admin-api-functions.md 
b/site2/website-next/docs/admin-api-functions.md
index f2f2cd8471a..58a171f1ff6 100644
--- a/site2/website-next/docs/admin-api-functions.md
+++ b/site2/website-next/docs/admin-api-functions.md
@@ -43,7 +43,7 @@ You can perform the following operations on functions.
 You can create a Pulsar function in cluster mode (deploy it on a Pulsar 
cluster) using Admin CLI, REST API or Java Admin API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -101,9 +101,9 @@ admin.functions().createFunction(functionConfig, fileName);
 You can update a Pulsar function that has been deployed to a Pulsar cluster 
using Admin CLI, REST API or Java Admin API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
-  values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST Admin 
API","value":"REST Admin API"},{"label":"Java Admin API","value":"Java Admin 
API"}]}>
+  values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
 
 Use the [`update`](/tools/pulsar-admin/) subcommand. 
@@ -122,7 +122,7 @@ $ pulsar-admin functions update \
 ```
 
 </TabItem>
-<TabItem value="REST Admin API">
+<TabItem value="REST API">
 
 {@inject: 
endpoint|PUT|/admin/v3/functions/:tenant/:namespace/:functionName?version=@pulsar:version_number@}
 
@@ -154,7 +154,7 @@ admin.functions().updateFunction(functionConfig, 
userCodeFile, updateOptions);
 You can start a stopped function instance with `instance-id` using Admin CLI, 
REST API or Java Admin API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -195,9 +195,9 @@ admin.functions().startFunction(tenant, namespace, 
functionName, Integer.parseIn
 You can start all stopped function instances using Admin CLI, REST API or Java 
Admin API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
-  values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+  values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
 
 Use the [`start`](/tools/pulsar-admin/) subcommand. 
@@ -219,7 +219,7 @@ $ pulsar-admin functions start \
 {@inject: 
endpoint|POST|/admin/v3/functions/:tenant/:namespace/:functionName/start?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="Java">
+<TabItem value="Java Admin API">
 
 ```java
 
@@ -237,7 +237,7 @@ admin.functions().startFunction(tenant, namespace, 
functionName);
 You can stop a function instance with `instance-id` using Admin CLI, REST API 
or Java Admin API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -280,7 +280,7 @@ admin.functions().stopFunction(tenant, namespace, 
functionName, Integer.parseInt
 You can stop all function instances using Admin CLI, REST API or Java Admin 
API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -322,7 +322,7 @@ admin.functions().stopFunction(tenant, namespace, 
functionName);
 Restart a function instance with `instance-id` using Admin CLI, REST API or 
Java Admin API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -365,7 +365,7 @@ admin.functions().restartFunction(tenant, namespace, 
functionName, Integer.parse
 You can restart all function instances using Admin CLI, REST API or Java admin 
API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -407,7 +407,7 @@ admin.functions().restartFunction(tenant, namespace, 
functionName);
 You can list all Pulsar functions running under a specific tenant and 
namespace using Admin CLI, REST API or Java Admin API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -448,7 +448,7 @@ admin.functions().getFunctions(tenant, namespace);
 You can delete a Pulsar function that is running on a Pulsar cluster using 
Admin CLI, REST API or Java Admin API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -490,7 +490,7 @@ admin.functions().deleteFunction(tenant, namespace, 
functionName);
 You can get information about a Pulsar function currently running in cluster 
mode using Admin CLI, REST API or Java Admin API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -531,7 +531,7 @@ admin.functions().getFunction(tenant, namespace, 
functionName);
 
 You can get the current status of a Pulsar function instance with 
`instance-id` using Admin CLI, REST API or Java Admin API.
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -574,7 +574,7 @@ admin.functions().getFunctionStatus(tenant, namespace, 
functionName, Integer.par
 You can get the current status of a Pulsar function instance using Admin CLI, 
REST API or Java Admin API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -615,7 +615,7 @@ admin.functions().getFunctionStatus(tenant, namespace, 
functionName);
 
 You can get the current stats of a Pulsar Function instance with `instance-id` 
using Admin CLI, REST API or Java admin API.
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -658,7 +658,7 @@ admin.functions().getFunctionStats(tenant, namespace, 
functionName, Integer.pars
 You can get the current stats of a Pulsar function using Admin CLI, REST API 
or Java admin API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -700,7 +700,7 @@ admin.functions().getFunctionStats(tenant, namespace, 
functionName);
 You can trigger a specified Pulsar function with a supplied value using Admin 
CLI, REST API or Java admin API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -745,7 +745,7 @@ admin.functions().triggerFunction(tenant, namespace, 
functionName, topic, trigge
 You can put the state associated with a Pulsar function using Admin CLI, REST 
API or Java admin API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
@@ -790,9 +790,9 @@ admin.functions().putFunctionState(tenant, namespace, 
functionName, stateRepr);
 You can fetch the current state associated with a Pulsar function using Admin 
CLI, REST API or Java admin API.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
-  values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin CLI","value":"Java Admin CLI"}]}>
+  values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 <TabItem value="Admin CLI">
 
 Use the [`querystate`](/tools/pulsar-admin/) subcommand. 
@@ -815,7 +815,7 @@ $ pulsar-admin functions querystate \
 {@inject: 
endpoint|GET|/admin/v3/functions/:tenant/:namespace/:functionName/state/:key?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="Java Admin CLI">
+<TabItem value="Java Admin API">
 
 ```java
 
diff --git a/site2/website-next/docs/admin-api-namespaces.md 
b/site2/website-next/docs/admin-api-namespaces.md
index 55ddc6696b5..794c27ec5d2 100644
--- a/site2/website-next/docs/admin-api-namespaces.md
+++ b/site2/website-next/docs/admin-api-namespaces.md
@@ -35,7 +35,7 @@ Namespaces can be managed via:
 You can create new namespaces under a given 
[tenant](reference-terminology.md#tenant).
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -76,7 +76,7 @@ admin.namespaces().createNamespace(namespace);
 You can fetch the current policies associated with a namespace at any time.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -138,7 +138,7 @@ admin.namespaces().getPolicies(namespace);
 You can list all namespaces within a given Pulsar 
[tenant](reference-terminology.md#tenant).
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -181,7 +181,7 @@ admin.namespaces().getNamespaces(tenant);
 You can delete existing namespaces from a tenant.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -224,7 +224,7 @@ admin.namespaces().deleteNamespace(namespace);
 You can set replication clusters for a namespace to enable Pulsar to 
internally replicate the published messages from one colocation facility to 
another.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -264,7 +264,7 @@ 
admin.namespaces().setNamespaceReplicationClusters(namespace, clusters);
 You can get the list of replication clusters for a given namespace.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -319,7 +319,7 @@ Backlog quota helps the broker to restrict 
bandwidth/storage of a namespace once
 Backlog quota restriction can be taken care by defining restriction of 
backlog-quota-type: destination_storage.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -358,7 +358,7 @@ admin.namespaces().setBacklogQuota(namespace, new 
BacklogQuota(limit, limitTime,
 You can get a configured backlog quota for a given namespace.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -408,7 +408,7 @@ admin.namespaces().getBacklogQuotaMap(namespace);
 You can remove backlog quota policies for a given namespace.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -457,7 +457,7 @@ Persistence policies allow users to configure 
persistency-level for all topic me
   -   Ml-mark-delete-max-rate: Throttling rate of mark-delete operation (0 
means no throttle), default: 0.0
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -496,7 +496,7 @@ admin.namespaces().setPersistence(namespace,new 
PersistencePolicies(bookkeeperEn
 You can get the configured persistence policies of a given namespace.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -548,7 +548,7 @@ admin.namespaces().getPersistence(namespace)
 The namespace bundle is a virtual group of topics which belong to the same 
namespace. If the broker gets overloaded with the number of bundles, this 
command can help unload a bundle from that broker, so it can be served by some 
other less-loaded brokers. The namespace bundle ID ranges from 0x00000000 to 
0xffffffff.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -587,7 +587,7 @@ admin.namespaces().unloadNamespaceBundle(namespace, bundle)
 One namespace bundle can contain multiple topics but can be served by only one 
broker. If a single bundle is creating an excessive load on a broker, an admin 
can split the bundle using the command below, permitting one or more of the new 
bundles to be unloaded, thus balancing the load across the brokers.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -628,7 +628,7 @@ admin.namespaces().splitNamespaceBundle(namespace, bundle)
 You can configure the time to live (in seconds) duration for messages. In the 
example below, the message-ttl is set as 100s.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -667,7 +667,7 @@ admin.namespaces().setNamespaceMessageTTL(namespace, 
messageTTL)
 When the message-ttl for a namespace is set, you can use the command below to 
get the configured value. This example comtinues the example of the command 
`set message-ttl`, so the returned value is 100(s).
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -724,7 +724,7 @@ admin.namespaces().getNamespaceMessageTTL(namespace)
 Remove a message TTL of the configured namespace.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -766,7 +766,7 @@ admin.namespaces().removeNamespaceMessageTTL(namespace)
 It clears all message backlog for all the topics that belong to a specific 
namespace. You can also clear backlog for a specific subscription as well.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -805,7 +805,7 @@ 
admin.namespaces().clearNamespaceBacklogForSubscription(namespace, subscription)
 It clears all message backlog for all the topics that belong to a specific 
NamespaceBundle. You can also clear backlog for a specific subscription as well.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -846,7 +846,7 @@ 
admin.namespaces().clearNamespaceBundleBacklogForSubscription(namespace, bundle,
 Each namespace contains multiple topics and the retention size (storage size) 
of each topic should not exceed a specific threshold or it should be stored for 
a certain period. This command helps configure the retention size and time of 
topics in a given namespace.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -885,7 +885,7 @@ admin.namespaces().setRetention(namespace, new 
RetentionPolicies(retentionTimeIn
 It shows retention information of a given namespace.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -946,7 +946,7 @@ disables the throttling.
 :::
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -988,7 +988,7 @@ admin.namespaces().setDispatchRate(namespace, new 
DispatchRate(1000, 1048576, 1)
 It shows configured message-rate for the namespace (topics under this 
namespace can dispatch this many messages per second)
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1042,7 +1042,7 @@ dispatch rate is in second and it can be configured with 
`dispatch-rate-period`.
 disables the throttling.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1084,7 +1084,7 @@ admin.namespaces().setSubscriptionDispatchRate(namespace, 
new DispatchRate(1000,
 It shows configured message-rate for the namespace (topics under this 
namespace can dispatch this many messages per second)
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1138,7 +1138,7 @@ dispatch rate is in second and it can be configured with 
`dispatch-rate-period`.
 disables the throttling.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1180,7 +1180,7 @@ admin.namespaces().setReplicatorDispatchRate(namespace, 
new DispatchRate(1000, 1
 It shows configured message-rate for the namespace (topics under this 
namespace can dispatch this many messages per second)
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1231,7 +1231,7 @@ admin.namespaces().getReplicatorDispatchRate(namespace)
 It shows configured `deduplicationSnapshotInterval` for a namespace (Each 
topic under the namespace will take a deduplication snapshot according to this 
interval)
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1271,7 +1271,7 @@ Set configured `deduplicationSnapshotInterval` for a 
namespace. Each topic under
 `brokerDeduplicationEnabled` must be set to `true` for this property to take 
effect.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1318,7 +1318,7 @@ 
admin.namespaces().setDeduplicationSnapshotInterval(namespace, 1000)
 Remove configured `deduplicationSnapshotInterval` of a namespace (Each topic 
under the namespace will take a deduplication snapshot according to this 
interval)
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1365,9 +1365,9 @@ You can unload a namespace, or a [namespace 
bundle](reference-terminology.md#nam
 Use the [`unload`](/tools/pulsar-admin/) subcommand of the 
[`namespaces`](/tools/pulsar-admin/) command.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  
values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST","value":"REST"},{"label":"Java","value":"Java"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 ```shell
@@ -1377,7 +1377,7 @@ $ pulsar-admin namespaces unload my-tenant/my-ns
 ```
 
 </TabItem>
-<TabItem value="REST">
+<TabItem value="REST API">
 
 ```
 
diff --git a/site2/website-next/docs/admin-api-overview.md 
b/site2/website-next/docs/admin-api-overview.md
index 38d1b412ff0..e5c93935a82 100644
--- a/site2/website-next/docs/admin-api-overview.md
+++ b/site2/website-next/docs/admin-api-overview.md
@@ -45,7 +45,7 @@ You can interact with the admin interface via:
 Each of the three admin interfaces (the `pulsar-admin` CLI tool, the {@inject: 
rest:REST:/} API, and the [Java admin API](/api/admin)) requires some special 
setup if you have enabled authentication in your Pulsar instance.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
diff --git a/site2/website-next/docs/admin-api-packages.md 
b/site2/website-next/docs/admin-api-packages.md
index 9262cf4489c..9e29d315c9b 100644
--- a/site2/website-next/docs/admin-api-packages.md
+++ b/site2/website-next/docs/admin-api-packages.md
@@ -88,9 +88,9 @@ packagesManagementLedgerRootPath=/ledgers
 You can use the following commands to upload a package.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 ```shell
@@ -105,7 +105,7 @@ bin/pulsar-admin packages upload 
function://public/default/[email protected] --path p
 {@inject: 
endpoint|POST|/admin/v3/packages/:type/:tenant/:namespace/:packageName/:version}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 Upload a package to the package management service synchronously.
 
@@ -133,9 +133,9 @@ Upload a package to the package management service 
asynchronously.
 You can use the following commands to download a package.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 ```shell
@@ -150,7 +150,7 @@ bin/pulsar-admin packages download 
function://public/default/[email protected] --path
 {@inject: 
endpoint|GET|/admin/v3/packages/:type/:tenant/:namespace/:packageName/:version}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 Download a package from the package management service synchronously.
 
@@ -178,9 +178,9 @@ Download a package from the package management service 
asynchronously.
 You can use the following commands to delete a package.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 The following command deletes a package of version 0.1.
@@ -197,7 +197,7 @@ bin/pulsar-admin packages delete 
functions://public/default/[email protected]
 {@inject: 
endpoint|DELETE|/admin/v3/packages/:type/:tenant/:namespace/:packageName/:version}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 Delete a specified package synchronously.
 
@@ -225,9 +225,9 @@ Delete a specified package asynchronously.
 You can use the following commands to get the metadate of a package.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 ```shell
@@ -242,7 +242,7 @@ bin/pulsar-admin packages get-metadata 
function://public/default/test@v1
 {@inject: 
endpoint|GET|/admin/v3/packages/:type/:tenant/:namespace/:packageName/:version/metadata}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 Get the metadata of a package synchronously.
 
@@ -270,9 +270,9 @@ Get the metadata of a package asynchronously.
 You can use the following commands to update the metadata of a package.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 ```shell
@@ -287,7 +287,7 @@ bin/pulsar-admin packages update-metadata 
function://public/default/[email protected]
 {@inject: 
endpoint|PUT|/admin/v3/packages/:type/:tenant/:namespace/:packageName/:version/metadata}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 Update the metadata of a package synchronously.
 
@@ -315,9 +315,9 @@ Update the metadata of a package asynchronously.
 You can use the following commands to list all versions of a package.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 ```shell
@@ -332,7 +332,7 @@ bin/pulsar-admin packages list-versions 
type://tenant/namespace/packageName
 {@inject: 
endpoint|GET|/admin/v3/packages/:type/:tenant/:namespace/:packageName}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 List all versions of a package synchronously.
 
@@ -360,9 +360,9 @@ List all versions of a package asynchronously.
 You can use the following commands to list all packages of a specific type 
under a namespace.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 
 <TabItem value="pulsar-admin">
 
@@ -378,7 +378,7 @@ bin/pulsar-admin packages list --type function 
public/default
 {@inject: endpoint|PUT|/admin/v3/packages/:type/:tenant/:namespace}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 List all packages of a specific type under a namespace synchronously.
 
diff --git a/site2/website-next/docs/admin-api-permissions.md 
b/site2/website-next/docs/admin-api-permissions.md
index 74886c7f5a0..9faf04e29e1 100644
--- a/site2/website-next/docs/admin-api-permissions.md
+++ b/site2/website-next/docs/admin-api-permissions.md
@@ -33,7 +33,7 @@ The chapters below demonstrate how to grant namespace-level 
permissions to users
 You can grant permissions to specific roles for lists of operations such as 
`produce` and `consume`.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -111,7 +111,7 @@ admin.namespaces().grantPermissionOnNamespace(namespace, 
role, getAuthActions(ac
 You can see which permissions have been granted to which roles in a namespace.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -154,7 +154,7 @@ admin.namespaces().getPermissions(namespace);
 You can revoke permissions from specific roles, which means that those roles 
will no longer have access to the specified namespace.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
diff --git a/site2/website-next/docs/admin-api-tenants.md 
b/site2/website-next/docs/admin-api-tenants.md
index b8bdc8be07f..bd6eb54d04f 100644
--- a/site2/website-next/docs/admin-api-tenants.md
+++ b/site2/website-next/docs/admin-api-tenants.md
@@ -32,9 +32,9 @@ Tenants, like namespaces, can be managed using the [admin 
API](admin-api-overvie
 You can list all of the tenants associated with an 
[instance](reference-terminology.md#instance).
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 Use the [`list`](/tools/pulsar-admin/) subcommand.
@@ -53,7 +53,7 @@ my-tenant-2
 {@inject: 
endpoint|GET|/admin/v2/tenants|operation/getTenants?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
@@ -71,9 +71,9 @@ admin.tenants().getTenants();
 You can create a new tenant.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 Use the [`create`](/tools/pulsar-admin/) subcommand:
@@ -106,7 +106,7 @@ $ pulsar-admin tenants create my-tenant \
 {@inject: 
endpoint|PUT|/admin/v2/tenants/:tenant|operation/createTenant?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
@@ -124,9 +124,9 @@ admin.tenants().createTenant(tenantName, tenantInfo);
 You can fetch the [configuration](reference-configuration) for an existing 
tenant at any time.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 Use the [`get`](/tools/pulsar-admin/) subcommand and specify the name of the 
tenant. Here's an example:
@@ -153,7 +153,7 @@ $ pulsar-admin tenants get my-tenant
 {@inject: 
endpoint|GET|/admin/v2/tenants/:tenant|operation/getTenant?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
@@ -171,9 +171,9 @@ admin.tenants().getTenantInfo(tenantName);
 Tenants can be deleted from a Pulsar 
[instance](reference-terminology.md#instance).
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 Use the [`delete`](/tools/pulsar-admin/) subcommand and specify the name of 
the tenant.
@@ -190,7 +190,7 @@ $ pulsar-admin tenants delete my-tenant
 {@inject: 
endpoint|DELETE|/admin/v2/tenants/:tenant|operation/deleteTenant?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
@@ -208,9 +208,9 @@ admin.Tenants().deleteTenant(tenantName);
 You can update a tenant's configuration.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
-  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"JAVA","value":"JAVA"}]}>
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
 
 Use the [`update`](/tools/pulsar-admin/) subcommand.
@@ -227,7 +227,7 @@ $ pulsar-admin tenants update my-tenant
 {@inject: 
endpoint|POST|/admin/v2/tenants/:tenant|operation/updateTenant?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="JAVA">
+<TabItem value="Java">
 
 ```java
 
diff --git a/site2/website-next/docs/admin-api-topics.md 
b/site2/website-next/docs/admin-api-topics.md
index 2d14b9bd07b..dc0900f18cd 100644
--- a/site2/website-next/docs/admin-api-topics.md
+++ b/site2/website-next/docs/admin-api-topics.md
@@ -51,7 +51,7 @@ Take {@inject: 
endpoint|GET|/admin/v2/:schema/:tenant/:namespace|operation/getLi
 You can get the list of topics under a given namespace in the following ways.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -88,7 +88,7 @@ admin.topics().getList(namespace);
 You can grant permissions on a client role to perform specific actions on a 
given topic in the following ways.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -128,7 +128,7 @@ admin.topics().grantPermission(topic, role, actions);
 You can fetch permission in the following ways.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -171,7 +171,7 @@ admin.topics().getPermissions(topic);
 
 You can revoke a permission granted on a client role in the following ways.
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -217,7 +217,7 @@ admin.topics().revokePermissions(topic, role);
 You can delete a topic in the following ways. You cannot delete a topic if any 
active subscription or producers is connected to the topic.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -253,7 +253,7 @@ admin.topics().delete(topic);
 
 You can unload a topic in the following ways.
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -574,7 +574,7 @@ The following is an example of a topic status.
 To get the status of a topic, you can use the following ways.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -754,7 +754,7 @@ The following is an example of the detailed statistics of a 
topic.
 
 To get the internal status of a topic, you can use the following ways.
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -790,7 +790,7 @@ admin.topics().getInternalStats(topic);
 
 You can peek a number of messages for a specific subscription of a given topic 
in the following ways.
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -834,7 +834,7 @@ admin.topics().peekMessages(topic, subName, numMessages);
 You can fetch the message with the given ledger ID and entry ID in the 
following ways.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -874,7 +874,7 @@ admin.topics().getMessageById(topic, ledgerId, entryId);
 You can examine a specific message on a topic by position relative to the 
earliest or the latest message.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -912,7 +912,7 @@ admin.topics().examineMessage(topic, "latest", 1);
 You can get message ID published at or just after the given datetime.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -952,7 +952,7 @@ admin.topics().getMessageIdByTimestamp(topic, timestamp);
 You can skip a number of messages for a specific subscription of a given topic 
in the following ways.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -992,7 +992,7 @@ admin.topics().skipMessages(topic, subName, numMessages);
 You can skip all the old messages for a specific subscription of a given topic.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1031,7 +1031,7 @@ admin.topics().skipAllMessages(topic, subName);
 You can reset a subscription cursor position back to the position which is 
recorded X minutes before. It essentially calculates time and position of 
cursor at X minutes before and resets it at that position. You can reset the 
cursor in the following ways.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1071,7 +1071,7 @@ admin.topics().resetCursor(topic, subName, timestamp);
 You can locate the broker URL which is serving the given topic in the 
following ways.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1110,7 +1110,7 @@ admin.lookup().lookupDestination(topic);
 You can locate the broker URL of each partitioned topic which is serving the 
given topic in the following ways.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   
values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1158,7 +1158,7 @@ $ pulsar-admin topics partitioned-lookup \
 You can check the range of the bundle which contains given topic in the 
following ways.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1197,7 +1197,7 @@ admin.lookup().getBundleRange(topic);
 You can check all subscription names for a given topic in the following ways.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1236,7 +1236,7 @@ admin.topics().getSubscriptions(topic);
 You can get the last committed message ID for a persistent topic. It is 
available since 2.3.0 release.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1272,7 +1272,7 @@ admin.topics().getLastMessage(topic);
 You can get the backlog size of a single partition topic or a non-partitioned 
topic with a given message ID (in bytes).
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1314,10 +1314,10 @@ admin.topics().getBacklogSizeByMessageId(topic, 
messageId);
 To get the topic-level deduplication snapshot interval, use one of the 
following methods.
 
 ````mdx-code-block
-<Tabs 
-  defaultValue="Pulsar-admin API"
-  values={[{"label":"Pulsar-admin API","value":"Pulsar-admin 
API"},{"label":"REST API","value":"REST API"},{"label":"Java API","value":"Java 
API"}]}>
-<TabItem value="Pulsar-admin API">
+<Tabs groupId="api-choice"
+  defaultValue="pulsar-admin"
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
 
 ```
 
@@ -1335,7 +1335,7 @@ pulsar-admin topics get-deduplication-snapshot-interval 
options
 ```
 
 </TabItem>
-<TabItem value="Java API">
+<TabItem value="Java">
 
 ```java
 
@@ -1355,10 +1355,10 @@ To set the topic-level deduplication snapshot interval, 
use one of the following
 > **Prerequisite** `brokerDeduplicationEnabled` must be set to `true`.
 
 ````mdx-code-block
-<Tabs 
-  defaultValue="Pulsar-admin API"
-  values={[{"label":"Pulsar-admin API","value":"Pulsar-admin 
API"},{"label":"REST API","value":"REST API"},{"label":"Java API","value":"Java 
API"}]}>
-<TabItem value="Pulsar-admin API">
+<Tabs groupId="api-choice"
+  defaultValue="pulsar-admin"
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
 
 ```
 
@@ -1384,7 +1384,7 @@ pulsar-admin topics set-deduplication-snapshot-interval 
options
 ```
 
 </TabItem>
-<TabItem value="Java API">
+<TabItem value="Java">
 
 ```java
 
@@ -1402,10 +1402,10 @@ admin.topics().setDeduplicationSnapshotInterval(topic, 
1000)
 To remove the topic-level deduplication snapshot interval, use one of the 
following methods.
 
 ````mdx-code-block
-<Tabs 
-  defaultValue="Pulsar-admin API"
-  values={[{"label":"Pulsar-admin API","value":"Pulsar-admin 
API"},{"label":"REST API","value":"REST API"},{"label":"Java API","value":"Java 
API"}]}>
-<TabItem value="Pulsar-admin API">
+<Tabs groupId="api-choice"
+  defaultValue="pulsar-admin"
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
 
 ```
 
@@ -1423,7 +1423,7 @@ pulsar-admin topics 
remove-deduplication-snapshot-interval options
 ```
 
 </TabItem>
-<TabItem value="Java API">
+<TabItem value="Java">
 
 ```java
 
@@ -1444,10 +1444,10 @@ 
admin.topics().removeDeduplicationSnapshotInterval(topic)
 To get the topic-level inactive topic policies, use one of the following 
methods.
 
 ````mdx-code-block
-<Tabs 
-  defaultValue="Pulsar-admin API"
-  values={[{"label":"Pulsar-admin API","value":"Pulsar-admin 
API"},{"label":"REST API","value":"REST API"},{"label":"Java API","value":"Java 
API"}]}>
-<TabItem value="Pulsar-admin API">
+<Tabs groupId="api-choice"
+  defaultValue="pulsar-admin"
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
 
 ```
 
@@ -1465,7 +1465,7 @@ pulsar-admin topics get-inactive-topic-policies options
 ```
 
 </TabItem>
-<TabItem value="Java API">
+<TabItem value="Java">
 
 ```java
 
@@ -1483,10 +1483,10 @@ admin.topics().getInactiveTopicPolicies(topic)
 To set the topic-level inactive topic policies, use one of the following 
methods.
 
 ````mdx-code-block
-<Tabs 
-  defaultValue="Pulsar-admin API"
-  values={[{"label":"Pulsar-admin API","value":"Pulsar-admin 
API"},{"label":"REST API","value":"REST API"},{"label":"Java API","value":"Java 
API"}]}>
-<TabItem value="Pulsar-admin API">
+<Tabs groupId="api-choice"
+  defaultValue="pulsar-admin"
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
 
 ```
 
@@ -1504,7 +1504,7 @@ pulsar-admin topics set-inactive-topic-policies options
 ```
 
 </TabItem>
-<TabItem value="Java API">
+<TabItem value="Java">
 
 ```java
 
@@ -1522,10 +1522,10 @@ admin.topics().setInactiveTopicPolicies(topic, 
inactiveTopicPolicies)
 To remove the topic-level inactive topic policies, use one of the following 
methods.
 
 ````mdx-code-block
-<Tabs 
-  defaultValue="Pulsar-admin API"
-  values={[{"label":"Pulsar-admin API","value":"Pulsar-admin 
API"},{"label":"REST API","value":"REST API"},{"label":"Java API","value":"Java 
API"}]}>
-<TabItem value="Pulsar-admin API">
+<Tabs groupId="api-choice"
+  defaultValue="pulsar-admin"
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
 
 ```
 
@@ -1543,7 +1543,7 @@ pulsar-admin topics remove-inactive-topic-policies options
 ```
 
 </TabItem>
-<TabItem value="Java API">
+<TabItem value="Java">
 
 ```java
 
@@ -1564,10 +1564,10 @@ admin.topics().removeInactiveTopicPolicies(topic)
 To get the topic-level offload policies, use one of the following methods.
 
 ````mdx-code-block
-<Tabs 
-  defaultValue="Pulsar-admin API"
-  values={[{"label":"Pulsar-admin API","value":"Pulsar-admin 
API"},{"label":"REST API","value":"REST API"},{"label":"Java API","value":"Java 
API"}]}>
-<TabItem value="Pulsar-admin API">
+<Tabs groupId="api-choice"
+  defaultValue="pulsar-admin"
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
 
 ```
 
@@ -1585,7 +1585,7 @@ pulsar-admin topics get-offload-policies options
 ```
 
 </TabItem>
-<TabItem value="Java API">
+<TabItem value="Java">
 
 ```java
 
@@ -1603,10 +1603,10 @@ admin.topics().getOffloadPolicies(topic)
 To set the topic-level offload policies, use one of the following methods.
 
 ````mdx-code-block
-<Tabs 
-  defaultValue="Pulsar-admin API"
-  values={[{"label":"Pulsar-admin API","value":"Pulsar-admin 
API"},{"label":"REST API","value":"REST API"},{"label":"Java API","value":"Java 
API"}]}>
-<TabItem value="Pulsar-admin API">
+<Tabs groupId="api-choice"
+  defaultValue="pulsar-admin"
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
 
 ```
 
@@ -1624,7 +1624,7 @@ pulsar-admin topics set-offload-policies options
 ```
 
 </TabItem>
-<TabItem value="Java API">
+<TabItem value="Java">
 
 ```java
 
@@ -1642,10 +1642,10 @@ admin.topics().setOffloadPolicies(topic, 
offloadPolicies)
 To remove the topic-level offload policies, use one of the following methods.
 
 ````mdx-code-block
-<Tabs 
-  defaultValue="Pulsar-admin API"
-  values={[{"label":"Pulsar-admin API","value":"Pulsar-admin 
API"},{"label":"REST API","value":"REST API"},{"label":"Java API","value":"Java 
API"}]}>
-<TabItem value="Pulsar-admin API">
+<Tabs groupId="api-choice"
+  defaultValue="pulsar-admin"
+  values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
 
 ```
 
@@ -1663,7 +1663,7 @@ pulsar-admin topics remove-offload-policies options
 ```
 
 </TabItem>
-<TabItem value="Java API">
+<TabItem value="Java">
 
 ```java
 
@@ -1689,7 +1689,7 @@ For more information about the two parameters, see 
[here](reference-configuratio
 
 You can create non-partitioned topics in the following ways.
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1732,7 +1732,7 @@ admin.topics().createNonPartitionedTopic(topicName);
 ### Delete
 You can delete non-partitioned topics in the following ways.
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1767,7 +1767,7 @@ admin.topics().delete(topic);
 
 You can get the list of topics under a given namespace in the following ways.  
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1840,7 +1840,7 @@ You can check the current statistics of a given topic. 
The following is an examp
 
 You can check the current statistics of a given topic and its connected 
producers and consumers in the following ways.
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1885,7 +1885,7 @@ For more information about the two parameters, see 
[here](reference-configuratio
 
 You can create partitioned topics in the following ways.
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1933,7 +1933,7 @@ admin.topics().createPartitionedTopic(topicName, 
numPartitions);
 When topic auto-creation is disabled, and you have a partitioned topic without 
any partitions, you can use the 
[`create-missed-partitions`](/tools/pulsar-admin/) command to create partitions 
for the topic.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -1976,7 +1976,7 @@ Field | Description
 `partitions` | The number of partitions into which the topic is divided.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -2020,7 +2020,7 @@ You can update the number of partitions for an existing 
partitioned topic *if* t
 Producers and consumers can find the newly created partitions automatically.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -2058,7 +2058,7 @@ admin.topics().updatePartitionedTopic(topic, 
numPartitions);
 You can delete partitioned topics with the 
[`delete-partitioned-topic`](/tools/pulsar-admin/) command, REST API and Java. 
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -2092,7 +2092,7 @@ admin.topics().delete(topic);
 ### List
 You can get the list of partitioned topics under a given namespace in the 
following ways.  
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -2188,7 +2188,7 @@ Note that in the subscription JSON object, 
`chuckedMessageRate` is deprecated. P
 You can check the current statistics of a given partitioned topic and its 
connected producers and consumers in the following ways. 
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -2266,7 +2266,7 @@ You can check the detailed statistics of a topic. The 
following is an example. F
 You can get the internal stats for the partitioned topic in the following ways.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -2400,7 +2400,7 @@ You can use [Pulsar admin API](admin-api-overview) to 
create, check, and delete
 You can create a subscription for a topic using one of the following methods.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 
@@ -2440,7 +2440,7 @@ admin.topics().createSubscription(topic, 
subscriptionName, MessageId.latest);
 You can check all subscription names for a given topic using one of the 
following methods.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 
@@ -2479,7 +2479,7 @@ admin.topics().getSubscriptions(topic);
 When a subscription does not process messages any more, you can unsubscribe it 
using one of the following methods. 
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 
diff --git a/site2/website-next/docs/administration-geo.md 
b/site2/website-next/docs/administration-geo.md
index a7911659f82..b90376abc02 100644
--- a/site2/website-next/docs/administration-geo.md
+++ b/site2/website-next/docs/administration-geo.md
@@ -177,7 +177,7 @@ producer.newMessage()
 You can check topic-specific statistics for geo-replication topics using one 
of the following methods.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"}]}>
 <TabItem value="pulsar-admin">
diff --git a/site2/website-next/docs/administration-isolation.md 
b/site2/website-next/docs/administration-isolation.md
index b5a2b96b81f..22f9b94337d 100644
--- a/site2/website-next/docs/administration-isolation.md
+++ b/site2/website-next/docs/administration-isolation.md
@@ -21,9 +21,9 @@ In Pulsar, when namespaces (more specifically, namespace 
bundles) are assigned d
 You can set a namespace isolation policy for a cluster using one of the 
following methods. 
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
-  values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java admin API","value":"Java admin API"}]}>
+  values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
 <TabItem value="Admin CLI">
 
@@ -53,7 +53,7 @@ bin/pulsar-admin ns-isolation-policy set \
 [PUT 
/admin/v2/namespaces/{tenant}/{namespace}](/admin-rest-api/?version=master&apiversion=v2#operation/createNamespace)
 
 </TabItem>
-<TabItem value="Java admin API">
+<TabItem value="Java Admin API">
 
 For how to set namespace isolation policy using Java admin API, see 
[here](https://github.com/apache/pulsar/blob/master/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NamespacesImpl.java#L251).
 
@@ -69,9 +69,9 @@ A namespace can be isolated into user-defined groups of 
bookies, which guarantee
 You can set a bookie affinity group using one of the following methods.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
-  values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java admin API","value":"Java admin API"}]}>
+  values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
 <TabItem value="Admin CLI">
 
@@ -113,7 +113,7 @@ For the bookie rack name restrictions, see [pulsar-admin 
bookies set-bookie-rack
 [POST 
/admin/v2/namespaces/{tenant}/{namespace}/persistence/bookieAffinity](/admin-rest-api/?version=master&apiversion=v2#operation/setBookieAffinityGroup)
 
 </TabItem>
-<TabItem value="Java admin API">
+<TabItem value="Java Admin API">
 
 For how to set bookie affinity group for a namespace using Java admin API, see 
[here](https://github.com/apache/pulsar/blob/master/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NamespacesImpl.java#L1164).
 
diff --git a/site2/website-next/docs/client-libraries-java.md 
b/site2/website-next/docs/client-libraries-java.md
index 0c2d6ce4e89..ef0f52ec27d 100644
--- a/site2/website-next/docs/client-libraries-java.md
+++ b/site2/website-next/docs/client-libraries-java.md
@@ -211,7 +211,7 @@ This chapter helps you better understand the concept of 
cluster-level failover.
 > ##### Concept of cluster-level failover
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="failover-choice"
   defaultValue="Automatic cluster-level failover"
   values={[{"label":"Automatic cluster-level failover","value":"Automatic 
cluster-level failover"},{"label":"Controlled cluster-level 
failover","value":"Controlled cluster-level failover"}]}>
 <TabItem value="Automatic cluster-level failover">
@@ -255,7 +255,7 @@ The cluster-level failover protects your environment in a 
number of ways, includ
 > ##### When cluster-level failover is triggered?
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="failover-choice"
   defaultValue="Automatic cluster-level failover"
   values={[{"label":"Automatic cluster-level failover","value":"Automatic 
cluster-level failover"},{"label":"Controlled cluster-level 
failover","value":"Controlled cluster-level failover"}]}>
 <TabItem value="Automatic cluster-level failover">
@@ -333,7 +333,7 @@ This section guides you through every step on how to 
configure cluster-level fai
 * Set `replicateSubscriptionState` to `true` when creating consumers.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="failover-choice"
   defaultValue="Automatic cluster-level failover"
   values={[{"label":"Automatic cluster-level failover","value":"Automatic 
cluster-level failover"},{"label":"Controlled cluster-level 
failover","value":"Controlled cluster-level failover"}]}>
 <TabItem value="Automatic cluster-level failover">
@@ -456,7 +456,7 @@ Assume that you want to connect Pulsar client 1 to cluster 
A.
 This chapter explains the working process of cluster-level failover. For more 
implementation details, see 
[PIP-121](https://github.com/apache/pulsar/issues/13315).
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="failover-choice"
   defaultValue="Automatic cluster-level failover"
   values={[{"label":"Automatic cluster-level failover","value":"Automatic 
cluster-level failover"},{"label":"Controlled cluster-level 
failover","value":"Controlled cluster-level failover"}]}>
 <TabItem value="Automatic cluster-level failover">
diff --git a/site2/website-next/docs/concepts-messaging.md 
b/site2/website-next/docs/concepts-messaging.md
index 00ed7f10d43..f44bb8070a1 100644
--- a/site2/website-next/docs/concepts-messaging.md
+++ b/site2/website-next/docs/concepts-messaging.md
@@ -595,7 +595,7 @@ The key-based batching aims at resolving the 
above-mentioned issues. This batchi
 Below are examples of enabling the key-based batching under the Key_Shared 
subscription type, with `client` being the Pulsar client that you created.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
diff --git a/site2/website-next/docs/concepts-proxy-sni-routing.md 
b/site2/website-next/docs/concepts-proxy-sni-routing.md
index 8e917a37d93..c1d2a73dd52 100644
--- a/site2/website-next/docs/concepts-proxy-sni-routing.md
+++ b/site2/website-next/docs/concepts-proxy-sni-routing.md
@@ -83,7 +83,7 @@ After you configure the `ssl_server_name.config` and 
`records.config` files, the
 ATS SNI-routing works only with TLS. You need to enable TLS for the ATS proxy 
and brokers first, configure the SNI routing protocol, and then connect Pulsar 
clients to brokers through ATS proxy. Pulsar clients support SNI routing by 
connecting to the proxy, and sending the target broker URL to the SNI header. 
This process is processed internally. You only need to configure the following 
proxy configuration initially when you create a Pulsar client to use the SNI 
routing protocol.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Python","value":"Python"}]}>
 
diff --git a/site2/website-next/docs/cookbooks-retention-expiry.md 
b/site2/website-next/docs/cookbooks-retention-expiry.md
index f023560e546..41f691f4186 100644
--- a/site2/website-next/docs/cookbooks-retention-expiry.md
+++ b/site2/website-next/docs/cookbooks-retention-expiry.md
@@ -67,7 +67,7 @@ For more information of the two parameters, refer to the 
[`broker.conf`](referen
 You can set a retention policy for a namespace by specifying the namespace, a 
size limit and a time limit in `pulsar-admin`, REST API and Java.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -159,7 +159,7 @@ admin.namespaces().setRetention(namespace, policies);
 You can fetch the retention policy for a namespace by specifying the 
namespace. The output will be a JSON object with two keys: 
`retentionTimeInMinutes` and `retentionSizeInMB`.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -231,7 +231,7 @@ Backlog quotas are handled at the namespace level. They can 
be managed via:
 You can set a size and/or time threshold and backlog retention policy for all 
of the topics in a [namespace](reference-terminology.md#namespace) by 
specifying the namespace, a size limit and/or a time limit in second, and a 
policy by name.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -284,7 +284,7 @@ admin.namespaces().setBacklogQuota(namespace, quota);
 You can see which size threshold and backlog retention policy has been applied 
to a namespace.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -326,7 +326,7 @@ Map<BacklogQuota.BacklogQuotaType,BacklogQuota> quotas =
 ### Remove backlog quotas
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -386,7 +386,7 @@ The diagram below illustrates the concept of TTL.
 ### Set the TTL for a namespace
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -424,7 +424,7 @@ admin.namespaces().setNamespaceMessageTTL(namespace, 
ttlInSeconds);
 ### Get the TTL configuration for a namespace
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
@@ -462,7 +462,7 @@ admin.namespaces().getNamespaceMessageTTL(namespace)
 ### Remove the TTL configuration for a namespace
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="pulsar-admin"
   values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST 
API","value":"REST API"},{"label":"Java","value":"Java"}]}>
 <TabItem value="pulsar-admin">
diff --git a/site2/website-next/docs/functions-develop.md 
b/site2/website-next/docs/functions-develop.md
index 3766fe89170..52a7d25e9ce 100644
--- a/site2/website-next/docs/functions-develop.md
+++ b/site2/website-next/docs/functions-develop.md
@@ -25,7 +25,7 @@ Extended Pulsar Function SDK for Java | An extension to 
Pulsar-specific librarie
 The language-native function, which adds an exclamation point to all incoming 
strings and publishes the resulting string to a topic, has no external 
dependencies. The following example is language-native function.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
@@ -80,7 +80,7 @@ sudo update-alternatives --install /usr/bin/python python 
/usr/bin/python3 10
 ### Pulsar Function SDK for Java/Python/Go
 The following example uses Pulsar Functions SDK.
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"},{"label":"Go","value":"Go"}]}>
 <TabItem value="Java">
@@ -166,7 +166,7 @@ Before using it, you need to set up Pulsar Function worker 
2.10.0 or later versi
 The following example uses the extended interface of Pulsar Function SDK for 
Java to initialize RedisClient when the function instance starts and release it 
when the function instance closes.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   values={[{"label":"Java","value":"Java"}]}>
 <TabItem value="Java">
@@ -216,7 +216,7 @@ Pulsar has a built-in schema registry and is bundled with 
popular schema types,
 SerDe stands for **Ser**ialization and **De**serialization. Pulsar Functions 
uses SerDe when publishing data to and consuming data from Pulsar topics. How 
SerDe works by default depends on the language you use for a particular 
function.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"},{"label":"Go","value":"Go"}]}>
 <TabItem value="Java">
@@ -292,7 +292,7 @@ Currently, the feature is not available in Go.
 Imagine that you're writing Pulsar Functions that are processing tweet 
objects, you can refer to the following example of `Tweet` class.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
@@ -418,7 +418,7 @@ Java, Python and Go SDKs provide access to a **context 
object** that can be used
 * (Java) get Pulsar admin client.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"},{"label":"Go","value":"Go"}]}>
 <TabItem value="Java">
@@ -660,7 +660,7 @@ $ bin/pulsar-admin functions create \
 ```
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"},{"label":"Go","value":"Go"}]}>
 <TabItem value="Java"> 
@@ -809,7 +809,7 @@ func contextFunc(ctx context.Context) {
 ### Logger
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"},{"label":"Go","value":"Go"}]}>
 <TabItem value="Java">
@@ -1134,7 +1134,7 @@ Additionally, you can specify the function log level 
through the broker XML file
 Pulsar Functions using the Java SDK has access to the Pulsar admin client, 
which allows the Pulsar admin client to manage API calls to current Pulsar 
clusters or external clusters (if `external-pulsars` is provided).
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   values={[{"label":"Java","value":"Java"}]}>
 <TabItem value="Java">
@@ -1215,7 +1215,7 @@ You can monitor Pulsar Functions that have been deployed 
with the following meth
 Here are examples of how to customize metrics for Java and Python functions.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"},{"label":"Go","value":"Go"}]}>
 <TabItem value="Java">
@@ -1303,7 +1303,7 @@ Pulsar Functions can support the following providers:
 At the same time, Pulsar Functions provides two interfaces, 
**SecretsProvider** and **SecretsProviderConfigurator**, allowing users to 
customize secret provider.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"},{"label":"Go","value":"Go"}]}>
 <TabItem value="Java">
@@ -1383,7 +1383,7 @@ State storage is not available in Go.
 ### API
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
@@ -1622,7 +1622,7 @@ If `--watch` is specified, the CLI will watch the value 
of the provided `state-k
 ### Example
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"}]}>
 <TabItem value="Java">
diff --git a/site2/website-next/docs/io-overview.md 
b/site2/website-next/docs/io-overview.md
index 640c38a4e7a..8f5bd433af6 100644
--- a/site2/website-next/docs/io-overview.md
+++ b/site2/website-next/docs/io-overview.md
@@ -73,7 +73,7 @@ When creating a connector, you can set the processing 
guarantee with the followi
 Here takes **Admin CLI** as an example. For more information about **REST 
API** or **JAVA Admin API**, see [here](io-use.md#create). 
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="io-choice"
   defaultValue="Source"
   
values={[{"label":"Source","value":"Source"},{"label":"Sink","value":"Sink"}]}>
 
@@ -120,7 +120,7 @@ After creating a connector, you can update the processing 
guarantee with the fol
 Here takes **Admin CLI** as an example. For more information about **REST 
API** or **JAVA Admin API**, see [here](io-use.md#create). 
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="io-choice"
   defaultValue="Source"
   
values={[{"label":"Source","value":"Source"},{"label":"Sink","value":"Sink"}]}>
 
diff --git a/site2/website-next/docs/io-use.md 
b/site2/website-next/docs/io-use.md
index b5c6fc1d350..901c11ce34e 100644
--- a/site2/website-next/docs/io-use.md
+++ b/site2/website-next/docs/io-use.md
@@ -193,7 +193,7 @@ You can create a connector using **Admin CLI**, **REST 
API** or **JAVA admin API
 Create a source connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -284,7 +284,7 @@ Send a `POST` request to this endpoint: {@inject: 
endpoint|POST|/admin/v3/source
 Create a sink connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -379,7 +379,7 @@ You can start a connector using **Admin CLI** or **REST 
API**.
 Start a source connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"}]}>
 
@@ -416,7 +416,7 @@ For the latest and complete information, see [Pulsar admin 
docs](/tools/pulsar-a
 Start a sink connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"}]}>
 
@@ -457,7 +457,7 @@ You can run a connector locally rather than deploying it on 
a Pulsar cluster usi
 Run a source connector locally.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"}]}>
 
@@ -483,7 +483,7 @@ For the latest and complete information, see [Pulsar admin 
docs](/tools/pulsar-a
 Run a sink connector locally.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"}]}>
 
@@ -522,7 +522,7 @@ You can get the information of a connector using **Admin 
CLI**, **REST API** or
 Get the information of a source connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -635,7 +635,7 @@ For more information, see 
[`getSource`](/api/admin/org/apache/pulsar/client/admi
 Get the information of a sink connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -745,7 +745,7 @@ You can get the list of all running connectors using 
**Admin CLI**, **REST API**
 Get the list of all running source connectors.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -804,7 +804,7 @@ For more information, see 
[`listSource`](/api/admin/org/apache/pulsar/client/adm
 Get the list of all running sink connectors.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -867,7 +867,7 @@ You can get the current status of a connector using **Admin 
CLI**, **REST API**
 Get the current status of a source connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -963,7 +963,7 @@ For the latest and complete information, see [Pulsar admin 
docs](/tools/pulsar-a
 Get the current status of a Pulsar sink connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -1065,7 +1065,7 @@ You can update a running connector using **Admin CLI**, 
**REST API** or **JAVA a
 Update a running Pulsar source connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -1160,7 +1160,7 @@ For more information, see 
[`createSourceWithUrl`](/api/admin/org/apache/pulsar/c
 Update a running Pulsar sink connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -1261,7 +1261,7 @@ You can stop a connector using **Admin CLI**, **REST 
API** or **JAVA admin API**
 Stop a source connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -1357,7 +1357,7 @@ For the latest and complete information, see [Pulsar 
admin docs](/tools/pulsar-a
 Stop a sink connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -1459,7 +1459,7 @@ You can restart a connector using **Admin CLI**, **REST 
API** or **JAVA admin AP
 Restart a source connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -1555,7 +1555,7 @@ For the latest and complete information, see [Pulsar 
admin docs](/tools/pulsar-a
 Restart a sink connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -1657,7 +1657,7 @@ You can delete a connector using **Admin CLI**, **REST 
API** or **JAVA admin API
 Delete a source connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -1723,7 +1723,7 @@ For more information, see 
[`deleteSource`](/api/admin/org/apache/pulsar/client/a
 Delete a sink connector.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
diff --git a/site2/website-next/docs/schema-manage.md 
b/site2/website-next/docs/schema-manage.md
index 1f7745abf44..a55b3356849 100644
--- a/site2/website-next/docs/schema-manage.md
+++ b/site2/website-next/docs/schema-manage.md
@@ -168,7 +168,7 @@ To manage schemas, you can use one of the following methods.
 To upload (register) a new schema for a topic, you can use one of the 
following methods.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -296,7 +296,7 @@ admin.createSchema("my-tenant/my-ns/my-topic", payload);
 To get the latest schema for a topic, you can use one of the following 
methods. 
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -388,7 +388,7 @@ SchemaInfo si = admin.getSchema("my-tenant/my-ns/my-topic");
 To get a specific version of a schema, you can use one of the following 
methods.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -469,7 +469,7 @@ SchemaInfo si = admin.getSchema("my-tenant/my-ns/my-topic", 
1L);
 To provide a schema via a topic, you can use the following method.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"}]}>
 
@@ -499,7 +499,7 @@ In any case, the **delete** action deletes **all versions** 
of a schema register
 :::
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -655,7 +655,7 @@ The schema compatibility check strategy set at different 
levels has priority: to
 To set a schema compatibility check strategy at the topic level, use one of 
the following methods.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -701,7 +701,7 @@ 
admin.topicPolicies().setSchemaCompatibilityStrategy("my-tenant/my-ns/my-topic",
 To get the topic-level schema compatibility check strategy, use one of the 
following methods.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -751,7 +751,7 @@ 
admin.topicPolicies().getSchemaCompatibilityStrategy("my-tenant/my-ns/my-topic",
 To remove the topic-level schema compatibility check strategy, use one of the 
following methods.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
   values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
@@ -800,9 +800,9 @@ 
admin.removeSchemaCompatibilityStrategy("my-tenant/my-ns/my-topic");
 You can set schema compatibility check strategy at namespace level using one 
of the following methods.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="api-choice"
   defaultValue="Admin CLI"
-  values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin CLI","value":"Java Admin CLI"}]}>
+  values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST 
API","value":"REST API"},{"label":"Java Admin API","value":"Java Admin API"}]}>
 
 <TabItem value="Admin CLI">
 
@@ -820,7 +820,7 @@ pulsar-admin namespaces set-schema-compatibility-strategy 
options
 Send a `PUT` request to this endpoint: {@inject: 
endpoint|PUT|/admin/v2/namespaces/:tenant/:namespace|operation/schemaCompatibilityStrategy?version=@pulsar:version_number@}
 
 </TabItem>
-<TabItem value="Java Admin CLI">
+<TabItem value="Java Admin API">
 
 Use the [`setSchemaCompatibilityStrategy`](/api/admin/)method.
 
diff --git a/site2/website-next/docs/security-encryption.md 
b/site2/website-next/docs/security-encryption.md
index 87c99d98488..0a5547758b3 100644
--- a/site2/website-next/docs/security-encryption.md
+++ b/site2/website-next/docs/security-encryption.md
@@ -60,7 +60,7 @@ Pulsar does not store the encryption key anywhere in the 
Pulsar service. If you
 5. Configure a `CryptoKeyReader` to a producer, consumer or reader. 
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Python","value":"Python"},{"label":"Node.js","value":"Node.js"}]}>
 <TabItem value="Java">
@@ -218,7 +218,7 @@ await client.close();
 6. Below is an example of a **customized** `CryptoKeyReader` implementation.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"C++","value":"C++"},{"label":"Python","value":"Python"},{"label":"Node.js","value":"Node.js"}]}>
 <TabItem value="Java">
diff --git a/site2/website-next/docs/security-extending.md 
b/site2/website-next/docs/security-extending.md
index 4cdc9bad785..db737b055a3 100644
--- a/site2/website-next/docs/security-extending.md
+++ b/site2/website-next/docs/security-extending.md
@@ -52,7 +52,21 @@ authenticationProviders=
 
 ```
 
-For the implementation of the 
`org.apache.pulsar.broker.authentication.AuthenticationProvider` interface, 
refer to 
[here](https://github.com/apache/pulsar/blob/master/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProvider.java).
+:::tip
+
+Pulsar supports an authentication provider chain that contains multiple 
authentication providers with the same authentication method name. 
+
+For example, your Pulsar cluster uses JSON Web Token (JWT) authentication 
(with an authentication method named `token`) and you want to upgrade it to use 
OAuth2.0 authentication with the same authentication name. In this case, you 
can implement your own authentication provider `AuthenticationProviderOAuth2` 
and configure `authenticationProviders` as follows.
+
+```properties
+authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderToken,org.apache.pulsar.broker.authentication.AuthenticationProviderOAuth2
+```
+
+As a result, brokers look up the authentication providers with the `token` 
authentication method (JWT and OAuth2.0 authentication) when receiving the 
requests to use the `token` authentication method. If a client cannot be 
authenticated via JWT authentication, OAuth2.0 authentication is used.
+
+:::
+
+For the implementation of the 
`org.apache.pulsar.broker.authentication.AuthenticationProvider` interface, 
refer to 
[code](https://github.com/apache/pulsar/blob/master/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProvider.java).
 
 You can find the following examples for different broker authentication 
plugins:
 
@@ -79,4 +93,4 @@ To provide a custom authorization provider, you need to 
implement the `org.apach
  
  ```
 
-For the implementation of the 
`org.apache.pulsar.broker.authorization.AuthorizationProvider` interface, refer 
to 
[here](https://github.com/apache/pulsar/blob/master/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/AuthorizationProvider.java).
\ No newline at end of file
+For the implementation of the 
`org.apache.pulsar.broker.authorization.AuthorizationProvider` interface, refer 
to 
[code](https://github.com/apache/pulsar/blob/master/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/AuthorizationProvider.java).
\ No newline at end of file
diff --git a/site2/website-next/docs/security-jwt.md 
b/site2/website-next/docs/security-jwt.md
index 9ce352b6d49..87d3d5907dd 100644
--- a/site2/website-next/docs/security-jwt.md
+++ b/site2/website-next/docs/security-jwt.md
@@ -61,7 +61,7 @@ authParams=file:///path/to/token/file
 You can use tokens to authenticate the following Pulsar clients.
 
 ````mdx-code-block
-<Tabs 
+<Tabs groupId="lang-choice"
   defaultValue="Java"
   
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"},{"label":"Go","value":"Go"},{"label":"C++","value":"C++"},{"label":"C#","value":"C#"}]}>
 <TabItem value="Java">
diff --git a/site2/website-next/docs/security-overview.md 
b/site2/website-next/docs/security-overview.md
index 0d62358844d..e3eeed1ee60 100644
--- a/site2/website-next/docs/security-overview.md
+++ b/site2/website-next/docs/security-overview.md
@@ -20,7 +20,7 @@ You had better secure the service components in your Apache 
Pulsar deployment.
 
 In Pulsar, a *role* is a string, like `admin` or `app1`, which can represent a 
single client or multiple clients. You can use roles to control permission for 
clients to produce or consume from certain topics, administer the configuration 
for tenants, and so on.
 
-Apache Pulsar uses a [Authentication Provider](#authentication-providers) to 
establish the identity of a client and then assign a *role token* to that 
client. This role token is then used for [Authorization and 
ACLs](security-authorization) to determine what the client is authorized to do.
+Apache Pulsar uses a [Authentication Provider](#authentication-providers) or a 
[Authentication Provider 
Chain](security-extending.md/#proxybroker-authentication-plugin) to establish 
the identity of a client and then assign a *role token* to that client. This 
role token is then used for [Authorization and ACLs](security-authorization) to 
determine what the client is authorized to do.
 
 ## Authentication providers
 

Reply via email to