My Blog
← Back to home

Architecture — AI Decision Salon

Architecture — AI Decision Salon

系统概述

单体 Next.js 应用,编排器在 API Route 中实现。

技术栈

  • 前端: Next.js 16 App Router + Tailwind CSS 4 + shadcn/ui
  • 后端: Next.js API Route (TypeScript)
  • 数据库: PostgreSQL (Neon) + Drizzle ORM
  • AI: Vercel AI SDK + OpenAI/Anthropic
  • 部署: Vercel + Neon PostgreSQL

架构图

┌─────────────────────────────────────────┐
│             Next.js App                  │
│                                         │
│  Pages (App Router)                     │
│  ├── / (首页 + 示例讨论)                │
│  ├── /salons/create (创建话题)          │
│  ├── /salons/[id] (讨论详情)            │
│  └── /salons (历史列表)                 │
│                                         │
│  API Routes                             │
│  ├── POST /api/discussions (创建+编排)  │
│  ├── GET  /api/discussions/[id] (查询)  │
│  └── GET  /api/discussions/[id]/stream  │
│      (SSE 流式推送)                     │
│                                         │
│  Service Layer                          │
│  ├── orchestrator.ts (编排器核心)       │
│  ├── agents.ts (角色管理)               │
│  └── llm.ts (LLM 调用封装)             │
│                                         │
│  Data Layer                             │
│  ├── db/index.ts (Drizzle 客户端)       │
│  ├── db/schema.ts (表定义)              │
│  └── db/queries.ts (查询函数)           │
└─────────────────────────────────────────┘

核心流程

  1. 用户输入问题 → POST /api/discussions
  2. 主持人 LLM 拆题 → SSE 推送拆题结果
  3. Promise.all 并行调用 4 角色 → SSE 逐角色流式推送
  4. 总结 LLM 生成决策清晰卡 → SSE 推送
  5. 写入 PostgreSQL

数据模型

users → sessions → messages
                  → decision_cards
                  → session_agents
agents (系统配置)

目录结构

src/
├── app/                    # Next.js App Router
│   ├── page.tsx            # 首页
│   ├── layout.tsx          # 根布局
│   ├── salons/
│   │   ├── page.tsx        # 讨论列表
│   │   ├── create/page.tsx # 创建话题
│   │   └── [id]/page.tsx   # 讨论详情
│   └── api/
│       └── discussions/
│           ├── route.ts    # POST 创建讨论
│           └── [id]/
│               ├── route.ts        # GET 讨论详情
│               └── stream/route.ts # GET SSE 流
├── components/
│   ├── ui/                 # shadcn/ui 组件
│   ├── discussion/         # 讨论相关组件
│   │   ├── message-card.tsx
│   │   ├── chat-stream.tsx
│   │   ├── decision-card.tsx
│   │   ├── moderator-panel.tsx
│   │   └── progress-indicator.tsx
│   └── layout/             # 布局组件
│       ├── three-column.tsx
│       └── mobile-tabs.tsx
├── lib/
│   ├── db/
│   │   ├── index.ts        # Drizzle 客户端
│   │   ├── schema.ts       # 表定义
│   │   └── queries.ts      # 查询函数
│   ├── orchestrator/
│   │   ├── index.ts        # 编排器主逻辑
│   │   ├── agents.ts       # 角色定义和 prompt
│   │   ├── moderator.ts    # 主持人逻辑
│   │   └── summarizer.ts   # 总结/决策卡生成
│   ├── llm/
│   │   ├── client.ts       # AI SDK 封装
│   │   ├── prompts.ts      # 角色 prompt 模板
│   │   └── streaming.ts    # SSE 流式工具
│   └── utils.ts            # 通用工具
└── types/
    └── index.ts            # 类型定义