Files
AIclinicalresearch/docs/03-业务模块/ASL-AI智能文献/02-技术设计/02-API设计规范.md
HaHafeng 1b53ab9d52 feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
2026-01-14 19:15:01 +08:00

31 KiB
Raw Blame History

AI<EFBFBD><EFBFBD><EFBFBD><EFBFBD>讃璅<EFBFBD> - API霈曇恣閫<E681A3><E996AB>

*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦嚗? v3.0
*<EFBFBD>𥕦遣<EFBFBD><EFBFBD>嚗? 2025-10-29
蝏湔擪<EFBFBD><EFBFBD><EFBFBD> AI<41><EFBFBD><E7AE84><EFBFBD>讃撘<E8AE83><E69298>穃𣪧<E7A983>? <EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD><EFBFBD> 2025-11-23
*<EFBFBD>湔鰵霂湔<EFBFBD>嚗? <20><EFBFBD><E595A3><EFBFBD>憭滨<E686AD>API嚗?銝芣瓲敹<E793B2>𦻖<EFBFBD><F0A6BB96><EFBFBD>


<EFBFBD><EFBFBD> <20><>﹝霂湔<E99C82>

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>餈蚊I<EFBFBD><EFBFBD><EFBFBD><EFBFBD>讃璅<EFBFBD><EFBFBD><EFBFBD>PI霈曇恣閫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>祆𦻖<EFBFBD><EFBFBD><EFBFBD>銋剹<EFBFBD><EFBFBD>窈瘙<EFBFBD><EFBFBD>摨娍聢撘譌<EFBFBD><EFBFBD><EFBFBD>霂臬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? API<EFBFBD><EFBFBD>靽⊥<EFBFBD>:

  • Base URL: http://localhost:3001 (撘<><E69298>𤑳㴓憓?
  • API<EFBFBD><EFBFBD>: /api/v1/asl
  • <EFBFBD>讛悅: HTTP/HTTPS
  • <EFBFBD>唳旿<EFBFBD><EFBFBD>: JSON
  • 霈方<EFBFBD><EFBFBD><EFBFBD>: JWT Token (瘚贝<E7989A><E8B49D>嗆挾<E59786><EFBFBD>暺䁅恕<E48185><EFBFBD>)

<EFBFBD><EFBFBD> API霈曇恣<E69B87><EFBFBD>

  1. RESTful霈曇恣: <20>萄儐RESTful API霈曇恣閫<E681A3><E996AB>
  2. 蝏煺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: { success: boolean, data?: any, error?: string }
  3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20>𡑒”<F0A19192>亙藁<E4BA99><EFBFBD><E88880><EFBFBD><EFBFBD><E296B3>
  4. <EFBFBD><EFBFBD>𧋦<EFBFBD><EFBFBD>: API<50><49>𧋦<EFBFBD>𣇉恣<F0A38789>?(/api/v1/...)
  5. <EFBFBD>躰秤憭<EFBFBD><EFBFBD>: 蝏煺<E89D8F><E785BA><EFBFBD>TTP<54><EFBFBD><E59786><EFBFBD><EFBFBD><EFBFBD>霂舀<E99C82><E88880>?6. **璅<E79285><E288AA>𤥁楝<F0A4A581>?*: /api/v1/asl/... <20><EFBFBD>頝舐眏蝛粹𡢿

<EFBFBD><20><EFBFBD>API<50>亙藁

1. 憿寧𤌍蝞∠<E89D9E> (Projects)

1.1 <20>𥕦遣蝑偦<E89D91>厰★<E58EB0>?

<EFBFBD>亙藁: POST /api/v1/asl/projects
霈方<EFBFBD>: <20><>閬?(瘚贝<E7989A><E8B49D>嗆挾暺䁅恕<E48185><EFBFBD>ID)
霂湔<EFBFBD>: <20>𥕦遣銝<E981A3>銝芣鰵<E88AA3><E9B0B5><EFBFBD><EFBFBD><EFBFBD><E6A183>厰★<E58EB0>? **霂瑟<E99C82>雿?*:

{
  "projectName": "SGLT2<54><EFBFBD><E7A983><EFBFBD>頂蝏毺遞餈?,
  "picoCriteria": {
    "P": "2<EFBFBD><EFBFBD>撠輻<EFBFBD><EFBFBD>𣂷犖<EFBFBD><EFBFBD><EFBFBD>?,
    "I": "SGLT2<54><EFBFBD><E7A983><EFBFBD><EFBFBD>empagliflozin<69><6E>apagliflozin蝑㚁<E89D91>",
    "C": "摰㗇<E691B0><E39787><EFBFBD><EFBFBD>撣貉<E692A3><E8B289><EFBFBD><E6BBA8><EFBFBD>",
    "O": "敹<><E695B9>蝞∠<E89D9E><EFBFBD>嚗㇈ACE<43><45><EFBFBD>銵唬<E98AB5><E594AC><EFBFBD><EFBCB5><EFBFBD><EFBFBD>蝞⊥香鈭∴<E988AD>",
    "S": "<22>𤩺㦤撖寧<E69296>霂閖<E99C82> (RCT)"
  },
  "inclusionCriteria": "<22><EFBFBD><E69C9B><EFBFBD>讃嚗朙CT<43>𠉛弦嚗?010撟游<E6929F><E6B8B8>𤏸”",
  "exclusionCriteria": "<22><><EFBFBD><EFBFBD><EFBFBD>嚗𣬚遞餈堆<E9A488><E5A086><EFBFBD>摰鮋<E691B0>",
  "screeningConfig": {
    "models": ["deepseek-chat", "qwen-max"],
    "temperature": 0
  }
}

<EFBFBD><EFBFBD>蝷箔<EFBFBD>:

{
  "success": true,
  "data": {
    "id": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
    "userId": "asl-test-user-001",
    "projectName": "SGLT2<54><EFBFBD><E7A983><EFBFBD>頂蝏毺遞餈?,
    "picoCriteria": {
      "population": "2<EFBFBD><EFBFBD>撠輻<EFBFBD><EFBFBD>𣂷犖<EFBFBD><EFBFBD><EFBFBD>?,
      "intervention": "SGLT2<54><EFBFBD><E7A983>?,
      "comparison": "摰㗇<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撣貉<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
      "outcome": "<EFBFBD><EFBFBD>蝞∠<EFBFBD><EFBFBD>",
      "studyDesign": "<EFBFBD>𤩺㦤撖寧<EFBFBD>霂閖<EFBFBD> (RCT)"
    },
    "inclusionCriteria": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>讃嚗朙CT<EFBFBD>𠉛弦嚗?010撟游<EFBFBD><EFBFBD>𤏸”",
    "exclusionCriteria": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗𣬚遞餈堆<EFBFBD><EFBFBD><EFBFBD>摰鮋<EFBFBD>",
    "status": "draft",
    "screeningConfig": {
      "models": ["deepseek-chat", "qwen-max"],
      "temperature": 0
    },
    "createdAt": "2025-11-18T07:30:00.000Z",
    "updatedAt": "2025-11-18T07:30:00.000Z"
  }
}

瘚贝<EFBFBD><EFBFBD>賭誘:

curl -X POST http://localhost:3001/api/v1/asl/projects \
  -H "Content-Type: application/json" \
  -d '{
    "projectName": "瘚贝<E7989A>憿寧𤌍",
    "picoCriteria": {
      "population": "<22>𣂷犖<F0A382B7><E78A96><EFBFBD>?,
      "intervention": "<22><EFBFBD>A",
      "comparison": "摰㗇<E691B0><E39787>?,
      "outcome": "銝餉<E98A9D>蝏枏<E89D8F>",
      "studyDesign": "RCT"
    },
    "inclusionCriteria": "<22><EFBFBD><E69C9B><EFBFBD>讃",
    "exclusionCriteria": "蝏潸膩"
  }'

1.2 <20><EFBFBD>憿寧𤌍<E5AFA7>𡑒”

<EFBFBD>亙藁: GET /api/v1/asl/projects
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: <20><EFBFBD>敶枏<E695B6><E69E8F><EFBFBD><E586BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E58EA9>厰★<E58EB0>? <EFBFBD>亥砭<EFBFBD><EFBFBD>: <20>? <EFBFBD><EFBFBD>蝷箔<EFBFBD>:

{
  "success": true,
  "data": [
    {
      "id": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
      "userId": "asl-test-user-001",
      "projectName": "SGLT2<54><EFBFBD><E7A983><EFBFBD>頂蝏毺遞餈?,
      "picoCriteria": {...},
      "status": "screening",
      "createdAt": "2025-11-18T07:30:00.000Z",
      "updatedAt": "2025-11-18T07:35:00.000Z",
      "_count": {
        "literatures": 3,
        "screeningResults": 3
      }
    }
  ]
}

瘚贝<EFBFBD><EFBFBD>賭誘:

curl http://localhost:3001/api/v1/asl/projects

1.3 <20><EFBFBD>憿寧𤌍霂行<E99C82>

<EFBFBD>亙藁: GET /api/v1/asl/projects/:projectId
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: <20><EFBFBD><E79195><EFBFBD><EFBFBD>憿寧𤌍<E5AFA7><F0A48C8D>祕蝏<E7A595><EFBFBD>? 頝臬<EFBFBD><EFBFBD><EFBFBD>:

  • projectId: 憿寧𤌍ID (UUID)

<EFBFBD><EFBFBD>蝷箔<EFBFBD>:

{
  "success": true,
  "data": {
    "id": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
    "userId": "asl-test-user-001",
    "projectName": "SGLT2<54><EFBFBD><E7A983><EFBFBD>頂蝏毺遞餈?,
    "picoCriteria": {
      "population": "2<EFBFBD><EFBFBD>撠輻<EFBFBD><EFBFBD>𣂷犖<EFBFBD><EFBFBD><EFBFBD>?,
      "intervention": "SGLT2<54><EFBFBD><E7A983>?,
      "comparison": "摰㗇<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撣貉<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
      "outcome": "<EFBFBD><EFBFBD>蝞∠<EFBFBD><EFBFBD>",
      "studyDesign": "<EFBFBD>𤩺㦤撖寧<EFBFBD>霂閖<EFBFBD> (RCT)"
    },
    "inclusionCriteria": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>讃嚗朙CT<EFBFBD>𠉛弦嚗?010撟游<EFBFBD><EFBFBD>𤏸”",
    "exclusionCriteria": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗𣬚遞餈堆<EFBFBD><EFBFBD><EFBFBD>摰鮋<EFBFBD>",
    "status": "screening",
    "screeningConfig": {
      "models": ["deepseek-chat", "qwen-max"],
      "temperature": 0
    },
    "createdAt": "2025-11-18T07:30:00.000Z",
    "updatedAt": "2025-11-18T07:35:00.000Z",
    "_count": {
      "literatures": 3,
      "screeningResults": 3,
      "screeningTasks": 1
    }
  }
}

瘚贝<EFBFBD><EFBFBD>賭誘:

curl http://localhost:3001/api/v1/asl/projects/{projectId}

1.4 <20>湔鰵憿寧𤌍

<EFBFBD>亙藁: PUT /api/v1/asl/projects/:projectId
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: <20>湔鰵憿寧𤌍靽⊥<E99DBD>

頝臬<EFBFBD><EFBFBD><EFBFBD>:

  • projectId: 憿寧𤌍ID (UUID)

**霂瑟<E99C82>雿?*嚗<>𣈲<EFBFBD><F0A388B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:

{
  "projectName": "<22>湔鰵<E6B994>𡒊<EFBFBD>憿寧𤌍<E5AFA7>滨妍",
  "status": "screening",
  "inclusionCriteria": "<22>湔鰵<E6B994>𡒊<EFBFBD>蝥喳<E89DA5><E596B3><EFBFBD><EFBFBD>"
}

<EFBFBD><EFBFBD>蝷箔<EFBFBD>:

{
  "success": true,
  "data": {
    "id": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
    "projectName": "<22>湔鰵<E6B994>𡒊<EFBFBD>憿寧𤌍<E5AFA7>滨妍",
    "status": "screening",
    ...
  }
}

瘚贝<EFBFBD><EFBFBD>賭誘:

curl -X PUT http://localhost:3001/api/v1/asl/projects/{projectId} \
  -H "Content-Type: application/json" \
  -d '{"status": "screening"}'

1.5 <20>𣳇膄憿寧𤌍

<EFBFBD>亙藁: DELETE /api/v1/asl/projects/:projectId
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: <20>𣳇膄憿寧𤌍<E5AFA7>𦠜<EFBFBD><F0A6A09C><EFBFBD><E58CA7>娍㺭<E5A88D><EFBFBD>蝥扯<E89DA5><E689AF>𣳇膄嚗? 頝臬<EFBFBD><EFBFBD><EFBFBD>:

  • projectId: 憿寧𤌍ID (UUID)

<EFBFBD><EFBFBD>蝷箔<EFBFBD>:

{
  "success": true,
  "message": "Project deleted successfully"
}

瘚贝<EFBFBD><EFBFBD>賭誘:

curl -X DELETE http://localhost:3001/api/v1/asl/projects/{projectId}

2. <20><>讃蝞∠<E89D9E> (Literatures)

2.1 撖澆<E69296><E6BE86><EFBFBD>讃嚗㇇SON<4F><EFBFBD>嚗?

<EFBFBD>亙藁: POST /api/v1/asl/literatures/import
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: <20><EFBFBD>撖澆<E69296><E6BE86><EFBFBD>讃嚗㇇SON<4F><EFBFBD>嚗? **霂瑟<E99C82>雿?*:

{
  "projectId": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
  "literatures": [
    {
      "pmid": "12345678",
      "title": "Efficacy of SGLT2 inhibitors in type 2 diabetes",
      "abstract": "Background: SGLT2 inhibitors are a new class...",
      "authors": "Smith J, Jones A, Brown B",
      "journal": "New England Journal of Medicine",
      "publicationYear": 2020,
      "doi": "10.1056/NEJMoa1234567"
    },
    {
      "title": "Another study on SGLT2 inhibitors",
      "abstract": "Objective: To evaluate...",
      "authors": "Johnson M",
      "journal": "The Lancet",
      "publicationYear": 2019
    }
  ]
}

<EFBFBD><EFBFBD>蝷箔<EFBFBD>:

{
  "success": true,
  "data": {
    "importedCount": 2
  }
}

摮埈挾霂湔<EFBFBD>:

  • pmid: PubMed ID (<28><EFBFBD>?
  • title: <20><><EFBFBD><E8AE83><EFBFBD> (敹<>)
  • abstract: <20><EFBFBD> (敹<>)
  • authors: 雿𡏭<E99BBF>?(<28><EFBFBD>?
  • journal: <20><EFBFBD> (<28><EFBFBD>?
  • publicationYear: <20>𤏸”撟港遢 (<28><EFBFBD>?
  • doi: DOI (<28><EFBFBD>?

瘚贝<EFBFBD><EFBFBD>賭誘:

curl -X POST http://localhost:3001/api/v1/asl/literatures/import \
  -H "Content-Type: application/json" \
  -d '{
    "projectId": "{projectId}",
    "literatures": [
      {
        "title": "瘚贝<E7989A><E8B49D><EFBFBD>讃",
        "abstract": "餈蹱糓瘚贝<E7989A><E8B49D><EFBFBD>"
      }
    ]
  }'

2.2 撖澆<E69296><E6BE86><EFBFBD>讃嚗𠄌xcel<65><6C>辣嚗?

<EFBFBD>亙藁: POST /api/v1/asl/literatures/import-excel
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: 隞㙎xcel<65><6C><EFBFBD><EFBFBD>撖澆<E69296><E6BE86><EFBFBD>

霂瑟<EFBFBD>蝐餃<EFBFBD>: multipart/form-data

銵典<EFBFBD>摮埈挾:

  • file: Excel<65><6C>辣 (.xlsx)
  • projectId: 憿寧𤌍ID

Excel<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:

<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>虾嚗? <EFBFBD> 霂湔<EFBFBD>
PMID / pmid / PMID蝻硋噡 <EFBFBD>? PubMed ID
Title / title / <20><><EFBFBD> <EFBFBD>? <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Abstract / abstract / <20><EFBFBD> <EFBFBD>? <EFBFBD><EFBFBD>
Authors / authors / 雿𡏭<E99BBF>? <EFBFBD>? 雿𡏭<EFBFBD>?
Journal / journal / <20><EFBFBD> <EFBFBD>? <EFBFBD><EFBFBD><EFBFBD>滨妍
Year / year / 撟港遢 <EFBFBD>? <EFBFBD>𤏸”撟港遢
DOI / doi <EFBFBD>? DOI

<EFBFBD><EFBFBD>蝷箔<EFBFBD>:

{
  "success": true,
  "data": {
    "importedCount": 15,
    "totalRows": 15
  }
}

瘚贝<EFBFBD><EFBFBD>賭誘:

curl -X POST http://localhost:3001/api/v1/asl/literatures/import-excel \
  -F "file=@literatures.xlsx" \
  -F "projectId={projectId}"

2.3 <20><EFBFBD><E79195><EFBFBD><EFBFBD>𡑒”

<EFBFBD>亙藁: GET /api/v1/asl/projects/:projectId/literatures
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: <20><EFBFBD>憿寧𤌍<E5AFA7><F0A48C8D><EFBFBD><EFBFBD><EFBFBD>銵剁<E98AB5><E58981><EFBFBD><E88880><EFBFBD>△嚗? 頝臬<EFBFBD><EFBFBD><EFBFBD>:

  • projectId: 憿寧𤌍ID (UUID)

<EFBFBD>亥砭<EFBFBD><EFBFBD>:

  • page: 憿萇<E686BF><EFBFBD><E59A97>霈? 1嚗?- limit: 瘥誯△<E8AAAF><EFBFBD><EFBFBD><E59A97>霈? 50嚗峕<E59A97>憭? 100嚗? <EFBFBD><EFBFBD>蝷箔<EFBFBD>:
{
  "success": true,
  "data": {
    "literatures": [
      {
        "id": "lit-uuid-001",
        "projectId": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
        "pmid": "12345678",
        "title": "Efficacy of SGLT2 inhibitors...",
        "abstract": "Background: SGLT2 inhibitors...",
        "authors": "Smith J, Jones A",
        "journal": "NEJM",
        "publicationYear": 2020,
        "doi": "10.1056/NEJMoa1234567",
        "createdAt": "2025-11-18T07:32:00.000Z",
        "screeningResults": [
          {
            "conflictStatus": "none",
            "finalDecision": "include"
          }
        ]
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 50,
      "total": 3,
      "totalPages": 1
    }
  }
}

瘚贝<EFBFBD><EFBFBD>賭誘:

curl "http://localhost:3001/api/v1/asl/projects/{projectId}/literatures?page=1&limit=50"

2.4 <20>𣳇膄<F0A3B387><E88684>

<EFBFBD>亙藁: DELETE /api/v1/asl/literatures/:literatureId
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: <20>𣳇膄<F0A3B387><E88684><EFBFBD><EFBFBD><EFBFBD>讃嚗<E8AE83><EFBFBD>𥪜<EFBFBD><F0A5AA9C><EFBFBD><E696A4><EFBFBD><E58EA9><EFBFBD>

頝臬<EFBFBD><EFBFBD><EFBFBD>:

  • literatureId: <20><>讃ID (UUID)

<EFBFBD><EFBFBD>蝷箔<EFBFBD>:

{
  "success": true,
  "message": "Literature deleted successfully"
}

瘚贝<EFBFBD><EFBFBD>賭誘:

curl -X DELETE http://localhost:3001/api/v1/asl/literatures/{literatureId}

3. 蝑偦<E89D91>劐遙<E58A90>∠恣<E288A0>?(Screening Tasks)

瘜冽<EFBFBD>: 隞乩<E99A9E><E4B9A9>亙藁銝箏<E98A9D>摰䂿緵<E482BF><EFBFBD>嚗Áeek 2霈<E99C88>嚗?

3.1 <20>臬𢆡蝑偦<E89D91>劐遙<E58A90>?

<EFBFBD>亙藁: POST /api/v1/asl/projects/:projectId/screening/start
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: <20>臬𢆡AI蝑偦<E89D91>劐遙<E58A90><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗? **霂瑟<E99C82>雿?*:

{
  "taskType": "title_abstract",
  "models": ["deepseek-chat", "qwen-max"],
  "concurrency": 3
}

<EFBFBD><EFBFBD>蝷箔<EFBFBD>:

{
  "success": true,
  "data": {
    "taskId": "task-uuid-001",
    "status": "running",
    "totalItems": 100,
    "startedAt": "2025-11-18T08:00:00.000Z"
  }
}

3.2 <20><EFBFBD>蝑偦<E89D91><EFBFBD>摨?

<EFBFBD>亙藁: GET /api/v1/asl/tasks/:taskId/progress
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: <20><EFBFBD>蝑偦<E89D91>劐遙<E58A90><EFBFBD>摨? <EFBFBD><EFBFBD>蝷箔<EFBFBD>:

{
  "success": true,
  "data": {
    "taskId": "task-uuid-001",
    "status": "running",
    "totalItems": 100,
    "processedItems": 45,
    "successItems": 40,
    "failedItems": 2,
    "conflictItems": 3,
    "progress": 45,
    "estimatedEndAt": "2025-11-18T08:15:00.000Z"
  }
}

3.3 <20><EFBFBD>蝑偦<E89D91><EFBFBD><E58EA9>?

<EFBFBD>亙藁: GET /api/v1/asl/projects/:projectId/results
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: <20><EFBFBD>蝑偦<E89D91><EFBFBD><E58EA9>𨅯<EFBFBD>銵? <EFBFBD>亥砭<EFBFBD><EFBFBD>:

  • page: 憿萇<E686BF><EFBFBD><E59A97>霈? 1嚗?- limit: 瘥誯△<E8AAAF><EFBFBD><EFBFBD><E59A97>霈? 50嚗?- conflictOnly: <20>芣遬蝷箏<E89DB7><EFBFBD>★嚗<E29885><E59A97>撠𥪜<E692A0><EFBFBD>
  • finalDecision: 蝑偦<E89D91><EFBFBD>蝑吔<E89D91>include / exclude / pending嚗? <EFBFBD><EFBFBD>蝷箔<EFBFBD>:
{
  "success": true,
  "data": {
    "results": [
      {
        "id": "result-uuid-001",
        "literatureId": "lit-uuid-001",
        "literature": {
          "title": "...",
          "abstract": "..."
        },
        "dsConclusion": "include",
        "qwenConclusion": "include",
        "conflictStatus": "none",
        "finalDecision": "include",
        "createdAt": "2025-11-18T08:05:00.000Z"
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 50,
      "total": 100,
      "totalPages": 2
    }
  }
}

3.4 摰⊥瓲<E28AA5><EFBFBD><E884A9><EFBFBD>

<EFBFBD>亙藁: POST /api/v1/asl/results/review
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: <20><EFBFBD>摰⊥瓲<E28AA5><EFBFBD><E884A9><EFBFBD>

**霂瑟<E99C82>雿?*:

{
  "projectId": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
  "reviews": [
    {
      "resultId": "result-uuid-001",
      "finalDecision": "include"
    },
    {
      "resultId": "result-uuid-002",
      "finalDecision": "exclude",
      "exclusionReason": "銝滨泵<E6BBA8>㇊ICO<43><4F><EFBFBD>銝剔<E98A9D>撟脤<E6929F><E884A4>芣鴌"
    }
  ]
}

<EFBFBD><EFBFBD>蝷箔<EFBFBD>:

{
  "success": true,
  "data": {
    "reviewedCount": 2
  }
}

4. <20><EFBFBD>憭滨<E686AD>蝞∠<E89D9E> (Fulltext Screening)

**<2A><EFBFBD>?*: <20>?Day 5摰䂿緵銝哨<E98A9D>2025-11-23嚗?

4.1 <20>𥕦遣<F0A595A6><EFBFBD>憭滨<E686AD>隞餃𦛚

<EFBFBD>亙藁: POST /api/v1/asl/fulltext-screening/tasks
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: <20>𥕦遣<F0A595A6><EFBFBD>憭滨<E686AD>隞餃𦛚嚗<F0A69B9A><EFBFBD><E7AC86><EFBFBD><EFBFBD><EFBFBD><E89098><EFBFBD><E69C9E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銵?2摮埈挾霂<E68CBE>

**霂瑟<E99C82>雿?*:

{
  "projectId": "proj-123",
  "literatureIds": ["lit-001", "lit-002", "lit-003"],
  "modelA": "deepseek-v3",
  "modelB": "qwen-max",
  "promptVersion": "v1.0.0"
}

摮埈挾霂湔<EFBFBD>:

  • projectId: 憿寧𤌍ID嚗<44><E59A97>憛恬<E6869B>
  • literatureIds: 敺<><E695BA><EFBFBD><EFBFBD><E39787>埋D<E59F8B>𡑒”嚗<E2809D><E59A97>憛恬<E6869B><E681AC><EFBFBD><EFBFBD><EFBFBD><E7B393><EFBFBD><EFBFBD><EFBFBD><E89098><EFBFBD><E69C9E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
  • modelA: 璅<E79285>A<EFBFBD>滨妍嚗<E5A68D><EFBFBD><EFBFBD>暺䁅恕: deepseek-v3嚗?- modelB: 璅<E79285>B<EFBFBD>滨妍嚗<E5A68D><EFBFBD><EFBFBD>暺䁅恕: qwen-max嚗?- promptVersion: Prompt<70><74>𧋦嚗<F0A78BA6><EFBFBD><EFBFBD>暺䁅恕: v1.0.0嚗? <EFBFBD><EFBFBD>蝷箔<EFBFBD>:
{
  "success": true,
  "data": {
    "taskId": "fst-20251123-001",
    "projectId": "proj-123",
    "status": "pending",
    "totalCount": 3,
    "modelA": "deepseek-v3",
    "modelB": "qwen-max",
    "createdAt": "2025-11-23T10:00:00.000Z",
    "message": "隞餃𦛚<E9A483>𥕦遣<F0A595A6>𣂼<EFBFBD>嚗峕迤<E5B395><EFBFBD><E585B8><EFBFBD><E595A3>?
  }
}

銝𡁜𦛚閫<EFBFBD><EFBFBD>:

  1. 撉諹<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>格糓<EFBFBD><EFBFBD>鈭舘砲憿寧𤌍
  2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>格糓<EFBFBD><EFBFBD><EFBFBD>舐鍂<EFBFBD><EFBFBD>DF嚗ǑpdfStatus === 'ready'`嚗?3. 隞餃𦛚<E9A483>𥕦遣<F0A595A6>𡒊<EFBFBD><F0A1928A><EFBFBD><E594BE><EFBFBD><E797B9>𤾸蝱撘<E89DB1>郊憭<E9838A><E686AD>
  3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>讃PDF<EFBFBD>芸停蝏迎<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DF撠梁貌<EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <EFBFBD>躰秤<EFBFBD><EFBFBD>:
{
  "success": false,
  "error": "<22><EFBFBD><E585B8><EFBFBD>讃PDF<44>芸停蝏迎<E89D8F><E8BF8E><EFBFBD><EFBFBD>憪见<E686AA><E8A781><EFBFBD><EFBFBD>蝑?
}

瘚贝<EFBFBD><EFBFBD>賭誘:

curl -X POST http://localhost:3001/api/v1/asl/fulltext-screening/tasks \
  -H "Content-Type: application/json" \
  -d '{
    "projectId": "proj-123",
    "literatureIds": ["lit-001", "lit-002"],
    "modelA": "deepseek-v3",
    "modelB": "qwen-max"
  }'

4.2 <20><EFBFBD>隞餃𦛚餈𥕦漲

<EFBFBD>亙藁: GET /api/v1/asl/fulltext-screening/tasks/:taskId
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: <20><EFBFBD><E79195><EFBFBD>憭滨<E686AD>隞餃𦛚<E9A483><F0A69B9A>祕蝏<E7A595><E89D8F>摨虫縑<E899AB>? 頝臬<EFBFBD><EFBFBD><EFBFBD>:

  • taskId: 隞餃𦛚ID

<EFBFBD><EFBFBD>蝷箔<EFBFBD>:

{
  "success": true,
  "data": {
    "taskId": "fst-20251123-001",
    "projectId": "proj-123",
    "status": "processing",
    
    "progress": {
      "totalCount": 30,
      "processedCount": 15,
      "successCount": 13,
      "failedCount": 1,
      "degradedCount": 1,
      "pendingCount": 15,
      "progressPercent": 50
    },
    
    "statistics": {
      "totalTokens": 450000,
      "totalCost": 2.25,
      "avgTimePerLit": 18500
    },
    
    "time": {
      "startedAt": "2025-11-23T10:00:00.000Z",
      "estimatedEndAt": "2025-11-23T10:12:30.000Z",
      "elapsedSeconds": 270
    },
    
    "models": {
      "modelA": "deepseek-v3",
      "modelB": "qwen-max"
    },
    
    "updatedAt": "2025-11-23T10:04:30.000Z"
  }
}

摮埈挾霂湔<EFBFBD>:

  • status: 隞餃𦛚<E9A483><EFBFBD>? - pending: 敺<><E695BA><EFBFBD>? - processing: 憭<><E686AD>銝? - completed: 撌脣<E6928C><E884A3>? - failed: 憭梯揖
    • cancelled: 撌脣<E6928C>瘨?- successCount: <20>峕芋<E5B395><EFBFBD><E99285>𣂼<EFBFBD><F0A382BC><EFBFBD><EFBFBD><EFBFBD>格㺭
  • degradedCount: 隞<><E99A9E>銝芣芋<E88AA3>𧢲<EFBFBD><F0A7A2B2><EFBFBD><E6AFBA><EFBFBD><EFBFBD><EFBFBD><E5A086>滨漣璅<E79285>嚗?- failedCount: <20>峕芋<E5B395><EFBFBD>憭梯揖<E6A2AF><E68F96><EFBFBD><EFBFBD>格㺭
  • totalCost: 蝝航恣<E888AA>鞉𧋦嚗<F0A78BA6><E59A97>雿㵪<E99BBF><E3B5AA><EFBFBD><EFBFBD>

瘚贝<EFBFBD><EFBFBD>賭誘:

curl http://localhost:3001/api/v1/asl/fulltext-screening/tasks/fst-20251123-001

4.3 <20><EFBFBD>隞餃𦛚蝏𤘪<E89D8F>

<EFBFBD>亙藁: GET /api/v1/asl/fulltext-screening/tasks/:taskId/results
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: <20><EFBFBD><E79195><EFBFBD>憭滨<E686AD>隞餃𦛚<E9A483><F0A69B9A>祕蝏<E7A595><E89D8F><EFBFBD><EFBFBD><E9A0A3><EFBFBD>蝑偦<E89D91><EFBFBD><E58CA7><EFBFBD>

頝臬<EFBFBD><EFBFBD><EFBFBD>:

  • taskId: 隞餃𦛚ID

<EFBFBD>亥砭<EFBFBD><EFBFBD>:

  • filter: 蝏𤘪<E89D8F>蝑偦<E89D91><EFBFBD><E39A81><EFBFBD><EFBFBD>
    • all: <20><EFBFBD><EFBFBD><E59A97>霈歹<E99C88>
    • conflict: 隞<><E99A9E><EFBFBD>
    • pending: 敺<><EFBFBD>? - reviewed: 撌脣恣<E884A3>?- page: 憿萇<E686BF><EFBFBD><E59A97>霈? 1嚗?- pageSize: 瘥誯△<E8AAAF><EFBFBD><EFBFBD><E59A97>霈? 20嚗峕<E59A97>憭? 100嚗?- sortBy: <20><EFBFBD>摮埈挾嚗<E68CBE><EFBFBD>? priority, createdAt嚗?- sortOrder: <20><EFBFBD><E98DA6><EFBFBD>嚗Ǒasc|desc嚗屸<EFBFBD>霈? desc`嚗? <EFBFBD><EFBFBD>蝷箔<EFBFBD>:
{
  "success": true,
  "data": {
    "taskId": "fst-20251123-001",
    "total": 30,
    "filtered": 3,
    
    "results": [
      {
        "resultId": "fsr-001",
        "literatureId": "lit-001",
        "literature": {
          "pmid": "12345678",
          "title": "Effect of SGLT2 inhibitors on cardiovascular outcomes",
          "authors": "Smith JA, et al.",
          "journal": "Lancet",
          "year": 2023,
          "doi": "10.1016/..."
        },
        
        "modelAResult": {
          "modelName": "deepseek-v3",
          "status": "success",
          "fields": {
            "field1_source": {
              "assessment": "摰峕㟲",
              "evidence": "蝚砌<E89D9A>雿𡏭<E99BBF><F0A18FAD>mith JA, Lancet 2023",
              "location": "蝚?憿?,
              "confidence": 0.98
            },
            "field2_studyType": {
              "assessment": "摰峕㟲",
              "evidence": "憭帋葉敹<EFBFBD><EFBFBD><EFBFBD>箏笆<EFBFBD><EFBFBD>撉?,
              "location": "Methods蝚?憿?,
              "confidence": 0.95
            },
            "field5_population": {
              "assessment": "摰峕㟲",
              "evidence": "蝥喳<EFBFBD>500靘?<3F><EFBFBD>撠輻<E692A0><E8BCBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>撟湧<E6929F>5812撗?,
              "location": "Methods蝚?憿?,
              "confidence": 0.92
            },
            "field9_outcomes": {
              "assessment": "摰峕㟲",
              "evidence": "銝餉<EFBFBD>蝏枏<EFBFBD>eGFR<EFBFBD><EFBFBD>嚗?15.23.5 ml/min vs -8.12.9 ml/min",
              "location": "Results蝚?憿菔”2",
              "confidence": 0.96
            }
          },
          "overall": {
            "decision": "include",
            "reason": "12摮埈挾摰峕㟲嚗<EFBFBD><EFBFBD><EFBFBD>格㺭<EFBFBD>桀虾<EFBFBD>𣂼<EFBFBD>",
            "dataQuality": "high",
            "confidence": 0.94
          },
          "tokens": 15000,
          "cost": 0.015
        },
        
        "modelBResult": {
          "modelName": "qwen-max",
          "status": "success",
          "fields": { /* <20><EFBFBD>蝏𤘪<E89D8F> */ },
          "overall": {
            "decision": "include",
            "confidence": 0.92
          },
          "tokens": 15200,
          "cost": 0.061
        },
        
        "validation": {
          "medicalLogicIssues": [],
          "evidenceChainIssues": []
        },
        
        "conflict": {
          "isConflict": false,
          "severity": "none",
          "conflictFields": [],
          "overallConflict": false
        },
        
        "review": {
          "finalDecision": null,
          "reviewedBy": null,
          "reviewedAt": null,
          "reviewNotes": null,
          "priority": 50
        },
        
        "processing": {
          "isDegraded": false,
          "degradedModel": null,
          "processedAt": "2025-11-23T10:02:15.000Z"
        }
      },
      
      {
        "resultId": "fsr-002",
        "literatureId": "lit-005",
        "literature": { /* ... */ },
        
        "modelAResult": {
          "modelName": "deepseek-v3",
          "status": "success",
          "fields": {
            "field9_outcomes": {
              "assessment": "蝻箏仃",
              "evidence": "<EFBFBD>芣𥁒<EFBFBD>𠰴<EFBFBD>雿𤘪㺭<EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>?,
              "location": "Results蝚?憿?,
              "confidence": 0.88
            }
          },
          "overall": {
            "decision": "exclude",
            "reason": "<EFBFBD>喲睸摮埈挾field9<EFBFBD>唳旿銝滚<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Meta<EFBFBD><EFBFBD><EFBFBD>",
            "confidence": 0.85
          }
        },
        
        "modelBResult": {
          "overall": {
            "decision": "include",
            "reason": "<EFBFBD><EFBFBD>銝餉<EFBFBD>蝏枏<EFBFBD><EFBFBD>求iscussion<EFBFBD><EFBFBD>嚗䔶<EFBFBD><EFBFBD>唳旿摰峕㟲"
          }
        },
        
        "conflict": {
          "isConflict": true,
          "severity": "high",
          "conflictFields": ["field9"],
          "overallConflict": true,
          "details": {
            "field9": {
              "modelA": "蝻箏仃",
              "modelB": "摰峕㟲",
              "importance": "critical"
            }
          }
        },
        
        "review": {
          "finalDecision": null,
          "priority": 95
        }
      }
    ],
    
    "pagination": {
      "page": 1,
      "pageSize": 20,
      "totalPages": 2
    },
    
    "summary": {
      "totalResults": 30,
      "conflictCount": 3,
      "pendingReview": 3,
      "reviewed": 27,
      "avgPriority": 62
    }
  }
}

12摮埈挾霂湔<EFBFBD>:

  • field1_source: <20><><EFBFBD><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𨳍<EFBFBD><F0A8B38D>僑隞賜<E99A9E>嚗?- field2_studyType: <20>𠉛弦蝐餃<E89D90>嚗㇌CT<43><54><EFBFBD><EFBFBD><EFBFBD>蝛嗥<E89D9B>嚗?- field3_studyDesign: <20>𠉛弦霈曇恣蝏<E681A3><E89D8F>
  • field4_diagnosis: <20><EFBFBD>霂𦠜鱏<F0A6A09C><E9B18F><EFBFBD>
  • field5_population: 鈭箇黎<E7AE87><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7A587><EFBFBD>抅蝥輻<E89DA5>嚗争<E59A97>
  • field6_baseline: <20>箇瑪<E7AE87>唳旿潃?- field7_intervention: 撟脤<E6929F><E884A4>芣鴌潃?- field8_control: 撖寧<E69296><E5AFA7>芣鴌
  • field9_outcomes: 蝏枏<E89D8F><E69E8F><EFBFBD><EFBFBD>潃鐥<E6BD83>潃?<3F><><EFBFBD>喲睸
  • field10_statistics: 蝏蠘恣<E8A098><EFBFBD>
  • field11_quality: 韐券<E99F90><EFBFBD>遠嚗<E981A0><E59A97><EFBFBD><EFBFBD><E7AE8F><EFBFBD>𤩅瘜閧<E7989C>嚗争<E59A97>潃?- field12_other: <20><EFBFBD>靽⊥<E99DBD>

瘚贝<EFBFBD><EFBFBD>賭誘:

# <20><EFBFBD><E79195><EFBFBD><EFBFBD><EFBFBD><E58EA9>?curl "http://localhost:3001/api/v1/asl/fulltext-screening/tasks/fst-20251123-001/results"

# 隞<><EFBFBD><EFBFBD><EFBFBD>
curl "http://localhost:3001/api/v1/asl/fulltext-screening/tasks/fst-20251123-001/results?filter=conflict"

# <20><><EFBFBD>亥砭
curl "http://localhost:3001/api/v1/asl/fulltext-screening/tasks/fst-20251123-001/results?page=2&pageSize=10"

4.4 鈭箏極摰⊥瓲<E28AA5><EFBFBD>

<EFBFBD>亙藁: PUT /api/v1/asl/fulltext-screening/results/:resultId/decision
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: 撖孵<E69296>銝芸<E98A9D><E88AB8><EFBFBD><EFBFBD>蝑𤤿<E89D91><F0A4A4BF>𡏭<EFBFBD>銵䔶犖撌亙恣<E4BA99><EFBFBD>蝑? 頝臬<EFBFBD><EFBFBD><EFBFBD>:

  • resultId: 蝏𤘪<E89D8F>ID

**霂瑟<E99C82>雿?*:

{
  "finalDecision": "exclude",
  "exclusionReason": "<22>喲睸摮埈挾field9嚗<39><E59A97><EFBFBD><E69285><EFBFBD><EFBFBD>嚗㗇㺭<E39787><EFBFBD>摰峕㟲",
  "reviewNotes": "<22><EFBFBD><E8B39C><EFBFBD><EFBFBD><0.05嚗䔶<EFBFBD>蝻箏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撢崆D嚗峕<EFBFBD>瘜閧鍂鈭穽eta<EFBFBD><EFBFBD><EFBFBD>"
}

摮埈挾霂湔<EFBFBD>:

  • finalDecision: <20><><EFBFBD><E89D8F>蝑吔<E89D91><EFBFBD>嚗? - include: 蝥喳<E89DA5>
    • exclude: <20>㘾膄
  • exclusionReason: <20>㘾膄<E398BE><EFBFBD>嚗ǑfinalDecision === 'exclude'` <20><EFBFBD>憛恬<E6869B>
  • reviewNotes: 摰⊥瓲憭<E793B2>釣嚗<E987A3><EFBFBD><EFBFBD>

<EFBFBD><EFBFBD>蝷箔<EFBFBD>:

{
  "success": true,
  "data": {
    "resultId": "fsr-002",
    "finalDecision": "exclude",
    "exclusionReason": "<22>喲睸摮埈挾field9嚗<39><E59A97><EFBFBD><E69285><EFBFBD><EFBFBD>嚗㗇㺭<E39787><EFBFBD>摰峕㟲",
    "reviewedBy": "user-001",
    "reviewedAt": "2025-11-23T10:30:00.000Z"
  }
}

瘚贝<EFBFBD><EFBFBD>賭誘:

curl -X PUT http://localhost:3001/api/v1/asl/fulltext-screening/results/fsr-002/decision \
  -H "Content-Type: application/json" \
  -d '{
    "finalDecision": "exclude",
    "exclusionReason": "蝏枏<E89D8F><E69E8F><EFBFBD><EFBFBD><EFBFBD>唳旿銝滚<E98A9D><E6BB9A>?,
    "reviewNotes": "蝻箏<E89DBB><E7AE8F><EFBFBD><EFBFBD><EFBFBD><E6BE86><EFBFBD><EFBFBD>撌?
  }'

4.5 撖澆枂Excel

<EFBFBD>亙藁: GET /api/v1/asl/fulltext-screening/tasks/:taskId/export
霈方<EFBFBD>: <20><>閬? 霂湔<EFBFBD>: 撖澆枂<E6BE86><EFBFBD>憭滨<E686AD>蝏𤘪<E89D8F>銝慟xcel<65><6C>辣嚗?銝杵heet嚗? 頝臬<EFBFBD><EFBFBD><EFBFBD>:

  • taskId: 隞餃𦛚ID

<EFBFBD><EFBFBD>:

  • Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  • Content-Disposition: attachment; filename="fulltext_screening_results_{taskId}.xlsx"

Excel蝏𤘪<EFBFBD>:

Sheet 1: 蝥喳<E89DA5><E596B3><EFBFBD><EFBFBD>𡑒”

<EFBFBD><EFBFBD> 霂湔<EFBFBD>
摨誩噡 1, 2, 3...
PMID PubMed ID
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 蝚砌<EFBFBD>雿𡏭<EFBFBD>?撟港遢
<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>滨妍
撟港遢 <EFBFBD>𤏸”撟港遢
DOI DOI蝻硋噡
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑? 蝥喳<EFBFBD>
<EFBFBD>唳旿韐券<EFBFBD> 擃?銝?雿?
<EFBFBD><EFBFBD><EFBFBD>𡝗<EFBFBD>? <EFBFBD><EFBFBD><EFBFBD>?<3F><EFBFBD><E585B8><EFBFBD><E88880>?銝滚虾<E6BB9A>𣂼<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <EFBFBD><EFBFBD>?銝滢<E98A9D><E6BBA2>?
<EFBFBD>臬炏鈭箏極摰⊥瓲 <EFBFBD>?<3F>?

Sheet 2: <20>㘾膄<E398BE><E88684><EFBFBD>𡑒”

<EFBFBD><EFBFBD> 霂湔<EFBFBD>
摨誩噡 1, 2, 3...
PMID PubMed ID
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 蝚砌<EFBFBD>雿𡏭<EFBFBD>?撟港遢
<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>㘾膄<EFBFBD><EFBFBD> 霂衣<EFBFBD><EFBFBD>㘾膄<EFBFBD><EFBFBD>
<EFBFBD>㘾膄摮埈挾 field5, field9蝑?
<EFBFBD>臬炏<EFBFBD><EFBFBD> <EFBFBD>?<3F>?
摰⊥瓲鈭? <EFBFBD><EFBFBD>ID
摰⊥瓲<EFBFBD>園𡢿 2025-11-23 10:30

Sheet 3: PRISMA蝏蠘恣

蝏蠘恣憿? <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>瘥?
<EFBFBD><EFBFBD>憭滨<EFBFBD><EFBFBD>餅㺭 30 100%
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>? 18 60%
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? 12 40%
- 蝏枏<E89D8F><E69E8F><EFBFBD><EFBFBD>蝻箏仃/銝滚<E98A9D><E6BB9A>? 5 16.7%
- 鈭箇黎<E7AE87><EFBFBD>銝滨泵 3 10%
- 撟脤<E6929F><E884A4>芣鴌銝齿<E98A9D>蝖? 2 6.7%
- <20>𠉛弦韐券<E99F90><E588B8><EFBFBD> 1 3.3%
- <20><EFBFBD><E597A1><EFBFBD> 1 3.3%
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>? 3 10%
鈭箏極摰⊥瓲<EFBFBD>? 3 10%

**<2A>鞉𧋦蝏蠘恣嚗<E681A3><E59A97>憭𠼦heet嚗?*:

憿寧𤌍 <EFBFBD>?
<EFBFBD>蓉oken<EFBFBD>? 450,000
<EFBFBD><EFBFBD><EFBFBD>穿<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 瞼2.25
撟喳<EFBFBD><EFBFBD>鞉𧋦/蝭? 瞼0.075
<EFBFBD><EFBFBD><EFBFBD> DeepSeek-V3 + Qwen-Max
<EFBFBD><EFBFBD><EFBFBD>園𡢿 8<EFBFBD>?0蝘?

瘚贝<EFBFBD><EFBFBD>賭誘:

curl -O -J http://localhost:3001/api/v1/asl/fulltext-screening/tasks/fst-20251123-001/export

<EFBFBD><EFBFBD> <20><EFBFBD><E6BB9A><EFBFBD><EFBFBD><E996AB>

1. <20>𣂼<EFBFBD><F0A382BC><EFBFBD>

<EFBFBD><EFBFBD>:

{
  "success": true,
  "data": {
    // <20><EFBFBD><E6BB9A>唳旿
  }
}

HTTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:

  • 200 - <20>𣂼<EFBFBD>嚗𠃑ET<45><54>UT嚗?- 201 - <20>𥕦遣<F0A595A6>𣂼<EFBFBD>嚗㇊OST嚗?

2. <20>躰秤<E8BAB0><EFBFBD>

<EFBFBD><EFBFBD>:

{
  "success": false,
  "error": "<22>躰秤<E8BAB0>讛膩"
}

<EFBFBD><EFBFBD>霂衣<EFBFBD><EFBFBD>躰秤嚗?

{
  "error": "Missing required fields"
}

撣貉<EFBFBD>HTTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:

  • 400 - 霂瑟<E99C82><E7919F><EFBFBD><EFBFBD>躰秤
  • 401 - <20><EFBFBD><E88AA3>?- 403 - <20><EFBFBD><E4ADBE>?- 404 - 韏<><E99F8F>銝滚<E98A9D><E6BB9A>?- 500 - <20>滚𦛚<E6BB9A><EFBFBD><E585B8><EFBFBD>霂? <EFBFBD>躰秤蝷箔<EFBFBD>:
// 400 - <20><><EFBFBD>躰秤
{
  "error": "Missing required fields"
}

// 404 - 韏<><E99F8F>銝滚<E98A9D><E6BB9A>?{
  "error": "Project not found"
}

// 500 - <20>滚𦛚<E6BB9A><EFBFBD>霂?{
  "error": "Failed to create project"
}

3. <20><><EFBFBD><EFBFBD>

<EFBFBD><EFBFBD>:

{
  "success": true,
  "data": {
    "items": [...],  // <20>?literatures<65><73>esults 蝑?    "pagination": {
      "page": 1,
      "limit": 50,
      "total": 150,
      "totalPages": 3
    }
  }
}

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:

  • page: 敶枏<E695B6>憿萇<E686BF><EFBFBD><E59A97>1撘<31>憪页<E686AA>
  • limit: 瘥誯△<E8AAAF><EFBFBD>
  • total: <20>餉扇敶閙㺭
  • totalPages: <20>駁△<E9A781>?

<EFBFBD><EFBFBD> 霈方<E99C88><E696B9><EFBFBD><EFBFBD>

敶枏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>瘚贝<EFBFBD><EFBFBD>嚗?

瘚贝<EFBFBD><EFBFBD><EFBFBD>:

  • <EFBFBD><EFBFBD>ID: asl-test-user-001
  • <EFBFBD>桃拳: asl-test@example.com
  • <EFBFBD><EFBFBD><EFBFBD>: 摰<><E691B0>霈輸䔮

摰䂿緵<EFBFBD><EFBFBD>:

  • 隡睃<EFBFBD>隞𥣡WT銝剛繮<EFBFBD>飜userId`
  • JWT銝滚<EFBFBD><EFBFBD>冽𧒄雿輻鍂暺䁅恕瘚贝<EFBFBD><EFBFBD><EFBFBD>ID

<EFBFBD>煺漣<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰䂿緵嚗?

霈方<EFBFBD><EFBFBD><EFBFBD>:

  1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>JWT Token
  2. 霂瑟<EFBFBD>憭湔𡉼撣吋oken: Authorization: Bearer {token}
  3. 銝剝𡢿隞園<EFBFBD><EFBFBD>oken撟嗆<EFBFBD><EFBFBD>飜userId`
  4. <EFBFBD><EFBFBD><EFBFBD>其蝙<EFBFBD>灼userId`<60>亥砭<E4BAA5><EFBFBD><E586BD>唳旿

**銝剝𡢿隞嗥內靘?*:

// 敺<><E695BA><EFBFBD>?fastify.addHook('preHandler', async (request, reply) => {
  const token = request.headers.authorization?.replace('Bearer ', '');
  if (!token) {
    return reply.status(401).send({ error: 'Unauthorized' });
  }
  const userId = await verifyJWT(token);
  (request as any).userId = userId;
});

<EFBFBD>妒 API瘚贝<E7989A>

敹恍<EFBFBD><EFBFBD><EFBFBD>霂閗<EFBFBD><EFBFBD>?

瘚贝<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡅅PI:

cd AIclinicalresearch/backend
npx tsx scripts/test-asl-api.ts

瘚贝<EFBFBD>蝏𤘪<EFBFBD>:

<EFBFBD><EFBFBD><>憪𧢲<E686AA>霂?ASL 璅<E79285> API...
<0A><> 瘚贝<E7989A> 1/7: <20>亙熒璉<E78692><E79289>?             <20>?<3F><> 瘚贝<E7989A> 2/7: <20>𥕦遣蝑偦<E89D91>厰★<E58EB0>?         <20>?<3F><> 瘚贝<E7989A> 3/7: <20><EFBFBD>憿寧𤌍<E5AFA7>𡑒”          <20>?<3F><> 瘚贝<E7989A> 4/7: <20><EFBFBD>憿寧𤌍霂行<E99C82>          <20>?<3F><> 瘚贝<E7989A> 5/7: 撖澆<E69296><E6BE86><EFBFBD><20>?<3F><> 瘚贝<E7989A> 6/7: <20><EFBFBD><E79195><EFBFBD><EFBFBD>𡑒”          <20>?<3F><> 瘚贝<E7989A> 7/7: <20>湔鰵憿寧𤌍              <20>?<3F><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5>?<3F><> <20><><EFBFBD><EFBFBD>霂閖<E99C82><EFBFBD>嚗?7/7 - 100%)
<0A><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5><EFBFBD><E990A5>?```

### Postman<61><6E><EFBFBD>

**撖澆<E69296>霂湔<E99C82>**:
1. <20>𥕦遣<F0A595A6><EFBFBD>Collection: `ASL API`
2. 霈曄蔭<E69B84><EFBFBD><E887AC><EFBFBD>:
   - `base_url`: `http://localhost:3001`
   - `api_prefix`: `/api/v1/asl`
3. 撖澆<E69296>銝𧢲䲮<F0A7A2B2>亙藁

**蝷箔<E89DB7>霂瑟<E99C82>** (Postman):

POST {{base_url}}{{api_prefix}}/projects Headers: Content-Type: application/json Body (raw JSON): { "projectName": "瘚贝<E7989A>憿寧𤌍", "picoCriteria": {...}, "inclusionCriteria": "<22><EFBFBD><E69C9B><EFBFBD>讃", "exclusionCriteria": "蝏潸膩" }


---

## <20><> <20><EFBFBD><E689AF><EFBFBD><EFBFBD>

### <20><EFBFBD><E6BB9A>園𡢿<E59C92><EFBFBD>

| <20>亙藁蝐餃<E89D90> | <20><EFBFBD><E6A0BC><EFBFBD><E6BB9A>園𡢿 | 霂湔<E99C82> |
|---------|-------------|------|
| <20>蓥葵<E893A5>亥砭 | < 100ms | 憿寧𤌍霂行<E99C82><E8A18C><EFBFBD><EFBFBD><EFBFBD>株祕<E6A0AA>?|
| <20>𡑒”<F0A19192>亥砭 | < 200ms | 憿寧𤌍<E5AFA7>𡑒”<F0A19192><E2809D><EFBFBD><EFBFBD><EFBFBD>銵?|
| <20>𥕦遣/<2F>湔鰵 | < 300ms | <20>𥕦遣憿寧𤌍<E5AFA7><F0A48C8D><EFBFBD>圈★<E59C88>?|
| <20><EFBFBD>撖澆<E69296> | < 2s | 撖澆<E69296>100蝭<30><E89DAD><EFBFBD>?|
| LLM蝑偦<E89D91>?| 4-6s/蝭?| <20>峕芋<E5B395>见僎銵𣬚<E98AB5><F0A3AC9A>?|

### 撟嗅<E6929F><E59785><EFBFBD>

- **API<50>滚𦛚<E6BB9A>?*: <20><EFBFBD>100+撟嗅<E6929F>霂瑟<E99C82>
- **LLM蝑偦<E89D91>?*: 撟嗅<E6929F><E59785>唬蛹3嚗<33><EFBFBD>滨蔭嚗?- **<2A>唳旿摨栞<E691A8><E6A09E><EFBFBD>**: 17銝芾<E98A9D><E88ABE>?
---

## <20><> <20><>𧋦<EFBFBD><F0A78BA6>蟮

### v3.0 (2025-11-23)
- <20>?<3F><EFBFBD><E595A3><EFBFBD>憭滨<E686AD>蝞∠<E89D9E>API嚗?銝芣𦻖<E88AA3><F0A6BB96><EFBFBD>
  - <20>𥕦遣隞餃𦛚<E9A483><F0A69B9A><EFBFBD>𤥁<EFBFBD>摨艾<E691A8><E889BE><EFBFBD>𣇉<EFBFBD><F0A38789><EFBFBD><E6A0B6>犖撌亙恣<E4BA99><EFBFBD><E8A9BB><EFBFBD>慟xcel
- <20>?<3F><EFBFBD>12摮埈挾霂衣<E99C82><EFBFBD>摯
- <20>?<3F><EFBFBD><E88880>峕芋<E5B395>见笆瘥𥪜<E798A5><F0A5AA9C><EFBFBD><EFBFBD>瘚?- <20>?摰峕㟲<E5B395><E39FB2>xcel撖澆枂<E6BE86><EFBFBD>嚗? Sheets嚗?- <20>?靚<><EFBFBD><E39FB2>﹝蝏𤘪<E89D8F>嚗?憭扳芋<E689B3><EFBFBD>

### v2.1 (2025-11-21)
- <20>?<3F><EFBFBD>蝏蠘恣API<50>亙藁
- <20>?<3F>湔鰵PICOS<4F><EFBFBD>霂湔<E99C82>
- <20>?瘛餃<E7989B>鈭穃<E988AD><E7A983><EFBFBD><EFBFBD><E6B2B2><EFBFBD>瘜?
### v2.0 (2025-11-18)
- <20>?摰䂿緵10銝芣瓲敹<E793B2>PI蝡舐<E89DA1>
- <20>?摰峕<E691B0>憿寧𤌍蝞∠<E89D9E><E288A0><EFBFBD>
- <20>?摰峕<E691B0><E5B395><EFBFBD>讃蝞∠<E89D9E><E288A0><EFBFBD>
- <20>?瘛餃<E7989B>瘚贝<E7989A><E8B49D>𡁏𧋦<F0A1818F><EFBFBD>獢?- <20>?<3F><><EFBFBD>㗇𦻖<E39787><F0A6BB96><EFBFBD>霂閖<E99C82><EFBFBD>

### v1.0 (2025-10-29)
- <20><EFBFBD>API霈曇恣閫<E681A3><E996AB>
- 摰帋<E691B0><E5B88B>亙藁蝏𤘪<E89D8F>

---

## <20>?<3F>𡒊賒閫<E8B392><E996AB>

### Week 2
- [ ] 摰䂿緵蝑偦<E89D91>劐遙<E58A90>PI (3銝芣𦻖<E88AA3>?
- [ ] 摰䂿緵<E482BF><EFBFBD>摰⊥瓲API (2銝芣𦻖<E88AA3>?
- [ ] 瘛餃<E7989B>SSE餈𥕦漲<F0A595A6><EFBFBD>?- [ ] <20><><EFBFBD><EFBFBD>郊隞餃𦛚<E9A483><EFBFBD>

### Week 3-4
- [ ] 瘛餃<E7989B>JWT霈方<E99C88>銝剝𡢿隞?- [ ] 摰䂿緵<E482BF><E7B7B5><EFBFBD><EFBFBD><EFBFBD>
- [ ] 瘛餃<E7989B>API<50><EFBFBD>
- [ ] 摰<><E691B0><EFBFBD>躰秤憭<E7A7A4><E686AD>

---

---

### 5. 蝏蠘恣API (Statistics)

#### 5.1 <20><EFBFBD>憿寧𤌍蝏蠘恣<E8A098>唳旿嚗<E697BF><E59A97><EFBFBD><EFBFBD>嚗𡁜<E59A97>蝡航<E89DA1><E888AA><EFBFBD><EFBFBD>

**<2A>亙藁**: `GET /api/v1/asl/projects/:projectId/statistics`  
**霈方<E99C88>**: <20><>閬? 
**霂湔<E99C82>**: <20><EFBFBD>憿寧𤌍<E5AFA7><F0A48C8D><EFBFBD><EFBFBD><EFBFBD>霈⊥㺭<E28AA5><EFBFBD><E6AEB7>餅㺭<E9A485><E3BAAD><EFBFBD><EFBFBD><E4BAA6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E696A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E69687><EFBFBD><E683A9><EFBFBD>嚗?
**頝臬<E9A09D><E887AC><EFBFBD>㺭**:
- `projectId`: 憿寧𤌍ID

**<2A><EFBFBD>蝷箔<E89DB7>**:
```json
{
  "success": true,
  "data": {
    "total": 199,
    "included": 85,
    "excluded": 90,
    "pending": 24,
    "conflict": 24,
    "reviewed": 175,
    "exclusionReasons": {
      "P銝滚龪<E6BB9A><EFBFBD>鈭箇黎嚗?: 40,
      "I銝滚龪<E6BB9A><EFBFBD>撟脤<E6929F>嚗?: 25,
      "S銝滚龪<E6BB9A><EFBFBD><E3B5AA>𠉛弦霈曇恣嚗?: 15,
      "<22><EFBFBD><E597A1><EFBFBD>": 10
    },
    "includedRate": "42.7",
    "excludedRate": "45.2",
    "pendingRate": "12.1"
  }
}

**<2A><EFBFBD>**嚗?- <20>?鈭穃<E988AD><E7A983><EFBFBD><EFBFBD><EFBFBD>𡒊垢Prisma<6D>𡁜<EFBFBD><F0A1819C>亥砭嚗?銝芸僎銵峕䰻霂<E99C82>

  • <EFBFBD>?<3F><EFBFBD>嚗?500ms嚗?99蝭<39><E89DAD><EFBFBD><EFBFBD>
  • <EFBFBD>?<3F><EFBFBD>蝵𤑳<E89DB5>隡㰘<E99AA1>嚗帋<E59A97>MB蝥折<E89DA5><E68A98>袁B蝥? 瘚贝<EFBFBD><EFBFBD>賭誘:
curl http://localhost:3001/api/v1/asl/projects/55941145-bba0-4b15-bda4-f0a398d78208/statistics

*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦嚗? v3.0
<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD><EFBFBD> 2025-11-23嚗㇄ay 5: <20><EFBFBD>憭滨<E686AD>API嚗? 蝏湔擪<EFBFBD><EFBFBD><EFBFBD> AI<41><EFBFBD><E7AE84><EFBFBD>讃撘<E8AE83><E69298>穃𣪧<E7A983>? <EFBFBD>祆活<EFBFBD>湔鰵嚗?- <20>?<3F><EFBFBD><E595A3><EFBFBD>憭滨<E686AD>蝞∠<E89D9E>API嚗?銝芣瓲敹<E793B2>𦻖<EFBFBD><F0A6BB96><EFBFBD>

  • <EFBFBD>?霂衣<E99C82><E8A1A3>?2摮埈挾霂<E68CBE><EFBFBD><E691AF>
  • <EFBFBD>?<3F>峕芋<E5B395>见笆瘥𥪜<E798A5><F0A5AA9C><EFBFBD><EFBFBD>瘚贝秩<E8B49D>?- <20>?Excel撖澆枂<E6BE86><EFBFBD><EFBFBD><E996AB>
  • <EFBFBD>?摰峕㟲<E5B395><E39FB2>窈瘙?<3F><EFBFBD>蝷箔<E89DB7>

<EFBFBD><EFBFBD> <20><EFBFBD><E8A9A8><EFBFBD>