From 2ad5835813ddede1f19e5cbafb5a47d971ae2a0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=B7=E5=B0=8F=E5=89=8D?= Date: Sat, 17 Jan 2026 22:33:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0ios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MeAgent/assets/imgs/luoxi.jpg | Bin 0 -> 200414 bytes MeAgent/navigation/Menu.js | 1 + MeAgent/navigation/Screens.js | 30 + MeAgent/src/constants/agentConstants.js | 261 +++++ MeAgent/src/hooks/useAgentChat.js | 391 +++++++ MeAgent/src/hooks/useAgentSessions.js | 141 +++ MeAgent/src/screens/Agent/AgentChatScreen.js | 330 ++++++ .../src/screens/Agent/components/ChatInput.js | 191 ++++ .../Agent/components/MarkdownRenderer.js | 975 ++++++++++++++++++ .../screens/Agent/components/MessageBubble.js | 743 +++++++++++++ .../screens/Agent/components/SessionDrawer.js | 402 ++++++++ .../screens/Agent/components/WelcomeScreen.js | 335 ++++++ MeAgent/src/screens/Agent/components/index.js | 9 + MeAgent/src/screens/Agent/index.js | 5 + MeAgent/src/services/agentService.js | 439 ++++++++ MeAgent/src/store/index.js | 2 + MeAgent/src/store/slices/agentSlice.js | 341 ++++++ mcp_server.py | 50 +- 18 files changed, 4597 insertions(+), 49 deletions(-) create mode 100644 MeAgent/assets/imgs/luoxi.jpg create mode 100644 MeAgent/src/constants/agentConstants.js create mode 100644 MeAgent/src/hooks/useAgentChat.js create mode 100644 MeAgent/src/hooks/useAgentSessions.js create mode 100644 MeAgent/src/screens/Agent/AgentChatScreen.js create mode 100644 MeAgent/src/screens/Agent/components/ChatInput.js create mode 100644 MeAgent/src/screens/Agent/components/MarkdownRenderer.js create mode 100644 MeAgent/src/screens/Agent/components/MessageBubble.js create mode 100644 MeAgent/src/screens/Agent/components/SessionDrawer.js create mode 100644 MeAgent/src/screens/Agent/components/WelcomeScreen.js create mode 100644 MeAgent/src/screens/Agent/components/index.js create mode 100644 MeAgent/src/screens/Agent/index.js create mode 100644 MeAgent/src/services/agentService.js create mode 100644 MeAgent/src/store/slices/agentSlice.js diff --git a/MeAgent/assets/imgs/luoxi.jpg b/MeAgent/assets/imgs/luoxi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4134069e032153be045bc426bcceb4d5e30951f1 GIT binary patch literal 200414 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 + + + ); +} + function ProfileStack(props) { return ( + tool.category !== 'quant') + .map(tool => tool.id); + +// Agent 名称 +export const AGENT_NAME = '洛希'; + +// 欢迎消息模板 +export const WELCOME_MESSAGE_TEMPLATE = (nickname) => `你好${nickname ? ` ${nickname}` : ''}! + +我是**洛希**,你的 AI 投研助手。 + +「洛希」源自洛希极限(Roche Limit)—— 天体力学中描述引力边界的临界点。正如我帮你在市场的混沌中,找到价值与风险的平衡点。 + +**我能做什么?** +• 📊 深度分析股票基本面和技术面 +• 🔥 追踪市场热点和涨停板块 +• 📈 研究行业趋势和投资机会 +• 📰 汇总最新财经新闻和研报 +• 🧮 量化指标计算和回测分析 + +有什么可以帮你的?`; + +// 快捷问题 +export const QUICK_QUESTIONS = [ + '今天有哪些涨停板块?', + '帮我分析一下贵州茅台', + '最近有什么热门概念?', + '查看我的自选股表现', +]; + +// API 配置 +export const AGENT_API_CONFIG = { + // 生产环境 - 使用 api.valuefrontier.cn + BASE_URL: 'https://api.valuefrontier.cn/mcp', + // 开发环境 - 本地测试时使用 + // BASE_URL: 'http://localhost:8900', + ENDPOINTS: { + CHAT_STREAM: '/agent/chat/stream', + SESSIONS: '/agent/sessions', + HISTORY: '/agent/history', + }, + DEFAULT_TIMEOUT: 60000, // 60 秒 + MAX_HISTORY_LIMIT: 100, + MAX_SESSIONS_LIMIT: 50, +}; diff --git a/MeAgent/src/hooks/useAgentChat.js b/MeAgent/src/hooks/useAgentChat.js new file mode 100644 index 00000000..f936ab85 --- /dev/null +++ b/MeAgent/src/hooks/useAgentChat.js @@ -0,0 +1,391 @@ +/** + * useAgentChat Hook + * 处理 Agent 聊天核心逻辑:发送消息、SSE 流式响应、状态更新 + */ + +import { useCallback, useRef, useEffect } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { useAuth } from '../contexts/AuthContext'; +import { streamAgentChat, buildConversationHistory } from '../services/agentService'; +import { + MessageTypes, + SSEEventTypes, +} from '../constants/agentConstants'; +import { + addMessage, + updateLastMessageByType, + removeMessagesByType, + setIsProcessing, + resetStreamState, + appendThinkingContent, + appendDeepThinkingContent, + updateStreamState, + setPlan, + addStepResult, + setCurrentSession, + selectMessages, + selectIsProcessing, + selectCurrentSessionId, + selectSelectedModel, + selectSelectedTools, + selectStreamState, + fetchSessions, +} from '../store/slices/agentSlice'; + +/** + * Agent 聊天 Hook + * + * @returns {Object} 聊天相关的状态和方法 + */ +export const useAgentChat = () => { + const dispatch = useDispatch(); + const { user, subscription } = useAuth(); + + // 从 Redux 获取状态 + const messages = useSelector(selectMessages); + const isProcessing = useSelector(selectIsProcessing); + const currentSessionId = useSelector(selectCurrentSessionId); + const selectedModel = useSelector(selectSelectedModel); + const selectedTools = useSelector(selectSelectedTools); + const streamState = useSelector(selectStreamState); + + // AbortController 引用,用于取消请求 + const abortControllerRef = useRef(null); + + // 使用 ref 追踪累积的内容(避免闭包问题) + const thinkingContentRef = useRef(''); + const deepThinkingContentRef = useRef(''); + const responseContentRef = useRef(''); + const stepResultsRef = useRef([]); + const messagesRef = useRef(messages); + + // 保持 messagesRef 同步 + messagesRef.current = messages; + + // 组件卸载时清理 + useEffect(() => { + return () => { + if (abortControllerRef.current) { + abortControllerRef.current.abort(); + } + }; + }, []); + + /** + * 处理 SSE 事件 + * 使用 ref 追踪累积内容,避免闭包导致的状态过时问题 + */ + const handleSSEEvent = useCallback((event) => { + const { type, data } = event; + + switch (type) { + case SSEEventTypes.STATUS: + // 状态更新(如 "正在思考...") + if (data?.message) { + dispatch(updateLastMessageByType({ + type: MessageTypes.AGENT_THINKING, + updates: { content: data.message }, + })); + } + break; + + case SSEEventTypes.THINKING: + // 普通思考内容 + if (data?.content) { + thinkingContentRef.current += data.content; + dispatch(appendThinkingContent(data.content)); + dispatch(updateLastMessageByType({ + type: MessageTypes.AGENT_THINKING, + updates: { thinkingContent: thinkingContentRef.current }, + })); + } + break; + + case SSEEventTypes.THINKING_START: + // 深度思考开始 + deepThinkingContentRef.current = ''; + dispatch(updateStreamState({ isDeepThinking: true })); + dispatch(addMessage({ + type: MessageTypes.AGENT_DEEP_THINKING, + content: '', + isStreaming: true, + })); + break; + + case SSEEventTypes.THINKING_CHUNK: + // 深度思考内容流 + if (data?.content) { + deepThinkingContentRef.current += data.content; + dispatch(appendDeepThinkingContent(data.content)); + dispatch(updateLastMessageByType({ + type: MessageTypes.AGENT_DEEP_THINKING, + updates: { + content: deepThinkingContentRef.current, + }, + })); + } + break; + + case SSEEventTypes.THINKING_END: + // 深度思考结束 + dispatch(updateStreamState({ isDeepThinking: false })); + dispatch(updateLastMessageByType({ + type: MessageTypes.AGENT_DEEP_THINKING, + updates: { isStreaming: false }, + })); + break; + + case SSEEventTypes.REASONING: + // 推理过程 + if (data?.content) { + thinkingContentRef.current += data.content; + dispatch(appendThinkingContent(data.content)); + } + break; + + case SSEEventTypes.PLAN: + // 执行计划 + stepResultsRef.current = []; + dispatch(setPlan(data)); + dispatch(addMessage({ + type: MessageTypes.AGENT_PLAN, + content: data?.goal || '执行计划', + plan: data, + })); + // 添加执行中消息 + dispatch(addMessage({ + type: MessageTypes.AGENT_EXECUTING, + content: '正在执行...', + stepResults: [], + })); + break; + + case SSEEventTypes.STEP_START: + // 步骤开始 + if (data?.tool) { + dispatch(updateLastMessageByType({ + type: MessageTypes.AGENT_EXECUTING, + updates: { + content: `正在执行: ${data.tool}`, + currentStep: data, + }, + })); + } + break; + + case SSEEventTypes.STEP_COMPLETE: + // 步骤完成 + stepResultsRef.current = [...stepResultsRef.current, data]; + dispatch(addStepResult(data)); + dispatch(updateLastMessageByType({ + type: MessageTypes.AGENT_EXECUTING, + updates: { + stepResults: stepResultsRef.current, + }, + })); + break; + + case SSEEventTypes.SUMMARY_CHUNK: + // 总结流式输出 + if (data?.content) { + // 首次收到内容时创建消息 + if (responseContentRef.current === '') { + responseContentRef.current = data.content; + dispatch(addMessage({ + type: MessageTypes.AGENT_RESPONSE, + content: data.content, + isStreaming: true, + })); + } else { + responseContentRef.current += data.content; + dispatch(updateLastMessageByType({ + type: MessageTypes.AGENT_RESPONSE, + updates: { + content: responseContentRef.current, + }, + })); + } + } + break; + + case SSEEventTypes.SESSION_TITLE: + // 会话标题 + if (data?.title) { + dispatch(setCurrentSession({ + sessionId: data.session_id || currentSessionId, + title: data.title, + })); + } + break; + + case SSEEventTypes.DONE: + // 完成 - 清理所有中间状态消息,确保动画停止 + dispatch(removeMessagesByType(MessageTypes.AGENT_THINKING)); + dispatch(removeMessagesByType(MessageTypes.AGENT_EXECUTING)); + dispatch(updateLastMessageByType({ + type: MessageTypes.AGENT_DEEP_THINKING, + updates: { isStreaming: false }, + })); + dispatch(updateLastMessageByType({ + type: MessageTypes.AGENT_RESPONSE, + updates: { isStreaming: false }, + })); + dispatch(setIsProcessing(false)); + // 重新加载会话列表 + if (user?.id) { + dispatch(fetchSessions(user.id)); + } + break; + + case SSEEventTypes.ERROR: + // 错误 - 移除 thinking 消息后再添加错误消息 + dispatch(removeMessagesByType(MessageTypes.AGENT_THINKING)); + dispatch(removeMessagesByType(MessageTypes.AGENT_DEEP_THINKING)); + dispatch(removeMessagesByType(MessageTypes.AGENT_EXECUTING)); + dispatch(addMessage({ + type: MessageTypes.ERROR, + content: data?.message || '发生错误,请重试', + })); + dispatch(setIsProcessing(false)); + break; + + case 'stream_end': + // 流结束 - 确保所有动画停止 + dispatch(removeMessagesByType(MessageTypes.AGENT_THINKING)); + dispatch(removeMessagesByType(MessageTypes.AGENT_EXECUTING)); + dispatch(updateLastMessageByType({ + type: MessageTypes.AGENT_DEEP_THINKING, + updates: { isStreaming: false }, + })); + dispatch(updateLastMessageByType({ + type: MessageTypes.AGENT_RESPONSE, + updates: { isStreaming: false }, + })); + dispatch(setIsProcessing(false)); + break; + + case 'aborted': + // 请求被取消 - 移除所有中间状态消息,停止动画 + dispatch(removeMessagesByType(MessageTypes.AGENT_THINKING)); + dispatch(removeMessagesByType(MessageTypes.AGENT_DEEP_THINKING)); + dispatch(removeMessagesByType(MessageTypes.AGENT_EXECUTING)); + dispatch(updateLastMessageByType({ + type: MessageTypes.AGENT_RESPONSE, + updates: { isStreaming: false }, + })); + dispatch(setIsProcessing(false)); + break; + + default: + console.log('[useAgentChat] 未处理的事件类型:', type, data); + } + }, [dispatch, currentSessionId, user?.id]); + + /** + * 发送消息 + */ + const sendMessage = useCallback(async (inputText) => { + if (!inputText?.trim() || isProcessing) return; + + const messageText = inputText.trim(); + + // 创建并取消之前的请求 + if (abortControllerRef.current) { + abortControllerRef.current.abort(); + } + abortControllerRef.current = new AbortController(); + + // 重置 ref 追踪值 + thinkingContentRef.current = ''; + deepThinkingContentRef.current = ''; + responseContentRef.current = ''; + stepResultsRef.current = []; + + // 添加用户消息 + dispatch(addMessage({ + type: MessageTypes.USER, + content: messageText, + })); + + // 重置流式状态 + dispatch(resetStreamState()); + dispatch(setIsProcessing(true)); + + // 添加思考中消息 + dispatch(addMessage({ + type: MessageTypes.AGENT_THINKING, + content: '正在思考...', + })); + + try { + // 构建请求参数(使用 ref 获取最新 messages,避免依赖变化) + const params = { + message: messageText, + conversationHistory: buildConversationHistory(messagesRef.current), + userId: user?.id || 'anonymous', + userNickname: user?.nickname || user?.username || '', + userAvatar: user?.avatar || '', + subscriptionType: subscription?.type || 'free', // 从 subscription 对象获取 + sessionId: currentSessionId, + model: selectedModel, + tools: selectedTools, + }; + + // 发起 SSE 请求 + await streamAgentChat(params, handleSSEEvent, abortControllerRef.current.signal); + + } catch (error) { + if (error.name !== 'AbortError') { + console.error('[useAgentChat] 发送消息失败:', error); + // 移除 thinking 相关消息 + dispatch(removeMessagesByType(MessageTypes.AGENT_THINKING)); + dispatch(removeMessagesByType(MessageTypes.AGENT_DEEP_THINKING)); + dispatch(addMessage({ + type: MessageTypes.ERROR, + content: error.message || '网络错误,请检查网络连接后重试', + })); + } + dispatch(setIsProcessing(false)); + } + }, [dispatch, isProcessing, currentSessionId, selectedModel, selectedTools, user?.id, user?.nickname, user?.username, user?.avatar, subscription?.type, handleSSEEvent]); + + /** + * 取消当前请求 + */ + const cancelRequest = useCallback(() => { + if (abortControllerRef.current) { + abortControllerRef.current.abort(); + dispatch(setIsProcessing(false)); + } + }, [dispatch]); + + /** + * 重试最后一条消息 + */ + const retryLastMessage = useCallback(() => { + // 找到最后一条用户消息 + const lastUserMessage = [...messages].reverse().find(m => m.type === MessageTypes.USER); + if (lastUserMessage) { + // 移除错误消息和 AI 响应 + // 这里简化处理,实际可能需要更精细的逻辑 + sendMessage(lastUserMessage.content); + } + }, [messages, sendMessage]); + + return { + // 状态 + messages, + isProcessing, + streamState, + currentSessionId, + selectedModel, + selectedTools, + + // 方法 + sendMessage, + cancelRequest, + retryLastMessage, + }; +}; + +export default useAgentChat; diff --git a/MeAgent/src/hooks/useAgentSessions.js b/MeAgent/src/hooks/useAgentSessions.js new file mode 100644 index 00000000..35c99694 --- /dev/null +++ b/MeAgent/src/hooks/useAgentSessions.js @@ -0,0 +1,141 @@ +/** + * useAgentSessions Hook + * 处理 Agent 会话管理:会话列表、切换会话、新建会话 + */ + +import { useCallback, useEffect } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { useAuth } from '../contexts/AuthContext'; +import { + fetchSessions, + fetchSessionHistory, + initNewSession, + clearCurrentSession, + setSessionDrawerOpen, + selectSessions, + selectGroupedSessions, + selectSessionsLoading, + selectCurrentSessionId, + selectCurrentSessionTitle, + selectIsSessionDrawerOpen, +} from '../store/slices/agentSlice'; + +/** + * Agent 会话管理 Hook + * + * @returns {Object} 会话相关的状态和方法 + */ +export const useAgentSessions = () => { + const dispatch = useDispatch(); + const { user } = useAuth(); + + // 从 Redux 获取状态 + const sessions = useSelector(selectSessions); + const groupedSessions = useSelector(selectGroupedSessions); + const isLoading = useSelector(selectSessionsLoading); + const currentSessionId = useSelector(selectCurrentSessionId); + const currentSessionTitle = useSelector(selectCurrentSessionTitle); + const isDrawerOpen = useSelector(selectIsSessionDrawerOpen); + + /** + * 加载会话列表 + */ + const loadSessions = useCallback(() => { + if (user?.id) { + dispatch(fetchSessions(String(user.id))); + } + }, [dispatch, user?.id]); + + /** + * 切换到指定会话 + */ + const switchSession = useCallback((sessionId) => { + if (sessionId && sessionId !== currentSessionId) { + dispatch(fetchSessionHistory(sessionId)); + dispatch(setSessionDrawerOpen(false)); + } + }, [dispatch, currentSessionId]); + + /** + * 新建会话 + */ + const createNewSession = useCallback(() => { + dispatch(initNewSession({ nickname: user?.nickname || user?.username })); + dispatch(setSessionDrawerOpen(false)); + }, [dispatch, user?.nickname, user?.username]); + + /** + * 打开会话抽屉 + */ + const openDrawer = useCallback(() => { + dispatch(setSessionDrawerOpen(true)); + }, [dispatch]); + + /** + * 关闭会话抽屉 + */ + const closeDrawer = useCallback(() => { + dispatch(setSessionDrawerOpen(false)); + }, [dispatch]); + + /** + * 切换会话抽屉 + */ + const toggleDrawer = useCallback(() => { + dispatch(setSessionDrawerOpen(!isDrawerOpen)); + }, [dispatch, isDrawerOpen]); + + /** + * 搜索会话 + */ + const searchSessions = useCallback((keyword) => { + if (!keyword?.trim()) { + return groupedSessions; + } + + const lowerKeyword = keyword.toLowerCase(); + + // 过滤匹配的会话 + const filteredGroups = groupedSessions + .map(group => ({ + ...group, + sessions: group.sessions.filter(session => + (session.title || '').toLowerCase().includes(lowerKeyword) || + (session.session_id || '').toLowerCase().includes(lowerKeyword) + ), + })) + .filter(group => group.sessions.length > 0); + + return filteredGroups; + }, [groupedSessions]); + + /** + * 初始化:加载会话列表 + */ + useEffect(() => { + if (user?.id) { + loadSessions(); + } + }, [user?.id, loadSessions]); + + return { + // 状态 + sessions, + groupedSessions, + isLoading, + currentSessionId, + currentSessionTitle, + isDrawerOpen, + + // 方法 + loadSessions, + switchSession, + createNewSession, + openDrawer, + closeDrawer, + toggleDrawer, + searchSessions, + }; +}; + +export default useAgentSessions; diff --git a/MeAgent/src/screens/Agent/AgentChatScreen.js b/MeAgent/src/screens/Agent/AgentChatScreen.js new file mode 100644 index 00000000..19210204 --- /dev/null +++ b/MeAgent/src/screens/Agent/AgentChatScreen.js @@ -0,0 +1,330 @@ +/** + * AgentChatScreen + * AI 投研助手主聊天屏幕 + */ + +import React, { useEffect, useRef, useCallback, useState } from 'react'; +import { + View, + Text, + StyleSheet, + FlatList, + KeyboardAvoidingView, + Platform, + TouchableOpacity, + StatusBar, + SafeAreaView, + Image, +} from 'react-native'; +import { LinearGradient } from 'expo-linear-gradient'; +import { useDispatch, useSelector } from 'react-redux'; + +import { useAuth } from '../../contexts/AuthContext'; +import { useAgentChat } from '../../hooks/useAgentChat'; +import { useAgentSessions } from '../../hooks/useAgentSessions'; +import { + MessageBubble, + ChatInput, + WelcomeScreen, + SessionDrawer, +} from './components'; +import { + AgentTheme, + MessageTypes, + AGENT_NAME, +} from '../../constants/agentConstants'; + +// 洛希头像 +const LuoxiAvatar = require('../../../assets/imgs/luoxi.jpg'); +import { + initNewSession, + selectMessages, +} from '../../store/slices/agentSlice'; + +/** + * 头部导航栏 + */ +const Header = ({ title, onMenuPress, onNewPress }) => ( + + + + + + + + + + + {title || AGENT_NAME} + + + + + + + + +); + +/** + * AgentChatScreen 主组件 + */ +const AgentChatScreen = ({ navigation }) => { + const dispatch = useDispatch(); + const { user, isLoggedIn } = useAuth(); + const flatListRef = useRef(null); + + // 智能滚动:跟踪用户是否在底部附近 + const isNearBottomRef = useRef(true); + const contentHeightRef = useRef(0); + const scrollOffsetRef = useRef(0); + const layoutHeightRef = useRef(0); + + // 使用自定义 Hooks + const { + messages, + isProcessing, + sendMessage, + cancelRequest, + } = useAgentChat(); + + const { + groupedSessions, + isLoading: sessionsLoading, + currentSessionId, + currentSessionTitle, + isDrawerOpen, + openDrawer, + closeDrawer, + switchSession, + createNewSession, + } = useAgentSessions(); + + /** + * 初始化:如果没有消息,显示欢迎界面 + */ + useEffect(() => { + if (messages.length === 0) { + dispatch(initNewSession({ nickname: user?.nickname || user?.username })); + } + }, []); + + /** + * 智能滚动:只有当用户在底部附近时才自动滚动 + */ + useEffect(() => { + if (messages.length > 0 && flatListRef.current && isNearBottomRef.current) { + setTimeout(() => { + flatListRef.current?.scrollToEnd({ animated: true }); + }, 100); + } + }, [messages]); + + /** + * 处理滚动事件,检测用户是否在底部附近 + */ + const handleScroll = useCallback((event) => { + const { contentOffset, contentSize, layoutMeasurement } = event.nativeEvent; + scrollOffsetRef.current = contentOffset.y; + contentHeightRef.current = contentSize.height; + layoutHeightRef.current = layoutMeasurement.height; + + // 判断是否在底部附近(距离底部 100 像素以内) + const distanceFromBottom = contentSize.height - layoutMeasurement.height - contentOffset.y; + isNearBottomRef.current = distanceFromBottom < 100; + }, []); + + /** + * 处理内容大小变化 + */ + const handleContentSizeChange = useCallback((width, height) => { + // 只有当用户在底部附近时才自动滚动 + if (isNearBottomRef.current && flatListRef.current) { + flatListRef.current.scrollToEnd({ animated: true }); + } + }, []); + + /** + * 处理快捷问题点击 + */ + const handleQuickQuestion = useCallback((question) => { + // 发送消息时重置滚动状态,确保自动滚动到底部 + isNearBottomRef.current = true; + sendMessage(question); + }, [sendMessage]); + + /** + * 处理发送消息(包装 sendMessage 以重置滚动状态) + */ + const handleSendMessage = useCallback((text) => { + isNearBottomRef.current = true; + sendMessage(text); + }, [sendMessage]); + + /** + * 处理新建对话 + */ + const handleNewSession = useCallback(() => { + isNearBottomRef.current = true; + createNewSession(); + }, [createNewSession]); + + /** + * 渲染消息项 + */ + const renderMessageItem = useCallback(({ item }) => ( + + + + ), []); + + /** + * 消息列表 Key 提取器 + */ + const keyExtractor = useCallback((item) => item.id?.toString() || Math.random().toString(), []); + + // 判断是否显示欢迎屏幕(只有一条欢迎消息时) + const showWelcome = messages.length <= 1 && + messages[0]?.type === MessageTypes.AGENT_RESPONSE; + + return ( + + + + {/* 头部 */} +

+ + {/* 主体内容 */} + + {showWelcome ? ( + /* 欢迎屏幕 */ + + ) : ( + /* 消息列表 */ + + )} + + {/* 输入框 */} + + + + {/* 会话抽屉 */} + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: AgentTheme.background, + }, + + // 头部 + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingHorizontal: 16, + paddingVertical: 12, + borderBottomWidth: 1, + borderBottomColor: AgentTheme.border, + }, + headerButton: { + width: 40, + height: 40, + borderRadius: 20, + backgroundColor: AgentTheme.cardBg, + justifyContent: 'center', + alignItems: 'center', + }, + headerButtonText: { + fontSize: 20, + color: AgentTheme.textPrimary, + }, + headerCenter: { + flexDirection: 'row', + alignItems: 'center', + flex: 1, + justifyContent: 'center', + marginHorizontal: 12, + }, + headerAvatarContainer: { + width: 36, + height: 36, + borderRadius: 18, + overflow: 'hidden', + marginRight: 10, + borderWidth: 2, + borderColor: 'rgba(139, 92, 246, 0.5)', + }, + headerAvatar: { + width: '100%', + height: '100%', + resizeMode: 'cover', + }, + headerTitle: { + fontSize: 17, + fontWeight: '600', + color: AgentTheme.textPrimary, + maxWidth: 200, + flexShrink: 1, + }, + + // 内容区域 + content: { + flex: 1, + }, + + // 消息列表 + messageList: { + flex: 1, + }, + messageListContent: { + paddingVertical: 16, + }, +}); + +export default AgentChatScreen; diff --git a/MeAgent/src/screens/Agent/components/ChatInput.js b/MeAgent/src/screens/Agent/components/ChatInput.js new file mode 100644 index 00000000..93f19407 --- /dev/null +++ b/MeAgent/src/screens/Agent/components/ChatInput.js @@ -0,0 +1,191 @@ +/** + * ChatInput 组件 + * 聊天输入框,支持发送消息 + */ + +import React, { memo, useState, useRef } from 'react'; +import { + View, + TextInput, + TouchableOpacity, + StyleSheet, + Keyboard, + Platform, + ActivityIndicator, +} from 'react-native'; +import { BlurView } from 'expo-blur'; +import { AgentTheme } from '../../../constants/agentConstants'; + +/** + * 发送按钮图标 + */ +const SendIcon = ({ color = '#FFFFFF', size = 20 }) => ( + + + +); + +/** + * 停止按钮图标 + */ +const StopIcon = ({ color = '#FFFFFF', size = 16 }) => ( + +); + +/** + * ChatInput 组件 + */ +const ChatInput = ({ + onSend, + onCancel, + isProcessing = false, + placeholder = '输入消息...', + disabled = false, +}) => { + const [inputText, setInputText] = useState(''); + const inputRef = useRef(null); + + /** + * 处理发送 + */ + const handleSend = () => { + if (inputText.trim() && !isProcessing && !disabled) { + onSend(inputText); + setInputText(''); + Keyboard.dismiss(); + } + }; + + /** + * 处理取消 + */ + const handleCancel = () => { + if (isProcessing && onCancel) { + onCancel(); + } + }; + + /** + * 处理按键提交 + */ + const handleSubmitEditing = () => { + handleSend(); + }; + + const canSend = inputText.trim().length > 0 && !isProcessing && !disabled; + + return ( + + + + + + + {isProcessing ? ( + + + + ) : ( + + + + )} + + + ); +}; + +const styles = StyleSheet.create({ + container: { + borderTopWidth: 1, + borderTopColor: AgentTheme.border, + paddingHorizontal: 16, + paddingVertical: 12, + paddingBottom: Platform.OS === 'ios' ? 28 : 12, + }, + inputWrapper: { + flexDirection: 'row', + alignItems: 'flex-end', + }, + inputContainer: { + flex: 1, + backgroundColor: AgentTheme.backgroundSecondary, + borderRadius: 20, + borderWidth: 1, + borderColor: AgentTheme.border, + paddingHorizontal: 16, + paddingVertical: Platform.OS === 'ios' ? 10 : 6, + marginRight: 10, + minHeight: 40, + maxHeight: 120, + }, + input: { + color: AgentTheme.textPrimary, + fontSize: 15, + lineHeight: 20, + maxHeight: 100, + }, + sendButton: { + width: 40, + height: 40, + borderRadius: 20, + justifyContent: 'center', + alignItems: 'center', + }, + sendButtonActive: { + backgroundColor: AgentTheme.accent, + }, + sendButtonDisabled: { + backgroundColor: AgentTheme.textMuted, + opacity: 0.5, + }, + cancelButton: { + backgroundColor: AgentTheme.error, + }, +}); + +export default memo(ChatInput); diff --git a/MeAgent/src/screens/Agent/components/MarkdownRenderer.js b/MeAgent/src/screens/Agent/components/MarkdownRenderer.js new file mode 100644 index 00000000..1a2a3d63 --- /dev/null +++ b/MeAgent/src/screens/Agent/components/MarkdownRenderer.js @@ -0,0 +1,975 @@ +/** + * MarkdownRenderer 组件 + * 支持 Markdown 渲染和 ECharts 图表渲染 + */ + +import React, { memo, useMemo, useState, useCallback } from 'react'; +import { + View, + Text, + StyleSheet, + ScrollView, + TouchableOpacity, + Dimensions, + ActivityIndicator, +} from 'react-native'; +import { WebView } from 'react-native-webview'; +import { AgentTheme } from '../../../constants/agentConstants'; + +const { width: SCREEN_WIDTH } = Dimensions.get('window'); +const CHART_WIDTH = SCREEN_WIDTH - 48; // 减去边距 +const CHART_HEIGHT = 300; + +/** + * 简单的 Markdown 解析器 + * 支持:标题、粗体、斜体、代码块、链接、列表、表格、Mermaid 图 + */ +const parseMarkdown = (text) => { + if (!text) return []; + + const parts = []; + let remaining = text; + + // 匹配所有特殊代码块:echarts, mermaid + const codeBlockRegex = /```(echarts|mermaid)\s*\n?([\s\S]*?)```/g; + let lastIndex = 0; + let match; + + while ((match = codeBlockRegex.exec(text)) !== null) { + // 添加代码块前的文本 + if (match.index > lastIndex) { + const textBefore = text.substring(lastIndex, match.index); + parts.push({ type: 'markdown', content: textBefore }); + } + + const blockType = match[1]; // echarts 或 mermaid + let content = match[2].trim(); + + // 处理转义字符 + if (content.includes('\\n')) { + content = content.replace(/\\n/g, '\n'); + } + + if (blockType === 'echarts') { + parts.push({ type: 'chart', content }); + } else if (blockType === 'mermaid') { + parts.push({ type: 'mermaid', content }); + } + + lastIndex = match.index + match[0].length; + } + + // 添加剩余文本 + if (lastIndex < text.length) { + parts.push({ type: 'markdown', content: text.substring(lastIndex) }); + } + + // 如果没有匹配到任何内容,返回原始文本 + if (parts.length === 0) { + parts.push({ type: 'markdown', content: text }); + } + + return parts; +}; + +/** + * 解析表格 + */ +const parseTable = (lines, startIndex) => { + const rows = []; + let i = startIndex; + + while (i < lines.length && lines[i].trim().startsWith('|')) { + const line = lines[i].trim(); + // 跳过分隔行 |---|---| + if (!/^\|[\s-:|]+\|$/.test(line)) { + const cells = line + .split('|') + .filter((cell, idx, arr) => idx > 0 && idx < arr.length - 1) + .map(cell => cell.trim()); + if (cells.length > 0) { + rows.push(cells); + } + } + i++; + } + + return { rows, endIndex: i }; +}; + +/** + * 表格组件 + */ +const TableView = memo(({ rows }) => { + if (!rows || rows.length === 0) return null; + + const header = rows[0]; + const body = rows.slice(1); + + return ( + + + + {/* 表头 */} + + {header.map((cell, idx) => ( + + {cell} + + ))} + + {/* 表体 */} + {body.map((row, rowIdx) => ( + + {row.map((cell, cellIdx) => ( + + {cell} + + ))} + + ))} + + + + ); +}); + +/** + * Markdown 文本渲染器(支持表格) + */ +const MarkdownText = memo(({ content }) => { + const lines = content.split('\n'); + const elements = []; + let i = 0; + + while (i < lines.length) { + const line = lines[i]; + + // 检测表格开始 + if (line.trim().startsWith('|') && line.trim().endsWith('|')) { + const { rows, endIndex } = parseTable(lines, i); + if (rows.length > 1) { + elements.push(); + i = endIndex; + continue; + } + } + + elements.push(); + i++; + } + + return ( + + {elements} + + ); +}); + +/** + * 单行 Markdown 渲染 + */ +const MarkdownLine = memo(({ line }) => { + // 空行 + if (!line.trim()) { + return ; + } + + // 标题 (# ## ### ####) + const headerMatch = line.match(/^(#{1,4})\s+(.*)$/); + if (headerMatch) { + const level = headerMatch[1].length; + const text = headerMatch[2]; + const headerStyles = [ + styles.h1, + styles.h2, + styles.h3, + styles.h4, + ]; + return ( + + {renderInlineStyles(text)} + + ); + } + + // 无序列表 (- 或 *) + const listMatch = line.match(/^[\s]*[-*]\s+(.*)$/); + if (listMatch) { + return ( + + + {renderInlineStyles(listMatch[1])} + + ); + } + + // 有序列表 (1. 2. 3.) + const orderedListMatch = line.match(/^[\s]*(\d+)\.\s+(.*)$/); + if (orderedListMatch) { + return ( + + {orderedListMatch[1]}. + {renderInlineStyles(orderedListMatch[2])} + + ); + } + + // 代码块 (```) + if (line.startsWith('```')) { + return null; // 代码块在外层处理 + } + + // 引用 (>) + const quoteMatch = line.match(/^>\s*(.*)$/); + if (quoteMatch) { + return ( + + {renderInlineStyles(quoteMatch[1])} + + ); + } + + // 分隔线 (--- or ***) + if (/^[-*]{3,}$/.test(line.trim())) { + return ; + } + + // 普通段落 + return ( + {renderInlineStyles(line)} + ); +}); + +/** + * 渲染行内样式(粗体、斜体、代码、链接) + */ +const renderInlineStyles = (text) => { + if (!text) return null; + + const elements = []; + let key = 0; + + // 为简化实现,这里只做基本渲染 + // 完整实现需要递归解析 + elements.push( + + {text + .replace(/\*\*(.+?)\*\*/g, (_, m) => m) // 移除粗体标记(简化) + .replace(/\*(.+?)\*/g, (_, m) => m) // 移除斜体标记 + .replace(/`([^`]+)`/g, (_, m) => `[${m}]`) // 标记代码 + } + + ); + + return elements; +}; + +/** + * 生成 ECharts HTML + */ +const generateEChartsHTML = (option, width, height) => { + // 深色主题配色 + const darkTheme = { + backgroundColor: 'transparent', + textStyle: { + color: '#E2E8F0' + }, + title: { + textStyle: { + color: '#F8FAFC' + }, + subtextStyle: { + color: '#94A3B8' + } + }, + legend: { + textStyle: { + color: '#CBD5E1' + } + }, + xAxis: { + axisLine: { + lineStyle: { + color: '#475569' + } + }, + axisLabel: { + color: '#94A3B8' + }, + splitLine: { + lineStyle: { + color: '#334155' + } + } + }, + yAxis: { + axisLine: { + lineStyle: { + color: '#475569' + } + }, + axisLabel: { + color: '#94A3B8' + }, + splitLine: { + lineStyle: { + color: '#334155' + } + } + } + }; + + return ` + + + + + + + + + +
+ + + + `; +}; + +/** + * ECharts 图表组件 + * 使用 WebView 渲染真实的 ECharts 图表 + */ +const EChartsView = memo(({ config }) => { + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + const [showData, setShowData] = useState(false); + + // 解析图表配置 + const { chartOption, chartTitle, chartData } = useMemo(() => { + try { + const parsed = JSON.parse(config); + return { + chartOption: config, + chartTitle: parsed?.title?.text || '图表', + chartData: parsed, + }; + } catch (e) { + return { + chartOption: null, + chartTitle: '图表', + chartData: null, + error: e.message, + }; + } + }, [config]); + + const handleMessage = useCallback((event) => { + try { + const data = JSON.parse(event.nativeEvent.data); + if (data.type === 'loaded') { + setIsLoading(false); + } else if (data.type === 'error') { + setError(data.message); + setIsLoading(false); + } + } catch (e) { + // 忽略解析错误 + } + }, []); + + // 如果配置解析失败,显示错误 + if (!chartOption) { + return ( + + + 📊 + 图表解析失败 + + 无法解析图表配置 + + ); + } + + const html = generateEChartsHTML(chartOption, CHART_WIDTH, CHART_HEIGHT); + + return ( + + + 📊 + {chartTitle} + setShowData(!showData)} + style={styles.chartToggle} + > + + {showData ? '显示图表' : '查看数据'} + + + + + {error ? ( + + 图表渲染失败: {error} + + ) : showData ? ( + // 显示数据视图 + + + {chartData?.series?.map((series, idx) => ( + + {series.name || `系列 ${idx + 1}`} + {series.data?.slice(0, 10).map((item, i) => ( + + {typeof item === 'object' ? `${item.name}: ${item.value}` : item} + + ))} + {series.data?.length > 10 && ( + ...还有 {series.data.length - 10} 项 + )} + + ))} + + + ) : ( + // 显示图表 + + {isLoading && ( + + + 加载图表中... + + )} + + + )} + + ); +}); + +/** + * 生成 Mermaid HTML + */ +const generateMermaidHTML = (code, width) => { + return ` + + + + + + + + + +
+
+${code}
+        
+
+ + + + `; +}; + +/** + * Mermaid 图表组件 + */ +const MermaidView = memo(({ code }) => { + const [height, setHeight] = useState(200); + const [isLoading, setIsLoading] = useState(true); + + const handleMessage = useCallback((event) => { + try { + const data = JSON.parse(event.nativeEvent.data); + if (data.type === 'loaded') { + setIsLoading(false); + if (data.height) { + setHeight(Math.min(data.height, 400)); // 最大高度 400 + } + } + } catch (e) { + // 忽略解析错误 + } + }, []); + + const html = generateMermaidHTML(code, CHART_WIDTH); + + return ( + + + 📊 + 流程图 + + + {isLoading && ( + + + 加载中... + + )} + + + + ); +}); + +/** + * MarkdownRenderer 主组件 + */ +const MarkdownRenderer = ({ content }) => { + const parts = useMemo(() => parseMarkdown(content), [content]); + + return ( + + {parts.map((part, index) => { + if (part.type === 'chart') { + return ; + } + if (part.type === 'mermaid') { + return ; + } + return ; + })} + + ); +}; + +const styles = StyleSheet.create({ + container: { + // 不使用 flex: 1,让内容自适应 + }, + markdownContainer: { + // 不使用 flex: 1,让内容自适应 + }, + + // 文本样式 + text: { + color: AgentTheme.textPrimary, + fontSize: 15, + lineHeight: 22, + }, + paragraph: { + color: AgentTheme.textPrimary, + fontSize: 15, + lineHeight: 22, + marginBottom: 8, + }, + emptyLine: { + height: 8, + }, + + // 标题 + headerBase: { + color: AgentTheme.textPrimary, + fontWeight: '600', + marginTop: 16, + marginBottom: 8, + }, + h1: { + fontSize: 22, + }, + h2: { + fontSize: 20, + }, + h3: { + fontSize: 18, + }, + h4: { + fontSize: 16, + }, + + // 列表 + listItem: { + flexDirection: 'row', + alignItems: 'flex-start', + marginBottom: 4, + }, + listBullet: { + color: AgentTheme.accent, + fontSize: 14, + marginRight: 8, + marginTop: 2, + }, + listNumber: { + color: AgentTheme.accent, + fontSize: 14, + marginRight: 8, + minWidth: 20, + }, + listText: { + color: AgentTheme.textPrimary, + fontSize: 15, + lineHeight: 22, + flex: 1, + }, + + // 引用 + quote: { + borderLeftWidth: 3, + borderLeftColor: AgentTheme.accent, + paddingLeft: 12, + marginVertical: 8, + backgroundColor: 'rgba(139, 92, 246, 0.1)', + paddingVertical: 8, + borderRadius: 4, + }, + quoteText: { + color: AgentTheme.textSecondary, + fontSize: 14, + fontStyle: 'italic', + }, + + // 行内样式 + bold: { + fontWeight: '700', + }, + italic: { + fontStyle: 'italic', + }, + inlineCode: { + fontFamily: 'monospace', + backgroundColor: 'rgba(139, 92, 246, 0.2)', + paddingHorizontal: 4, + borderRadius: 3, + fontSize: 13, + color: AgentTheme.accent, + }, + + // 分隔线 + hr: { + height: 1, + backgroundColor: AgentTheme.border, + marginVertical: 16, + }, + + // 图表容器 + chartContainer: { + backgroundColor: 'rgba(99, 102, 241, 0.1)', + borderRadius: 12, + borderWidth: 1, + borderColor: 'rgba(99, 102, 241, 0.3)', + padding: 12, + marginVertical: 12, + overflow: 'hidden', + }, + chartHeader: { + flexDirection: 'row', + alignItems: 'center', + marginBottom: 8, + }, + chartIcon: { + fontSize: 18, + marginRight: 8, + }, + chartTitle: { + color: AgentTheme.accentSecondary, + fontSize: 15, + fontWeight: '600', + flex: 1, + }, + chartToggle: { + paddingHorizontal: 12, + paddingVertical: 4, + backgroundColor: 'rgba(99, 102, 241, 0.2)', + borderRadius: 12, + }, + chartToggleText: { + color: AgentTheme.accentSecondary, + fontSize: 12, + }, + + // WebView 图表 + chartWebViewContainer: { + height: CHART_HEIGHT, + borderRadius: 8, + overflow: 'hidden', + backgroundColor: 'rgba(15, 23, 42, 0.5)', + }, + chartWebView: { + flex: 1, + backgroundColor: 'transparent', + }, + chartLoading: { + position: 'absolute', + top: 0, + left: 0, + right: 0, + bottom: 0, + justifyContent: 'center', + alignItems: 'center', + zIndex: 1, + }, + chartLoadingText: { + color: AgentTheme.textSecondary, + fontSize: 12, + marginTop: 8, + }, + + // 图表错误 + chartErrorContainer: { + padding: 20, + alignItems: 'center', + }, + chartError: { + color: '#F87171', + fontSize: 13, + textAlign: 'center', + }, + + // 数据展示 + chartDataScroll: { + maxHeight: 200, + marginTop: 8, + }, + chartDataContainer: { + flexDirection: 'row', + }, + seriesContainer: { + marginRight: 16, + minWidth: 120, + }, + seriesName: { + color: AgentTheme.textPrimary, + fontSize: 13, + fontWeight: '600', + marginBottom: 4, + }, + dataItem: { + color: AgentTheme.textSecondary, + fontSize: 12, + marginVertical: 1, + }, + dataMore: { + color: AgentTheme.textMuted, + fontSize: 11, + marginTop: 4, + }, + + // 表格样式 + tableContainer: { + marginVertical: 12, + borderRadius: 8, + overflow: 'hidden', + borderWidth: 1, + borderColor: AgentTheme.border, + }, + tableHeader: { + flexDirection: 'row', + backgroundColor: 'rgba(99, 102, 241, 0.15)', + }, + tableHeaderCell: { + backgroundColor: 'rgba(99, 102, 241, 0.15)', + }, + tableHeaderText: { + color: AgentTheme.textPrimary, + fontSize: 13, + fontWeight: '600', + }, + tableRow: { + flexDirection: 'row', + borderTopWidth: 1, + borderTopColor: AgentTheme.border, + }, + tableRowEven: { + backgroundColor: 'rgba(30, 41, 59, 0.5)', + }, + tableCell: { + minWidth: 100, + paddingHorizontal: 12, + paddingVertical: 10, + }, + tableCellText: { + color: AgentTheme.textSecondary, + fontSize: 13, + lineHeight: 18, + }, + + // Mermaid 样式 + mermaidContainer: { + backgroundColor: 'rgba(139, 92, 246, 0.1)', + borderRadius: 12, + borderWidth: 1, + borderColor: 'rgba(139, 92, 246, 0.3)', + padding: 12, + marginVertical: 12, + overflow: 'hidden', + }, + mermaidHeader: { + flexDirection: 'row', + alignItems: 'center', + marginBottom: 8, + }, + mermaidIcon: { + fontSize: 18, + marginRight: 8, + }, + mermaidTitle: { + color: AgentTheme.accent, + fontSize: 15, + fontWeight: '600', + }, + mermaidWebViewContainer: { + borderRadius: 8, + overflow: 'hidden', + backgroundColor: 'rgba(15, 23, 42, 0.5)', + }, + mermaidWebView: { + flex: 1, + backgroundColor: 'transparent', + }, +}); + +export default memo(MarkdownRenderer); diff --git a/MeAgent/src/screens/Agent/components/MessageBubble.js b/MeAgent/src/screens/Agent/components/MessageBubble.js new file mode 100644 index 00000000..b1f5543b --- /dev/null +++ b/MeAgent/src/screens/Agent/components/MessageBubble.js @@ -0,0 +1,743 @@ +/** + * MessageBubble 组件 + * 消息气泡,支持不同消息类型的渲染 + * 支持 Markdown 渲染和图表展示 + */ + +import React, { memo, useState, useEffect, useRef } from 'react'; +import { + View, + Text, + StyleSheet, + TouchableOpacity, + ActivityIndicator, + Animated, + LayoutAnimation, + Platform, + UIManager, + ScrollView, +} from 'react-native'; +import { LinearGradient } from 'expo-linear-gradient'; +import { MessageTypes, AgentTheme } from '../../../constants/agentConstants'; +import MarkdownRenderer from './MarkdownRenderer'; + +// 启用 LayoutAnimation (Android) +if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental) { + UIManager.setLayoutAnimationEnabledExperimental(true); +} + +/** + * 用户消息气泡 + */ +const UserBubble = memo(({ content }) => ( + + + {content} + + +)); + +/** + * 思考中气泡 - 带动画效果 + */ +const ThinkingBubble = memo(({ content }) => { + const pulseAnim = useRef(new Animated.Value(1)).current; + + useEffect(() => { + const pulse = Animated.loop( + Animated.sequence([ + Animated.timing(pulseAnim, { + toValue: 0.6, + duration: 800, + useNativeDriver: true, + }), + Animated.timing(pulseAnim, { + toValue: 1, + duration: 800, + useNativeDriver: true, + }), + ]) + ); + pulse.start(); + return () => pulse.stop(); + }, []); + + return ( + + + + + {content || '正在思考...'} + + + + + + + ); +}); + +/** + * 思考中动态点 + */ +const ThinkingDots = memo(() => { + const [dots, setDots] = useState(''); + + useEffect(() => { + const interval = setInterval(() => { + setDots(prev => prev.length >= 3 ? '' : prev + '.'); + }, 500); + return () => clearInterval(interval); + }, []); + + return {dots}; +}); + +/** + * 深度思考气泡(可折叠)- 类似 Gemini 风格 + */ +const DeepThinkingBubble = memo(({ content, isStreaming }) => { + const [isExpanded, setIsExpanded] = useState(true); + const charCount = content?.length || 0; + const rotateAnim = useRef(new Animated.Value(0)).current; + const sparkleAnim = useRef(new Animated.Value(0)).current; + + // 折叠动画 + useEffect(() => { + Animated.timing(rotateAnim, { + toValue: isExpanded ? 1 : 0, + duration: 200, + useNativeDriver: true, + }).start(); + }, [isExpanded]); + + // 思考中闪烁动画 + useEffect(() => { + if (isStreaming) { + const sparkle = Animated.loop( + Animated.sequence([ + Animated.timing(sparkleAnim, { + toValue: 1, + duration: 1000, + useNativeDriver: true, + }), + Animated.timing(sparkleAnim, { + toValue: 0, + duration: 1000, + useNativeDriver: true, + }), + ]) + ); + sparkle.start(); + return () => sparkle.stop(); + } + }, [isStreaming]); + + const handleToggle = () => { + if (!isStreaming) { + LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut); + setIsExpanded(!isExpanded); + } + }; + + const rotation = rotateAnim.interpolate({ + inputRange: [0, 1], + outputRange: ['0deg', '180deg'], + }); + + return ( + + + {/* 标题栏 */} + + + {isStreaming ? ( + + + + ) : ( + 🧠 + )} + + {isStreaming ? '深度思考中...' : '深度思考'} + + {isStreaming && ( + + )} + + + + {charCount > 0 && ( + + {charCount} 字 + + )} + {!isStreaming && ( + + + + )} + + + + {/* 思考内容 */} + {(isExpanded || isStreaming) && content && ( + + {content} + {isStreaming && ( + + + + )} + + )} + + + ); +}); + +/** + * 执行计划气泡 + */ +const PlanBubble = memo(({ content, plan }) => ( + + + + 📋 + 执行计划 + + {plan?.goal || content} + {plan?.steps && ( + + {plan.steps.map((step, index) => ( + + + {index + 1} + + + {step.tool} + {step.reason && ( + {step.reason} + )} + + + ))} + + )} + + +)); + +/** + * 执行中气泡 - 带进度显示 + */ +const ExecutingBubble = memo(({ content, stepResults = [], currentStep }) => { + const spinAnim = useRef(new Animated.Value(0)).current; + + useEffect(() => { + const spin = Animated.loop( + Animated.timing(spinAnim, { + toValue: 1, + duration: 1500, + useNativeDriver: true, + }) + ); + spin.start(); + return () => spin.stop(); + }, []); + + const rotation = spinAnim.interpolate({ + inputRange: [0, 1], + outputRange: ['0deg', '360deg'], + }); + + return ( + + + + + ⚙️ + + {content || '正在执行...'} + + + {stepResults.length > 0 && ( + + {stepResults.map((result, index) => ( + + + {result.status === 'success' ? '✓' : '✗'} + + {result.tool} + {result.execution_time && ( + + {(result.execution_time * 1000).toFixed(0)}ms + + )} + + ))} + + )} + + + ); +}); + +/** + * AI 响应气泡 - 支持 Markdown 和图表 + */ +const ResponseBubble = memo(({ content, isStreaming }) => { + const cursorAnim = useRef(new Animated.Value(0)).current; + + useEffect(() => { + if (isStreaming) { + const blink = Animated.loop( + Animated.sequence([ + Animated.timing(cursorAnim, { + toValue: 1, + duration: 500, + useNativeDriver: true, + }), + Animated.timing(cursorAnim, { + toValue: 0, + duration: 500, + useNativeDriver: true, + }), + ]) + ); + blink.start(); + return () => blink.stop(); + } + }, [isStreaming]); + + return ( + + + + {isStreaming && ( + + + + )} + + + ); +}); + +/** + * 错误气泡 + */ +const ErrorBubble = memo(({ content }) => ( + + + ⚠️ + + 出错了 + {content} + + + +)); + +/** + * MessageBubble 主组件 + */ +const MessageBubble = ({ message }) => { + const { type, content, isStreaming, plan, stepResults, currentStep, thinkingContent } = message; + + switch (type) { + case MessageTypes.USER: + return ; + + case MessageTypes.AGENT_THINKING: + return ; + + case MessageTypes.AGENT_DEEP_THINKING: + return ; + + case MessageTypes.AGENT_PLAN: + return ; + + case MessageTypes.AGENT_EXECUTING: + return ; + + case MessageTypes.AGENT_RESPONSE: + return ; + + case MessageTypes.ERROR: + return ; + + default: + return ; + } +}; + +const styles = StyleSheet.create({ + // 用户消息 + userBubbleContainer: { + width: '100%', + alignItems: 'flex-end', + marginVertical: 6, + paddingHorizontal: 16, + }, + userBubble: { + maxWidth: '80%', + paddingHorizontal: 16, + paddingVertical: 12, + borderRadius: 18, + borderBottomRightRadius: 4, + }, + userText: { + color: '#FFFFFF', + fontSize: 15, + lineHeight: 22, + }, + + // AI 消息容器 + agentBubbleContainer: { + width: '100%', + alignItems: 'flex-start', + marginVertical: 6, + paddingHorizontal: 16, + }, + + // 思考中 + thinkingBubble: { + maxWidth: '70%', + backgroundColor: AgentTheme.cardBg, + paddingHorizontal: 16, + paddingVertical: 12, + borderRadius: 16, + borderWidth: 1, + borderColor: AgentTheme.border, + }, + thinkingRow: { + flexDirection: 'row', + alignItems: 'center', + }, + thinkingText: { + color: AgentTheme.textSecondary, + fontSize: 14, + marginLeft: 10, + }, + thinkingDots: { + marginTop: 4, + marginLeft: 34, + }, + dots: { + color: AgentTheme.accent, + fontSize: 18, + letterSpacing: 2, + }, + + // 深度思考 + deepThinkingBubble: { + maxWidth: '92%', + minWidth: '60%', + backgroundColor: 'rgba(139, 92, 246, 0.08)', + borderRadius: 16, + borderWidth: 1, + borderColor: 'rgba(139, 92, 246, 0.25)', + overflow: 'hidden', + }, + deepThinkingBubbleActive: { + borderColor: 'rgba(139, 92, 246, 0.5)', + shadowColor: '#8B5CF6', + shadowOffset: { width: 0, height: 0 }, + shadowOpacity: 0.3, + shadowRadius: 12, + elevation: 8, + }, + deepThinkingHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + paddingHorizontal: 14, + paddingVertical: 12, + backgroundColor: 'rgba(139, 92, 246, 0.12)', + borderBottomWidth: 1, + borderBottomColor: 'rgba(139, 92, 246, 0.15)', + }, + deepThinkingTitleRow: { + flexDirection: 'row', + alignItems: 'center', + }, + sparkleIcon: { + fontSize: 16, + marginRight: 8, + }, + brainIcon: { + fontSize: 16, + marginRight: 8, + }, + deepThinkingTitle: { + color: AgentTheme.accent, + fontSize: 14, + fontWeight: '600', + }, + deepThinkingMeta: { + flexDirection: 'row', + alignItems: 'center', + }, + charCountBadge: { + backgroundColor: 'rgba(139, 92, 246, 0.2)', + paddingHorizontal: 8, + paddingVertical: 2, + borderRadius: 10, + marginRight: 8, + }, + charCount: { + color: AgentTheme.accent, + fontSize: 11, + fontWeight: '500', + }, + expandIcon: { + color: AgentTheme.textMuted, + fontSize: 10, + }, + deepThinkingContent: { + paddingHorizontal: 14, + paddingVertical: 12, + maxHeight: 250, + }, + deepThinkingContentStreaming: { + maxHeight: 300, + }, + deepThinkingText: { + color: AgentTheme.textSecondary, + fontSize: 13, + lineHeight: 20, + fontStyle: 'italic', + }, + cursorContainer: { + marginTop: 4, + }, + cursor: { + width: 2, + height: 16, + backgroundColor: AgentTheme.accent, + borderRadius: 1, + }, + + // 执行计划 + planBubble: { + maxWidth: '92%', + backgroundColor: 'rgba(16, 185, 129, 0.08)', + borderRadius: 16, + borderWidth: 1, + borderColor: 'rgba(16, 185, 129, 0.25)', + padding: 14, + }, + planHeader: { + flexDirection: 'row', + alignItems: 'center', + marginBottom: 10, + }, + planIcon: { + fontSize: 18, + marginRight: 8, + }, + planTitle: { + color: AgentTheme.success, + fontSize: 15, + fontWeight: '600', + }, + planGoal: { + color: AgentTheme.textPrimary, + fontSize: 14, + marginBottom: 12, + lineHeight: 20, + }, + planSteps: { + marginTop: 4, + }, + planStep: { + flexDirection: 'row', + alignItems: 'flex-start', + marginVertical: 6, + }, + stepNumber: { + width: 22, + height: 22, + borderRadius: 11, + backgroundColor: 'rgba(16, 185, 129, 0.2)', + justifyContent: 'center', + alignItems: 'center', + marginRight: 10, + }, + stepNumberText: { + color: AgentTheme.success, + fontSize: 12, + fontWeight: '600', + }, + stepContent: { + flex: 1, + }, + stepTool: { + color: AgentTheme.textPrimary, + fontSize: 13, + fontWeight: '500', + }, + stepReason: { + color: AgentTheme.textMuted, + fontSize: 12, + marginTop: 2, + }, + + // 执行中 + executingBubble: { + maxWidth: '92%', + backgroundColor: 'rgba(99, 102, 241, 0.08)', + borderRadius: 16, + borderWidth: 1, + borderColor: 'rgba(99, 102, 241, 0.25)', + padding: 14, + }, + executingHeader: { + flexDirection: 'row', + alignItems: 'center', + }, + gearIcon: { + fontSize: 18, + marginRight: 10, + }, + executingTitle: { + color: AgentTheme.accentSecondary, + fontSize: 14, + fontWeight: '500', + }, + stepResults: { + marginTop: 12, + borderTopWidth: 1, + borderTopColor: 'rgba(99, 102, 241, 0.15)', + paddingTop: 10, + }, + stepResult: { + flexDirection: 'row', + alignItems: 'center', + marginVertical: 4, + }, + stepStatus: { + fontSize: 14, + marginRight: 8, + width: 18, + }, + stepSuccess: { + color: AgentTheme.success, + }, + stepFailed: { + color: AgentTheme.error, + }, + stepName: { + color: AgentTheme.textSecondary, + fontSize: 13, + flex: 1, + }, + stepTime: { + color: AgentTheme.textMuted, + fontSize: 11, + }, + + // AI 响应 + responseBubble: { + maxWidth: '92%', + minWidth: '50%', + backgroundColor: AgentTheme.cardBg, + paddingHorizontal: 16, + paddingVertical: 14, + borderRadius: 18, + borderBottomLeftRadius: 4, + borderWidth: 1, + borderColor: AgentTheme.border, + }, + streamingIndicator: { + marginTop: 8, + }, + streamingCursor: { + width: 2, + height: 16, + backgroundColor: AgentTheme.accent, + borderRadius: 1, + }, + + // 错误 + errorBubble: { + maxWidth: '85%', + backgroundColor: 'rgba(239, 68, 68, 0.08)', + borderRadius: 16, + borderWidth: 1, + borderColor: 'rgba(239, 68, 68, 0.25)', + paddingHorizontal: 14, + paddingVertical: 12, + flexDirection: 'row', + alignItems: 'flex-start', + }, + errorIcon: { + fontSize: 18, + marginRight: 10, + marginTop: 2, + }, + errorContent: { + flex: 1, + }, + errorTitle: { + color: AgentTheme.error, + fontSize: 14, + fontWeight: '600', + marginBottom: 4, + }, + errorText: { + color: AgentTheme.textSecondary, + fontSize: 13, + lineHeight: 18, + }, +}); + +export default memo(MessageBubble); diff --git a/MeAgent/src/screens/Agent/components/SessionDrawer.js b/MeAgent/src/screens/Agent/components/SessionDrawer.js new file mode 100644 index 00000000..c3050a7c --- /dev/null +++ b/MeAgent/src/screens/Agent/components/SessionDrawer.js @@ -0,0 +1,402 @@ +/** + * SessionDrawer 组件 + * 会话历史抽屉,支持会话列表、搜索、新建 + */ + +import React, { memo, useState, useCallback } from 'react'; +import { + View, + Text, + StyleSheet, + TouchableOpacity, + TextInput, + FlatList, + Modal, + Dimensions, + Animated, +} from 'react-native'; +import { BlurView } from 'expo-blur'; +import { AgentTheme } from '../../../constants/agentConstants'; + +const { width: SCREEN_WIDTH } = Dimensions.get('window'); +const DRAWER_WIDTH = SCREEN_WIDTH * 0.85; + +/** + * 会话卡片 + */ +const SessionCard = memo(({ session, isActive, onPress }) => { + const title = session.title || '新对话'; + const messageCount = session.message_count || 0; + + return ( + onPress(session.session_id)} + activeOpacity={0.7} + > + + 💬 + + + + {title} + + + {messageCount} 条消息 + + + + ); +}); + +/** + * 日期分组标题 + */ +const DateGroupHeader = memo(({ title }) => ( + + {title} + +)); + +/** + * SessionDrawer 组件 + */ +const SessionDrawer = ({ + visible, + onClose, + groupedSessions = [], + currentSessionId, + onSelectSession, + onNewSession, + isLoading, +}) => { + const [searchText, setSearchText] = useState(''); + + /** + * 过滤会话 + */ + const filteredGroups = useCallback(() => { + if (!searchText.trim()) { + return groupedSessions; + } + + const lowerKeyword = searchText.toLowerCase(); + + return groupedSessions + .map(group => ({ + ...group, + sessions: group.sessions.filter(session => + (session.title || '').toLowerCase().includes(lowerKeyword) || + (session.session_id || '').toLowerCase().includes(lowerKeyword) + ), + })) + .filter(group => group.sessions.length > 0); + }, [groupedSessions, searchText]); + + /** + * 渲染会话项 + */ + const renderSessionItem = ({ item: session }) => ( + + ); + + /** + * 渲染分组 + */ + const renderGroup = ({ item: group }) => ( + + + {group.sessions.map(session => ( + + ))} + + ); + + const groups = filteredGroups(); + + return ( + + + {/* 点击遮罩关闭 */} + + + {/* 抽屉内容 */} + + + {/* 头部 */} + + 对话历史 + + + + + + {/* 新建按钮 */} + + + + 新建对话 + + + {/* 搜索框 */} + + 🔍 + + {searchText.length > 0 && ( + setSearchText('')} + style={styles.clearButton} + > + + + )} + + + {/* 会话列表 */} + {isLoading ? ( + + 加载中... + + ) : groups.length === 0 ? ( + + 📭 + + {searchText ? '没有找到匹配的对话' : '暂无对话历史'} + + + ) : ( + item.title} + showsVerticalScrollIndicator={false} + contentContainerStyle={styles.listContent} + /> + )} + + + + + ); +}; + +const styles = StyleSheet.create({ + overlay: { + flex: 1, + flexDirection: 'row', + }, + backdrop: { + flex: 1, + backgroundColor: 'rgba(0, 0, 0, 0.5)', + }, + drawer: { + width: DRAWER_WIDTH, + backgroundColor: AgentTheme.background, + }, + drawerContent: { + flex: 1, + }, + + // 头部 + header: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + paddingHorizontal: 20, + paddingTop: 60, + paddingBottom: 16, + borderBottomWidth: 1, + borderBottomColor: AgentTheme.border, + }, + headerTitle: { + fontSize: 20, + fontWeight: '700', + color: AgentTheme.textPrimary, + }, + closeButton: { + width: 32, + height: 32, + borderRadius: 16, + backgroundColor: AgentTheme.cardBg, + justifyContent: 'center', + alignItems: 'center', + }, + closeButtonText: { + fontSize: 16, + color: AgentTheme.textSecondary, + }, + + // 新建按钮 + newButton: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + marginHorizontal: 20, + marginTop: 16, + paddingVertical: 12, + backgroundColor: AgentTheme.accent, + borderRadius: 12, + }, + newButtonIcon: { + fontSize: 20, + color: '#FFFFFF', + marginRight: 8, + }, + newButtonText: { + fontSize: 15, + fontWeight: '600', + color: '#FFFFFF', + }, + + // 搜索框 + searchContainer: { + flexDirection: 'row', + alignItems: 'center', + marginHorizontal: 20, + marginTop: 16, + marginBottom: 8, + paddingHorizontal: 12, + paddingVertical: 10, + backgroundColor: AgentTheme.cardBg, + borderRadius: 10, + borderWidth: 1, + borderColor: AgentTheme.border, + }, + searchIcon: { + fontSize: 14, + marginRight: 8, + }, + searchInput: { + flex: 1, + fontSize: 14, + color: AgentTheme.textPrimary, + }, + clearButton: { + padding: 4, + }, + clearButtonText: { + fontSize: 12, + color: AgentTheme.textMuted, + }, + + // 列表 + listContent: { + paddingHorizontal: 20, + paddingBottom: 40, + }, + groupContainer: { + marginTop: 16, + }, + + // 日期分组 + dateGroup: { + paddingVertical: 8, + }, + dateGroupText: { + fontSize: 12, + fontWeight: '600', + color: AgentTheme.textMuted, + textTransform: 'uppercase', + }, + + // 会话卡片 + sessionCard: { + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: 12, + paddingVertical: 12, + backgroundColor: AgentTheme.cardBg, + borderRadius: 10, + marginVertical: 4, + borderWidth: 1, + borderColor: 'transparent', + }, + sessionCardActive: { + borderColor: AgentTheme.accent, + backgroundColor: 'rgba(139, 92, 246, 0.1)', + }, + sessionIcon: { + width: 36, + height: 36, + borderRadius: 18, + backgroundColor: AgentTheme.backgroundSecondary, + justifyContent: 'center', + alignItems: 'center', + marginRight: 12, + }, + sessionIconText: { + fontSize: 18, + }, + sessionInfo: { + flex: 1, + }, + sessionTitle: { + fontSize: 14, + fontWeight: '500', + color: AgentTheme.textPrimary, + marginBottom: 2, + }, + sessionMeta: { + fontSize: 12, + color: AgentTheme.textMuted, + }, + + // 加载和空状态 + loadingContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + loadingText: { + fontSize: 14, + color: AgentTheme.textMuted, + }, + emptyContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + paddingHorizontal: 40, + }, + emptyIcon: { + fontSize: 48, + marginBottom: 16, + }, + emptyText: { + fontSize: 14, + color: AgentTheme.textMuted, + textAlign: 'center', + }, +}); + +export default memo(SessionDrawer); diff --git a/MeAgent/src/screens/Agent/components/WelcomeScreen.js b/MeAgent/src/screens/Agent/components/WelcomeScreen.js new file mode 100644 index 00000000..c2f13105 --- /dev/null +++ b/MeAgent/src/screens/Agent/components/WelcomeScreen.js @@ -0,0 +1,335 @@ +/** + * WelcomeScreen 组件 + * Agent 聊天欢迎界面 - Bento Card 风格 + */ + +import React, { memo } from 'react'; +import { + View, + Text, + StyleSheet, + TouchableOpacity, + ScrollView, + Image, + Dimensions, +} from 'react-native'; +import { LinearGradient } from 'expo-linear-gradient'; +import { AgentTheme, QUICK_QUESTIONS, AGENT_NAME } from '../../../constants/agentConstants'; + +const { width: SCREEN_WIDTH } = Dimensions.get('window'); +const CARD_WIDTH = (SCREEN_WIDTH - 48 - 12) / 2; // 两列布局 + +// 洛希头像 +const LuoxiAvatar = require('../../../../assets/imgs/luoxi.jpg'); + +/** + * AI 头像组件 + */ +const AIAvatar = () => ( + + + + +); + +/** + * Bento 功能卡片 + */ +const BentoCard = memo(({ icon, title, description, color, size = 'small' }) => ( + + {icon} + {title} + {description} + +)); + +/** + * 快捷问题卡片 + */ +const QuickQuestionCard = memo(({ question, onPress, index }) => ( + onPress(question)} + activeOpacity={0.7} + > + + + {question} + + + + + + +)); + +/** + * WelcomeScreen 组件 + */ +const WelcomeScreen = ({ onQuickQuestion }) => { + return ( + + {/* 头部 - 洛希介绍 */} + + + {AGENT_NAME} + AI 投研助手 · 洛希极限 + 在市场的混沌中,找到价值与风险的平衡点 + + + {/* Bento Grid 功能展示 */} + + + + + + + + + + + + {/* 快捷问题 */} + + + 快速开始 + 试试这些问题 + + + {QUICK_QUESTIONS.map((question, index) => ( + + ))} + + + + {/* 底部提示 */} + + + 💡 + + 直接输入股票代码或名称,我会为你进行全面分析 + + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + contentContainer: { + paddingHorizontal: 20, + paddingTop: 20, + paddingBottom: 30, + }, + + // 头部 + header: { + alignItems: 'center', + marginBottom: 28, + }, + avatarContainer: { + width: 88, + height: 88, + marginBottom: 16, + position: 'relative', + }, + avatarGlow: { + position: 'absolute', + width: 96, + height: 96, + borderRadius: 48, + top: -4, + left: -4, + }, + avatar: { + width: 88, + height: 88, + borderRadius: 44, + borderWidth: 3, + borderColor: 'rgba(139, 92, 246, 0.5)', + }, + title: { + fontSize: 32, + fontWeight: '800', + color: AgentTheme.textPrimary, + marginBottom: 4, + letterSpacing: 1, + }, + subtitle: { + fontSize: 15, + color: AgentTheme.accent, + fontWeight: '500', + marginBottom: 8, + }, + tagline: { + fontSize: 13, + color: AgentTheme.textMuted, + textAlign: 'center', + paddingHorizontal: 20, + }, + + // Bento Grid + bentoGrid: { + marginBottom: 28, + }, + bentoRow: { + flexDirection: 'row', + justifyContent: 'space-between', + marginBottom: 12, + }, + bentoCard: { + width: CARD_WIDTH, + backgroundColor: AgentTheme.cardBg, + borderRadius: 16, + padding: 16, + borderWidth: 1, + borderColor: AgentTheme.border, + borderLeftWidth: 3, + }, + bentoCardLarge: { + width: '100%', + }, + bentoIcon: { + fontSize: 24, + marginBottom: 8, + }, + bentoTitle: { + fontSize: 15, + fontWeight: '600', + color: AgentTheme.textPrimary, + marginBottom: 4, + }, + bentoDesc: { + fontSize: 12, + color: AgentTheme.textMuted, + }, + + // 快捷问题区域 + quickSection: { + marginBottom: 20, + }, + sectionHeader: { + marginBottom: 14, + }, + sectionTitle: { + fontSize: 18, + fontWeight: '700', + color: AgentTheme.textPrimary, + marginBottom: 2, + }, + sectionSubtitle: { + fontSize: 13, + color: AgentTheme.textMuted, + }, + questionList: { + gap: 10, + }, + questionCard: { + borderRadius: 14, + overflow: 'hidden', + marginBottom: 8, + }, + questionGradient: { + borderRadius: 14, + borderWidth: 1, + borderColor: 'rgba(139, 92, 246, 0.2)', + }, + questionContent: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingHorizontal: 16, + paddingVertical: 14, + }, + questionText: { + fontSize: 14, + color: AgentTheme.textPrimary, + flex: 1, + }, + questionArrowContainer: { + width: 28, + height: 28, + borderRadius: 14, + backgroundColor: 'rgba(139, 92, 246, 0.2)', + justifyContent: 'center', + alignItems: 'center', + marginLeft: 12, + }, + questionArrow: { + fontSize: 14, + color: AgentTheme.accent, + fontWeight: '600', + }, + + // 底部提示 + footer: { + marginTop: 8, + }, + tipCard: { + flexDirection: 'row', + alignItems: 'center', + backgroundColor: 'rgba(245, 158, 11, 0.1)', + borderRadius: 12, + padding: 14, + borderWidth: 1, + borderColor: 'rgba(245, 158, 11, 0.2)', + }, + tipIcon: { + fontSize: 18, + marginRight: 10, + }, + tipText: { + fontSize: 13, + color: AgentTheme.textSecondary, + flex: 1, + lineHeight: 18, + }, +}); + +export default memo(WelcomeScreen); diff --git a/MeAgent/src/screens/Agent/components/index.js b/MeAgent/src/screens/Agent/components/index.js new file mode 100644 index 00000000..d31f7dc8 --- /dev/null +++ b/MeAgent/src/screens/Agent/components/index.js @@ -0,0 +1,9 @@ +/** + * Agent 组件导出 + */ + +export { default as MessageBubble } from './MessageBubble'; +export { default as ChatInput } from './ChatInput'; +export { default as WelcomeScreen } from './WelcomeScreen'; +export { default as SessionDrawer } from './SessionDrawer'; +export { default as MarkdownRenderer } from './MarkdownRenderer'; diff --git a/MeAgent/src/screens/Agent/index.js b/MeAgent/src/screens/Agent/index.js new file mode 100644 index 00000000..14f635c3 --- /dev/null +++ b/MeAgent/src/screens/Agent/index.js @@ -0,0 +1,5 @@ +/** + * Agent 模块导出 + */ + +export { default as AgentChatScreen } from './AgentChatScreen'; diff --git a/MeAgent/src/services/agentService.js b/MeAgent/src/services/agentService.js new file mode 100644 index 00000000..b6ae2db3 --- /dev/null +++ b/MeAgent/src/services/agentService.js @@ -0,0 +1,439 @@ +/** + * Agent 服务层 + * 处理与 MCP Server 的通信,包括 SSE 流式聊天、会话管理等 + */ + +import { AGENT_API_CONFIG, SSEEventTypes } from '../constants/agentConstants'; + +const { BASE_URL, ENDPOINTS, DEFAULT_TIMEOUT, MAX_HISTORY_LIMIT, MAX_SESSIONS_LIMIT } = AGENT_API_CONFIG; + +/** + * SSE 流式聊天请求 (React Native 兼容版本) + * 使用 XMLHttpRequest 处理流式响应,因为 React Native 的 fetch 不支持 response.body.getReader() + * + * @param {Object} params - 请求参数 + * @param {string} params.message - 用户消息 + * @param {Array} params.conversationHistory - 对话历史 + * @param {string} params.userId - 用户ID + * @param {string} params.userNickname - 用户昵称 + * @param {string} params.userAvatar - 用户头像 + * @param {string} params.subscriptionType - 订阅类型 + * @param {string|null} params.sessionId - 会话ID + * @param {string} params.model - 模型名称 + * @param {Array} params.tools - 工具列表 + * @param {Function} onEvent - SSE 事件回调 + * @param {AbortSignal} signal - 取消信号 + * @returns {Promise} + */ +export const streamAgentChat = async (params, onEvent, signal) => { + const { + message, + conversationHistory = [], + userId, + userNickname, + userAvatar, + subscriptionType = 'free', + sessionId = null, + model = 'deepmoney', + tools = [], + } = params; + + const requestBody = { + message, + conversation_history: conversationHistory.map(msg => ({ + isUser: msg.isUser, + content: msg.content, + })), + user_id: String(userId), // 确保 user_id 是字符串类型 + user_nickname: userNickname || '', + user_avatar: userAvatar || '', + subscription_type: subscriptionType, + session_id: sessionId, + model, + tools, + }; + + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + let buffer = ''; + let lastProcessedIndex = 0; + + // 处理取消信号 + if (signal) { + signal.addEventListener('abort', () => { + xhr.abort(); + }); + } + + xhr.open('POST', `${BASE_URL}${ENDPOINTS.CHAT_STREAM}`, true); + xhr.setRequestHeader('Content-Type', 'application/json'); + xhr.setRequestHeader('Accept', 'text/event-stream'); + xhr.withCredentials = true; // 携带 Cookie + + xhr.onreadystatechange = () => { + // readyState 3 = LOADING (接收到部分数据) + if (xhr.readyState === 3 || xhr.readyState === 4) { + // 获取新增的响应文本 + const newData = xhr.responseText.substring(lastProcessedIndex); + lastProcessedIndex = xhr.responseText.length; + + if (newData) { + buffer += newData; + + // 按双换行符分割事件 + const events = buffer.split('\n\n'); + // 最后一个可能不完整,保留在 buffer 中 + buffer = events.pop() || ''; + + // 处理完整的事件 + for (const eventStr of events) { + if (eventStr.trim()) { + processSSEEvent(eventStr, onEvent); + } + } + } + } + + // readyState 4 = DONE (请求完成) + if (xhr.readyState === 4) { + // 处理剩余的 buffer + if (buffer.trim()) { + processSSEBuffer(buffer, onEvent); + } + + if (xhr.status >= 200 && xhr.status < 300) { + onEvent({ type: 'stream_end' }); + resolve(); + } else if (xhr.status === 0) { + // 请求被取消 + console.log('[AgentService] 请求被取消'); + onEvent({ type: 'aborted' }); + reject(new DOMException('Aborted', 'AbortError')); + } else { + const errorMessage = `HTTP ${xhr.status}: ${xhr.responseText}`; + console.error('[AgentService] SSE 错误:', errorMessage); + onEvent({ + type: SSEEventTypes.ERROR, + data: { message: xhr.responseText || '网络请求失败' } + }); + reject(new Error(errorMessage)); + } + } + }; + + xhr.onerror = () => { + console.error('[AgentService] 网络错误'); + onEvent({ + type: SSEEventTypes.ERROR, + data: { message: '网络连接失败,请检查网络设置' } + }); + reject(new Error('网络连接失败')); + }; + + xhr.ontimeout = () => { + console.error('[AgentService] 请求超时'); + onEvent({ + type: SSEEventTypes.ERROR, + data: { message: '请求超时,请稍后重试' } + }); + reject(new Error('请求超时')); + }; + + xhr.timeout = DEFAULT_TIMEOUT; + xhr.send(JSON.stringify(requestBody)); + }); +}; + +/** + * 处理 SSE 缓冲区 + */ +const processSSEBuffer = (buffer, onEvent) => { + const lines = buffer.split('\n'); + let eventType = null; + let eventData = null; + + for (const line of lines) { + if (line.startsWith('event:')) { + eventType = line.slice(6).trim(); + } else if (line.startsWith('data:')) { + const dataStr = line.slice(5).trim(); + if (dataStr === '[DONE]') { + onEvent({ type: SSEEventTypes.DONE }); + return; + } + try { + eventData = JSON.parse(dataStr); + } catch (e) { + eventData = { raw: dataStr }; + } + } + } + + if (eventData) { + onEvent({ type: eventType || 'message', data: eventData }); + } +}; + +/** + * 处理单个 SSE 事件 + */ +const processSSEEvent = (eventStr, onEvent) => { + const lines = eventStr.split('\n'); + let eventType = null; + let eventData = null; + + for (const line of lines) { + if (line.startsWith('event:')) { + eventType = line.slice(6).trim(); + } else if (line.startsWith('data:')) { + const dataStr = line.slice(5).trim(); + + // 检查是否是结束标记 + if (dataStr === '[DONE]') { + onEvent({ type: SSEEventTypes.DONE }); + return; + } + + try { + eventData = JSON.parse(dataStr); + } catch (e) { + // 如果不是 JSON,保留原始字符串 + eventData = { raw: dataStr }; + } + } + } + + if (eventData) { + onEvent({ type: eventType || 'message', data: eventData }); + } +}; + +/** + * 创建带超时的 fetch 请求 + * @param {string} url - 请求 URL + * @param {Object} options - fetch 选项 + * @param {number} timeout - 超时时间(毫秒) + * @returns {Promise} + */ +const fetchWithTimeout = async (url, options = {}, timeout = DEFAULT_TIMEOUT) => { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), timeout); + + try { + const response = await fetch(url, { + ...options, + signal: controller.signal, + // 重要:携带 Cookie 以支持 Session 认证 + credentials: 'include', + }); + clearTimeout(timeoutId); + return response; + } catch (error) { + clearTimeout(timeoutId); + if (error.name === 'AbortError') { + throw new Error('请求超时,请稍后重试'); + } + throw error; + } +}; + +/** + * 获取用户会话列表 + * + * @param {string} userId - 用户ID + * @param {number} limit - 返回数量限制 + * @returns {Promise} 会话列表 + */ +export const getSessions = async (userId, limit = MAX_SESSIONS_LIMIT) => { + try { + const response = await fetchWithTimeout( + `${BASE_URL}${ENDPOINTS.SESSIONS}?user_id=${encodeURIComponent(userId)}&limit=${limit}`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }, + DEFAULT_TIMEOUT + ); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + + const data = await response.json(); + // 后端返回格式: { success: true, data: [...] } + if (data.success) { + return data.data || []; + } + return []; + } catch (error) { + console.error('[AgentService] 获取会话列表失败:', error); + throw error; + } +}; + +/** + * 获取会话历史消息 + * + * @param {string} sessionId - 会话ID + * @param {number} limit - 返回数量限制 + * @returns {Promise} 会话历史数据 + */ +export const getSessionHistory = async (sessionId, limit = MAX_HISTORY_LIMIT) => { + try { + const response = await fetchWithTimeout( + `${BASE_URL}${ENDPOINTS.HISTORY}/${encodeURIComponent(sessionId)}?limit=${limit}`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }, + DEFAULT_TIMEOUT + ); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + + const data = await response.json(); + // 后端返回格式: { success: true, data: [...], session_id, title } + if (data.success) { + return { + sessionId: sessionId, + title: data.title || '', + messages: data.data || [], + }; + } + return { + sessionId: sessionId, + title: '', + messages: [], + }; + } catch (error) { + console.error('[AgentService] 获取会话历史失败:', error); + throw error; + } +}; + +/** + * 安全的 JSON 解析 + */ +const safeJsonParse = (str) => { + if (!str) return null; + if (typeof str === 'object') return str; + try { + return JSON.parse(str); + } catch (e) { + return null; + } +}; + +/** + * 将后端消息格式转换为前端格式 + * + * @param {Array} backendMessages - 后端消息格式 + * @returns {Array} 前端消息格式 + */ +export const transformMessages = (backendMessages) => { + return backendMessages.map((msg, index) => { + // 后端消息格式: { message_type: 'user' | 'assistant', message: string, plan, steps } + const isUser = msg.message_type === 'user'; + + return { + id: `history_${index}_${Date.now()}`, + type: isUser ? 'user' : 'agent_response', + content: msg.message || '', + plan: safeJsonParse(msg.plan), + stepResults: safeJsonParse(msg.steps), + isUser, + timestamp: msg.timestamp || new Date().toISOString(), + }; + }); +}; + +/** + * 构建对话历史(用于发送请求) + * + * @param {Array} messages - 消息列表 + * @returns {Array} 对话历史格式 + */ +export const buildConversationHistory = (messages) => { + return messages + .filter(msg => msg.type === 'user' || msg.type === 'agent_response') + .map(msg => ({ + isUser: msg.type === 'user', + content: msg.content, + })); +}; + +/** + * 按日期分组会话 + * + * @param {Array} sessions - 会话列表 + * @returns {Array} 分组后的会话 + */ +export const groupSessionsByDate = (sessions) => { + const groups = {}; + const today = new Date(); + today.setHours(0, 0, 0, 0); + + const yesterday = new Date(today); + yesterday.setDate(yesterday.getDate() - 1); + + const thisWeekStart = new Date(today); + thisWeekStart.setDate(thisWeekStart.getDate() - thisWeekStart.getDay()); + + sessions.forEach(session => { + const sessionDate = new Date(session.created_at || session.timestamp); + sessionDate.setHours(0, 0, 0, 0); + + let groupKey; + if (sessionDate.getTime() === today.getTime()) { + groupKey = '今天'; + } else if (sessionDate.getTime() === yesterday.getTime()) { + groupKey = '昨天'; + } else if (sessionDate >= thisWeekStart) { + groupKey = '本周'; + } else { + // 按月份分组 + groupKey = `${sessionDate.getFullYear()}年${sessionDate.getMonth() + 1}月`; + } + + if (!groups[groupKey]) { + groups[groupKey] = []; + } + groups[groupKey].push(session); + }); + + // 转换为数组格式并排序 + const orderedKeys = ['今天', '昨天', '本周']; + const result = []; + + // 先添加特殊分组 + orderedKeys.forEach(key => { + if (groups[key]) { + result.push({ title: key, sessions: groups[key] }); + delete groups[key]; + } + }); + + // 添加剩余的月份分组(按时间倒序) + Object.keys(groups) + .sort((a, b) => b.localeCompare(a)) + .forEach(key => { + result.push({ title: key, sessions: groups[key] }); + }); + + return result; +}; + +export default { + streamAgentChat, + getSessions, + getSessionHistory, + transformMessages, + buildConversationHistory, + groupSessionsByDate, +}; diff --git a/MeAgent/src/store/index.js b/MeAgent/src/store/index.js index 32e813a1..71b56ea0 100644 --- a/MeAgent/src/store/index.js +++ b/MeAgent/src/store/index.js @@ -7,6 +7,7 @@ import eventsReducer from './slices/eventsSlice'; import watchlistReducer from './slices/watchlistSlice'; import stockReducer from './slices/stockSlice'; import communityReducer from './slices/communitySlice'; +import agentReducer from './slices/agentSlice'; const store = configureStore({ reducer: { @@ -14,6 +15,7 @@ const store = configureStore({ watchlist: watchlistReducer, stock: stockReducer, community: communityReducer, + agent: agentReducer, }, middleware: (getDefaultMiddleware) => getDefaultMiddleware({ diff --git a/MeAgent/src/store/slices/agentSlice.js b/MeAgent/src/store/slices/agentSlice.js new file mode 100644 index 00000000..6bd29ae3 --- /dev/null +++ b/MeAgent/src/store/slices/agentSlice.js @@ -0,0 +1,341 @@ +/** + * Agent Redux Slice + * 管理 AI 助手相关的状态 + */ + +import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; +import { + getSessions, + getSessionHistory, + transformMessages, + groupSessionsByDate, +} from '../../services/agentService'; +import { + MessageTypes, + DEFAULT_MODEL, + DEFAULT_TOOLS, + WELCOME_MESSAGE_TEMPLATE, +} from '../../constants/agentConstants'; + +// 异步 Thunk: 获取会话列表 +export const fetchSessions = createAsyncThunk( + 'agent/fetchSessions', + async (userId, { rejectWithValue }) => { + try { + const sessions = await getSessions(userId); + return sessions; + } catch (error) { + return rejectWithValue(error.message); + } + } +); + +// 异步 Thunk: 获取会话历史 +export const fetchSessionHistory = createAsyncThunk( + 'agent/fetchSessionHistory', + async (sessionId, { rejectWithValue }) => { + try { + const history = await getSessionHistory(sessionId); + return history; + } catch (error) { + return rejectWithValue(error.message); + } + } +); + +// 初始状态 +const initialState = { + // 消息相关 + messages: [], + isProcessing: false, + streamingContent: '', // 流式输出中的内容 + + // 会话相关 + currentSessionId: null, + currentSessionTitle: null, + sessions: [], + groupedSessions: [], + sessionsLoading: false, + sessionsError: null, + + // 配置相关 + selectedModel: DEFAULT_MODEL, + selectedTools: DEFAULT_TOOLS, + + // 流式状态追踪 + streamState: { + thinkingContent: '', + deepThinkingContent: '', + isDeepThinking: false, + plan: null, + stepResults: [], + }, + + // UI 状态 + isSessionDrawerOpen: false, + isToolSelectorOpen: false, +}; + +const agentSlice = createSlice({ + name: 'agent', + initialState, + reducers: { + // ========== 消息相关 ========== + + // 添加消息 + addMessage: (state, action) => { + const message = { + id: `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, + timestamp: new Date().toISOString(), + ...action.payload, + }; + state.messages.push(message); + }, + + // 更新最后一条指定类型的消息 + updateLastMessageByType: (state, action) => { + const { type, updates } = action.payload; + for (let i = state.messages.length - 1; i >= 0; i--) { + if (state.messages[i].type === type) { + state.messages[i] = { ...state.messages[i], ...updates }; + break; + } + } + }, + + // 设置消息列表 + setMessages: (state, action) => { + state.messages = action.payload; + }, + + // 清空消息 + clearMessages: (state) => { + state.messages = []; + }, + + // 移除指定类型的消息 + removeMessagesByType: (state, action) => { + const type = action.payload; + state.messages = state.messages.filter(msg => msg.type !== type); + }, + + // 设置处理状态 + setIsProcessing: (state, action) => { + state.isProcessing = action.payload; + }, + + // 设置流式内容 + setStreamingContent: (state, action) => { + state.streamingContent = action.payload; + }, + + // 追加流式内容 + appendStreamingContent: (state, action) => { + state.streamingContent += action.payload; + }, + + // ========== 流式状态相关 ========== + + // 更新流式状态 + updateStreamState: (state, action) => { + state.streamState = { ...state.streamState, ...action.payload }; + }, + + // 重置流式状态 + resetStreamState: (state) => { + state.streamState = { + thinkingContent: '', + deepThinkingContent: '', + isDeepThinking: false, + plan: null, + stepResults: [], + }; + state.streamingContent = ''; + }, + + // 追加思考内容 + appendThinkingContent: (state, action) => { + state.streamState.thinkingContent += action.payload; + }, + + // 追加深度思考内容 + appendDeepThinkingContent: (state, action) => { + state.streamState.deepThinkingContent += action.payload; + }, + + // 设置执行计划 + setPlan: (state, action) => { + state.streamState.plan = action.payload; + }, + + // 添加步骤结果 + addStepResult: (state, action) => { + state.streamState.stepResults.push(action.payload); + }, + + // ========== 会话相关 ========== + + // 设置当前会话 + setCurrentSession: (state, action) => { + const { sessionId, title } = action.payload; + state.currentSessionId = sessionId; + state.currentSessionTitle = title; + }, + + // 清除当前会话(新建对话) + clearCurrentSession: (state) => { + state.currentSessionId = null; + state.currentSessionTitle = null; + state.messages = []; + }, + + // 设置会话列表 + setSessions: (state, action) => { + state.sessions = action.payload; + state.groupedSessions = groupSessionsByDate(action.payload); + }, + + // ========== 配置相关 ========== + + // 设置选中的模型 + setSelectedModel: (state, action) => { + state.selectedModel = action.payload; + }, + + // 设置选中的工具 + setSelectedTools: (state, action) => { + state.selectedTools = action.payload; + }, + + // 切换工具选择 + toggleTool: (state, action) => { + const toolId = action.payload; + const index = state.selectedTools.indexOf(toolId); + if (index > -1) { + state.selectedTools.splice(index, 1); + } else { + state.selectedTools.push(toolId); + } + }, + + // ========== UI 状态 ========== + + // 切换会话抽屉 + toggleSessionDrawer: (state) => { + state.isSessionDrawerOpen = !state.isSessionDrawerOpen; + }, + + // 设置会话抽屉状态 + setSessionDrawerOpen: (state, action) => { + state.isSessionDrawerOpen = action.payload; + }, + + // 切换工具选择器 + toggleToolSelector: (state) => { + state.isToolSelectorOpen = !state.isToolSelectorOpen; + }, + + // 设置工具选择器状态 + setToolSelectorOpen: (state, action) => { + state.isToolSelectorOpen = action.payload; + }, + + // ========== 初始化 ========== + + // 初始化新会话(添加欢迎消息) + initNewSession: (state, action) => { + const nickname = action.payload?.nickname || ''; + state.currentSessionId = null; + state.currentSessionTitle = null; + state.messages = [ + { + id: `welcome_${Date.now()}`, + type: MessageTypes.AGENT_RESPONSE, + content: WELCOME_MESSAGE_TEMPLATE(nickname), + timestamp: new Date().toISOString(), + }, + ]; + }, + }, + + extraReducers: (builder) => { + // 获取会话列表 + builder + .addCase(fetchSessions.pending, (state) => { + state.sessionsLoading = true; + state.sessionsError = null; + }) + .addCase(fetchSessions.fulfilled, (state, action) => { + state.sessionsLoading = false; + state.sessions = action.payload; + state.groupedSessions = groupSessionsByDate(action.payload); + }) + .addCase(fetchSessions.rejected, (state, action) => { + state.sessionsLoading = false; + state.sessionsError = action.payload; + }); + + // 获取会话历史 + builder + .addCase(fetchSessionHistory.pending, (state) => { + state.isProcessing = true; + }) + .addCase(fetchSessionHistory.fulfilled, (state, action) => { + state.isProcessing = false; + state.currentSessionId = action.payload.sessionId; + state.currentSessionTitle = action.payload.title; + state.messages = transformMessages(action.payload.messages); + }) + .addCase(fetchSessionHistory.rejected, (state, action) => { + state.isProcessing = false; + // 可以添加错误消息 + }); + }, +}); + +// 导出 actions +export const { + addMessage, + updateLastMessageByType, + setMessages, + clearMessages, + removeMessagesByType, + setIsProcessing, + setStreamingContent, + appendStreamingContent, + updateStreamState, + resetStreamState, + appendThinkingContent, + appendDeepThinkingContent, + setPlan, + addStepResult, + setCurrentSession, + clearCurrentSession, + setSessions, + setSelectedModel, + setSelectedTools, + toggleTool, + toggleSessionDrawer, + setSessionDrawerOpen, + toggleToolSelector, + setToolSelectorOpen, + initNewSession, +} = agentSlice.actions; + +// 导出 selectors +export const selectMessages = (state) => state.agent.messages; +export const selectIsProcessing = (state) => state.agent.isProcessing; +export const selectStreamingContent = (state) => state.agent.streamingContent; +export const selectStreamState = (state) => state.agent.streamState; +export const selectCurrentSessionId = (state) => state.agent.currentSessionId; +export const selectCurrentSessionTitle = (state) => state.agent.currentSessionTitle; +export const selectSessions = (state) => state.agent.sessions; +export const selectGroupedSessions = (state) => state.agent.groupedSessions; +export const selectSessionsLoading = (state) => state.agent.sessionsLoading; +export const selectSelectedModel = (state) => state.agent.selectedModel; +export const selectSelectedTools = (state) => state.agent.selectedTools; +export const selectIsSessionDrawerOpen = (state) => state.agent.isSessionDrawerOpen; +export const selectIsToolSelectorOpen = (state) => state.agent.isToolSelectorOpen; + +// 导出 reducer +export default agentSlice.reducer; diff --git a/mcp_server.py b/mcp_server.py index 446e66e0..983acb50 100644 --- a/mcp_server.py +++ b/mcp_server.py @@ -184,37 +184,6 @@ class AgentChatRequest(BaseModel): # ==================== MCP工具定义 ==================== TOOLS: List[ToolDefinition] = [ - ToolDefinition( - name="search_news", - description="搜索全球新闻,支持关键词搜索和日期过滤。适用于查找国际新闻、行业动态等。", - parameters={ - "type": "object", - "properties": { - "query": { - "type": "string", - "description": "搜索关键词,例如:'人工智能'、'新能源汽车'" - }, - "source": { - "type": "string", - "description": "新闻来源筛选,可选" - }, - "start_date": { - "type": "string", - "description": "开始日期,格式:YYYY-MM-DD" - }, - "end_date": { - "type": "string", - "description": "结束日期,格式:YYYY-MM-DD" - }, - "top_k": { - "type": "integer", - "description": "返回结果数量,默认20", - "default": 20 - } - }, - "required": ["query"] - } - ), ToolDefinition( name="search_china_news", description="搜索中国新闻,使用KNN语义搜索。支持精确匹配模式,适合查找股票、公司相关新闻。", @@ -1452,22 +1421,6 @@ async def call_tool(request: ToolCallRequest): # ==================== 工具处理函数 ==================== -async def handle_search_news(args: Dict[str, Any]) -> Any: - """处理新闻搜索""" - params = { - "query": args.get("query"), - "source": args.get("source"), - "start_date": args.get("start_date"), - "end_date": args.get("end_date"), - "top_k": args.get("top_k", 20) - } - # 移除None值 - params = {k: v for k, v in params.items() if v is not None} - - response = await HTTP_CLIENT.get(f"{ServiceEndpoints.NEWS_API}/search_news", params=params) - response.raise_for_status() - return response.json() - async def handle_search_china_news(args: Dict[str, Any]) -> Any: """处理中国新闻搜索""" params = { @@ -1916,7 +1869,6 @@ async def handle_get_stock_intraday_statistics(args: Dict[str, Any]) -> Any: # 工具处理函数映射 TOOL_HANDLERS = { - "search_news": handle_search_news, "search_china_news": handle_search_china_news, "search_medical_news": handle_search_medical_news, "search_roadshows": handle_search_roadshows, @@ -4375,7 +4327,7 @@ async def health_check(): services_status = {} try: - response = await HTTP_CLIENT.get(f"{ServiceEndpoints.NEWS_API}/search_news?query=test&top_k=1", timeout=5.0) + response = await HTTP_CLIENT.get(f"{ServiceEndpoints.NEWS_API}/search_china_news?query=test&top_k=1", timeout=5.0) services_status["news_api"] = "healthy" if response.status_code == 200 else "unhealthy" except: services_status["news_api"] = "unhealthy"