Files
page-assist/src/web/web.ts

165 lines
17 KiB
TypeScript
Raw Normal View History

2024-03-23 14:44:05 +05:30
import { getWebSearchPrompt } from "~/services/ollama"
2024-04-28 00:36:33 +05:30
import { webGoogleSearch } from "./search-engines/google"
import { webDuckDuckGoSearch } from "./search-engines/duckduckgo"
import { getIsVisitSpecificWebsite, getSearchProvider } from "@/services/search"
2024-04-28 00:36:33 +05:30
import { webSogouSearch } from "./search-engines/sogou"
import { webBraveSearch } from "./search-engines/brave"
import { getWebsiteFromQuery, processSingleWebsite } from "./website"
import { searxngSearch } from "./search-engines/searxng"
2024-12-13 20:03:52 +05:30
import { braveAPISearch } from "./search-engines/brave-api"
2025-02-01 11:22:12 +05:30
import { webBaiduSearch } from "./search-engines/baidu"
2025-02-14 18:17:12 +08:00
import { searchIod } from "./iod"
import type { WebSearchResult } from "~/types/web"
import type { IodRegistryEntry } from "~/types/iod"
2025-08-17 22:39:12 +08:00
import {calculateTokenCount} from "./iod"
const getHostName = (url: string) => {
2024-03-31 15:57:56 +05:30
try {
const hostname = new URL(url).hostname
return hostname
} catch (e) {
return ""
}
}
async function searchWeb(
provider: string,
query: string
): Promise<WebSearchResult[]> {
let results = []
2024-03-31 15:57:56 +05:30
switch (provider) {
case "duckduckgo":
results = await webDuckDuckGoSearch(query)
break
2024-04-28 00:36:33 +05:30
case "sogou":
results = await webSogouSearch(query)
break
case "brave":
results = await webBraveSearch(query)
break
case "searxng":
results = await searxngSearch(query)
break
2024-12-13 20:03:52 +05:30
case "brave-api":
results = await braveAPISearch(query)
break
2025-02-01 11:22:12 +05:30
case "baidu":
results = await webBaiduSearch(query)
break
2024-03-31 15:57:56 +05:30
default:
results = await webGoogleSearch(query)
break
2024-03-31 15:57:56 +05:30
}
return results.map((r) => ({ ...r, name: getHostName(r.url) }))
}
2025-02-14 18:17:12 +08:00
export const getSystemPromptForWeb = async (
query: string,
keywords: string[] = [],
webSearch = true,
iodSearch = false
) => {
2024-03-31 15:57:56 +05:30
try {
const websiteVisit = getWebsiteFromQuery(query)
let webSearchResults: WebSearchResult[] = []
2025-02-14 18:17:12 +08:00
// let search_results_web = ""
2025-02-14 18:17:12 +08:00
if (webSearch) {
const isVisitSpecificWebsite = await getIsVisitSpecificWebsite()
2025-02-14 18:17:12 +08:00
if (isVisitSpecificWebsite && websiteVisit.hasUrl) {
const url = websiteVisit.url
const queryWithoutUrl = websiteVisit.queryWithouUrls
webSearchResults = await processSingleWebsite(url, queryWithoutUrl)
} else {
const searchProvider = await getSearchProvider()
webSearchResults = await searchWeb(searchProvider, query)
}
2025-02-14 18:17:12 +08:00
// search_results_web = webSearchResults
// .map(
// (result, idx) =>
// `<result source="${result.url}" id="${idx}">${result.content}</result>`
// )
// .join("\n")
}
let iodSearchResults: IodRegistryEntry[] = []
2025-02-14 18:17:12 +08:00
// let search_results_iod = ""
if (iodSearch) {
iodSearchResults = await searchIod(query, keywords)
// search_results_iod = iodSearchResults
// .map(
// (result, idx) =>
// `<result source="${result.url}" id="${idx}">${result.content}</result>`
// )
// .join("\n")
}
2025-02-23 13:02:32 +08:00
const _iodSearchResults = iodSearchResults
.map((res) => ({
doId: res.doId,
name: res.name,
url: res.url,
2025-08-17 22:39:12 +08:00
data_type: res.data_type,
2025-02-23 13:02:32 +08:00
data_space: res.data_space,
content: res.content || res.description,
2025-08-17 22:39:12 +08:00
tokenCount: (res.content || res.description)?calculateTokenCount((res.content || res.description)):0,
traceId:res?.traceId
2025-02-23 13:02:32 +08:00
}))
2025-08-19 17:36:17 +08:00
let iod_search_results = _iodSearchResults
.map(
2025-08-17 22:39:12 +08:00
(result, idx) =>{
const nameAttr = result.name ? ` name="${result.name}"` : '';
const sourceAttr = result.url ? ` source="${result.url}"` : '';
const dataTypeAttr = result.data_type ? ` dataType="${result.data_type}"` : '';
const dataSourceAttr = result.data_space ?` 数据来源="${result.data_space}"`:''
return `<result doId="${result.doId}"${nameAttr}${sourceAttr}${dataTypeAttr}${dataSourceAttr}" >${result.content}</result>`
}
)
.join("\n")
2025-08-20 18:36:48 +08:00
//iod_search_results+="<result doId=\"bdware.person/550e8400-e29b-41d4-a716-446655440000\" name=\"高翔\">姓名: 高翔, 一级学科: 生物学, 二级学科: 发育生物学, 研究方向: 实验动物、发育生物学、遗传学, 核心技术成果名称: 主要研究方向为运用基因组改造技术建立动物模型研究胚胎发育过程及生理稳态调控机制以及稳态失衡导致的复杂疾病的发病过程和分子机制。主持承担多项国家973计划、863计划和科技支撑计划等项目和课题总经费超过1.5亿元。发表论文180余篇它引5000余次。, 国籍: 中国</result>\n<result doId=\"bdware.persion/f47ac10b-58cc-4372-a567-0e02b2c3d479\">姓名: 赵静, 一级学科: 生物学, 二级学科: 遗传学, 研究方向: 实验动物、遗传学, 核心技术成果名称: 赵静博士拥有丰富的模型分析经验和国际项目管理经验参与管理了国际小鼠表型分析联盟IMPC和中英泛素化项目MADD等国际大型合作项目以及多个国家和省部级科技项目包括国家重大科技专项、国家科技支撑计划、863和973等项目经费总额超8500万元横向合作项目总额超1亿。, 国籍: 中国</result>\n<result doId=\"bdware.persion/c3ab8ff1-3c92-4b59-9e4c-4d5d3f5a6b7c\">姓名: 王宏宇, 一级学科: 生物学, 二级学科: 细胞生物学, 研究方向: 细胞生物学、分子生物学、代谢稳态调控研究, 核心技术成果名称: 王宏宇博士长期从事细胞生物学、分子生物学、代谢稳态调控的研究工作在基因编辑、实验动物模型构建、PDX模型构建以及抗代谢紊乱药物筛选方面有丰富的经验主持并参与多项国家及省级科研课题研究工作。在PNAS、Diabetes、Development 等杂志上发表科研型论文30余篇。现任江苏省集萃药康生物科技股份有限公司比较医学研究所技术总监全面主持基因编辑动物模型创制平台工作。该平台已完成3000多例基因工程动物模型的创制工作项目成功率在98%以上。, 国籍: 中国</result>\n<result doId=\"bdware.persion/a1b2c3d4-e5f6-7890-abcd-ef1234567890\">姓名: 琚存祥, 一级学科: 生物学, 二级学科: 动物学, 研究方向: 实验动物、基因编辑技术, 核心技术成果名称: 开发并优化基因编辑技术将其用于人类疾病大小鼠模型的开发及应用通过重度免疫缺陷鼠免疫重建及基因编辑等技术搭建成功人源化小鼠技术平台建立基因组编辑技CRISPR/Cas9平台并将该技术用于小鼠、大鼠基因改造模型开发有效降低脱靶效应同时显著提高基因打靶效率。, 国籍: 中国</result>\n<result doId=\"bdware.persion/98765432-10ab-cdef-2345-6789abcdef01\">姓名: 杨炳雄, 一级学科: 机械工程, 二级学科: 机械电子工程, 研究方向: 化合物半导体的结晶生长、器件制作、高速光电器件封装等领域的研究, 核心技术成果名称: 在国内成功实现10Gb/s激光发射器和光接收器的产业化生产产品性能指标达到国际先进水平。, 国籍: 中国</result>\n<result doId=\"12345678-9abc-def0-1234-56789abcdef0\">姓名: 聂晓霖, 一级学科: 材料科学与工程, 二级学科: 材料学, 研究方向: 热处理材料、金属材料、高分子材料、绿色工艺材料、金属加工介质、绿色金属表处理介质、钢铁轧制介质、工艺工程数智化、介质循环设备, 核心技术成果名称: 成功开发300余种工业介质在行业内广泛推广应用水溶性淬火介质、植物油基淬火介质等100余种产品推动了制造业热处理工艺的转型升级植物油基切削液、无磷切削液、无钡防锈油等100余种产品引领了高精密加工的低VOC技术发展无磷涂装前处理剂、无磷脱脂剂、无铬表面处理剂等50余种表面处理产品解决了重金属污染问题冷却特性测试仪、集中供液系统等20余种成套设备技术为产业绿色制造集成系统<E7B3BB>
//iod_search_results+="<result doId=\"bdware.sen/550e8400-e29b-41d4-a716-44665544020\" name=\"绿色生产工艺项目\">项目名称: 绿色生产工艺项目, 需方: 奥赛康药业, 供方: 美国Propella公司, 核心内容: 开发可分离纯化酶催化质子泵抑制剂反应液的膜分离工艺并筛选商业化的纳滤膜使反应液中目标产品截留量不低于90%</result>\n<result doId=\"bdware.sen/f47ac10b-58cc-4372-a567-0e02b2c3dddd479\" name=\"膨化饲料在线粘度检测及控制平台创建\">项目名称: 膨化饲料在线粘度检测及控制平台创建, 需方: 江苏丰尚智能科技有限公司, 供方: JITRI—Sioux联合研发中心, 核心内容: 本项目核心内容为“水产饲料膨化在线粘度检测”拟采用离线闭腔流变仪分析水产饲料的流变特性并评价直裂缝模流变仪对饲料配方的适用性。旨在通过引用缝模内联流变仪SDR和腔流变仪RPA建立双螺杆膨化流变模型。</result>";
const web_search_results = webSearchResults
.map(
(result, idx) =>
`<result source="${result.url}" name="${result.name}" id="${idx + 1}">${result.content}</result>`
)
.join("\n")
2024-03-31 15:57:56 +05:30
const current_date_time = new Date().toLocaleString()
2024-03-31 15:57:56 +05:30
const system = await getWebSearchPrompt()
2024-03-31 15:57:56 +05:30
const prompt = system
.replace("{current_date_time}", current_date_time)
.replace("{iod_search_results}", iod_search_results)
.replace("{web_search_results}", web_search_results)
2024-03-31 15:57:56 +05:30
return {
prompt,
2025-02-14 18:17:12 +08:00
webSources: webSearchResults.map((result) => {
return {
2024-03-31 15:57:56 +05:30
url: result.url,
name: result.name,
2024-03-31 15:57:56 +05:30
type: "url"
}
2025-02-14 18:17:12 +08:00
}),
2025-02-23 13:02:32 +08:00
iodSources: iodSearchResults,
iodSearchResults: _iodSearchResults,
iodTokenCount: _iodSearchResults.reduce((acc, cur) => (acc + cur.content.length), 0)
2024-03-31 15:57:56 +05:30
}
} catch (e) {
console.error(e)
return {
prompt: "",
webSources: [],
2025-02-24 08:36:42 +08:00
iodSources: [],
iodSearchResults: [],
iodTokenCount: 0,
}
2024-03-31 15:57:56 +05:30
}
}