eda-copilot/iframe/test.html

298 lines
50 KiB
HTML
Raw Permalink Normal View History

2025-03-26 13:40:54 +08:00
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>新的聊天</title>
<script src="https://unpkg.com/marked@15.0.6/lib/marked.umd.js"></script>
<link rel="stylesheet" href="css/style.css">
<style>
.settings-alert {
color: #ff0000;
font-size: 0.8em;
margin-bottom: 0.5em;
}
</style>
</head>
<body>
<!-- 设置浮框 -->
<div class="settings-container" id="settingsModal">
<div class="settings-title">设置</div>
<div class="settings-alert">由于 EDA 存在 BUG重启 EDA 后数据将丢失!</div>
<div class="settings-item">
<label class="settings-label" for="custom-host">自定义接口地址:</label>
<input type="text" class="settings-input" id="custom-host">
<label class="settings-label" for="api-key">API KEY:</label>
<input type="text" class="settings-input" id="api-key">
</div>
<!-- Add more settings items as needed -->
<div class="settings-buttons">
<button class="settings-button cancel" onclick="closeSettings()">取消</button>
<button class="settings-button save" onclick="saveSettings()">保存</button>
</div>
</div>
<div class="settings-container" id="modelsModal">
<div class="settings-title">模型</div>
<div class="settings-item">
<label class="settings-label" for="model-name">选择模型</label>
<select class="settings-input" id="model-name">
<optgroup label="Gemini">
<option value="gemini-1.5-flash-002" selected>gemini-1.5-flash</option>
<option value="gemini-1.5-flash-8b-001">gemini-1.5-flash-8b</option>
<option value="gemini-1.5-pro-002">gemini-1.5-pro</option>
<option value="gemini-2.0-flash-exp">gemini-2.0-flash-exp</option>
</optgroup>
</select>
</div>
<!-- Add more settings items as needed -->
<div class="settings-buttons">
<button class="settings-button cancel" onclick="closeModels()">取消</button>
<button class="settings-button save" onclick="saveModels()">保存</button>
</div>
</div>
<div class="chat-container">
<div class="chat-header">
<div class="chat-title">新的聊天</div>
<div class="chat-subtitle">测试</div>
</div>
<div class="chat-body">
<div class="message-bubble user">
<div>你好!</div>
<div class="message-meta">预设提示词</div>
</div>
<div class="message-bubble">
<div>有什么可以帮你的吗?</div>
<div class="message-meta">预设提示词</div>
</div>
<div class="file-bubble">
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMjMuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iJiN4NTZGRTsmI3g1QzQyO18xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDE2IDE2OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxyZWN0IHN0eWxlPSJmaWxsOm5vbmU7IiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiLz4KPHJlY3Qgc3R5bGU9ImZpbGw6bm9uZTsiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIvPgo8cGF0aCBkPSJNMTUsNGgtMVYyYzAtMC41NS0wLjQ1LTEtMS0xSDRDMy40NSwxLDMsMS40NSwzLDJ2NEgxLjVDMS4yMiw2LDEsNi4yMiwxLDYuNUMxLDYuNzgsMS4yMiw3LDEuNSw3SDNoMWgxLjUKCUM1Ljc4LDcsNiw2Ljc4LDYsNi41QzYsNi4yMiw1Ljc4LDYsNS41LDZINFYyaDl2MmgtMWMtMC41NSwwLTEsMC40NS0xLDF2N2MwLDAuNTUsMC40NSwxLDEsMWgxdjJINHYtNGgxLjVDNS43OCwxMSw2LDEwLjc4LDYsMTAuNQoJQzYsMTAuMjIsNS43OCwxMCw1LjUsMTBINEgzSDEuNUMxLjIyLDEwLDEsMTAuMjIsMSwxMC41QzEsMTAuNzgsMS4yMiwxMSwxLjUsMTFIM3Y0YzAsMC41NSwwLjQ1LDEsMSwxaDljMC41NSwwLDEtMC40NSwxLTF2LTJoMQoJYzAuNTUsMCwxLTAuNDUsMS0xVjVDMTYsNC40NSwxNS41NSw0LDE1LDR6IE0xNSwxMmgtMWgtMWgtMVY1aDFoMWgxVjEyeiIvPgo8L3N2Zz4K" alt="File Icon" class="file-icon"> <!-- Replace with actual icon -->
<div class="file-info">
<div class="file-name">网表</div>
<div class="file-size">1.2 MB</div>
</div>
</div>
<div class="message-bubble">
<div>
<div class="loading"></div>
思考中...
</div>
</div>
<div class="clear-chat">
上下文已清除
</div>
</div>
<div class="chat-footer">
<div class="paste-image-group">
<div id="paste-image-delete-btn"></div>
<div id="paste-image"></div>
</div>
<div class="icon-group">
<button id="getNetList">
<span class="button-tip">解析网表</span>
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMjMuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iJiN4NTZGRTsmI3g1QzQyO18xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDE2IDE2OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxwYXRoIGQ9Ik02LjQ5OSw4Ljk5N2MtMS4zODEtMC4wMDItMi41MDIsMS4xMTUtMi41MDQsMi40OTZjLTAuMDAyLDEuMzgxLDEuMTE2LDIuNTAyLDIuNDk2LDIuNTA0CgljMS4zODEsMC4wMDIsMi41MDItMS4xMTYsMi41MDQtMi40OTZDOC45OTgsMTAuMTIsNy44OCw4Ljk5OSw2LjQ5OSw4Ljk5N3ogTTYuNDkzLDEyLjk5N2MtMC44MjctMC4wMDEtMS40OTktMC42NzUtMS40OTgtMS41MDIKCWMwLjAwMS0wLjgyNywwLjY3NS0xLjQ5OSwxLjUwMi0xLjQ5OGMwLjgyNywwLjAwMSwxLjQ5OSwwLjY3NSwxLjQ5OCwxLjUwMkM3Ljk5NCwxMi4zMjYsNy4zMiwxMi45OTgsNi40OTMsMTIuOTk3eiIvPgo8cGF0aCBkPSJNMTUuNSwxMmgtMS40OTR2LTEuNDk0YzAtMC4yNzYtMC4yMjQtMC41LTAuNS0wLjVzLTAuNSwwLjIyNC0wLjUsMC41VjEyaC0xLjQ5NGMtMC4yNzYsMC0wLjUsMC4yMjQtMC41LDAuNQoJYzAsMC4yNzYsMC4yMjQsMC41LDAuNSwwLjVoMS40OTR2MS40OTRjMCwwLjI3NiwwLjIyNCwwLjUsMC41LDAuNXMwLjUtMC4yMjQsMC41LTAuNVYxM0gxNS41YzAuMjc2LDAsMC41LTAuMjI0LDAuNS0wLjUKCUMxNiwxMi4yMjQsMTUuNzc2LDEyLDE1LjUsMTJ6Ii8+CjxwYXRoIGQ9Ik0xNSwxSDJDMS40NSwxLDEsMS40NSwxLDJ2MTNjMCwwLjU1LDAuNDUsMSwxLDFoNi41QzguNzgsMTYsOSwxNS43OCw5LDE1LjVDOSwxNS4yMiw4Ljc4LDE1LDguNSwxNUgyVjkuNzFMNS43MSw2SDE1djEuNQoJQzE1LDcuNzgsMTUuMjIsOCwxNS41LDhTMTYsNy43OCwxNiw3LjVWMkMxNiwxLjQ1LDE1LjU1LDEsMTUsMXogTTE1LDVINS43QzUuNDQsNSw1LjE4LDUuMTEsNSw1LjI5bC0zLDNWMmgxM1Y1eiIvPgo8L3N2Zz4K" alt="解析网表">
</button>
<button id="newChat">
<span class="button-tip">新的聊天</span>
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjQuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMCIgaWQ9IuWbvuWxgl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgMTYgMTYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDE2IDE2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNMTIuNSwxMi41Yy0wLjIsMC0wLjM4MS0wLjExOS0wLjQ2LTAuMzAzTDkuNSw2LjI3bC0yLjU0LDUuOTI4Yy0wLjE1OCwwLjM2Ny0wLjc2MiwwLjM2Ny0wLjkyLDBMMy41LDYuMjdMMi40Niw4LjY5NwoJCUMyLjM4MSw4Ljg4MSwyLjIwMSw5LDIuMDAxLDlIMC41QzAuMjI0LDksMCw4Ljc3NiwwLDguNXYwQzAsOC4yMjQsMC4yMjQsOCwwLjUsOGgxLjE3bDEuMzctMy4xOTdjMC4xNTgtMC4zNjcsMC43NjItMC4zNjcsMC45MiwwCgkJTDYuNSwxMC43M2wyLjU0LTUuOTI4YzAuMTU4LTAuMzY3LDAuNzYyLTAuMzY3LDAuOTIsMGwyLjU0LDUuOTI4bDEuMDQtMi40MjhDMTMuNjE5LDguMTE5LDEzLjc5OSw4LDEzLjk5OSw4SDE1LjUKCQlDMTUuNzc2LDgsMTYsOC4yMjQsMTYsOC41djBDMTYsOC43NzYsMTUuNzc2LDksMTUuNSw5aC0xLjE3bC0xLjM3LDMuMTk3QzEyLjg4MSwxMi4zODEsMTIuNywxMi41LDEyLjUsMTIuNXoiLz4KPC9nPgo8L3N2Zz4K" alt="新的聊天">
</button>
<button id="model">
<span class="button-tip">模型</span>
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMjMuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iJiN4NTZGRTsmI3g1QzQyO18xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDE2IDE2OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxyZWN0IHN0eWxlPSJmaWxsOm5vbmU7IiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiLz4KPGc+Cgk8cGF0aCBkPSJNMTMuMzksMTEuMzMzYy0wLjAyOC0wLjA1NS0wLjA1Ny0wLjEwOC0wLjA5My0wLjE2Yy0wLjA4NS0wLjEzLTAuMTk1LTAuMjUtMC4zMTgtMC4zNDcKCQljLTAuMTE1LTAuMDkzLTAuMjQzLTAuMTY4LTAuMzgyLTAuMjJjLTAuMTQzLTAuMDU3LTAuMjk4LTAuMDkyLTAuNDYtMC4xYy0wLjAzLTAuMDA1LTAuMDYtMC4wMDUtMC4wOS0wLjAwNXMtMC4wNiwwLTAuMDksMC4wMDUKCQljLTAuMTYyLDAuMDA4LTAuMzE4LDAuMDQyLTAuNDYsMC4xYy0wLjE0LDAuMDUyLTAuMjY3LDAuMTI4LTAuMzgyLDAuMjJjLTAuMTIyLDAuMDk3LTAuMjMzLDAuMjE3LTAuMzE4LDAuMzQ3CgkJYy0wLjAzNSwwLjA1Mi0wLjA2NSwwLjEwNS0wLjA5MywwLjE2Yy0wLjA3LDAuMTM3LTAuMTE3LDAuMjg3LTAuMTQsMC40NDdjLTAuMDEzLDAuMDczLTAuMDE4LDAuMTQ1LTAuMDE4LDAuMjIKCQlzMC4wMDUsMC4xNDgsMC4wMTgsMC4yMmMwLjAyMiwwLjE2LDAuMDcsMC4zMSwwLjE0LDAuNDQ4YzAuMDI4LDAuMDU1LDAuMDU3LDAuMTA3LDAuMDkzLDAuMTZjMC4wODUsMC4xMywwLjE5NSwwLjI1LDAuMzE4LDAuMzQ3CgkJYzAuMTE1LDAuMDkzLDAuMjQzLDAuMTY3LDAuMzgyLDAuMjJjMC4xNDMsMC4wNTcsMC4yOTgsMC4wOTIsMC40NiwwLjFjMC4wMywwLjAwNSwwLjA2LDAuMDA1LDAuMDksMC4wMDVzMC4wNiwwLDAuMDktMC4wMDUKCQljMC4xNjItMC4wMDgsMC4zMTgtMC4wNDIsMC40Ni0wLjFjMC4xNC0wLjA1MywwLjI2Ny0wLjEyOCwwLjM4Mi0wLjIyYzAuMTIyLTAuMDk3LDAuMjMzLTAuMjE3LDAuMzE4LTAuMzQ3CgkJYzAuMDM1LTAuMDUzLDAuMDY1LTAuMTA1LDAuMDkzLTAuMTZjMC4wNy0wLjEzOCwwLjExNy0wLjI4NywwLjE0LTAuNDQ4YzAuMDEzLTAuMDcyLDAuMDE4LTAuMTQ1LDAuMDE4LTAuMjIKCQlzLTAuMDA1LTAuMTQ4LTAuMDE4LTAuMjJDMTMuNTA3LDExLjYyLDEzLjQ2LDExLjQ3LDEzLjM5LDExLjMzM3ogTTEyLjc4NywxMi4xMTZjLTAuMDExLDAuMDc2LTAuMDMzLDAuMTQ3LTAuMDY4LDAuMjE2CgkJYy0wLjAxNCwwLjAyNy0wLjAyOCwwLjA1My0wLjA1LDAuMDg1Yy0wLjA0MSwwLjA2Mi0wLjA5NiwwLjEyMy0wLjE2LDAuMTc0Yy0wLjA1NiwwLjA0NS0wLjExNSwwLjA3OS0wLjE5MywwLjEwOQoJCWMtMC4wNjgsMC4wMjctMC4xNCwwLjA0My0wLjIxNCwwLjA0NmwtMC4wNDUsMC4wMDJsLTAuMDExLDAuMDAybC0wLjAxMS0wLjAwMmwtMC4wNDUtMC4wMDJjLTAuMDc0LTAuMDAzLTAuMTQ2LTAuMDE5LTAuMjMxLTAuMDUzCgkJYy0wLjA2MS0wLjAyMy0wLjEyLTAuMDU3LTAuMTc5LTAuMTA1Yy0wLjA2LTAuMDQ4LTAuMTE2LTAuMTA5LTAuMTYxLTAuMTc3Yy0wLjAxNy0wLjAyNi0wLjAzMi0wLjA1Mi0wLjA0OC0wLjA4NAoJCWMtMC4wMzMtMC4wNjUtMC4wNTUtMC4xMzYtMC4wNjktMC4yMzVDMTEuMywxMi4wNjcsMTEuMjk3LDEyLjAzNiwxMS4yOTcsMTJjMC0wLjAzNywwLjAwMi0wLjA2NywwLjAxLTAuMTE2CgkJYzAuMDExLTAuMDc2LDAuMDMzLTAuMTQ3LDAuMDY4LTAuMjE2YzAuMDE0LTAuMDI3LDAuMDI4LTAuMDUzLDAuMDUtMC4wODVjMC4wNDEtMC4wNjIsMC4wOTYtMC4xMjMsMC4xNi0wLjE3NAoJCWMwLjA1Ni0wLjA0NSwwLjExNS0wLjA3OSwwLjE5My0wLjEwOWMwLjA2OC0wLjAyNywwLjE0LTAuMDQzLDAuMjE0LTAuMDQ2bDAuMDQ1LTAuMDAybDAuMDExLTAuMDAybDAuMDExLDAuMDAybDAuMDQ1LDAuMDAyCgkJYzAuMDc0LDAuMDAzLDAuMTQ2LDAuMDE5LDAuMjMxLDAuMDUzYzAuMDYxLDAuMDIzLDAuMTIsMC4wNTcsMC4xNzksMC4xMDVjMC4wNiwwLjA0OCwwLjExNiwwLjEwOSwwLjE2MSwwLjE3NwoJCWMwLjAxNywwLjAyNiwwLjAzMiwwLjA1MiwwLjA0OCwwLjA4NGMwLjAzMywwLjA2NSwwLjA1NSwwLjEzNiwwLjA2OSwwLjIzNWMwLjAwNCwwLjAyNiwwLjAwNywwLjA1NiwwLjAwNywwLjA5MgoJCUMxMi43OTcsMTIuMDM2LDEyLjc5NSwxMi4wNjcsMTIuNzg3LDEyLjExNnoiLz4KCTxwYXRoIGQ9Ik0xNS44MTIsMTIuNzNsLTAuNTQyLTAuMzEzYzAuMDE3LTAuMTM4LDAuMDI3LTAuMjc1LDAuMDI3LTAuNDE3cy0wLjAxLTAuMjgtMC4wMjctMC40MTdsMC41NDItMC4zMTMKCQljMC4xNzktMC4xMDMsMC4yNDEtMC4zMzMsMC4xMzctMC41MTJsLTAuODc1LTEuNTE2Yy0wLjA2OS0wLjEyLTAuMTk2LTAuMTg4LTAuMzI1LTAuMTg4Yy0wLjA2MywwLTAuMTI4LDAuMDE2LTAuMTg3LDAuMDUKCQlMMTQuMDIsOS40MTdDMTMuOCw5LjI1LDEzLjU1Nyw5LjEwNywxMy4yOTcsOVY4LjM3NUMxMy4yOTcsOC4xNjgsMTMuMTI5LDgsMTIuOTIyLDhoLTEuNzVjLTAuMjA3LDAtMC4zNzUsMC4xNjgtMC4zNzUsMC4zNzVWOQoJCWMtMC4yNiwwLjEwNy0wLjUwMiwwLjI1LTAuNzIzLDAuNDE3TDkuNTMyLDkuMTA1Yy0wLjA1OS0wLjAzNC0wLjEyMy0wLjA1LTAuMTg3LTAuMDVjLTAuMTMsMC0wLjI1NiwwLjA2Ny0wLjMyNSwwLjE4OAoJCWwtMC44NzUsMS41MTZjLTAuMTA0LDAuMTc5LTAuMDQyLDAuNDA5LDAuMTM3LDAuNTEybDAuNTQyLDAuMzEzQzguODA3LDExLjcyLDguNzk3LDExLjg1Nyw4Ljc5NywxMnMwLjAxLDAuMjgsMC4wMjcsMC40MTcKCQlMOC4yODIsMTIuNzNjLTAuMTc5LDAuMTA0LTA
</button>
<button id="setting">
<span class="button-tip">设置</span>
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMjMuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iJiN4NTZGRTsmI3g1QzQyO18xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDE2IDE2OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnPgoJPHJlY3Qgc3R5bGU9ImZpbGw6bm9uZTsiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIvPgoJPGc+CgkJPHBhdGggZD0iTTkuNSwwaC0zYy0wLjU1LDAtMSwwLjQ1LTEsMXYxYy0wLjUyLDAuMjEtMSwwLjQ5LTEuNDQsMC44M2wtMC44Ny0wLjVDMy4wMywyLjI0LDIuODYsMi4yLDIuNjksMi4yCgkJCWMtMC4zNSwwLTAuNjgsMC4xOC0wLjg3LDAuNWwtMS41LDIuNkMwLjA1LDUuNzgsMC4yMSw2LjM5LDAuNjksNi42N2wwLjg3LDAuNUMxLjUyLDcuNDQsMS41LDcuNzIsMS41LDgKCQkJYzAsMC4yOCwwLjAyLDAuNTYsMC4wNiwwLjgzbC0wLjg3LDAuNWMtMC40OCwwLjI4LTAuNjQsMC44OS0wLjM3LDEuMzdsMS41LDIuNmMwLjE5LDAuMzIsMC41MiwwLjUsMC44NywwLjUKCQkJYzAuMTcsMCwwLjM0LTAuMDQsMC41LTAuMTNsMC44Ny0wLjVDNC41LDEzLjUxLDQuOTgsMTMuNzksNS41LDE0djFjMCwwLjU1LDAuNDUsMSwxLDFoM2MwLjU1LDAsMS0wLjQ1LDEtMXYtMQoJCQljMC41Mi0wLjIxLDEtMC40OSwxLjQ0LTAuODNsMC44NywwLjVjMC4xNiwwLjA5LDAuMzMsMC4xMywwLjUsMC4xM2MwLjM1LDAsMC42OC0wLjE4LDAuODctMC41bDEuNS0yLjYKCQkJYzAuMjctMC40OCwwLjExLTEuMDktMC4zNy0xLjM3bC0wLjg3LTAuNUMxNC40OCw4LjU2LDE0LjUsOC4yOCwxNC41LDhjMC0wLjI4LTAuMDItMC41Ni0wLjA2LTAuODNsMC44Ny0wLjUKCQkJYzAuNDgtMC4yOCwwLjY0LTAuODksMC4zNy0xLjM3bC0xLjUtMi42Yy0wLjE5LTAuMzItMC41Mi0wLjUtMC44Ny0wLjVjLTAuMTcsMC0wLjM0LDAuMDQtMC41LDAuMTNsLTAuODcsMC41CgkJCUMxMS41LDIuNDksMTEuMDIsMi4yMSwxMC41LDJWMUMxMC41LDAuNDUsMTAuMDUsMCw5LjUsMEw5LjUsMHogTTQuMDQ1LDMuODM2YzAuMjIxLDAsMC40NDMtMC4wNzQsMC42MjktMC4yMTIKCQkJQzQuNzg1LDMuNTQxLDQuOTAxLDMuNDYzLDUuMDIsMy4zOWMwLjE1LTAuMTEsMC4zMS0wLjIsMC40OC0wLjI4YzAuMTIyLTAuMDY1LDAuMjQ1LTAuMTIzLDAuMzctMC4xNzcKCQkJQzYuMjQ2LDIuNzcyLDYuNSwyLjQxNSw2LjUsMi4wMDVWMS42OFYxaDN2MC42OHYwLjMyNmMwLDAuNDA5LDAuMjU0LDAuNzY2LDAuNjMsMC45MjdjMC4xMjUsMC4wNTQsMC4yNDgsMC4xMTIsMC4zNywwLjE3NwoJCQljMC4xNywwLjA4LDAuMzMsMC4xNywwLjQ4LDAuMjhjMC4xMiwwLjA3MywwLjIzNSwwLjE1MSwwLjM0NiwwLjIzNGMwLjE4NywwLjEzOSwwLjQwOCwwLjIxMiwwLjYyOSwwLjIxMgoJCQljMC4xNjgsMCwwLjMzNi0wLjA0MiwwLjQ4OS0wLjEzMUwxMi43MywzLjU0bDAuNTgtMC4zNGwxLjUsMi42bC0wLjU4LDAuMzRsLTAuMjg3LDAuMTY2Yy0wLjM1NSwwLjIwNS0wLjUzNywwLjYwNS0wLjQ4OCwxLjAxMwoJCQljMC4wMTYsMC4xMzEsMC4wMjgsMC4yNjUsMC4wMzUsMC40MDFDMTMuNSw3LjgxLDEzLjUsNy45LDEzLjUsOGMwLDAuMSwwLDAuMTktMC4wMSwwLjI4Yy0wLjAwNywwLjEzNi0wLjAxOSwwLjI3LTAuMDM1LDAuNDAxCgkJCWMtMC4wNSwwLjQwOCwwLjEzMiwwLjgwNywwLjQ4OCwxLjAxM0wxNC4yMyw5Ljg2bDAuNTgsMC4zNGwtMS41LDIuNmwtMC41OC0wLjM0bC0wLjI4Ni0wLjE2NQoJCQljLTAuMTUzLTAuMDg4LTAuMzIxLTAuMTMxLTAuNDg5LTAuMTMxYy0wLjIyMSwwLTAuNDQzLDAuMDc0LTAuNjI5LDAuMjEyYy0wLjExMSwwLjA4My0wLjIyNiwwLjE2LTAuMzQ2LDAuMjM0CgkJCWMtMC4xNSwwLjExLTAuMzEsMC4yLTAuNDgsMC4yOGMtMC4xMjIsMC4wNjUtMC4yNDUsMC4xMjMtMC4zNywwLjE3N2MtMC4zNzYsMC4xNjEtMC42MywwLjUxOC0wLjYzLDAuOTI3djAuMzI2VjE1aC0zdi0wLjY4CgkJCXYtMC4zMjZjMC0wLjQwOS0wLjI1NC0wLjc2Ni0wLjYzLTAuOTI3Yy0wLjEyNS0wLjA1NC0wLjI0OC0wLjExMi0wLjM3LTAuMTc3Yy0wLjE3LTAuMDgtMC4zMy0wLjE3LTAuNDgtMC4yOAoJCQljLTAuMTItMC4wNzMtMC4yMzUtMC4xNTEtMC4zNDYtMC4yMzRjLTAuMTg3LTAuMTM5LTAuNDA4LTAuMjEyLTAuNjI5LTAuMjEyYy0wLjE2OCwwLTAuMzM2LDAuMDQyLTAuNDg5LDAuMTMxTDMuMjcsMTIuNDYKCQkJTDIuNjksMTIuOGwtMS41LTIuNmwwLjU4LTAuMzRsMC4yODctMC4xNjZjMC4zNTUtMC4yMDUsMC41MzctMC42MDUsMC40ODgtMS4wMTNDMi41MjksOC41NSwyLjUxNyw4LjQxNiwyLjUxLDguMjgKCQkJQzIuNSw4LjE5LDIuNSw4LjEsMi41LDhjMC0wLjEsMC0wLjE5LDAuMDEtMC4yOGMwLjAwNy0wLjEzNiwwLjAxOS0wLjI3LDAuMDM1LTAuNDAxYzAuMDUtMC40MDgtMC4xMzItMC44MDctMC40ODgtMS4wMTMKCQkJTDEuNzcsNi4xNEwxLjE5LDUuOGwxLjUtMi42bDAuNTgsMC4zNGwwLjI4NiwwLjE2NUMzLjcwOSwzLjc5NCwzLjg3NywzLjgzNiw0LjA0NSwzLjgzNkw0LjA0NSwzLjgzNnoiLz4KCTwvZz4KCTxnPgoJCTxwYXRoIGQ9Ik04LDUuNWMxLjM3OSwwLDIuNSwxLjEyMSwyLjUsMi41UzkuMzc5LDEwLjUsOCwxMC41UzUuNSw5LjM3OSw1LjUsOFM2LjYyMSw1LjUsOCw1LjUgTTgsNC41QzYuMDY3LDQuNSw0LjUsNi4wNjcsNC41LDgKCQkJczEuNTY3LDMuNSwzLjUsMy41czMuNS0xLjU2NywzLjUtMy41UzkuOTMzLDQuNSw4LDQuNUw4LDQuNXoiLz4KCTwvZz4KPC9nPgo8L3N2Zz4K" alt="设置">
</button>
</div>
<div class="input-group">
<input type="text" class="chat-input" id="chat-input" placeholder="解析网表后可以解决复杂问题">
<button class="send-button" id="send">发送</button>
</div>
</div>
</div>
<script>
let chatHistory = [];
let CACHE_NAME = null;
document.getElementById('send').addEventListener('click', function() {
let input = document.getElementById('chat-input');
let message = input.value;
if (!message) return;
let parts = [{ text: message }];
let image = document.getElementById('paste-image').style.backgroundImage;
image = image.replace('url("', '').replace('")', '').replace('data:image/png;base64,', '');
if(image) {
parts.push({ inline_data: { mime_type: "image/png", data: image } });
document.getElementById('paste-image').style.backgroundImage = '';
document.getElementsByClassName('paste-image-group')[0].style.display = 'none';
}
chatHistory.push({ role: 'user', parts: parts });
createBubble('user', message + `\n![图片](data:image/png;base64,${image})`, undefined);
input.value = '';
getAIResponse(message);
});
document.getElementById('getNetList').addEventListener('click', function() {
getNetlist();
});
document.getElementById('setting').addEventListener('click', function() {
openSettings();
});
document.getElementById('model').addEventListener('click', function() {
openModels();
});
document.getElementById('newChat').addEventListener('click', function() {
chatHistory = [];
CACHE_NAME = null;
let clearChat = document.createElement('div');
clearChat.className = 'clear-chat';
clearChat.innerHTML = '上下文已清除';
document.querySelector('.chat-body').appendChild(clearChat);
});
function openSettings() {
document.getElementById('settingsModal').style.display = 'block';
}
function closeSettings() {
document.getElementById('settingsModal').style.display = 'none';
}
function saveSettings() {
// Save settings
closeSettings();
}
function openModels() {
document.getElementById('modelsModal').style.display = 'block';
}
function closeModels() {
document.getElementById('modelsModal').style.display = 'none';
}
function saveModels() {
// Save settings
closeModels();
}
function createBubble(type, message, meta) {
let bubble = document.createElement('div');
bubble.className = 'message-bubble ' + type;
bubble.innerHTML = '<div>' + marked.parse(message) + '</div>';
if (!meta) {
meta = new Date().toLocaleTimeString();
}
let metaElement = document.createElement('div');
metaElement.className = 'message-meta';
metaElement.innerHTML = meta;
bubble.appendChild(metaElement);
document.querySelector('.chat-body').appendChild(bubble);
}
async function getAIResponse(message) {
const API_KEY = "AIzaSyDbfPdKZi-xP2ZV9tQYuE9CT3nLG4uocvk";
const API = "https://chat.miri.site/api/google/v1beta/models/gemini-1.5-pro-002:generateContent?key=" + API_KEY;
chatHistory.push({"file_data":{"mime_type": "application/pdf", "file_uri": 'https://atta.szlcsc.com/upload/public/pdf/source/20250121/8C54F29A638FDDF9ECA16A08EA5CF4A3.pdf'}})
const data = {
contents: [
chatHistory,
],
};
if (CACHE_NAME !== null) {
data.cachedContent = CACHE_NAME;
} else {
data.systemInstruction = { parts: [{ "text": "You are an electronic engineer. Use Chinese to answer." }] }
}
const response = await fetch(API, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer nk-@FangZhijian666"
},
body: JSON.stringify(data)
});
const result = await response.json();
const content = result.candidates[0].content.parts[0].text;
createBubble('model', content, undefined);
chatHistory.push({ role: 'model', parts: [{ text: content }] });
}
async function setCache(cache) {
const API_KEY = "AIzaSyDbfPdKZi-xP2ZV9tQYuE9CT3nLG4uocvk";
let API = "https://chat.miri.site/api/google/v1beta/cachedContents?key=" + API_KEY;
const data = {
model: "models/gemini-1.5-flash-002",
contents: [
{ role: 'user', parts: [{ inline_data: { mime_type: "text/plain", data: cache} }] }
],
systemInstruction: {
parts: [
{
"text": "You are an electronic engineer. The text describes a netlist of circuit diagrams. Use Chinese to answer."
}
]
},
}
const response = await fetch(API, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer nk-@FangZhijian666"
},
body: JSON.stringify(data)
});
const result = await response.json();
CACHE_NAME = result.name;
console.log(result);
}
function getNetlist() {
const netlist = cache_test = '{"gge8ad02db137941b21":{"props":{"3DModel":"LED0603_Red","Manufacturer":"EVERLIGHT(台湾亿光)","Manufacturer Part":"19-217/R6C-AL1M2VY/3T","Supplier Part":"C72044","Supplier":"LCSC","Description":"","Designator":"LEDP1","Footprint":"1c3403fac7274420844b7a4b2d5658f1","Origin Footprint":"LED0603_RED","Unique ID":"gge8ad02db137941b21","Device":"f7187ca50d084458b003dc1670cc17a3","Symbol":"9b480c0e25fe4c86a648476b2c645ab9","Name":"LED-0603_R","link":"","Convert to PCB":"yes","Add into BOM":"yes","Reuse Block":"","Group ID":"","Channel ID":"$1e17","FootprintName":"LED0603_RED","DeviceName":"LED-0603_R","SymbolName":"LED-0603_R","Footprint Name":"LED0603_RED"},"pins":{"1":"$1N55","2":"GND"}},"gge223382a3c8597f04":{"props":{"link":"","Supplier":"LCSC","Supplier Part":"C668624","Manufacturer":"SHOU HAN","Manufacturer Part":"TYPE-C 16P(073)","Description":"","Designator":"USB1","Footprint":"facc680455f54a0588b137d754f701ea","Origin Footprint":"TYPEC-16P 长金手指母座","Unique ID":"gge223382a3c8597f04","Device":"55fb19c69a7744f18df2973467ea525d","Symbol":"5a9b6aef07f74f46b27c271e4fc5ac54","Name":"TYPE-C 16P(073)","Convert to PCB":"yes","Add into BOM":"yes","Reuse Block":"","Group ID":"","Channel ID":"$1e28","FootprintName":"TYPEC-16P 长金手指母座","DeviceName":"TYPE-C 16P(073)","SymbolName":"TYPE-C 16P(073)","Footprint Name":"TYPEC-16P 长金手指母座"},"pins":{"1":"GND","2":"GND","3":"GND","4":"GND","B1A12":"GND","B4A9":"+VIN","B8":"","B7":"USBD-","B6":"USBD+","B5":"","A8":"","A7":"USBD-","A6":"USBD+","A5":"","A4B9":"+VIN","A1B12":"GND"}},"gge7be1944ff7264613":{"props":{"Supplier":"LCSC","Supplier Part":"C425623","Manufacturer":"UNI-ROYAL(Uniroyal Elec)","Manufacturer Part":"TC0325F4700T5E","Description":"","Designator":"R12","Footprint":"aef89dcaa2794fb39a7b40469ca4cd1a","Origin Footprint":"R0603","Unique ID":"gge7be1944ff7264613","Device":"ea0b11391a294e21bd87a8139a01eed9","Symbol":"7a7607b4e3434f84b81227bd359bec42","Name":"470R","Convert to PCB":"yes","Add into BOM":"yes","Reuse Block":"","Group ID":"","Channel ID":"$1e65","FootprintName":"R0603","DeviceName":"470R","SymbolName":"470R","Footprint Name":"R0603"},"pins":{"1":"TXD","2":"$1N709"}},"gge7e2776ef08ee9b8f":{"props":{"Supplier":"LCSC","Supplier Part":"C425623","Manufacturer":"UNI-ROYAL(Uniroyal Elec)","Manufacturer Part":"TC0325F4700T5E","Description":"","Designator":"R1","Footprint":"aef89dcaa2794fb39a7b40469ca4cd1a","Origin Footprint":"R0603","Unique ID":"gge7e2776ef08ee9b8f","Device":"ea0b11391a294e21bd87a8139a01eed9","Symbol":"7a7607b4e3434f84b81227bd359bec42","Name":"470R","Convert to PCB":"yes","Add into BOM":"yes","Reuse Block":"","Group ID":"","Channel ID":"$1e75","FootprintName":"R0603","DeviceName":"470R","SymbolName":"470R","Footprint Name":"R0603"},"pins":{"1":"RXD","2":"$1N710"}},"ggedbc5ec2a0386f057":{"props":{"link":"https://item.szlcsc.com/362304.html","3DModel":"C0603_L1.6-W0.8-H0.8","Supplier":"LCSC","Manufacturer":"SAMSUNG","Manufacturer Part":"CL10B104KA8NNNC","Supplier Part":"C1590","Description":"","Designator":"C6","Footprint":"d78a5eb2e64b4030814cbb58b55fdfec","Origin Footprint":"C0603","Unique ID":"ggedbc5ec2a0386f057","Device":"7af760c3e4dd424b958576930d1b303c","Symbol":"e32ffa53558d4943a80b02adc9530318","Name":"100nF","Convert to PCB":"yes","Add into BOM":"yes","Reuse Block":"","Group ID":"","Channel ID":"$1e89","FootprintName":"C0603","DeviceName":"100nF","SymbolName":"100nF","Footprint Name":"C0603"},"pins":{"1":"GND","2":"$1N181"}},"ggec2fcc0797c908bae":{"props":{"link":"https://item.szlcsc.com/362304.html","3DModel":"C0603_L1.6-W0.8-H0.8","Supplier":"LCSC","Manufacturer":"SAMSUNG","Manufacturer Part":"CL10B104KA8NNNC","Supplier Part":"C1590","Description":"","Designator":"C5","Footprint":"d78a5eb2e64b4030814cbb58b55fdfec","Origin Footprint":"C0603","Unique ID":"ggec2fcc0797c908bae","Device":"7af760c3e4dd424b958576930d1b303c","Symbol":"e32ffa53558d4943a80b02adc9530318","Name":"100nF","Convert to PCB":"yes","Add into BOM":"yes","Reuse Block":"","Group ID":"","Channel ID":"$1e99","FootprintNam
const cache = btoa(encodeURIComponent(netlist));
setCache(cache);
}
// 当用户 Ctrl+V 时,将粘贴图片作为 id 为 paste-image 元素的背景
document.addEventListener('paste', function (event) {
const items = (event.clipboardData || window.clipboardData).items;
for (let i = 0; i < items.length; i++) {
if (items[i].type.indexOf('image') !== -1) {
const blob = items[i].getAsFile();
const reader = new FileReader();
reader.onload = function (event) {
const pasteImage = document.getElementById('paste-image');
if (pasteImage) {
pasteImage.parentElement.style.display = 'block';
pasteImage.style.backgroundImage = `url(${event.target.result})`;
}
};
reader.readAsDataURL(blob);
}
}
});
document.getElementById('paste-image-delete-btn').addEventListener('click', function () {
const pasteImage = document.getElementById('paste-image');
if (pasteImage) {
pasteImage.parentElement.style.display = 'none';
pasteImage.style.backgroundImage = '';
}
});
</script>
</body>
</html>