diff --git a/Dockerfile b/Dockerfile index 6904aafc..570702af 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,7 @@ COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ WORKDIR /MaiMBot ENV MAIBOT_LEGACY_0X_UPGRADE_CONFIRMED=1 +ENV PATH="/MaiMBot/.venv/bin:${PATH}" # Copy dependency metadata COPY pyproject.toml uv.lock ./ @@ -13,7 +14,7 @@ COPY pyproject.toml uv.lock ./ RUN apt-get update && apt-get install -y git # Install runtime dependencies -RUN uv sync --frozen --no-dev --system --no-install-project +RUN uv sync --frozen --no-dev --no-install-project # Copy project source COPY . . diff --git a/dashboard/src/components/memory/MemoryEpisodeManager.tsx b/dashboard/src/components/memory/MemoryEpisodeManager.tsx index d52e09a5..1f392f39 100644 --- a/dashboard/src/components/memory/MemoryEpisodeManager.tsx +++ b/dashboard/src/components/memory/MemoryEpisodeManager.tsx @@ -1,10 +1,11 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { Loader2, Play, RefreshCw, RotateCcw, Search } from 'lucide-react' +import { ChevronDown, Loader2, Play, RefreshCw, RotateCcw, Search } from 'lucide-react' import { Alert, AlertDescription } from '@/components/ui/alert' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { ScrollArea } from '@/components/ui/scroll-area' @@ -88,7 +89,11 @@ export function MemoryEpisodeManager() { const { toast } = useToast() const [query, setQuery] = useState('') const [source, setSource] = useState('') + const [platform, setPlatform] = useState('') + const [userId, setUserId] = useState('') const [personId, setPersonId] = useState('') + const [showAdvancedPersonId, setShowAdvancedPersonId] = useState(false) + const [showRawEpisodePayload, setShowRawEpisodePayload] = useState(false) const [timeStart, setTimeStart] = useState('') const [timeEnd, setTimeEnd] = useState('') const [limit, setLimit] = useState('20') @@ -118,11 +123,14 @@ export function MemoryEpisodeManager() { const loadEpisodes = useCallback(async () => { setLoading(true) try { + const directPersonId = showAdvancedPersonId ? personId.trim() : '' const [listPayload] = await Promise.all([ getMemoryEpisodes({ - query, - source, - personId, + query: query.trim(), + source: source.trim(), + platform: platform.trim(), + userId: userId.trim(), + personId: directPersonId, limit: parsePositiveInt(limit, 20), timeStart: parseOptionalNumber(timeStart), timeEnd: parseOptionalNumber(timeEnd), @@ -143,7 +151,7 @@ export function MemoryEpisodeManager() { } finally { setLoading(false) } - }, [limit, loadStatus, personId, query, selectedId, source, timeEnd, timeStart, toast]) + }, [limit, loadStatus, personId, platform, query, selectedId, showAdvancedPersonId, source, timeEnd, timeStart, toast, userId]) const loadDetail = useCallback(async (episodeId: string) => { if (!episodeId) { @@ -260,10 +268,23 @@ export function MemoryEpisodeManager() { Episode 查询 - 按来源、人物和时间范围查看情节记忆构建结果。 + 按平台账号、来源和时间范围查看情节记忆构建结果;person_id 查询放在高级入口。
+
+ + setPlatform(event.target.value)} + placeholder="例如 qq、telegram、webui" + /> +
+
+ + setUserId(event.target.value)} placeholder="输入平台侧 user_id" /> +
setQuery(event.target.value)} placeholder="搜索摘要或内容" /> @@ -272,10 +293,6 @@ export function MemoryEpisodeManager() { setSource(event.target.value)} placeholder="chat_summary:..." />
-
- - setPersonId(event.target.value)} placeholder="person_id" /> -
setLimit(event.target.value)} /> @@ -289,6 +306,25 @@ export function MemoryEpisodeManager() { setTimeEnd(event.target.value)} placeholder="可选" />
+ + + + + + + + setPersonId(event.target.value)} + placeholder="调试或后台管理时直接输入" + /> + + +