Features: - Integrate unifuncs DeepSearch API (OpenAI compatible protocol) - SSE real-time streaming for AI thinking process display - Natural language input, auto-generate PubMed search strategy - Extract and display PubMed literature links - Database storage for task records (asl_research_tasks) Backend: - researchService.ts - Core business logic with SSE streaming - researchController.ts - SSE stream endpoint - researchWorker.ts - Async task worker (backup mode) - schema.prisma - AslResearchTask model Frontend: - ResearchSearch.tsx - Search page with unified content stream - ResearchSearch.css - Styling (unifuncs-inspired simple design) - ASLLayout.tsx - Enable menu item - api/index.ts - Add research API functions API Endpoints: - POST /api/v1/asl/research/stream - SSE streaming search - POST /api/v1/asl/research/tasks - Async task creation - GET /api/v1/asl/research/tasks/:taskId/status - Task status Documentation: - Development record for DeepSearch integration - Update ASL module status (v1.5) - Update system status (v3.7) Known limitations: - SSE mode, task interrupts when leaving page - Cost ~0.3 RMB per search (unifuncs API)
7.0 KiB
unifuncsAPI接入文档
两种模式:深度研究报告和深度搜索。
一、 深度研究报告模式 Model :选择请求模型。S2 API Key:sk-2fNwqUH73elGq0aDKJEM4ReqP7Ry0iqHo4OXyidDe2WpQ9XQ Introduction:设定研究员的角色和口吻 Plan Approval:执行研究前,是否生成一份研究计划,并等待用户批准或修改。默认关闭。 Reference Style:指定引用文献的输出格式,默认为 link,MarkDown Max Depth:研究的最大深度,建议在25轮为最佳 Domain Scope:自定义搜索网站,限定范围内研究(英文逗号分隔) Domain Blacklist:搜索网站黑名单,排除特定网站的内容(英文逗号分隔)。 Output Type:预期输出的文体类型,默认为report Output Prompt:自定义输出提示词,覆盖output_type的默认提示词。支持嵌入 {{introduction}} / {{output_length}} / {{content}} 占位符,content为用户提问。 Output Length:预期输出内容的长度(模型不一定遵守) Stream:是否流式响应
二、 深度搜索模式
https://unifuncs.com/api#deepsearch
参数说明:
Model: S2
API Key: sk-2fNwqUH73elGq0aDKJEM4ReqP7Ry0iqHo4OXyidDe2WpQ9XQ
Introduction:设定研究员的角色和口吻
Reference Style: link 和 character
指定引用文献的输出格式,默认为 link
Max Depth:研究的最大深度,建议在25轮为最佳
Domain Scope:自定义搜索网站,限定范围内研究(英文逗号分隔)。
Domain Blacklist:搜索网站黑名单,排除特定网站的内容(英文逗号分隔)
Output Prompt:自定义输出提示词,覆盖output_type的默认提示词。支持嵌入 {{introduction}} / {{output_length}} / {{content}} 占位符,content为用户提问。
Generate Summary: 是否开启异步任务完成后自动生成标题和摘要,默认关闭 (只有异步模式才有)
Stream:是否流式响应(只有Open AI 兼容协议模式才有)
2种调用方式:
一、Open AI兼容协议:
适用于直接接入到支持 OpenAI 协议的客户端,如 Cherry Studio / Dify 或 OpenAI SDK等。
// Please install OpenAI SDK first: `npm install openai`
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://api.unifuncs.com/deepsearch/v1',
apiKey: 'sk-2fNwqUH73elGq0aDKJEM4ReqP7Ry0iqHo4OXyidDe2WpQ9XQ',
});
async function main() {
const stream \= await client.chat.completions.create({
model: 's2',
messages: \[{ role: 'user', content: 'hi' }\],
stream: true,
introduction: "你是一名医学研究专家,负责检索文献",
max\_depth: 25,
domain\_scope: \["https://pubmed.ncbi.nlm.nih.gov/"\],
domain\_blacklist: \["wanfang.com"\],
output\_prompt: "输出文献内容",
reference\_style: "link"
});
let thinking \= false;
for await (const chunk of stream) {
if (chunk.choices\[0\]?.delta?.reasoning\_content) {
if (\!thinking) {
process.stdout.write('\<think\>\\n');
thinking \= true;
}
process.stdout.write(chunk.choices\[0\]?.delta?.reasoning\_content);
} else {
if (thinking) {
process.stdout.write('\\n\</think\>\\n\\n');
thinking \= false;
}
process.stdout.write(chunk.choices\[0\]?.delta?.content || '');
}
}
}
main();
二、 异步模式:
1. 创建任务 /v1/create_task
提交研究需求后立即返回 task_id,后端在后台执行。
// Node 18+ has fetch built-in
const payload = {
"model": "s2",
"messages": [
{
"role": "user",
"content": "hi"
}
],
"introduction": "你是一名医学研究专家,负责检索文献",
"max_depth": 25,
"domain_scope": [
"https://pubmed.ncbi.nlm.nih.gov/"
],
"domain_blacklist": [
"wanfang.com"
],
"output_prompt": "输出文献内容",
"reference_style": "link"
};
const res = await fetch("https://api.unifuncs.com/deepsearch/v1/create_task", {
method: "POST",
headers: {
"Authorization": "Bearer sk-2fNwqUH73elGq0aDKJEM4ReqP7Ry0iqHo4OXyidDe2WpQ9XQ",
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
});
console.log(await res.json());
示例响应:
{
"code": 0,
"message": "OK",
"data": {
"task\_id": "3aff2a91-7795-4b73-8dab-0593551a27a1",
"status": "pending",
"created\_at": "2025-12-09T03:52:40.771Z"
},
"requestId": "cd17faad-7310-4370-ba0c-0c2af6bc0597"
}
2. 查询任务 /v1/query_task
支持 GET / POST,传入 task_id 即可轮询状态;完成后会返回摘要与最终回答。
// Node 18+ has fetch built-in
const params = new URLSearchParams({ task_id: "3aff2a91-7795-4b73-8dab-0593551a27a1" });
const res = await fetch("https://api.unifuncs.com/deepsearch/v1/query_task?" + params.toString(), {
headers: {
"Authorization": "Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxx"
}
});
console.log(await res.json());
示例响应,已完成:
{
"code": 0,
"message": "OK",
"data": {
"task\_id": "3aff2a91-7795-4b73-8dab-0593551a27a1",
"status": "completed",
"result": {
"content": "你好!我是U深搜,一个专业的网络信息深度搜索专家 🤖\\n\\n我可以帮助你:\\n- 🔍 精准搜索和提取关键信息\\n- 📊 进行深度分析和多源验证\\n- 🕒 获取最新、最可靠的信息\\n- 💡 提供结构化的洞察和建议\\n\\n有什么问题想要我帮你深入搜索和分析吗?无论是技术资讯、市场动态、学术研究还是其他任何话题,我都能为你提供专业、准确的信息服务!",
"reasoning\_content": "用户只是简单地说了\\"hi\\",这是一个普通的问候。根据指导原则,如果是普通聊天或无法回答的问题,我应该使用友好的语气直接回复用户问题或介绍自己。\\n\\n这不需要进行任何搜索,我应该直接友好地回复,并简单介绍一下自己是U深搜这个深度搜索专家。"
},
"created\_at": "2025-12-09T03:52:40.771Z",
"updated\_at": "2025-12-09T03:52:45.912Z",
"progress": {
"current": 100,
"total": 100,
"message": "任务已完成"
},
"statistics": {
"iterations": 1,
"search\_count": 0,
"read\_count": 0,
"token\_usage": {
"prompt\_tokens": 4381,
"completion\_tokens": 167,
"total\_tokens": 4548
}
},
"session": {
"session\_id": "d3bee7f1-a44e-48b0-9283-a6866de723c3",
"status": "finished",
"model": "s2",
"title": "开启generate\_summary时生成标题",
"summary": "开启generate\_summary时生成摘要",
"question": "hi"
}
}
}