Files
AIclinicalresearch/docs/02-通用能力层/快速引用卡片.md
HaHafeng 2481b786d8 deploy: Complete 0126-27 deployment - database upgrade, services update, code recovery
Major Changes:
- Database: Install pg_bigm/pgvector plugins, create test database
- Python service: v1.0 -> v1.1, add pymupdf4llm/openpyxl/pypandoc
- Node.js backend: v1.3 -> v1.7, fix pino-pretty and ES Module imports
- Frontend: v1.2 -> v1.3, skip TypeScript check for deployment
- Code recovery: Restore empty files from local backup

Technical Fixes:
- Fix pino-pretty error in production (conditional loading)
- Fix ES Module import paths (add .js extensions)
- Fix OSSAdapter TypeScript errors
- Update Prisma Schema (63 models, 16 schemas)
- Update environment variables (DATABASE_URL, EXTRACTION_SERVICE_URL, OSS)
- Remove deprecated variables (REDIS_URL, DIFY_API_URL, DIFY_API_KEY)

Documentation:
- Create 0126 deployment folder with 8 documents
- Update database development standards v2.0
- Update SAE deployment status records

Deployment Status:
- PostgreSQL: ai_clinical_research_test with plugins
- Python: v1.1 @ 172.17.173.84:8000
- Backend: v1.7 @ 172.17.173.89:3001
- Frontend: v1.3 @ 172.17.173.90:80

Tested: All services running successfully on SAE
2026-01-27 08:13:27 +08:00

249 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 通用能力层 - 快速引用卡片
> 一页纸速查表,快速找到需要的通用能力
---
## 🎯 我需要...
### 💬 AI 对话功能
**前端:**
```tsx
import { AIStreamChat } from '@/shared/components/Chat';
<AIStreamChat apiEndpoint="/api/v1/xxx/chat/stream" enableDeepThinking={true} />
```
**后端:**
```typescript
import { createStreamingService } from '../../../common/streaming';
const service = createStreamingService(reply);
await service.streamGenerate(messages);
```
📚 [详细文档](./00-通用能力层清单.md#2-chat-通用组件)
---
### 🤖 调用 LLM
```typescript
import { LLMFactory } from '../../../common/llm/adapters/LLMFactory';
const llm = LLMFactory.getAdapter('deepseek-v3');
const response = await llm.chat(messages);
// 流式
for await (const chunk of llm.chatStream(messages)) {
console.log(chunk.content);
}
```
📚 [详细文档](./01-LLM大模型网关/)
---
### 📁 文件存储
```typescript
import { storage } from '../../../common/storage';
// 上传
const url = await storage.upload('path/file.pdf', buffer);
// 下载
const buffer = await storage.download('path/file.pdf');
```
📚 [详细文档](./00-通用能力层清单.md#4-存储服务)
---
### ⚡ 异步任务
```typescript
import { JobFactory } from '../../../common/jobs';
const queue = JobFactory.getQueue();
// 创建任务
await queue.createJob('job-name', { taskId: 'xxx' });
// 注册Worker
queue.registerWorker('job-name', async (job) => {
// 处理逻辑
});
```
📚 [详细文档](./Postgres-Only异步任务处理指南.md)
---
### 📄 文档处理
```typescript
import { ExtractionClient } from '../../../common/document/ExtractionClient';
const client = new ExtractionClient();
const text = await client.extractText(buffer, 'pdf');
```
📚 [详细文档](./02-文档处理引擎/)
---
### 🔍 知识库检索RAG
```typescript
import { DifyClient } from '../../../common/rag/DifyClient';
const dify = new DifyClient(apiKey, baseURL);
const results = await dify.retrievalSearch(query, options);
```
📚 [详细文档](./03-RAG引擎/)
---
### 💾 缓存服务
```typescript
import { cache } from '../../../common/cache';
await cache.set('key', value, 3600); // TTL: 3600秒
const value = await cache.get('key');
await cache.delete('key');
```
📚 [详细文档](./00-通用能力层清单.md#6-缓存服务)
---
### 📝 日志记录
```typescript
import { logger } from '../../../common/logging';
logger.info('[Module] 操作描述', { userId: 'xxx', detail: 'xxx' });
logger.error('[Module] 错误', { error, stack: error.stack });
```
📚 [详细文档](./00-通用能力层清单.md#7-日志服务)
---
### 🔐 认证授权
**后端:**
```typescript
import { authenticate, getUserId } from '../../../common/auth';
// 路由
fastify.get('/api', { preHandler: [authenticate] }, handler);
// 控制器
const userId = getUserId(request);
```
**前端:**
```typescript
import { getAccessToken } from '@/framework/auth/api';
const token = getAccessToken();
// 或使用 apiClient自动携带token
import apiClient from '@/common/api/axios';
await apiClient.get('/api/xxx');
```
📚 [详细文档](../04-开发规范/10-模块认证规范.md)
---
### 📋 Prompt 管理
```typescript
import { PromptService } from '../../../common/prompt/prompt.service';
const promptService = new PromptService();
const prompt = await promptService.getActivePrompt('template_code');
const rendered = promptService.renderPrompt(template, variables);
```
📚 [详细文档](./00-通用能力层清单.md#11-prompt-管理系统)
---
## 🏗️ 架构原则
### ✅ 正确做法
```typescript
// 1. 使用通用能力,不要重复造轮子
import { createStreamingService } from '../../../common/streaming';
// 2. 遵循云原生规范
await storage.upload(); // 不要用 fs.writeFileSync()
// 3. 使用结构化日志
logger.info('[Module] 操作', { detail }); // 不要用 console.log()
// 4. 统一认证
fastify.get('/api', { preHandler: [authenticate] });
// 5. 标准化API格式
// OpenAI Compatible, not 自定义格式
```
### ❌ 错误做法
```typescript
// 1. 自己实现已有的能力
reply.raw.write('data: ...'); // ❌ 应该用 StreamingService
// 2. 直接操作本地文件
fs.writeFileSync('/tmp/file'); // ❌ 应该用 storage
// 3. 使用 console.log
console.log('debug'); // ❌ 应该用 logger
// 4. 硬编码用户ID
const userId = 'test'; // ❌ 应该用 getUserId(request)
// 5. 自定义格式
{ type: 'delta', content: 'xxx' } // ❌ 应该用 OpenAI Compatible
```
---
## 📚 完整文档
- [通用能力层清单(完整版)](./00-通用能力层清单.md)
- [云原生开发规范](../04-开发规范/08-云原生开发规范.md)
- [模块认证规范](../04-开发规范/10-模块认证规范.md)
- [数据库开发规范](../04-开发规范/09-数据库开发规范.md)
---
**更新时间:** 2026-01-14