# 提示词模板管理 API 文档 > 供前端对接使用 | 更新时间:2025-11-27 ## 概述 提示词模板管理模块提供对 `prompt_templates` 表的完整 CRUD 操作,用于管理 LLM/VLM 抽取、评查、摘要等场景的提示词模板。 **基础路径**: `/api/v3/prompt-templates` **认证方式**: Bearer Token (JWT) --- ## 快速开始 ### 典型前端页面流程 ``` 1. 页面加载 → 调用 GET /types 获取类型列表(用于筛选下拉框) 2. 列表展示 → 调用 GET / 获取模板列表(支持分页、筛选、搜索) 3. 查看详情 → 调用 GET /{id} 获取完整模板内容 4. 编辑保存 → 调用 PUT /{id} 更新模板 5. 创建模板 → 调用 POST / 或 POST /{id}/duplicate 复制 6. 删除模板 → 调用 DELETE /{id} ``` --- ## 字段说明 ### template_type(模板类型) 用于标识模板的业务用途类别,支持按类型筛选。 | 值 | 显示名称 | 说明 | |---|---|---| | `LLM_Extraction` | LLM抽取 | LLM文档内容抽取 | | `VLM_Extraction` | VLM抽取 | VLM图像识别抽取 | | `Summary` | 摘要生成 | 文档摘要生成 | | `Evaluation` | 评查 | 评查规则判断 | | `Directory_Extraction` | 目录抽取 | 卷宗目录提取 | | `CaseNum_Extraction` | 案号抽取 | 案件编号提取 | | `Contract_Directory_Extraction` | 合同目录抽取 | 合同目录提取 | | `Contract_Number` | 合同编号抽取 | 合同编号提取 | | `Contract_Compare` | 合同比对 | 合同差异比对 | | `Parties_Extraction` | 当事人抽取 | 当事人信息提取 | | `Common` | 通用 | 通用模板 | ### template_code(模板代码) 模板的**唯一标识符**,用于在配置中引用模板。 - 格式要求:英文字母、数字、下划线,最大50字符 - 示例:`vlm_default_prompt`, `llm_general_extract`, `vlm_currency_prompt` ### status(状态) | 值 | 说明 | 前端显示建议 | |---|---|---| | `0` | 停用 | 灰色标签 "停用" | | `1` | 启用 | 绿色标签 "启用" | | `2` | 系统预设 | 蓝色标签 "系统" + 禁用编辑/删除按钮 | ### variables(变量定义) 定义模板中可替换的变量,格式为 JSON 对象。 ```json { "doc_name": "文档名称", "json_template": "JSON输出模板", "field_list": "字段列表" } ``` 模板内容中使用 `{变量名}` 引用变量,如:`请分析{doc_name}中的内容...` --- ## API 接口详细 ### 1. 获取模板列表 用于列表页展示,支持分页、筛选、搜索。 **请求** ```http GET /api/v3/prompt-templates?page=1&page_size=20&template_type=VLM_Extraction&status=1&search=通用 Authorization: Bearer {token} ``` **查询参数** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | page | int | 否 | 1 | 页码,从1开始 | | page_size | int | 否 | 20 | 每页数量,最大100 | | template_type | string | 否 | - | 模板类型筛选 | | status | int | 否 | - | 状态筛选(0/1/2) | | search | string | 否 | - | 模糊搜索(匹配名称或代码) | **响应** ```json { "code": 200, "message": "success", "data": { "total": 25, "page": 1, "page_size": 20, "items": [ { "id": 7, "template_name": "VLM通用卷宗抽取Prompt", "template_code": "vlm_default_prompt", "template_type": "VLM_Extraction", "description": "通用VLM图像抽取模板", "template_abbreviation": null, "status": 1, "created_by": 1, "created_at": "2025-01-15T10:30:00", "updated_at": "2025-01-20T14:20:00" } ] } } ``` **前端表格列建议** | 列名 | 字段 | 宽度 | 说明 | |------|------|------|------| | ID | id | 80px | 可排序 | | 模板名称 | template_name | 200px | 可搜索 | | 模板代码 | template_code | 180px | 可复制 | | 类型 | template_type | 120px | 显示为标签 | | 状态 | status | 80px | 显示为标签 | | 更新时间 | updated_at | 160px | 格式化显示 | | 操作 | - | 150px | 查看/编辑/复制/删除 | **权限要求**: `prompt_template:list:read` --- ### 2. 获取模板类型列表 用于筛选下拉框,返回所有类型及其数量。 **请求** ```http GET /api/v3/prompt-templates/types Authorization: Bearer {token} ``` **响应** ```json { "code": 200, "message": "success", "data": { "items": [ {"value": "VLM_Extraction", "label": "VLM抽取", "count": 8}, {"value": "LLM_Extraction", "label": "LLM抽取", "count": 5}, {"value": "Summary", "label": "摘要生成", "count": 2}, {"value": "Evaluation", "label": "评查", "count": 2} ] } } ``` **前端下拉框渲染** ```jsx // 示例:Ant Design Select ``` **权限要求**: `prompt_template:list:read` --- ### 3. 获取模板详情 用于查看/编辑页面,返回完整模板内容。 **请求** ```http GET /api/v3/prompt-templates/{template_id} Authorization: Bearer {token} ``` **响应** ```json { "code": 200, "message": "success", "data": { "id": 7, "template_name": "VLM通用卷宗抽取Prompt", "template_code": "vlm_default_prompt", "template_type": "VLM_Extraction", "template_content": "请分析以下图片内容,按照指定的JSON格式提取{doc_name}的信息...", "description": "通用VLM图像抽取模板", "template_abbreviation": null, "variables": { "doc_name": "文档名称", "json_template": "JSON模板" }, "status": 1, "is_active": true, "created_by": 1, "created_at": "2025-01-15T10:30:00", "updated_at": "2025-01-20T14:20:00" } } ``` **权限要求**: `prompt_template:detail:read` --- ### 4. 通过代码获取模板 用于通过 `template_code` 获取模板(配置引用时使用)。 **请求** ```http GET /api/v3/prompt-templates/code/{template_code} Authorization: Bearer {token} ``` **示例** ```http GET /api/v3/prompt-templates/code/vlm_default_prompt ``` **响应** 同"获取模板详情" **权限要求**: `prompt_template:detail:read` --- ### 5. 创建模板 **请求** ```http POST /api/v3/prompt-templates Authorization: Bearer {token} Content-Type: application/json ``` **请求体** ```json { "template_name": "自定义VLM抽取模板", "template_code": "custom_vlm_extract", "template_type": "VLM_Extraction", "template_content": "请分析图片中的{doc_name},提取以下信息:\n{json_template}", "description": "针对特定场景优化的VLM抽取模板", "template_abbreviation": "自定义VLM", "variables": { "doc_name": "文档名称", "json_template": "JSON模板结构" }, "status": 1 } ``` **字段说明** | 字段 | 类型 | 必填 | 最大长度 | 说明 | |------|------|------|----------|------| | template_name | string | ✅ | 255 | 模板名称 | | template_code | string | ✅ | 50 | 模板代码(唯一) | | template_type | string | ✅ | 50 | 模板类型 | | template_content | string | ✅ | - | 模板内容(prompt文本) | | description | string | ❌ | - | 模板描述 | | template_abbreviation | string | ❌ | 100 | 模板简称 | | variables | object | ❌ | - | 变量定义 | | status | int | ❌ | - | 状态,默认1(启用) | **响应** ```json { "code": 200, "message": "success", "data": { "id": 73, "template_name": "自定义VLM抽取模板", "template_code": "custom_vlm_extract", "template_type": "VLM_Extraction", "status": 1, "created_at": "2025-11-26T10:00:00" } } ``` **错误情况** | 错误 | HTTP状态码 | message | |------|------------|---------| | 模板代码已存在 | 400 | 模板代码已存在: xxx | | 缺少必填字段 | 422 | field required | **权限要求**: `prompt_template:create:write` --- ### 6. 更新模板 **请求** ```http PUT /api/v3/prompt-templates/{template_id} Authorization: Bearer {token} Content-Type: application/json ``` **请求体**(所有字段可选,只传需要更新的字段) ```json { "template_name": "更新后的模板名称", "template_content": "更新后的模板内容...", "description": "更新后的描述", "status": 0 } ``` **响应** ```json { "code": 200, "message": "success", "data": { "id": 73, "template_name": "更新后的模板名称", "template_code": "custom_vlm_extract", "status": 0, "updated_at": "2025-11-26T11:00:00" } } ``` **注意事项** - ⚠️ 系统预设模板(status=2)**不可修改**,会返回403错误 - 修改 `template_code` 时会检查唯一性 - 不能将普通模板的 status 改为 2(系统预设) **权限要求**: `prompt_template:update:write` --- ### 7. 删除模板 **请求** ```http DELETE /api/v3/prompt-templates/{template_id} Authorization: Bearer {token} ``` **响应** ```json { "code": 200, "message": "success", "data": { "message": "提示词模板删除成功: 自定义VLM抽取模板" } } ``` **注意事项** - ⚠️ 系统预设模板(status=2)**不可删除**,会返回403错误 - 建议删除前显示确认对话框 **权限要求**: `prompt_template:delete:delete` --- ### 8. 复制模板 快速基于现有模板创建副本。 **请求** ```http POST /api/v3/prompt-templates/{template_id}/duplicate?new_code=my_custom_code Authorization: Bearer {token} ``` **查询参数** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | new_code | string | 否 | 新模板代码,不填则自动生成 `{原代码}_copy` | **响应** ```json { "code": 200, "message": "success", "data": { "id": 74, "template_name": "VLM通用卷宗抽取Prompt (副本)", "template_code": "vlm_default_prompt_copy", "template_type": "VLM_Extraction", "status": 1, "created_at": "2025-11-26T10:30:00" } } ``` **权限要求**: `prompt_template:create:write` --- ## 错误码汇总 | HTTP状态码 | 说明 | 处理建议 | |------------|------|----------| | 400 | 请求参数错误 | 检查请求参数格式 | | 401 | 未认证或Token无效 | 重新登录获取Token | | 403 | 权限不足或操作系统预设模板 | 检查用户权限/提示不可操作 | | 404 | 模板不存在 | 刷新列表 | | 422 | 参数验证失败 | 检查必填字段 | | 500 | 服务器内部错误 | 联系管理员 | --- ## 权限配置 在 RBAC 系统中为角色分配以下权限: | 权限键 | 说明 | 建议角色 | |--------|------|----------| | `prompt_template:list:read` | 查看模板列表 | 所有用户 | | `prompt_template:detail:read` | 查看模板详情 | 所有用户 | | `prompt_template:create:write` | 创建模板 | 管理员 | | `prompt_template:update:write` | 更新模板 | 管理员 | | `prompt_template:delete:delete` | 删除模板 | 超级管理员 | --- ## 前端实现建议 ### 1. 列表页面 ```jsx // 功能点 - 顶部筛选栏:类型下拉框 + 状态下拉框 + 搜索框 - 表格展示:支持分页 - 操作列:查看、编辑、复制、删除按钮 - 系统预设模板(status=2):禁用编辑和删除按钮 ``` ### 2. 编辑/创建弹窗 ```jsx // 表单字段 - 模板名称:文本输入框(必填) - 模板代码:文本输入框(必填,创建后不建议修改) - 模板类型:下拉选择框(必填) - 模板简称:文本输入框(可选) - 状态:开关/单选框 - 模板描述:多行文本框 - 变量定义:JSON编辑器或Key-Value编辑器 - 模板内容:代码编辑器(支持语法高亮更佳) ``` ### 3. 模板内容编辑器 建议使用代码编辑器组件(如 Monaco Editor、CodeMirror),支持: - 语法高亮 - 变量 `{xxx}` 高亮显示 - 行号显示 - 自动换行 ### 4. 状态标签样式 ```jsx const statusConfig = { 0: { color: 'default', text: '停用' }, 1: { color: 'success', text: '启用' }, 2: { color: 'processing', text: '系统预设' } }; ``` --- ## TypeScript 类型定义 ```typescript // 模板类型 type TemplateType = | 'LLM_Extraction' | 'VLM_Extraction' | 'Summary' | 'Evaluation' | 'Directory_Extraction' | 'CaseNum_Extraction' | 'Contract_Directory_Extraction' | 'Contract_Number' | 'Contract_Compare' | 'Parties_Extraction' | 'Common'; // 模板状态 type TemplateStatus = 0 | 1 | 2; // 列表项 interface PromptTemplateListItem { id: number; template_name: string; template_code: string | null; template_type: TemplateType; description: string | null; template_abbreviation: string | null; status: TemplateStatus; created_by: number | null; created_at: string; updated_at: string; } // 详情 interface PromptTemplateDetail extends PromptTemplateListItem { template_content: string; variables: Record | null; is_active: boolean; } // 创建请求 interface PromptTemplateCreate { template_name: string; template_code: string; template_type: TemplateType; template_content: string; description?: string; template_abbreviation?: string; variables?: Record; status?: TemplateStatus; } // 更新请求 interface PromptTemplateUpdate { template_name?: string; template_code?: string; template_type?: TemplateType; template_content?: string; description?: string; template_abbreviation?: string; variables?: Record; status?: TemplateStatus; } // 列表响应 interface PromptTemplateListResponse { total: number; page: number; page_size: number; items: PromptTemplateListItem[]; } // 类型列表项 interface TemplateTypeItem { value: TemplateType; label: string; count: number; } ``` --- ## 相关文件 | 文件 | 说明 | |------|------| | `app/routes/v3/prompt_templates.py` | API路由定义 | | `app/services/prompt_template_service.py` | 业务服务层 | | `app/schemas/prompt_template.py` | Pydantic数据模型 | | `prompt_templates` 表 | 数据库表 |