Упростить фронтенд сохранённых сессий ассистента

This commit is contained in:
2026-05-26 00:54:18 +03:00
parent 43ae3237ce
commit a14eee4976
6 changed files with 62 additions and 212 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -4,7 +4,7 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>NDC AI Normalizer Playground</title>
<script type="module" crossorigin src="/assets/index-BdTHVNKv.js"></script>
<script type="module" crossorigin src="/assets/index-B26u5hxP.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-D-Jp8Dx0.css">
</head>
<body>
-36
View File
@@ -312,7 +312,6 @@ export const apiClient = {
async sendAssistantMessage(input: {
connection: ConnectionState;
prompts: PromptState;
userMessage: string;
sessionId?: string;
promptVersion?: string;
@@ -336,10 +335,6 @@ export const apiClient = {
temperature: input.connection.temperature,
maxOutputTokens: input.connection.maxOutputTokens,
promptVersion: input.promptVersion ?? "address_query_runtime_v1",
systemPrompt: input.prompts.systemPrompt,
developerPrompt: input.prompts.developerPrompt,
domainPrompt: input.prompts.domainPrompt,
fewShotExamples: input.prompts.fewShotExamples,
context: {
period_hint: input.context?.periodHint ?? "",
business_context: input.context?.businessContext ?? ""
@@ -362,7 +357,6 @@ export const apiClient = {
model?: string;
assistant_prompt_version?: string;
decomposition_prompt_version?: string;
prompt_fingerprint?: string;
};
}): Promise<{ ok: boolean; generation: AutoGenHistoryRecord }> {
return request("/autoruns/autogen/save-assistant-session", {
@@ -534,35 +528,5 @@ export const apiClient = {
return request(`/autoruns/autogen/history/${encodeURIComponent(generationId)}`, {
method: "DELETE"
});
},
async generateAutoRunQuestions(input: {
mode: AutoGenMode;
count: number;
domain?: string;
persist_to_eval_cases?: boolean;
generated_by?: string;
llm?: {
llm_provider?: "openai" | "local";
api_key?: string;
model?: string;
base_url?: string;
temperature?: number;
max_output_tokens?: number;
};
context?: {
llm_provider?: string;
model?: string;
assistant_prompt_version?: string;
decomposition_prompt_version?: string;
prompt_fingerprint?: string;
autogen_personality_id?: string;
autogen_personality_prompt?: string;
};
}): Promise<{ ok: boolean; generation: AutoGenHistoryRecord }> {
return request("/autoruns/autogen/generate", {
method: "POST",
body: JSON.stringify(input)
});
}
};
@@ -244,7 +244,7 @@ type UnifiedCommentListItem =
};
const DEFAULT_AUTOGEN_SETTINGS: AutoGenSettingsState = {
mode: "codex_creative",
mode: "saved_user_sessions",
count: 24,
personalityId: "general",
personalityPrompts: buildDefaultPersonalityPrompts(),
@@ -723,7 +723,6 @@ export function AutoRunsHistoryPanel({
const [dragOverQuestionIndex, setDragOverQuestionIndex] = useState<number | null>(null);
const [activeAsyncJob, setActiveAsyncJob] = useState<AsyncEvalRunJob | null>(null);
const [postAnalysis, setPostAnalysis] = useState<AutoRunPostAnalysisResponse | null>(null);
const [autoGenBusy, setAutoGenBusy] = useState(false);
const [autogenRunBusy, setAutogenRunBusy] = useState(false);
const [postAnalysisBusy, setPostAnalysisBusy] = useState(false);
const [autogenHistoryBusy, setAutogenHistoryBusy] = useState(false);
@@ -801,10 +800,6 @@ export function AutoRunsHistoryPanel({
const asyncJobPollTimerRef = useRef<number | null>(null);
const questionEditorRef = useRef<HTMLInputElement | null>(null);
const isSavedUserSessionsMode = autoGenSettings.mode === "saved_user_sessions";
const selectedPersonality = useMemo(
() => autogenPersonalities.find((item) => item.id === autoGenSettings.personalityId) ?? autogenPersonalities[0] ?? AUTOGEN_PERSONALITIES[0],
[autoGenSettings.personalityId, autogenPersonalities]
);
const visibleAutoGenHistory = useMemo(
() => autoGenHistory.filter((item) => item.mode === autoGenSettings.mode),
[autoGenHistory, autoGenSettings.mode]
@@ -1104,7 +1099,6 @@ export function AutoRunsHistoryPanel({
try {
const response = await apiClient.sendAssistantMessage({
connection,
prompts,
userMessage,
sessionId: assistantLiveSessionId || undefined,
promptVersion: assistantPromptVersion,
@@ -1132,8 +1126,7 @@ export function AutoRunsHistoryPanel({
assistantPromptVersion,
connection,
loadAssistantLiveAnnotationsForSession,
log,
prompts
log
]);
const openAssistantLiveSaveModal = useCallback(() => {
@@ -1164,13 +1157,6 @@ export function AutoRunsHistoryPanel({
setAssistantLiveSaveModal((prev) => ({ ...prev, saving: true, error: "" }));
try {
const promptFingerprint = [
prompts.systemPrompt,
prompts.developerPrompt,
prompts.domainPrompt,
prompts.schemaNotes,
prompts.fewShotExamples
].join("||");
const payload = await apiClient.saveAutoRunAssistantSession({
session_id: sessionId,
title,
@@ -1179,8 +1165,7 @@ export function AutoRunsHistoryPanel({
llm_provider: connection.llmProvider,
model: connection.model,
assistant_prompt_version: assistantPromptVersion,
decomposition_prompt_version: decompositionPromptVersion,
prompt_fingerprint: promptFingerprint
decomposition_prompt_version: decompositionPromptVersion
}
});
setAutoGenHistory((prev) => [payload.generation, ...prev.filter((item) => item.generation_id !== payload.generation.generation_id)]);
@@ -1202,12 +1187,7 @@ export function AutoRunsHistoryPanel({
connection.llmProvider,
connection.model,
decompositionPromptVersion,
log,
prompts.developerPrompt,
prompts.domainPrompt,
prompts.fewShotExamples,
prompts.schemaNotes,
prompts.systemPrompt
log
]);
const commitLimitInput = useCallback(
@@ -1363,87 +1343,6 @@ export function AutoRunsHistoryPanel({
}
}, [filters.fromLocal, filters.mode, filters.promptContains, filters.target, filters.toLocal, filters.useMock, log, selectedRunId]);
const generateAutogenBatch = useCallback(async () => {
setAutoGenBusy(true);
setErrorText("");
try {
if (autoGenSettings.mode === "saved_user_sessions") {
throw new Error("Пользовательские сессии сохраняются из живого чата, а не генерируются автоматически.");
}
const activePersonalityPrompt = autoGenSettings.personalityPrompts[autoGenSettings.personalityId] ?? "";
const promptFingerprint = [
prompts.systemPrompt,
prompts.developerPrompt,
prompts.domainPrompt,
prompts.schemaNotes,
prompts.fewShotExamples
]
.join("\n")
.slice(0, 900);
const payload = await apiClient.generateAutoRunQuestions({
mode: autoGenSettings.mode,
count: autoGenSettings.count,
domain: selectedPersonality.domain || undefined,
persist_to_eval_cases: autoGenSettings.persistToEvalCases,
generated_by: autoGenSettings.generatedBy.trim() || undefined,
llm: {
llm_provider: connection.llmProvider,
api_key: connection.apiKey,
model: connection.model,
base_url: connection.baseUrl,
temperature: connection.temperature,
max_output_tokens: connection.maxOutputTokens
},
context: {
llm_provider: connection.llmProvider,
model: connection.model,
assistant_prompt_version: assistantPromptVersion,
decomposition_prompt_version: decompositionPromptVersion,
prompt_fingerprint: promptFingerprint,
autogen_personality_id: selectedPersonality.id,
autogen_personality_prompt: activePersonalityPrompt.trim() || undefined
}
});
log(
`Generated ${payload.generation.count} questions (${payload.generation.mode}) id=${payload.generation.generation_id}` +
(payload.generation.saved_case_set_file ? ` saved=${payload.generation.saved_case_set_file}` : "")
);
setSelectedAutogenGenerationId(payload.generation.generation_id);
setEditableGeneratedQuestions([...(payload.generation.questions ?? [])]);
await loadAutoGenHistory();
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
setErrorText(`Автогенерация: ${message}`);
log(`Autogen generate error: ${message}`);
} finally {
setAutoGenBusy(false);
}
}, [
assistantPromptVersion,
autoGenSettings.count,
autoGenSettings.generatedBy,
autoGenSettings.mode,
autoGenSettings.personalityId,
autoGenSettings.personalityPrompts,
autoGenSettings.persistToEvalCases,
connection.apiKey,
connection.baseUrl,
connection.llmProvider,
connection.maxOutputTokens,
connection.model,
connection.temperature,
decompositionPromptVersion,
loadAutoGenHistory,
log,
prompts.developerPrompt,
prompts.domainPrompt,
prompts.fewShotExamples,
prompts.schemaNotes,
prompts.systemPrompt,
selectedPersonality.domain,
selectedPersonality.id
]);
const loadCaseDialog = useCallback(
async (runId: string, caseId: string) => {
if (isLiveRunId(runId)) {
@@ -2477,12 +2376,7 @@ export function AutoRunsHistoryPanel({
: prev.personalityId;
return {
...prev,
mode:
parsed.autoGenSettings?.mode === "codex_creative" ||
parsed.autoGenSettings?.mode === "qwen_seed" ||
parsed.autoGenSettings?.mode === "saved_user_sessions"
? parsed.autoGenSettings.mode
: prev.mode,
mode: "saved_user_sessions",
count:
typeof parsed.autoGenSettings?.count === "number"
? Math.max(1, Math.min(200, parsed.autoGenSettings.count))
@@ -2767,7 +2661,7 @@ export function AutoRunsHistoryPanel({
) : null}
<div className="autoruns-group-heading">
<h4>Автопрогоны</h4>
<h4>Сохранённые сессии</h4>
<button
type="button"
className="autoruns-group-toggle"
@@ -2782,13 +2676,12 @@ export function AutoRunsHistoryPanel({
<>
<div className="autoruns-form-grid">
<label>
Режимы
Режим
<select
value={autoGenSettings.mode}
disabled
onChange={(event) => setAutoGenSettings((prev) => ({ ...prev, mode: event.target.value as AutoGenMode }))}
>
<option value="codex_creative">codex_creative</option>
<option value="qwen_seed">qwen_seed</option>
<option value="saved_user_sessions">Пользовательские сессии</option>
</select>
</label>
@@ -2892,20 +2785,13 @@ export function AutoRunsHistoryPanel({
) : null}
<div className="button-row">
{!isSavedUserSessionsMode ? (
<>
<button type="button" disabled={autoGenBusy} onClick={() => void generateAutogenBatch()}>
{autoGenBusy ? "Генерирую..." : "Сгенерировать пачку"}
</button>
<button type="button" className="tab" disabled={autogenHistoryBusy} onClick={() => void loadAutoGenHistory()}>
{autogenHistoryBusy ? "Обновляю..." : "Обновить историю"}
</button>
</>
) : null}
{!isSavedUserSessionsMode ? (
<button
type="button"
className="autoruns-run-launch-btn"
style={isSavedUserSessionsMode ? { display: "none" } : undefined}
disabled={
autogenStopBusy ||
(!autogenRunBusy && (editableGeneratedQuestions.length === 0 || !selectedAutogenGeneration))
@@ -2914,6 +2800,7 @@ export function AutoRunsHistoryPanel({
>
{autogenRunBusy ? (autogenStopBusy ? "Останавливаю..." : "Остановить прогон") : "Запустить прогон"}
</button>
) : null}
</div>
<div className="autoruns-form-grid">
@@ -111,8 +111,8 @@ export function PromptPanel({
<section className="embedded-panel-section">
<div className="embedded-panel-section-header">
<div>
<h4>Prompt Manager</h4>
<p>Системный, developer и domain уровни управляются отдельно.</p>
<h4>Normalizer / eval prompts</h4>
<p>Эти поля управляют декомпозицией и eval-прогонами, а не live-ответом ассистента.</p>
</div>
</div>
{content}
@@ -121,7 +121,7 @@ export function PromptPanel({
}
return (
<PanelFrame title="Prompt Manager" subtitle="Системный, developer и domain уровни управляются отдельно.">
<PanelFrame title="Normalizer / eval prompts" subtitle="Эти поля управляют декомпозицией и eval-прогонами, а не live-ответом ассистента.">
{content}
</PanelFrame>
);