ceo-api/src/ai-gateway/types.ts
valentinbvro 3bc0d65c46 feat: AI Gateway -- Context Manifest, model routing, cost audit, guardrails
- 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.
2026-07-28 22:34:36 +02:00

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;
}