osiris-ai-manu / src /lib /ai-engine.ts
Claude
Import upstream OSIRIS base (simplifaisoul/osiris, MIT)
35df05f unverified
Raw
History Blame Contribute Delete
11.7 kB
/**
* ═══════════════════════════════════════════════════════════════
* OSIRIS — AI Intelligence Engine
* Gemini 2.0 Flash integration for real-time intelligence analysis
* Designed to correlate multi-domain feeds into actionable briefings
* ═══════════════════════════════════════════════════════════════
*/
import { GoogleGenerativeAI, type GenerativeModel } from '@google/generative-ai';
/* ─────────────────────────────────────────────────────────────
Data Interfaces — Zero `any` types
───────────────────────────────────────────────────────────── */
export interface EarthquakeEvent {
id: string;
magnitude: number;
location: string;
latitude: number;
longitude: number;
depth: number;
timestamp: string;
tsunami: boolean;
felt: number | null;
alert: string | null;
}
export interface NewsItem {
id: string;
title: string;
description: string;
link: string;
published: string;
source: string;
risk_score: number;
coords: [number, number] | null;
machine_assessment: string | null;
}
export interface ThreatEvent {
id: string;
type: string;
title: string;
description: string;
severity: 'CRITICAL' | 'HIGH' | 'ELEVATED' | 'LOW';
region: string;
latitude: number;
longitude: number;
timestamp: string;
source: string;
}
export interface CyberAlert {
id: string;
name: string;
vendor: string;
product: string;
severity: string;
date: string;
due: string;
source: string;
}
export interface IntelligenceContext {
earthquakes: EarthquakeEvent[];
news: NewsItem[];
threats: ThreatEvent[];
cyberAlerts: CyberAlert[];
timestamp: string;
}
/* ─────────────────────────────────────────────────────────────
System Prompt — Palantir-grade analyst persona
───────────────────────────────────────────────────────────── */
const SYSTEM_PROMPT = `You are OSIRIS Intelligence Analyst — a senior, elite intelligence analyst embedded within the OSIRIS Global Intelligence Platform. You operate at the level of a Palantir Forward Deployed Engineer crossed with a CIA PDB (Presidential Daily Brief) analyst.
## YOUR ROLE
- You correlate data across multiple intelligence feeds: seismic monitoring, OSINT news streams, global threat events, and cyber vulnerability databases
- You identify non-obvious patterns, emerging threat vectors, and cascading risk scenarios
- You provide ACTIONABLE intelligence — not summaries, but assessments with confidence levels
- You think in terms of second and third-order effects
## YOUR ANALYTICAL FRAMEWORK
1. **PATTERN RECOGNITION**: Cross-reference events across feeds. A cyber attack + earthquake + political instability in the same region = elevated compound risk
2. **THREAT ASSESSMENT**: Rate threats on a CRITICAL / HIGH / ELEVATED / LOW scale with reasoning
3. **TEMPORAL ANALYSIS**: Identify acceleration patterns — are events clustering? Is frequency increasing?
4. **GEOSPATIAL CORRELATION**: Events in proximity may be related. Identify geographic hotspots
5. **CONFIDENCE LEVELS**: Always state your confidence (HIGH / MODERATE / LOW) and cite which data points support your assessment
## OUTPUT FORMAT
- Use military-style brevity when appropriate
- Structure responses with clear headers using markdown
- Lead with the most critical finding (inverted pyramid)
- Include "BOTTOM LINE UP FRONT (BLUF)" for complex analyses
- Use tactical notation: DTG (Date-Time Group), AOR (Area of Responsibility), COA (Course of Action)
- End with "ASSESSMENT CONFIDENCE" and "RECOMMENDED ACTIONS" sections when appropriate
## CONSTRAINTS
- Never fabricate data points — only analyze what is provided in the context
- If data is insufficient for a confident assessment, state so explicitly
- Distinguish between correlation and causation
- Flag when events may be connected vs. coincidental
- You are an analyst, not a policymaker — present options, not directives
You have access to the live intelligence context of the OSIRIS platform. Analyze it with precision.`;
const BRIEFING_PROMPT = `Generate a comprehensive OSIRIS Daily Intelligence Briefing based on the current operational data. Structure it as follows:
## OSIRIS INTELLIGENCE BRIEFING
**Classification:** OPEN SOURCE INTELLIGENCE (OSINT)
**DTG:** [Current timestamp]
### I. EXECUTIVE SUMMARY
2-3 sentence overview of the current global threat landscape based on available data.
### II. PRIORITY INTELLIGENCE REQUIREMENTS (PIRs)
Identify the top 3-5 most significant developments from the data feeds, ranked by assessed impact.
### III. SEISMIC & NATURAL HAZARD ASSESSMENT
Analyze earthquake data for patterns — clustering, tectonic corridor activity, tsunami risk.
### IV. GEOPOLITICAL & CONFLICT INTELLIGENCE
Synthesize news feeds for conflict escalation patterns, diplomatic shifts, or emerging crises.
### V. CYBER THREAT LANDSCAPE
Assess active CVEs and cyber alerts for coordinated campaign indicators or critical infrastructure risk.
### VI. COMPOUND RISK SCENARIOS
Identify where multiple threat vectors intersect (e.g., earthquake near a conflict zone, cyber attack during political instability).
### VII. FORECAST & WATCHLIST
- **Next 24 Hours**: Most likely developments
- **Next 72 Hours**: Emerging situations to monitor
- **Strategic Horizon**: Longer-term trend assessment
### VIII. ASSESSMENT CONFIDENCE
State overall confidence level and key analytical gaps.
Analyze the provided data thoroughly. Be specific — reference actual events, magnitudes, locations, and CVE IDs from the context.`;
/* ─────────────────────────────────────────────────────────────
Client Factory
───────────────────────────────────────────────────────────── */
export function createGeminiClient(apiKey: string): GoogleGenerativeAI {
return new GoogleGenerativeAI(apiKey);
}
/* ─────────────────────────────────────────────────────────────
API Key Rotation — Round-robin through available keys
───────────────────────────────────────────────────────────── */
let _keyIndex = 0;
export function rotateApiKey(keys: string[]): string {
if (keys.length === 0) {
throw new Error('No API keys available');
}
const key = keys[_keyIndex % keys.length];
_keyIndex = (_keyIndex + 1) % keys.length;
return key;
}
/* ─────────────────────────────────────────────────────────────
Context Serializer — Compact representation for token efficiency
───────────────────────────────────────────────────────────── */
function serializeContext(context: IntelligenceContext): string {
const sections: string[] = [];
sections.push(`[TIMESTAMP] ${context.timestamp}`);
if (context.earthquakes.length > 0) {
sections.push(`\n[SEISMIC DATA — ${context.earthquakes.length} events]`);
for (const eq of context.earthquakes.slice(0, 20)) {
const tsunamiFlag = eq.tsunami ? ' ⚠️TSUNAMI' : '';
const alertFlag = eq.alert ? ` [ALERT:${eq.alert.toUpperCase()}]` : '';
sections.push(
` M${eq.magnitude} | ${eq.location} | ${eq.latitude.toFixed(2)},${eq.longitude.toFixed(2)} | Depth:${eq.depth}km | ${eq.timestamp}${tsunamiFlag}${alertFlag}`
);
}
}
if (context.news.length > 0) {
sections.push(`\n[OSINT NEWS FEED — ${context.news.length} items]`);
for (const item of context.news.slice(0, 15)) {
const coords = item.coords ? ` | GEO:${item.coords[0].toFixed(2)},${item.coords[1].toFixed(2)}` : '';
sections.push(
` RISK:${item.risk_score}/10 | ${item.source} | ${item.title}${coords} | ${item.published}`
);
}
}
if (context.threats.length > 0) {
sections.push(`\n[THREAT EVENTS — ${context.threats.length} active]`);
for (const threat of context.threats.slice(0, 15)) {
sections.push(
` ${threat.severity} | ${threat.type} | ${threat.title} | ${threat.region} | ${threat.timestamp}`
);
}
}
if (context.cyberAlerts.length > 0) {
sections.push(`\n[CYBER ALERTS — ${context.cyberAlerts.length} active]`);
for (const alert of context.cyberAlerts.slice(0, 10)) {
sections.push(
` ${alert.id} | ${alert.severity} | ${alert.vendor}/${alert.product} | ${alert.name} | Due:${alert.due}`
);
}
}
return sections.join('\n');
}
/* ─────────────────────────────────────────────────────────────
Intelligence Analysis
───────────────────────────────────────────────────────────── */
export async function analyzeIntelligence(
client: GoogleGenerativeAI,
context: IntelligenceContext,
userQuery: string
): Promise<string> {
const model: GenerativeModel = client.getGenerativeModel({
model: 'gemini-2.0-flash',
systemInstruction: SYSTEM_PROMPT,
});
const contextData = serializeContext(context);
const prompt = `## CURRENT OPERATIONAL DATA
${contextData}
## ANALYST QUERY
${userQuery}
Provide your intelligence assessment based on the operational data above and the analyst's query.`;
const result = await model.generateContent(prompt);
const response = result.response;
return response.text();
}
/* ─────────────────────────────────────────────────────────────
Daily Briefing Generation
───────────────────────────────────────────────────────────── */
export async function generateBriefing(
client: GoogleGenerativeAI,
context: IntelligenceContext
): Promise<string> {
const model: GenerativeModel = client.getGenerativeModel({
model: 'gemini-2.0-flash',
systemInstruction: SYSTEM_PROMPT,
});
const contextData = serializeContext(context);
const prompt = `${BRIEFING_PROMPT}
## CURRENT OPERATIONAL DATA
${contextData}
Generate the briefing now.`;
const result = await model.generateContent(prompt);
const response = result.response;
return response.text();
}