Упростить фронтенд сохранённых сессий ассистента
This commit is contained in:
parent
43ae3237ce
commit
a14eee4976
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
);
|
||||
|
|
|
|||
Loading…
Reference in New Issue