FASE 1: Notifications UI - Add NotificationBell, NotificationDrawer, NotificationItem components - Integrate notification bell in DashboardLayout header - Real-time unread count with polling FASE 2: AI Integration Backend - Add AI module with OpenRouter client - Endpoints: POST /ai/chat, GET /ai/models, GET/PATCH /ai/config - GET /ai/usage, GET /ai/usage/current, GET /ai/health - Database: schema ai with configs and usage tables - Token tracking and cost calculation FASE 3: Settings Page Refactor - Restructure with tabs navigation - GeneralSettings: profile, organization, appearance - NotificationSettings: channels and categories toggles - SecuritySettings: password change, 2FA placeholder, sessions Files created: 25+ Endpoints added: 7 Story Points completed: 21 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
68 lines
2.5 KiB
SQL
68 lines
2.5 KiB
SQL
-- ============================================
|
|
-- AI Configurations Table
|
|
-- Per-tenant AI settings and defaults
|
|
-- ============================================
|
|
|
|
CREATE TABLE ai.configs (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id UUID NOT NULL REFERENCES tenants.tenants(id) ON DELETE CASCADE,
|
|
|
|
-- Provider settings
|
|
provider ai.ai_provider NOT NULL DEFAULT 'openrouter',
|
|
default_model VARCHAR(100) NOT NULL DEFAULT 'anthropic/claude-3-haiku',
|
|
fallback_model VARCHAR(100) DEFAULT 'openai/gpt-3.5-turbo',
|
|
|
|
-- Generation parameters
|
|
temperature NUMERIC(3,2) NOT NULL DEFAULT 0.7 CHECK (temperature >= 0 AND temperature <= 2),
|
|
max_tokens INTEGER NOT NULL DEFAULT 2048 CHECK (max_tokens > 0 AND max_tokens <= 32000),
|
|
top_p NUMERIC(3,2) DEFAULT 1.0 CHECK (top_p >= 0 AND top_p <= 1),
|
|
frequency_penalty NUMERIC(3,2) DEFAULT 0.0 CHECK (frequency_penalty >= -2 AND frequency_penalty <= 2),
|
|
presence_penalty NUMERIC(3,2) DEFAULT 0.0 CHECK (presence_penalty >= -2 AND presence_penalty <= 2),
|
|
|
|
-- System prompt
|
|
system_prompt TEXT,
|
|
|
|
-- Rate limits (override plan defaults)
|
|
rate_limit_requests_per_minute INTEGER,
|
|
rate_limit_tokens_per_minute INTEGER,
|
|
rate_limit_tokens_per_month INTEGER,
|
|
|
|
-- Feature flags
|
|
is_enabled BOOLEAN NOT NULL DEFAULT true,
|
|
allow_custom_prompts BOOLEAN NOT NULL DEFAULT true,
|
|
log_conversations BOOLEAN NOT NULL DEFAULT false,
|
|
|
|
-- Additional settings as JSON
|
|
settings JSONB DEFAULT '{}',
|
|
|
|
-- Timestamps
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
|
|
-- Ensure one config per tenant
|
|
CONSTRAINT uq_ai_configs_tenant UNIQUE (tenant_id)
|
|
);
|
|
|
|
-- Indexes
|
|
CREATE INDEX idx_ai_configs_tenant ON ai.configs(tenant_id);
|
|
CREATE INDEX idx_ai_configs_provider ON ai.configs(provider);
|
|
|
|
-- RLS
|
|
ALTER TABLE ai.configs ENABLE ROW LEVEL SECURITY;
|
|
|
|
CREATE POLICY ai_configs_tenant_isolation ON ai.configs
|
|
FOR ALL
|
|
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
|
|
|
|
-- Trigger for updated_at
|
|
CREATE TRIGGER update_ai_configs_updated_at
|
|
BEFORE UPDATE ON ai.configs
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
-- Comments
|
|
COMMENT ON TABLE ai.configs IS 'AI configuration per tenant';
|
|
COMMENT ON COLUMN ai.configs.default_model IS 'Default model to use (e.g., anthropic/claude-3-haiku)';
|
|
COMMENT ON COLUMN ai.configs.system_prompt IS 'Default system prompt for all AI interactions';
|
|
COMMENT ON COLUMN ai.configs.settings IS 'Additional provider-specific settings as JSON';
|