feat: align agent preview user context

This commit is contained in:
2026-07-31 15:48:40 +08:00
parent 3e60a6da42
commit 79094d0832
6 changed files with 168 additions and 3 deletions

View File

@@ -3,7 +3,7 @@ import { ElMessage, ElMessageBox } from "element-plus";
import { computed, nextTick, onMounted, reactive, ref, watch } from "vue";
import { api, streamDebugAgent } from "../services/api";
import type { AgentRuntimeConfig, KnowledgeItem, ModelItem, PromptDetail, PromptHistoryItem } from "../types/api";
import type { AdminUser, AgentRuntimeConfig, KnowledgeItem, ModelItem, PromptDetail, PromptHistoryItem } from "../types/api";
import AgentGenerationParameters from "./AgentGenerationParameters.vue";
import AgentResponseDepthControl from "./AgentResponseDepthControl.vue";
import AdminPagination from "./AdminPagination.vue";
@@ -25,6 +25,8 @@ const promptContent = ref("");
const savedPromptContent = ref("");
const models = ref<ModelItem[]>([]);
const knowledge = ref<KnowledgeItem[]>([]);
const debugUsers = ref<AdminUser[]>([]);
const debugUserLoading = ref(false);
const history = ref<PromptHistoryItem[]>([]);
const historyPager = reactive({ page: 1, pageSize: 10, total: 0 });
const historyDetailOpen = ref(false);
@@ -43,6 +45,7 @@ const agentPreviewMessages = ref<{
const agentForm = reactive({
modelId: undefined as number | undefined,
userId: undefined as number | undefined,
knowledgeIds: [] as number[],
temperature: 0.2 as number | null,
topP: null as number | null,
@@ -80,6 +83,11 @@ const selectedKnowledgeSummary = computed(() => {
}
return `${agentForm.knowledgeIds.length} 个知识库`;
});
const selectedDebugUserLabel = computed(() => {
if (!agentForm.userId) return "未模拟学员";
const user = debugUsers.value.find((item) => item.id === agentForm.userId);
return user ? `${user.name || user.nickname || user.phone} · #${user.id}` : `学员 #${agentForm.userId}`;
});
onMounted(load);
@@ -103,6 +111,7 @@ async function load() {
.filter((item) => item.status === 1 && item.lifecycleStatus === "active")
.map((item) => item.id);
if (props.previewKnowledgeId) applyPreviewKnowledge(props.previewKnowledgeId);
void searchDebugUsers("");
await loadHistory();
} catch (error) {
ElMessage.error(errorMessage(error, "Agent 配置加载失败"));
@@ -111,6 +120,18 @@ async function load() {
}
}
async function searchDebugUsers(keyword: string) {
debugUserLoading.value = true;
try {
const result = await api.users({ keyword, page: 1, pageSize: 20 });
debugUsers.value = result.items;
} catch {
debugUsers.value = [];
} finally {
debugUserLoading.value = false;
}
}
function applyRuntimeConfig(value: AgentRuntimeConfig) {
runtimeConfig.value = value;
Object.assign(runtimeForm, {
@@ -299,6 +320,7 @@ async function debugAgent() {
{
promptContent: promptContent.value,
modelId: agentForm.modelId,
userId: agentForm.userId || null,
knowledgeIds: agentForm.knowledgeIds,
question,
history: conversationHistory,
@@ -473,6 +495,25 @@ function errorMessage(error: unknown, fallback: string) {
<el-option v-for="model in models" :key="model.id" :label="model.displayName || model.modelName" :value="model.id" />
</el-select>
</el-form-item>
<el-form-item label="模拟学员(可选)">
<el-select
v-model="agentForm.userId"
clearable
filterable
remote
:remote-method="searchDebugUsers"
:loading="debugUserLoading"
placeholder="不选择则不注入学员权益和成长档案"
>
<el-option
v-for="user in debugUsers"
:key="user.id"
:label="`${user.name || user.nickname || user.phone} · ${user.phone} · #${user.id}`"
:value="user.id"
/>
</el-select>
<div class="agent-form-help">用于让后台预览加载该学员的权益主题额度和长期成长档案不会消耗额度也不会影响正式会话</div>
</el-form-item>
<el-form-item label="调试知识库">
<el-select v-model="agentForm.knowledgeIds" class="debug-knowledge-select" multiple filterable collapse-tags collapse-tags-tooltip :max-collapse-tags="2" popper-class="debug-knowledge-popper" placeholder="默认使用全部已开放知识库">
<el-option v-for="item in knowledge" :key="item.id" :label="`${item.name}${item.status === 0 ? ' · 已关闭(仅本次预览)' : ''}`" :value="item.id" />
@@ -546,7 +587,7 @@ function errorMessage(error: unknown, fallback: string) {
<aside class="agent-preview-panel">
<div class="agent-preview-head">
<div><h3>调试预览</h3><small>{{ selectedKnowledgeSummary }}</small></div>
<div><h3>调试预览</h3><small>{{ selectedKnowledgeSummary }} · {{ selectedDebugUserLabel }}</small></div>
<div class="agent-preview-head-actions"><span>{{ selectedModelName }}</span><el-button link :disabled="agentDebugging" @click="clearAgentPreview">清空</el-button></div>
</div>
<div ref="agentPreviewChat" class="agent-preview-chat">