Files
AIclinicalresearch/docs/_templates/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

8.4 KiB
Raw Blame History

[璅<E79285><E288AA>滨妍] - API霈曇恣

*<EFBFBD><EFBFBD>頝臬<EFBFBD>嚗? `/api/v1/璅<E79285><E288AA>
*蝡舐<EFBFBD><EFBFBD><EFBFBD>嚗? X銝? *霈方<EFBFBD><EFBFBD><EFBFBD>嚗? JWT Token
<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD><EFBFBD> YYYY-MM-DD


<EFBFBD><EFBFBD> API璁<49><E79281>

蝡舐<EFBFBD> <EFBFBD><EFBFBD> 霂湔<EFBFBD> 霈方<EFBFBD>
/api/v1/xxx/resources GET <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡑒” <EFBFBD>?
/api/v1/xxx/resources/:id GET <EFBFBD><EFBFBD><EFBFBD><EFBFBD>霂行<EFBFBD> <EFBFBD>?
/api/v1/xxx/resources POST <EFBFBD>𥕦遣韏<EFBFBD><EFBFBD> <EFBFBD>?
/api/v1/xxx/resources/:id PUT <EFBFBD>湔鰵韏<EFBFBD><EFBFBD> <EFBFBD>?
/api/v1/xxx/resources/:id DELETE <EFBFBD>𣳇膄韏<EFBFBD><EFBFBD> <EFBFBD>?

<EFBFBD><EFBFBD> API霂衣<E99C82>霈曇恣

1. <20><EFBFBD><EFBFBD><E99F8F><EFBFBD>𡑒”

*蝡舐<EFBFBD>嚗? GET /api/v1/xxx/resources

<EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>敶枏<E695B6><E69E8F><EFBFBD><E586BD><EFBFBD><EFBFBD>皞𣂼<E79A9E>銵剁<E98AB5><E58981><EFBFBD>△嚗?

*霂瑟<EFBFBD><EFBFBD><EFBFBD>㺭嚗?

*Query<EFBFBD><EFBFBD>㺭嚗?

{
  page?: number;        // 憿萇<E686BF>嚗屸<E59A97>霈?
  pageSize?: number;    // 瘥誯△<E8AAAF><EFBFBD>嚗屸<E59A97>霈?0嚗峕<E59A97>憭?00
  status?: string;      // 蝑偦<E89D91><EFBFBD><E39A81><EFBFBD><E59786><EFBFBD>active/inactive嚗?
  keyword?: string;     // <20>𦦵揣<F0A6A6B5>喲睸霂?
  sortBy?: string;      // <20><EFBFBD>摮埈挾嚗ẾreatedAt/updatedAt嚗?
  sortOrder?: 'asc' | 'desc';  // <20><EFBFBD><E98DA6><EFBFBD>嚗屸<E59A97>霈千esc
}

*霂瑟<EFBFBD>蝷箔<EFBFBD>嚗?

GET /api/v1/xxx/resources?page=1&pageSize=10&status=active
Authorization: Bearer <token>

*<EFBFBD>𣂼<EFBFBD><EFBFBD><EFBFBD>嚗? 200 OK

{
  "success": true,
  "data": {
    "items": [
      {
        "id": 1,
        "userId": 123,
        "fieldName": "蝷箔<E89DB7>",
        "description": "<22>讛膩",
        "status": "active",
        "createdAt": "2025-11-06T10:00:00.000Z",
        "updatedAt": "2025-11-06T10:00:00.000Z"
      }
    ],
    "pagination": {
      "page": 1,
      "pageSize": 10,
      "total": 100,
      "totalPages": 10
    }
  },
  "message": "<22><EFBFBD><E79195>𣂼<EFBFBD>"
}

*<EFBFBD>躰秤<EFBFBD><EFBFBD>嚗?

// 401 Unauthorized
{
  "success": false,
  "error": {
    "code": "UNAUTHORIZED",
    "message": "<22><EFBFBD><E88AA3><EFBFBD><EFBFBD>霂瑕<E99C82><E79195><EFBFBD>"
  }
}

// 400 Bad Request
{
  "success": false,
  "error": {
    "code": "INVALID_PARAMS",
    "message": "<22><><EFBFBD>躰秤",
    "details": [
      { "field": "pageSize", "message": "<22><>憭找<E686AD><E689BE><EFBFBD>餈?00" }
    ]
  }
}

2. <20><EFBFBD><EFBFBD><E99F8F>霂行<E99C82>

*蝡舐<EFBFBD>嚗? GET /api/v1/xxx/resources/:id

<EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E79195><EFBFBD><EFBFBD><EFBFBD><E99F8F><EFBFBD><EFBFBD>祕蝏<E7A595><EFBFBD>?

*頝臬<EFBFBD><EFBFBD><EFBFBD>㺭嚗?

  • id (敹<>): 韏<><E99F8F>ID

*霂瑟<EFBFBD>蝷箔<EFBFBD>嚗?

GET /api/v1/xxx/resources/123
Authorization: Bearer <token>

*<EFBFBD>𣂼<EFBFBD><EFBFBD><EFBFBD>嚗? 200 OK

{
  "success": true,
  "data": {
    "id": 123,
    "userId": 456,
    "fieldName": "蝷箔<E89DB7>",
    "description": "霂衣<E99C82><E8A1A3>讛膩",
    "status": "active",
    "createdAt": "2025-11-06T10:00:00.000Z",
    "updatedAt": "2025-11-06T10:00:00.000Z",
    // 憸嘥<E686B8><E598A5><EFBFBD><EFBFBD><EFBFBD>娍㺭<E5A88D>?
    "user": {
      "id": 456,
      "name": "<22><EFBFBD><E586BD>?
    }
  },
  "message": "<EFBFBD><EFBFBD><EFBFBD>𣂼<EFBFBD>"
}

*<EFBFBD>躰秤<EFBFBD><EFBFBD>嚗?

// 404 Not Found
{
  "success": false,
  "error": {
    "code": "NOT_FOUND",
    "message": "韏<><E99F8F>銝滚<E98A9D><E6BB9A>?
  }
}

// 403 Forbidden
{
  "success": false,
  "error": {
    "code": "FORBIDDEN",
    "message": "<EFBFBD><EFBFBD>霈輸䔮甇方<EFBFBD>皞?
  }
}

3. <20>𥕦遣韏<E981A3><E99F8F>

*蝡舐<EFBFBD>嚗? POST /api/v1/xxx/resources

<EFBFBD><EFBFBD><EFBFBD> <20>𥕦遣<F0A595A6><EFBFBD>皞?

霂瑟<EFBFBD>雿橒<EFBFBD>

{
  "fieldName": "韏<><E99F8F><EFBFBD>滨妍",      // 敹<>嚗屸鵭摨?-200
  "description": "<22>讛膩",        // <20><EFBFBD><EFBFBD><E39A81><EFBFBD>憭?000摮?
  "status": "active"            // <20><EFBFBD><EFBFBD>暺䁅恕active
}

*撉諹<EFBFBD><EFBFBD><EFBFBD>嚗?

  • fieldName: 敹<>嚗?-200摮㛖泵嚗䔶<E59A97><E494B6><EFBFBD><E8B3A2>怎鸌畾𠰴<E795BE>蝚?
  • description: <20><EFBFBD><EFBFBD><E39A81><EFBFBD>憭?000摮㛖泵
  • status: <20><EFBFBD><EFBFBD><E39A81><EFBFBD><E39787><EFBFBD>active, inactive

*霂瑟<EFBFBD>蝷箔<EFBFBD>嚗?

POST /api/v1/xxx/resources
Authorization: Bearer <token>
Content-Type: application/json

{
  "fieldName": "<22><EFBFBD>皞?,
  "description": "餈蹱糓銝<EFBFBD>銝芣鰵韏<EFBFBD><EFBFBD>"
}

*<EFBFBD>𣂼<EFBFBD><EFBFBD><EFBFBD>嚗? 201 Created

{
  "success": true,
  "data": {
    "id": 124,
    "userId": 456,
    "fieldName": "<22><EFBFBD>皞?,
    "description": "餈蹱糓銝<EFBFBD>銝芣鰵韏<EFBFBD><EFBFBD>",
    "status": "active",
    "createdAt": "2025-11-06T10:00:00.000Z",
    "updatedAt": "2025-11-06T10:00:00.000Z"
  },
  "message": "<EFBFBD>𥕦遣<EFBFBD>𣂼<EFBFBD>"
}

*<EFBFBD>躰秤<EFBFBD><EFBFBD>嚗?

// 422 Unprocessable Entity
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "<22><>㺭撉諹<E69289>憭梯揖",
    "details": [
      { "field": "fieldName", "message": "摮埈挾<E59F88>滨妍銝滩<E98A9D>銝箇征" },
      { "field": "fieldName", "message": "摮埈挾<E59F88>滨妍<E6BBA8>踹漲敹<E6BCB2><EFBFBD>?-200銋钅𡢿" }
    ]
  }
}

// 409 Conflict
{
  "success": false,
  "error": {
    "code": "ALREADY_EXISTS",
    "message": "霂亥<E99C82>皞𣂼歇摮睃銁"
  }
}

4. <20>湔鰵韏<E9B0B5><E99F8F>

*蝡舐<EFBFBD>嚗? PUT /api/v1/xxx/resources/:id

<EFBFBD><EFBFBD><EFBFBD> <20>湔鰵<E6B994><E9B0B5><EFBFBD><EFBFBD><E99F8F><EFBFBD><E59A97><EFBFBD>湔凒<E6B994><EFBFBD>

*頝臬<EFBFBD><EFBFBD><EFBFBD>㺭嚗?

  • id (敹<>): 韏<><E99F8F>ID

霂瑟<EFBFBD>雿橒<EFBFBD>

{
  "fieldName": "<22>湔鰵<E6B994>𡒊<EFBFBD><F0A1928A>滨妍",
  "description": "<22>湔鰵<E6B994>𡒊<EFBFBD><F0A1928A>讛膩",
  "status": "inactive"
}

*霂瑟<EFBFBD>蝷箔<EFBFBD>嚗?

PUT /api/v1/xxx/resources/123
Authorization: Bearer <token>
Content-Type: application/json

{
  "fieldName": "<22>湔鰵<E6B994>𡒊<EFBFBD><F0A1928A>滨妍",
  "description": "<22>湔鰵<E6B994>𡒊<EFBFBD><F0A1928A>讛膩"
}

*<EFBFBD>𣂼<EFBFBD><EFBFBD><EFBFBD>嚗? 200 OK

{
  "success": true,
  "data": {
    "id": 123,
    "fieldName": "<22>湔鰵<E6B994>𡒊<EFBFBD><F0A1928A>滨妍",
    "description": "<22>湔鰵<E6B994>𡒊<EFBFBD><F0A1928A>讛膩",
    "updatedAt": "2025-11-06T11:00:00.000Z"
  },
  "message": "<22>湔鰵<E6B994>𣂼<EFBFBD>"
}

*<EFBFBD>躰秤<EFBFBD><EFBFBD>嚗?

// 404 Not Found
{
  "success": false,
  "error": {
    "code": "NOT_FOUND",
    "message": "韏<><E99F8F>銝滚<E98A9D><E6BB9A>?
  }
}

// 403 Forbidden
{
  "success": false,
  "error": {
    "code": "FORBIDDEN",
    "message": "<EFBFBD><EFBFBD>靽格㺿甇方<EFBFBD>皞?
  }
}

5. <20>𣳇膄韏<E88684><E99F8F>

*蝡舐<EFBFBD>嚗? DELETE /api/v1/xxx/resources/:id

<EFBFBD><EFBFBD><EFBFBD> <20>𣳇膄<F0A3B387><E88684><EFBFBD><EFBFBD><E99F8F><EFBFBD><EFBFBD>𣳇膄嚗?

*頝臬<EFBFBD><EFBFBD><EFBFBD>㺭嚗?

  • id (敹<>): 韏<><E99F8F>ID

*霂瑟<EFBFBD>蝷箔<EFBFBD>嚗?

DELETE /api/v1/xxx/resources/123
Authorization: Bearer <token>

*<EFBFBD>𣂼<EFBFBD><EFBFBD><EFBFBD>嚗? 200 OK

{
  "success": true,
  "data": null,
  "message": "<22>𣳇膄<F0A3B387>𣂼<EFBFBD>"
}

*<EFBFBD>躰秤<EFBFBD><EFBFBD>嚗?

// 404 Not Found
{
  "success": false,
  "error": {
    "code": "NOT_FOUND",
    "message": "韏<><E99F8F>銝滚<E98A9D><E6BB9A>?
  }
}

// 403 Forbidden
{
  "success": false,
  "error": {
    "code": "FORBIDDEN",
    "message": "<EFBFBD><EFBFBD><EFBFBD>𣳇膄甇方<EFBFBD>皞?
  }
}

// 409 Conflict
{
  "success": false,
  "error": {
    "code": "CANNOT_DELETE",
    "message": "霂亥<E99C82>皞鞉<E79A9E><E99E89><EFBFBD><E594BE>唳旿嚗峕<E59A97>瘜訫<E7989C><E8A8AB>?
  }
}

<EFBFBD><EFBFBD> 霈方<E99C88>銝擧<E98A9D><E693A7>?

霈方<EFBFBD><EFBFBD><EFBFBD>

<EFBFBD><EFBFBD><EFBFBD>𡅅PI<EFBFBD><EFBFBD><EFBFBD>WT Token霈方<E99C88>嚗?

Authorization: Bearer <token>

<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?

  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD>霈輸䔮<EFBFBD>芸楛<EFBFBD><EFBFBD><EFBFBD>皞?
  • ADMIN閫坿𠧧<EFBFBD>臭誑霈輸䔮<EFBFBD><EFBFBD><EFBFBD><EFBFBD>皞?

<EFBFBD><EFBFBD> <20>躰秤<E8BAB0><E7A7A4><EFBFBD><EFBFBD>?

<EFBFBD>躰秤<EFBFBD>? HTTP<EFBFBD><EFBFBD>? 霂湔<EFBFBD>
UNAUTHORIZED 401 <EFBFBD><EFBFBD><EFBFBD>?
FORBIDDEN 403 <EFBFBD><EFBFBD><EFBFBD>?
NOT_FOUND 404 <EFBFBD><EFBFBD>銝滚<EFBFBD><EFBFBD>?
VALIDATION_ERROR 422 <EFBFBD><EFBFBD>㺭撉諹<EFBFBD>憭梯揖
ALREADY_EXISTS 409 <EFBFBD><EFBFBD>撌脣<EFBFBD><EFBFBD>?
INTERNAL_ERROR 500 <EFBFBD>滚𦛚<EFBFBD><EFBFBD>霂?

<EFBFBD><EFBFBD> 雿輻鍂蝷箔<E89DB7>

JavaScript/TypeScript

// <20><EFBFBD><EFBFBD><E99F8F><EFBFBD>𡑒”
const response = await fetch('/api/v1/xxx/resources?page=1&pageSize=10', {
  headers: {
    'Authorization': `Bearer ${token}`,
  },
});
const data = await response.json();

// <20>𥕦遣韏<E981A3><E99F8F>
const response = await fetch('/api/v1/xxx/resources', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    fieldName: '<27><EFBFBD>皞?,
    description: '<EFBFBD>讛膩',
  }),
});

cURL

# <20><EFBFBD><E79195>𡑒”
curl -X GET "http://localhost:3001/api/v1/xxx/resources?page=1&pageSize=10" \
  -H "Authorization: Bearer <token>"

# <20>𥕦遣韏<E981A3><E99F8F>
curl -X POST "http://localhost:3001/api/v1/xxx/resources" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"fieldName":"<22><EFBFBD>皞?,"description":"<22>讛膩"}'

<EFBFBD>𩤃<EFBFBD> 瘜冽<E7989C>鈭钅★

*<EFBFBD><EFBFBD>隡睃<EFBFBD>嚗?

  • <EFBFBD>𡑒”<EFBFBD>亙藁敹<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>△嚗屸<EFBFBD>霈小ageSize=10嚗峕<E59A97>憭?00
  • <EFBFBD><EFBFBD>餈𥪜<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>唳旿嚗峕<EFBFBD><EFBFBD><EFBFBD><EFBFBD>㰘蝸
  • 憭折<EFBFBD><EFBFBD>唳旿撖澆枂雿輻鍂撘<EFBFBD>郊隞餃𦛚

摰匧<EFBFBD><EFBFBD><EFBFBD>

  • <EFBFBD><EFBFBD><EFBFBD>㗇𦻖<EFBFBD><EFBFBD><EFBFBD>憿駁<EFBFBD><EFBFBD>WT Token
  • <EFBFBD>◆璉<EFBFBD><EFBFBD><EFBFBD>皞𣂼<EFBFBD>撅痹<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>芸楛<EFBFBD><EFBFBD><EFBFBD>皞琜<EFBFBD>
  • <EFBFBD>𤩺<EFBFBD>摮埈挾銝滩<EFBFBD>餈𥪜<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?

*<EFBFBD><EFBFBD><EFBFBD>澆捆嚗?

  • API<EFBFBD>䀹凒雿輻鍂<EFBFBD><EFBFBD>𧋦<EFBFBD><EFBFBD>/api/v2嚗?
  • 銝滩<EFBFBD><EFBFBD>𣳇膄撌脫<EFBFBD>摮埈挾嚗<EFBFBD><EFBFBD><EFBFBD>霈唬蛹deprecated
  • <EFBFBD><EFBFBD>摮埈挾敹<EFBFBD><EFBFBD><EFBFBD>霈文<EFBFBD>?

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

*<EFBFBD><EFBFBD>嚗?

<EFBFBD>唳旿摨橒<EFBFBD>


<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD><EFBFBD> YYYY-MM-DD
蝏湔擪鈭綽<EFBFBD> <20><><EFBFBD>舀沲<E88880><E6B2B2><EFBFBD>