- AiGatewayService: punct unic de acces la modele (LiteLLM -> OpenRouter). Clasele de actiuni din blueprint 14.3 sunt aplicate hard: high_risk blocat permanent, material blocat pana exista coada de aprobare + idempotency; doar read_only si draft ruleaza. - Spotlighting (design doc Strat 1): continutul untrusted (date Apollo) e impachetat in <untrusted-data> cu instructiune de sistem ca e DATE, nu comenzi -- plus redactie PII deterministica (email/telefon/CNP) inainte sa plece catre provider extern. - ai_requests: adaugat action_class + context_manifest complet (nu doar hash) pentru audit; cost_usd_minor_units (integer) inlocuit cu cost_usd numeric(12,6) -- costurile reale sunt fractiuni de cent. - research-briefs: POST /draft genereaza un rezumat AI din datele Apollo fara sa salveze nimic (clasa draft -- userul revizuieste, apoi salveaza). - briefing: aiExplanation devine narativ real peste prioritizarea determinista; esecul AI intoarce null, nu strica briefingul. - teste: clase de actiuni blocate, spotlighting, redactie PII.
53 lines
1.7 KiB
TypeScript
53 lines
1.7 KiB
TypeScript
// Blueprint 14.3: clasele de actiuni AI. read_only ruleaza automat cu audit;
|
|
// draft se intoarce userului pentru revizuire inainte sa fie persistat oriunde;
|
|
// material/high_risk raman blocate pana exista coada de aprobare + idempotency
|
|
// (nu construite inca -- vezi AiGatewayService.complete).
|
|
export type ActionClass = 'read_only' | 'draft' | 'material' | 'high_risk';
|
|
|
|
// Subset din logical models configurate in LiteLLM (blueprint 4.1 din design doc:
|
|
// "niciun serviciu nu cunoaste providerul" -- numele astea sunt mapari, nu id-uri
|
|
// reale de model). Cheia LiteLLM a ceo-api e restrictionata explicit la aceste 4.
|
|
export type LogicalModel =
|
|
| 'openrouter-claude-sonnet-5'
|
|
| 'openrouter-gpt-5'
|
|
| 'openrouter-gemini-2.5-pro'
|
|
| 'gpt-4o-mini';
|
|
|
|
// Blueprint 14.1 Context Manifest -- "cine este agentul in aceasta sesiune".
|
|
export interface ContextManifest {
|
|
purpose: string;
|
|
allowedCategories: string[];
|
|
deniedCategories: string[];
|
|
actionClass: ActionClass;
|
|
maxCostUsd: number;
|
|
expiresAt: string;
|
|
}
|
|
|
|
export interface UntrustedBlock {
|
|
label: string;
|
|
content: string;
|
|
}
|
|
|
|
export interface CompleteParams {
|
|
tenantId: string;
|
|
requestedByUserId: string;
|
|
purpose: string;
|
|
actionClass: ActionClass;
|
|
allowedCategories: string[];
|
|
deniedCategories?: string[];
|
|
model: LogicalModel;
|
|
templateVersion: string;
|
|
systemPrompt: string;
|
|
userPrompt: string;
|
|
/** Continut care nu vine direct de la user (date Apollo, OCR etc) -- impachetat
|
|
* cu delimitatori (spotlighting, design doc Strat 1) inainte sa intre in context. */
|
|
untrustedBlocks?: UntrustedBlock[];
|
|
maxCostUsd?: number;
|
|
}
|
|
|
|
export interface CompleteResult {
|
|
requestId: string;
|
|
content: string;
|
|
costUsd: number;
|
|
model: string;
|
|
}
|