diff --git a/apps/desktop/src-tauri/src/infrastructure/gemini_service.rs b/apps/desktop/src-tauri/src/infrastructure/gemini_service.rs index a8a5830..6992b49 100644 --- a/apps/desktop/src-tauri/src/infrastructure/gemini_service.rs +++ b/apps/desktop/src-tauri/src/infrastructure/gemini_service.rs @@ -175,8 +175,8 @@ impl Default for RagGroundingConfig { data_store_id: "searchable-model-images_1752827560253".to_string(), // 使用存在的数据存储 model_id: "gemini-2.5-flash".to_string(), temperature: 1.0, - max_output_tokens: 8192, - system_prompt: Some("你是一个短视频情景穿搭分析专家, 根据用户预想的情景输出符合逻辑的情景和模特穿搭描述,必须依据已知的数据返回可能的方案, 并且给出参照的依据;如果没有匹配的数据支持,返回空结果;".to_string()), + max_output_tokens: 1000 * 10, + system_prompt: Some("你是一个短视频情景穿搭分析专家, 根据用户预想的情景检索RAG,然后输出符合逻辑的情景和模特穿搭描述,必须依据已知的数据返回可能的方案, 并且给出参照的依据;如果没有匹配的数据支持,返回空结果;".to_string()), } } } diff --git a/apps/desktop/src/components/ChatMaterialCard.tsx b/apps/desktop/src/components/ChatMaterialCard.tsx index b9c09e6..1255b0c 100644 --- a/apps/desktop/src/components/ChatMaterialCard.tsx +++ b/apps/desktop/src/components/ChatMaterialCard.tsx @@ -5,16 +5,11 @@ import { FileImage, Clock, ExternalLink, - Eye, Play, Volume2, - Image as ImageIcon, - Calendar, - Hash, HardDrive } from 'lucide-react'; import { GroundingSource } from '../types/ragGrounding'; -import { MaterialThumbnail } from './MaterialThumbnail'; /** * 聊天素材卡片属性接口 diff --git a/apps/desktop/src/components/GroundedText.tsx b/apps/desktop/src/components/GroundedText.tsx index c9b6eee..18ccb44 100644 --- a/apps/desktop/src/components/GroundedText.tsx +++ b/apps/desktop/src/components/GroundedText.tsx @@ -5,7 +5,6 @@ import { GroundingMetadata, GroundingSupport, GroundingSource } from '../types/r import ImageCard from './ImageCard'; import ImagePreviewModal from './ImagePreviewModal'; import useImageDownload from '../hooks/useImageDownload'; -import { ReferenceFootnote } from './ReferenceFootnote'; /** * 文字片段信息 @@ -87,12 +86,12 @@ export const GroundedText: React.FC = ({ const sources = groundingMetadata.sources; // 按开始位置排序 - const sortedSupports = [...supports].sort((a, b) => a.segment.start_index - b.segment.start_index); + const sortedSupports = [...supports].sort((a, b) => a.segment.endIndex - b.segment.startIndex); let currentIndex = 0; for (const support of sortedSupports) { - const { start_index, end_index, text: segmentText } = support.segment; + const { startIndex: start_index, endIndex: end_index, text: segmentText } = support.segment; // 添加前面的普通文本 if (currentIndex < start_index) { diff --git a/apps/desktop/src/components/MarkdownParserRenderer.tsx b/apps/desktop/src/components/MarkdownParserRenderer.tsx index 59def70..a56cf0f 100644 --- a/apps/desktop/src/components/MarkdownParserRenderer.tsx +++ b/apps/desktop/src/components/MarkdownParserRenderer.tsx @@ -173,7 +173,7 @@ export const MarkdownParserRenderer: React.FC = ({ onClick={handleNodeClick} style={{ marginLeft: `${depth * 20}px` }} > - {node.children.map((child, index) => renderNode(child, depth + 1))} + {node.children.map((child, _index) => renderNode(child, depth + 1))} {positionInfo}

); @@ -237,7 +237,7 @@ export const MarkdownParserRenderer: React.FC = ({ onClick={handleNodeClick} style={{ marginLeft: `${depth * 20}px` }} > - {node.children.map((child, index) => renderNode(child, depth + 1))} + {node.children.map((child, _index) => renderNode(child, depth + 1))} {positionInfo} ); @@ -250,7 +250,7 @@ export const MarkdownParserRenderer: React.FC = ({ onClick={handleNodeClick} style={{ marginLeft: `${depth * 20}px` }} > - {node.children.map((child, index) => renderNode(child, depth + 1))} + {node.children.map((child, _index) => renderNode(child, depth + 1))} {positionInfo} ); @@ -262,7 +262,7 @@ export const MarkdownParserRenderer: React.FC = ({ className={nodeClasses} onClick={handleNodeClick} > - {node.children.map((child, index) => renderNode(child, depth + 1))} + {node.children.map((child, _index) => renderNode(child, depth + 1))} {positionInfo} ); @@ -274,7 +274,7 @@ export const MarkdownParserRenderer: React.FC = ({ className={nodeClasses} onClick={handleNodeClick} > - {node.children.map((child, index) => renderNode(child, depth + 1))} + {node.children.map((child, _index) => renderNode(child, depth + 1))} {positionInfo} ); @@ -299,7 +299,7 @@ export const MarkdownParserRenderer: React.FC = ({ onClick={handleNodeClick} style={{ marginLeft: `${depth * 20}px` }} > - {node.children.map((child, index) => renderNode(child, depth + 1))} + {node.children.map((child, _index) => renderNode(child, depth + 1))} {positionInfo} ); diff --git a/apps/desktop/src/components/__tests__/EnhancedChatMessageV2.test.tsx b/apps/desktop/src/components/__tests__/EnhancedChatMessageV2.test.tsx index b74d3bf..0f9bb2e 100644 --- a/apps/desktop/src/components/__tests__/EnhancedChatMessageV2.test.tsx +++ b/apps/desktop/src/components/__tests__/EnhancedChatMessageV2.test.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { render, screen, fireEvent } from '@testing-library/react'; import '@testing-library/jest-dom'; import { describe, test, expect, vi } from 'vitest'; diff --git a/apps/desktop/src/examples/EnhancedMarkdownRendererExample.tsx b/apps/desktop/src/examples/EnhancedMarkdownRendererExample.tsx deleted file mode 100644 index 384d1a4..0000000 --- a/apps/desktop/src/examples/EnhancedMarkdownRendererExample.tsx +++ /dev/null @@ -1,287 +0,0 @@ -import React, { useState } from 'react'; -import { EnhancedMarkdownRenderer } from '../components/EnhancedMarkdownRenderer'; -import { GroundingMetadata } from '../types/ragGrounding'; - -/** - * EnhancedMarkdownRenderer使用示例 - * 展示基于MarkdownService的增强Markdown渲染功能 - */ -const EnhancedMarkdownRendererExample: React.FC = () => { - const [content, setContent] = useState(`# 增强Markdown渲染器示例 - -这是一个基于**Tree-sitter MarkdownService**的增强Markdown渲染器,替代了传统的ReactMarkdown。 - -## 🚀 新功能特性 - -### 1. 基于Tree-sitter的精确解析 -- 使用pulldown-cmark进行语法树解析 -- 保留完整的位置信息和原文引用 -- 更准确的语法分析和错误恢复 - -### 2. 实时解析和验证 -- 支持实时解析模式 -- 文档结构验证 -- 解析统计信息显示 - -### 3. 增强的渲染功能 -- 支持所有标准Markdown语法 -- 自定义样式和主题 -- 错误状态和加载状态处理 - -## 📝 语法支持 - -### 文本格式 -- **粗体文本** -- *斜体文本* -- \`内联代码\` -- ~~删除线~~(如果支持) - -### 链接和图片 -- [普通链接](https://example.com) -- [带标题的链接](https://example.com "这是标题") -- ![图片](https://via.placeholder.com/150x100 "示例图片") - -### 列表 - -#### 无序列表 -- 项目1 -- 项目2 - - 子项目2.1 - - 子项目2.2 -- 项目3 - -#### 有序列表 -1. 第一项 -2. 第二项 -3. 第三项 - -### 代码块 - -\`\`\`typescript -// TypeScript代码示例 -interface MarkdownRendererProps { - content: string; - enableMarkdown?: boolean; - showStatistics?: boolean; -} - -const renderer = new MarkdownRenderer(props); -renderer.render(); -\`\`\` - -\`\`\`javascript -// JavaScript代码示例 -function parseMarkdown(content) { - return markdownService.parseMarkdown(content); -} -\`\`\` - -### 引用块 - -> 这是一个引用块。 -> -> 它可以包含多行内容,并且支持**格式化**文本。 - -### 表格(如果支持) - -| 功能 | 状态 | 描述 | -|------|------|------| -| 解析 | ✅ | Tree-sitter解析 | -| 渲染 | ✅ | React组件渲染 | -| 验证 | ✅ | 文档结构验证 | - ---- - -## 🔧 技术实现 - -这个渲染器的核心技术栈: - -1. **后端解析**: Rust + pulldown-cmark -2. **前端渲染**: React + TypeScript -3. **通信层**: Tauri命令系统 -4. **样式**: TailwindCSS - -### 性能优势 -- 更快的解析速度 -- 更低的内存占用 -- 更好的错误处理 -- 实时解析支持 - -## 📊 使用统计 - -当启用统计信息时,您可以看到: -- 解析的节点总数 -- 错误节点数量 -- 解析耗时 -- 文档最大深度 - -这些信息有助于优化文档结构和性能调试。 -`); - - const [enableMarkdown, setEnableMarkdown] = useState(true); - const [showStatistics, setShowStatistics] = useState(false); - const [enableRealTimeParsing, setEnableRealTimeParsing] = useState(false); - const [enableReferences, setEnableReferences] = useState(true); - - // 模拟grounding metadata - const mockGroundingMetadata: GroundingMetadata = { - sources: [ - { - title: 'Markdown语法指南', - uri: 'https://markdown-guide.org', - content: { snippet: 'Markdown是一种轻量级标记语言...' }, - }, - { - title: 'Tree-sitter文档', - uri: 'https://tree-sitter.github.io', - content: { snippet: 'Tree-sitter是一个解析器生成工具...' }, - }, - { - title: 'React组件开发', - uri: 'https://react.dev', - content: { snippet: 'React是一个用于构建用户界面的库...' }, - }, - ], - search_queries: ['markdown parser', 'tree-sitter', 'react components'], - }; - - return ( -
-

增强Markdown渲染器示例

- - {/* 控制面板 */} -
-

控制面板

-
- - - - - - - -
-
- -
- {/* 编辑器 */} -
-

Markdown编辑器

-