[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-raphaelmansuy--edgequake":3,"tool-raphaelmansuy--edgequake":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",157379,2,"2026-04-15T23:32:42",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",108322,"2026-04-10T11:39:34",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},6121,"gemini-cli","google-gemini\u002Fgemini-cli","gemini-cli 是一款由谷歌推出的开源 AI 命令行工具，它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言，它提供了一条从输入提示词到获取模型响应的最短路径，无需切换窗口即可享受智能辅助。\n\n这款工具主要解决了开发过程中频繁上下文切换的痛点，让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用，还是执行复杂的 Git 操作，gemini-cli 都能通过自然语言指令高效处理。\n\n它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口，具备出色的逻辑推理能力；内置 Google 搜索、文件操作及 Shell 命令执行等实用工具；更独特的是，它支持 MCP（模型上下文协议），允许用户灵活扩展自定义集成，连接如图像生成等外部能力。此外，个人谷歌账号即可享受免费的额度支持，且项目基于 Apache 2.0 协议完全开源，是提升终端工作效率的理想助手。",100752,"2026-04-10T01:20:03",[52,13,15,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":32,"last_commit_at":59,"category_tags":60,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":66,"readme_en":67,"readme_zh":68,"quickstart_zh":69,"use_case_zh":70,"hero_image_url":71,"owner_login":72,"owner_name":73,"owner_avatar_url":74,"owner_bio":75,"owner_company":76,"owner_location":77,"owner_email":78,"owner_twitter":72,"owner_website":79,"owner_url":80,"languages":81,"stars":120,"forks":121,"last_commit_at":122,"license":123,"difficulty_score":124,"env_os":125,"env_gpu":126,"env_ram":127,"env_deps":128,"category_tags":140,"github_topics":141,"view_count":32,"oss_zip_url":78,"oss_zip_packed_at":78,"status":17,"created_at":146,"updated_at":147,"faqs":148,"releases":149},8027,"raphaelmansuy\u002Fedgequake","edgequake","EdegQuake 🌋 High-performance GraphRAG inspired from LightRag written in Rust; Transform documents into intelligent knowledge graphs for superior retrieval and generation","EdgeQuake 是一款基于 Rust 语言开发的高性能 GraphRAG（图检索增强生成）框架。它旨在解决传统 RAG 系统仅依赖向量相似度检索的局限，后者在处理需要多步推理、主题分析或复杂关系查询的任务时往往表现不佳。EdgeQuake 通过引入知识图谱技术，将文档拆解为实体与关系的网络结构，在检索时结合向量搜索的速度与图遍历的逻辑推理能力，从而实现对文档内容的深度理解与精准回答。\n\n该工具特别适合开发者、研究人员及企业技术团队使用，尤其是那些需要构建高并发、低延迟且具备复杂推理能力的知识库应用的人群。其核心技术亮点包括：原生支持六种查询模式以适配不同场景；利用 Rust 的异步架构实现零拷贝操作，显著降低内存占用并提升并发处理能力；内置先进的 PDF 处理流水线，支持多模态大模型直接“阅读”扫描版文档及复杂表格。此外，EdgeQuake 还配备了现代化的 React 前端与交互式图谱可视化功能，让数据结构一目了然，是打造下一代智能检索系统的理想选择。","# EdgeQuake\n\n\u003Ca href=\"https:\u002F\u002Ftrendshift.io\u002Frepositories\u002F20893\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fraphaelmansuy_edgequake_readme_4a68feb902da.png\" alt=\"raphaelmansuy%2Fedgequake | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"\u002F>\u003C\u002Fa>\n\n> **High-Performance Graph-RAG Framework in Rust**  \n> Transform documents into intelligent knowledge graphs for superior retrieval and generation\n\n[![Version](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fversion-0.10.1-blue.svg?style=flat)](CHANGELOG.md)\n[![Rust](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Frust-1.78+-orange.svg?style=flat&logo=rust)](https:\u002F\u002Fwww.rust-lang.org)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-Apache%202.0-blue.svg?style=flat)](LICENSE)\n[![Build Status](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fbuild-passing-brightgreen.svg?style=flat)](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake)\n[![Documentation](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdocs-available-blue.svg?style=flat)](docs\u002FREADME.md)\n\n> **v0.10.1** — Sigma graph-viewer performance hardening, safer embedding limits for dense PDFs, and a fully green publication pass for `curl | sh` and GHCR installs. See [CHANGELOG](CHANGELOG.md) for full details.\n\n---\n\n![Screenshot of EdgeQuake Frontend](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fraphaelmansuy_edgequake_readme_1b68abed320e.png)\n\n## Why EdgeQuake?\n\nTraditional RAG systems retrieve document chunks using vector similarity alone. This works for simple lookups but fails on multi-hop reasoning (\"How does X relate to Y through Z?\"), thematic questions (\"What are the major themes?\"), and relationship queries. The core problem: **vectors capture semantic similarity but lose structural relationships between concepts**.\n\n**EdgeQuake** solves this by implementing the [LightRAG algorithm](https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.05779) in Rust: documents are not just chunked and embedded — they are decomposed into a **knowledge graph** of entities and relationships. At query time, the system traverses both the vector space and the graph structure, combining the speed of vector search with the reasoning power of graph traversal.\n\n### What Sets EdgeQuake Apart\n\n- **Knowledge Graphs**: LLM-powered entity extraction and relationship mapping create a structured understanding of your documents — not just keyword matching\n- **6 Query Modes**: From fast naive vector search to graph-traversing hybrid queries, each mode optimizes for different question types\n- **Rust Performance**: Async-first Tokio architecture with zero-copy operations — handles thousands of concurrent requests\n- **PDF LLM Vision Pipeline ✅ NEW in 0.4.0**: Multimodal LLMs (GPT-4o, Claude, Gemini) read PDF pages as images — handles scanned documents, complex tables, and multi-column layouts out of the box\n- **Production Ready**: OpenAPI 3.0 REST API, SSE streaming, health checks, multi-tenant workspace isolation\n- **Modern Frontend**: React 19 with interactive Sigma.js graph visualizations\n\n### Performance Benchmarks\n\n| Metric                 | EdgeQuake        | Traditional RAG | Improvement |\n| ---------------------- | ---------------- | --------------- | ----------- |\n| Entity Extraction      | ~2-3x more       | Baseline        | 3x          |\n| Query Latency (hybrid) | \u003C 200ms          | ~1000ms         | 5x faster   |\n| Document Processing    | 25s (10k tokens) | ~60s            | 2.4x faster |\n| Concurrent Users       | 1000+            | ~100            | 10x         |\n| Memory Usage (per doc) | 2MB              | ~8MB            | 4x better   |\n\n> **v0.4.0 — PDF is now Production Ready**: The PDF pipeline ships with embedded pdfium (zero-config) and an opt-in LLM vision mode. Text-mode extraction works for all standard PDFs; enable `use_vision_llm = true` (or send `X-Use-Vision: true`) to route pages through your vision-capable LLM for scanned documents and complex layouts.\n\n> **v0.4.0 Update**: PDF processing is now **production-ready** with embedded pdfium via `edgequake-pdf2md v0.4.1`. No external library setup required — just upload your PDFs!\n\n---\n\n## Features\n\n### 🚀 High Performance\n\n- **Async-First**: Tokio-based runtime for maximum concurrency\n- **Zero-Copy**: Efficient memory management with Rust ownership\n- **Parallel Processing**: Multi-threaded entity extraction and embeddings\n- **Fast Storage**: PostgreSQL AGE for graph + pgvector for embeddings\n- **SQL Pre-Filtering**: Metadata filters (tenant, workspace, document) pushed to SQL WHERE clauses with GIN + B-tree indexes — up to 90% fewer wasted vector scans at scale\n\n### 💉 Knowledge Injection ✨ **NEW in 0.8.0** ([#131](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fissues\u002F131))\n\n- **Domain Glossaries**: Inject acronym definitions (OEE, NLP, ML) and synonym mappings that expand query terms automatically\n- **Invisible Citations**: Injection entries enrich the knowledge graph but are **never shown as source citations** in query results\n- **Full CRUD API**: `PUT`, `GET`, `PATCH`, `DELETE` per workspace — `POST \u002Fapi\u002Fv1\u002Fworkspaces\u002F:id\u002Finjection\u002Fupload` for file-based injection\n- **Text & File Input**: Accept plain-text definitions or upload `.txt`\u002F`.md` glossary files\n- **Status Polling**: Background processing with entity count tracking and `completed`\u002F`failed`\u002F`processing` status\n- **Dedicated UI**: `\u002Fknowledge` page with list view, inline editing, delete confirmation, and entity count display\n- **Query Expansion**: Automatically expands queries using injected synonyms before vector search\n\n### 🏷️ Custom Entity Configuration ✨ **NEW in 0.9.0** ([#85](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fissues\u002F85))\n\n- **Domain Presets**: Choose from 6 curated presets — General, Manufacturing, Healthcare, Legal, Research, Finance\n- **Up to 50 Entity Types**: Configure up to 50 domain-specific types per workspace (raised from 20)\n- **Custom Types**: Add any UPPERCASE_UNDERSCORED entity type beyond the preset (e.g. `BEARING_TYPE`, `VIBRATION_ANOMALY`)\n- **Per-Workspace Config**: Entity types are set at workspace creation and stored in workspace metadata\n- **Auto-Normalization**: Input is trimmed, uppercased, and deduplicated before storage\n- **Live UI Selector**: Collapsible entity-type section in workspace creation dialog with chip display and count badge\n- **Backward Compatible**: Existing workspaces without custom config automatically use the 9 default general types\n\n### Knowledge Graph\n\n- **Entity Extraction**: Automatic detection of people, organizations, locations, concepts, events, technologies, and products (7 configurable types)\n- **Relationship Mapping**: LLM-powered relationship identification with keyword tagging\n- **Gleaning**: Multi-pass extraction catches 15-25% more entities than single-pass\n- **Community Detection**: Louvain modularity optimization clusters related entities for thematic queries\n- **Graph Visualization**: Interactive Sigma.js-powered frontend with zoom\u002Fpan\n\n### 📄 PDF Processing (Production Ready in v0.4.0)\n\n- **Text Mode**: Fast pdfium-based extraction for standard PDFs (default, zero-config)\n- **Vision Mode** ✨: LLM reads each page as an image — GPT-4o, Claude 3.5+, Gemini 2.5 supported\n- **Automatic Fallback**: Vision failures gracefully fall back to text extraction (BR1010)\n- **Table Reconstruction**: Vision mode recovers complex tables that text parsers mangle\n- **Multi-Column Layout**: LLM understands reading order across multi-column pages\n- **Embedded pdfium**: No `PDFIUM_DYNAMIC_LIB_PATH` env var needed — binary ships inside the binary\n\n### 🔍 6 Query Modes\n\n1. **Naive**: Simple vector similarity — fastest for keyword-like lookups (~100-300ms)\n2. **Local**: Entity-centric with local graph neighborhood — best for specific relationships (~200-500ms)\n3. **Global**: Community-based semantic search — best for thematic\u002Fhigh-level questions (~300-800ms)\n4. **Hybrid** _(default)_: Combines local + global for balanced, comprehensive results (~400-1000ms)\n5. **Mix**: Weighted combination of naive + graph results with configurable ratios\n6. **Bypass**: Direct LLM query without RAG retrieval — useful for general questions\n\n### 🌐 REST API\n\n- **OpenAPI 3.0**: Full Swagger documentation at `\u002Fswagger-ui`\n- **Streaming**: Server-Sent Events (SSE) for real-time responses\n- **Versioned**: `\u002Fapi\u002Fv1\u002F*` with backward compatibility\n- **Health Checks**: Kubernetes-ready `\u002Fhealth`, `\u002Fready`, `\u002Flive`\n\n### 🎯 React 19 Frontend\n\n- **Real-Time Streaming**: Token-by-token generation display\n- **Graph Visualization**: Interactive network graph with zoom\u002Fpan\n- **Document Upload**: Drag-and-drop with progress tracking\n- **Configuration UI**: Visual PDF processing config builder\n\n### 🔌 MCP (Model Context Protocol)\n\n- **Agent Integration**: Expose EdgeQuake capabilities to AI agents via [MCP](https:\u002F\u002Fmodelcontextprotocol.io\u002F)\n- **Tool Discovery**: Agents can query, upload, and explore knowledge graphs programmatically\n- **Interoperability**: Works with Claude, Cursor, and other MCP-compatible clients\n\nSee [mcp\u002F](mcp\u002F) for server implementation details.\n\n---\n\n## Quick Start\n\n### ⚡ Option 1 — One Command (Docker, ~30s, no build required)\n\n> **Zero prerequisites beyond Docker.**  \n> No Rust, no Node.js, no `cargo build`, no `npm install`.\n\n```bash\n# Download and run the interactive setup wizard\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fquickstart.sh | sh\n```\n\nThe wizard guides you through:\n1. **Provider selection** — choose OpenAI or Ollama (never guessed from environment variables)\n2. **Model selection** — pick your LLM + embedding model from a curated, priced menu\n3. **Validation** — API key check (OpenAI) or Ollama ping + model-availability check\n4. **Stack startup** — pulls images, starts services, and polls health for up to 90 seconds\n5. **Re-run aware** — detects running\u002Fstopped containers and existing data volumes; offers \"Update & Reconfigure\" or safe \"Fresh Start\" (requires typing `DELETE`)\n\nOr with `docker compose` directly (pipe to compose):\n\n```bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  | docker compose -f - up -d\n```\n\nOr download the compose file first, then start:\n\n```bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n```\n\n**Then open:** http:\u002F\u002Flocalhost:3000\n\n| Service | URL                              |\n| ------- | -------------------------------- |\n| Web UI  | http:\u002F\u002Flocalhost:3000            |\n| API     | http:\u002F\u002Flocalhost:8080            |\n| Swagger | http:\u002F\u002Flocalhost:8080\u002Fswagger-ui |\n| Health  | http:\u002F\u002Flocalhost:8080\u002Fhealth     |\n\n**Headless \u002F CI install (no interactive terminal):**\n\n```bash\nEDGEQUAKE_LLM_PROVIDER=openai \\\n  OPENAI_API_KEY=sk-... \\\n  docker compose -f docker-compose.quickstart.yml up -d\n```\n\n**Management:**\n\n```bash\ndocker compose -f docker-compose.quickstart.yml logs -f    # tail logs\ndocker compose -f docker-compose.quickstart.yml ps         # check status\ndocker compose -f docker-compose.quickstart.yml down       # stop\n```\n\n> **Pinned version:** `EDGEQUAKE_VERSION=0.10.1 sh quickstart.sh` to use a specific release.\n\n---\n\n### 🛠️ Option 2 — Development Setup (Rust toolchain required)\n\n#### Prerequisites\n\n- **Rust**: 1.78 or later ([Install Rust](https:\u002F\u002Frustup.rs))\n- **Node.js**: 18+ or Bun 1.0+ ([Install Node](https:\u002F\u002Fnodejs.org))\n- **Docker**: For PostgreSQL ([Install Docker](https:\u002F\u002Fwww.docker.com\u002Fget-started))\n- **Ollama**: For local LLM (optional, [Install Ollama](https:\u002F\u002Follama.ai))\n\n#### Installation (5 minutes)\n\n```bash\n# 1. Clone the repository\ngit clone https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake.git\ncd edgequake\n\n# 2. Install dependencies\nmake install\n\n# 3. Configure the frontend environment\ncp edgequake_webui\u002F.env.local.example edgequake_webui\u002F.env.local\n\n# 4. Start the full stack (PostgreSQL + Backend + Frontend)\nmake dev\n```\n\n**That's it!** 🎉\n\n- **Backend**: http:\u002F\u002Flocalhost:8080\n- **Frontend**: http:\u002F\u002Flocalhost:3000\n- **Swagger UI**: http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n- **Provider**: Ollama (local, free)\n\n### First Document Upload\n\n```bash\n# Upload a file (PDF, TXT, MD, etc.)\ncurl -X POST http:\u002F\u002Flocalhost:8080\u002Fapi\u002Fv1\u002Fdocuments\u002Fupload \\\n  -F \"file=@your-document.pdf\"\n```\n\n**Response**:\n\n```json\n{\n  \"id\": \"doc-123\",\n  \"status\": \"completed\",\n  \"chunk_count\": 15,\n  \"entity_count\": 12,\n  \"relationship_count\": 8,\n  \"processing_time_ms\": 2500\n}\n```\n\n### First Query\n\n```bash\n# Query the knowledge graph\ncurl -X POST http:\u002F\u002Flocalhost:8080\u002Fapi\u002Fv1\u002Fquery \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"query\": \"What are the main concepts?\",\n    \"mode\": \"hybrid\"\n  }'\n```\n\n**Response**:\n\n```json\n{\n  \"answer\": \"The main concepts are: knowledge graphs, entity extraction, and hybrid retrieval...\",\n  \"sources\": [\n    { \"chunk_id\": \"chunk-1\", \"similarity\": 0.92 },\n    { \"chunk_id\": \"chunk-5\", \"similarity\": 0.87 }\n  ],\n  \"entities\": [\"KNOWLEDGE_GRAPH\", \"ENTITY_EXTRACTION\"],\n  \"relationships\": [\n    {\n      \"source\": \"KNOWLEDGE_GRAPH\",\n      \"target\": \"ENTITY_EXTRACTION\",\n      \"type\": \"ENABLES\"\n    }\n  ]\n}\n```\n\n---\n\n## Architecture\n\n```\n┌────────────────────────────────────────────────────────────────────────────┐\n│                              EdgeQuake System                              │\n└────────────────────────────────────────────────────────────────────────────┘\n\n┌─────────────────────────────────────────────────────────────────────────────┐\n│  Frontend (React 19 + TypeScript)                                           │\n│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐     │\n│  │  Document    │  │    Query     │  │    Graph     │  │   Settings   │     │\n│  │   Upload     │  │  Interface   │  │ Visualization│  │   Config     │     │\n│  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘     │\n│         │                 │                 │                 │             │\n│         └─────────────────┴─────────────────┴─────────────────┘             │\n│                                    │                                        │\n│                                    ▼                                        │\n│  ┌────────────────────────────────────────────────────────────────────┐     │\n│  │                         REST API (Axum)                            │     │\n│  │  \u002Fapi\u002Fv1\u002Fdocuments  •  \u002Fapi\u002Fv1\u002Fquery  •  \u002Fapi\u002Fv1\u002Fgraph             │     │\n│  │  OpenAPI 3.0 Spec  •  SSE Streaming  •  Health Checks              │     │\n│  └────────────────────────────────────────────────────────────────────┘     │\n└─────────────────────────────────────────────────────────────────────────────┘\n                                    │\n                                    ▼\n┌─────────────────────────────────────────────────────────────────────────────┐\n│  Backend (Rust - 11 Crates)                                                 │\n│  ┌──────────────────────────────────────────────────────────────────────┐   │\n│  │  edgequake-core          │  Orchestration & Pipeline                 │   │\n│  │  edgequake-llm           │  OpenAI, Anthropic, MiniMax, Ollama, etc. │   │\n│  │  edgequake-storage       │  PostgreSQL AGE, Memory adapters          │   │\n│  │  edgequake-api           │  REST API server                          │   │\n│  │  edgequake-pipeline      │  Document ingestion pipeline              │   │\n│  │  edgequake-query         │  Query engine (6 modes)                   │   │\n│  │  edgequake-pdf           │  PDF extraction (vision \u002F edgeparse)      │   │\n│  │  edgequake-auth          │  Authentication & authorization           │   │\n│  │  edgequake-audit         │  Compliance & audit logging               │   │\n│  │  edgequake-tasks         │  Background job processing                │   │\n│  │  edgequake-rate-limiter  │  Rate limiting middleware                 │   │\n│  └──────────────────────────────────────────────────────────────────────┘   │\n│                                    │                                        │\n│                    ┌───────────────┴───────────────┐                        │\n│                    ▼                               ▼                        │\n│  ┌─────────────────────────────┐   ┌──────────────────────────────────┐     │\n│  │   LLM Providers             │   │   Storage Backends               │     │\n│  │  • OpenAI (gpt-4.1-nano)    │   │  • PostgreSQL 15+ (AGE + vector) │     │\n│  │  • Anthropic (Claude)       │   │  • In-Memory (dev\u002Ftesting)       │     │\n│  │  • MiniMax (MiniMax-M2.7)   │   │  • Graph: Property graph model   │     │\n│  │  • Ollama (gemma3:12b)      │   │  • Vector: pgvector embeddings   │     │\n│  │  • LM Studio, xAI, Gemini   │   │                                  │     │\n│  │  Auto-detection via env     │   │                                  │     │\n│  └─────────────────────────────┘   └──────────────────────────────────┘     │\n└─────────────────────────────────────────────────────────────────────────────┘\n\n                    Data Flow: Document → Chunks → Entities → Graph\n                    Query Flow: Question → Graph Traversal → LLM → Answer\n```\n\n### How the Algorithm Works\n\nEdgeQuake implements the [LightRAG algorithm](https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.05779) in Rust. The core insight: **extract a knowledge graph during indexing, then traverse it during querying**.\n\n**Indexing Pipeline** (per document):\n\n1. **Chunk** — Split document into ~1200-token segments with 100-token overlap\n2. **Extract** — LLM parses each chunk into `(entity, type, description)` and `(source, target, keywords, description)` tuples\n3. **Glean** — Optional second pass catches missed entities (improves recall by ~18%)\n4. **Normalize** — Deduplicate entities via case normalization and description merging (reduces duplicates by ~36-40%)\n5. **Embed** — Generate vector embeddings for chunks and entities\n6. **Store** — Write to PostgreSQL: chunks to pgvector, entities\u002Frelationships to Apache AGE graph\n\n**Query Flow** (6 modes):\n\n- **Naive** — Vector similarity on chunks only (fast, no graph)\n- **Local** — Find relevant entities via vector search, then traverse their local graph neighborhood\n- **Global** — Use Louvain community detection to find thematic clusters, retrieve community summaries\n- **Hybrid** _(default)_ — Combine local entity context + global community context\n- **Mix** — Weighted blend of naive vector results and graph-enhanced results\n- **Bypass** — Skip retrieval entirely, pass question directly to LLM\n\nSee [LightRAG Algorithm Deep Dive](docs\u002Fdeep-dives\u002Flightrag-algorithm.md) for the complete technical explanation.\n\n---\n\n## Documentation\n\n### 📚 Complete Documentation Index\n\nExplore the full documentation at [docs\u002FREADME.md](docs\u002FREADME.md)\n\n### 📦 SDKs\n\nEdgeQuake provides official SDKs for multiple languages:\n\n- [Python SDK](sdks\u002Fpython\u002FREADME.md) ([Changelog](sdks\u002Fpython\u002FCHANGELOG.md))\n- [TypeScript SDK](sdks\u002Ftypescript\u002FREADME.md) ([Changelog](sdks\u002Ftypescript\u002FCHANGELOG.md))\n- [Rust SDK](sdks\u002Frust\u002FREADME.md)\n- [Other SDKs](sdks\u002F) for C#, Go, Java, Kotlin, PHP, Ruby, Swift\n\nSee the [CHANGELOG.md](CHANGELOG.md) for SDK and core updates.\n\n### 🚀 Getting Started (15 minutes)\n\n| Guide                                                      | Description                | Time   |\n| ---------------------------------------------------------- | -------------------------- | ------ |\n| [Installation](docs\u002Fgetting-started\u002Finstallation.md)       | Prerequisites and setup    | 5 min  |\n| [Quick Start](docs\u002Fgetting-started\u002Fquick-start.md)         | First ingestion and query  | 10 min |\n| [First Ingestion](docs\u002Fgetting-started\u002Ffirst-ingestion.md) | Understanding the pipeline | 15 min |\n\n### 📖 Tutorials (Hands-On)\n\n| Tutorial                                                             | Description                     |\n| -------------------------------------------------------------------- | ------------------------------- |\n| [Building Your First RAG App](docs\u002Ftutorials\u002Ffirst-rag-app.md)       | End-to-end tutorial             |\n| [PDF Ingestion](docs\u002Ftutorials\u002Fpdf-ingestion.md)                     | PDF upload and configuration    |\n| [Multi-Tenant Setup](docs\u002Ftutorials\u002Fmulti-tenant.md)                 | Workspace isolation             |\n| [Document Ingestion](docs\u002Ftutorials\u002Fdocument-ingestion.md)           | Upload and processing workflows |\n| [Migration from LightRAG](docs\u002Ftutorials\u002Fmigration-from-lightrag.md) | Python to Rust migration guide  |\n\n### 🏗️ Architecture (How It Works)\n\n| Document                                     | Description                           |\n| -------------------------------------------- | ------------------------------------- |\n| [Overview](docs\u002Farchitecture\u002Foverview.md)    | System design and components          |\n| [Data Flow](docs\u002Farchitecture\u002Fdata-flow.md)  | How documents flow through the system |\n| [Crate Reference](docs\u002Farchitecture\u002Fcrates\u002F) | 11 Rust crates explained              |\n\n### 💡 Core Concepts (Theory)\n\n| Concept                                                 | Description                       |\n| ------------------------------------------------------- | --------------------------------- |\n| [Graph-RAG](docs\u002Fconcepts\u002Fgraph-rag.md)                 | Why knowledge graphs enhance RAG  |\n| [Entity Extraction](docs\u002Fconcepts\u002Fentity-extraction.md) | LLM-based entity recognition      |\n| [Knowledge Graph](docs\u002Fconcepts\u002Fknowledge-graph.md)     | Nodes, edges, and communities     |\n| [Hybrid Retrieval](docs\u002Fconcepts\u002Fhybrid-retrieval.md)   | Combining vector and graph search |\n\n### Deep Dives (Advanced)\n\n| Article                                                         | Description                                  |\n| --------------------------------------------------------------- | -------------------------------------------- |\n| [LightRAG Algorithm](docs\u002Fdeep-dives\u002Flightrag-algorithm.md)     | Core algorithm: extraction, graph, retrieval |\n| [Query Modes](docs\u002Fdeep-dives\u002Fquery-modes.md)                   | 6 modes explained with trade-offs            |\n| [Entity Normalization](docs\u002Fdeep-dives\u002Fentity-normalization.md) | Deduplication and description merging        |\n| [Gleaning](docs\u002Fdeep-dives\u002Fgleaning.md)                         | Multi-pass extraction for completeness       |\n| [Community Detection](docs\u002Fdeep-dives\u002Fcommunity-detection.md)   | Louvain clustering for global queries        |\n| [Chunking Strategies](docs\u002Fdeep-dives\u002Fchunking-strategies.md)   | Token-based segmentation with overlap        |\n| [Embedding Models](docs\u002Fdeep-dives\u002Fembedding-models.md)         | Model selection and dimension trade-offs     |\n| [Graph Storage](docs\u002Fdeep-dives\u002Fgraph-storage.md)               | Apache AGE property graph backend            |\n| [Vector Storage](docs\u002Fdeep-dives\u002Fvector-storage.md)             | pgvector HNSW indexing and search            |\n| [PDF Processing](docs\u002Fdeep-dives\u002Fpdf-processing.md)             | Vision and EdgeParse extraction pipeline     |\n| [Cost Tracking](docs\u002Fdeep-dives\u002Fcost-tracking.md)               | LLM cost monitoring per operation            |\n| [Pipeline Progress](docs\u002Fdeep-dives\u002Fpipeline-progress.md)       | Real-time progress tracking                  |\n\n### 📊 Comparisons\n\n| Comparison                                                     | Key Insights                       |\n| -------------------------------------------------------------- | ---------------------------------- |\n| [vs LightRAG (Python)](docs\u002Fcomparisons\u002Fvs-lightrag-python.md) | Performance and design differences |\n| [vs GraphRAG](docs\u002Fcomparisons\u002Fvs-graphrag.md)                 | Microsoft's approach comparison    |\n| [vs Traditional RAG](docs\u002Fcomparisons\u002Fvs-traditional-rag.md)   | Why graphs matter                  |\n\n### API Reference\n\n| API                                                | Description           |\n| -------------------------------------------------- | --------------------- |\n| [REST API](docs\u002Fapi-reference\u002Frest-api.md)         | HTTP endpoints        |\n| [Extended API](docs\u002Fapi-reference\u002Fextended-api.md) | Advanced API features |\n\n### Operations (Production)\n\n| Guide                                                       | Description           |\n| ----------------------------------------------------------- | --------------------- |\n| [Deployment](docs\u002Foperations\u002Fdeployment.md)                 | Production deployment |\n| [Configuration](docs\u002Foperations\u002Fconfiguration.md)           | All config options    |\n| [Monitoring](docs\u002Foperations\u002Fmonitoring.md)                 | Observability setup   |\n| [Performance Tuning](docs\u002Foperations\u002Fperformance-tuning.md) | Optimization guide    |\n\n### 🐛 Troubleshooting\n\n| Guide                                                    | Description                  |\n| -------------------------------------------------------- | ---------------------------- |\n| [Common Issues](docs\u002Ftroubleshooting\u002Fcommon-issues.md)   | Debugging guide              |\n| [PDF Extraction](docs\u002Ftroubleshooting\u002Fpdf-extraction.md) | PDF-specific troubleshooting |\n\n### 🔗 Integrations\n\n| Integration                                           | Description                          |\n| ----------------------------------------------------- | ------------------------------------ |\n| [MCP Server](mcp\u002F)                                    | Model Context Protocol for AI agents |\n| [OpenWebUI](docs\u002Fintegrations\u002Fopen-webui.md)          | Chat interface with Ollama emulation |\n| [LangChain](docs\u002Fintegrations\u002Flangchain.md)           | Retriever and agent integration      |\n| [Custom Clients](docs\u002Fintegrations\u002Fcustom-clients.md) | Python, TypeScript, Rust, Go clients |\n\n### 📓 More Resources\n\n- [FAQ](docs\u002Ffaq.md) - Frequently asked questions\n- [Cookbook](docs\u002Fcookbook.md) - Practical recipes\n- [Security](docs\u002Fsecurity\u002F) - Security best practices\n\n---\n\n## Docker Deployment\n\nEdgeQuake ships a production-ready multi-arch Docker image published to **GitHub Container Registry (GHCR)** on every tagged release. Supports `linux\u002Famd64` (x86 servers, Intel Macs) and `linux\u002Farm64` (Apple Silicon, AWS Graviton) out of the box — no QEMU emulation needed.\n\n```bash\n# Pull latest release — architecture is selected automatically\ndocker pull ghcr.io\u002Fraphaelmansuy\u002Fedgequake:latest\n\n# Pin to a specific version\ndocker pull ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.10.1\n```\n\n> **First-time package visibility:** After the first CI\u002FCD publish, you may need to set the GHCR package visibility to **Public** under [GitHub → Your Profile → Packages → edgequake → Package Settings → Change Visibility](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy?tab=packages). Once public, `docker pull` works without authentication.\n\nThree deployment options are available depending on your setup:\n\n---\n\n### Option A — API only (bring your own PostgreSQL)\n\nFastest start if you already have PostgreSQL (with `pgvector` + `apache_age` extensions).\nNo Rust toolchain, no local build — just pull and run.\n\n```bash\n# One-liner\ndocker run -d \\\n  --name edgequake \\\n  -p 8080:8080 \\\n  -e DATABASE_URL=\"postgres:\u002F\u002Fuser:password@your-db-host:5432\u002Fedgequake\" \\\n  -e EDGEQUAKE_LLM_PROVIDER=openai \\\n  -e OPENAI_API_KEY=\"sk-...\" \\\n  ghcr.io\u002Fraphaelmansuy\u002Fedgequake:latest\n\n# Verify\ncurl http:\u002F\u002Flocalhost:8080\u002Fhealth\n```\n\nOr with `docker compose` (recommended for persistent config):\n\n```bash\ncd edgequake\u002Fdocker\ncp .env.example .env        # set DATABASE_URL and provider key(s)\ndocker compose -f docker-compose.api-only.yml up -d\ncurl http:\u002F\u002Flocalhost:8080\u002Fhealth\n```\n\n---\n\n### Option B — Full stack using prebuilt images *(fastest, no Rust needed)*\n\nPulls the EdgeQuake API, frontend, and PostgreSQL images directly from GHCR. No Rust toolchain, Node.js toolchain, or local Docker build is required.\n\n```bash\ncd edgequake\u002Fdocker\ncp .env.example .env        # set EDGEQUAKE_LLM_PROVIDER and your API key\ndocker compose -f docker-compose.prebuilt.yml up -d\n```\n\nServices started:\n\n| Service         | Port | Image                                                     |\n| --------------- | ---- | --------------------------------------------------------- |\n| `edgequake` API | 8080 | `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:latest`                  |\n| `frontend`      | 3000 | `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:latest`         |\n| `postgres`      | 5432 | `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:latest`         |\n\n```bash\n# Use a specific API version\nEDGEQUAKE_VERSION=0.10.1 docker compose -f docker-compose.prebuilt.yml up -d\n\n# Logs\ndocker compose -f docker-compose.prebuilt.yml logs -f edgequake\n\n# Health check\ncurl http:\u002F\u002Flocalhost:8080\u002Fhealth\n\n# Stop\ndocker compose -f docker-compose.prebuilt.yml down\n```\n\n---\n\n### Option C — Full stack, build from source (includes frontend)\n\nBuilds everything locally including the Next.js web UI. Requires Docker BuildKit and sufficient disk space (~4 GB for the Rust build cache).\n\n```bash\ncd edgequake\u002Fdocker\ndocker compose up -d         # builds API, frontend, and postgres\n```\n\nServices started:\n\n| Service              | Port | Description                           |\n| -------------------- | ---- | ------------------------------------- |\n| `edgequake` API      | 8080 | REST API + document processing        |\n| `frontend` (Next.js) | 3000 | Web UI                                |\n| `postgres`           | 5432 | PostgreSQL with pgvector + Apache AGE |\n\n```bash\n# Follow logs\ndocker compose logs -f edgequake\n\n# Check health\ncurl http:\u002F\u002Flocalhost:8080\u002Fhealth\n\n# Stop\ndocker compose down\n```\n\n---\n\n### Environment Variables\n\nAll compose files read from a `.env` file placed in the same directory. Copy `edgequake\u002Fdocker\u002F.env.example` to get started.\n\n| Variable                       | Default                             | Description                                                                             |\n| ------------------------------ | ----------------------------------- | --------------------------------------------------------------------------------------- |\n| `DATABASE_URL`                 | *(set by compose in full-stack)*    | PostgreSQL connection string                                                            |\n| `EDGEQUAKE_LLM_PROVIDER`       | `ollama`                            | LLM provider: `openai`, `anthropic`, `gemini`, `mistral`, `azure`, `vertexai`, `ollama` |\n| `EDGEQUAKE_EMBEDDING_PROVIDER` | *(same as LLM)*                     | Separate embedding provider for hybrid mode                                             |\n| `OPENAI_API_KEY`               | —                                   | Required for `openai` \u002F `azure`                                                         |\n| `ANTHROPIC_API_KEY`            | —                                   | Required for `anthropic`                                                                |\n| `GEMINI_API_KEY`               | —                                   | Required for `gemini`                                                                   |\n| `MISTRAL_API_KEY`              | —                                   | Required for `mistral`                                                                  |\n| `AZURE_OPENAI_API_KEY`         | —                                   | Required for `azure`                                                                    |\n| `AZURE_OPENAI_ENDPOINT`        | —                                   | Azure resource endpoint URL                                                             |\n| `GOOGLE_CLOUD_PROJECT`         | —                                   | Required for `vertexai`                                                                 |\n| `XAI_API_KEY`                  | —                                   | Required for `xai`                                                                      |\n| `OLLAMA_HOST`                  | `http:\u002F\u002Fhost.docker.internal:11434` | Ollama server URL (host machine via gateway)                                            |\n| `EDGEQUAKE_VERSION`            | `latest`                            | GHCR image tag (Option B only)                                                          |\n| `RUST_LOG`                     | `info`                              | Log level (`debug`, `info`, `warn`, `error`)                                            |\n\n> **Tip — Ollama on the host:** When running EdgeQuake inside Docker and Ollama on your machine, leave `OLLAMA_HOST` at its default (`http:\u002F\u002Fhost.docker.internal:11434`). On Linux, the `extra_hosts: host.docker.internal:host-gateway` entry in the compose file resolves this automatically.\n\n---\n\n### Building the Image Locally\n\nThe Dockerfile lives at `edgequake\u002Fdocker\u002FDockerfile` and uses a two-stage build (Rust builder → Debian slim runtime). pdfium is embedded at compile time via `pdfium-auto` — no external shared library is needed.\n\n```bash\n# Build for host architecture\ndocker build -f edgequake\u002Fdocker\u002FDockerfile edgequake -t edgequake:local\n\n# Multi-platform build (requires docker buildx)\ndocker buildx build \\\n  --platform linux\u002Famd64,linux\u002Farm64 \\\n  -f edgequake\u002Fdocker\u002FDockerfile edgequake \\\n  -t edgequake:local --load\n```\n\n---\n\n### CI\u002FCD — Automated Releases\n\nDocker images are built and published automatically via GitHub Actions (`.github\u002Fworkflows\u002Frelease-docker.yml`) when a version tag is pushed:\n\n```bash\n# Tag a release — triggers multi-arch docker build + publish to ghcr.io\ngit tag v0.10.1 && git push origin v0.10.1\n```\n\nBoth `linux\u002Famd64` (ubuntu-latest runner) and `linux\u002Farm64` (native ARM64 runner — no QEMU) are built in parallel and merged into a single multi-arch manifest. The same image tag (`ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.10.1`) works on x86 servers, Apple Silicon Macs, and AWS Graviton instances.\n\nYou can also trigger a manual Docker build + publish without a tag via the `workflow_dispatch` input on GitHub Actions (`Actions → Release — Docker (GHCR) → Run workflow`).\n\n---\n\n## Development\n\n### Building and Testing\n\n```bash\n# Build backend\ncd edgequake && cargo build --release\n\n# Run tests\ncargo test\n\n# Lint and format\ncargo clippy\ncargo fmt\n\n# Build frontend\ncd edgequake_webui\nbun run build\n```\n\n### Make Commands\n\nEdgeQuake uses a unified Makefile for all development tasks:\n\n```bash\n# Full development stack\nmake dev              # Start all services (PostgreSQL + Backend + Frontend)\nmake dev-bg           # Start in background (for agents\u002Fautomation)\nmake dev-memory       # Start with in-memory storage (testing only)\nmake stop             # Stop all services\nmake status           # Check service status\n\n# Backend only\nmake backend-dev      # Run backend with PostgreSQL\nmake backend-memory   # Run backend with in-memory storage\nmake backend-bg       # Run backend in background\nmake backend-test     # Run backend tests\n\n# Frontend only\nmake frontend-dev     # Start frontend dev server\nmake frontend-build   # Build frontend for production\n\n# Database\nmake db-start         # Start PostgreSQL container\nmake db-stop          # Stop PostgreSQL container\nmake db-wait          # Wait for database to be ready\n\n# Quality checks\nmake test             # Run all tests\nmake lint             # Lint all code\nmake format           # Format all code\nmake clean            # Clean build artifacts\n```\n\n### Agent Workflow\n\nEdgeQuake development follows a **Specification-Driven Development** approach using the `edgecode` SOTA coding agent.\n\n- **AGENTS.md**: Comprehensive agent guidelines and workflow\n- **specs\u002F**: All development specifications\n- **OODA Loop**: Iterative development cycles (Observe, Orient, Decide, Act)\n\nSee [AGENTS.md](AGENTS.md) for detailed agent workflow documentation.\n\n---\n\n## Contributing\n\nEdgeQuake is developed using the **edgecode** SOTA coding agent created by **Raphaël MANSUY**. The project follows a **Specification-Driven Development** approach where all changes are specified in the `specs\u002F` directory before implementation.\n\n**Current Status**: `edgecode` is not yet public but will be released soon.\n\n**For now, contributions should go through Raphaël MANSUY directly:**\n\n- **GitHub Issues**: Report bugs and request features\n- **GitHub Discussions**: Ask questions and share ideas\n- **Direct Contact**: For major contributions, contact [@raphaelmansuy](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy)\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for detailed contribution guidelines.\n\n---\n\n## Community & Support\n\n### Code of Conduct\n\nWe are committed to providing a welcoming and inclusive environment. Please read our [Code of Conduct](CODE_OF_CONDUCT.md).\n\n### Support Channels\n\n- **GitHub Issues**: Bug reports and feature requests\n- **GitHub Discussions**: Questions and community help\n- **LinkedIn**: [@raphaelmansuy](https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fraphaelmansuy)\n- **Twitter\u002FX**: [@raphaelmansuy](https:\u002F\u002Ftwitter.com\u002Fraphaelmansuy)\n\n### Founder\n\n**Raphaël MANSUY** 🇫🇷 - 🇭🇰🇨🇳 — Permanent Resident of Hong Kong, building the future of intelligent document retrieval systems and context graph systems.\n\n---\n\n## License\n\nLicensed under the Apache License, Version 2.0 (the \"License\").  \nYou may obtain a copy of the License at:\n\nhttp:\u002F\u002Fwww.apache.org\u002Flicenses\u002FLICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the [LICENSE](LICENSE) file for the specific language governing permissions and limitations.\n\n**Copyright © 2024-2026 Raphaël MANSUY**\n\n---\n\n## Acknowledgments\n\nEdgeQuake is inspired by and builds upon the excellent work of:\n\n- **LightRAG Research Paper** ([arxiv.org\u002Fabs\u002F2410.05779](https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.05779)): We are grateful to the authors of the foundational LightRAG algorithm which powers the core knowledge graph extraction and retrieval capabilities in EdgeQuake. Their innovative approach to entity extraction, relationship mapping, and hybrid retrieval has been instrumental in our framework's design.\n\n  **Special thanks to the LightRAG authors:**\n  - [Zirui Guo](https:\u002F\u002Farxiv.org\u002Fsearch\u002Fcs?searchtype=author&query=Guo,+Z)\n  - [Lianghao Xia](https:\u002F\u002Farxiv.org\u002Fsearch\u002Fcs?searchtype=author&query=Xia,+L)\n  - [Yanhua Yu](https:\u002F\u002Farxiv.org\u002Fsearch\u002Fcs?searchtype=author&query=Yu,+Y)\n  - [Tu Ao](https:\u002F\u002Farxiv.org\u002Fsearch\u002Fcs?searchtype=author&query=Ao,+T)\n  - [Chao Huang](https:\u002F\u002Farxiv.org\u002Fsearch\u002Fcs?searchtype=author&query=Huang,+C)\n\n- **GraphRAG** ([arxiv.org\u002Fabs\u002F2404.16130](https:\u002F\u002Farxiv.org\u002Fabs\u002F2404.16130)): Microsoft's \"From Local to Global\" knowledge graph approach to query-focused summarization.\n  - [Shuai Wang](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fshuaiw\u002F)\n  - [Yingqiang Ge](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fyinge\u002F)\n  - [Ying Shen](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fyingshen\u002F)\n  - [Jianfeng Gao](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fjfgao\u002F)\n  - [Xiaodong Liu](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fxiaodl\u002F)\n  - [Yelong Shen](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fyelongshen\u002F)\n  - [Jianfeng Wang](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fjianfw\u002F)\n  - [Ming Zhou](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fzhou\u002F)\n- **Rust Community**: For the amazing async ecosystem (Tokio, Axum, SQLx) that enables EdgeQuake's high performance\n- **React Community**: For React 19 and the modern frontend stack that powers our interactive UI\n\n---\n\n## Quick Links\n\n| Resource             | URL                                                                              |\n| -------------------- | -------------------------------------------------------------------------------- |\n| 📚 Full Documentation | [docs\u002FREADME.md](docs\u002FREADME.md)                                                 |\n| 🚀 Quick Start Guide  | [docs\u002Fgetting-started\u002Fquick-start.md](docs\u002Fgetting-started\u002Fquick-start.md)       |\n| 📦 SDKs Overview      | [sdks\u002F](sdks\u002F)                                                                   |\n| 🐍 Python SDK         | [sdks\u002Fpython\u002FREADME.md](sdks\u002Fpython\u002FREADME.md)                                   |\n| 🦀 Rust SDK           | [sdks\u002Frust\u002FREADME.md](sdks\u002Frust\u002FREADME.md)                                       |\n| 🟦 TypeScript SDK     | [sdks\u002Ftypescript\u002FREADME.md](sdks\u002Ftypescript\u002FREADME.md)                           |\n| 📜 CHANGELOG          | [CHANGELOG.md](CHANGELOG.md)                                                     |\n| 🔧 Agent Workflow     | [AGENTS.md](AGENTS.md)                                                           |\n| 🤝 Contributing       | [CONTRIBUTING.md](CONTRIBUTING.md)                                               |\n| 📜 Code of Conduct    | [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)                                         |\n| 📄 License            | [LICENSE](LICENSE)                                                               |\n| 🐛 Report Issues      | [GitHub Issues](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fissues)               |\n| 💬 Discussions        | [GitHub Discussions](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fdiscussions)     |\n| 🌐 Repository         | [github.com\u002Fraphaelmansuy\u002Fedgequake](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake) |\n\n---\n\n**Ready to build intelligent document retrieval?** [Get started now!](docs\u002Fgetting-started\u002Fquick-start.md)\n\n## Star History\n\n[![Star History Chart](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fraphaelmansuy_edgequake_readme_d675b8d8c588.png)](https:\u002F\u002Fwww.star-history.com\u002F#raphaelmansuy\u002Fedgequake&type=date&legend=top-left)\n","# EdgeQuake\n\n\u003Ca href=\"https:\u002F\u002Ftrendshift.io\u002Frepositories\u002F20893\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fraphaelmansuy_edgequake_readme_4a68feb902da.png\" alt=\"raphaelmansuy%2Fedgequake | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"\u002F>\u003C\u002Fa>\n\n> **高性能图RAG框架，基于Rust**  \n> 将文档转化为智能知识图谱，实现卓越的检索与生成能力\n\n[![版本](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fversion-0.10.1-blue.svg?style=flat)](CHANGELOG.md)\n[![Rust](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Frust-1.78+-orange.svg?style=flat&logo=rust)](https:\u002F\u002Fwww.rust-lang.org)\n[![许可证](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-Apache%202.0-blue.svg?style=flat)](LICENSE)\n[![构建状态](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fbuild-passing-brightgreen.svg?style=flat)](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake)\n[![文档](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdocs-available-blue.svg?style=flat)](docs\u002FREADME.md)\n\n> **v0.10.1** — 加强了Sigma图查看器的性能，为密集PDF文件设定了更安全的嵌入限制，并实现了`curl | sh`和GHCR安装流程的完全绿色通过。完整详情请参阅[CHANGELOG](CHANGELOG.md)。\n\n---\n\n![EdgeQuake前端截图](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fraphaelmansuy_edgequake_readme_1b68abed320e.png)\n\n## 为什么选择EdgeQuake？\n\n传统的RAG系统仅依靠向量相似度来检索文档片段。这种方法适用于简单的查询，但在多跳推理（“X如何通过Z与Y相关？”）、主题性问题（“主要主题有哪些？”）以及关系型查询方面表现不佳。核心问题在于：**向量能够捕捉语义相似性，却会丢失概念之间的结构化关系**。\n\n**EdgeQuake**通过在Rust中实现[LightRAG算法](https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.05779)解决了这一难题：文档不仅会被分块并嵌入向量空间，还会被分解为一个由实体和关系构成的**知识图谱**。在查询时，系统会同时遍历向量空间和图结构，将向量搜索的速度与图遍历的推理能力相结合。\n\n### EdgeQuake的独特之处\n\n- **知识图谱**：由LLM驱动的实体提取和关系映射，能够创建对文档的结构化理解——而不仅仅是关键词匹配。\n- **6种查询模式**：从快速的朴素向量搜索到基于图遍历的混合查询，每种模式都针对不同类型的提问进行了优化。\n- **Rust性能**：采用异步优先的Tokio架构，结合零拷贝操作，可处理数千个并发请求。\n- **PDF LLM视觉管道 ✅ 0.4.0新增**：多模态LLM（GPT-4o、Claude、Gemini）可以将PDF页面作为图像进行读取——开箱即用即可处理扫描文档、复杂表格和多栏布局。\n- **生产就绪**：支持OpenAPI 3.0 REST API、SSE流式传输、健康检查以及多租户工作空间隔离。\n- **现代化前端**：使用React 19，配合交互式的Sigma.js图可视化工具。\n\n### 性能基准测试\n\n| 指标                 | EdgeQuake        | 传统RAG | 改进幅度 |\n| ---------------------- | ---------------- | --------------- | ----------- |\n| 实体提取      | ~2-3倍更多       | 基线        | 3倍          |\n| 查询延迟（混合模式） | \u003C 200ms          | ~1000ms         | 快5倍   |\n| 文档处理    | 25秒（1万 tokens） | ~60秒            | 快2.4倍 |\n| 并发用户数       | 1000+            | ~100            | 高10倍         |\n| 每文档内存占用 | 2MB              | ~8MB            | 更优4倍   |\n\n> **v0.4.0 — PDF现已生产就绪**：PDF处理管道内置了pdfium（无需配置），并提供可选的LLM视觉模式。文本模式提取适用于所有标准PDF；启用`use_vision_llm = true`（或发送`X-Use-Vision: true`）即可将页面路由至具备视觉能力的LLM，以处理扫描文档和复杂布局。\n\n> **v0.4.0更新**：PDF处理现可通过`edgequake-pdf2md v0.4.1`中的内置pdfium实现**生产就绪**。无需额外设置任何库，只需上传PDF即可！\n\n---\n\n## 功能特性\n\n### 🚀 高性能\n\n- **异步优先**：基于Tokio的运行时，实现最大并发能力。\n- **零拷贝**：利用Rust的所有权机制高效管理内存。\n- **并行处理**：多线程实体提取与向量嵌入。\n- **快速存储**：使用PostgreSQL AGE存储图数据，pgvector存储向量嵌入。\n- **SQL预过滤**：元数据过滤条件（租户、工作空间、文档）会被推送到SQL WHERE子句中，结合GIN + B-tree索引，可在大规模场景下减少高达90%的无效向量扫描。\n\n### 💉 知识注入 ✨ **0.8.0新增** ([#131](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fissues\u002F131))\n\n- **领域术语表**：注入缩写定义（OEE、NLP、ML）及同义词映射，自动扩展查询词。\n- **隐形引用**：注入条目会丰富知识图谱，但**不会显示为查询结果中的来源引用**。\n- **完整的CRUD API**：按工作空间提供`PUT`、`GET`、`PATCH`、`DELETE`接口；通过`POST \u002Fapi\u002Fv1\u002Fworkspaces\u002F:id\u002Finjection\u002Fupload`可进行基于文件的注入。\n- **文本与文件输入**：接受纯文本定义或上传`.txt`\u002F`.md`术语表文件。\n- **状态轮询**：后台处理过程中会跟踪实体数量，并显示`已完成`、`失败`或`处理中`的状态。\n- **专用UI**：`\u002Fknowledge`页面提供列表视图、内联编辑、删除确认及实体数量显示。\n- **查询扩展**：在向量搜索之前，自动使用注入的同义词扩展查询。\n\n### 🏷️ 自定义实体配置 ✨ **0.9.0新增** ([#85](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fissues\u002F85))\n\n- **领域预设**：可选择6种精选预设——通用、制造、医疗、法律、科研、金融。\n- **最多50种实体类型**：每个工作空间可配置多达50种领域特定类型（此前上限为20种）。\n- **自定义类型**：可在预设之外添加任意大写下划线命名的实体类型（如`BEARING_TYPE`、`VIBRATION_ANOMALY`）。\n- **工作空间级配置**：实体类型在创建工作空间时设定，并存储于工作空间元数据中。\n- **自动归一化**：输入内容会在存储前进行修剪、转大写并去重。\n- **实时UI选择器**：工作空间创建对话框中包含可折叠的实体类型部分，显示芯片标签和数量徽章。\n- **向后兼容**：未进行自定义配置的现有工作空间将自动使用9种默认的通用类型。\n\n### 知识图谱\n\n- **实体提取**：自动检测人物、组织、地点、概念、事件、技术和产品（共7种可配置类型）。\n- **关系映射**：由LLM驱动的关系识别，结合关键词标注。\n- **多次提取**：多轮提取可比单次提取多捕获15-25%的实体。\n- **社区检测**：通过Louvain模块度优化，将相关实体聚类，便于主题性查询。\n- **图可视化**：交互式的Sigma.js前端，支持缩放和拖动。\n\n### 📄 PDF 处理（v0.4.0 已正式上线）\n\n- **文本模式**：基于 pdfium 的快速提取，适用于标准 PDF（默认设置，无需配置）\n- **视觉模式** ✨：使用大模型将每页作为图像读取 — 支持 GPT-4o、Claude 3.5+ 和 Gemini 2.5\n- **自动回退**：当视觉模式失败时，会优雅地回退到文本提取（BR1010）\n- **表格重建**：视觉模式能够恢复文本解析器容易出错的复杂表格\n- **多栏布局**：大模型能够理解多栏页面的阅读顺序\n- **内置 pdfium**：无需设置 `PDFIUM_DYNAMIC_LIB_PATH` 环境变量 — 二进制文件已打包在主程序中\n\n### 🔍 6 种查询模式\n\n1. **朴素模式**：简单的向量相似度匹配 — 适合关键词式查找，速度最快（约 100–300 毫秒）\n2. **局部模式**：以实体为中心，结合局部图谱邻域 — 适合查询特定关系（约 200–500 毫秒）\n3. **全局模式**：基于社区的语义搜索 — 适合主题性或高层次问题（约 300–800 毫秒）\n4. **混合模式** _(默认)_：结合局部与全局搜索，提供平衡且全面的结果（约 400–1000 毫秒）\n5. **混合模式**：可自定义比例的朴素模式与图谱结果加权组合\n6. **绕过模式**：直接调用大模型进行查询，不经过 RAG 检索 — 适用于一般性问题\n\n### 🌐 REST API\n\n- **OpenAPI 3.0**：完整的 Swagger 文档位于 `\u002Fswagger-ui`\n- **流式传输**：使用 Server-Sent Events (SSE) 提供实时响应\n- **版本化**：路径为 `\u002Fapi\u002Fv1\u002F*`，并保持向后兼容\n- **健康检查**：提供 Kubernetes 兼容的 `\u002Fhealth`、`\u002Fready` 和 `\u002Flive` 接口\n\n### 🎯 React 19 前端\n\n- **实时流式渲染**：逐 token 显示生成内容\n- **图可视化**：支持缩放和拖动的交互式网络图\n- **文档上传**：拖放上传，并显示进度\n- **配置界面**：可视化 PDF 处理配置构建器\n\n### 🔌 MCP（模型上下文协议）\n\n- **代理集成**：通过 [MCP](https:\u002F\u002Fmodelcontextprotocol.io\u002F) 向 AI 代理开放 EdgeQuake 功能\n- **工具发现**：代理可以编程方式查询、上传并探索知识图谱\n- **互操作性**：兼容 Claude、Cursor 等支持 MCP 的客户端\n\n服务器实现细节请参见 [mcp\u002F](mcp\u002F)。\n\n---\n\n## 快速入门\n\n### ⚡ 选项 1 — 一条命令（Docker，约 30 秒，无需编译）\n\n> **仅需 Docker 即可，零前置条件。**  \n> 不需要 Rust、Node.js，也无需运行 `cargo build` 或 `npm install`。\n\n```bash\n# 下载并运行交互式安装向导\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fquickstart.sh | sh\n```\n\n向导将引导您完成以下步骤：\n1. **选择提供商** — 选择 OpenAI 或 Ollama（无需从环境变量中推断）\n2. **选择模型** — 从精选且标明价格的列表中挑选您的大模型及嵌入模型\n3. **验证** — 检查 OpenAI 的 API 密钥或 Ping Ollama 并确认模型可用性\n4. **启动服务栈** — 拉取镜像、启动服务，并轮询健康状态，耗时最多 90 秒\n5. **重复运行感知** — 检测当前运行或停止的容器以及现有数据卷；提供“更新并重新配置”或安全的“全新启动”选项（需输入 `DELETE`）。\n\n或者直接使用 `docker compose`：\n\n```bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  | docker compose -f - up -d\n```\n\n也可以先下载 Compose 文件再启动：\n\n```bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n```\n\n**随后打开：** http:\u002F\u002Flocalhost:3000\n\n| 服务       | URL                              |\n| ---------- | -------------------------------- |\n| Web UI     | http:\u002F\u002Flocalhost:3000            |\n| API        | http:\u002F\u002Flocalhost:8080            |\n| Swagger    | http:\u002F\u002Flocalhost:8080\u002Fswagger-ui |\n| 健康检查   | http:\u002F\u002Flocalhost:8080\u002Fhealth     |\n\n**无头模式 \u002F CI 安装（无需交互式终端）：**\n\n```bash\nEDGEQUAKE_LLM_PROVIDER=openai \\\n  OPENAI_API_KEY=sk-... \\\n  docker compose -f docker-compose.quickstart.yml up -d\n```\n\n**管理命令：**\n\n```bash\ndocker compose -f docker-compose.quickstart.yml logs -f    # 查看日志\ndocker compose -f docker-compose.quickstart.yml ps         # 检查状态\ndocker compose -f docker-compose.quickstart.yml down       # 停止服务\n```\n\n> **指定版本：** 使用 `EDGEQUAKE_VERSION=0.10.1 sh quickstart.sh` 可以安装特定版本。\n\n---\n\n### 🛠️ 选项 2 — 开发环境搭建（需 Rust 工具链）\n\n#### 前置条件\n\n- **Rust**：1.78 或更高版本（[安装 Rust](https:\u002F\u002Frustup.rs)）\n- **Node.js**：18+ 或 Bun 1.0+（[安装 Node](https:\u002F\u002Fnodejs.org)）\n- **Docker**：用于 PostgreSQL（[安装 Docker](https:\u002F\u002Fwww.docker.com\u002Fget-started)）\n- **Ollama**：用于本地大模型（可选，[安装 Ollama](https:\u002F\u002Follama.ai)）\n\n#### 安装步骤（5 分钟）\n\n```bash\n# 1. 克隆仓库\ngit clone https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake.git\ncd edgequake\n\n# 2. 安装依赖\nmake install\n\n# 3. 配置前端环境\ncp edgequake_webui\u002F.env.local.example edgequake_webui\u002F.env.local\n\n# 4. 启动完整服务栈（PostgreSQL + 后端 + 前端）\nmake dev\n```\n\n**完成！** 🎉\n\n- **后端**：http:\u002F\u002Flocalhost:8080\n- **前端**：http:\u002F\u002Flocalhost:3000\n- **Swagger UI**：http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n- **模型提供商**：Ollama（本地，免费）\n\n### 首次上传文档\n\n```bash\n# 上传文件（PDF、TXT、MD 等）\ncurl -X POST http:\u002F\u002Flocalhost:8080\u002Fapi\u002Fv1\u002Fdocuments\u002Fupload \\\n  -F \"file=@your-document.pdf\"\n```\n\n**响应**：\n\n```json\n{\n  \"id\": \"doc-123\",\n  \"status\": \"已完成\",\n  \"chunk_count\": 15,\n  \"entity_count\": 12,\n  \"relationship_count\": 8,\n  \"processing_time_ms\": 2500\n}\n```\n\n### 首次查询\n\n```bash\n# 查询知识图谱\ncurl -X POST http:\u002F\u002Flocalhost:8080\u002Fapi\u002Fv1\u002Fquery \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"query\": \"主要概念是什么？\",\n    \"mode\": \"混合\"\n  }'\n```\n\n**响应**：\n\n```json\n{\n  \"answer\": \"主要概念包括：知识图谱、实体抽取和混合检索……\",\n  \"sources\": [\n    { \"chunk_id\": \"chunk-1\", \"similarity\": 0.92 },\n    { \"chunk_id\": \"chunk-5\", \"similarity\": 0.87 }\n  ],\n  \"entities\": [\"KNOWLEDGE_GRAPH\", \"ENTITY_EXTRACTION\"],\n  \"relationships\": [\n    {\n      \"source\": \"KNOWLEDGE_GRAPH\",\n      \"target\": \"ENTITY_EXTRACTION\",\n      \"type\": \"ENABLES\"\n    }\n  ]\n}\n```\n\n---\n\n## 架构\n\n```\n┌────────────────────────────────────────────────────────────────────────────┐\n│                              EdgeQuake 系统                              │\n└────────────────────────────────────────────────────────────────────────────┘\n\n┌─────────────────────────────────────────────────────────────────────────────┐\n│  前端（React 19 + TypeScript）                                           │\n│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐     │\n│  │  文档        │  │    查询      │  │    图         │  │   设置       │     │\n│  │   上传       │  │  接口        │  │ 可视化        │  │   配置       │     │\n│  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘     │\n│         │                 │                 │                 │             │\n│         └─────────────────┴─────────────────┴─────────────────┘             │\n│                                    │                                        │\n│                                    ▼                                        │\n│  ┌────────────────────────────────────────────────────────────────────┐     │\n│  │                         REST API（Axum）                            │     │\n│  │  \u002Fapi\u002Fv1\u002Fdocuments  •  \u002Fapi\u002Fv1\u002Fquery  •  \u002Fapi\u002Fv1\u002Fgraph             │     │\n│  │  OpenAPI 3.0 规范  •  SSE 流式传输  •  健康检查                  │     │\n│  └────────────────────────────────────────────────────────────────────┘     │\n└─────────────────────────────────────────────────────────────────────────────┘\n                                    │\n                                    ▼\n┌─────────────────────────────────────────────────────────────────────────────┐\n│  后端（Rust - 11 个 Crate）                                                 │\n│  ┌──────────────────────────────────────────────────────────────────────┐   │\n│  │  edgequake-core          │  协调与管道                 │   │\n│  │  edgequake-llm           │  OpenAI、Anthropic、MiniMax、Ollama 等 │   │\n│  │  edgequake-storage       │  PostgreSQL AGE、内存适配器          │   │\n│  │  edgequake-api           │  REST API 服务器                          │   │\n│  │  edgequake-pipeline      │  文档摄取管道              │   │\n│  │  edgequake-query         │  查询引擎（6 种模式）                   │   │\n│  │  edgequake-pdf           │  PDF 提取（视觉 \u002F edgeparse）            │   │\n│  │  edgequake-auth          │  身份验证与授权                           │   │\n│  │  edgequake-audit         │  合规性与审计日志                       │   │\n│  │  edgequake-tasks         │  后台任务处理                            │   │\n│  │  edgequake-rate-limiter  │  速率限制中间件                          │   │\n│  └──────────────────────────────────────────────────────────────────────┘   │\n│                                    │                                        │\n│                    ┌───────────────┴───────────────┐                        │\n│                    ▼                               ▼                        │\n│  ┌─────────────────────────────┐   ┌──────────────────────────────────┐     │\n│  │   LLM 提供商             │   │   存储后端               │     │\n│  │  • OpenAI（gpt-4.1-nano）    │   │  • PostgreSQL 15+（AGE + 向量） │     │\n│  │  • Anthropic（Claude）       │   │  • 内存存储（开发\u002F测试）       │     │\n│  │  • MiniMax（MiniMax-M2.7）   │   │  • 图：属性图模型               │     │\n│  │  • Ollama（gemma3:12b）      │   │  • 向量：pgvector 嵌入           │     │\n│  │  • LM Studio、xAI、Gemini   │   │                                  │     │\n│  │  通过环境变量自动检测     │   │                                  │     │\n│  └─────────────────────────────┘   └──────────────────────────────────┘     │\n└─────────────────────────────────────────────────────────────────────────────┘\n\n                    数据流：文档 → 分块 → 实体 → 图\n                    查询流：问题 → 图遍历 → LLM → 答案\n```\n\n### 算法工作原理\n\nEdgeQuake 在 Rust 中实现了 [LightRAG 算法](https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.05779)。其核心思想是：**在索引阶段提取知识图，然后在查询时遍历该图**。\n\n**索引管道**（针对每份文档）：\n\n1. **分块** — 将文档拆分为约 1200 个 token 的片段，重叠 100 个 token。\n2. **提取** — 使用 LLM 将每个分块解析为 `(实体, 类型, 描述)` 和 `(源, 目标, 关键词, 描述)` 元组。\n3. **提炼** — 可选的第二轮处理捕捉遗漏的实体（可将召回率提高约 18%）。\n4. **归一化** — 通过大小写归一化和描述合并来去重实体（可减少约 36%-40% 的重复）。\n5. **嵌入** — 为分块和实体生成向量嵌入。\n6. **存储** — 写入 PostgreSQL：分块存储到 pgvector，实体\u002F关系存储到 Apache AGE 图数据库。\n\n**查询流程**（6 种模式）：\n\n- **朴素** — 仅对分块进行向量相似度搜索（速度快，不使用图）。\n- **局部** — 通过向量搜索找到相关实体，然后遍历其局部图邻域。\n- **全局** — 使用 Louvain 社区检测找到主题聚类，并检索社区摘要。\n- **混合** _(默认)_ — 结合局部实体上下文与全局社区上下文。\n- **混合** — 对朴素向量结果和图增强结果进行加权混合。\n- **绕过** — 完全跳过检索步骤，直接将问题传递给 LLM。\n\n完整的技术说明请参阅 [LightRAG 算法深度解析](docs\u002Fdeep-dives\u002Flightrag-algorithm.md)。\n\n---\n\n## 文档\n\n### 📚 完整文档索引\n\n您可以在 [docs\u002FREADME.md](docs\u002FREADME.md) 中浏览完整文档。\n\n### 📦 SDKs\n\nEdgeQuake 提供多种语言的官方 SDK：\n\n- [Python SDK](sdks\u002Fpython\u002FREADME.md) ([变更日志](sdks\u002Fpython\u002FCHANGELOG.md))\n- [TypeScript SDK](sdks\u002Ftypescript\u002FREADME.md) ([变更日志](sdks\u002Ftypescript\u002FCHANGELOG.md))\n- [Rust SDK](sdks\u002Frust\u002FREADME.md)\n- [其他 SDK](sdks\u002F) 支持 C#、Go、Java、Kotlin、PHP、Ruby、Swift 等语言。\n\nSDK 和核心更新请参阅 [CHANGELOG.md](CHANGELOG.md)。\n\n### 🚀 快速入门（15 分钟）\n\n| 指南                                                      | 描述                | 时间   |\n| ---------------------------------------------------------- | -------------------------- | ------ |\n| [安装指南](docs\u002Fgetting-started\u002Finstallation.md)       | 前提条件与设置    | 5 分钟  |\n| [快速入门](docs\u002Fgetting-started\u002Fquick-start.md)         | 首次数据摄取与查询  | 10 分钟 |\n| [首次数据摄取](docs\u002Fgetting-started\u002Ffirst-ingestion.md) | 理解数据管道        | 15 分钟 |\n\n### 📖 教程（动手实践）\n\n| 教程                                                             | 描述                     |\n| -------------------------------------------------------------------- | ------------------------------- |\n| [构建你的第一个 RAG 应用](docs\u002Ftutorials\u002Ffirst-rag-app.md)       | 端到端教程             |\n| [PDF 数据摄取](docs\u002Ftutorials\u002Fpdf-ingestion.md)                     | PDF 上传与配置          |\n| [多租户设置](docs\u002Ftutorials\u002Fmulti-tenant.md)                 | 工作空间隔离           |\n| [文档摄取](docs\u002Ftutorials\u002Fdocument-ingestion.md)           | 上传与处理工作流       |\n| [从 LightRAG 迁移](docs\u002Ftutorials\u002Fmigration-from-lightrag.md) | Python 到 Rust 的迁移指南 |\n\n### 🏗️ 架构（工作原理）\n\n| 文档                                     | 描述                           |\n| -------------------------------------------- | ------------------------------------- |\n| [概述](docs\u002Farchitecture\u002Foverview.md)    | 系统设计与组件                  |\n| [数据流](docs\u002Farchitecture\u002Fdata-flow.md)  | 文档如何在系统中流转            |\n| [Crate 参考](docs\u002Farchitecture\u002Fcrates\u002F) | 11 个 Rust crate 的详细说明      |\n\n### 💡 核心概念（理论）\n\n| 概念                                                 | 描述                       |\n| ------------------------------------------------------- | --------------------------------- |\n| [Graph-RAG](docs\u002Fconcepts\u002Fgraph-rag.md)                 | 为什么知识图谱能增强 RAG  |\n| [实体抽取](docs\u002Fconcepts\u002Fentity-extraction.md)         | 基于 LLM 的实体识别        |\n| [知识图谱](docs\u002Fconcepts\u002Fknowledge-graph.md)     | 节点、边和社区             |\n| [混合检索](docs\u002Fconcepts\u002Fhybrid-retrieval.md)   | 向量检索与图检索结合       |\n\n### 深度解析（高级）\n\n| 文章                                                         | 描述                                  |\n| --------------------------------------------------------------- | -------------------------------------------- |\n| [LightRAG 算法](docs\u002Fdeep-dives\u002Flightrag-algorithm.md)     | 核心算法：抽取、图构建、检索         |\n| [查询模式](docs\u002Fdeep-dives\u002Fquery-modes.md)                   | 6 种模式详解及权衡                    |\n| [实体归一化](docs\u002Fdeep-dives\u002Fentity-normalization.md)       | 去重与描述合并                        |\n| [提炼](docs\u002Fdeep-dives\u002Fgleaning.md)                         | 多轮抽取以确保完整性                  |\n| [社区发现](docs\u002Fdeep-dives\u002Fcommunity-detection.md)           | Louvain 聚类用于全局查询              |\n| [分块策略](docs\u002Fdeep-dives\u002Fchunking-strategies.md)           | 基于 token 的分段并带重叠             |\n| [嵌入模型](docs\u002Fdeep-dives\u002Fembedding-models.md)             | 模型选择与维度的权衡                  |\n| [图存储](docs\u002Fdeep-dives\u002Fgraph-storage.md)               | Apache AGE 属性图后端                 |\n| [向量存储](docs\u002Fdeep-dives\u002Fvector-storage.md)             | pgvector HNSW 索引与搜索              |\n| [PDF 处理](docs\u002Fdeep-dives\u002Fpdf-processing.md)             | 视觉与 EdgeParse 抽取流水线           |\n| [成本追踪](docs\u002Fdeep-dives\u002Fcost-tracking.md)               | 按操作监控 LLM 成本                   |\n| [管道进度](docs\u002Fdeep-dives\u002Fpipeline-progress.md)           | 实时进度跟踪                          |\n\n### 📊 对比\n\n| 对比                                                     | 关键见解                       |\n| -------------------------------------------------------------- | ---------------------------------- |\n| [与 LightRAG（Python）对比](docs\u002Fcomparisons\u002Fvs-lightrag-python.md) | 性能与设计差异                 |\n| [与 GraphRAG 对比](docs\u002Fcomparisons\u002Fvs-graphrag.md)                 | 微软方案对比                   |\n| [与传统 RAG 对比](docs\u002Fcomparisons\u002Fvs-traditional-rag.md)   | 为什么图很重要                  |\n\n### API 参考\n\n| API                                                | 描述           |\n| -------------------------------------------------- | --------------------- |\n| [REST API](docs\u002Fapi-reference\u002Frest-api.md)         | HTTP 端点        |\n| [扩展 API](docs\u002Fapi-reference\u002Fextended-api.md) | 高级 API 功能    |\n\n### 运维（生产环境）\n\n| 指南                                                       | 描述           |\n| ----------------------------------------------------------- | --------------------- |\n| [部署](docs\u002Foperations\u002Fdeployment.md)                 | 生产环境部署   |\n| [配置](docs\u002Foperations\u002Fconfiguration.md)           | 所有配置选项   |\n| [监控](docs\u002Foperations\u002Fmonitoring.md)                 | 可观测性设置   |\n| [性能调优](docs\u002Foperations\u002Fperformance-tuning.md)   | 优化指南       |\n\n### 🐛 故障排除\n\n| 指南                                                    | 描述                  |\n| -------------------------------------------------------- | ---------------------------- |\n| [常见问题](docs\u002Ftroubleshooting\u002Fcommon-issues.md)   | 调试指南              |\n| [PDF 抽取](docs\u002Ftroubleshooting\u002Fpdf-extraction.md) | PDF 特有的故障排除    |\n\n### 🔗 集成\n\n| 集成                                           | 描述                          |\n| ------------------------------------------------- | ------------------------------------ |\n| [MCP 服务器](mcp\u002F)                                    | 用于 AI 代理的模型上下文协议 |\n| [OpenWebUI](docs\u002Fintegrations\u002Fopen-webui.md)          | 具有 Ollama 模拟功能的聊天界面 |\n| [LangChain](docs\u002Fintegrations\u002Flangchain.md)           | 检索器与智能体集成             |\n| [自定义客户端](docs\u002Fintegrations\u002Fcustom-clients.md) | Python、TypeScript、Rust、Go 客户端 |\n\n### 📓 更多资源\n\n- [FAQ](docs\u002Ffaq.md) - 常见问题\n- [食谱](docs\u002Fcookbook.md) - 实用技巧\n- [安全](docs\u002Fsecurity\u002F) - 安全最佳实践\n\n---\n\n## Docker 部署\n\nEdgeQuake 在每次打标签发布时，都会通过 **GitHub Container Registry (GHCR)** 发布一个生产就绪的多架构 Docker 镜像。该镜像原生支持 `linux\u002Famd64`（x86 服务器、Intel Mac）和 `linux\u002Farm64`（Apple Silicon、AWS Graviton），无需 QEMU 模拟。\n\n```bash\n# 拉取最新版本 — 架构会自动选择\ndocker pull ghcr.io\u002Fraphaelmansuy\u002Fedgequake:latest\n\n# 固定到特定版本\ndocker pull ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.10.1\n```\n\n> **首次发布包的可见性：** 在首次通过 CI\u002FCD 发布后，您可能需要在 [GitHub → 您的个人资料 → Packages → edgequake → 包设置 → 更改可见性](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy?tab=packages) 中将 GHCR 包的可见性设置为 **Public**。一旦设为公开，`docker pull` 就无需身份验证即可使用。\n\n根据您的部署环境，有以下三种部署选项可供选择：\n\n---\n\n### 选项 A — 仅 API（自备 PostgreSQL）\n\n如果您已经拥有带有 `pgvector` 和 `apache_age` 扩展的 PostgreSQL 数据库，则这是最快的启动方式。无需 Rust 工具链，也不需要本地构建——只需拉取镜像并运行即可。\n\n```bash\n# 一行命令\ndocker run -d \\\n  --name edgequake \\\n  -p 8080:8080 \\\n  -e DATABASE_URL=\"postgres:\u002F\u002Fuser:password@your-db-host:5432\u002Fedgequake\" \\\n  -e EDGEQUAKE_LLM_PROVIDER=openai \\\n  -e OPENAI_API_KEY=\"sk-...\" \\\n  ghcr.io\u002Fraphaelmansuy\u002Fedgequake:latest\n\n# 验证\ncurl http:\u002F\u002Flocalhost:8080\u002Fhealth\n```\n\n或者使用 `docker compose`（推荐用于持久化配置）：\n\n```bash\ncd edgequake\u002Fdocker\ncp .env.example .env        # 设置 DATABASE_URL 和提供商密钥\ndocker compose -f docker-compose.api-only.yml up -d\ncurl http:\u002F\u002Flocalhost:8080\u002Fhealth\n```\n\n---\n\n### 选项 B — 使用预构建镜像的全栈部署 *(最快，无需 Rust)*\n\n直接从 GHCR 拉取 EdgeQuake API、前端和 PostgreSQL 镜像。无需 Rust 工具链、Node.js 工具链或本地 Docker 构建。\n\n```bash\ncd edgequake\u002Fdocker\ncp .env.example .env        # 设置 EDGEQUAKE_LLM_PROVIDER 和您的 API 密钥\ndocker compose -f docker-compose.prebuilt.yml up -d\n```\n\n服务已启动：\n\n| 服务         | 端口 | 镜像                                                     |\n| --------------- | ---- | --------------------------------------------------------- |\n| `edgequake` API | 8080 | `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:latest`                  |\n| `frontend`      | 3000 | `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:latest`         |\n| `postgres`      | 5432 | `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:latest`         |\n\n```bash\n# 使用特定 API 版本\nEDGEQUAKE_VERSION=0.10.1 docker compose -f docker-compose.prebuilt.yml up -d\n\n# 查看日志\ndocker compose -f docker-compose.prebuilt.yml logs -f edgequake\n\n# 健康检查\ncurl http:\u002F\u002Flocalhost:8080\u002Fhealth\n\n# 停止\ndocker compose -f docker-compose.prebuilt.yml down\n```\n\n---\n\n### 选项 C — 全栈，从源码构建（包含前端）\n\n在本地构建包括 Next.js Web UI 在内的所有组件。需要 Docker BuildKit 和足够的磁盘空间（Rust 构建缓存约需 4 GB）。\n\n```bash\ncd edgequake\u002Fdocker\ndocker compose up -d         # 构建 API、前端和 postgres\n```\n\n服务已启动：\n\n| 服务              | 端口 | 描述                           |\n| -------------------- | ---- | ------------------------------------- |\n| `edgequake` API      | 8080 | REST API + 文档处理        |\n| `frontend` (Next.js) | 3000 | Web UI                                |\n| `postgres`           | 5432 | PostgreSQL with pgvector + Apache AGE |\n\n```bash\n# 查看日志\ndocker compose logs -f edgequake\n\n# 检查健康状况\ncurl http:\u002F\u002Flocalhost:8080\u002Fhealth\n\n# 停止\ndocker compose down\n```\n\n---\n\n### 环境变量\n\n所有 compose 文件都从位于同一目录下的 `.env` 文件中读取配置。您可以复制 `edgequake\u002Fdocker\u002F.env.example` 文件来开始使用。\n\n| 变量                       | 默认值                             | 描述                                                                             |\n| ------------------------------ | ----------------------------------- | --------------------------------------------------------------------------------------- |\n| `DATABASE_URL`                 | *(由全栈 compose 自动设置)*    | PostgreSQL 连接字符串                                                            |\n| `EDGEQUAKE_LLM_PROVIDER`       | `ollama`                            | 大模型提供商：`openai`、`anthropic`、`gemini`、`mistral`、`azure`、`vertexai`、`ollama` |\n| `EDGEQUAKE_EMBEDDING_PROVIDER` | *(与 LLM 相同)*                     | 混合模式下的独立嵌入模型提供商                                             |\n| `OPENAI_API_KEY`               | —                                   | 对于 `openai` \u002F `azure` 必需                                                         |\n| `ANTHROPIC_API_KEY`            | —                                   | 对于 `anthropic` 必需                                                                |\n| `GEMINI_API_KEY`               | —                                   | 对于 `gemini` 必需                                                                   |\n| `MISTRAL_API_KEY`              | —                                   | 对于 `mistral` 必需                                                                  |\n| `AZURE_OPENAI_API_KEY`         | —                                   | 对于 `azure` 必需                                                                    |\n| `AZURE_OPENAI_ENDPOINT`        | —                                   | Azure 资源端点 URL                                                                   |\n| `GOOGLE_CLOUD_PROJECT`         | —                                   | 对于 `vertexai` 必需                                                                 |\n| `XAI_API_KEY`                  | —                                   | 对于 `xai` 必需                                                                      |\n| `OLLAMA_HOST`                  | `http:\u002F\u002Fhost.docker.internal:11434` | Ollama 服务器地址（通过网关访问主机）                                            |\n| `EDGEQUAKE_VERSION`            | `latest`                            | GHCR 镜像标签（仅适用于选项 B）                                                          |\n| `RUST_LOG`                     | `info`                              | 日志级别（`debug`、`info`、`warn`、`error`）                                            |\n\n> **提示 — 主机上的 Ollama：** 当 EdgeQuake 在 Docker 容器内运行而 Ollama 在您的主机上运行时，请将 `OLLAMA_HOST` 保持其默认值（`http:\u002F\u002Fhost.docker.internal:11434`）。在 Linux 上，compose 文件中的 `extra_hosts: host.docker.internal:host-gateway` 条目会自动解析此问题。\n\n---\n\n### 本地构建镜像\n\nDockerfile 位于 `edgequake\u002Fdocker\u002FDockerfile`，采用两阶段构建（Rust 构建阶段 → Debian slim 运行时阶段）。pdfium 在编译时通过 `pdfium-auto` 嵌入，无需外部共享库。\n\n```bash\n# 为当前主机架构构建\ndocker build -f edgequake\u002Fdocker\u002FDockerfile edgequake -t edgequake:local\n\n# 多平台构建（需要 docker buildx）\ndocker buildx build \\\n  --platform linux\u002Famd64,linux\u002Farm64 \\\n  -f edgequake\u002Fdocker\u002FDockerfile edgequake \\\n  -t edgequake:local --load\n```\n\n---\n\n### CI\u002FCD — 自动化发布\n\n当推送版本标签时，Docker 镜像会通过 GitHub Actions（`.github\u002Fworkflows\u002Frelease-docker.yml`）自动构建并发布：\n\n```bash\n# 标记一个发布版本 — 触发多架构 Docker 构建 + 发布到 ghcr.io\ngit tag v0.10.1 && git push origin v0.10.1\n```\n\n`linux\u002Famd64`（使用 ubuntu-latest runner）和 `linux\u002Farm64`（使用原生 ARM64 runner — 无需 QEMU）会并行构建，并合并为一个单一的多架构清单。同一个镜像标签（`ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.10.1`）可以在 x86 服务器、Apple Silicon Mac 和 AWS Graviton 实例上运行。\n\n你也可以通过 GitHub Actions 上的 `workflow_dispatch` 输入来触发无标签的手动 Docker 构建与发布（“Actions → Release — Docker (GHCR) → Run workflow”）。\n\n---\n\n## 开发\n\n### 构建与测试\n\n```bash\n# 构建后端\ncd edgequake && cargo build --release\n\n# 运行测试\ncargo test\n\n# 代码检查与格式化\ncargo clippy\ncargo fmt\n\n# 构建前端\ncd edgequake_webui\nbun run build\n```\n\n### Make 命令\n\nEdgeQuake 使用统一的 Makefile 来处理所有开发任务：\n\n```bash\n# 完整开发栈\nmake dev              # 启动所有服务（PostgreSQL + 后端 + 前端）\nmake dev-bg           # 在后台启动（用于代理\u002F自动化）\nmake dev-memory       # 使用内存存储启动（仅用于测试）\nmake stop             # 停止所有服务\nmake status           # 检查服务状态\n\n# 仅后端\nmake backend-dev      # 使用 PostgreSQL 运行后端\nmake backend-memory   # 使用内存存储运行后端\nmake backend-bg       # 在后台运行后端\nmake backend-test     # 运行后端测试\n\n# 仅前端\nmake frontend-dev     # 启动前端开发服务器\nmake frontend-build   # 构建用于生产环境的前端\n\n# 数据库\nmake db-start         # 启动 PostgreSQL 容器\nmake db-stop          # 停止 PostgreSQL 容器\nmake db-wait          # 等待数据库就绪\n\n# 质量检查\nmake test             # 运行所有测试\nmake lint             # 检查所有代码\nmake format           # 格式化所有代码\nmake clean            # 清理构建产物\n```\n\n### 代理工作流\n\nEdgeQuake 的开发采用基于规范驱动的开发方法，使用 `edgecode` SOTA 编码代理。\n\n- **AGENTS.md**：全面的代理指南和工作流\n- **specs\u002F**：所有开发规范\n- **OODA 循环**：迭代式开发周期（观察、调整、决策、行动）\n\n详细代理工作流文档请参阅 [AGENTS.md](AGENTS.md)。\n\n---\n\n## 贡献\n\nEdgeQuake 是由 **Raphaël MANSUY** 创建的 **edgecode** SOTA 编码代理开发的。该项目遵循规范驱动的开发方法，所有更改都在实现之前先在 `specs\u002F` 目录中进行规范说明。\n\n**当前状态**：`edgecode` 尚未公开，但很快就会发布。\n\n**目前，贡献应直接通过 Raphaël MANSUY 提交：**\n\n- **GitHub Issues**：报告 bug 并请求功能\n- **GitHub Discussions**：提问和分享想法\n- **直接联系**：对于重大贡献，请联系 [@raphaelmansuy](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy)\n\n详细贡献指南请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。\n\n---\n\n## 社区与支持\n\n### 行为准则\n\n我们致力于提供一个友好且包容的环境。请阅读我们的 [行为准则](CODE_OF_CONDUCT.md)。\n\n### 支持渠道\n\n- **GitHub Issues**：Bug 报告和功能请求\n- **GitHub Discussions**：问题解答和社区帮助\n- **LinkedIn**：[@raphaelmansuy](https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fraphaelmansuy)\n- **Twitter\u002FX**：[@raphaelmansuy](https:\u002F\u002Ftwitter.com\u002Fraphaelmansuy)\n\n### 创始人\n\n**Raphaël MANSUY** 🇫🇷 - 🇭🇰🇨🇳 — 香港永久居民，致力于构建智能文档检索系统和上下文图谱系统。\n\n---\n\n## 许可证\n\n本项目采用 Apache License, Version 2.0（“许可证”）授权。您可以在以下网址获取许可证副本：\n\nhttp:\u002F\u002Fwww.apache.org\u002Flicenses\u002FLICENSE-2.0\n\n除非适用法律要求或书面协议另有规定，否则根据本许可证分发的软件以“按原样”基础提供，不附带任何明示或暗示的保证或条件。具体语言的权限和限制请参阅 [LICENSE](LICENSE) 文件。\n\n**版权所有 © 2024–2026 Raphaël MANSUY**\n\n---\n\n## 致谢\n\nEdgeQuake 受以下优秀工作的启发，并在此基础上构建：\n\n- **LightRAG 研究论文**（[arxiv.org\u002Fabs\u002F2410.05779](https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.05779)）：我们感谢 LightRAG 基础算法的作者们，该算法驱动了 EdgeQuake 中核心的知识图谱提取和检索能力。他们在实体提取、关系映射和混合检索方面的创新方法对我们框架的设计起到了关键作用。\n\n  **特别感谢 LightRAG 的作者们：**\n  - [Zirui Guo](https:\u002F\u002Farxiv.org\u002Fsearch\u002Fcs?searchtype=author&query=Guo,+Z)\n  - [Lianghao Xia](https:\u002F\u002Farxiv.org\u002Fsearch\u002Fcs?searchtype=author&query=Xia,+L)\n  - [Yanhua Yu](https:\u002F\u002Farxiv.org\u002Fsearch\u002Fcs?searchtype=author&query=Yu,+Y)\n  - [Tu Ao](https:\u002F\u002Farxiv.org\u002Fsearch\u002Fcs?searchtype=author&query=Ao,+T)\n  - [Chao Huang](https:\u002F\u002Farxiv.org\u002Fsearch\u002Fcs?searchtype=author&query=Huang,+C)\n\n- **GraphRAG**（[arxiv.org\u002Fabs\u002F2404.16130](https:\u002F\u002Farxiv.org\u002Fabs\u002F2404.16130)）：微软提出的“从局部到全局”的知识图谱方法，用于查询聚焦的摘要生成。\n  - [Shuai Wang](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fshuaiw\u002F)\n  - [Yingqiang Ge](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fyinge\u002F)\n  - [Ying Shen](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fyingshen\u002F)\n  - [Jianfeng Gao](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fjfgao\u002F)\n  - [Xiaodong Liu](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fxiaodl\u002F)\n  - [Yelong Shen](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fyelongshen\u002F)\n  - [Jianfeng Wang](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fjianfw\u002F)\n  - [Ming Zhou](https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fresearch\u002Fpeople\u002Fzhou\u002F)\n\n- **Rust 社区**：感谢其出色的异步生态系统（Tokio、Axum、SQLx），这些技术使 EdgeQuake 能够实现高性能。\n- **React 社区**：感谢 React 19 和现代前端栈，它们为我们交互式的用户界面提供了强大支持。\n\n---\n\n## 快速链接\n\n| 资源             | URL                                                                              |\n| -------------------- | -------------------------------------------------------------------------------- |\n| 📚 完整文档 | [docs\u002FREADME.md](docs\u002FREADME.md)                                                 |\n| 🚀 快速入门指南  | [docs\u002Fgetting-started\u002Fquick-start.md](docs\u002Fgetting-started\u002Fquick-start.md)       |\n| 📦 SDK 概览      | [sdks\u002F](sdks\u002F)                                                                   |\n| 🐍 Python SDK         | [sdks\u002Fpython\u002FREADME.md](sdks\u002Fpython\u002FREADME.md)                                   |\n| 🦀 Rust SDK           | [sdks\u002Frust\u002FREADME.md](sdks\u002Frust\u002FREADME.md)                                       |\n| 🟦 TypeScript SDK     | [sdks\u002Ftypescript\u002FREADME.md](sdks\u002Ftypescript\u002FREADME.md)                           |\n| 📜 更改日志          | [CHANGELOG.md](CHANGELOG.md)                                                     |\n| 🔧 代理工作流     | [AGENTS.md](AGENTS.md)                                                           |\n| 🤝 参与贡献       | [CONTRIBUTING.md](CONTRIBUTING.md)                                               |\n| 📜 行为准则    | [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)                                         |\n| 📄 许可证            | [LICENSE](LICENSE)                                                               |\n| 🐛 报告问题      | [GitHub Issues](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fissues)               |\n| 💬 讨论        | [GitHub Discussions](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fdiscussions)     |\n| 🌐 仓库         | [github.com\u002Fraphaelmansuy\u002Fedgequake](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake) |\n\n---\n\n**准备好构建智能文档检索了吗？** [立即开始！](docs\u002Fgetting-started\u002Fquick-start.md)\n\n## 星标历史\n\n[![星标历史图表](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fraphaelmansuy_edgequake_readme_d675b8d8c588.png)](https:\u002F\u002Fwww.star-history.com\u002F#raphaelmansuy\u002Fedgequake?type=date&legend=top-left)","# EdgeQuake 快速上手指南\n\nEdgeQuake 是一个基于 Rust 构建的高性能 Graph-RAG（图检索增强生成）框架。它通过将文档转化为智能知识图谱，结合向量搜索的速度与图遍历的推理能力，显著提升了多跳推理和复杂主题查询的效果。\n\n## 环境准备\n\n### 方案一：零依赖运行（推荐）\n仅需安装 **Docker** 和 **Docker Compose**。无需安装 Rust、Node.js 或任何编译工具。\n- **适用场景**：快速体验、生产部署、CI\u002FCD 环境。\n\n### 方案二：开发模式\n若需修改源码或贡献代码，需准备以下环境：\n- **Rust**: 版本 1.78 或更高 ([安装链接](https:\u002F\u002Frustup.rs))\n- **Node.js**: 版本 18+ 或 Bun 1.0+ ([安装链接](https:\u002F\u002Fnodejs.org))\n- **Docker**: 用于运行 PostgreSQL 数据库 ([安装链接](https:\u002F\u002Fwww.docker.com))\n- **Ollama** (可选): 用于本地运行大模型 ([安装链接](https:\u002F\u002Follama.ai))\n\n> **国内加速提示**：\n> - Rust 用户建议配置 `Crates.io` 镜像源。\n> - Docker 用户建议配置国内镜像加速器（如阿里云、腾讯云等）以加快拉取速度。\n> - Node.js 用户建议使用 `cnpm` 或配置 `npm` 淘宝镜像。\n\n---\n\n## 安装步骤\n\n### 方式 A：一键启动（Docker）\n这是最快捷的方式，脚本会自动引导你选择 LLM 提供商（OpenAI 或 Ollama）并完成环境初始化。\n\n**1. 运行交互式安装向导**\n```bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fquickstart.sh | sh\n```\n*脚本将引导你完成：提供商选择、模型选择、API Key 验证及服务启动。*\n\n**2. 非交互式启动（适用于 CI 或无终端环境）**\n如果你已准备好环境变量，可直接通过 docker compose 启动：\n```bash\nEDGEQUAKE_LLM_PROVIDER=openai \\\nOPENAI_API_KEY=sk-你的密钥 \\\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n| docker compose -f - up -d\n```\n\n**3. 访问服务**\n启动完成后，打开浏览器访问：\n- **Web 界面**: http:\u002F\u002Flocalhost:3000\n- **API 接口**: http:\u002F\u002Flocalhost:8080\n- **Swagger 文档**: http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n\n### 方式 B：源码开发安装\n**1. 克隆仓库**\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake.git\ncd edgequake\n```\n\n**2. 安装依赖并配置**\n```bash\n# 安装后端和前端依赖\nmake install\n\n# 配置前端环境变量\ncp edgequake_webui\u002F.env.local.example edgequake_webui\u002F.env.local\n```\n\n**3. 启动全栈服务**\n```bash\nmake dev\n```\n*此命令将自动启动 PostgreSQL、后端服务和前端开发服务器。默认使用 Ollama 作为提供商。*\n\n---\n\n## 基本使用\n\n### 1. 创建工作空间\n登录 Web 界面 (http:\u002F\u002Flocalhost:3000)：\n- 点击 **\"New Workspace\"**。\n- 选择领域预设（如通用、医疗、法律等）或自定义实体类型。\n- 配置 LLM 和 Embedding 模型（若在安装时未配置）。\n\n### 2. 上传文档\n- 支持 **PDF** 和 **文本文件**。\n- **PDF 处理模式**：\n  - **文本模式 (默认)**：快速提取标准 PDF 内容。\n  - **视觉模式 (Vision Mode)**：针对扫描件、复杂表格或多栏布局，开启 `Use Vision LLM` 选项，系统将调用多模态模型（如 GPT-4o, Claude 3.5）读取页面图像。\n- 拖拽文件上传，系统会自动进行实体提取、关系映射并构建知识图谱。\n\n### 3. 发起查询\n在对话框中输入问题，EdgeQuake 提供 **6 种查询模式**，默认为 **Hybrid (混合模式)**：\n\n- **Naive**: 纯向量相似度搜索，速度最快，适合简单关键词查找。\n- **Local**: 基于实体的局部图邻域搜索，适合查询具体实体间的关系。\n- **Global**: 基于社区的全局语义搜索，适合宏观主题性问题（如“主要趋势是什么？”）。\n- **Hybrid (默认)**: 结合 Local 和 Global，平衡速度与深度，适合大多数复杂问题。\n- **Mix**: 可配置权重的混合模式。\n- **Bypass**: 跳过检索直接询问 LLM，适合通用常识问题。\n\n**示例提问：**\n> \"X 是如何通过 Z 与 Y 产生关联的？\" (测试多跳推理能力)\n> \"这份文档中关于制造业的主要主题有哪些？\" (测试全局主题分析)\n\n### 4. 查看知识图谱\n查询结果页面右侧或独立的 **Knowledge** 标签页展示了交互式图谱：\n- 使用鼠标滚轮缩放、拖拽平移。\n- 点击节点查看实体详情及关联关系。\n- 可视化呈现文档中的概念网络。\n\n### 5. 高级功能：知识注入 (Knowledge Injection)\n在 v0.8.0+ 版本中，你可以注入领域术语表：\n- 上传 `.txt` 或 `.md` 文件，定义缩写词（如 OEE, NLP）或同义词。\n- 系统会自动将这些知识融入图谱，并在查询时自动扩展术语，且不会作为引用来源显示。\n- 路径：Web 界面 -> `\u002Fknowledge` 页面进行管理。","某大型律所的法律研究团队需要快速从数万份历史案件判决书、合同扫描件及法律备忘录中，梳理复杂的人物关系与案件脉络以应对紧急诉讼。\n\n### 没有 edgequake 时\n- **多跳推理失效**：传统向量检索只能找到关键词相似的片段，无法回答“被告 A 如何通过空壳公司 C 与证人 B 产生关联”这类需要跨文档推导的问题。\n- **扫描件处理困难**：大量扫描版 PDF 合同中的表格和手写批注无法被准确提取，导致关键证据在检索中直接“隐身”。\n- **响应速度缓慢**：面对并发查询，系统延迟高达秒级，律师在庭审准备的高压环境下难以实时获取线索。\n- **资源消耗巨大**：处理海量文档时内存占用极高，导致服务器频繁扩容，运维成本居高不下。\n\n### 使用 edgequake 后\n- **图谱深度洞察**：edgequake 自动构建知识图谱，将分散的实体连接成网，轻松追踪跨文档的隐蔽关系链，直接输出逻辑完整的案情推演。\n- **视觉智能解析**：内置的多模态 LLM 流水线直接“看懂”扫描文档中的复杂表格与非标准布局，确保无论文档格式如何，关键信息无一遗漏。\n- **毫秒级混合查询**：结合向量搜索与图遍历技术，即使在千人并发下，复杂问题的响应时间也能压缩至 200 毫秒以内，实现即时反馈。\n- **极致性能表现**：基于 Rust 的零拷贝架构将单文档内存占用降低至原来的四分之一，用更少的硬件资源支撑起十倍规模的并发需求。\n\nedgequake 通过将非结构化文档转化为可推理的智能知识图谱，让法律团队从“大海捞针”升级为“按图索骥”，彻底重塑了复杂信息的检索与决策效率。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fraphaelmansuy_edgequake_1b68abed.png","raphaelmansuy","Raphael MANSUY","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fraphaelmansuy_822542be.jpg","CTO - ELITIZON Ltd\r\n\r\n🍵  Green Tea addict\r\n\r\n🚀  Maker \r\n\r\n 📚 Life learner\r\n","Elitizon","Hong Kong SAR",null,"https:\u002F\u002Fwww.elitizon.com","https:\u002F\u002Fgithub.com\u002Fraphaelmansuy",[82,86,90,94,98,102,106,110,113,116],{"name":83,"color":84,"percentage":85},"Rust","#dea584",50.8,{"name":87,"color":88,"percentage":89},"TypeScript","#3178c6",27.2,{"name":91,"color":92,"percentage":93},"Python","#3572A5",4.3,{"name":95,"color":96,"percentage":97},"HTML","#e34c26",3.7,{"name":99,"color":100,"percentage":101},"Makefile","#427819",2.6,{"name":103,"color":104,"percentage":105},"Java","#b07219",1.4,{"name":107,"color":108,"percentage":109},"PHP","#4F5D95",1.3,{"name":111,"color":112,"percentage":109},"C#","#178600",{"name":114,"color":115,"percentage":109},"Swift","#F05138",{"name":117,"color":118,"percentage":119},"Go","#00ADD8",1.2,1829,203,"2026-04-15T21:29:22","Apache-2.0",4,"Linux, macOS, Windows","非必需。若使用本地大模型（如 Ollama）或视觉模式处理复杂 PDF，需根据所选模型配置相应 GPU；若使用云端 API（OpenAI\u002FClaude\u002FGemini）则无需本地 GPU。","最低未说明，推荐 8GB+（处理大规模文档或并发请求时建议更高）",{"notes":129,"python":130,"dependencies":131},"该工具主要基于 Rust 开发，而非 Python。提供两种部署方式：1. Docker 一键部署（推荐，无需安装 Rust\u002FNode）；2. 源码开发部署（需安装 Rust 工具链、Node.js\u002FBun 和 Docker）。支持通过 Ollama 运行本地模型或通过 API 连接 OpenAI\u002FClaude\u002FGemini。PDF 处理内置 pdfium，无需额外配置动态库。","未说明",[132,133,134,135,136,137,138,139],"Rust 1.78+","Node.js 18+ 或 Bun 1.0+","Docker","PostgreSQL (含 AGE 和 pgvector 扩展)","Tokio","React 19","Sigma.js","pdfium (内置)",[16,14],[142,143,144,145],"graphrag","knowledge-graph","lightrag","rag","2026-03-27T02:49:30.150509","2026-04-16T15:51:17.121581",[],[150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245],{"id":151,"version":152,"summary_zh":153,"released_at":154},281244,"v0.5.1","## What's New in v0.5.1\n\n### Security — Full Tenant\u002FWorkspace Isolation Audit\n\n- **`verify_workspace_tenant_access` helper** (`handlers\u002Fworkspaces\u002Fhelpers.rs`): Centralised guard that fetches a workspace by ID, checks `workspace.tenant_id` matches `X-Tenant-ID`, and returns 404 (not 403) on mismatch to prevent cross-tenant UUID enumeration.\n- **Workspace CRUD** (`workspace_crud.rs`): `get_workspace`, `update_workspace`, and `delete_workspace` now require the workspace to belong to the requesting tenant.\n- **Stats and metrics** (`stats.rs`): `get_workspace_stats` verifies tenant ownership **before** consulting the in-memory cache — cross-tenant requests never receive cached data. Same check applied to `get_metrics_history` and `trigger_metrics_snapshot`.\n- **Bulk operations** (`rebuild_embeddings`, `rebuild_knowledge_graph`, `reprocess_all_documents`): Inline BR0201 guard added to all three destructive\u002Flong-running handlers.\n\n### Fixed — Workspace \u002F Tenant UX\n\n- **Auto-select after creation** (`tenant-workspace-selector.tsx`, `use-tenant-context.ts`): When a new workspace or tenant is created, it is immediately pushed into the Zustand store before `selectWorkspace()`\u002F`selectTenant()` is called. Eliminates the race-condition window where the Select dropdown showed \"Select workspace…\" until async React Query refetch delivered the new item.\n\n### Infrastructure\n\n- Bumped `[workspace.package] version` in `edgequake\u002FCargo.toml`, `VERSION`, and `edgequake_webui\u002Fpackage.json` from `0.5.0` to `0.5.1`.\n- Fixed 12 duplicate `@implements FEAT` annotations (same-layer collisions introduced by SRP refactoring) to restore doc-traceability CI to green.","2026-02-24T14:25:40",{"id":156,"version":157,"summary_zh":158,"released_at":159},281242,"v0.6.0","# v0.6.0 — Unified Streaming Response Protocol (SPEC-006)\n\n**Closes [#56](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fissues\u002F56)** — Get all information (streamed request, entities, relations, sources) in a unique call.\n\n## Highlights\n\nAll context — **entities, relationships, sources, and statistics** — is now delivered within the streaming response itself. No second API call needed.\n\n### Structured SSE Events (v2 format)\n\nThe `\u002Fapi\u002Fv1\u002Fquery\u002Fstream` endpoint now emits five structured event types:\n\n| Event | Payload | When |\n|-------|---------|------|\n| `context` | Sources, query mode, retrieval time | Before first token |\n| `token` | Generation token | During generation |\n| `thinking` | LLM reasoning content | During reasoning (if supported) |\n| `done` | Full statistics (`QueryStreamStats`) | After generation completes |\n| `error` | Error message + code | On failure |\n\n### Enriched Source References\n\n`SourceReference` now includes:\n- `entity_type` — e.g. `\"ORGANIZATION\"`, `\"PERSON\"`\n- `degree` — entity connectivity in the knowledge graph\n- `source_chunk_ids` — provenance tracking back to document chunks\n\n### Streaming Statistics (`QueryStreamStats`)\n\nThe `done` event carries comprehensive stats:\n- `embedding_time_ms`, `retrieval_time_ms`, `generation_time_ms`, `total_time_ms`\n- `sources_retrieved`, `tokens_used`, `tokens_per_second`\n- `query_mode` — which retrieval mode was used\n\n### Chat Streaming Enrichment\n\n`ChatStreamEvent::Context` now includes `query_mode` and `retrieval_time_ms` for consistent timing feedback across both query and chat endpoints.\n\n### Backward Compatibility\n\nThe v1 raw text format remains available via `stream_format: \"v1\"` parameter. Default is now v2 structured format.\n\n## New Parameters for `\u002Fapi\u002Fv1\u002Fquery\u002Fstream`\n\n- `document_filter` — filter by document IDs\n- `llm_provider` \u002F `llm_model` — override workspace LLM config per-request\n- `stream_format` — `\"v1\"` (legacy) or `\"v2\"` (structured, default)\n\n## SDK & Frontend Updates\n\n- **Rust SDK**: Updated `SourceReference`, `ChatStreamChunk`, `QueryStreamChunk`, `QueryRequest` with SPEC-006 fields. Added `QueryStreamStats` struct.\n- **TypeScript Frontend**: Updated `SourceReference`, `ChatStreamEvent`, `StreamingState`, `QueryStreamChunk`, and `QueryRequest` types. Updated `reduceStreamingEvent()` and `mapSourcesToContext()`.\n- **API Docs**: Updated SSE event documentation with v2 structured format examples.\n\n## Test & Quality\n\n- **1092 lib tests pass** (0 failures)\n- `cargo clippy --workspace --lib -D warnings` — clean\n- `cargo clippy --workspace --all-targets` — zero errors\n- `cargo fmt` — clean\n- Fixed 37 pre-existing test files (missing struct fields from SPEC-041)\n\n## Full Changelog\n\nSee [CHANGELOG.md](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md) for details.\n","2026-03-17T13:16:29",{"id":161,"version":162,"summary_zh":163,"released_at":164},281243,"v0.5.6","## v0.5.6 — Document Query Filters (SPEC-005)\n\n### What's New\n\n**Document query filters** — date range and pattern-based filtering across all query endpoints. Closes [#75](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fissues\u002F75).\n\n### API\n\nAll query endpoints now accept an optional `document_filter` object:\n\n```json\n{\n  \"query\": \"...\",\n  \"document_filter\": {\n    \"date_from\": \"2024-01-01T00:00:00Z\",\n    \"date_to\": \"2024-12-31T23:59:59Z\",\n    \"document_pattern\": \"quarterly-report*\"\n  }\n}\n```\n\n**Supported endpoints:**\n- `POST \u002Fapi\u002Fv1\u002Fquery` — `document_filter` in request body\n- `POST \u002Fapi\u002Fv1\u002Fchat\u002Fcompletions` — `document_filter` in request body\n- `GET \u002Fapi\u002Fv1\u002Fdocuments` — `date_from`, `date_to`, `document_pattern` query params\n\n### Features\n\n- **Date range filtering**: ISO 8601 timestamps with open interval support (null start or end)\n- **Document pattern matching**: glob-style patterns (`*`, `?`) on document names\n- **Composable filters**: all fields optional, combine freely\n- **Frontend popover**: filter UI in query interface with active filter badge\n- **Three-tier resolution**: context filter → document filter → resolver pipeline\n\n### Backend\n\n- New `DocumentFilter` struct with `date_from`, `date_to`, `document_pattern`\n- `DocumentFilterResolver` wired into all 10 query entry points\n- `ContextFilter` trait for extensible filtering\n- Full integration with chat completion (streaming + non-streaming)\n\n### Frontend\n\n- `QueryDocumentFilter` popover component with date inputs & pattern field\n- Active filter badge count\n- Wired into query interface and chat API\n\n### Tests\n\n- 1,092 tests passing (0 failures)\n- Clippy clean, rustfmt clean\n- E2E Playwright verification of filter popover\n\n**Full spec:** [`specs\u002F005-filter.md`](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002Fspecs\u002F005-filter.md)\n","2026-03-17T10:26:30",{"id":166,"version":167,"summary_zh":168,"released_at":169},281225,"v0.10.1","## Docker 快速入门\n\n```bash\n# 交互式单命令安装（仅安装 Docker，无需克隆仓库）\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fquickstart.sh | sh\n```\n\n或者使用普通的 Docker Compose：\n```bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web 界面：  http:\u002F\u002Flocalhost:3000\n# → API：     http:\u002F\u002Flocalhost:8080\n# → Swagger： http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\n或者使用 Makefile：\n```bash\nmake stack           # 启动所有三个服务（从 GHCR 拉取镜像）\nmake stack-down      # 停止并移除容器\nmake stack-logs      # 实时查看日志\n```\n\n## 镜像（v0.10.1）\n\n| 镜像 | 架构 |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.10.1` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.10.1` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.10.1` | linux\u002Famd64, linux\u002Farm64 |\n\n完整变更日志：https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-11T08:56:18",{"id":171,"version":172,"summary_zh":173,"released_at":174},281226,"v0.10.0","## Docker 快速入门\n\n```bash\n# 交互式单命令安装（仅安装 Docker，无需克隆仓库）\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fquickstart.sh | sh\n```\n\n或者使用普通的 Docker Compose：\n```bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web 界面：  http:\u002F\u002Flocalhost:3000\n# → API：     http:\u002F\u002Flocalhost:8080\n# → Swagger： http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\n或者使用 Makefile：\n```bash\nmake stack           # 启动所有三个服务（从 GHCR 拉取镜像）\nmake stack-down      # 停止并移除容器\nmake stack-logs      # 实时查看日志\n```\n\n## 镜像（v0.10.0）\n\n| 镜像 | 架构 |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.10.0` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.10.0` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.10.0` | linux\u002Famd64, linux\u002Farm64 |\n\n完整变更日志：https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-11T08:47:23",{"id":176,"version":177,"summary_zh":178,"released_at":179},281227,"v0.9.19","## Docker 快速入门\n\n```bash\n# 一条命令 — 无需构建（首次拉取约30秒，缓存后\u003C5秒）\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web 界面：  http:\u002F\u002Flocalhost:3000\n# → API：     http:\u002F\u002Flocalhost:8080\n# → Swagger： http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\n或者使用 Makefile：\n```bash\nmake stack           # 启动所有三个服务（从 GHCR 拉取镜像）\nmake stack-down      # 停止并移除容器\nmake stack-logs      # 实时查看日志\n```\n\n## 镜像（v0.9.19）\n\n| 镜像 | 架构 |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.9.19` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.9.19` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.9.19` | linux\u002Famd64, linux\u002Farm64 |\n\n完整变更日志：https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-10T12:33:32",{"id":181,"version":182,"summary_zh":183,"released_at":184},281228,"v0.9.18","## Docker 快速入门\n\n```bash\n# 一条命令 — 无需构建 (~首次拉取约30秒，缓存后\u003C5秒)\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web 界面：  http:\u002F\u002Flocalhost:3000\n# → API：     http:\u002F\u002Flocalhost:8080\n# → Swagger： http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\n或者使用 Makefile：\n```bash\nmake stack           # 启动所有三个服务（从 GHCR 拉取镜像）\nmake stack-down      # 停止并移除容器\nmake stack-logs      # 实时查看日志\n```\n\n## 镜像 (v0.9.18)\n\n| 镜像 | 架构 |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.9.18` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.9.18` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.9.18` | linux\u002Famd64, linux\u002Farm64 |\n\n完整变更日志：https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-09T16:12:58",{"id":186,"version":187,"summary_zh":188,"released_at":189},281229,"v0.9.17","## Docker 快速入门\n\n```bash\n# 一条命令 — 无需构建（首次拉取约30秒，缓存后\u003C5秒）\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web 界面：  http:\u002F\u002Flocalhost:3000\n# → API：     http:\u002F\u002Flocalhost:8080\n# → Swagger： http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\n或者使用 Makefile：\n```bash\nmake stack           # 启动所有三个服务（从 GHCR 拉取镜像）\nmake stack-down      # 停止并移除容器\nmake stack-logs      # 实时查看日志\n```\n\n## 镜像（v0.9.17）\n\n| 镜像 | 架构 |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.9.17` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.9.17` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.9.17` | linux\u002Famd64, linux\u002Farm64 |\n\n完整变更日志：https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-09T10:56:23",{"id":191,"version":192,"summary_zh":193,"released_at":194},281230,"v0.9.16","## Docker 快速入门\n\n```bash\n# 一条命令 — 无需构建（首次拉取约30秒，缓存后\u003C5秒）\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web 界面：  http:\u002F\u002Flocalhost:3000\n# → API：     http:\u002F\u002Flocalhost:8080\n# → Swagger： http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\n或者使用 Makefile：\n```bash\nmake stack           # 启动所有三个服务（从 GHCR 拉取镜像）\nmake stack-down      # 停止并移除容器\nmake stack-logs      # 实时查看日志\n```\n\n## 镜像（v0.9.16）\n\n| 镜像 | 架构 |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.9.16` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.9.16` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.9.16` | linux\u002Famd64, linux\u002Farm64 |\n\n完整变更日志：https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-09T10:09:57",{"id":196,"version":197,"summary_zh":198,"released_at":199},281231,"v0.9.15","## Docker 快速入门\n\n```bash\n# 一条命令 — 无需构建（首次拉取约30秒，缓存后\u003C5秒）\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web 界面：  http:\u002F\u002Flocalhost:3000\n# → API：     http:\u002F\u002Flocalhost:8080\n# → Swagger： http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\n或者使用 Makefile：\n```bash\nmake stack           # 启动所有三个服务（从 GHCR 拉取镜像）\nmake stack-down      # 停止并移除容器\nmake stack-logs      # 实时查看日志\n```\n\n## 镜像（v0.9.15）\n\n| 镜像 | 架构 |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.9.15` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.9.15` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.9.15` | linux\u002Famd64, linux\u002Farm64 |\n\n完整变更日志：https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-09T09:24:28",{"id":201,"version":202,"summary_zh":203,"released_at":204},281232,"v0.9.14","## Docker 快速入门\n\n```bash\n# 一条命令 — 无需构建（首次拉取约30秒，缓存后\u003C5秒）\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web 界面：  http:\u002F\u002Flocalhost:3000\n# → API：     http:\u002F\u002Flocalhost:8080\n# → Swagger： http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\n或者使用 Makefile：\n```bash\nmake stack           # 启动所有三个服务（从 GHCR 拉取镜像）\nmake stack-down      # 停止并移除容器\nmake stack-logs      # 实时查看日志\n```\n\n## 镜像（v0.9.14）\n\n| 镜像 | 架构 |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.9.14` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.9.14` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.9.14` | linux\u002Famd64, linux\u002Farm64 |\n\n完整变更日志：https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-09T08:10:36",{"id":206,"version":207,"summary_zh":208,"released_at":209},281233,"v0.9.12","## Docker 快速入门\n\n```bash\n# 一条命令 — 无需构建（首次拉取约30秒，缓存后\u003C5秒）\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web 界面：  http:\u002F\u002Flocalhost:3000\n# → API：     http:\u002F\u002Flocalhost:8080\n# → Swagger： http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\n或者使用 Makefile：\n```bash\nmake stack           # 启动所有三个服务（从 GHCR 拉取镜像）\nmake stack-down      # 停止并移除容器\nmake stack-logs      # 实时查看日志\n```\n\n## 镜像（v0.9.12）\n\n| 镜像 | 架构 |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.9.12` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.9.12` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.9.12` | linux\u002Famd64, linux\u002Farm64 |\n\n完整变更日志：https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-09T05:12:44",{"id":211,"version":212,"summary_zh":213,"released_at":214},281234,"v0.9.11","## Docker 快速入门\n\n```bash\n# 一条命令 — 无需构建（首次拉取约30秒，缓存后\u003C5秒）\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web 界面：  http:\u002F\u002Flocalhost:3000\n# → API：     http:\u002F\u002Flocalhost:8080\n# → Swagger： http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\n或者使用 Makefile：\n```bash\nmake stack           # 启动所有三个服务（从 GHCR 拉取镜像）\nmake stack-down      # 停止并移除容器\nmake stack-logs      # 实时查看日志\n```\n\n## 镜像（v0.9.11）\n\n| 镜像 | 架构 |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.9.11` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.9.11` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.9.11` | linux\u002Famd64, linux\u002Farm64 |\n\n完整变更日志：https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-09T02:09:23",{"id":216,"version":217,"summary_zh":218,"released_at":219},281235,"v0.9.10","## Docker Quickstart\n\n```bash\n# One command — no build required (~30 s on first pull, \u003C5 s on cached)\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web UI:  http:\u002F\u002Flocalhost:3000\n# → API:     http:\u002F\u002Flocalhost:8080\n# → Swagger: http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\nOr with the Makefile:\n```bash\nmake stack           # start all three services (pulls from GHCR)\nmake stack-down      # stop and remove containers\nmake stack-logs      # tail logs\n```\n\n## Images (v0.9.10)\n\n| Image | Architecture |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.9.10` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.9.10` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.9.10` | linux\u002Famd64, linux\u002Farm64 |\n\nFull CHANGELOG: https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-09T00:19:27",{"id":221,"version":222,"summary_zh":223,"released_at":224},281236,"v0.9.9","## Docker Quickstart\n\n```bash\n# One command — no build required (~30 s on first pull, \u003C5 s on cached)\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web UI:  http:\u002F\u002Flocalhost:3000\n# → API:     http:\u002F\u002Flocalhost:8080\n# → Swagger: http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\nOr with the Makefile:\n```bash\nmake stack           # start all three services (pulls from GHCR)\nmake stack-down      # stop and remove containers\nmake stack-logs      # tail logs\n```\n\n## Images (v0.9.9)\n\n| Image | Architecture |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.9.9` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.9.9` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.9.9` | linux\u002Famd64, linux\u002Farm64 |\n\nFull CHANGELOG: https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-08T15:38:16",{"id":226,"version":227,"summary_zh":228,"released_at":229},281237,"v0.9.7","## Docker Quickstart\n\n```bash\n# One command — no build required (~30 s on first pull, \u003C5 s on cached)\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web UI:  http:\u002F\u002Flocalhost:3000\n# → API:     http:\u002F\u002Flocalhost:8080\n# → Swagger: http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\nOr with the Makefile:\n```bash\nmake stack           # start all three services (pulls from GHCR)\nmake stack-down      # stop and remove containers\nmake stack-logs      # tail logs\n```\n\n## Images (v0.9.7)\n\n| Image | Architecture |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.9.7` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.9.7` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.9.7` | linux\u002Famd64, linux\u002Farm64 |\n\nFull CHANGELOG: https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-08T11:41:05",{"id":231,"version":232,"summary_zh":233,"released_at":234},281238,"v0.9.5","## Docker Quickstart\n\n```bash\n# One command — no build required (~30 s on first pull, \u003C5 s on cached)\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web UI:  http:\u002F\u002Flocalhost:3000\n# → API:     http:\u002F\u002Flocalhost:8080\n# → Swagger: http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\nOr with the Makefile:\n```bash\nmake stack           # start all three services (pulls from GHCR)\nmake stack-down      # stop and remove containers\nmake stack-logs      # tail logs\n```\n\n## Images (v0.9.5)\n\n| Image | Architecture |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.9.5` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.9.5` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.9.5` | linux\u002Famd64, linux\u002Farm64 |\n\nFull CHANGELOG: https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-08T09:47:07",{"id":236,"version":237,"summary_zh":238,"released_at":239},281239,"v0.9.4","## Docker Quickstart\n\n```bash\n# One command — no build required (~30 s on first pull, \u003C5 s on cached)\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fraphaelmansuy\u002Fedgequake\u002Fedgequake-main\u002Fdocker-compose.quickstart.yml \\\n  -o docker-compose.quickstart.yml\ndocker compose -f docker-compose.quickstart.yml up -d\n# → Web UI:  http:\u002F\u002Flocalhost:3000\n# → API:     http:\u002F\u002Flocalhost:8080\n# → Swagger: http:\u002F\u002Flocalhost:8080\u002Fswagger-ui\n```\n\nOr with the Makefile:\n```bash\nmake stack           # start all three services (pulls from GHCR)\nmake stack-down      # stop and remove containers\nmake stack-logs      # tail logs\n```\n\n## Images (v0.9.4)\n\n| Image | Architecture |\n|-------|-------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake:0.9.4` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend:0.9.4` | linux\u002Famd64, linux\u002Farm64 |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-postgres:0.9.4` | linux\u002Famd64, linux\u002Farm64 |\n\nFull CHANGELOG: https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md","2026-04-08T07:29:45",{"id":241,"version":242,"summary_zh":243,"released_at":244},281240,"v0.9.3","## What's New in v0.9.3\n\n### 🐳 Full Stack Docker — Web UI Now Published to GHCR\n\nThe EdgeQuake Web UI is now published as a multi-arch Docker image alongside the API. Run the complete stack from pre-built images — no Rust toolchain or Node.js required.\n\n#### Quick Start (zero local build)\n```bash\ncd edgequake\u002Fdocker\nmake docker-prebuilt   # pulls latest API + Web UI + starts postgres\n# → http:\u002F\u002Flocalhost:3000  (Web UI)\n# → http:\u002F\u002Flocalhost:8080  (API)\n```\n\nPin to this release: `EDGEQUAKE_VERSION=0.9.3 make docker-prebuilt`\n\n### Added\n\n- **`ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend`** multi-arch image (amd64 + arm64) published on every `v*.*.*` tag. Bakes `NEXT_PUBLIC_API_URL=http:\u002F\u002Flocalhost:8080` for docker-compose use.\n- **`docker-compose.prebuilt.yml`** updated with `frontend` service. Full stack (API + Web UI + PostgreSQL) from three published images.\n- **`make docker-prebuilt`** now pulls latest GHCR images before starting, auto-creates `.env`, waits for API health, prints access URLs.\n- **New Makefile targets**: `make docker-prebuilt-logs` (tail logs), `make docker-ps-prebuilt` (status).\n- **CI**: `release-docker.yml` `build-frontend` job with QEMU multi-arch.\n\n### Docker Images\n\n| Image | Tag | Architectures |\n|-------|-----|---------------|\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake` | `0.9.3` \u002F `latest` | `linux\u002Famd64`, `linux\u002Farm64` |\n| `ghcr.io\u002Fraphaelmansuy\u002Fedgequake-frontend` | `0.9.3` \u002F `latest` | `linux\u002Famd64`, `linux\u002Farm64` |\n\n### Verified (E2E)\n- ✅ Dashboard — API connected, Storage (postgresql), LLM (Mock)\n- ✅ Documents page — upload area\n- ✅ Settings page — provider status\n- ✅ Query page — chat interface\n- ✅ Knowledge Graph page — graph visualization\n","2026-04-08T02:54:15",{"id":246,"version":247,"summary_zh":248,"released_at":249},281241,"v0.9.1","## What's Fixed\n\n### Graph Edge Labels Now Display — Closes #91\n\n**Root cause**: The Rust `GraphEdgeResponse` struct had `pub edge_type: String` which serialized to JSON as `\"edge_type\"`. The frontend TypeScript `GraphEdge` interface reads `relationship_type`, meaning `edge.relationship_type` was always `undefined` in JavaScript — Sigma.js received an empty label and rendered nothing even with `forceLabel: true`.\n\n**Fix**: Renamed the backend struct field to `relationship_type` and added backward-compatibility normalization in the frontend `getGraph()` function.\n\n### Mermaid Renderer Hardened — Closes #141\n\n- Bare curly-brace nodes (`{label}`) rewritten to valid rectangular nodes\n- Forward\u002Fbackslash inside square-bracket labels auto-quoted  \n- Error fallback renders raw source instead of crashing the page\n- 23 new unit tests covering all sanitization edge cases\n\n## Upgrade Notes\n\nNo database migrations or configuration changes required. Just pull the latest image or rebuild.\n\n## Full Changelog\n\nSee [CHANGELOG.md](https:\u002F\u002Fgithub.com\u002Fraphaelmansuy\u002Fedgequake\u002Fblob\u002Fedgequake-main\u002FCHANGELOG.md#091---2026-04-03)","2026-04-03T10:44:35"]