css+js实现简洁清爽的ai多会话聊天助手智能体语音通话效果代码

代码语言:html

所属分类:布局界面

代码描述:css+js实现简洁清爽的ai多会话聊天助手智能体语音通话效果代码,兼容所有的openai api大模型

代码标签: css js 简洁 清爽 ai 多会话 聊天 助手 智能体 语音 通话

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en">

<head>
   
<meta charset="UTF-8">


<link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/bootstrap-icons.1.11.3.css">
<style>
   

:root {
 
--primary-color: #4a89dc;
 
--secondary-color: #5d9cec;
 
--success-color: #2ecc71;
 
--danger-color: #e74c3c;
 
--warning-color: #f39c12;
 
--info-color: #3498db;
 
--light-color: #f5f7fa;
 
--dark-color: #333;
 
--gray-color: #95a5a6;
 
--light-gray: #ecf0f1;
 
--text-color: #333;
 
--border-radius: 8px;
 
--box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
 
--transition: all 0.3s ease;
}

* {
 
box-sizing: border-box;
 
margin: 0;
 
padding: 0;
}

body
{
 
font-family: 'Segoe UI', 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
 
color: var(--text-color);
 
line-height: 1.6;
 
background-color: #f9f9f9;
}

/* Overlay */
#overlay {
 
position: fixed;
 
top: 0;
 
left: 0;
 
width: 100%;
 
height: 100%;
 
background-color: rgba(0, 0, 0, 0.9);
 
display: none;
 
justify-content: center;
 
align-items: center;
 
z-index: 1000;
}

#closeBtn {
 
position: absolute;
 
top: 20px;
 
right: 20px;
 
color: white;
 
font-size: 24px;
 
cursor: pointer;
 
transition: var(--transition);
}

#closeBtn:hover {
 
color: var(--danger-color);
}

#overlayImage {
 
max-width: 90%;
 
max-height: 90%;
 
border-radius: var(--border-radius);
}

/* Main container */
.bodycont {
 
display: flex;
 
height: 100vh;
 
position: relative;
 
background-color: white;

 
margin: 0 auto;
 
box-shadow: var(--box-shadow);
}

/* Dialog boxes */
.tooldia {
 
position: fixed;
 
top: 50%;
 
left: 50%;
 
transform: translate(-50%, -50%);
 
background-color: white;
 
padding: 20px;
 
border-radius: var(--border-radius);
 
box-shadow: var(--box-shadow);
 
width: 90%;
 
max-width: 500px;
 
z-index: 100;
}

.dia-title {
 
font-weight: bold;
 
font-size: 18px;
 
margin-bottom: 15px;
 
color: var(--dark-color);
 
border-bottom: 1px solid var(--light-gray);
 
padding-bottom: 10px;
}

.add-icon {
 
margin-left: 10px;
 
cursor: pointer;
 
color: var(--primary-color);
 
transition: var(--transition);
}

.add-icon:hover {
 
color: var(--secondary-color);
}

/* Form elements */
.form-group {
 
margin-bottom: 15px;
}

.form-group p {
 
margin-bottom: 5px;
}

.textinput, .promptinput, .custom-select {
 
width: 100%;
 
padding: 10px;
 
border: 1px solid var(--light-gray);
 
border-radius: var(--border-radius);
 
font-size: 14px;
 
transition: var(--transition);
}

.textinput:focus, .promptinput:focus, .custom-select:focus {
 
outline: none;
 
border-color: var(--primary-color);
 
box-shadow: 0 0 0 2px rgba(74, 137, 220, 0.2);
}

.promptinput {
 
min-height: 80px;
 
resize: vertical;
}

.custom-range {
 
width: 100%;
 
height: 8px;
 
-webkit-appearance: none;
 
background: var(--light-gray);
 
border-radius: 4px;
 
outline: none;
}

.custom-range::-webkit-slider-thumb {
 
-webkit-appearance: none;
 
width: 18px;
 
height: 18px;
 
background: var(--primary-color);
 
border-radius: 50%;
 
cursor: pointer;
}

.custom-range::-moz-range-thumb {
 
width: 18px;
 
height: 18px;
 
background: var(--primary-color);
 
border-radius: 50%;
 
cursor: pointer;
 
border: none;
}

.select-wrapper {
 
position: relative;
}

.select-wrapper::after {
 
content: '\25BC';
 
position: absolute;
 
right: 10px;
 
top: 40px;
 
color: var(--gray-color);
 
pointer-events: none;
 
font-size: 12px;
}

.custom-select {
 
appearance: none;
 
-webkit-appearance: none;
 
-moz-appearance: none;
 
padding-right: 30px;
 
background-color: white;
}

/* Tool and agent items */
.tool-item, .agent-item {
 
padding: 8px 10px;
 
border-radius: var(--border-radius);
 
margin-bottom: 5px;
 
transition: var(--transition);
}

.tool-item:hover, .agent-item:hover {
 
background-color: var(--light-gray);
}

.tool-label {
 
display: flex;
 
align-items: center;
 
cursor: pointer;
}

.tool-label input[type="checkbox"] {
 
margin-right: 10px;
}

.tool-desc {
 
color: var(--gray-color);
 
font-size: 12px;
}

/* Chat history sidebar */
.chat-history {
 
 
width: 300px;
 
height: 100vh;
 
background-color: white;
 
box-shadow: var(--box-shadow);
 
z-index: 50;
 
display: flex;
 
flex-direction: column;
 
border-right: 1px solid var(--light-gray);
}

.chat-history-header {
 
display: flex;
 
padding: 15px;
 
border-bottom: 1px solid var(--light-gray);
 
align-items: center;
}

.new-chat-btn {
 
flex: 1;
 
padding: 10px;
 
border: 1px solid var(--light-gray);
 
border-radius: var(--border-radius);
 
text-align: center;
 
cursor: pointer;
 
transition: var(--transition);
 
display: flex;
 
align-items: center;
 
justify-content: center;
 
font-weight: 500;
}

.new-chat-btn:hover {
 
background-color: var(--light-color);
}

.close-icon {
 
margin-left: 10px;
 
cursor: pointer;
 
font-size: 18px;
 
color: var(--gray-color);
 
transition: var(--transition);
}

.close-icon:hover {
 
color: var(--danger-color);
}

.hischatitem {
 
padding: 12px 15px;
 
cursor: pointer;
 
border-bottom: 1px solid var(--light-gray);
 
position: relative;
 
transition: var(--transition);
}

.hischatitem:hover {
 
background-color: var(--light-color);
}

.nowchatitem {
 
background-color: var(--light-color);
 
border-left: 3px solid var(--primary-color);
}

.agentname {
 
display: block;
 
font-weight: 500;
 
margin-bottom: 5px;
}

.messagetext {
 
display: block;
 
font-size: 13px;
 
color: var(--gray-color);
 
white-space: nowrap;
 
overflow: hidden;
 
text-overflow: ellipsis;
 
max-width: 230px;
}

.del {
 
position: absolute;
 
right: 15px;
 
top: 50%;
 
transform: translateY(-50%);
 
color: var(--gray-color);
 
transition: var(--transition);
 
opacity: 0;
}

.hischatitem:hover .del {
 
opacity: 1;
}

.del:hover {
 
color: var(--danger-color);
}

/* Main content area */
.cont {
 
flex: 1;
 
display: flex;
 
flex-direction: column;
 
height: 100vh;
 
margin-left: 0;
 
transition: var(--transition);
}

.header-bar {
 
display: flex;
 
padding: 15px;
 
align-items: center;
 
border-bottom: 1px solid var(--light-gray);
 
background-color: white;
}

.app-title {
 
margin: 0 auto;
 
font-size: 20px;
 
font-weight: 500;
}

.header-bar i {
 
font-size: 18px;
 
cursor: pointer;
 
color: var(--gray-color);
 
transition: var(--transition);
}

.header-bar i:hover {
 
color: var(--primary-color);
}

/* Voice chat */
.voice-chat {
 
display: flex;
 
flex-direction: column;
 
align-items: center;
 
justify-content: center;
 
height: 100%;
 
padding: 20px;
}

.voice-avatar {
 
cursor: pointer;
}

.voice-avatar img {
 
height: 120px;
 
width: auto;
 
border-radius: 50%;
 
box-shadow: var(--box-shadow);
 
transition: var(--transition);
}

.voice-avatar img:hover {
 
transform: scale(1.05);
}

.voice-status {
 
margin: 20px 0;
 
text-align: center;
 
font-size: 16px;
 
color: var(--gray-color);
}

.hangoverbtn {
 
background-color: var(--danger-color);
 
color: white;
 
border: none;
 
padding: 10px 20px;
 
border-radius: var(--border-radius);
 
cursor: pointer;
 
font-size: 16px;
 
transition: var(--transition);
 
display: flex;
 
align-items: center;
}

.hangoverbtn:hover {
 
background-color: #c0392b;
}

/* Welcome screen */
.welcome-screen {
 
display: flex;
 
flex-direction: column;
 
align-items: center;
 
justify-content: center;
 
height: 100%;
}

.recomlist {
 
display: flex;
 
flex-wrap: wrap;
 
justify-content: center;
 
gap: 20px;
 
max-width: 900px;
}

.item {
 
width: 200px;
 
height: 150px;
 
background-color: white;
 
border-radius: var(--border-radius);
 
box-shadow: var(--box-shadow);
 
padding: 20px;
 
display: flex;
 
flex-direction: column;
 
align-items: center;
 
justify-content: center;
 
cursor: pointer;
 
transition: var(--transition);
 
text-align: center;
}

.item:hover {
 
transform: translateY(-5px);
 
box-shadow: 0 7px 15px rgba(0, 0, 0, 0.1);
}

.item i {
 
font-size: 36px;
 
margin-bottom: 15px;
 
color: var(--primary-color);
}

.item p {
 
font-size: 14px;
 
color: var(--text-color);
}

/* Chat history */
.historylist {
 
flex: 1;
 
overflow-y: auto;
 
padding: 20px;
 
background-color: #f9f9f9;
}

.mesay, .aisay {
 
max-width: 85%;
 
margin-bottom: 20px;
 
padding: 15px;
 
border-radius: var(--border-radius);
 
position: relative;
 
line-height: 1.5;
}

.mesay {
 
background-color: var(--primary-color);
 
color: white;
 
margin-left: auto;
 
border-bottom-right-radius: 0;
}

.aisay {
 
background-color: white;
 
color: var(--text-color);
 
margin-right: auto;
 
border-bottom-left-radius: 0;
 
box-shadow: var(--box-shadow);
}

.ai-thinking, .ai-tool-using {
 
display: flex;
 
align-items: center;
 
justify-content: center;
 
padding: 10px;
}

.ai-thinking img {
 
height: 30px;
}

.feedbackpanel {
 
margin-top: 10px;
 
display: flex;
 
align-items: center;
 
gap: 10px;
}

.action-btn {
 
color: var(--gray-color);
 
cursor: pointer;
 
transition: var(--transition);
}

.action-btn:hover {
 
color: var(--primary-color);
}

.model-label {
 
margin-left: auto;
 
font-size: 12px;
 
color: var(--gray-color);
}

.recomminput {
 
margin-top: 20px;
 
background-color: white;
 
border-radius: var(--border-radius);
 
padding: 15px;
 
box-shadow: var(--box-shadow);
}

.recomminput ol {
 
padding-left: 20px;
}

.recomminput li {
 
margin-bottom: 10px;
 
cursor: pointer;
 
transition: var(--transition);
}

.recomminput li:hover {
 
color: var(--primary-color);
}

/* Footer and input area */
.footer {
 
padding: 15px;
 
border-top: 1px solid var(--light-gray);
 
background-color: white;
 
position: relative;
}

.scrollbar {
 
position: absolute;
 
top: -30px;
 
right: 20px;
 
background-color: white;
 
width: 30px;
 
height: 30px;
 
display: flex;
 
align-items: center;
 
justify-content: center;
 
border-radius: 50%;
 
cursor: pointer;
 
box-shadow: var(--box-shadow);
 
color: var(--gray-color);
 
transition: var(--transition);
}

.scrollbar:hover {
 
color: var(--primary-color);
}

.attachpannel {
 
display: flex;
 
align-items: center;
 
background-color: var(--light-color);
 
padding: 10px;
 
border-radius: var(--border-radius);
 
margin-bottom: 10px;
}

.filebox {
 
display: flex;
 
align-items: center;
 
flex: 1;
}

.filebox img {
 
width: 40px;
 
height: 40px;
 
object-fit: cover;
 
border-radius: var(--border-radius);
 
margin-right: 10px;
}

.fname {
 
font-size: 14px;
 
max-width: 70px;
 
overflow: hidden;
 
text-overflow: ellipsis;
 
white-space: nowrap;
}

.mic-input {
 
position: fixed;
 
bottom: 80px;
 
left: 50%;
 
transform: translateX(-50%);
 
width: 240px;
 
background-color: white;
 
border-radius: var(--border-radius);
 
box-shadow: var(--box-shadow);
 
padding: 20px;
 
text-align: center;
 
z-index: 60;
}

.close-mic {
 
position: absolute;
 
top: 10px;
 
right: 10px;
 
cursor: pointer;
 
color: var(--gray-color);
 
transition: var(--transition);
}

.close-mic:hover {
 
color: var(--danger-color);
}

.mic-button {
 
cursor: pointer;
 
width: 80px;
 
height: 80px;
 
margin: 0 auto;
}

.mic-button img {
 
width: 100%;
 
height: 100%;
 
object-fit: contain;
}

.mic-status {
 
margin-top: 15px;
 
font-size: 14px;
 
color: var(--gray-color);
}

.inputpannel {
 
display: flex;
 
align-items: flex-end;
 
background-color: var(--light-color);
 
border-radius: var(--border-radius);
 
padding: 10px;
}

.file-upload {
 
position: relative;
 
margin-right: 10px;
}

.file-upload input[type="file"] {
 
position: absolute;
 
width: 100%;
 
height: 100%;
 
opacity: 0;
 
cursor: pointer;
}

.file-upload i {
 
font-size: 20px;
 
color: var(--gray-color);
 
cursor: pointer;
 
transition: var(--transition);
}

.file-upload i:hover {
 
color: var(--primary-color);
}

.inputtext {
 
flex: 1;
 
border: none;
 
background-color: transparent;
 
resize: none;
 
padding: 8px;
 
font-size: 14px;
 
max-height: 150px;
 
min-height: 38px;
}

.inputtext:focus {
 
outline: none;
}

.sendbtn {
 
width: 38px;
 
height: 38px;
 
border-radius: 50%;
 
display: flex;
 
align-items: center;
 
justify-content: center;
 
cursor: pointer;
 
background-color: var(--light-gray);
 
margin-left: 10px;
 
transition: var(--transition);
}

.sendbtn:hover {
 
background-color: var(--primary-color);
 
color: white;
}

.sendbtn.primary {
 
background-color: var(--primary-color);
 
color: white;
}

.sendbtn.primary:hover {
 
background-color: var(--secondary-color);
}

.sendbtn i {
 
font-size: 16px;
}

/* Settings panel */
.settings-panel {
 
 
width: 350px;
 
height: 100vh;
 
background-color: white;
 
box-shadow: var(--box-shadow);
 
z-index: 50;
 
overflow-y: auto;
 
padding: 20px;
 
border-left: 1px solid var(--light-gray);
}

.settings-header {
 
display: flex;
 
align-items: center;
 
padding-bottom: 15px;
 
margin-bottom: 20px;
 
border-bottom: 1px solid var(--light-gray);
}

.settings-title {
 
flex: 1;
 
font-size: 18px;
 
font-weight: 500;
 
text-align: center;
}

.settings-header i {
 
cursor: pointer;
 
font-size: 18px;
 
color: var(--gray-color);
 
transition: var(--transition);
}

.settings-header i:hover {
 
color: var(--danger-color);
}

.subbtn {
 
background-color: var(--primary-color);
 
color: white;
 
border: none;
 
padding: 10px 20px;
 
border-radius: var(--border-radius);
 
cursor: pointer;
 
font-size: 16px;
 
width: 100%;
 
margin-top: 20px;
 
transition: var(--transition);
}

.subbtn:hover {
 
background-color: var(--secondary-color);
}

/* Responsive design */
@media (max-width: 768px) {
 
.bodycont {
   
flex-direction: column;
   
height: auto;
 
}

 
.chat-history {
   
width: 100%;
   
height: 100vh;
 
}

 
.cont {
   
margin-left: 0;
   
height: 100vh;
 
}

 
.settings-panel {
   
width: 100%;
 
}

 
.tooldia {
   
width: 95%;
 
}

 
.recomlist {
   
flex-direction: column;
 
}

 
.item {
   
width: 100%;
 
}

 
.mesay, .aisay {
   
max-width: 95%;
 
}
}
</style>

 
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/chinese_lunar_calendar.min.js"></script>
   
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/highlight.js"></script>
   
<link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/highlight.9.9.css">
   
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/marked.umd.min.js"></script>
   
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/localforage.min.js"></script>
   
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/vue@2.6.1-dev.js"></script>
   
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/xlsx.full.min.js"></script>
   
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/pdf.2.2.js"></script>
   
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/mammoth.browser.js"></script>
   
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/jszip.js"></script>
   
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/pptxgen.bundle.js"></script>
   
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/coderunner.1.1.1.js"></script>
</head>

<body>
<div id="overlay" onclick="hideImage()">
   
<i id="closeBtn" onclick="hideImage()" class="bi bi-x-circle-fill"></i>
   
<img id="overlayImage" src="" alt="Fullscreen Image">
</div>

<div id="app" class="bodycont">
   
<div class="tooldia" v-show="showtooldiaforagent" style="z-index: 113;">
       
<i @click="showtooldiaforagent=false" class="bi bi-x-circle-fill" style="margin: 0; float: right;"></i>
       
<div class="dia-title">选择你想要的工具</div>
       
<p v-for="item in alltoollist" :key="item.toolname" class="tool-item">
           
<label class="tool-label">
               
<input type="checkbox" v-model="agentformdata.bottoollist" :value="item" />
                {{item.toolname}}(
<span class="tool-desc">{{item.desc}}</span>)
           
</label>
       
</p>
   
</div>

   
<div class="tooldia" v-show="showaddagentdia" style="z-index: 112; max-height: 60vh; overflow: auto;">
       
<i @click="showaddagentdia=false" class="bi bi-x-circle-fill" style="margin: 0; float: right;"></i>
       
<div class="dia-title">添加智能体</div>
       
<div class="form-group">
           
<p>智能体名称:</p>
           
<input type="text" class="textinput" v-model="agentformdata.agentname" placeholder="智能体名称" />
       
</div>
       
<div class="form-group">
           
<p>智能体描述:</p>
           
<textarea type="text" class="promptinput" v-model="agentformdata.desc" placeholder="智能体描述"></textarea>
       
</div>
       
<div class="form-group select-wrapper">
           
<p>模型</p>
           
<p>
               
<select v-model="agentformdata.aimodel" class="custom-select">
                   
<option v-for="item in modellist" :key="item.model" :value="item.model">
                        {{ item.model }}
                   
</option>
               
</select>
           
</p>
       
</div>
       
<div class="form-group">
           
<p>随机性: {{agentformdata.temperature}}</p>
           
<p><input type="range" class="custom-range" v-model="agentformdata.temperature" min="0.1" max="1" step="0.1" /></p>
       
</div>
       
<div class="form-group">
           
<p>上下文历史记录轮数: {{agentformdata.maxlun}}</p>
           
<p><input type="range" class="custom-range" v-model="agentformdata.maxlun" min="1" max="10" step="1" /></p>
       
</div>
       
<div class="form-group">
           
<p>topN: {{agentformdata.topn}}</p>
           
<p><input type="range" class="custom-range" v-model="agentformdata.topn" min="0.1" max="1" step="0.1" /></p>
       
</div>
       
<div class="form-group">
           
<p>最大输出: {{agentformdata.maxtokens}} tokens</p>
           
<p><input type="ran.........完整代码请登录后点击上方下载按钮下载查看

网友评论0