diff --git a/web/app/components/app/chat/copy-btn/index.tsx b/web/app/components/app/chat/copy-btn/index.tsx
new file mode 100644
index 0000000000..f384e714d5
--- /dev/null
+++ b/web/app/components/app/chat/copy-btn/index.tsx
@@ -0,0 +1,44 @@
+'use client'
+import React from 'react'
+import Tooltip from '@/app/components/base/tooltip'
+import { t } from 'i18next'
+import s from './style.module.css'
+import copy from 'copy-to-clipboard'
+
+
+type ICopyBtnProps = {
+ value: string
+ className?: string
+}
+
+const CopyBtn = ({
+ value,
+ className,
+}: ICopyBtnProps) => {
+ const [isCopied, setIsCopied] = React.useState(false)
+
+ return (
+
+
+ {
+ copy(value)
+ setIsCopied(true)
+ }}
+ >
+
+
+
+
+ )
+}
+
+export default CopyBtn
diff --git a/web/app/components/app/chat/copy-btn/style.module.css b/web/app/components/app/chat/copy-btn/style.module.css
new file mode 100644
index 0000000000..56c756025b
--- /dev/null
+++ b/web/app/components/app/chat/copy-btn/style.module.css
@@ -0,0 +1,15 @@
+.copyIcon {
+ background-image: url(~@/app/components/develop/secret-key/assets/copy.svg);
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+.copyIcon:hover {
+ background-image: url(~@/app/components/develop/secret-key/assets/copy-hover.svg);
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+.copyIcon.copied {
+ background-image: url(~@/app/components/develop/secret-key/assets/copied.svg);
+}
\ No newline at end of file
diff --git a/web/app/components/app/chat/index.tsx b/web/app/components/app/chat/index.tsx
index 577f0b1c1b..38d85edc4c 100644
--- a/web/app/components/app/chat/index.tsx
+++ b/web/app/components/app/chat/index.tsx
@@ -17,6 +17,7 @@ import AppContext from '@/context/app-context'
import { Markdown } from '@/app/components/base/markdown'
import LoadingAnim from './loading-anim'
import { formatNumber } from '@/utils/format'
+import CopyBtn from './copy-btn'
const stopIcon = (