[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-brunostjohn--perplexideez":3,"tool-brunostjohn--perplexideez":62},[4,18,26,36,46,54],{"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 真正成长为懂上",158594,2,"2026-04-16T23:34:05",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":42,"last_commit_at":43,"category_tags":44,"status":17},8272,"opencode","anomalyco\u002Fopencode","OpenCode 是一款开源的 AI 编程助手（Coding Agent），旨在像一位智能搭档一样融入您的开发流程。它不仅仅是一个代码补全插件，而是一个能够理解项目上下文、自主规划任务并执行复杂编码操作的智能体。无论是生成全新功能、重构现有代码，还是排查难以定位的 Bug，OpenCode 都能通过自然语言交互高效完成，显著减少开发者在重复性劳动和上下文切换上的时间消耗。\n\n这款工具专为软件开发者、工程师及技术研究人员设计，特别适合希望利用大模型能力来提升编码效率、加速原型开发或处理遗留代码维护的专业人群。其核心亮点在于完全开源的架构，这意味着用户可以审查代码逻辑、自定义行为策略，甚至私有化部署以保障数据安全，彻底打破了传统闭源 AI 助手的“黑盒”限制。\n\n在技术体验上，OpenCode 提供了灵活的终端界面（Terminal UI）和正在测试中的桌面应用程序，支持 macOS、Windows 及 Linux 全平台。它兼容多种包管理工具，安装便捷，并能无缝集成到现有的开发环境中。无论您是追求极致控制权的资深极客，还是渴望提升产出的独立开发者，OpenCode 都提供了一个透明、可信",144296,1,"2026-04-16T14:50:03",[13,45],"插件",{"id":47,"name":48,"github_repo":49,"description_zh":50,"stars":51,"difficulty_score":32,"last_commit_at":52,"category_tags":53,"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":55,"name":56,"github_repo":57,"description_zh":58,"stars":59,"difficulty_score":32,"last_commit_at":60,"category_tags":61,"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",[45,13,15,14],{"id":63,"github_repo":64,"name":65,"description_en":66,"description_zh":67,"ai_summary_zh":67,"readme_en":68,"readme_zh":69,"quickstart_zh":70,"use_case_zh":71,"hero_image_url":72,"owner_login":73,"owner_name":74,"owner_avatar_url":75,"owner_bio":76,"owner_company":77,"owner_location":78,"owner_email":77,"owner_twitter":77,"owner_website":79,"owner_url":80,"languages":81,"stars":108,"forks":109,"last_commit_at":110,"license":111,"difficulty_score":112,"env_os":113,"env_gpu":114,"env_ram":115,"env_deps":116,"category_tags":124,"github_topics":77,"view_count":32,"oss_zip_url":77,"oss_zip_packed_at":77,"status":17,"created_at":125,"updated_at":126,"faqs":127,"releases":157},8304,"brunostjohn\u002Fperplexideez","perplexideez","Search the web and your self-hosted apps using local AI agents.","Perplexideez 是一款支持私有化部署的 AI 搜索工具，旨在让用户在本地环境中安全地结合网络搜索与自有应用数据。它主要解决了现有同类开源方案缺乏多用户支持、难以与其他自托管服务集成以及数据来源不透明等痛点。通过内置的 SearXNG 实例进行网页检索，并连接 Ollama 或 OpenAI 兼容接口作为智能核心，Perplexideez 不仅能自动筛选搜索结果生成精准回答，还能清晰标注每个结论的出处链接，有效降低大模型“幻觉”带来的误导风险。\n\n该工具特别适合注重数据隐私的企业团队、自建服务器爱好者以及需要协作的研究人员。其独特的技术亮点包括完善的单点登录（SSO）与多用户权限管理，支持将搜索记录收藏为 favourites，并能自动生成后续追问以深化探索。此外，Perplexideez 允许针对不同任务灵活配置 AI 模型，提供美观的分享嵌入功能，且架构设计兼顾无状态部署与安全性，可轻松运行于 Docker 或 Kubernetes 环境。无论是希望构建内部知识库的开发团队，还是追求可控 AI 体验的技术极客，都能从中获得高效、透明且可定制的搜索体验。","\u003Cbr\u002F>\n\u003Cdiv align=\"center\">\n\u003Ca href=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_c63405c3632e.png\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_c63405c3632e.png\" alt=\"Logo\" width=\"100\" height=\"100\">\n\u003C\u002Fa>\n\u003Ch3 align=\"center\">Perplexideez\u003C\u002Fh3>\n\u003Cp align=\"center\">\nSelf-hosted AI-powered search.\n\u003Cbr\u002F>\n\u003Cbr\u002F>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fissues\u002Fnew?labels=bug&template=bug_report.md\">Report Bug\u003C\u002Fa> ·\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fissues\u002Fnew?labels=enhancement&template=feature_request.md\">Request Feature\u003C\u002Fa>\n\u003C\u002Fp>\n\u003C\u002Fdiv>\n\n\u003Ch3 id=\"aboutTheProject\">About The Project\u003C\u002Fh3>\n\n![Screenshot](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_9fc9feeac95a.png)\n\nThere are many self-hosted Perplexity clones out there. I chose to make my own as I was dissatisfied with their non-existent integration with other self-hosted services and lack of multi-user support. Perplexideez is backed by a Postgres database & either Ollama or OpenAI compatible endpoints. It searches the web using a SearXNG instance.\n\n### Table of Contents\n\n1. [About The Project](#aboutTheProject)\n2. [Features](#features)\n   1. [Search the web](#features-searchTheWeb)\n   2. [Know where conclusions come from](#features-knowWhere)\n      1. [Learn even more](#features-knowWhere-learnMore)\n   3. [Keep track of your most interesting searches](#features-keepTrack)\n   4. [Customise your experience](#features-customise)\n   5. [Multi-user support & SSO](#features-multiUser)\n   6. [Sharing searches](#features-sharing)\n      1. [Simple UI](#features-sharing-simple)\n      2. [Access control](#features-sharing-accessControl)\n      3. [Good looking embeds](#features-sharing-embeds)\n   7. [Deployment](#features-deployment)\n      1. [Security](#features-deployment-security)\n      2. [Statelessness](#features-deployment-statelessness)\n3. [Deploying](#deploying)\n   1. [Container images](#deploying-images)\n   2. [Docker](#deploying-docker)\n   3. [Kubernetes](#deploying-kube)\n   4. [Bare metal](#deploying-metal)\n   5. [General notes about dependencies](#deploying-notes)\n      1. [SearXNG](#deploying-notes-searxng)\n   6. [Environment variables](#deploying-env)\n      1. [Data storage](#deploying-env-data)\n      2. [App setup](#deploying-env-app)\n      3. [SSO](#deploying-env-sso)\n         1. [Notes](#deploying-env-sso-notes)\n      4. [SearXNG](#deploying-env-searxng)\n      5. [AI setup](#deploying-env-ai)\n         1. [OpenAI](#deploying-env-ai-openai)\n         2. [Ollama](#deploying-env-ai-ollama)\n4. [Built with](#builtWith)\n5. [Developing locally](#developingLocally)\n   1. [Prerequisites](#developingLocally-pre)\n   2. [Installation](#developingLocally-install)\n6. [Roadmap](#roadmap)\n7. [Contributing](#contributing)\n8. [License](#license)\n9. [Contact](#contact)\n10. [Acknowledgments](#acknowledgments)\n\n\u003Ch3 id=\"features\">Features\u003C\u002Fh3>\n\n\u003Ch4 id=\"features-searchTheWeb\"> Search the web \u003C\u002Fh4>\n\n![Screenshot](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_20235a3dbc93.png)\n\nLet AI do the hard work of sifting through search results for you.\n\n\u003Ch4 id=\"features-knowWhere\"> Know where conclusions come from \u003C\u002Fh4>\n\n![Screenshot](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_4d3c23481947.png)\n\nDon't worry about hallucinations ruining your research. Just hover over the source annotation your LLM inserted and see the source it used. Click on it, and view the source directly.\n\n\u003Ch5 id=\"features-knowWhere-learnMore\"> Learn even more \u003C\u002Fh5>\n\n![Screenshot](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_1bdd5b890ff6.png)\n\nYour LLM will generate great follow-up questions for you. This way, you can ask about what interested you in the response without typing a single second.\n\n\u003Ch4 id=\"features-keepTrack\"> Keep track of your most interesting searches \u003C\u002Fh4>\n\n![Screenshot](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_053099492eef.png)\n\nStash your favourite searches as favourites. This way, you'll never lose them.\n\n\u003Ch4 id=\"features-customise\"> Customise your experience \u003C\u002Fh4>\n\n![Screenshot](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_c6c138120979.png)\n\nPerplexideez lets you use different models for different tasks, as appropriate. The robust environment variables and UI configuration allow you to make sure your self hosted resources are not overused.\n\n\u003Ch4 id=\"features-multiUser\"> Multi-user support & SSO \u003C\u002Fh4>\n\n![Screenshot](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_f24f0f877845.png)\n\nPerplexideez supports many user accounts, with separated data, and using OIDC SSO. You can disable either sign up, password login, or both.\n\n\u003Ch4 id=\"features-sharing\"> Sharing searches \u003C\u002Fh4>\n\n\u003Ch5 id=\"featuers-sharing-simple\"> Simple UI \u003C\u002Fh5>\n\n![Screenshot](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_b3536d802ef7.png)\n\nPerplexideez allows you to share links to others with the results of your searches. This way, you can send the interesting stuff to your friends easily.\n\n\u003Ch5 id=\"features-sharing-accessControl\"> Access control \u003C\u002Fh5>\n\n![Screenshot](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_90e06188bb3d.png)\n\nWhen sharing a link, you can make sure only the people you want have access to it. Reroll the link's ID, require authentication to view, or disable it altogether.\n\n\u003Ch5 id=\"features-sharing-embeds\"> Good looking embeds \u003C\u002Fh5>\n\n![Screenshot](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_08acfe85aec4.png)\n\nPerplexideez creates beautiful embeds for all the links you share publicly. This way, the people you send it to know what they'll be looking at.\n\n\u003Ch4 id=\"features-deployment\"> Deployment \u003C\u002Fh4>\n\n\u003Ch5 id=\"features-deployment-security\"> Security \u003C\u002Fh5>\n\nAll of the containers provided by this project run as non-root by default. They're ready to be deployed in rootless environments.\n\n\u003Ch5 id=\"features-deployment-statelessness\"> Statelessness \u003C\u002Fh5>\n\nSave for an in-progress generation, the containers are fully stateless. The feature that blocks exiting while a response is generated is still a work in progress, but they're ready to run in a Kubernetes environment without concern about rolling updates or higher numbers of replicas screwing things up.\n\n\u003Ch2 id=\"deploying\"> Deploying \u003C\u002Fh2>\n\n\u003Ch3 id=\"deploying-images\"> Container images \u003C\u002Fh3>\n\n- [`ghcr.io\u002Fbrunostjohn\u002Fperplexideez\u002Fmigrate`](https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fpkgs\u002Fcontainer\u002Fperplexideez%2Fmigrate) performs required database migrations and prepares your Postgres instance to be used with Perplexideez. The only environment variable it requires is `DATABASE_URL`.\n- [`ghcr.io\u002Fbrunostjohn\u002Fperplexideez\u002Fapp`](https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fpkgs\u002Fcontainer\u002Fperplexideez%2Fapp) is the app itself. It requires the full environment variables mentioned below.\n\n\u003Ch3 id=\"deploying-docker\"> Docker \u003C\u002Fh3>\n\nUse the example Compose files in [`deploy\u002Fdocker`](https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Ftree\u002Fmain\u002Fdeploy\u002Fdocker) to configure your own stack. These include the app, SearXNG, and a database. Use the `.env.example` to get started, before running rename to `.env` and make sure all the required values from the table below are filled out. The example stack **does not** provide neither Ollama nor OpenAI compatible endpoints. Setting that up is up to you.\n\n\u003Ch3 id=\"deploying-kube\"> Kubernetes \u003C\u002Fh3>\n\nI am still working on the Helm chart for this app. Writing Helm charts is quite the process so I'm procrastinating it. For now, please use [my homelab Kubernetes manifests as an example for how to write your own to deploy this on your cluster](https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fhomelab\u002Ftree\u002Fmain\u002Fk8s\u002Fproductivity\u002Fperplexideez).\n\n\u003Ch3 id=\"deploying-metal\"> Bare Metal \u003C\u002Fh3>\n\nDue to a lack of control over these environments and high variance between them, deploying without using container images is unsupported and such issues will go closed due to being out of scope.\n\n\u003Ch3 id=\"deploying-notes\"> General notes about dependencies \u003C\u002Fh3>\n\n\u003Ch4 id=\"deploying-notes-searxng\"> SearXNG \u003C\u002Fh4>\n\n- In my testing, it's very likely that Perplexideez will trigger SearXNG's limiter. Therefore, unless someone finds a better solution, it's better left disabled.\n- All requests to SearXNG _will_ fail unless **JSON output is enabled**. This is important, so please remember to adjust your configuration.\n\n\u003Ch3 id=\"deploying-env\"> Environment Variables \u003C\u002Fh3>\n\n\u003Ch4 id=\"deploying-env-data\"> Data Storage \u003C\u002Fh4>\n\n| Name | Required | Value | Example |\n| ---- | -------- | ----- | ------- |\n| `DATABASE_URL` | ✅ | An URL to a Postgres database. | `postgresql:\u002F\u002Fpostgres:postgres@localhost:5432\u002Fpostgres?schema=public` |\n\n\u003Ch4 id=\"deploying-env-app\"> App Setup \u003C\u002Fh4>\n\n| Name | Required | Value | Example |\n| ---- | -------- | ----- | ------- |\n| `PUBLIC_BASE_URL` | ✅ | The public-facing URL to your instance. | `https:\u002F\u002Fperplexideez.domain.com` \n| `RATE_LIMIT_SECRET` | ✅ | A secret generated with `openssl rand -base64 32` to be used for securing your sign in page. | N\u002FA |\n| `AUTH_SECRET` | ✅ | A secret generated with `openssl rand -base64 32` to be used for securing your instance. | N\u002FA |\n| `DISABLE_SIGN_UP` | ❌ (default: `false`) | Whether or not to disable signing up to your instance. | `true`\u002F`false`\n| `LOG_LEVEL` | ❌ (default: `info`) | Which log level the app should use. | `trace`\u002F`debug`\u002F`info`\u002F`warn`\u002F`error` |\n| `LOG_MODE` | ❌ (default: `json`) | Whether to pretty print logs or use JSON logging. | `pretty`\u002F`json` |\n| `METRICS_PORT` | ❌ (default: `9001`) | The port on which Prometheus metrics will be exposed. | `9001` |\n| `SKIP_CSRF_CHECK` | ❌ (default: `false`) | Makes the app skip CSRF checks. You most likely don't need this. Only set this if you know what you're doing. | `true`\u002F`false` |\n| `USE_SECURE_COOKIES` | ❌ (default: `true`) | Make the app use secure cookies (only transferred over https). Only set this if you're not exposing your app. | `true`\u002F`false` |\n\n\u003Ch4 id=\"deploying-env-sso\"> SSO \u003C\u002Fh4>\n\n| Name | Required | Value | Example |\n| ---- | -------- | ----- | ------- |\n| `OIDC_CLIENT_ID` | ❌ | The client ID for your IDP. | N\u002FA |\n| `OIDC_CLIENT_SECRET` | ❌ | The client secret for your IDP. | N\u002FA |\n| `OIDC_ISSUER` | ❌ | The `.well-known` URL for you IDP. | `https:\u002F\u002Fauth.authentik.com\u002Fapplication\u002Fo\u002Fperplexideez\u002F.well-known\u002Fopenid-configuration` |\n| `OIDC_SCOPES` | ❌ (default: `openid email profile`) | The OIDC scopes to request from your IDP. | `openid email profile` |\n| `PUBLIC_OIDC_NAME` | ❌ | The identity provider name to show in the app's UI. | `Zefir's Cloud` |\n| `DISABLE_PASSWORD_LOGIN` | ❌ (default: false) | Whether or not to disable password authentication and hide it from the UI. | `true`\u002F`false` |\n\n\u003Ch4 id=\"deploying-env-sso-notes\"> SSO notes \u003C\u002Fh4>\n\n- The redirect URL for this app is `https:\u002F\u002Fperplexideez.yourdomain.com\u002Fauth\u002Fcallback\u002Fgeneric-oauth`.\n\n\u003Ch4 id=\"deploying-env-searxng\"> SearXNG \u003C\u002Fh4>\n\n| Name | Required | Value | Example |\n| ---- | -------- | ----- | ------- |\n| `SEARXNG_URL` | ✅ | The URL for your SearXNG instance. | `http:\u002F\u002Fsearxng:8080` |\n\n\u003Ch4 id=\"deploying-env-ai\"> AI Setup \u003C\u002Fh4>\n\n| Name | Required | Value | Example |\n| ---- | -------- | ----- | ------- |\n| `LLM_MODE` | ✅ | `ollama` | Which LLM provider to use. | `ollama`\u002F`openai` |\n| `LLM_SPEED_MODEL` | ✅ | The LLM to use for generating responses in \"Speed\" mode. | `gemma2:2b` |\n| `LLM_BALANCED_MODEL` | ✅ | The LLM to use for generating responses in \"Balanced\" mode. | `llama3.1:latest` |\n| `LLM_QUALITY_MODEL` | ✅ | The LLM to use for generating responses in \"Quality\" mode. | `qwen2.5:32b` |\n| `LLM_EMBEDDINGS_MODEL` | ✅ | The LLM to use for text embeddings. | `nomic-embed-text:latest` |\n| `LLM_TITLE_MODEL` | ✅ | The LLM to use for generating chat titles. | `llama3.1:latest` |\n| `LLM_EMOJI_MODEL` | ✅ | The LLM to use for generating chat emojis. | `llama3.1:latest` |\n| `LLM_IMAGE_SEARCH_MODEL` | ✅ | The LLM to use for image searching. | `llama3.1:latest` |\n| `LLM_VIDEO_SEARCH_MODEL` | ✅ | The LLM to use for video searching. | `llama3.1:latest` |\n\n\u003Ch5 id=\"deploying-env-ai-openai\"> OpenAI \u003C\u002Fh5>\n\nRequired only if `LLM_MODE` is set to `openai`.\n\n| Name | Required | Value | Example |\n| ---- | -------- | ----- | ------- |\n| `OPENAI_BASE_URL` | ✅ | The base URL to your OpenAI compatible endpoints. | `https:\u002F\u002Fchat.domain.com\u002Fv1` |\n| `OPENAI_API_KEY` | ✅ | The API key to use for requests. | `sk-1234` |\n\n\u003Ch5 id=\"deploying-env-ai-ollama\"> Ollama \u003C\u002Fh5>\n\nRequired only if `LLM_MODE` is set to `ollama`.\n\n| Name | Required | Value | Example |\n| ---- | -------- | ----- | ------- |\n| `OLLAMA_URL` | ✅ | The URL for your Ollama instance. | `http:\u002F\u002Follama:11434` |\n\n\n\u003Ch2 id=\"builtWith\"> Built With \u003C\u002Fh2>\n\n- [SvelteKit](https:\u002F\u002Fsvelte.dev)\n- [TailwindCSS](https:\u002F\u002Ftailwindcss.com\u002F)\n- [Shadcn Svelte](https:\u002F\u002Fwww.shadcn-svelte.com\u002F)\n- [tRPC](https:\u002F\u002Ftrpc.io\u002F)\n- [Prisma](https:\u002F\u002Fwww.prisma.io\u002F)\n- [AuthJS](https:\u002F\u002Fauthjs.dev\u002F)\n- [TanStack Query](https:\u002F\u002Ftanstack.com\u002Fquery)\n- [Docker](https:\u002F\u002Fdocker.com\u002F)\n- [Kubernetes](https:\u002F\u002Fkubernetes.io)\n- [Langchain](https:\u002F\u002Flangchain.com)\n\n\u003Ch2 id=\"developingLocally\"> Developing Locally \u003C\u002Fh2>\n\nTo get a local copy up and running follow these simple example steps.\n\n\u003Ch3 id=\"developingLocally-pre\"> Prerequisites \u003C\u002Fh3>\n\nYou need either an OpenAI API token\u002FOpenAI compatible API or an Ollama instance running somewhere. The development container setup only provides Postgres and SearXNG.\n\n- pnpm\n  ```sh\n  corepack install pnpm\n  ```\n\n\u003Ch3 id=\"developingLocally-install\"> Installation \u003C\u002Fh3>\n\n1. Clone the repo\n   ```sh\n   git clone https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez.git\n   ```\n2. Install packages\n   ```sh\n   pnpm install\n   ```\n3. Create a `.env` file using the `.env.example`\n4. Start the development environment\n   ```sh\n   pnpm dev:up\n   ```\n5. Update the database schema\n   ```sh\n   pnpm db:push\n   ```\n6. Run the app\n   ```sh\n   pnpm dev\n   ```\n\n\u003Ch2 id=\"roadmap\"> Roadmap \u003C\u002Fh2>\n\n- [x] Fully support web searching\n- [x] Shareable no-authentication links\n- [ ] Full statelessness\n  - [ ] Block exiting while generating, just in case\n  - [ ] Use Redis to persist internal generation state\n- [ ] View & explore image\u002Fvideo suggestions.\n- [ ] Favourites on the sidebar\n- [ ] Ensure deployments work\n  - [ ] Complete Helm chart for Kubernetes deployment\n- [ ] More agents\n  - [ ] Web agents\n  - [ ] Self-hosted app agents\n\nSee the [open issues](https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fissues) for a full list of proposed features (and known issues).\n\n\u003Ch2 id=\"contributing\"> Contributing \u003C\u002Fh2>\n\nContributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.\n\nIf you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag \"enhancement\".\nDon't forget to give the project a star! Thanks again!\n\n1. Fork the Project\n2. Create your Feature Branch (`git checkout -b feature\u002FAmazingFeature`)\n3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)\n4. Push to the Branch (`git push origin feature\u002FAmazingFeature`)\n5. Open a Pull Request\n\n\u003Ch2 id=\"license\"> License \u003C\u002Fh2>\n\nDistributed under the AGPL License.\n\n\u003Ch2 id=\"contact\"> Contact \u003C\u002Fh2>\n\nBruno St John - me@brunostjohn.com\n\n\u003Ch2 id=\"acknowledgments\"> Acknowledgments \u003C\u002Fh2>\n\n- [The Perplexica team](https:\u002F\u002Fgithub.com\u002FItzCrazyKns\u002FPerplexica) for implementing the basis for a self-hosted search AI agent.\n","\u003Cbr\u002F>\n\u003Cdiv align=\"center\">\n\u003Ca href=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_c63405c3632e.png\">\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_c63405c3632e.png\" alt=\"Logo\" width=\"100\" height=\"100\">\n\u003C\u002Fa>\n\u003Ch3 align=\"center\">Perplexideez\u003C\u002Fh3>\n\u003Cp align=\"center\">\n自托管的AI驱动搜索。\n\u003Cbr\u002F>\n\u003Cbr\u002F>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fissues\u002Fnew?labels=bug&template=bug_report.md\">报告Bug\u003C\u002Fa> ·\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fissues\u002Fnew?labels=enhancement&template=feature_request.md\">请求功能\u003C\u002Fa>\n\u003C\u002Fp>\n\u003C\u002Fdiv>\n\n\u003Ch3 id=\"aboutTheProject\">关于项目\u003C\u002Fh3>\n\n![截图](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_9fc9feeac95a.png)\n\n市面上有许多自托管的Perplexity克隆项目。我选择自己开发一个，是因为对它们无法与其他自托管服务集成以及缺乏多用户支持感到不满。Perplexideez后端使用Postgres数据库，并对接Ollama或OpenAI兼容的API端点。它通过SearXNG实例来搜索网络。\n\n### 目录\n\n1. [关于项目](#aboutTheProject)\n2. [功能](#features)\n   1. [网络搜索](#features-searchTheWeb)\n   2. [了解结论的来源](#features-knowWhere)\n      1. [进一步学习](#features-knowWhere-learnMore)\n   3. [跟踪你最感兴趣的搜索](#features-keepTrack)\n   4. [个性化体验](#features-customise)\n   5. [多用户支持与SSO](#features-multiUser)\n   6. [分享搜索结果](#features-sharing)\n      1. [简洁的界面](#features-sharing-simple)\n      2. [访问控制](#features-sharing-accessControl)\n      3. [美观的嵌入式预览](#features-sharing-embeds)\n   7. [部署](#features-deployment)\n      1. [安全性](#features-deployment-security)\n      2. [无状态设计](#features-deployment-statelessness)\n3. [部署](#deploying)\n   1. [容器镜像](#deploying-images)\n   2. [Docker](#deploying-docker)\n   3. [Kubernetes](#deploying-kube)\n   4. [裸金属服务器](#deploying-metal)\n   5. [关于依赖的一般说明](#deploying-notes)\n      1. [SearXNG](#deploying-notes-searxng)\n   6. [环境变量](#deploying-env)\n      1. [数据存储](#deploying-env-data)\n      2. [应用配置](#deploying-env-app)\n      3. [SSO](#deploying-env-sso)\n         1. [注意事项](#deploying-env-sso-notes)\n      4. [SearXNG](#deploying-env-searxng)\n      5. [AI配置](#deploying-env-ai)\n         1. [OpenAI](#deploying-env-ai-openai)\n         2. [Ollama](#deploying-env-ai-ollama)\n4. [构建技术](#builtWith)\n5. [本地开发](#developingLocally)\n   1. [前提条件](#developingLocally-pre)\n   2. [安装](#developingLocally-install)\n6. [路线图](#roadmap)\n7. [贡献](#contributing)\n8. [许可证](#license)\n9. [联系方式](#contact)\n10. [致谢](#acknowledgments)\n\n\u003Ch3 id=\"features\">功能\u003C\u002Fh3>\n\n\u003Ch4 id=\"features-searchTheWeb\"> 网络搜索 \u003C\u002Fh4>\n\n![截图](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_20235a3dbc93.png)\n\n让AI帮你完成繁琐的搜索结果筛选工作。\n\n\u003Ch4 id=\"features-knowWhere\"> 了解结论的来源 \u003C\u002Fh4>\n\n![截图](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_4d3c23481947.png)\n\n不用担心幻觉影响你的研究。只需将鼠标悬停在LLM插入的来源标注上，即可查看其引用的原始来源。点击它，就能直接跳转到该页面。\n\n\u003Ch5 id=\"features-knowWhere-learnMore\"> 进一步学习 \u003C\u002Fh5>\n\n![截图](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_1bdd5b890ff6.png)\n\n你的LLM会为你生成一些很棒的后续问题。这样，你就可以针对回复中感兴趣的内容继续提问，而无需再手动输入任何内容。\n\n\u003Ch4 id=\"features-keepTrack\"> 跟踪你最感兴趣的搜索 \u003C\u002Fh4>\n\n![截图](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_053099492eef.png)\n\n将你喜欢的搜索保存为收藏，这样你就永远不会丢失它们。\n\n\u003Ch4 id=\"features-customise\"> 个性化体验 \u003C\u002Fh4>\n\n![截图](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_c6c138120979.png)\n\nPerplexideez允许你根据不同的任务选择合适的模型。强大的环境变量和UI配置功能，可以帮助你确保自托管资源不会被过度使用。\n\n\u003Ch4 id=\"features-multiUser\"> 多用户支持与SSO \u003C\u002Fh4>\n\n![截图](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_f24f0f877845.png)\n\nPerplexideez支持多个用户账号，每个账号的数据相互隔离，并且可以使用OIDC SSO登录。你可以选择禁用注册、密码登录，或者两者都禁用。\n\n\u003Ch4 id=\"features-sharing\"> 分享搜索结果 \u003C\u002Fh4>\n\n\u003Ch5 id=\"featuers-sharing-simple\"> 简洁的界面 \u003C\u002Fh5>\n\n![截图](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_b3536d802ef7.png)\n\nPerplexideez允许你将搜索结果的链接分享给他人。这样，你就可以轻松地把有趣的内容发送给朋友。\n\n\u003Ch5 id=\"features-sharing-accessControl\"> 访问控制 \u003C\u002Fh5>\n\n![截图](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_90e06188bb3d.png)\n\n在分享链接时，你可以确保只有指定的人才能访问。你可以重新生成链接ID、要求认证才能查看，或者直接禁用该链接。\n\n\u003Ch5 id=\"features-sharing-embeds\"> 美观的嵌入式预览 \u003C\u002Fh5>\n\n![截图](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_readme_08acfe85aec4.png)\n\nPerplexideez会为所有公开分享的链接生成精美的嵌入式预览。这样，接收者就能清楚地知道他们即将看到的内容。\n\n\u003Ch4 id=\"features-deployment\"> 部署 \u003C\u002Fh4>\n\n\u003Ch5 id=\"features-deployment-security\"> 安全性 \u003C\u002Fh5>\n\n该项目提供的所有容器默认以非root用户运行。它们可以直接部署在无root权限的环境中。\n\n\u003Ch5 id=\"features-deployment-statelessness\"> 无状态设计 \u003C\u002Fh5>\n\n除了正在进行中的生成任务外，这些容器都是完全无状态的。虽然阻止响应生成过程中退出的功能仍在开发中，但它们已经可以放心地部署在Kubernetes环境中，无需担心滚动更新或增加副本数量导致的问题。\n\n\u003Ch2 id=\"deploying\">部署\u003C\u002Fh2>\n\n\u003Ch3 id=\"deploying-images\"> 容器镜像 \u003C\u002Fh3>\n\n- [`ghcr.io\u002Fbrunostjohn\u002Fperplexideez\u002Fmigrate`](https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fpkgs\u002Fcontainer\u002Fperplexideez%2Fmigrate) 用于执行必要的数据库迁移，并将你的Postgres实例准备好供Perplexideez使用。它仅需一个环境变量：`DATABASE_URL`。\n- [`ghcr.io\u002Fbrunostjohn\u002Fperplexideez\u002Fapp`](https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fpkgs\u002Fcontainer\u002Fperplexideez%2Fapp) 是应用程序本身。它需要下面提到的所有环境变量。\n\n\u003Ch3 id=\"deploying-docker\"> Docker \u003C\u002Fh3>\n\n使用[`deploy\u002Fdocker`](https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Ftree\u002Fmain\u002Fdeploy\u002Fdocker)目录下的示例Compose文件来配置你自己的堆栈。这些文件包含了应用、SearXNG和数据库。请先使用`.env.example`作为起点，然后将其重命名为`.env`，并确保填写了下表中所有必需的值。该示例堆栈**不**提供Ollama或OpenAI兼容的API端点。这部分需要你自己设置。\n\n\u003Ch3 id=\"deploying-kube\"> Kubernetes \u003C\u002Fh3>\n\n我仍在为这个应用编写 Helm Chart。编写 Helm Chart 是一个相当复杂的过程，所以我一直在拖延。目前，请参考 [我的家庭实验室 Kubernetes 清单，作为在你的集群上部署此应用的示例](https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fhomelab\u002Ftree\u002Fmain\u002Fk8s\u002Fproductivity\u002Fperplexideez)。\n\n\u003Ch3 id=\"deploying-metal\"> 裸金属 \u003C\u002Fh3>\n\n由于我们无法控制这些环境，并且它们之间存在很大差异，因此不支持不使用容器镜像进行部署。此类问题将被视为超出范围而直接关闭。\n\n\u003Ch3 id=\"deploying-notes\"> 关于依赖的一般说明 \u003C\u002Fh3>\n\n\u003Ch4 id=\"deploying-notes-searxng\"> SearXNG \u003C\u002Fh4>\n\n- 根据我的测试，Perplexideez 很可能会触发 SearXNG 的限流机制。因此，除非有人找到更好的解决方案，否则最好将其禁用。\n- 所有对 SearXNG 的请求 _都会_ 失败，除非 **启用了 JSON 输出**。这一点非常重要，请务必调整你的配置。\n\n\u003Ch3 id=\"deploying-env\"> 环境变量 \u003C\u002Fh3>\n\n\u003Ch4 id=\"deploying-env-data\"> 数据存储 \u003C\u002Fh4>\n\n| 名称 | 必需 | 值 | 示例 |\n| ---- | -------- | ----- | ------- |\n| `DATABASE_URL` | ✅ | 一个指向 Postgres 数据库的 URL。 | `postgresql:\u002F\u002Fpostgres:postgres@localhost:5432\u002Fpostgres?schema=public` |\n\n\u003Ch4 id=\"deploying-env-app\"> 应用设置 \u003C\u002Fh4>\n\n| 名称 | 必需 | 值 | 示例 |\n| ---- | -------- | ----- | ------- |\n| `PUBLIC_BASE_URL` | ✅ | 您实例的公共访问 URL。 | `https:\u002F\u002Fperplexideez.domain.com` \n| `RATE_LIMIT_SECRET` | ✅ | 使用 `openssl rand -base64 32` 生成的密钥，用于保护您的登录页面。 | N\u002FA |\n| `AUTH_SECRET` | ✅ | 使用 `openssl rand -base64 32` 生成的密钥，用于保护您的实例。 | N\u002FA |\n| `DISABLE_SIGN_UP` | ❌（默认：`false`）| 是否禁用您实例的注册功能。 | `true`\u002F`false`\n| `LOG_LEVEL` | ❌（默认：`info`）| 应用应使用的日志级别。 | `trace`\u002F`debug`\u002F`info`\u002F`warn`\u002F`error` |\n| `LOG_MODE` | ❌（默认：`json`）| 是否以美观格式打印日志，或使用 JSON 日志格式。 | `pretty`\u002F`json` |\n| `METRICS_PORT` | ❌（默认：`9001`）| Prometheus 指标将在此端口暴露。 | `9001` |\n| `SKIP_CSRF_CHECK` | ❌（默认：`false`）| 使应用跳过 CSRF 检查。您很可能不需要此设置。只有在您清楚自己在做什么时才应启用。 | `true`\u002F`false` |\n| `USE_SECURE_COOKIES` | ❌（默认：`true`）| 使应用使用安全 Cookie（仅通过 HTTPS 传输）。仅当您未公开应用时才应启用此设置。 | `true`\u002F`false` |\n\n\u003Ch4 id=\"deploying-env-sso\"> SSO \u003C\u002Fh4>\n\n| 名称 | 必需 | 值 | 示例 |\n| ---- | -------- | ----- | ------- |\n| `OIDC_CLIENT_ID` | ❌ | 您身份提供商的客户端 ID。 | N\u002FA |\n| `OIDC_CLIENT_SECRET` | ❌ | 您身份提供商的客户端密钥。 | N\u002FA |\n| `OIDC_ISSUER` | ❌ | 您身份提供商的 `.well-known` URL。 | `https:\u002F\u002Fauth.authentik.com\u002Fapplication\u002Fo\u002Fperplexideez\u002F.well-known\u002Fopenid-configuration` |\n| `OIDC_SCOPES` | ❌（默认：`openid email profile`）| 您身份提供商应请求的 OIDC 范围。 | `openid email profile` |\n| `PUBLIC_OIDC_NAME` | ❌ | 在应用 UI 中显示的身份提供商名称。 | `Zefir's Cloud` |\n| `DISABLE_PASSWORD_LOGIN` | ❌（默认：false）| 是否禁用密码认证并将其从 UI 中隐藏。 | `true`\u002F`false` |\n\n\u003Ch4 id=\"deploying-env-sso-notes\"> SSO 注意事项 \u003C\u002Fh4>\n\n- 此应用的重定向 URL 是 `https:\u002F\u002Fperplexideez.yourdomain.com\u002Fauth\u002Fcallback\u002Fgeneric-oauth`。\n\n\u003Ch4 id=\"deploying-env-searxng\"> SearXNG \u003C\u002Fh4>\n\n| 名称 | 必需 | 值 | 示例 |\n| ---- | -------- | ----- | ------- |\n| `SEARXNG_URL` | ✅ | 您 SearXNG 实例的 URL。 | `http:\u002F\u002Fsearxng:8080` |\n\n\u003Ch4 id=\"deploying-env-ai\"> AI 设置 \u003C\u002Fh4>\n\n| 名称 | 必需 | 值 | 示例 |\n| ---- | -------- | ----- | ------- |\n| `LLM_MODE` | ✅ | `ollama` | 使用哪个 LLM 提供商。 | `ollama`\u002F`openai` |\n| `LLM_SPEED_MODEL` | ✅ | 用于“速度”模式下生成响应的 LLM。 | `gemma2:2b` |\n| `LLM_BALANCED_MODEL` | ✅ | 用于“平衡”模式下生成响应的 LLM。 | `llama3.1:latest` |\n| `LLM_QUALITY_MODEL` | ✅ | 用于“质量”模式下生成响应的 LLM。 | `qwen2.5:32b` |\n| `LLM_EMBEDDINGS_MODEL` | ✅ | 用于文本嵌入的 LLM。 | `nomic-embed-text:latest` |\n| `LLM_TITLE_MODEL` | ✅ | 用于生成聊天标题的 LLM。 | `llama3.1:latest` |\n| `LLM_EMOJI_MODEL` | ✅ | 用于生成聊天表情符号的 LLM。 | `llama3.1:latest` |\n| `LLM_IMAGE_SEARCH_MODEL` | ✅ | 用于图像搜索的 LLM。 | `llama3.1:latest` |\n| `LLM_VIDEO_SEARCH_MODEL` | ✅ | 用于视频搜索的 LLM。 | `llama3.1:latest` |\n\n\u003Ch5 id=\"deploying-env-ai-openai\"> OpenAI \u003C\u002Fh5>\n\n仅当 `LLM_MODE` 设置为 `openai` 时才需要。\n\n| 名称 | 必需 | 值 | 示例 |\n| ---- | -------- | ----- | ------- |\n| `OPENAI_BASE_URL` | ✅ | 您 OpenAI 兼容端点的基本 URL。 | `https:\u002F\u002Fchat.domain.com\u002Fv1` |\n| `OPENAI_API_KEY` | ✅ | 用于请求的 API 密钥。 | `sk-1234` |\n\n\u003Ch5 id=\"deploying-env-ai-ollama\"> Ollama \u003C\u002Fh5>\n\n仅当 `LLM_MODE` 设置为 `ollama` 时才需要。\n\n| 名称 | 必需 | 值 | 示例 |\n| ---- | -------- | ----- | ------- |\n| `OLLAMA_URL` | ✅ | 您 Ollama 实例的 URL。 | `http:\u002F\u002Follama:11434` |\n\n\n\u003Ch2 id=\"builtWith\"> 技术栈 \u003C\u002Fh2>\n\n- [SvelteKit](https:\u002F\u002Fsvelte.dev)\n- [TailwindCSS](https:\u002F\u002Ftailwindcss.com\u002F)\n- [Shadcn Svelte](https:\u002F\u002Fwww.shadcn-svelte.com\u002F)\n- [tRPC](https:\u002F\u002Ftrpc.io\u002F)\n- [Prisma](https:\u002F\u002Fwww.prisma.io\u002F)\n- [AuthJS](https:\u002F\u002Fauthjs.dev\u002F)\n- [TanStack Query](https:\u002F\u002Ftanstack.com\u002Fquery)\n- [Docker](https:\u002F\u002Fdocker.com\u002F)\n- [Kubernetes](https:\u002F\u002Fkubernetes.io)\n- [Langchain](https:\u002F\u002Flangchain.com)\n\n\u003Ch2 id=\"developingLocally\"> 本地开发 \u003C\u002Fh2>\n\n要启动本地副本并运行，请按照以下简单步骤操作。\n\n\u003Ch3 id=\"developingLocally-pre\"> 先决条件 \u003C\u002Fh3>\n\n您需要一个 OpenAI API 令牌\u002FOpenAI 兼容 API，或者在某处运行一个 Ollama 实例。开发容器设置仅提供 Postgres 和 SearXNG。\n\n- pnpm\n  ```sh\n  corepack install pnpm\n  ```\n\n\u003Ch3 id=\"developingLocally-install\"> 安装 \u003C\u002Fh3>\n\n1. 克隆仓库\n   ```sh\n   git clone https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez.git\n   ```\n2. 安装依赖\n   ```sh\n   pnpm install\n   ```\n3. 使用 `.env.example` 创建 `.env` 文件\n4. 启动开发环境\n   ```sh\n   pnpm dev:up\n   ```\n5. 更新数据库模式\n   ```sh\n   pnpm db:push\n   ```\n6. 运行应用\n   ```sh\n   pnpm dev\n   ```\n\n\u003Ch2 id=\"roadmap\"> 路线图 \u003C\u002Fh2>\n\n- [x] 完全支持网络搜索\n- [x] 可共享的无认证链接\n- [ ] 完全无状态化\n  - [ ] 阻止生成过程中退出，以防万一\n  - [ ] 使用 Redis 持久化内部生成状态\n- [ ] 查看和探索图片\u002F视频建议。\n- [ ] 侧边栏上的收藏夹\n- [ ] 确保部署正常工作\n  - [ ] 完成用于 Kubernetes 部署的 Helm Chart\n- [ ] 更多代理\n  - [ ] 网络代理\n  - [ ] 自托管应用代理\n\n请参阅[未解决问题](https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fissues)，以获取完整的提案功能列表（以及已知问题）。\n\n\u003Ch2 id=\"contributing\"> 参与贡献 \u003C\u002Fh2>\n\n正是这些贡献，让开源社区成为一个令人惊叹的学习、启发和创作之地。您所做的任何贡献都**备受赞赏**。\n\n如果您有改进建议，请直接 fork 该仓库并创建一个 pull request。您也可以简单地打开一个带有“enhancement”标签的问题。\n\n别忘了给这个项目点个赞哦！再次感谢！\n\n1. Fork 该项目\n2. 创建您的功能分支 (`git checkout -b feature\u002FAmazingFeature`)\n3. 提交您的更改 (`git commit -m 'Add some AmazingFeature'`)\n4. 推送到该分支 (`git push origin feature\u002FAmazingFeature`)\n5. 打开一个 pull request\n\n\u003Ch2 id=\"license\"> 许可证 \u003C\u002Fh2>\n\n根据 AGPL 许可证进行分发。\n\n\u003Ch2 id=\"contact\"> 联系方式 \u003C\u002Fh2>\n\n布鲁诺·圣约翰 - me@brunostjohn.com\n\n\u003Ch2 id=\"acknowledgments\"> 致谢 \u003C\u002Fh2>\n\n- [Perplexica 团队](https:\u002F\u002Fgithub.com\u002FItzCrazyKns\u002FPerplexica)，感谢他们实现了自托管搜索 AI 助手的基础。","# Perplexideez 快速上手指南\n\nPerplexideez 是一个可自托管的 AI 驱动搜索引擎，旨在提供类似 Perplexity 的体验。它支持多用户、SSO 单点登录，并允许你自由选择后端大模型（通过 Ollama 或 OpenAI 兼容接口），同时使用 SearXNG 进行网络搜索。\n\n## 1. 环境准备\n\n在部署前，请确保你的环境中具备以下组件：\n\n*   **容器运行时**：推荐安装 **Docker** 和 **Docker Compose**。\n*   **数据库**：需要运行一个 **PostgreSQL** 实例。\n*   **搜索引擎**：需要运行一个 **SearXNG** 实例。\n    *   ⚠️ **重要配置**：必须在 SearXNG 配置中启用 **JSON 输出** (`search_format: json`)，否则请求将失败。建议禁用 SearXNG 的频率限制器，以免被 Perplexideez 触发。\n*   **大模型服务**（二选一）：\n    *   **Ollama**：本地运行开源模型（推荐国内开发者使用，可配合国内镜像拉取模型）。\n    *   **OpenAI 兼容接口**：如官方 API 或国内中转服务（需具备 `v1\u002Fchat\u002Fcompletions` 等标准接口）。\n\n## 2. 安装步骤\n\n推荐使用 Docker Compose 进行部署。\n\n### 第一步：获取配置文件\n\n克隆项目或手动创建目录，获取示例配置文件：\n\n```bash\nmkdir perplexideez && cd perplexideez\n# 下载示例 docker-compose 文件 (需自行从 GitHub 获取 deploy\u002Fdocker 目录下的文件)\n# 此处假设你已准备好 docker-compose.yml 和 .env.example\ncp .env.example .env\n```\n\n### 第二步：配置环境变量\n\n编辑 `.env` 文件，填入必要的配置信息。以下是核心变量说明：\n\n```bash\n# --- 数据存储 ---\nDATABASE_URL=postgresql:\u002F\u002Fpostgres:your_password@db:5432\u002Fperplexideez?schema=public\n\n# --- 应用设置 ---\nPUBLIC_BASE_URL=https:\u002F\u002Fyour-domain.com\n# 生成随机密钥: openssl rand -base64 32\nRATE_LIMIT_SECRET=your_generated_secret_1\nAUTH_SECRET=your_generated_secret_2\n\n# --- SearXNG 设置 ---\nSEARXNG_URL=http:\u002F\u002Fsearxng:8080\n\n# --- AI 模型设置 (以 Ollama 为例) ---\nLLM_MODE=ollama\nOLLAMA_URL=http:\u002F\u002Follama:11434\n\n# 指定不同任务使用的模型 (确保这些模型已在 Ollama 中 pull 下来)\nLLM_SPEED_MODEL=gemma2:2b\nLLM_BALANCED_MODEL=llama3.1:latest\nLLM_QUALITY_MODEL=qwen2.5:32b\nLLM_EMBEDDINGS_MODEL=nomic-embed-text:latest\nLLM_TITLE_MODEL=llama3.1:latest\nLLM_EMOJI_MODEL=llama3.1:latest\nLLM_IMAGE_SEARCH_MODEL=llama3.1:latest\nLLM_VIDEO_SEARCH_MODEL=llama3.1:latest\n```\n\n> **注意**：如果你使用 OpenAI 兼容接口，请将 `LLM_MODE` 设为 `openai`，并配置 `OPENAI_BASE_URL` 和 `OPENAI_API_KEY`，同时移除 Ollama 相关变量。\n\n### 第三步：初始化数据库\n\n在启动主应用前，必须先运行迁移容器来初始化数据库结构：\n\n```bash\ndocker run --rm \\\n  -e DATABASE_URL=\"postgresql:\u002F\u002Fpostgres:your_password@db:5432\u002Fperplexideez?schema=public\" \\\n  ghcr.io\u002Fbrunostjohn\u002Fperplexideez\u002Fmigrate\n```\n*(请将 `DATABASE_URL` 替换为你实际的值)*\n\n### 第四步：启动服务\n\n确保你的 `docker-compose.yml` 中包含了 `app`, `searxng`, `db` (以及可选的 `ollama`) 服务，然后启动：\n\n```bash\ndocker compose up -d\n```\n\n## 3. 基本使用\n\n1.  **访问界面**：\n    打开浏览器，访问你在 `PUBLIC_BASE_URL` 中设置的地址（例如 `http:\u002F\u002Flocalhost:3000` 或你的域名）。\n\n2.  **注册\u002F登录**：\n    *   默认情况下允许注册。你可以在 `.env` 中设置 `DISABLE_SIGN_UP=true` 关闭注册。\n    *   支持配置 OIDC SSO（如 Authentik, Keycloak 等），配置后登录页会显示相应的第三方登录按钮。\n\n3.  **开始搜索**：\n    *   在搜索框输入自然语言问题。\n    *   系统会自动调用 SearXNG 搜索网络，并利用配置的 LLM 总结答案。\n    *   **查看来源**：将鼠标悬停在回答中的引用标记上，即可查看原始网页链接，避免幻觉。\n    *   **追问**：系统会根据回答自动生成相关的后续问题，点击即可继续深入探讨。\n\n4.  **管理搜索**：\n    *   点击星号图标可将重要搜索收藏。\n    *   点击分享按钮可生成带权限控制的公开链接，支持精美的 Embed 预览。\n\n5.  **切换模型**：\n    在界面设置或搜索栏附近，你可以针对不同任务（速度优先、平衡、质量优先）切换已配置的大模型。","某自托管技术团队的研究员需要在内部知识库和公开网络中交叉验证最新的容器编排方案，以撰写架构迁移报告。\n\n### 没有 perplexideez 时\n- **数据孤岛严重**：研究员必须分别在 Google 搜索公网信息，再单独登录内部 Wiki 或文档系统查找私有部署记录，无法一次性获取全貌。\n- **溯源困难且耗时**：AI 生成的总结往往缺乏明确出处，研究员需手动逐条核对事实，担心“幻觉”导致技术方案错误。\n- **协作与权限割裂**：团队成员间分享搜索结果只能靠截图或复制粘贴链接，缺乏统一的访问控制，敏感的内部调研内容容易泄露。\n- **资源管理粗放**：直接调用公共大模型 API 成本高且不可控，无法根据任务轻重灵活切换本地 Ollama 模型以节省算力。\n\n### 使用 perplexideez 后\n- **全域统一检索**：通过单一界面即可同时搜索 SearXNG 抓取的网络结果和团队自托管的 Postgres 应用数据，瞬间打通公私域信息壁垒。\n- **引用透明可查**：每个 AI 结论都附带清晰的来源标注，鼠标悬停即可查看原始网页或内部文档，彻底消除对虚假信息的顾虑。\n- **安全共享机制**：支持多用户与 SSO 单点登录，研究员可将关键搜索一键分享给同事，并精确控制谁能查看包含内部数据的嵌入页面。\n- **模型按需调度**：利用自定义配置，简单查询自动路由至本地轻量模型，复杂分析才调用高性能接口，在保障效果的同时最大化利用自有硬件。\n\nperplexideez 将分散的搜索行为转化为可控、可信且可协作的知识发现流程，真正实现了自托管环境下的智能搜索闭环。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fbrunostjohn_perplexideez_9fc9feea.png","brunostjohn","Bruno St John","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fbrunostjohn_ca792af9.png","building what comes after chat",null,"\u002Fdev\u002Frandom","https:\u002F\u002Fbrunostjohn.com","https:\u002F\u002Fgithub.com\u002Fbrunostjohn",[82,86,90,94,97,101,105],{"name":83,"color":84,"percentage":85},"Svelte","#ff3e00",62.6,{"name":87,"color":88,"percentage":89},"TypeScript","#3178c6",36,{"name":91,"color":92,"percentage":93},"CSS","#663399",0.5,{"name":95,"color":96,"percentage":93},"Smarty","#f0c040",{"name":98,"color":99,"percentage":100},"Dockerfile","#384d54",0.2,{"name":102,"color":103,"percentage":104},"HTML","#e34c26",0.1,{"name":106,"color":107,"percentage":104},"JavaScript","#f1e05a",577,47,"2026-04-14T08:49:13","AGPL-3.0",4,"未说明 (基于容器部署，支持任何可运行 Docker\u002FKubernetes 的系统)","非本工具直接需求。取决于后端 LLM 提供者：若使用本地 Ollama，需根据所选模型配置相应 GPU（如运行 32B 模型通常建议 24GB+ 显存）；若使用 OpenAI 兼容接口则无需本地 GPU。","未说明 (取决于后端数据库、SearXNG 及 LLM 模型的总资源消耗)",{"notes":117,"python":118,"dependencies":119},"1. 该项目主要通过 Docker 或 Kubernetes 部署，不支持直接在裸机（Bare Metal）上安装。2. 必须自行搭建或配置外部依赖：Postgres 数据库、SearXNG 搜索引擎实例、以及 Ollama 或 OpenAI 兼容的 LLM 服务。3. SearXNG 配置中必须启用 JSON 输出格式，否则请求会失败；建议禁用其速率限制器以防被触发。4. 支持多用户及 OIDC SSO 单点登录。5. 容器默认以非 root 用户运行，适合无根环境。","未说明 (通过容器镜像交付，内部版本未公开)",[120,121,122,123],"Docker \u002F Kubernetes","PostgreSQL 数据库","SearXNG (需开启 JSON 输出)","Ollama 或 OpenAI 兼容 API 端点",[35,13],"2026-03-27T02:49:30.150509","2026-04-17T08:24:56.029598",[128,133,138,143,148,152],{"id":129,"question_zh":130,"answer_zh":131,"source_url":132},37178,"是否支持在非容器环境（裸机）下直接部署？","不支持。由于缺乏对这些环境的控制以及环境间的高差异性，项目明确声明不使用容器镜像进行部署是不受支持的。相关 Issue 将因超出范围而被关闭。请严格按照 README 使用 Docker 进行部署。","https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fissues\u002F6",{"id":134,"question_zh":135,"answer_zh":136,"source_url":137},37179,"运行 Docker Compose 时遇到 'dependency failed to start: container docker-searxng-1 is unhealthy' 错误怎么办？","这通常是因为 SearXNG 的配置有误。请务必检查并修改 .env 文件中的 SearXNG 密钥（SearXNG key）。此外，该项目仅支持与应用程序直接相关的两个容器（migrate_db 和 app）的问题，SearXNG 本身的日志和配置问题请参考 SearXNG 官方文档或其专属 Issue 页面。","https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fissues\u002F7",{"id":139,"question_zh":140,"answer_zh":141,"source_url":142},37180,"搜索时出现 'SyntaxError: Unexpected token '\u003C', \"\u003C!doctype \"... is not valid JSON' 错误如何解决？","这是因为 SearXNG 未启用 JSON 输出模式。所有对 SearXNG 的请求如果未启用 JSON 输出都会失败。请检查您的 SearXNG 配置文件（settings.yml），确保已启用 JSON 输出（通常设置 `search_format: json` 或类似选项），然后重启 SearXNG 容器。","https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fissues\u002F5",{"id":144,"question_zh":145,"answer_zh":146,"source_url":147},37181,"在 Docker 环境中遇到 'UntrustedHost: Host must be trusted' 认证错误怎么办？","该问题通常与服务器配置有关。维护者已在 1.0.0 版本中修复了此问题。请确保您拉取并构建了最新的 Docker 镜像。同时，请仔细查阅 README 文档中关于完全设置应用程序的说明，确保环境变量（如 PUBLIC_BASE_URL）配置正确。","https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fissues\u002F1",{"id":149,"question_zh":150,"answer_zh":151,"source_url":132},37182,"本地开发运行时出现 'unauthenticated user redirected to \u002Fauth' 随后报 'Server Error' 是怎么回事？","README 中描述的本地开发步骤是专为有 Web 开发栈知识并希望贡献代码的开发者准备的，并非面向普通终端用户的简易安装指南。如果您尝试在裸机上运行遇到此类认证错误，请知悉该项目不支持非容器化部署，建议使用 Docker 进行安装。",{"id":153,"question_zh":154,"answer_zh":155,"source_url":156},37183,"为什么部署需要这么多数据库容器（postgres, init_db, migrate_db, valkey 等），能否简化？","虽然用户建议可以使用单个 Postgres 容器结合其 KV 功能或使用初始化脚本来简化架构，但目前的 Docker Compose 配置是为了确保环境隔离和初始化流程的稳定性。当前设计将数据库初始化、迁移和应用运行分离为不同容器，以减少启动竞争条件并确保数据一致性。如需修改，需自行调整 docker-compose.yml 并处理相应的初始化逻辑。","https:\u002F\u002Fgithub.com\u002Fbrunostjohn\u002Fperplexideez\u002Fissues\u002F4",[158],{"id":159,"version":160,"summary_zh":161,"released_at":162},297707,"1.0.0","这是 Perplexideez 的首次发布。","2024-11-15T14:33:46"]