Database
Database
The AI Arena uses lowdb (JSON file-based database) with a SQL-like interface.
Database Schema
Agents Table
{ id: string; name: string; type: 'red' | 'blue' | 'target'; model: string; systemPrompt: string; permissions: string[]; createdAt: string; updatedAt: string;}Matches Table
{ id: string; redAgentId: string; blueAgentId: string; targetAgentId: string; status: 'pending' | 'running' | 'paused' | 'completed' | 'stopped' | 'error'; mode: 'quick' | 'standard' | 'deep' | 'continuous'; score: { red: number; blue: number; winner: 'red' | 'blue' | 'draw'; }; currentRound: number; maxRounds: number; createdAt: string; startedAt?: string; completedAt?: string;}Events Table
{ id: string; matchId: string; roundNumber: number; type: 'attack' | 'defense' | 'target_response'; agentId: string; agentName: string; severity?: 'low' | 'medium' | 'high' | 'critical'; prompt?: string; outcome?: 'success' | 'blocked' | 'partial'; toolCalls?: ToolCall[]; timestamp: string;}Rounds Table
{ id: string; matchId: string; roundNumber: number; score: { red: number; blue: number; winner: 'red' | 'blue' | 'draw'; }; events: string[]; // Event IDs createdAt: string;}Database Interface
The database uses a SQL-like interface:
interface Database { run(sql: string, ...params: any[]): Promise<{ lastID: number; changes: number }>; get(sql: string, ...params: any[]): Promise<any>; all(sql: string, ...params: any[]): Promise<any[]>; exec(sql: string): Promise<void>; close(): Promise<void>;}Model Layer
Models provide type-safe database operations:
AgentModel
class AgentModel { async getAll(): Promise<Agent[]> async getById(id: string): Promise<Agent | null> async create(data: CreateAgentData): Promise<Agent> async update(id: string, data: UpdateAgentData): Promise<Agent> async delete(id: string): Promise<void>}MatchModel
class MatchModel { async getAll(): Promise<Match[]> async getById(id: string): Promise<Match | null> async create(data: CreateMatchData): Promise<Match> async update(id: string, data: UpdateMatchData): Promise<Match> async delete(id: string): Promise<void>}Database Location
Database file location:
- Default:
backend/data/arena.json - Configurable: Set via
DATABASE_PATHenvironment variable
Migration to SQL
The SQL-like interface makes migration to SQL databases easy:
- Replace
LowDbAdapterwith SQL adapter - Implement same interface
- Update SQL queries as needed
- Models remain unchanged
Backup
To backup database:
cp backend/data/arena.json backend/data/arena.json.backupNext Steps
- Backend Overview - Backend architecture
- Models - Model layer details