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%)
319 lines
8.6 KiB
Markdown
319 lines
8.6 KiB
Markdown
# **Prompt蝞∠<E89D9E>蝟餌<E89D9F>敹恍<E695B9>笔<EFBFBD><E7AC94>?*
|
||
|
||
> **<2A><>𧋦嚗?* v1.0
|
||
> **隡睃<E99AA1>蝥改<E89DA5>** P0嚗<30>瓲敹<E793B2><E695B9>𡁶鍂<F0A181B6>賢<EFBFBD>嚗?
|
||
> **<2A>嗆<EFBFBD><E59786><EFBFBD>** 敺<><E695BA><EFBFBD>?
|
||
|
||
---
|
||
|
||
## <20><> <20>詨<EFBFBD>璁<EFBFBD>艙
|
||
|
||
### 隞<>銋<EFBFBD>糓Prompt蝞∠<E89D9E>蝟餌<E89D9F>嚗?
|
||
|
||
銝<EFBFBD>銝芸<EFBFBD>霈?*銝㮖<E98A9D>鈭箏<E988AD><E7AE8F>函<EFBFBD>鈭抒㴓憓<E3B493><E68693><EFBFBD>刻<EFBFBD>霂𧭈I Prompt**<2A><><EFBFBD>摨阡<E691A8>閫<EFBFBD>頂蝏麄<E89D8F>?
|
||
|
||
### 銝箔<E98A9D>銋<EFBFBD><E98A8B>閬<EFBFBD><E996AC>嚗?
|
||
|
||
- <20>?**<2A>𤤿<EFBFBD>1嚗?* 瘚贝<E7989A><E8B49D>臬<EFBFBD><E887AC>䭾<EFBFBD>璅⊥<E79285><E28AA5>笔<EFBFBD><E7AC94>餃郎<E9A483>唳旿嚗?0蝭<30><E89DAD><EFBFBD>柴<EFBFBD><E69FB4><EFBFBD>摰䂿<E691B0><E482BF><EFBFBD><EFBFBD>
|
||
- <20>?**<2A>𤤿<EFBFBD>2嚗?* 瘥𤩺活靚<E6B4BB>㟲Prompt<70><74>閬<EFBFBD>㺿隞<E3BABF><E99A9E><EFBFBD>㘾<EFBFBD>蝵聆<E89DB5>蝑匧<E89D91>嚗?<3F><><EFBFBD>嚗?
|
||
- <20>?**<2A>𤤿<EFBFBD>3嚗?* 銝游<E98A9D>銝枏振<E69E8F>䭾<EFBFBD><E4ADBE><EFBFBD><EFBFBD>靚<EFBFBD><E99D9A>嚗<EFBFBD><E59A97>隞砌<E99A9E>隡𡁜<E99AA1>隞<EFBFBD><E99A9E>嚗?
|
||
- <20>?**閫<><E996AB>嚗?* <20>煺漣<E785BA>臬<EFBFBD><E887AC>啣漲憸<E6BCB2><E686B8> + 靚<><E99D9A><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?+ DRAFT/ACTIVE<56><45>𧋦<EFBFBD>𠉛氖
|
||
|
||
---
|
||
|
||
## <20><>儭?<3F>唳旿摨廍chema
|
||
|
||
### 雿滨蔭嚗䫤capability_schema`
|
||
|
||
```prisma
|
||
// --- Prompt Management System ---
|
||
|
||
model PromptTemplate {
|
||
id Int @id @default(autoincrement())
|
||
code String @unique // 'ASL_SCREENING_TitleAbstract'
|
||
name String // "ASL<53><4C><EFBFBD><EFBFBD>䁅<EFBFBD>蝑偦<E89D91>?
|
||
module String // ASL, DC, IIT, AIA, PKB, RVW
|
||
description String?
|
||
variables Json? // ["title", "abstract"]
|
||
|
||
versions PromptVersion[]
|
||
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
updatedAt DateTime @updatedAt @map("updated_at")
|
||
|
||
@@map("prompt_templates")
|
||
@@schema("capability_schema")
|
||
}
|
||
|
||
model PromptVersion {
|
||
id Int @id @default(autoincrement())
|
||
templateId Int @map("template_id")
|
||
version Int // <20><>𧋦<EFBFBD>?
|
||
content String @db.Text // Prompt<70><74>捆
|
||
modelConfig Json? // {"temperature": 0.1}
|
||
status PromptStatus @default(DRAFT)
|
||
changelog String? // "憓𧼮<E68693>鈭<EFBFBD><E988AD><EFBFBD>斗<EFBFBD><E69697>?
|
||
createdBy String? @map("created_by") // UserID嚗<44>恣霈∴<E99C88>
|
||
|
||
template PromptTemplate @relation(fields: [templateId], references: [id])
|
||
|
||
createdAt DateTime @default(now()) @map("created_at")
|
||
|
||
@@map("prompt_versions")
|
||
@@schema("capability_schema")
|
||
|
||
@@index([templateId, status])
|
||
}
|
||
|
||
enum PromptStatus {
|
||
DRAFT // <20>厩阮嚗<E998AE><E59A97>Debug璅∪<E79285><E288AA>航<EFBFBD>嚗?
|
||
ACTIVE // <20>煺漣<E785BA><E6BCA3>𧋦
|
||
ARCHIVED // 敶埝﹝
|
||
|
||
@@schema("capability_schema")
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## <20><> <20><><EFBFBD>銝舘<E98A9D><E88898>?
|
||
|
||
### <20>啣<EFBFBD><E595A3><EFBFBD><EFBFBD>
|
||
|
||
| <20><><EFBFBD> Code | <20>讛膩 | <20><>鍂閫坿𠧧 |
|
||
|-----------|------|---------|
|
||
| `prompt:view` | <20>亦<EFBFBD>Prompt<70>𡑒”<F0A19192><E2809D><EFBFBD><EFBFBD>?| SUPER_ADMIN, PROMPT_ENGINEER |
|
||
| `prompt:edit` | <20>𥕦遣/靽格㺿DRAFT<46><54>𧋦 | SUPER_ADMIN, PROMPT_ENGINEER |
|
||
| `prompt:debug` | 潃?**撘<><E69298>航<EFBFBD>霂閙芋撘?* | SUPER_ADMIN, PROMPT_ENGINEER |
|
||
| `prompt:publish` | <20>穃<EFBFBD>DRAFT<46>𡒶CTIVE | SUPER_ADMIN, PROMPT_ENGINEER |
|
||
|
||
### <20>啣<EFBFBD>閫坿𠧧
|
||
|
||
```typescript
|
||
enum UserRole {
|
||
SUPER_ADMIN = 'SUPER_ADMIN',
|
||
PROMPT_ENGINEER = 'PROMPT_ENGINEER', // <20><> <20>詨<EFBFBD>閫坿𠧧
|
||
HOSPITAL_ADMIN = 'HOSPITAL_ADMIN',
|
||
PHARMA_ADMIN = 'PHARMA_ADMIN',
|
||
USER = 'USER'
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## <20><> <20>詨<EFBFBD>API
|
||
|
||
### 蝞∠<E89D9E>蝡舀𦻖<E88880>?
|
||
|
||
| <20>寞<EFBFBD> | 頝臬<E9A09D> | <20><><EFBFBD> | <20>讛膩 |
|
||
|------|------|------|------|
|
||
| GET | `/api/admin/prompts` | prompt:view | <20>瑕<EFBFBD><E79195><EFBFBD><EFBFBD>㗇芋<E39787>?|
|
||
| GET | `/api/admin/prompts/:id` | prompt:view | <20>瑕<EFBFBD>霂行<E99C82>+<2B><>蟮<EFBFBD><E89FAE>𧋦 |
|
||
| POST | `/api/admin/prompts/draft` | prompt:edit | 靽嘥<E99DBD><E598A5>厩阮 |
|
||
| POST | `/api/admin/prompts/publish` | prompt:publish | <20>穃<EFBFBD> |
|
||
| POST | `/api/admin/prompts/debug` | prompt:debug | **撘<><E69298>唾<EFBFBD>霂閙芋撘?* |
|
||
|
||
### 銝𡁜𦛚璅∪<E79285><E288AA><EFBFBD><EFBFBD>
|
||
|
||
```typescript
|
||
// backend/src/modules/asl/services/screening.service.ts
|
||
|
||
import { promptService } from '@/common/capabilities/prompt/prompt.service';
|
||
|
||
export class ScreeningService {
|
||
async screenPaper(paper: any, userId: string) {
|
||
// <20>㴓 <20>詨<EFBFBD>靚<EFBFBD>鍂嚗朞䌊<E69C9E>典<EFBFBD><E585B8><EFBFBD><EFBFBD>摨阡<E691A8>餉<EFBFBD>
|
||
const prompt = await promptService.get(
|
||
'ASL_SCREENING_TitleAbstract',
|
||
{ title: paper.title, abstract: paper.abstract },
|
||
userId // 潃?敹<>◆隡惩<E99AA1>userId
|
||
);
|
||
|
||
return await llmGateway.chat(prompt);
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## <20>綫 <20>滨垢蝏<E59EA2>辣
|
||
|
||
### <20>典<EFBFBD>靚<EFBFBD><E99D9A>撘<EFBFBD><E69298>?
|
||
|
||
```tsx
|
||
// frontend-v2/src/modules/admin/components/PromptDebugSwitch.tsx
|
||
|
||
export const PromptDebugSwitch = () => {
|
||
const { hasPermission } = usePermission();
|
||
const [debugMode, setDebugMode] = useState(false);
|
||
|
||
if (!hasPermission('prompt:debug')) {
|
||
return null; // <20><> <20><><EFBFBD><EFBFBD>批<EFBFBD>
|
||
}
|
||
|
||
return (
|
||
<>
|
||
<Switch
|
||
checked={debugMode}
|
||
onChange={(enabled) => api.post('/api/admin/prompts/debug', { enabled })}
|
||
checkedChildren="<22><> 靚<><E99D9A>璅∪<E79285>"
|
||
unCheckedChildren="<22>煺漣璅∪<E79285>"
|
||
/>
|
||
{debugMode && (
|
||
<Alert
|
||
type="warning"
|
||
message="<22>𩤃<EFBFBD> 靚<><E99D9A>璅∪<E79285>撌脣<E6928C><E884A3>荔<EFBFBD><E88D94>典<EFBFBD><E585B8>齿迤<E9BDBF>其蝙<E585B6>刻<EFBFBD>蝔輻<E89D94>嚗㇄RAFT嚗㗇<E59A97>蝷箄<E89DB7>"
|
||
banner
|
||
/>
|
||
)}
|
||
</>
|
||
);
|
||
};
|
||
```
|
||
|
||
---
|
||
|
||
## <20><> 瘨匧<E798A8>璅∪<E79285>
|
||
|
||
| 璅∪<E79285> | <20>詨<EFBFBD><E8A9A8>箸艶 | 憭齿<E686AD>摨?| 隡睃<E99AA1>蝥?|
|
||
|------|---------|-------|--------|
|
||
| **ASL** | <20><><EFBFBD><EFBFBD>䁅<EFBFBD><E48185>萘<EFBFBD><E89098><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑䜘<E89D91><E49C98><EFBFBD><EFBFBD>桀<EFBFBD><E6A180>?| 潃鐥<E6BD83>潃鐥<E6BD83>潃?| P0 |
|
||
| **DC** | Tool B<>𣂼<EFBFBD><F0A382BC><EFBFBD>ool C皜<43><E79A9C><EFBFBD><EFBFBD><EFBFBD>蝒<EFBFBD><E89D92>瘚?| 潃鐥<E6BD83>潃鐥<E6BD83>潃?| P0 |
|
||
| **IIT** | 韐冽綉璉<E7B689><E79289>乓<EFBFBD><E4B993><EFBFBD><EFBFBD>曇<EFBFBD><E69B87>?| 潃鐥<E6BD83>潃鐥<E6BD83>潃?| P1 |
|
||
| **PKB** | RAG<41>桃<EFBFBD><E6A183><EFBFBD>鸌憭<E9B88C><E686AD><EFBFBD><EFBFBD>粉 | 潃鐥<E6BD83>潃鐥<E6BD83> | P1 |
|
||
| **AIA** | 10+<2B>箄<EFBFBD>雿瓐<E99BBF><E79390><EFBFBD><EFBFBD>曇<EFBFBD><E69B87>?| 潃鐥<E6BD83>潃?| P2 |
|
||
| **RVW** | 閫<><E996AB><EFBFBD>扳<EFBFBD><E689B3>?| 潃鐥<E6BD83>潃?| P2 |
|
||
|
||
---
|
||
|
||
## <20>辷<EFBFBD> <20>詨<EFBFBD><E8A9A8>餉<EFBFBD>嚗㇊romptService嚗?
|
||
|
||
```typescript
|
||
// backend/src/common/capabilities/prompt/prompt.service.ts
|
||
|
||
export class PromptService {
|
||
private debugUsers = new Set<string>(); // <20><><EFBFBD>摮睃<E691AE>靚<EFBFBD><E99D9A><EFBFBD>冽<EFBFBD>
|
||
private activeCache = new Map<string, string>(); // ACTIVE<56><45>𧋦蝻枏<E89DBB>
|
||
|
||
// 霈曄蔭靚<E894AD><E99D9A>璅∪<E79285>
|
||
async setDebugMode(userId: string, enabled: boolean) {
|
||
if (enabled) {
|
||
this.debugUsers.add(userId);
|
||
} else {
|
||
this.debugUsers.delete(userId);
|
||
}
|
||
}
|
||
|
||
// <20>瑕<EFBFBD>Prompt嚗<74><E59A97>摨行瓲敹<E793B2><E695B9>
|
||
async get(code: string, variables: any, userId: string): Promise<string> {
|
||
// 1. 靚<><E99D9A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>繮<EFBFBD>靝RAFT<46><54>𧋦
|
||
if (this.debugUsers.has(userId)) {
|
||
const draft = await this.getDraftVersion(code);
|
||
if (draft) {
|
||
return this.render(draft.content, variables);
|
||
}
|
||
}
|
||
|
||
// 2. <20>桅<EFBFBD>𡁶鍂<F0A181B6>瑁繮<E79181>䨝CTIVE<56><45>𧋦嚗<F0A78BA6>蒂蝻枏<E89DBB>嚗?
|
||
let active = this.activeCache.get(code);
|
||
if (!active) {
|
||
const version = await prisma.promptVersion.findFirst({
|
||
where: {
|
||
template: { code },
|
||
status: 'ACTIVE'
|
||
},
|
||
orderBy: { version: 'desc' }
|
||
});
|
||
active = version?.content || this.getFallback(code);
|
||
this.activeCache.set(code, active);
|
||
}
|
||
|
||
return this.render(active, variables);
|
||
}
|
||
|
||
// Postgres LISTEN/NOTIFY <20>剜凒<E5899C>?
|
||
async initHotReload() {
|
||
const client = await pool.connect();
|
||
await client.query('LISTEN prompt_update');
|
||
|
||
client.on('notification', (msg) => {
|
||
this.activeCache.clear(); // 皜<>征蝻枏<E89DBB>
|
||
});
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## <20><> 撘<><E69298>𤏸恣<F0A48FB8>?
|
||
|
||
### Phase 0: <20>箇<EFBFBD>霈暹鴌嚗?憭抬<E686AD>
|
||
|
||
- [ ] <20>𥕦遣<F0A595A6>唳旿摨栞”嚗Ǒprompt_templates`, `prompt_versions`嚗?
|
||
- [ ] 瘛餃<E7989B>`prompt:*`<EFBFBD><EFBFBD><EFBFBD><EFBFBD>躬platform_schema.permissions`
|
||
- [ ] <20>𥕦遣`PROMPT_ENGINEER`閫坿𠧧
|
||
- [ ] 摰䂿緵`PromptService`<EFBFBD>詨<EFBFBD><EFBFBD>餉<EFBFBD>
|
||
|
||
### Phase 1: 餈鞱𨯫蝡烘VP嚗?憭抬<E686AD>
|
||
|
||
- [ ] <20>滨垢蝞∠<E89D9E><E288A0>屸𢒰嚗<F0A292B0><E59A97>銵具<E98AB5><E585B7><EFBFBD>颲穃膥<E7A983><E886A5><EFBFBD><EFBFBD>砍<EFBFBD><E7A08D>莎<EFBFBD>
|
||
- [ ] <20>典<EFBFBD>靚<EFBFBD><E99D9A>撘<EFBFBD><E69298>喟<EFBFBD>隞?
|
||
- [ ] <20>厩阮靽嘥<E99DBD>/<2F>穃<EFBFBD><E7A983>蠘<EFBFBD>
|
||
|
||
### Phase 2: 銝𡁜𦛚璅∪<E79285><E288AA>亙<EFBFBD>嚗<EFBFBD><E59A97>銝𡁜𦛚撘<F0A69B9A><E69298>𡢅<EFBFBD>
|
||
|
||
- [ ] ASL璅∪<E79285>靚<EFBFBD>鍂`promptService.get()`
|
||
- [ ] DC璅∪<E79285>靚<EFBFBD>鍂`promptService.get()`
|
||
- [ ] <20>嗡<EFBFBD>璅∪<E79285><E288AA>厰<EFBFBD><E58EB0>亙<EFBFBD>
|
||
|
||
---
|
||
|
||
## <20><> 摰匧<E691B0>銝𡡞<E98A9D><F0A1A19E>?
|
||
|
||
### <20><><EFBFBD><EFBFBD>𠉛氖
|
||
|
||
- <20>?銝交聢璉<E881A2><E79289>匝prompt:debug`<60><><EFBFBD>
|
||
- <20>?靚<><E99D9A>璅∪<E79285><E288AA>嗆<EFBFBD><E59786><EFBFBD><EFBFBD>典銁<E585B8><E98A81><EFBFBD>嚗<EFBFBD>蒈<EFBFBD>箄䌊<E7AE84>典仃<E585B8><E4BB83><EFBFBD>
|
||
|
||
### 摰∟恣<E2889F>亙<EFBFBD>
|
||
|
||
- <20>?`PromptVersion.createdBy`霈啣<EFBFBD>靽格㺿鈭?
|
||
- <20>?`AdminOperationLog`霈啣<EFBFBD><EFBFBD>穃<EFBFBD>銵䔶蛹嚗éodule='prompt'嚗?
|
||
|
||
### <20>𨅯<EFBFBD><F0A885AF>箏<EFBFBD>
|
||
|
||
- <20>?隞<><E99A9E>銝凋<E98A9D><E5878B>䆲ardcoded Prompt雿靝蛹蝟餌<E89D9F>蝥批<E89DA5>摨?
|
||
- <20>?<3F>唳旿摨𤘪䰻霂W仃韐交𧒄餈𥪜<E9A488>暺䁅恕<E48185><E68195>𧋦
|
||
|
||
---
|
||
|
||
## <20>㴓 <20>詨<EFBFBD>撌乩<E6928C>瘚?
|
||
|
||
1. **<EFBFBD>箸艶嚗?* 銝游<E98A9D>銝枏振Dr. Wang閫匧<E996AB>ASL<53><4C>讃蝑偦<E89D91>匧<EFBFBD>蝖桃<E89D96>銝滚<E98A9D>
|
||
|
||
2. **靽格㺿嚗?* Dr. Wang<6E>餃<EFBFBD>餈鞱𨯫蝞∠<E89D9E>蝡荔<E89DA1>靽格㺿`ASL_SCREENING`<EFBFBD><EFBFBD>rompt嚗<EFBFBD><EFBFBD><EFBFBD>䭾<EFBFBD><EFBFBD>斗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>靽嘥<EFBFBD><EFBFBD>厩阮
|
||
|
||
3. **靚<><E99D9A>嚗?* Dr. Wang<6E>孵稬憿園<E686BF><E59C92>?撘<><E69298>航<EFBFBD>霂閙芋撘?
|
||
|
||
4. **撉諹<E69289>嚗?* Dr. Wang<6E><67>揢<EFBFBD>蚊SL銝𡁜𦛚憿菟𢒰嚗䔶<E59A97>隡惩<E99AA1>蝭<EFBFBD><E89DAD><EFBFBD>滨<EFBFBD><E6BBA8>嗵<EFBFBD><E597B5><EFBFBD>讃
|
||
*<EFBFBD>?蝟餌<E89D9F><E9A48C>𡒊垢璉<E59EA2>瘚见<E7989A>Dr. Wang<6E>求ebug<75>𡑒”銝哨<E98A9D><E593A8>㰘蝸DRAFT<46>㇊rompt*
|
||
|
||
5. **蝖株恕嚗?* <20>𤑳緵蝏𤘪<E89D8F>甇<EFBFBD>&鈭?
|
||
|
||
6. **<EFBFBD>穃<EFBFBD>嚗?* Dr. Wang<6E>𧼮<EFBFBD>蝞∠<E89D9E>憿蛛<E686BF><E89B9B>孵稬"<22>穃<EFBFBD>"
|
||
|
||
7. **蝏𤘪<E89D8F>嚗?* Dr. Wang<6E>喲𡡒靚<F0A1A192><E99D9A>璅∪<E79285>
|
||
|
||
---
|
||
|
||
## <20><> <20>詨<EFBFBD><E8A9A8><EFBFBD>﹝
|
||
|
||
- `02-<2D>𡁶鍂<F0A181B6>賢<EFBFBD>撅<EFBFBD>07-餈鞱𨯫銝擧㦤<E693A7><E3A6A4>恣<EFBFBD><E681A3>垢PRD_v2.1.md` - <20>颱<EFBFBD><E9A2B1><EFBFBD>瘙?
|
||
- `02-<2D>𡁶鍂<F0A181B6>賢<EFBFBD>撅<EFBFBD>03-Prompt蝞∠<E89D9E>蝟餌<E89D9F>銝𡒊<E98A9D>摨阡<E691A8>閫<EFBFBD>挽霈⊥䲮獢?md` - 霂衣<E99C82>霈曇恣
|
||
- `00-<2D><><EFBFBD>銝舘<E98A9D><E88898>脖<EFBFBD>蝟餅4<E9A485><EFBC94>𥁒<EFBFBD>𠽤v1.0.md` - <20>嗆<EFBFBD>璇喟<E79287>
|
||
|
||
---
|
||
|
||
**<EFBFBD><EFBFBD> <20><><EFBFBD>撘<EFBFBD>憪见<E686AA><E8A781>睲<EFBFBD><E79DB2>梹<EFBFBD>**
|
||
|