feat(admin): Add user management and upgrade to module permission system

Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
This commit is contained in:
2026-01-16 13:42:10 +08:00
parent 98d862dbd4
commit 66255368b7
560 changed files with 70424 additions and 52353 deletions

View File

@@ -1,8 +1,8 @@
# AIA V2.1 后端 API 设计
> **版本**V2.1
> **<EFBFBD>𥕦遣<EFBFBD><EFBFBD>**嚗?026-01-11
> **<EFBFBD><EFBFBD>頝臬<EFBFBD>**嚗䫤/api/v1/aia`
> **创建日期**2026-01-11
> **基础路径**`/api/v2/aia`
---
@@ -10,23 +10,23 @@
| 方法 | 路径 | 描述 | 认证 |
|------|------|------|------|
| GET | `/agents` | <EFBFBD><EFBFBD><EFBFBD><EFBFBD>雿枏<EFBFBD>銵?| <20>?|
| GET | `/agents/:id` | <EFBFBD><EFBFBD><EFBFBD><EFBFBD>雿栞祕<EFBFBD>?| <20>?|
| POST | `/intent/route` | <EFBFBD>誩㦛頝舐眏 | <EFBFBD>?|
| GET | `/conversations` | <EFBFBD><EFBFBD>撖寡<EFBFBD><EFBFBD>𡑒” | <EFBFBD>?|
| POST | `/conversations` | <EFBFBD>𥕦遣撖寡<EFBFBD> | <EFBFBD>?|
| GET | `/conversations/:id` | <EFBFBD><EFBFBD>撖寡<EFBFBD>霂行<EFBFBD> | <EFBFBD>?|
| DELETE | `/conversations/:id` | <EFBFBD>𣳇膄撖寡<EFBFBD> | <EFBFBD>?|
| POST | `/conversations/:id/messages/stream` | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?| <20>?|
| POST | `/conversations/:id/attachments` | 銝𠹺<EFBFBD><EFBFBD><EFBFBD> | <EFBFBD>?|
| GET | `/projects` | <EFBFBD><EFBFBD>憿寧𤌍<EFBFBD>𡑒” | <EFBFBD>?|
| GET | `/projects/:id` | <EFBFBD><EFBFBD>憿寧𤌍霂行<EFBFBD> | <EFBFBD>?|
| GET | `/agents` | 获取智能体列表 | ✅ |
| GET | `/agents/:id` | 获取智能体详情 | ✅ |
| POST | `/intent/route` | 意图路由 | |
| GET | `/conversations` | 获取对话列表 | |
| POST | `/conversations` | 创建对话 | |
| GET | `/conversations/:id` | 获取对话详情 | |
| DELETE | `/conversations/:id` | 删除对话 | |
| POST | `/conversations/:id/messages/stream` | 发送消息(流式) | ✅ |
| POST | `/conversations/:id/attachments` | 上传附件 | |
| GET | `/projects` | 获取项目列表 | |
| GET | `/projects/:id` | 获取项目详情 | |
---
## 🔐 认证
<EFBFBD><EFBFBD><EFBFBD>?API <20><><EFBFBD>銁霂瑟<E99C82>憭港葉<E6B8AF>箏蒂 JWT Token嚗?
所有 API 需要在请求头中携带 JWT Token
```
Authorization: Bearer <token>
@@ -36,21 +36,21 @@ Authorization: Bearer <token>
## 📖 API 详细定义
### 1. <EFBFBD><EFBFBD>雿梶㮾<EFBFBD>?
### 1. 智能体相关
#### 1.1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>雿枏<EFBFBD>銵?
#### 1.1 获取智能体列表
```http
GET /api/v1/aia/agents
GET /api/v2/aia/agents
```
**<EFBFBD>亥砭<EFBFBD><EFBFBD>㺭**嚗?
**查询参数**
| 参数 | 类型 | 必填 | 描述 |
|------|------|------|------|
| stage | string | <EFBFBD>?| 蝑偦<E89D91>厰𧫴畾蛛<E795BE>`design`, `data`, `analysis`, `write`, `publish` |
| stage | string | 否 | 筛选阶段:`design`, `data`, `analysis`, `write`, `publish` |
**<EFBFBD><EFBFBD>**嚗?
**响应**
```json
{
@@ -59,7 +59,7 @@ GET /api/v1/aia/agents
"agents": [
{
"id": "research-design",
"name": "蝘𤑳<EFBFBD>霈曇恣撠誩𨭌<EFBFBD>?,
"name": "科研设计小助手",
"description": "帮助您完成研究方案设计、文献检索、方法学指导",
"icon": "🔬",
"stage": "design",
@@ -70,7 +70,7 @@ GET /api/v1/aia/agents
{
"id": "dc-tool",
"name": "数据采集工具",
"description": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?,
"description": "跳转到数据采集模块",
"icon": "📊",
"stage": "data",
"color": "#8B5CF6",
@@ -82,20 +82,20 @@ GET /api/v1/aia/agents
}
```
#### 1.2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>雿栞祕<EFBFBD>?
#### 1.2 获取智能体详情
```http
GET /api/v1/aia/agents/:id
GET /api/v2/aia/agents/:id
```
**<EFBFBD><EFBFBD>**嚗?
**响应**
```json
{
"code": 0,
"data": {
"id": "research-design",
"name": "蝘𤑳<EFBFBD>霈曇恣撠誩𨭌<EFBFBD>?,
"name": "科研设计小助手",
"description": "帮助您完成研究方案设计、文献检索、方法学指导",
"icon": "🔬",
"stage": "design",
@@ -104,7 +104,7 @@ GET /api/v1/aia/agents/:id
"systemPrompt": "你是一个专业的医学科研设计专家...",
"welcomeMessage": "您好!我是科研设计小助手,我可以帮您:\n- 设计研究方案\n- 检索相关文献\n- 指导研究方法",
"suggestedQuestions": [
"<EFBFBD><EFBFBD><EFBFBD>CT<EFBFBD>𠉛?,
"如何设计一个RCT研究",
"帮我检索近5年糖尿病研究文献",
"什么情况下使用倾向性评分匹配?"
]
@@ -119,27 +119,27 @@ GET /api/v1/aia/agents/:id
#### 2.1 智能意图识别
```http
POST /api/v1/aia/intent/route
POST /api/v2/aia/intent/route
```
**霂瑟<EFBFBD>雿?*嚗?
**请求体**
```json
{
"query": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
"query": "帮我分析一下这份数据"
}
```
**<EFBFBD><EFBFBD>**嚗?
**响应**
```json
{
"code": 0,
"data": {
"agentId": "data-analysis",
"agentName": "蝏蠘恣<EFBFBD><EFBFBD><EFBFBD>撠誩𨭌<EFBFBD>?,
"agentName": "统计分析小助手",
"confidence": 0.92,
"prefillPrompt": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡠺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
"prefillPrompt": "请帮我分析这份数据,包括描述性统计和相关性分析"
}
}
```
@@ -151,19 +151,19 @@ POST /api/v1/aia/intent/route
#### 3.1 获取对话列表
```http
GET /api/v1/aia/conversations
GET /api/v2/aia/conversations
```
**<EFBFBD>亥砭<EFBFBD><EFBFBD>㺭**嚗?
**查询参数**
| 参数 | 类型 | 必填 | 描述 |
|------|------|------|------|
| agentId | string | <EFBFBD>?| <20>㗇惣<E39787><EFBFBD>蝑偦<E89D91>?|
| projectId | string | <EFBFBD>?| <20>厰★<E58EB0><EFBFBD><E6A183><EFBFBD>NULL 銵函內<E587BD>𡁶鍂撖寡<E69296>嚗?|
| page | number | <EFBFBD>?| 憿萇<E686BF>嚗屸<E59A97>霈?1 |
| pageSize | number | <EFBFBD>?| 瘥誯△<E8AAAF><EFBFBD>嚗屸<E59A97>霈?20 |
| agentId | string | 否 | 按智能体筛选 |
| projectId | string | 否 | 按项目筛选NULL 表示通用对话) |
| page | number | 否 | 页码,默认 1 |
| pageSize | number | 否 | 每页数量,默认 20 |
**<EFBFBD><EFBFBD>**嚗?
**响应**
```json
{
@@ -174,10 +174,10 @@ GET /api/v1/aia/conversations
"id": "conv-001",
"title": "RCT研究设计咨询",
"agentId": "research-design",
"agentName": "蝘𤑳<EFBFBD>霈曇恣撠誩𨭌<EFBFBD>?,
"agentName": "科研设计小助手",
"projectId": null,
"messageCount": 12,
"lastMessage": "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?..",
"lastMessage": "好的,我来帮您设计研究方案...",
"createdAt": "2026-01-11T10:00:00Z",
"updatedAt": "2026-01-11T12:30:00Z"
}
@@ -195,27 +195,27 @@ GET /api/v1/aia/conversations
#### 3.2 创建对话
```http
POST /api/v1/aia/conversations
POST /api/v2/aia/conversations
```
**霂瑟<EFBFBD>雿?*嚗?
**请求体**
```json
{
"agentId": "research-design",
"projectId": null,
"title": "<EFBFBD>?
"title": "新对话"
}
```
**<EFBFBD><EFBFBD>**嚗?
**响应**
```json
{
"code": 0,
"data": {
"id": "conv-002",
"title": "<EFBFBD>啣笆霂?,
"title": "新对话",
"agentId": "research-design",
"projectId": null,
"createdAt": "2026-01-11T14:00:00Z"
@@ -223,19 +223,19 @@ POST /api/v1/aia/conversations
}
```
#### 3.3 <EFBFBD><EFBFBD>撖寡<EFBFBD>霂行<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蟮瘨<EFBFBD><EFBFBD>嚗?
#### 3.3 获取对话详情(含历史消息)
```http
GET /api/v1/aia/conversations/:id
GET /api/v2/aia/conversations/:id
```
**<EFBFBD>亥砭<EFBFBD><EFBFBD>㺭**嚗?
**查询参数**
| 参数 | 类型 | 必填 | 描述 |
|------|------|------|------|
| limit | number | <EFBFBD>?| <20><EFBFBD><E79195><EFBFBD>餈𤨩<E9A488><EFBFBD><E28AA5><EFBFBD>暺䁅恕 50 |
| limit | number | 否 | 获取最近N条消息默认 50 |
**<EFBFBD><EFBFBD>**嚗?
**响应**
```json
{
@@ -244,7 +244,7 @@ GET /api/v1/aia/conversations/:id
"id": "conv-001",
"title": "RCT研究设计咨询",
"agentId": "research-design",
"agentName": "蝘𤑳<EFBFBD>霈曇恣撠誩𨭌<EFBFBD>?,
"agentName": "科研设计小助手",
"projectId": null,
"createdAt": "2026-01-11T10:00:00Z",
"updatedAt": "2026-01-11T12:30:00Z",
@@ -260,7 +260,7 @@ GET /api/v1/aia/conversations/:id
"id": "msg-002",
"role": "assistant",
"content": "好的我来帮您设计一个糖尿病RCT研究方案...",
"thinkingContent": "<EFBFBD><EFBFBD><EFBFBD>CT<EFBFBD>𠉛<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD>𤌍<EFBFBD>?2<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?3<EFBFBD><EFBFBD> 4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 5𤩅?6<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...",
"thinkingContent": "用户想设计RCT研究需要考虑1研究目的 2入排标准 3样本量 4随机化方法 5盲法 6结局指标...",
"model": "deepseek-v3",
"tokens": 1250,
"createdAt": "2026-01-11T10:00:30Z"
@@ -273,10 +273,10 @@ GET /api/v1/aia/conversations/:id
#### 3.4 删除对话
```http
DELETE /api/v1/aia/conversations/:id
DELETE /api/v2/aia/conversations/:id
```
**<EFBFBD><EFBFBD>**嚗?
**响应**
```json
{
@@ -289,22 +289,22 @@ DELETE /api/v1/aia/conversations/:id
---
### 4. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
### 4. 消息发送(流式)
#### 4.1 发送消息并获取流式响应
```http
POST /api/v1/aia/conversations/:id/messages/stream
POST /api/v2/aia/conversations/:id/messages/stream
```
**霂瑟<EFBFBD>憭?*嚗?
**请求头**
```
Content-Type: application/json
Accept: text/event-stream
```
**霂瑟<EFBFBD>雿?*嚗?
**请求体**
```json
{
@@ -314,17 +314,17 @@ Accept: text/event-stream
}
```
**<EFBFBD><EFBFBD>嚗𠄎SE <20><EFBFBD>嚗?*嚗?
**响应SSE 格式)**
```
event: thinking_start
data: {}
event: thinking_delta
data: {"content": "<EFBFBD><EFBFBD>銝𠹺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞塚<EFBFBD><EFBFBD><EFBFBD>閬?}
data: {"content": "用户上传了数据文件,需要"}
event: thinking_delta
data: {"content": "餈𥡝<EFBFBD><EFBFBD>讛膩<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?.."}
data: {"content": "进行描述性统计分析..."}
event: thinking_end
data: {"duration": 3200}
@@ -333,7 +333,7 @@ event: message_start
data: {"id": "msg-003"}
event: delta
data: {"content": "<EFBFBD>寞旿<EFBFBD><EFBFBD>隡删<EFBFBD><EFBFBD>唳旿嚗?}
data: {"content": "根据您上传的数据,"}
event: delta
data: {"content": "我来为您进行分析..."}
@@ -345,18 +345,18 @@ event: done
data: {}
```
**SSE 鈭衤辣蝐餃<EFBFBD>**嚗?
**SSE 事件类型**
| 事件 | 描述 | 数据格式 |
|------|------|---------|
| `thinking_start` | <EFBFBD>憪𧢲楛摨行<EFBFBD><EFBFBD>?| `{}` |
| `thinking_delta` | <EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰寧<EFBFBD>畾?| `{"content": "..."}` |
| `thinking_end` | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?| `{"duration": number}` |
| `message_start` | <EFBFBD>憪讠<EFBFBD><EFBFBD>𣂼<EFBFBD>憭?| `{"id": "..."}` |
| `thinking_start` | 开始深度思考 | `{}` |
| `thinking_delta` | 思考内容片段 | `{"content": "..."}` |
| `thinking_end` | 思考结束 | `{"duration": number}` |
| `message_start` | 开始生成回复 | `{"id": "..."}` |
| `delta` | 回复内容片段 | `{"content": "..."}` |
| `message_end` | 回复结束 | `{"id": "...", "tokens": number, "model": "..."}` |
| `error` | 发生错误 | `{"code": "...", "message": "..."}` |
| `done` | <EFBFBD><EFBFBD><EFBFBD>?| `{}` |
| `done` | 流结束 | `{}` |
---
@@ -365,22 +365,22 @@ data: {}
#### 5.1 上传附件
```http
POST /api/v1/aia/conversations/:id/attachments
POST /api/v2/aia/conversations/:id/attachments
```
**霂瑟<EFBFBD>憭?*嚗?
**请求头**
```
Content-Type: multipart/form-data
```
**霂瑟<EFBFBD>雿橒<EFBFBD>FormData嚗?*嚗?
**请求体(FormData**
| 字段 | 类型 | 必填 | 描述 |
|------|------|------|------|
| file | File | <EFBFBD>?| <20><>辣嚗㇊DF/Word/TXT/Excel嚗峕<EFBFBD>憭?0MB嚗?|
| file | File | 是 | 文件PDF/Word/TXT/Excel最大20MB |
**<EFBFBD><EFBFBD>**嚗?
**响应**
```json
{
@@ -399,13 +399,13 @@ Content-Type: multipart/form-data
}
```
**<EFBFBD>躰秤<EFBFBD>?*嚗?
**错误码**
| <EFBFBD>躰秤<EFBFBD>?| <20>讛膩 |
| 错误码 | 描述 |
|--------|------|
| `ATTACHMENT_TOO_LARGE` | 文件超过 20MB |
| `ATTACHMENT_TYPE_NOT_SUPPORTED` | 不支持的文件类型 |
| `ATTACHMENT_LIMIT_EXCEEDED` | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝𢠃<EFBFBD>嚗?銝迎<E98A9D> |
| `ATTACHMENT_LIMIT_EXCEEDED` | 附件数量超过上限5个 |
| `TEXT_EXTRACTION_FAILED` | 文本提取失败 |
---
@@ -415,10 +415,10 @@ Content-Type: multipart/form-data
#### 6.1 获取项目列表
```http
GET /api/v1/aia/projects
GET /api/v2/aia/projects
```
**<EFBFBD><EFBFBD>**嚗?
**响应**
```json
{
@@ -427,8 +427,8 @@ GET /api/v1/aia/projects
"projects": [
{
"id": "proj-001",
"name": "蝟硋倏<EFBFBD><EFBFBD><EFBFBD>蝛園★<EFBFBD>?,
"description": "2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?,
"name": "糖尿病研究项目",
"description": "2型糖尿病患者生活方式干预研究",
"conversationCount": 5,
"createdAt": "2026-01-01T10:00:00Z",
"updatedAt": "2026-01-11T12:00:00Z"
@@ -449,20 +449,20 @@ GET /api/v1/aia/projects
"code": -1,
"error": {
"code": "CONVERSATION_NOT_FOUND",
"message": "<EFBFBD><EFBFBD><EFBFBD>?
"message": "对话不存在"
}
}
```
### <EFBFBD>𡁶鍂<EFBFBD>躰秤<EFBFBD>?
### 通用错误码
| <EFBFBD>躰秤<EFBFBD>?| HTTP <EFBFBD><EFBFBD><EFBFBD><EFBFBD> | <20>讛膩 |
| 错误码 | HTTP 状态码 | 描述 |
|--------|------------|------|
| `UNAUTHORIZED` | 401 | <EFBFBD><EFBFBD><EFBFBD>?|
| `FORBIDDEN` | 403 | <EFBFBD><EFBFBD><EFBFBD>?|
| `NOT_FOUND` | 404 | <EFBFBD><EFBFBD>銝滚<EFBFBD><EFBFBD>?|
| `UNAUTHORIZED` | 401 | 未授权 |
| `FORBIDDEN` | 403 | 无权限 |
| `NOT_FOUND` | 404 | 资源不存在 |
| `VALIDATION_ERROR` | 400 | 参数验证失败 |
| `INTERNAL_ERROR` | 500 | <EFBFBD>滚𦛚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>霂?|
| `INTERNAL_ERROR` | 500 | 服务器内部错误 |
| `LLM_ERROR` | 500 | LLM 调用失败 |
| `RATE_LIMITED` | 429 | 请求过于频繁 |
@@ -475,13 +475,13 @@ GET /api/v1/aia/projects
```typescript
interface Attachment {
id: string; // 附件ID
filename: string; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
filename: string; // 原始文件名
mimeType: string; // MIME 类型
size: number; // 文件大小(字节)
ossUrl: string; // OSS 存储地址
textContent?: string; // 提取的文本内容(存储时截断)
tokenCount: number; // <EFBFBD><EFBFBD>𧋦 Token <EFBFBD>?
truncated: boolean; // <EFBFBD>臬炏鋡急⏛<EFBFBD><EFBFBD><EFBFBD><EFBFBD>30K tokens嚗?
tokenCount: number; // 文本 Token
truncated: boolean; // 是否被截断(超过30K tokens
createdAt: string; // 创建时间
}
```
@@ -494,7 +494,7 @@ interface Message {
conversationId: string;
role: 'user' | 'assistant';
content: string;
thinkingContent?: string; // 瘛勗漲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰?
thinkingContent?: string; // 深度思考内容
attachments?: Attachment[];
model?: string;
tokens?: number;
@@ -505,15 +505,15 @@ interface Message {
---
## <EFBFBD>妒 瘚贝<E7989A>蝷箔<E89DB7>嚗㇌EST Client嚗?
## 🧪 测试示例REST Client
```http
### <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
GET {{baseUrl}}/api/v1/aia/agents
###
GET {{baseUrl}}/api/v2/aia/agents
Authorization: Bearer {{token}}
###
POST {{baseUrl}}/api/v1/aia/intent/route
POST {{baseUrl}}/api/v2/aia/intent/route
Authorization: Bearer {{token}}
Content-Type: application/json
@@ -522,7 +522,7 @@ Content-Type: application/json
}
###
POST {{baseUrl}}/api/v1/aia/conversations
POST {{baseUrl}}/api/v2/aia/conversations
Authorization: Bearer {{token}}
Content-Type: application/json
@@ -531,8 +531,8 @@ Content-Type: application/json
"title": ""
}
### <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
POST {{baseUrl}}/api/v1/aia/conversations/{{conversationId}}/messages/stream
###
POST {{baseUrl}}/api/v2/aia/conversations/{{conversationId}}/messages/stream
Authorization: Bearer {{token}}
Content-Type: application/json
Accept: text/event-stream
@@ -543,7 +543,7 @@ Accept: text/event-stream
}
###
POST {{baseUrl}}/api/v1/aia/conversations/{{conversationId}}/attachments
POST {{baseUrl}}/api/v2/aia/conversations/{{conversationId}}/attachments
Authorization: Bearer {{token}}
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
@@ -568,4 +568,3 @@ Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet