Skip to content
Loafacto 문서/참고 문서/web-ui 문서/18. supabase-llm-models-table.sql

18. supabase-llm-models-table.sql

원본 파일: 'C:\Repository\loafacto-hub\docs\web-ui\18. supabase-llm-models-table.sql'

sql
-- =============================================================================
-- LLM 모델 관리 테이블
-- 관리자가 등록한 LLM 모델을 전체 사용자에게 공유합니다.
-- Supabase SQL Editor에서 실행하세요.
-- =============================================================================

-- 1) 테이블 생성
CREATE TABLE IF NOT EXISTS public.llm_models (
  id            text PRIMARY KEY,                          -- 모델 ID (예: gpt-4o, llama3.1:8b)
  name          text NOT NULL,                             -- 표시 이름
  provider      text NOT NULL DEFAULT 'Custom',            -- 공급자
  context       text,                                      -- 컨텍스트 크기 (예: 128k Context)
  host          text,                                      -- 로컬/자체 호스팅 주소
  type          text NOT NULL DEFAULT 'chat'
                CHECK (type IN ('chat', 'vision', 'embedding')), -- 모델 용도 타입
  enabled_for_user boolean NOT NULL DEFAULT true,          -- 채팅 화면 노출 여부
  created_at    timestamptz DEFAULT now() NOT NULL,
  updated_at    timestamptz DEFAULT now() NOT NULL
);

COMMENT ON TABLE public.llm_models IS '관리자가 등록한 LLM 모델 목록. 인증된 모든 사용자가 읽기 가능.';

-- 2) RLS 활성화
ALTER TABLE public.llm_models ENABLE ROW LEVEL SECURITY;

-- 3) 정책: 인증된 사용자 전체 읽기 허용
CREATE POLICY "Authenticated users can read llm_models"
  ON public.llm_models
  FOR SELECT
  TO authenticated
  USING (true);

-- 4) 정책: 관리자(super_admin, operator)만 쓰기 허용
CREATE POLICY "Admins can insert llm_models"
  ON public.llm_models
  FOR INSERT
  TO authenticated
  WITH CHECK (
    EXISTS (
      SELECT 1 FROM public.user_roles
      WHERE user_id = auth.uid()
        AND role IN ('super_admin', 'operator')
    )
  );

CREATE POLICY "Admins can update llm_models"
  ON public.llm_models
  FOR UPDATE
  TO authenticated
  USING (
    EXISTS (
      SELECT 1 FROM public.user_roles
      WHERE user_id = auth.uid()
        AND role IN ('super_admin', 'operator')
    )
  )
  WITH CHECK (
    EXISTS (
      SELECT 1 FROM public.user_roles
      WHERE user_id = auth.uid()
        AND role IN ('super_admin', 'operator')
    )
  );

CREATE POLICY "Admins can delete llm_models"
  ON public.llm_models
  FOR DELETE
  TO authenticated
  USING (
    EXISTS (
      SELECT 1 FROM public.user_roles
      WHERE user_id = auth.uid()
        AND role IN ('super_admin', 'operator')
    )
  );

-- 5) 마이그레이션: 테이블이 이미 존재하는 경우 type 컬럼 추가
--    (최초 생성 시에는 위 CREATE TABLE에 이미 포함되어 있으므로 무시됨)
ALTER TABLE public.llm_models
  ADD COLUMN IF NOT EXISTS type text NOT NULL DEFAULT 'chat'
  CHECK (type IN ('chat', 'vision', 'embedding'));

-- 6) updated_at 자동 갱신 트리거
CREATE OR REPLACE FUNCTION public.set_updated_at()
RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
  NEW.updated_at = now();
  RETURN NEW;
END;
$$;

CREATE TRIGGER llm_models_updated_at
  BEFORE UPDATE ON public.llm_models
  FOR EACH ROW EXECUTE FUNCTION public.set_updated_at();