Skip to content

Commit 31ca986

Browse files
committed
chore: optimize project structure and tests
1 parent 66aab44 commit 31ca986

75 files changed

Lines changed: 5939 additions & 1664 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.DS_Store

-6 KB
Binary file not shown.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ lerna-debug.log*
1010
node_modules
1111
dist
1212
dist-ssr
13+
coverage
1314
*.local
1415

1516
# Editor directories and files

App.tsx

Lines changed: 61 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
21
import React from 'react';
32
import { useAppLogic } from './hooks/useAppLogic';
43
import { useDarkMode } from './hooks/useDarkMode';
54

65
import ErrorBoundary from './components/ErrorBoundary';
7-
import SettingsModal from './SettingsModal';
6+
import SettingsModal from './components/settings/SettingsModal';
87
import Header from './components/Header';
9-
import ChatInput from './components/InputSection';
8+
import ChatInput from './components/ChatInput';
109
import Sidebar from './components/Sidebar';
1110
import ChatArea from './components/ChatArea';
1211

@@ -38,6 +37,8 @@ const App = () => {
3837
handleDeleteSession,
3938
stopDeepThink,
4039
focusTrigger,
40+
inputError,
41+
clearInputError,
4142
handleSetThinkingLevel,
4243
handleSetRecursiveLoop,
4344
} = useAppLogic();
@@ -46,68 +47,71 @@ const App = () => {
4647

4748
return (
4849
<ErrorBoundary>
49-
<div className="flex flex-col h-screen bg-white dark:bg-slate-950 text-slate-800 dark:text-slate-200 font-sans selection:bg-blue-100 selection:text-blue-900 dark:selection:bg-blue-900 dark:selection:text-blue-100">
50-
51-
<SettingsModal
52-
isOpen={isSettingsOpen}
53-
onClose={() => setIsSettingsOpen(false)}
54-
config={config}
55-
setConfig={setConfig}
56-
effectiveConfig={effectiveConfig}
57-
model={selectedModel}
58-
onSetThinkingLevel={handleSetThinkingLevel}
59-
onSetRecursiveLoop={handleSetRecursiveLoop}
60-
/>
61-
62-
<Header
63-
selectedModel={selectedModel}
64-
setSelectedModel={setSelectedModel}
65-
onOpenSettings={() => setIsSettingsOpen(true)}
66-
onToggleSidebar={() => setIsSidebarOpen(!isSidebarOpen)}
67-
onNewChat={handleNewChat}
68-
config={config}
69-
isDark={isDark}
70-
onToggleDark={toggleDark}
71-
/>
50+
<div className="flex flex-col h-screen bg-white dark:bg-slate-950 text-slate-800 dark:text-slate-200 font-sans selection:bg-blue-100 selection:text-blue-900 dark:selection:bg-blue-900 dark:selection:text-blue-100">
51+
<SettingsModal
52+
isOpen={isSettingsOpen}
53+
onClose={() => setIsSettingsOpen(false)}
54+
config={config}
55+
setConfig={setConfig}
56+
effectiveConfig={effectiveConfig}
57+
model={selectedModel}
58+
onSetThinkingLevel={handleSetThinkingLevel}
59+
onSetRecursiveLoop={handleSetRecursiveLoop}
60+
/>
7261

73-
<div className="flex flex-1 overflow-hidden relative">
74-
<Sidebar
75-
isOpen={isSidebarOpen}
76-
onClose={() => setIsSidebarOpen(false)}
77-
sessions={sessions}
78-
currentSessionId={currentSessionId}
79-
onSelectSession={handleSelectSession}
62+
<Header
63+
selectedModel={selectedModel}
64+
setSelectedModel={setSelectedModel}
65+
onOpenSettings={() => setIsSettingsOpen(true)}
66+
onToggleSidebar={() => setIsSidebarOpen(!isSidebarOpen)}
8067
onNewChat={handleNewChat}
81-
onDeleteSession={handleDeleteSession}
68+
config={config}
69+
isDark={isDark}
70+
onToggleDark={toggleDark}
8271
/>
8372

84-
<main className="flex-1 flex flex-col min-w-0 bg-white dark:bg-slate-950 relative">
85-
<ChatArea
86-
messages={messages}
87-
appState={appState}
88-
managerAnalysis={managerAnalysis}
89-
experts={experts}
90-
finalOutput={finalOutput}
91-
processStartTime={processStartTime}
92-
processEndTime={processEndTime}
93-
onSuggestionClick={(text) => { setQuery(text); }}
73+
<div className="flex flex-1 overflow-hidden relative">
74+
<Sidebar
75+
isOpen={isSidebarOpen}
76+
onClose={() => setIsSidebarOpen(false)}
77+
sessions={sessions}
78+
currentSessionId={currentSessionId}
79+
onSelectSession={handleSelectSession}
80+
onNewChat={handleNewChat}
81+
onDeleteSession={handleDeleteSession}
9482
/>
9583

96-
<div className="absolute bottom-0 left-0 right-0 z-20 pointer-events-none p-4 pb-6 flex justify-center bg-gradient-to-t from-white dark:from-slate-950 via-white/80 dark:via-slate-950/80 to-transparent">
97-
<div className="pointer-events-auto w-full max-w-4xl">
98-
<ChatInput
99-
query={query}
100-
setQuery={setQuery}
101-
onRun={handleRun}
102-
onStop={stopDeepThink}
103-
appState={appState}
104-
focusTrigger={focusTrigger}
105-
/>
84+
<main className="flex-1 flex flex-col min-w-0 bg-white dark:bg-slate-950 relative">
85+
<ChatArea
86+
messages={messages}
87+
appState={appState}
88+
managerAnalysis={managerAnalysis}
89+
experts={experts}
90+
finalOutput={finalOutput}
91+
processStartTime={processStartTime}
92+
processEndTime={processEndTime}
93+
onSuggestionClick={(text) => {
94+
setQuery(text);
95+
}}
96+
/>
97+
98+
<div className="absolute bottom-0 left-0 right-0 z-20 pointer-events-none p-4 pb-6 flex justify-center bg-gradient-to-t from-white dark:from-slate-950 via-white/80 dark:via-slate-950/80 to-transparent">
99+
<div className="pointer-events-auto w-full max-w-4xl">
100+
<ChatInput
101+
query={query}
102+
setQuery={setQuery}
103+
onRun={handleRun}
104+
onStop={stopDeepThink}
105+
appState={appState}
106+
focusTrigger={focusTrigger}
107+
inputError={inputError}
108+
onClearInputError={clearInputError}
109+
/>
110+
</div>
106111
</div>
107-
</div>
108-
</main>
112+
</main>
113+
</div>
109114
</div>
110-
</div>
111115
</ErrorBoundary>
112116
);
113117
};

README.md

Lines changed: 70 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Prisma
1+
# Prisma
22

33
<p align="center">
44
<a href="./README.md">中文</a> | <a href="./README.en.md">English</a>
@@ -7,7 +7,7 @@
77
<div align="center">
88

99
<p>
10-
<strong>基于 Gemini 3 的可视化深度多智能体推理引擎</strong>
10+
<strong>面向 Gemini 与 OpenAI 兼容模型的可视化深度多智能体推理引擎</strong>
1111
</p>
1212

1313
<p>
@@ -35,86 +35,112 @@
3535

3636
## 📖 项目简介
3737

38-
**Prisma** 是一款探索 **Google Gemini 3.0** 推理极限的实验性应用。它不仅仅是一个聊天机器人,更是一个**可视化的思维实验室**
38+
**Prisma** 是一款探索多模型推理极限的实验性应用。它不仅仅是一个聊天机器人,更是一个**可视化的思维实验室**
3939

4040
它引入了 **"深度多智能体推理 (Deep Multi-Agent Reasoning)"** 架构,将复杂的用户问题动态分解为子任务,分派给专门的 AI 专家角色并行处理。用户可以实时观看 AI 如何通过 **Manager(规划) -> Experts(执行) -> Synthesis(综合)** 的工作流来解决复杂问题。
4141

4242
## 🔗 在线体验
4343

4444
无需部署,直接体验 Prisma 的强大推理能力:
4545

46-
| 平台 | 入口 | 说明 |
47-
| :--- | :--- | :--- |
46+
| 平台 | 入口 | 说明 |
47+
| :------------------- | :------------------------------------------------------------------------------------------------------ | :----------------------------------------------------------------------- |
4848
| **Google AI Studio** | [🚀 **立即运行**](https://ai.studio/apps/drive/1JWPILJ3NT10NR4eOeGiqBi6OZuRaEszO?fullscreenApplet=true) | **推荐**。直接登录 Google 账号即可免费使用,无需配置 API Key,开箱即用。 |
49-
| **Web 演示版** | [🌐 **访问网页**](https://prisma-8yz.pages.dev/) | 纯前端版本,**需要填写您自己的 Google API Key** 才能运行。 |
49+
| **Web 演示版** | [🌐 **访问网页**](https://prisma-8yz.pages.dev/) | 纯前端版本,**需要填写您自己的 Google API Key** 才能运行。 |
5050

5151
---
5252

5353
## ✨ 核心特性
5454

5555
### 🧠 深度多智能体架构 (Deep Reasoning)
56-
* **动态规划 (Manager Agent)**:根据用户的问题,智能分析并决定需要哪些领域的“专家”介入。
57-
* **并行专家池 (Expert Pool)**:系统会自动生成专门的 AI 角色(如“逻辑学家”、“代码架构师”、“历史研究员”),它们并行工作,互不干扰。
58-
* **递归优化 (Recursive Refinement)**
59-
* **自省循环**:Manager 会审查专家的输出。如果发现逻辑漏洞或信息缺失,会自动驳回并启动下一轮修正(支持最多 3 轮迭代)。
60-
* **最终综合**:将分散的专家意见汇聚成一篇逻辑严密、内容详实的最终回复。
56+
57+
- **动态规划 (Manager Agent)**:根据用户的问题,智能分析并决定需要哪些领域的“专家”介入。
58+
- **并行专家池 (Expert Pool)**:系统会自动生成专门的 AI 角色(如“逻辑学家”、“代码架构师”、“历史研究员”),它们并行工作,互不干扰。
59+
- **递归优化 (Recursive Refinement)**
60+
- **自省循环**:Manager 会审查专家的输出。如果发现逻辑漏洞或信息缺失,会自动驳回并启动下一轮修正。**当前实现最多进行 2 轮专家执行(初始轮 + 1 轮复审修正)**
61+
- **最终综合**:将分散的专家意见汇聚成一篇逻辑严密、内容详实的最终回复。
6162

6263
### 👁️ 全链路可视化
63-
* **思维流 (Process Flow)**:通过动态节点图展示当前的推理状态(Analyzing -> Working -> Reviewing -> Synthesizing)。
64-
* **透明化思考**:你可以点开每一个“专家卡片”,查看其私有的 **Internal Monologue (内部独白)****Draft Output (草稿)**
65-
* **实时计时器**:精确追踪每个环节的耗时,了解 AI 的时间分配。
64+
65+
- **思维流 (Process Flow)**:通过动态节点图展示当前的推理状态(Analyzing -> Working -> Reviewing -> Synthesizing)。
66+
- **透明化思考**:你可以点开每一个“专家卡片”,查看其私有的 **Internal Monologue (内部独白)****Draft Output (草稿)**
67+
- **实时计时器**:精确追踪每个环节的耗时,了解 AI 的时间分配。
6668

6769
### ⚙️ 精细化控制
68-
* **思考预算 (Thinking Budget)**
69-
* 支持为 **规划****执行****综合** 三个阶段分别设置思考深度(Minimal, Low, Medium, High)。
70-
* 这决定了模型在生成 Token 时分配给 "Thinking" 字段的配额。
71-
* **模型切换**:无缝切换 `Gemini 3 Flash` (速度优先) 和 `Gemini 3 Pro` (深度优先)。
70+
71+
- **思考预算 (Thinking Budget)**
72+
- 支持为 **规划****执行****综合** 三个阶段分别设置思考深度(Minimal, Low, Medium, High)。
73+
- 这决定了模型在生成 Token 时分配给 "Thinking" 字段的配额。
74+
- **模型切换**:内置 `Gemini 3 Flash``Gemini 3.1 Pro`,也支持接入 OpenAI 兼容自定义模型。
7275

7376
### 🛠️ 现代化工程体验
74-
* **自定义 API 网关**:支持配置 Custom Base URL,方便国内用户通过反向代理连接。
75-
* **Markdown & LaTeX**:完美渲染复杂的数学公式、代码块和图表。
76-
* **本地优先**:所有会话历史存储在浏览器 LocalStorage 中,保护隐私。
77+
78+
- **自定义 API 网关**:支持配置 Custom Base URL,方便国内用户通过反向代理连接。
79+
- **Markdown & LaTeX**:完美渲染复杂的数学公式、代码块和图表。
80+
- **本地优先**:聊天会话存储在浏览器 **IndexedDB** 中,轻量偏好设置存储在 `localStorage` 中,保护隐私。
81+
82+
### 📎 附件能力说明
83+
84+
- **Google 模型**:图片、PDF、音视频、文本/代码附件会以内联数据方式发送;对较大的文件,仍可能受上游接口限制。
85+
- **OpenAI 兼容模型**:支持图片和文本/代码附件;**PDF、音频、视频附件会在发送前被拦截**,避免静默丢失。
7786

7887
---
7988

8089
## ⚙️ 快速开始
8190

8291
### 1. 克隆项目
92+
8393
```bash
8494
git clone https://github.com/yeahhe365/Prisma.git
8595
cd Prisma
8696
```
8797

8898
### 2. 安装依赖
99+
89100
```bash
90101
npm install
91102
```
92103

93104
### 3. 配置环境
105+
94106
在项目根目录创建 `.env.local` 文件并填入你的 API Key:
107+
95108
```env
96-
GEMINI_API_KEY=your_api_key_here
109+
VITE_API_KEY=your_api_key_here
97110
```
98111

112+
兼容旧配置名:`GEMINI_API_KEY` 仍可继续使用。
113+
99114
### 4. 启动开发服务器
115+
100116
```bash
101117
npm run dev
102118
```
119+
103120
访问 `http://localhost:3000` 即可开始推理。
104121

122+
### 5. 运行校验
123+
124+
```bash
125+
npm test
126+
npx tsc --noEmit
127+
npm run lint
128+
npm run build
129+
```
130+
105131
---
106132

107133
## 🛠️ 技术栈
108134

109-
| 模块 | 技术选型 | 说明 |
110-
| :--- | :--- | :--- |
111-
| **核心框架** | React 19 | 使用最新的 React Hooks 和并发特性 |
112-
| **构建工具** | Vite 6 | 极速冷启动与热更新 |
113-
| **AI SDK** | `@google/genai` (v1.34+) | Google 官方最新 SDK,支持 Thinking Config |
114-
| **样式** | Tailwind CSS | 原子化 CSS,配合排版插件 |
115-
| **数学渲染** | KaTeX + Remark Math | 高性能 LaTeX 公式渲染 |
116-
| **代码高亮** | React Syntax Highlighter | VSCode 风格的代码块高亮 |
117-
| **图标库** | Lucide React | 统一且美观的 SVG 图标集 |
135+
| 模块 | 技术选型 | 说明 |
136+
| :----------- | :------------------------- | :--------------------------------- |
137+
| **核心框架** | React 19 | 使用最新的 React Hooks 和并发特性 |
138+
| **构建工具** | Vite 6 | 极速冷启动与热更新 |
139+
| **AI SDK** | `@google/genai` + `openai` | 同时支持 Gemini 与 OpenAI 兼容接口 |
140+
| **样式** | Tailwind CSS | 原子化 CSS,配合排版插件 |
141+
| **数学渲染** | KaTeX + Remark Math | 高性能 LaTeX 公式渲染 |
142+
| **代码高亮** | React Syntax Highlighter | VSCode 风格的代码块高亮 |
143+
| **图标库** | Lucide React | 统一且美观的 SVG 图标集 |
118144

119145
---
120146

@@ -123,24 +149,29 @@ npm run dev
123149
```bash
124150
Prisma/
125151
├── components/
126-
│ ├── settings/ # 配置面板 (API, Thinking Levels, Model, Github)
127-
│ │ ├── ApiSection.tsx
152+
│ ├── settings/ # 配置面板 (Model, Thinking Levels, Github)
153+
│ │ ├── AddModelForm.tsx
128154
│ │ ├── GithubSection.tsx
129155
│ │ ├── LevelSelect.tsx
156+
│ │ ├── ModelListItem.tsx
130157
│ │ ├── ModelSection.tsx
158+
│ │ ├── modelSettings.ts
159+
│ │ ├── SettingsModal.tsx
131160
│ │ └── ThinkingSection.tsx
161+
│ ├── AttachmentRenderer.tsx # 附件渲染
132162
│ ├── ChatArea.tsx # 消息流渲染
163+
│ ├── ChatInput.tsx # 输入区域
133164
│ ├── ChatMessage.tsx # 单条消息组件
134165
│ ├── ErrorBoundary.tsx # 错误边界
135166
│ ├── Header.tsx # 顶部导航栏
136-
│ ├── InputSection.tsx # 输入区域
167+
│ ├── LazyMarkdownRenderer.tsx # 懒加载 Markdown 渲染器
137168
│ ├── Logo.tsx # Logo 组件
138169
│ ├── MarkdownRenderer.tsx # Markdown 渲染
139-
│ ├── OutputSection.tsx # 推理输出展示
140170
│ ├── ProcessFlow.tsx # 核心:推理流程可视化组件
171+
│ ├── ProcessNode.tsx # 流程节点组件
141172
│ └── Sidebar.tsx # 侧边栏(会话列表)
142173
├── hooks/
143-
│ ├── useDeepThink.ts # 核心:多智能体编排逻辑 (Manager -> Expert -> Synthesis)
174+
│ ├── useDeepThink.ts # 深度思考运行时与 React 状态桥接
144175
│ ├── useDeepThinkState.ts # 深度思考状态管理
145176
│ ├── useAppLogic.ts # 全局状态管理
146177
│ └── useChatSessions.ts # 聊天会话持久化
@@ -149,6 +180,7 @@ Prisma/
149180
│ │ ├── manager.ts # 规划与审查
150181
│ │ ├── expert.ts # 专家生成流
151182
│ │ ├── synthesis.ts # 最终综合流
183+
│ │ ├── orchestrator.ts # 核心:多智能体编排逻辑
152184
│ │ ├── contentBuilder.ts # 内容构建器
153185
│ │ ├── openaiClient.ts # OpenAI 兼容客户端
154186
│ │ └── prompts.ts # 提示词模板
@@ -163,10 +195,9 @@ Prisma/
163195
├── index.tsx # 应用入口
164196
├── index.html # HTML 模板
165197
├── index.css # 全局样式
166-
├── SettingsModal.tsx # 设置弹窗
167-
├── ExpertCard.tsx # 专家状态卡片
168-
├── ProcessNode.tsx # 流程节点组件
169198
├── metadata.json # 应用元数据
199+
├── tests/ # Vitest 与 Testing Library 测试
200+
├── docs/ # 设计与修复计划文档
170201
├── vite.config.ts # Vite 构建配置
171202
└── tsconfig.json # TypeScript 配置
172203
```
@@ -198,4 +229,3 @@ MIT License
198229
## 友链
199230

200231
- [Linux.do](https://linux.do/):也称 L 站,是一个活跃的中文技术社区,围绕 AI、软件开发、资源分享与前沿资讯展开讨论;社区愿景是“新的理想型社区”,社区文化是“真诚、友善、团结、专业,共建你我引以为荣之社区”。
201-

0 commit comments

Comments
 (0)