Skip to content

Commit 5e1746f

Browse files
authored
Merge pull request #928 from ItzCrazyKns/master
Merge master into canary
2 parents 2e73661 + 70c1f72 commit 5e1746f

21 files changed

+459
-294
lines changed

.assets/demo.gif

31.2 MB
Loading

.assets/perplexica-preview.gif

-15.7 MB
Binary file not shown.

.assets/sponsers/warp.png

433 KB
Loading

README.md

Lines changed: 36 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,57 @@
1-
# 🚀 Perplexica - An AI-powered search engine 🔎 <!-- omit in toc -->
1+
# Perplexica 🔍
2+
3+
[![GitHub Repo stars](https://img.shields.io/github/stars/ItzCrazyKns/Perplexica?style=social)](https://github.com/ItzCrazyKns/Perplexica/stargazers)
4+
[![GitHub forks](https://img.shields.io/github/forks/ItzCrazyKns/Perplexica?style=social)](https://github.com/ItzCrazyKns/Perplexica/network/members)
5+
[![GitHub watchers](https://img.shields.io/github/watchers/ItzCrazyKns/Perplexica?style=social)](https://github.com/ItzCrazyKns/Perplexica/watchers)
6+
[![Docker Pulls](https://img.shields.io/docker/pulls/itzcrazykns1337/perplexica?color=blue)](https://hub.docker.com/r/itzcrazykns1337/perplexica)
7+
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/ItzCrazyKns/Perplexica/blob/master/LICENSE)
8+
[![GitHub last commit](https://img.shields.io/github/last-commit/ItzCrazyKns/Perplexica?color=green)](https://github.com/ItzCrazyKns/Perplexica/commits/master)
9+
[![Discord](https://dcbadge.limes.pink/api/server/26aArMy8tT?style=flat)](https://discord.gg/26aArMy8tT)
210

3-
<div align="center" markdown="1">
4-
<sup>Special thanks to:</sup>
5-
<br>
6-
<br>
7-
<a href="https://www.warp.dev/perplexica">
8-
<img alt="Warp sponsorship" width="400" src="https://github.com/user-attachments/assets/775dd593-9b5f-40f1-bf48-479faff4c27b">
9-
</a>
11+
Perplexica is a **privacy-focused AI answering engine** that runs entirely on your own hardware. It combines knowledge from the vast internet with support for **local LLMs** (Ollama) and cloud providers (OpenAI, Claude, Groq), delivering accurate answers with **cited sources** while keeping your searches completely private.
1012

11-
### [Warp, the AI Devtool that lives in your terminal](https://www.warp.dev/perplexica)
13+
![preview](.assets/perplexica-screenshot.png)
1214

13-
[Available for MacOS, Linux, & Windows](https://www.warp.dev/perplexica)
15+
Want to know more about its architecture and how it works? You can read it [here](https://github.com/ItzCrazyKns/Perplexica/tree/master/docs/architecture/README.md).
1416

15-
</div>
17+
## ✨ Features
1618

17-
<hr/>
19+
🤖 **Support for all major AI providers** - Use local LLMs through Ollama or connect to OpenAI, Anthropic Claude, Google Gemini, Groq, and more. Mix and match models based on your needs.
1820

19-
[![Discord](https://dcbadge.limes.pink/api/server/26aArMy8tT?style=flat)](https://discord.gg/26aArMy8tT)
21+
**Smart search modes** - Choose Balanced Mode for everyday searches, Fast Mode when you need quick answers, or wait for Quality Mode (coming soon) for deep research.
2022

21-
![preview](.assets/perplexica-screenshot.png?)
23+
🎯 **Six specialized focus modes** - Get better results with modes designed for specific tasks: Academic papers, YouTube videos, Reddit discussions, Wolfram Alpha calculations, writing assistance, or general web search.
2224

23-
## Table of Contents <!-- omit in toc -->
25+
🔍 **Web search powered by SearxNG** - Access multiple search engines while keeping your identity private. Support for Tavily and Exa coming soon for even better results.
2426

25-
- [Overview](#overview)
26-
- [Preview](#preview)
27-
- [Features](#features)
28-
- [Installation](#installation)
29-
- [Getting Started with Docker (Recommended)](#getting-started-with-docker-recommended)
30-
- [Non-Docker Installation](#non-docker-installation)
31-
- [Ollama Connection Errors](#ollama-connection-errors)
32-
- [Lemonade Connection Errors](#lemonade-connection-errors)
33-
- [Using as a Search Engine](#using-as-a-search-engine)
34-
- [Using Perplexica's API](#using-perplexicas-api)
35-
- [Expose Perplexica to a network](#expose-perplexica-to-network)
36-
- [One-Click Deployment](#one-click-deployment)
37-
- [Upcoming Features](#upcoming-features)
38-
- [Support Us](#support-us)
39-
- [Donations](#donations)
40-
- [Contribution](#contribution)
41-
- [Help and Support](#help-and-support)
27+
📷 **Image and video search** - Find visual content alongside text results. Search isn't limited to just articles anymore.
4228

43-
## Overview
29+
📄 **File uploads** - Upload documents and ask questions about them. PDFs, text files, images - Perplexica understands them all.
4430

45-
Perplexica is an open-source AI-powered searching tool or an AI-powered search engine that goes deep into the internet to find answers. Inspired by Perplexity AI, it's an open-source option that not just searches the web but understands your questions. It uses advanced machine learning algorithms like similarity searching and embeddings to refine results and provides clear answers with sources cited.
31+
🌐 **Search specific domains** - Limit your search to specific websites when you know where to look. Perfect for technical documentation or research papers.
4632

47-
Using SearxNG to stay current and fully open source, Perplexica ensures you always get the most up-to-date information without compromising your privacy.
33+
💡 **Smart suggestions** - Get intelligent search suggestions as you type, helping you formulate better queries.
4834

49-
Want to know more about its architecture and how it works? You can read it [here](https://github.com/ItzCrazyKns/Perplexica/tree/master/docs/architecture/README.md).
35+
📚 **Discover** - Browse interesting articles and trending content throughout the day. Stay informed without even searching.
36+
37+
🕒 **Search history** - Every search is saved locally so you can revisit your discoveries anytime. Your research is never lost.
5038

51-
## Preview
39+
**More coming soon** - We're actively developing new features based on community feedback. Join our Discord to help shape Perplexica's future!
5240

53-
![video-preview](.assets/perplexica-preview.gif)
41+
## Sponsors
5442

55-
## Features
43+
Perplexica's development is powered by the generous support of our sponsors. Their contributions help keep this project free, open-source, and accessible to everyone.
5644

57-
- **Local LLMs**: You can utilize local LLMs such as Qwen, DeepSeek, Llama, and Mistral.
58-
- **Two Main Modes:**
59-
- **Copilot Mode:** (In development) Boosts search by generating different queries to find more relevant internet sources. Like normal search instead of just using the context by SearxNG, it visits the top matches and tries to find relevant sources to the user's query directly from the page.
60-
- **Normal Mode:** Processes your query and performs a web search.
61-
- **Focus Modes:** Special modes to better answer specific types of questions. Perplexica currently has 6 focus modes:
62-
- **All Mode:** Searches the entire web to find the best results.
63-
- **Writing Assistant Mode:** Helpful for writing tasks that do not require searching the web.
64-
- **Academic Search Mode:** Finds articles and papers, ideal for academic research.
65-
- **YouTube Search Mode:** Finds YouTube videos based on the search query.
66-
- **Wolfram Alpha Search Mode:** Answers queries that need calculations or data analysis using Wolfram Alpha.
67-
- **Reddit Search Mode:** Searches Reddit for discussions and opinions related to the query.
68-
- **Current Information:** Some search tools might give you outdated info because they use data from crawling bots and convert them into embeddings and store them in a index. Unlike them, Perplexica uses SearxNG, a metasearch engine to get the results and rerank and get the most relevant source out of it, ensuring you always get the latest information without the overhead of daily data updates.
69-
- **API**: Integrate Perplexica into your existing applications and make use of its capibilities.
45+
<div align="center">
46+
47+
48+
<a href="https://www.warp.dev/perplexica">
49+
<img alt="Warp Terminal" src=".assets/sponsers/warp.png" width="100%">
50+
</a>
7051

71-
It has many more features like image and video search. Some of the planned features are mentioned in [upcoming features](#upcoming-features).
52+
**[Warp](https://www.warp.dev/perplexica)** - The AI-powered terminal revolutionizing development workflows
53+
54+
</div>
7255

7356
## Installation
7457

src/components/Settings/Sections/Models/AddModelDialog.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ const AddModel = ({
9797
>
9898
<DialogPanel className="w-full mx-4 lg:w-[600px] max-h-[85vh] flex flex-col border bg-light-primary dark:bg-dark-primary border-light-secondary dark:border-dark-secondary rounded-lg">
9999
<div className="px-6 pt-6 pb-4">
100-
<h3 className="text-black/90 dark:text-white/90 font-medium">
100+
<h3 className="text-black/90 dark:text-white/90 font-medium text-sm">
101101
Add new {type === 'chat' ? 'chat' : 'embedding'} model
102102
</h3>
103103
</div>
@@ -115,7 +115,7 @@ const AddModel = ({
115115
<input
116116
value={modelName}
117117
onChange={(e) => setModelName(e.target.value)}
118-
className="w-full rounded-lg border border-light-200 dark:border-dark-200 bg-light-primary dark:bg-dark-primary px-4 py-3 text-sm text-black/80 dark:text-white/80 placeholder:text-black/40 dark:placeholder:text-white/40 focus-visible:outline-none focus-visible:border-light-300 dark:focus-visible:border-dark-300 transition-colors disabled:cursor-not-allowed disabled:opacity-60"
118+
className="w-full rounded-lg border border-light-200 dark:border-dark-200 bg-light-primary dark:bg-dark-primary px-4 py-3 text-[13px] text-black/80 dark:text-white/80 placeholder:text-black/40 dark:placeholder:text-white/40 focus-visible:outline-none focus-visible:border-light-300 dark:focus-visible:border-dark-300 transition-colors disabled:cursor-not-allowed disabled:opacity-60"
119119
placeholder="e.g., GPT-4"
120120
type="text"
121121
required
@@ -128,7 +128,7 @@ const AddModel = ({
128128
<input
129129
value={modelKey}
130130
onChange={(e) => setModelKey(e.target.value)}
131-
className="w-full rounded-lg border border-light-200 dark:border-dark-200 bg-light-primary dark:bg-dark-primary px-4 py-3 text-sm text-black/80 dark:text-white/80 placeholder:text-black/40 dark:placeholder:text-white/40 focus-visible:outline-none focus-visible:border-light-300 dark:focus-visible:border-dark-300 transition-colors disabled:cursor-not-allowed disabled:opacity-60"
131+
className="w-full rounded-lg border border-light-200 dark:border-dark-200 bg-light-primary dark:bg-dark-primary px-4 py-3 text-[13px] text-black/80 dark:text-white/80 placeholder:text-black/40 dark:placeholder:text-white/40 focus-visible:outline-none focus-visible:border-light-300 dark:focus-visible:border-dark-300 transition-colors disabled:cursor-not-allowed disabled:opacity-60"
132132
placeholder="e.g., gpt-4"
133133
type="text"
134134
required
@@ -140,7 +140,7 @@ const AddModel = ({
140140
<button
141141
type="submit"
142142
disabled={loading}
143-
className="px-4 py-2 rounded-lg text-sm bg-sky-500 text-white font-medium disabled:opacity-85 hover:opacity-85 active:scale-95 transition duration-200"
143+
className="px-4 py-2 rounded-lg text-[13px] bg-sky-500 text-white font-medium disabled:opacity-85 hover:opacity-85 active:scale-95 transition duration-200"
144144
>
145145
{loading ? (
146146
<Loader2 className="animate-spin" size={16} />

src/components/Settings/Sections/Models/AddProviderDialog.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,10 @@ const AddProvider = ({
8282

8383
setProviders((prev) => [...prev, data]);
8484

85-
toast.success('Provider added successfully.');
85+
toast.success('Connection added successfully.');
8686
} catch (error) {
8787
console.error('Error adding provider:', error);
88-
toast.error('Failed to add provider.');
88+
toast.error('Failed to add connection.');
8989
} finally {
9090
setLoading(false);
9191
setOpen(false);
@@ -96,10 +96,10 @@ const AddProvider = ({
9696
<>
9797
<button
9898
onClick={() => setOpen(true)}
99-
className="px-3 md:px-4 py-1.5 md:py-2 rounded-lg text-xs sm:text-sm border border-light-200 dark:border-dark-200 text-black dark:text-white bg-light-secondary/50 dark:bg-dark-secondary/50 hover:bg-light-secondary hover:dark:bg-dark-secondary hover:border-light-300 hover:dark:border-dark-300 flex flex-row items-center space-x-1 active:scale-95 transition duration-200"
99+
className="px-3 md:px-4 py-1.5 md:py-2 rounded-lg text-xs sm:text-xs border border-light-200 dark:border-dark-200 text-black dark:text-white bg-light-secondary/50 dark:bg-dark-secondary/50 hover:bg-light-secondary hover:dark:bg-dark-secondary hover:border-light-300 hover:dark:border-dark-300 flex flex-row items-center space-x-1 active:scale-95 transition duration-200"
100100
>
101101
<Plus className="w-3.5 h-3.5 md:w-4 md:h-4" />
102-
<span>Add Provider</span>
102+
<span>Add Connection</span>
103103
</button>
104104
<AnimatePresence>
105105
{open && (
@@ -119,16 +119,16 @@ const AddProvider = ({
119119
<DialogPanel className="w-full mx-4 lg:w-[600px] max-h-[85vh] flex flex-col border bg-light-primary dark:bg-dark-primary border-light-secondary dark:border-dark-secondary rounded-lg">
120120
<form onSubmit={handleSubmit} className="flex flex-col flex-1">
121121
<div className="px-6 pt-6 pb-4">
122-
<h3 className="text-black/90 dark:text-white/90 font-medium">
123-
Add new provider
122+
<h3 className="text-black/90 dark:text-white/90 font-medium text-sm">
123+
Add new connection
124124
</h3>
125125
</div>
126126
<div className="border-t border-light-200 dark:border-dark-200" />
127127
<div className="flex-1 overflow-y-auto px-6 py-4">
128128
<div className="flex flex-col space-y-4">
129129
<div className="flex flex-col items-start space-y-2">
130130
<label className="text-xs text-black/70 dark:text-white/70">
131-
Select provider type
131+
Select connection type
132132
</label>
133133
<Select
134134
value={selectedProvider ?? ''}
@@ -149,13 +149,13 @@ const AddProvider = ({
149149
className="flex flex-col items-start space-y-2"
150150
>
151151
<label className="text-xs text-black/70 dark:text-white/70">
152-
Name*
152+
Connection Name*
153153
</label>
154154
<input
155155
value={name}
156156
onChange={(e) => setName(e.target.value)}
157157
className="w-full rounded-lg border border-light-200 dark:border-dark-200 bg-light-primary dark:bg-dark-primary px-4 py-3 pr-10 text-sm text-black/80 dark:text-white/80 placeholder:text-black/40 dark:placeholder:text-white/40 focus-visible:outline-none focus-visible:border-light-300 dark:focus-visible:border-dark-300 transition-colors disabled:cursor-not-allowed disabled:opacity-60"
158-
placeholder={'Provider Name'}
158+
placeholder={'e.g., My OpenAI Connection'}
159159
type="text"
160160
required={true}
161161
/>
@@ -178,7 +178,7 @@ const AddProvider = ({
178178
[field.key]: event.target.value,
179179
}))
180180
}
181-
className="w-full rounded-lg border border-light-200 dark:border-dark-200 bg-light-primary dark:bg-dark-primary px-4 py-3 pr-10 text-sm text-black/80 dark:text-white/80 placeholder:text-black/40 dark:placeholder:text-white/40 focus-visible:outline-none focus-visible:border-light-300 dark:focus-visible:border-dark-300 transition-colors disabled:cursor-not-allowed disabled:opacity-60"
181+
className="w-full rounded-lg border border-light-200 dark:border-dark-200 bg-light-primary dark:bg-dark-primary px-4 py-3 pr-10 text-[13px] text-black/80 dark:text-white/80 placeholder:text-black/40 dark:placeholder:text-white/40 focus-visible:outline-none focus-visible:border-light-300 dark:focus-visible:border-dark-300 transition-colors disabled:cursor-not-allowed disabled:opacity-60"
182182
placeholder={
183183
(field as StringUIConfigField).placeholder
184184
}
@@ -194,12 +194,12 @@ const AddProvider = ({
194194
<button
195195
type="submit"
196196
disabled={loading}
197-
className="px-4 py-2 rounded-lg text-sm bg-sky-500 text-white font-medium disabled:opacity-85 hover:opacity-85 active:scale-95 transition duration-200"
197+
className="px-4 py-2 rounded-lg text-[13px] bg-sky-500 text-white font-medium disabled:opacity-85 hover:opacity-85 active:scale-95 transition duration-200"
198198
>
199199
{loading ? (
200200
<Loader2 className="animate-spin" size={16} />
201201
) : (
202-
'Add Provider'
202+
'Add Connection'
203203
)}
204204
</button>
205205
</div>

src/components/Settings/Sections/Models/DeleteProviderDialog.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ const DeleteProvider = ({
3434
return prev.filter((p) => p.id !== modelProvider.id);
3535
});
3636

37-
toast.success('Provider deleted successfully.');
37+
toast.success('Connection deleted successfully.');
3838
} catch (error) {
3939
console.error('Error deleting provider:', error);
40-
toast.error('Failed to delete provider.');
40+
toast.error('Failed to delete connection.');
4141
} finally {
4242
setLoading(false);
4343
}
@@ -51,7 +51,7 @@ const DeleteProvider = ({
5151
setOpen(true);
5252
}}
5353
className="group p-1.5 rounded-md hover:bg-light-200 hover:dark:bg-dark-200 transition-colors group"
54-
title="Delete provider"
54+
title="Delete connection"
5555
>
5656
<Trash2
5757
size={14}
@@ -76,14 +76,15 @@ const DeleteProvider = ({
7676
<DialogPanel className="w-full mx-4 lg:w-[600px] max-h-[85vh] flex flex-col border bg-light-primary dark:bg-dark-primary border-light-secondary dark:border-dark-secondary rounded-lg">
7777
<div className="px-6 pt-6 pb-4">
7878
<h3 className="text-black/90 dark:text-white/90 font-medium">
79-
Delete provider
79+
Delete connection
8080
</h3>
8181
</div>
8282
<div className="border-t border-light-200 dark:border-dark-200" />
8383
<div className="flex-1 overflow-y-auto px-6 py-4">
84-
<p className="text-SM text-black/60 dark:text-white/60">
85-
Are you sure you want to delete the provider &quot;
84+
<p className="text-sm text-black/60 dark:text-white/60">
85+
Are you sure you want to delete the connection &quot;
8686
{modelProvider.name}&quot;? This action cannot be undone.
87+
All associated models will also be removed.
8788
</p>
8889
</div>
8990
<div className="px-6 py-6 flex justify-end space-x-2">

0 commit comments

Comments
 (0)