livrare lot 2
This commit is contained in:
commit
8ecc78e729
763 changed files with 164593 additions and 0 deletions
|
|
@ -0,0 +1,84 @@
|
|||
/**
|
||||
* Helpers for building + persisting a minimal AnalysisSession when a single
|
||||
* component runs standalone (i.e. /techniques/analyze, not /pipeline/analyze).
|
||||
*
|
||||
* Replaces old saveAndSyncComponent + syncToPostgres flow.
|
||||
*/
|
||||
import type { AnalysisSession, InputType } from '../../shared/types/analysis-session';
|
||||
import { log } from '../../shared/logger';
|
||||
import { getPersistServiceInstance } from '../_init';
|
||||
|
||||
interface BuildOpts {
|
||||
sessionId: string;
|
||||
userId?: string;
|
||||
userEmail?: string;
|
||||
inputType: InputType;
|
||||
inputText?: string;
|
||||
inputUrl?: string;
|
||||
mediaUrl?: string;
|
||||
result: any;
|
||||
/** 'techniques' | 'ai_tampered' | 'claims' | 'source_assessment'. Defaults to 'techniques'. */
|
||||
component?: string;
|
||||
durationMs: number;
|
||||
llmUsage?: any[];
|
||||
}
|
||||
|
||||
export function buildStandaloneSession(opts: BuildOpts): AnalysisSession {
|
||||
const now = new Date().toISOString();
|
||||
const comp = opts.component || 'techniques';
|
||||
let llm_usage = null;
|
||||
if (opts.llmUsage && opts.llmUsage.length > 0) {
|
||||
const summary = { calls: opts.llmUsage.length, prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 };
|
||||
for (const e of opts.llmUsage) {
|
||||
summary.prompt_tokens += e.prompt_tokens;
|
||||
summary.completion_tokens += e.completion_tokens;
|
||||
summary.total_tokens += e.total_tokens;
|
||||
}
|
||||
llm_usage = { total: summary, by_component: { [comp]: summary } };
|
||||
}
|
||||
return {
|
||||
session_id: opts.sessionId,
|
||||
user_id: opts.userId || null,
|
||||
user_email: opts.userEmail || null,
|
||||
input_type: opts.inputType,
|
||||
input_text: opts.inputText || null,
|
||||
input_url: opts.inputUrl || null,
|
||||
input_media_url: opts.mediaUrl || null,
|
||||
input_hash: null,
|
||||
status: 'completed',
|
||||
components_run: [comp],
|
||||
components_skipped: ['ai_tampered', 'claims', 'domain', 'verdict'].filter(c => c !== comp),
|
||||
risk_score: null,
|
||||
risk_category: null,
|
||||
risk_level: null,
|
||||
confidence: null,
|
||||
confidence_level: null,
|
||||
started_at: new Date(Date.now() - opts.durationMs).toISOString(),
|
||||
completed_at: now,
|
||||
total_duration_ms: opts.durationMs,
|
||||
scenario_applied: null,
|
||||
topic_applied: null,
|
||||
source_app: 'web',
|
||||
api_version: 'v3',
|
||||
created_at: now,
|
||||
techniques: comp === 'techniques' ? opts.result : null,
|
||||
ai_tampered: comp === 'ai_tampered' ? opts.result : null,
|
||||
claims: comp === 'claims' ? opts.result : null,
|
||||
domain: null,
|
||||
source_assessment: comp === 'source_assessment' ? opts.result : null,
|
||||
verdict: null,
|
||||
llm_usage,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Fire-and-forget persist for standalone component runs.
|
||||
* Uses PersistService (Redis + PG). Logs but does not throw on failure —
|
||||
* caller has already returned a response by then.
|
||||
*/
|
||||
export function persistStandaloneResult(opts: BuildOpts, logPrefix = 'StandaloneSession'): void {
|
||||
if (!opts.userId) return;
|
||||
const session = buildStandaloneSession(opts);
|
||||
getPersistServiceInstance().persist(session)
|
||||
.catch(err => log.error(`[${logPrefix}] Persist error:`, (err as Error).message));
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue