# Issue #128: Add LlmProviderInstance Prisma Schema

## Objective

Create database schema for LLM provider instance configuration to support multi-provider LLM backend.

## Approach

### Schema Design

```prisma
model LlmProviderInstance {
  id            String   @id @default(uuid())
  providerType  String   @map("provider_type")  // "ollama" | "claude" | "openai"
  displayName   String   @map("display_name")
  userId        String?  @map("user_id")        // NULL = system-level, UUID = user-level
  config        Json                             // Provider-specific configuration
  isDefault     Boolean  @default(false) @map("is_default")
  isEnabled     Boolean  @default(true) @map("is_enabled")
  createdAt     DateTime @default(now()) @map("created_at")
  updatedAt     DateTime @updatedAt @map("updated_at")

  user          User?    @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([userId])
  @@index([providerType])
  @@index([isDefault])
  @@map("llm_provider_instances")
}
```

### Configuration Patterns

**System-level instances** (user_id = NULL):

- Available to all users
- Managed by admins only
- Example: Shared Ollama server

**User-level instances** (user_id = UUID):

- Private to specific user
- User manages their own API keys
- Example: Personal OpenAI API key

### Config Field Structure

```json
{
  "endpoint": "http://localhost:11434",
  "timeout": 30000,
  "apiKey": "sk-...", // encrypted in production
  "organization": "org-...",
  "customHeaders": {}
}
```

## Progress

- [x] Read current Prisma schema
- [x] Add LlmProviderInstance model
- [x] Add relation to User model
- [x] Add indexes for performance
- [x] Create migration (20260131115600_add_llm_provider_instance)
- [x] Update Prisma client types (prisma generate)
- [ ] Run migration on dev database (manual step, requires DB connection)
- [ ] Verify migration succeeded (manual step, requires DB connection)

## Testing

- Verify model is accessible via Prisma client
- Verify indexes exist in database
- Verify foreign key constraints work
- Test both system and user-level instances

## Notes

- Using snake_case for database columns (project convention)
- JSON field for flexible provider configs
- Cascade delete when user is deleted
- `isDefault` allows marking one provider as default per user

## Implementation Details

**Model Added:**

- `LlmProviderInstance` with all required fields
- Foreign key relation to `User` model (nullable for system-level instances)
- Added `llmProviders` relation array to User model

**Indexes Created:**

- `user_id` - Fast lookup by user
- `provider_type` - Fast filtering by provider
- `is_default` - Quick default provider lookup
- `is_enabled` - Filter enabled/disabled providers

**Migration File:** `20260131115600_add_llm_provider_instance`

- Creates table with proper PostgreSQL types
- Sets up foreign key constraint with CASCADE delete
- Creates all performance indexes

## Acceptance Criteria Status

- ✅ Migration created successfully
- ✅ Model accessible via Prisma client (prisma generate succeeded)
- ✅ Indexes defined correctly
- ⏸️ Migration not run (requires database connection)
- ⏸️ No data loss risk (new table, no existing data)

## Next Steps

When database is available:

```bash
pnpm --filter @mosaic/api prisma migrate deploy
# OR for development:
pnpm --filter @mosaic/api prisma migrate dev
```
