2025-03-26 13:40:54 +08:00
// eslint-disable-next-line @typescript-eslint/no-unused-vars
async function getAIResponse ( contents ) {
let response ;
let thinking = document . createElement ( 'div' ) ;
thinking . className = 'message-bubble model' ;
thinking . id = 'thinking' ;
thinking . innerHTML = '<div><div class="loading"></div> 思考中...</div>' ;
document . querySelector ( '.chat-body' ) . appendChild ( thinking ) ;
document . querySelector ( '.chat-body' ) . scrollTop = document . querySelector ( '.chat-body' ) . scrollHeight ;
2025-05-19 19:14:24 +08:00
if ( MODEL _GROUP === 'Gemini' ) {
2025-03-26 13:40:54 +08:00
response = await getGeminiResponse ( contents ) ;
2025-05-19 19:14:24 +08:00
} else if ( MODEL _GROUP === 'DeepSeek' ) {
2025-03-26 13:40:54 +08:00
response = await getDeepSeekResponse ( contents ) ;
2025-05-19 19:14:24 +08:00
} else if ( MODEL _GROUP === 'QWen' ) {
2025-03-26 13:40:54 +08:00
response = await getQWenResponse ( contents ) ;
2025-05-19 19:14:24 +08:00
} else if ( MODEL _GROUP === 'Custom' ) {
2025-03-26 13:40:54 +08:00
response = await getCustomResponse ( contents ) ;
} else {
2025-05-19 19:14:24 +08:00
response = { err _code : 1 , error : '模型不被支持' } ;
2025-03-26 13:40:54 +08:00
}
console . log ( response ) ;
if ( response . err _code === 0 ) {
document . getElementById ( 'thinking' ) . remove ( ) ;
let content = response . response ;
content = content . replace ( /\u003cthink\u003e/ , '<div class="think">' ) . replace ( /\u003c\/think\u003e/ , '</div>' ) ;
createBubble ( 'model' , content , undefined ) ;
2025-05-19 19:14:24 +08:00
if ( MODEL _GROUP === 'Gemini' ) {
2025-03-26 13:40:54 +08:00
chatHistory . push ( { role : 'model' , parts : [ { text : content } ] } ) ;
2025-05-19 19:14:24 +08:00
} else if ( MODEL _GROUP === 'DeepSeek' || MODEL _GROUP === 'Qwen' || MODEL _GROUP === 'Custom' ) {
2025-03-26 13:40:54 +08:00
chatHistory . push ( { role : 'assistant' , content : content } ) ;
}
2025-05-19 19:14:24 +08:00
if ( CHAT _TITLE === '新的对话' ) {
2025-03-26 13:40:54 +08:00
let temp = chatHistory . slice ( ) ;
2025-05-19 19:14:24 +08:00
if ( MODEL _GROUP === 'Gemini' ) {
temp . push ( { role : 'user' , parts : [ { text : '用几个字总结这个对话,将其作为对话的标题' } ] } ) ;
2025-03-26 13:40:54 +08:00
2025-05-19 19:14:24 +08:00
getGeminiResponse ( temp ) . then ( ( response ) => {
2025-03-26 13:40:54 +08:00
if ( response . err _code === 0 ) {
const summary = response . response ;
CHAT _TITLE = summary . replace ( '*' , '' ) ;
document . getElementById ( 'title' ) . innerText = summary ;
}
} ) ;
2025-05-19 19:14:24 +08:00
} else if ( MODEL _GROUP === 'DeepSeek' ) {
temp . push ( { role : 'user' , content : '用几个字总结这个对话,将其作为对话的标题,除此以外不要有任何其他文字' } ) ;
2025-03-26 13:40:54 +08:00
2025-05-19 19:14:24 +08:00
getDeepSeekResponse ( temp ) . then ( ( response ) => {
2025-03-26 13:40:54 +08:00
if ( response . err _code === 0 ) {
const summary = response . response ;
CHAT _TITLE = summary . replace ( / \ u 0 0 3 c t h i n k \ u 0 0 3 e . * \ u 0 0 3 c \ / t h i n k \ u 0 0 3 e / m s , ' ' ) . r e p l a c e ( ' * ' , ' ' ) ;
document . getElementById ( 'title' ) . innerText = CHAT _TITLE ;
}
} ) ;
2025-05-19 19:14:24 +08:00
} else if ( MODEL _GROUP === 'QWen' ) {
temp . push ( { role : 'user' , content : '用几个字总结这个对话,将其作为对话的标题,除此以外不要有任何其他文字' } ) ;
2025-03-26 13:40:54 +08:00
2025-05-19 19:14:24 +08:00
getQWenResponse ( temp ) . then ( ( response ) => {
2025-03-26 13:40:54 +08:00
if ( response . err _code === 0 ) {
const summary = response . response ;
CHAT _TITLE = summary . replace ( / \ u 0 0 3 c t h i n k \ u 0 0 3 e . * \ u 0 0 3 c \ / t h i n k \ u 0 0 3 e / m s , ' ' ) . r e p l a c e ( ' * ' , ' ' ) ;
document . getElementById ( 'title' ) . innerText = CHAT _TITLE ;
}
} ) ;
2025-05-19 19:14:24 +08:00
} else if ( MODEL _GROUP === 'Custom' ) {
temp . push ( { role : 'user' , content : '用几个字总结这个对话,将其作为对话的标题,除此以外不要有任何其他文字' } ) ;
2025-03-26 13:40:54 +08:00
getCustomResponse ( temp ) . then ( ( response ) => {
if ( response . err _code === 0 ) {
const summary = response . response ;
2025-05-19 19:14:24 +08:00
CHAT _TITLE = summary
. replace ( / < t h i n k > . * < \ / t h i n k > / m s , ' ' )
. replaceAll ( '*' , '' )
. replaceAll ( '\n' , '' ) ;
2025-03-26 13:40:54 +08:00
document . getElementById ( 'title' ) . innerText = CHAT _TITLE ;
}
} ) ;
}
}
} else {
document . getElementById ( 'thinking' ) . remove ( ) ;
2025-05-19 19:14:24 +08:00
createBubble ( 'model' , response . error , '异常' ) ;
2025-03-26 13:40:54 +08:00
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
async function setAICache ( cache ) {
2025-05-19 19:14:24 +08:00
if ( MODEL _GROUP === 'Gemini' && MODEL _NAME !== 'gemini-2.0-flash-001' ) {
2025-03-26 13:40:54 +08:00
return await setGeminiCache ( cache ) ;
2025-05-19 19:14:24 +08:00
} else if ( MODEL _GROUP === 'QWen' || MODEL _GROUP === 'DeepSeek' || MODEL _GROUP === 'Custom' ) {
2025-03-26 13:40:54 +08:00
return await setOtherCache ( decodeURIComponent ( atob ( cache ) ) ) ;
2025-05-19 19:14:24 +08:00
} else if ( MODEL _GROUP === 'Gemini' && MODEL _NAME === 'gemini-2.0-flash-001' ) {
2025-03-26 13:40:54 +08:00
return await setOtherCache ( decodeURIComponent ( atob ( cache ) ) ) ;
} else {
2025-05-19 19:14:24 +08:00
createBubble ( 'model' , '抱歉,该模型不支持缓存长上下文' , '异常' ) ;
2025-03-26 13:40:54 +08:00
}
}
async function getGeminiResponse ( contents ) {
2025-05-19 19:14:24 +08:00
const API = GOOGLE _SETTINGS . HOST + '/v1beta/models/' + MODEL _NAME + ':generateContent?key=' + GOOGLE _SETTINGS . API _KEY ;
2025-03-26 13:40:54 +08:00
console . log ( chatHistory ) ;
const data = {
2025-05-19 19:14:24 +08:00
contents : [ contents ] ,
2025-03-26 13:40:54 +08:00
safetySettings : [
[
{
2025-05-19 19:14:24 +08:00
'category' : 'HARM_CATEGORY_HARASSMENT' ,
'threshold' : 'BLOCK_ONLY_HIGH' ,
2025-03-26 13:40:54 +08:00
} ,
{
2025-05-19 19:14:24 +08:00
'category' : 'HARM_CATEGORY_HATE_SPEECH' ,
'threshold' : 'BLOCK_ONLY_HIGH' ,
2025-03-26 13:40:54 +08:00
} ,
{
2025-05-19 19:14:24 +08:00
'category' : 'HARM_CATEGORY_SEXUALLY_EXPLICIT' ,
'threshold' : 'BLOCK_ONLY_HIGH' ,
2025-03-26 13:40:54 +08:00
} ,
{
2025-05-19 19:14:24 +08:00
'category' : 'HARM_CATEGORY_DANGEROUS_CONTENT' ,
'threshold' : 'BLOCK_ONLY_HIGH' ,
} ,
] ,
] ,
2025-03-26 13:40:54 +08:00
} ;
if ( CACHE _NAME !== null ) {
data . cachedContent = CACHE _NAME ;
} else {
2025-05-19 19:14:24 +08:00
data . systemInstruction = { parts : [ { 'text' : 'You are an electronic engineer. Use Chinese to answer.' } ] } ;
2025-03-26 13:40:54 +08:00
}
try {
2025-05-19 19:14:24 +08:00
const response = await eda . sys _ClientUrl . request ( API , 'POST' , JSON . stringify ( data ) , { headers : GOOGLE _SETTINGS . HEADER } ) ;
2025-03-26 13:40:54 +08:00
if ( response . status !== 200 ) {
throw new Error ( response . statusText ) ;
}
const result = await response . json ( ) ;
return {
response : result . candidates [ 0 ] . content . parts [ 0 ] . text ,
2025-05-19 19:14:24 +08:00
err _code : 0 ,
2025-03-26 13:40:54 +08:00
} ;
} catch ( error ) {
return {
2025-05-19 19:14:24 +08:00
error : error . message || '请求失败' ,
err _code : 1 ,
2025-03-26 13:40:54 +08:00
} ;
}
}
async function getDeepSeekResponse ( contents ) {
2025-05-19 19:14:24 +08:00
const API = DS _SETTINGS . HOST + '/chat/completions' ;
2025-03-26 13:40:54 +08:00
let HEADERS = DS _SETTINGS . HEADER ;
HEADERS [ 'Authorization' ] = 'Bearer ' + DS _SETTINGS . API _KEY ;
const data = {
model : MODEL _NAME ,
messages : contents ,
2025-05-19 19:14:24 +08:00
stream : false ,
} ;
2025-03-26 13:40:54 +08:00
try {
2025-05-19 19:14:24 +08:00
const response = await eda . sys _ClientUrl . request ( API , 'POST' , JSON . stringify ( data ) , { headers : HEADERS } ) ;
2025-03-26 13:40:54 +08:00
if ( response . status !== 200 ) {
throw new Error ( response . statusText ) ;
}
const result = await response . json ( ) ;
return {
response : result . choices [ 0 ] . message . content ,
2025-05-19 19:14:24 +08:00
err _code : 0 ,
2025-03-26 13:40:54 +08:00
} ;
} catch ( error ) {
return {
2025-05-19 19:14:24 +08:00
error : error . message || '请求失败' ,
err _code : 1 ,
2025-03-26 13:40:54 +08:00
} ;
}
}
async function getQWenResponse ( contents ) {
2025-05-19 19:14:24 +08:00
const API = QWEN _SETTINGS . HOST + '/compatible-mode/v1/chat/completions' ;
2025-03-26 13:40:54 +08:00
let HEADERS = QWEN _SETTINGS . HEADER ;
HEADERS [ 'Authorization' ] = 'Bearer ' + QWEN _SETTINGS . API _KEY ;
const data = {
model : MODEL _NAME ,
messages : contents ,
2025-05-19 19:14:24 +08:00
} ;
2025-03-26 13:40:54 +08:00
try {
2025-05-19 19:14:24 +08:00
const response = await eda . sys _ClientUrl . request ( API , 'POST' , JSON . stringify ( data ) , { headers : HEADERS } ) ;
2025-03-26 13:40:54 +08:00
if ( response . status !== 200 ) {
throw new Error ( response . statusText ) ;
}
const result = await response . json ( ) ;
return {
response : result . choices [ 0 ] . message . content ,
2025-05-19 19:14:24 +08:00
err _code : 0 ,
2025-03-26 13:40:54 +08:00
} ;
} catch ( error ) {
return {
2025-05-19 19:14:24 +08:00
error : error . message || '请求失败' ,
err _code : 1 ,
2025-03-26 13:40:54 +08:00
} ;
}
}
async function getCustomResponse ( contents ) {
const API = CUSTOM _SETTINGS . HOST + CUSTOM _SETTINGS . ENDPOINT ;
const data = {
model : CUSTOM _SETTINGS . MODEL ,
messages : contents ,
2025-05-19 19:14:24 +08:00
stream : false ,
} ;
2025-03-26 13:40:54 +08:00
try {
2025-05-19 19:14:24 +08:00
const response = await eda . sys _ClientUrl . request ( API , 'POST' , JSON . stringify ( data ) , { headers : CUSTOM _SETTINGS . HEADER } ) ;
2025-03-26 13:40:54 +08:00
if ( response . status !== 200 ) {
throw new Error ( response . statusText ) ;
}
const result = await response . json ( ) ;
return {
response : result . choices [ 0 ] . message . content ,
2025-05-19 19:14:24 +08:00
err _code : 0 ,
2025-03-26 13:40:54 +08:00
} ;
} catch ( error ) {
return {
2025-05-19 19:14:24 +08:00
error : error . message || '请求失败' ,
err _code : 1 ,
2025-03-26 13:40:54 +08:00
} ;
}
}
async function setGeminiCache ( cache ) {
2025-05-19 19:14:24 +08:00
let API = GOOGLE _SETTINGS . HOST + '/v1beta/cachedContents?key=' + GOOGLE _SETTINGS . API _KEY ;
2025-03-26 13:40:54 +08:00
const data = {
2025-05-19 19:14:24 +08:00
model : 'models/' + MODEL _NAME ,
2025-03-26 13:40:54 +08:00
contents : [
2025-05-19 19:14:24 +08:00
{
role : 'user' ,
parts : [
{ inline _data : { mime _type : 'text/plain' , data : cache } } ,
{ text : "Here's a netlist file describing the circuit diagram, and I'm going to ask you questions about it." } ,
] ,
} ,
2025-03-26 13:40:54 +08:00
] ,
systemInstruction : {
parts : [
{
2025-05-19 19:14:24 +08:00
'text' : 'You are an electronic engineer. The text describes a netlist of circuit diagrams. When asked a question about a component, it is displayed if there is a URL in the netlist, otherwise it is not. Use Chinese to answer.' ,
} ,
] ,
2025-03-26 13:40:54 +08:00
} ,
2025-05-19 19:14:24 +08:00
} ;
2025-03-26 13:40:54 +08:00
let thinking = document . createElement ( 'div' ) ;
thinking . className = 'message-bubble model' ;
thinking . id = 'thinking' ;
thinking . innerHTML = '<div><div class="loading"></div> 解读中...</div>' ;
document . querySelector ( '.chat-body' ) . appendChild ( thinking ) ;
document . querySelector ( '.chat-body' ) . scrollTop = document . querySelector ( '.chat-body' ) . scrollHeight ;
2025-05-19 19:14:24 +08:00
eda . sys _ClientUrl
. request ( API , 'POST' , JSON . stringify ( data ) , { headers : GOOGLE _SETTINGS . HEADER } )
. then ( ( response ) => {
if ( response . status !== 200 ) {
throw new Error ( response . statusText ) ;
}
return response . json ( ) ;
} )
. then ( ( result ) => {
document . getElementById ( 'thinking' ) . remove ( ) ;
createBubble ( 'model' , '好的,接下来你可以围绕这张原理图向我提问' , undefined ) ;
CACHE _NAME = result . name ;
} )
. catch ( ( error ) => {
document . getElementById ( 'thinking' ) . remove ( ) ;
createBubble ( 'model' , error . toString ( ) , '异常' ) ;
} ) ;
2025-03-26 13:40:54 +08:00
}
async function setOtherCache ( cache ) {
chatHistory . push ( { role : 'user' , content : '这是一个电路图的网表,后续回答依照这个网表回答:' + cache } ) ;
2025-05-19 19:14:24 +08:00
chatHistory . push ( { role : 'assistant' , content : '好的,我了解了' } ) ;
2025-03-26 13:40:54 +08:00
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function getNetlist ( ) {
let netlist = '' ;
2025-05-19 19:14:24 +08:00
eda . sch _Netlist . getNetlist ( ) . then ( ( data ) => {
netlist = data . toString ( ) ;
2025-03-26 13:40:54 +08:00
const cache = btoa ( encodeURIComponent ( netlist ) ) ;
// 获取 cache 的字节数
let size = cache . length ;
let unit = 'B' ;
if ( size > 1024 ) {
size /= 1024 ;
unit = 'KB' ;
}
if ( size > 1024 ) {
size /= 1024 ;
unit = 'MB' ;
}
let fileBubble = document . createElement ( 'div' ) ;
fileBubble . classList . add ( 'file-bubble' ) ;
fileBubble . innerHTML = ` <img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMjMuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iJiN4NTZGRTsmI3g1QzQyO18xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDE2IDE2OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxyZWN0IHN0eWxlPSJmaWxsOm5vbmU7IiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiLz4KPHJlY3Qgc3R5bGU9ImZpbGw6bm9uZTsiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIvPgo8cGF0aCBkPSJNMTUsNGgtMVYyYzAtMC41NS0wLjQ1LTEtMS0xSDRDMy40NSwxLDMsMS40NSwzLDJ2NEgxLjVDMS4yMiw2LDEsNi4yMiwxLDYuNUMxLDYuNzgsMS4yMiw3LDEuNSw3SDNoMWgxLjUKCUM1Ljc4LDcsNiw2Ljc4LDYsNi41QzYsNi4yMiw1Ljc4LDYsNS41LDZINFYyaDl2MmgtMWMtMC41NSwwLTEsMC40NS0xLDF2N2MwLDAuNTUsMC40NSwxLDEsMWgxdjJINHYtNGgxLjVDNS43OCwxMSw2LDEwLjc4LDYsMTAuNQoJQzYsMTAuMjIsNS43OCwxMCw1LjUsMTBINEgzSDEuNUMxLjIyLDEwLDEsMTAuMjIsMSwxMC41QzEsMTAuNzgsMS4yMiwxMSwxLjUsMTFIM3Y0YzAsMC41NSwwLjQ1LDEsMSwxaDljMC41NSwwLDEtMC40NSwxLTF2LTJoMQoJYzAuNTUsMCwxLTAuNDUsMS0xVjVDMTYsNC40NSwxNS41NSw0LDE1LDR6IE0xNSwxMmgtMWgtMWgtMVY1aDFoMWgxVjEyeiIvPgo8L3N2Zz4K" alt="File Icon" class="file-icon">
< div class = "file-info" >
< div class = "file-name" > 网表文件 < / d i v >
< div class = "file-size" > $ { size } $ { unit } < / d i v >
< / d i v > ` ;
document . querySelector ( '.chat-body' ) . appendChild ( fileBubble ) ;
setAICache ( cache ) ;
2025-05-19 19:14:24 +08:00
} ) ;
2025-03-26 13:40:54 +08:00
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
async function setAIFile ( ) {
2025-05-19 19:14:24 +08:00
if ( MODEL _GROUP !== 'Gemini' ) {
2025-03-26 13:40:54 +08:00
eda . sys _Message . showToastMessage ( '当前模型尚未支持该功能' , 'warn' ) ;
return ;
}
2025-05-19 19:14:24 +08:00
const file = await eda . sys _FileSystem . openReadFileDialog ( '.pdf' ) ;
2025-03-26 13:40:54 +08:00
const reader = new FileReader ( ) ;
reader . onload = function ( event ) {
const base64 = event . target . result ;
const title = file . name ;
// 判断是不是 pdf 文件
if ( file . type !== 'application/pdf' ) {
eda . sys _Message . showToastMessage ( '仅可上传 PDF 格式的数据手册' , 'warn' ) ;
return ;
}
FILE _BASE64 = base64 . replaceAll ( 'data:application/pdf;base64,' , '' ) ;
// 如果 chat-body 中最后一个元素是 file-bubble, 替换之
const chatBody = document . querySelector ( '.chat-body' ) ;
const lastElement = chatBody . lastElementChild ;
if ( lastElement && lastElement . classList . contains ( 'file-bubble' ) ) {
lastElement . remove ( ) ;
}
// 创建 file bubble
let size = FILE _BASE64 . length ;
let unit = 'B' ;
if ( size > 1024 ) {
size /= 1024 ;
unit = 'KB' ;
}
if ( size > 1024 ) {
size /= 1024 ;
unit = 'MB' ;
}
let fileBubble = document . createElement ( 'div' ) ;
fileBubble . classList . add ( 'file-bubble' ) ;
fileBubble . innerHTML = ` <img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMjMuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iJiN4NTZGRTsmI3g1QzQyO18xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiCgkgeT0iMHB4IiB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDE2IDE2OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxwYXRoIGQ9Ik04LjI5NiwxSDNDMi40NDgsMSwyLDEuNDQ4LDIsMnYxM2MwLDAuNTUyLDAuNDQ4LDEsMSwxaDEwYzAuNTUyLDAsMS0wLjQ0OCwxLTFWNS43MDRjMC0wLjI2NS0wLjEwNS0wLjUyLTAuMjkzLTAuNzA3CgljLTAuMzYyLTAuMjg1LTAuNzI1LTAuNTcxLTEuMDg3LTAuODU2Yy0wLjcwNi0wLjU1Ni0xLjQxMi0xLjExMi0yLjExOC0xLjY2OGMtMC4zNjgtMC4yOS0wLjc0NC0wLjU3MS0xLjExLTAuODY0CglDOS4wNTcsMS4zNDIsOC43NTcsMSw4LjI5NiwxeiBNMTIuMjksNUg5VjIuNzFMMTIuMjksNXogTTMsMTVWMmg1djNjMCwwLjU1MiwwLjQ0OCwxLDEsMWg0djlIM3oiLz4KPHJlY3Qgc3R5bGU9ImZpbGw6bm9uZTsiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIvPgo8cmVjdCBzdHlsZT0iZmlsbDpub25lOyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+Cjwvc3ZnPgo=" alt="File Icon" class="file-icon">
< div class = "file-info" >
< div class = "file-name" > $ { title } < / d i v >
< div class = "file-size" > $ { size } $ { unit } < / d i v >
< / d i v > ` ;
document . querySelector ( '.chat-body' ) . appendChild ( fileBubble ) ;
} ;
reader . readAsDataURL ( file ) ;
}
/* 废弃 */
// eslint-disable-next-line @typescript-eslint/no-unused-vars
async function getDatasheetUrl ( ) {
try {
const selectedPrimitives = await eda . sch _SelectControl . getAllSelectedPrimitives _PrimitiveId ( ) ;
const primitive = await eda . sch _PrimitiveComponent . get ( selectedPrimitives [ 0 ] ) ;
let url = primitive [ 0 ] . otherProperty . Datasheet ;
// atta.szlcsc.com -> atta-szlcsc.mirror.soraharu.com
url = url . replace ( 'atta.szlcsc.com' , 'atta-szlcsc.mirror.soraharu.com' ) ;
console . log ( url ) ;
return url ;
} catch ( error ) {
console . error ( error ) ;
return null ;
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
async function getDatasheetData ( url ) {
console . log ( url ) ;
try {
const response = await eda . sys _ClientUrl . request ( url ) ;
const data = await response . text ( ) ;
console . log ( data ) ;
return data ;
} catch ( error ) {
console . error ( error ) ;
return null ;
}
}