Skip to content

Yanggum/shinsi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

2 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ‡ฐ๐Ÿ‡ท ๊ฐœ์š” (Korean)

Next.js 15(App Router) + React 19 ๊ธฐ๋ฐ˜์˜ AI ์บ๋ฆญํ„ฐ ๋Œ€ํ™”/์ฐฝ์ž‘ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. Firebase(์ธ์ฆ/Firestore/Storage/Analytics)์™€ Supabase(pgvector)๋ฅผ ๊ฒฐํ•ฉํ•ด ์žฅ๊ธฐ ๊ธฐ์–ต RAG, ์š”์•ฝ(SUPA/HYPA ๋กค์—…), ๊ทธ๋ฃน ์ฑ„ํŒ…, ์บ๋ฆญํ„ฐ/๋กœ์–ด ๊ด€๋ฆฌ, ํฌ์ธํŠธยท๋ฉค๋ฒ„์‹ญยท๊ฒฐ์ œ(Stripe/Patreon) ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. PWA์™€ Vercel Cron๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํด๋”์™€ ์ฝ”๋“œ(์ผ๋ถ€):

  • src/app โ€” ๋ผ์šฐํŠธ(App Router), api/* ์„œ๋ฒ„ ๋ผ์šฐํŠธ, chat, ranking, lorebook, settings, admin ๋“ฑ ํ™”๋ฉด
  • src/utils/vector/* โ€” ์ž„๋ฒ ๋”ฉ/ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰/RAG/์š”์•ฝ ์ €์žฅ์†Œ(Supabase)
  • src/utils/memory/* โ€” ์š”์•ฝ ์ •์ฑ…/ํ”„๋กฌํ”„ํŠธ/์š”์•ฝ๊ธฐ(SUPA/HYPA)
  • src/firebase/* โ€” Firebase ํด๋ผ์ด์–ธํŠธ/์–ด๋“œ๋ฏผ ์ดˆ๊ธฐํ™”, ์ปฌ๋ ‰์…˜ ์œ ํ‹ธ
  • supabase/schema/*.sql โ€” pgvector/tsvector ๊ธฐ๋ฐ˜ ์Šคํ‚ค๋งˆ์™€ RPC(SQL Editor์—์„œ ์‹คํ–‰)
  • docs/*.md โ€” ๊ทธ๋ฃน ์ฑ„ํŒ…/์ถœ์„ ๋“ฑ ๊ธฐ๋Šฅ ์„ค๊ณ„ ๋ฌธ์„œ

ํ•ต์‹ฌ ๊ธฐ๋Šฅ

  • AI ๋Œ€ํ™”
    • ๋‹จ์ผ/๊ทธ๋ฃน ์ฑ„ํŒ…, ์บ๋ฆญํ„ฐ๋ณ„ ํ”„๋กœํ•„/์ด๋ฏธ์ง€ ๋งค์นญ, ์ตœ๊ทผ ๋Œ€ํ™” ์š”์•ฝ ์‚ฝ์ž…
    • LLM: Google AI Studio(Gemini/Vertex), OpenRouter(Anthropic/OpenAI)
    • ์žฅ๊ธฐ ๊ธฐ์–ต(RAG): Supabase pgvector + tsvector ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰, ์š”์•ฝ ์šฐ์„ (summary-first) ๊ฒ€์ƒ‰
  • ์ปจํ…์ธ /์ž์‚ฐ
    • ์บ๋ฆญํ„ฐยท๋กœ์–ด๋ถ CRUD, ์ด๋ฏธ์ง€ ์ƒ์„ฑ(/api/generate-image) ๋ฐ ์š”์•ฝ(/api/summarize)
  • ๊ฒฝ์ œ/๋žญํ‚น
    • ํฌ์ธํŠธ ์ž”์•ก/๊ฑฐ๋ž˜, Stripe ๊ฒฐ์ œ/์›นํ›…, Patreon ์—ฐ๋™
    • ์ผ/์ฃผ/์›” ๋žญํ‚น ์ง‘๊ณ„(cron) + ์กฐํšŒ(/api/rankings)
  • ๊ด€๋ฆฌ/๋ณด์•ˆ
    • ๊ด€๋ฆฌ์ž ๊ถŒํ•œ ๊ด€๋ฆฌ(src/app/admin/users/page.tsx), ์‚ญ์ œ/์ •๋ฆฌ์šฉ cron
    • Firestore ๊ทœ์น™/์ธ๋ฑ์Šค(firestore.rules, firestore.indexes.json)
  • ๋ฐฐํฌ/์šด์˜
    • Vercel Cron(vercel.json), PWA(next-pwa, public/manifest.json, public/sw.js)

๊ธฐ์ˆ  ์Šคํƒ

  • Web: Next.js 15, React 19, TypeScript, Mantine + MUI
  • Backend(App Router API): Firebase Admin, Supabase(Postgres + pgvector + pg_trgm + tsvector)
  • AI: Google Generative AI/Vertex, OpenRouter, OpenAI(์ž„๋ฒ ๋”ฉ ํฌํ•จ)
  • Payments: Stripe(Checkout/Webhook), Patreon OAuth
  • Infra: Vercel, PWA, Vercel Cron

๋น ๋ฅธ ์‹œ์ž‘

์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

  • Node.js 20+ ๊ถŒ์žฅ, pnpm 9+ (repo์— pnpm-lock.yaml ์กด์žฌ)
  • Firebase ํ”„๋กœ์ ํŠธ, Supabase ํ”„๋กœ์ ํŠธ, Stripe ๊ณ„์ •, (์„ ํƒ) Patreon ํด๋ผ์ด์–ธํŠธ
  1. ์˜์กด์„ฑ ์„ค์น˜
pnpm install
  1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ค€๋น„
  • .env.example๋ฅผ ์ฐธ๊ณ ํ•ด .env ๋˜๋Š” .env.local์„ ์ฑ„์›๋‹ˆ๋‹ค.
  • ๊ผญ ํ•„์š”ํ•œ ๊ฐ’(์š”์•ฝ):
    • Firebase Web: NEXT_PUBLIC_FIREBASE_*
    • Firebase Admin: FIREBASE_ADMIN_SDK_CONFIG(JSON), ๋˜๋Š” ์„œ๋น„์Šค ๊ณ„์ • ํŒŒ์ผ ์ง€์ •(GOOGLE_APPLICATION_CREDENTIALS)
    • Supabase(Server-only): SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, (์˜ต์…˜) SUPABASE_ANON_KEY
    • AI ํ‚ค: GOOGLE_AI_STUDIO_API_KEY ๋˜๋Š” GOOGLE_AI_STUDIO_API_KEYS, (์˜ต์…˜) OPENROUTER_API_KEY, OPENAI_API_KEY
    • ๊ฒฐ์ œ: STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET
    • Cron ๋ณด์•ˆ: CRON_SECRET(๋žญํ‚น ์ง‘๊ณ„), CRON_SECRET_TOKEN(์ •๋ฆฌ ์ž‘์—…)
    • RAG/๋ฉ”๋ชจ๋ฆฌ: ์•„๋ž˜ RAG/Memory ์„น์…˜ ์ฐธ์กฐ

๋ณด์•ˆ ์ฃผ์˜: SUPABASE_SERVICE_ROLE_KEY๋Š” ์ ˆ๋Œ€ ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœ๋˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ „์šฉ์ž…๋‹ˆ๋‹ค.

  1. Supabase ์Šคํ‚ค๋งˆ ์ ์šฉ
  • Supabase Dashboard โ†’ SQL Editor์—์„œ ์•„๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰:
    • supabase/schema/001_chat_message_embeddings.sql
    • supabase/schema/002_match_chat_messages.sql
    • supabase/schema/004_enable_trgm_and_lexical.sql
    • supabase/schema/005_match_chat_messages_hybrid.sql
    • supabase/schema/006_parent_child_windowing.sql
    • supabase/schema/007_memory_summaries.sql
    • supabase/schema/008_memory_summaries_param_fix.sql
    • supabase/schema/009_memory_roomid_to_text.sql
    • supabase/schema/010_memory_summaries_rpc_roomid_text.sql
  1. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰
pnpm dev

๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:3000 ์ ‘์†


ํ™˜๊ฒฝ ๋ณ€์ˆ˜(์š”์•ฝ)

Firebase

  • NEXT_PUBLIC_FIREBASE_API_KEY, NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN, NEXT_PUBLIC_FIREBASE_PROJECT_ID, NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET, NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID, NEXT_PUBLIC_FIREBASE_APP_ID, NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID, (์˜ต์…˜) NEXT_PUBLIC_FIREBASE_VAPID_KEY
  • Admin: FIREBASE_ADMIN_SDK_CONFIG(๋ฌธ์ž์—ด JSON) ๋˜๋Š” GOOGLE_APPLICATION_CREDENTIALS(ํŒŒ์ผ ๊ฒฝ๋กœ)

Supabase (์„œ๋ฒ„ ์ „์šฉ)

  • SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, (์˜ต์…˜) SUPABASE_ANON_KEY

AI/์ž„๋ฒ ๋”ฉ

  • Google AI Studio: GOOGLE_AI_STUDIO_API_KEY ๋˜๋Š” GOOGLE_AI_STUDIO_API_KEYS
  • OpenRouter(Anthropic/OpenAI ๊ฒฝ์œ ): OPENROUTER_API_KEY
  • OpenAI ์ž„๋ฒ ๋”ฉ: OPENAI_API_KEY, (์˜ต์…˜) EMBED_PROVIDER=openai|openrouter|local, EMBED_MODEL=text-embedding-3-small, LOCAL_EMBEDDING_URL

๊ฒฐ์ œ/๋ฉค๋ฒ„์‹ญ

  • STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET
  • PATREON_CLIENT_ID, PATREON_CLIENT_SECRET, PATREON_REDIRECT_URI

Cron/์šด์˜

  • CRON_SECRET, CRON_SECRET_TOKEN
  • PWA๋Š” next-pwa ์„ค์ •(๊ฐœ๋ฐœ ๋ชจ๋“œ ๋น„ํ™œ์„ฑ)

์š”์•ฝ/๋ฉ”๋ชจ๋ฆฌ/RAG

  • ๋ฉ”๋ชจ๋ฆฌ ์ •์ฑ…(src/utils/memory/policy.ts):
    • SUPA_HYPA_MEMORY_ENABLED=true|false (๊ธฐ๋ณธ on)
    • MEMORY_RETRIEVAL_MODE=summary_only|cascaded|messages_first (๊ธฐ๋ณธ cascaded)
    • SUPA_THRESHOLD_TOKENS, SUPA_WINDOW_MESSAGES, HYPA_ROLLUP_CHUNKS, SUPA_ROLLUP_MAX_GAP_MINUTES, HYPA_ROLLUP_PERIOD_HOURS
    • MEMORY_SUMMARY_K1, MEMORY_SUMMARY_K2, MEMORY_MIN_SCORE, MEMORY_ALPHA, MEMORY_WEIGHT_BETA, DECAY_HALFLIFE_HOURS, MAX_CONTEXT_TOKENS_FOR_MEMORY
  • RAG ๊ฒ€์ƒ‰(src/utils/vector/rag.ts):
    • RAG_MODE=v1|hybrid(๊ธฐ๋ณธ v1), RAG_K, RAG_FETCH_K, RAG_MIN_SCORE, RAG_ALPHA, RAG_WINDOW_SIZE, RAG_USE_TSV, RAG_USE_MQ, RAG_USE_HYDE, RAG_USE_RERANK, RAG_DECAY_HALFLIFE_HOURS, DEBUG_RAG
  • ์š”์•ฝ API(src/app/api/summarize/route.ts):
    • SUMMARY_SERVER_MAX_INPUT_CHARS, SUMMARY_SERVER_CHUNK_CHARS, SUMMARY_SERVER_MAX_MESSAGES, (ํด๋ผ์ด์–ธํŠธ ์ œํ•œ) SUMMARY_CLIENT_*

์ฐธ๊ณ : .env.example์— ์ „์ฒด ์˜ˆ์‹œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


RAG/Memory ๊ฐœ์š”

  • ์ธ๋ฑ์‹ฑ: /api/vector/index-message โ†’ chat_message_embeddings ์—…์„œํŠธ
  • ๊ฒ€์ƒ‰: ํ•˜์ด๋ธŒ๋ฆฌ๋“œ(RAG_MODE=hybrid) = pgvector(semantic) + trigram/tsvector(lexical) + ์‹œ๊ฐ„๊ฐ์‡  โ†’ match_chat_messages_hybrid
  • ์š”์•ฝ ์šฐ์„ (summary-first): chat_memory_summaries(SUPA=level 0, HYPA=level 1)์—์„œ ๋จผ์ € ๋งค์นญ โ†’ ํ•„์š”์‹œ ๋ฉ”์‹œ์ง€ ์Šค๋‹ˆํŽซ ๋ณด๊ฐ•
  • ์ž๋™ ๋กค์—…:
    • SUPA: ์ตœ๊ทผ ์ฐฝ ํฌ๊ธฐ/ํ† ํฐ ์ž„๊ณ„ ๋„๋‹ฌ ์‹œ runSupaSummarization์œผ๋กœ ์š”์•ฝ ์ €์žฅ
    • HYPA: ์ผ์ • ๊ฐœ์ˆ˜/๊ธฐ๊ฐ„ ๊ฒฝ๊ณผ ์‹œ runHypaRollup์œผ๋กœ ์ƒ์œ„ ์š”์•ฝ ๋ฐ ๋งํฌ ์ €์žฅ(chat_memory_links)
  • ํ†ตํ•ฉ ์‹œ์Šคํ…œ ๋ธ”๋ก: ๊ฒ€์ƒ‰/์š”์•ฝ ๊ฒฐ๊ณผ๋ฅผ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋กœ ์ฃผ์ž…ํ•˜์—ฌ ๋‹ต๋ณ€ ํ’ˆ์งˆ ํ–ฅ์ƒ

๊ด€๋ จ ํŒŒ์ผ

  • src/app/api/chat/bot-response/route.ts โ€” RAG ์ฃผ์ž…, ์š”์•ฝ ๋กค์—…, ๋ฉ€ํ‹ฐ ๋ชจ๋ธ ์ง€์›
  • src/utils/vector/* โ€” ์ž„๋ฒ ๋”ฉ/๊ฒ€์ƒ‰/์••์ถ•/์‹œ์Šคํ…œ๋ธ”๋ก
  • src/utils/memory/* โ€” ์ •์ฑ…/ํ”„๋กฌํ”„ํŠธ/์ €์žฅ์†Œ
  • supabase/schema/*.sql โ€” ํ…Œ์ด๋ธ”/์ธ๋ฑ์Šค/RPC ์ •์˜

์ฃผ์š” API (๋ฐœ์ทŒ)

  • ์ฑ„ํŒ…
    • POST /api/chat/bot-response โ€” ์บ๋ฆญํ„ฐ ์‘๋‹ต ์ƒ์„ฑ + RAG ์ฃผ์ž…/์š”์•ฝ ๋กค์—…
    • POST /api/chat/convert โ€” ๊ทธ๋ฃนโ†”๊ฐœ์ธ ๋ฐฉ ์ „ํ™˜, ํฌํฌ ๊ด€๋ฆฌ
    • POST /api/vector/index-message โ€” ๋ฉ”์‹œ์ง€ ์ž„๋ฒ ๋”ฉ ์ธ๋ฑ์‹ฑ
  • ์ƒ์„ฑ/์š”์•ฝ
    • POST /api/generate-lore โ€” ๋กœ์–ด/์ฒซ ๋ฉ”์‹œ์ง€ ์ƒ์„ฑ(WW+ ํ˜•์‹)
    • POST /api/generate-image โ€” ์ด๋ฏธ์ง€ ์ƒ์„ฑ(์„ ํƒ)
    • POST /api/summarize โ€” ๋Œ€ํ™” ์š”์•ฝ
  • ๊ฒฝ์ œ/๋žญํ‚น
    • POST /api/stripe/checkout, POST /api/stripe/webhook โ€” ๊ฒฐ์ œ/์›นํ›…
    • GET /api/rankings โ€” ์ผ/์ฃผ/์›” ๋žญํ‚น ์กฐํšŒ
    • GET /api/cron/aggregate-rankings/* โ€” Vercel Cron ๋Œ€์ƒ(ํ—ค๋” X-Cron-Auth: $CRON_SECRET)

๋ฐฐํฌ/์šด์˜

  • Vercel ๋ฐฐํฌ ๊ถŒ์žฅ. vercel.json์— Cron์ด ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Stripe Webhook์€ STRIPE_WEBHOOK_SECRET ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์„œ๋ช… ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • Vertex/Google AI ์‚ฌ์šฉ ์‹œ ์„œ๋น„์Šค ๊ณ„์ • ์ž๊ฒฉ์ฆ๋ช…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(GOOGLE_APPLICATION_CREDENTIALS ๋˜๋Š” JSON ๋ฌธ์ž์—ด).

๋ณด์•ˆ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ์„œ๋น„์Šค ๋กค ํ‚ค/์„œ๋น„์Šค ๊ณ„์ • JSON์€ ์ ˆ๋Œ€ ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœ ๊ธˆ์ง€
  • Firestore Rules/Indexes ๋™๊ธฐํ™”(firestore.rules, firestore.indexes.json)
  • Stripe Webhook ์„œ๋ช…/๋น„์šฉ ์ถ”์ (ํฌ์ธํŠธ ์ฐจ๊ฐ ๋กœ์ง)

์Šคํฌ๋ฆฝํŠธ

package.json ์ผ๋ถ€ ์Šคํฌ๋ฆฝํŠธ:

  • dev, build, start, lint
  • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜/์ •๋ฆฌ: scripts/migrations/*, src/scripts/* (์˜ˆ: ๋นˆ ์ฑ„ํŒ…๋ฐฉ ์ •๋ฆฌ, ๊ธฐ๋ณธ๊ฐ’ ๋ฐฑํ•„ ๋“ฑ)

๋ฌธ์„œ

  • ๊ทธ๋ฃน ์ฑ„ํŒ…: docs/group-chat.md
  • ์ถœ์„ ์„ค๊ณ„: docs/attendance-design.md

๋ผ์ด์„ ์Šค

  • ๋ฏธ์ • ๋˜๋Š” ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์†Œ์œ ์ž ์ •์ฑ…์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

๐Ÿ‡บ๐Ÿ‡ธ Overview (English)

An AI character chat/creation platform built with Next.js 15 (App Router) and React 19. It combines Firebase (Auth/Firestore/Storage/Analytics) and Supabase (pgvector) to deliver longโ€‘term memory RAG, summary rollups (SUPA/HYPA), group chat, character/lore management, and an economy layer (points, Stripe, Patreon). PWA and Vercel Cron are supported.

Highlighted directories:

  • src/app โ€” Routes (App Router), server routes under api/*, pages for chat, ranking, lorebook, settings, admin
  • src/utils/vector/* โ€” Embeddings, hybrid retrieval, RAG, summary repository (Supabase)
  • src/utils/memory/* โ€” Policy/prompts/summarizer (SUPA/HYPA)
  • src/firebase/* โ€” Firebase client/admin setup, collection helpers
  • supabase/schema/*.sql โ€” pgvector/tsvector schema and RPCs (run in SQL Editor)
  • docs/*.md โ€” Feature specs (group chat, attendance)

Features

  • AI Chat
    • Single/group chat, perโ€‘character profiles/image selection, recent summary injection
    • LLM providers: Google AI Studio (Gemini/Vertex), OpenRouter (Anthropic/OpenAI)
    • Longโ€‘term memory (RAG): Supabase pgvector + tsvector hybrid, summaryโ€‘first retrieval
  • Content/Assets
    • Character/lorebook CRUD, image generation (/api/generate-image), conversation summarization (/api/summarize)
  • Economy/Ranking
    • Points balance/ledger, Stripe checkout/webhook, Patreon OAuth
    • Daily/weekly/monthly ranking aggregation (cron) and fetch (/api/rankings)
  • Admin/Security
    • Admin role management (src/app/admin/users/page.tsx), cleanup cron
    • Firestore rules and indexes (firestore.rules, firestore.indexes.json)
  • Ops
    • Vercel Cron (vercel.json), PWA (next-pwa, public/manifest.json, public/sw.js)

Stack

  • Web: Next.js 15, React 19, TypeScript, Mantine + MUI
  • Backend: Firebase Admin, Supabase (Postgres + pgvector + pg_trgm + tsvector)
  • AI: Google Generative AI/Vertex, OpenRouter, OpenAI (incl. embeddings)
  • Payments: Stripe (Checkout/Webhook), Patreon
  • Infra: Vercel, PWA, Vercel Cron

Quick Start

Prereqs

  • Node.js 20+ recommended, pnpm 9+
  • Firebase project, Supabase project, Stripe account, (optional) Patreon client
  1. Install deps
pnpm install
  1. Configure env
  • Copy .env.example โ†’ .env or .env.local and fill in values.
  • Minimum required:
    • Firebase Web: NEXT_PUBLIC_FIREBASE_*
    • Firebase Admin: FIREBASE_ADMIN_SDK_CONFIG (JSON) or GOOGLE_APPLICATION_CREDENTIALS
    • Supabase (serverโ€‘only): SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, (opt) SUPABASE_ANON_KEY
    • AI keys: GOOGLE_AI_STUDIO_API_KEY or GOOGLE_AI_STUDIO_API_KEYS, (opt) OPENROUTER_API_KEY, OPENAI_API_KEY
    • Payments: STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET
    • Cron: CRON_SECRET (aggregation), CRON_SECRET_TOKEN (cleanup)

Important: Never expose SUPABASE_SERVICE_ROLE_KEY to the client. Itโ€™s serverโ€‘only.

  1. Apply Supabase schema
  • Run the SQL files in this order via Supabase SQL Editor: 001_chat_message_embeddings.sql โ†’ 002_match_chat_messages.sql โ†’ 004_enable_trgm_and_lexical.sql โ†’ 005_match_chat_messages_hybrid.sql โ†’ 006_parent_child_windowing.sql โ†’ 007_memory_summaries.sql โ†’ 008_memory_summaries_param_fix.sql โ†’ 009_memory_roomid_to_text.sql โ†’ 010_memory_summaries_rpc_roomid_text.sql
  1. Start dev server
pnpm dev

Open http://localhost:3000


Env Summary

Firebase

  • NEXT_PUBLIC_FIREBASE_* for client config
  • Admin: FIREBASE_ADMIN_SDK_CONFIG (stringified JSON) or GOOGLE_APPLICATION_CREDENTIALS

Supabase (serverโ€‘only)

  • SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, (opt) SUPABASE_ANON_KEY

AI/Embeddings

  • Google AI Studio: GOOGLE_AI_STUDIO_API_KEY or GOOGLE_AI_STUDIO_API_KEYS
  • OpenRouter: OPENROUTER_API_KEY
  • OpenAI embeddings: OPENAI_API_KEY, (opt) EMBED_PROVIDER, EMBED_MODEL, LOCAL_EMBEDDING_URL

Payments/Membership

  • STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET
  • PATREON_CLIENT_ID, PATREON_CLIENT_SECRET, PATREON_REDIRECT_URI

Cron/Ops

  • CRON_SECRET, CRON_SECRET_TOKEN

Summary/Memory/RAG

  • Memory policy (src/utils/memory/policy.ts): thresholds, modes
  • RAG retrieval (src/utils/vector/rag.ts): mode/hybrid knobs, decay, debug
  • Summarizer API (src/app/api/summarize/route.ts): server/client budget limits

RAG/Memory

  • Indexing via /api/vector/index-message โ†’ chat_message_embeddings
  • Retrieval: hybrid (pgvector + lexical with optional decay) via match_chat_messages_hybrid
  • Summaryโ€‘first: match in chat_memory_summaries (SUPA/HYPA) and optionally enrich with message snippets
  • Automatic rollups: SUPA and HYPA are produced based on thresholds and linked in chat_memory_links
  • Unified system block injected into model prompts to improve grounding

See:

  • src/app/api/chat/bot-response/route.ts
  • src/utils/vector/*, src/utils/memory/*
  • supabase/schema/*.sql

APIs (selected)

  • Chat: POST /api/chat/bot-response, POST /api/chat/convert, POST /api/vector/index-message
  • Generation/Summarization: POST /api/generate-lore, POST /api/generate-image, POST /api/summarize
  • Economy/Ranking: POST /api/stripe/checkout, POST /api/stripe/webhook, GET /api/rankings
  • Cron: GET /api/cron/aggregate-rankings/* (set X-Cron-Auth: $CRON_SECRET)

Deploy/Ops

  • Prefer Vercel. Cron jobs are defined in vercel.json.
  • Stripe webhook verification uses STRIPE_WEBHOOK_SECRET.
  • Vertex/Google AI requires proper service account credentials (GOOGLE_APPLICATION_CREDENTIALS or JSON string var).

Security

  • Never expose service role keys or service account JSON to the client.
  • Keep Firestore rules and indexes in sync.
  • Monitor token usage and point deduction for paid models.

Scripts

  • Core: dev, build, start, lint
  • Migrations/maintenance under scripts/migrations/*, src/scripts/*

Docs

  • Group chat: docs/group-chat.md
  • Attendance: docs/attendance-design.md

License

  • Apache-2.0 licensed.

About

The opensource chat platform

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors