# 第八阶段：AI 底座与教师端对话

状态：基础包和边界已引入，业务接口待实现。

## 使用场景

### 租户教师 AI 对话

- 教师在租户后台发起对话。
- AI 根据当前租户 Provider 配置调用模型。
- 对话历史按租户和教师隔离保存。
- 后续预留 function calling，但只能调用受审计的后端业务函数。
- function 有写操作时必须复用 RBAC、DataScope、Tenant Scope 和 AuditLog。

### AI 审核题目反馈

- 输入：题目反馈、题目摘要、反馈类型、提交用户上下文摘要。
- 输出：审核建议、风险等级、归类标签、是否建议人工复核。
- 不做 function calling。
- 不直接修改题目、反馈状态或用户数据。

## 存储模型

不要把 Semantic Kernel 的 `ChatHistory`、`ChatMessageContent`、`KernelContent`、tool call object graph 或 provider 原始 response 作为 EF Core 持久化模型。

数据库保存 provider-neutral 消息：

- `AiConversation`：租户、教师、标题、场景、Provider、模型、状态、metadata。
- `AiConversationMessage`：租户、会话、序号、role、文本、tool call id/name/arguments/result summary、token、metadata。
- `AiToolCallLog`：租户、会话、消息、函数名、输入摘要、结果、耗时、错误码。
- `AiFeedbackReview`：租户、题目反馈、建议、风险、标签、人工复核标记、metadata。

运行时由 Infrastructure adapter 把规范化消息转换为 SK / OpenAI-compatible 请求。DeepSeek 等 provider 只接收目标接口允许的 `role`、`content`、`tool_calls`、`tool_call_id` 字段；SK metadata 不得原样回放给模型 API。

## Provider 与密钥边界

- AI Provider 使用 `TenantExternalProvider(capability=ai)`。
- 租户 API Key 存 `TenantSecret`，通过 `SecretRef` 关联。
- `ConfigPublic` 只允许 provider、model、endpoint、deployment、temperature、max token 等公开配置。
- `ConfigPublic` 禁止 `secret`、`token`、`apiKey`、`key`、`privateKey` 等敏感字段。
- `Microsoft.SemanticKernel` 只引用在 `Tiku.Infrastructure`。
- `Tiku.Api`、`Tiku.Application`、`Tiku.Domain` 不直接引用 Semantic Kernel namespace。

## 第一批接口

- `POST /api/tenant-admin/ai/conversations`
- `GET /api/tenant-admin/ai/conversations`
- `GET /api/tenant-admin/ai/conversations/{conversationId}`
- `POST /api/tenant-admin/ai/conversations/{conversationId}/messages`
- `POST /api/tenant-admin/ai/question-feedback/review`

第一批先接 fake/local AI provider 跑通对话、日志和隔离，再接真实模型。

## 暂不做

- 学生端 AI。
- 复杂 RAG。
- 自动改题或自动发布题目。
- 自动处理反馈状态。
- 让客户端指定任意 function call。
- 明文 API Key 配置。
