Giter Club home page Giter Club logo

nilsherzig / llocalsearch Goto Github PK

View Code? Open in Web Editor NEW
5.0K 27.0 315.0 318 KB

LLocalSearch is a completely locally running search aggregator using LLM Agents. The user can ask a question and the system will use a chain of LLMs to find the answer. The user can see the progress of the agents and the final answer. No OpenAI or Google API keys are needed.

License: Apache License 2.0

JavaScript 1.32% CSS 0.05% HTML 0.30% Svelte 38.06% TypeScript 3.79% Makefile 1.59% Go 53.93% Dockerfile 0.96%
llm search-engine

llocalsearch's Introduction

LLocalSearch

What it is and what it does

Screencast.from.2024-05-03.16-56-58.webm

LLocalSearch is a wrapper around locally running Large Language Models (like ChatGTP, but a lot smaller and less "smart") which allows them to choose from a set of tools. These tools allow them to search the internet for current information about your question. This process is iterative, which means, that the running LLM can freely choose to use tools (even multiple times) based on the information its getting from you and other tool calls.

Here is a rough representation of how this looks like.

flowchart TB
	You
	LLM
	WebSearch
	WebScrape
	Database
	FinalAnswer
	
	You -- asking a question --> LLM
	LLM --> WebSearch
	LLM --> WebScrape
	LLM --> Database
	LLM -- answer --> FinalAnswer

	WebSearch --> LLM
	WebScrape --> LLM
	Database --> LLM

	FinalAnswer -- send to --> You

Features

  • ๐Ÿ•ตโ€โ™€ Completely local (no need for API keys) and thus a lot more privacy respecting
  • ๐Ÿ’ธ Runs on "low end" hardware (the demo video uses a 300โ‚ฌ GPU)
  • ๐Ÿค“ Live logs and links in the answer allow you do get a better understanding about what the agent is doing and what information the answer is based on. Allowing for a great starting point to dive deeper into your research.
  • ๐Ÿค” Supports follow up questions
  • ๐Ÿ“ฑ Mobile friendly design
  • ๐ŸŒ“ Dark and light mode

Road-map

I'm currently working on ๐Ÿ‘ท

Support for LLama3 ๐Ÿฆ™

The langchain library im using does not respect the LLama3 stop words, which results in LLama3 starting to hallucinate at the end of a turn. I have a working patch (checkout the experiments branch), but since im unsure if my way is the right way to solve this, im still waiting for a response from the langchaingo team.

Interface overhaul ๐ŸŒŸ

An Interface overhaul, allowing for more flexible panels and more efficient use of space. Inspired by the current layout of Obsidian

Support for chat histories / recent conversations ๐Ÿ•ตโ€โ™€

Still needs a lot of work, like refactoring a lot of the internal data structures to allow for more better and more flexible ways to expand the functionality in the future without having to rewrite the whole data transmission and interface part again.

Planed (near future)

User Accounts ๐Ÿ™†

Groundwork for private information inside the rag chain, like uploading your own documents, or connecting LLocalSearch to services like Google Drive, or Confluence.

Long term memory ๐Ÿง 

Not sure if there is a right way to implement this, but provide the main agent chain with information about the user, like preferences and having an extra Vector DB Namespace per user for persistent information.

Install Guide

Docker ๐Ÿณ

  1. Clone the GitHub Repository
[email protected]:nilsherzig/LLocalSearch.git
cd LLocalSearch
  1. Create and edit an .env file, if you need to change some of the default settings. This is typically only needed if you have Ollama running on a different device or if you want to build a more complex setup (for more than your personal use f.ex.). Please read Ollama Setup Guide if you struggle to get the Ollama connection running.
touch .env
code .env # open file with vscode
nvim .env # open file with neovim
  1. Run the containers
docker-compose up -d

llocalsearch's People

Contributors

dependabot[bot] avatar jpoz avatar nilsherzig avatar popey avatar sinwoobang avatar xiaoconstantine avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

llocalsearch's Issues

Exceptions in the `make dev` log: warning or issue?

Hi Nils,

The make dev log raises some exceptions, the first one is:

...
frontend-dev-1  |   VITE v5.1.6  ready in 1088 ms
frontend-dev-1  | 
frontend-dev-1  |   โžœ  Local:   http://localhost:5173/
frontend-dev-1  |   โžœ  Network: http://172.21.0.5:5173/
searxng         | 2024-04-01 16:35:12,806 ERROR:searx.engines.wikidata: Fail to initialize
searxng         | Traceback (most recent call last):
searxng         |   File "/usr/local/searxng/searx/network/__init__.py", line 95, in request
searxng         |     return future.result(timeout)
searxng         |            ^^^^^^^^^^^^^^^^^^^^^^
searxng         |   File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng         |     raise TimeoutError()
searxng         | TimeoutError
...

and this is the last one:

searxng         | TimeoutError
searxng         | 
searxng         | The above exception was the direct cause of the following exception:
searxng         | 
searxng         | Traceback (most recent call last):
searxng         |   File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng         |     self.engine.init(get_engine_from_settings(self.engine_name))
searxng         |   File "/usr/local/searxng/searx/engines/soundcloud.py", line 69, in init
searxng         |     guest_client_id = get_client_id()
searxng         |                       ^^^^^^^^^^^^^^^
searxng         |   File "/usr/local/searxng/searx/engines/soundcloud.py", line 57, in get_client_id
searxng         |     resp = http_get(app_js_url)
searxng         |            ^^^^^^^^^^^^^^^^^^^^
searxng         |   File "/usr/local/searxng/searx/network/__init__.py", line 164, in get
searxng         |     return request('get', url, **kwargs)
searxng         |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng         |   File "/usr/local/searxng/searx/network/__init__.py", line 97, in request
searxng         |     raise httpx.TimeoutException('Timeout', request=None) from e
searxng         | httpx.TimeoutException: Timeout
frontend-dev-1  | 
frontend-dev-1  |   VITE v5.1.6  ready in 1120 ms
frontend-dev-1  | 
frontend-dev-1  |   โžœ  Local:   http://localhost:5173/
frontend-dev-1  |   โžœ  Network: http://172.21.0.5:5173/

Should be considered warnings or is there any underlying issue?

Parsing errors

Screenshot_20240402_035733

This happens in an endless loop until the tab is closed after you ask it a question..

Agent tool Repetive output

Describe the bug
A clear and concise description of what the bug is.
When use mistral:latest as model, I get repetive output from agents, examples:
Screenshot 2024-04-05 at 12 15 22 PM

I didn't notice this behavior with hermes-2-pro-mistral tho

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

Additional context
Add any other context about the problem here.

[Feature] Make it easier or document how to change the default port from 8080

Hi, port 8080 is quite common, and chances are it's used by other servers or WebUI.

Changing it in the docker-compose-dev.yaml isn't enough, because it's also hard-coded in other files, such as:

(LLocalsearch) 10:50:43 piero@gl753vd  LLocalsearch $ grep -R 8080 *
backend/Dockerfile.dev:EXPOSE 8080
backend/apiServer.go:	fmt.Println("Server started at http://localhost:8080")
backend/apiServer.go:	http.ListenAndServe(":8080", nil)
backend/Dockerfile:# Expose port 8080 to the outside world
backend/Dockerfile:EXPOSE 8080
grep: backend/tmp/main: binary file matches
docker-compose.dev.yaml:      - '8080:8080'
node_modules/vite/dist/node/index.d.ts:     * @example `http://127.0.0.1:8080`
node_modules/sade/readme.md:  .example('--port 8080 --etag')
node_modules/sade/readme.md:    $ sirv --port 8080 --etag
vite.config.ts:                target: 'http://backend-dev:8080',
...

Thank you,
Piero

feat: search filters for searxng

Expose filters like "programming" to the user interface. This would allow us to only scrape through "trusted" or topic relevant sites like stack overflow for example

Chat history

Not sure if this is already suggested but i searched "history" on the issues page and nothing really showed up.

Exiting chain with error: model 'all-minilm' not found, try pulling it first

Exiting chain with error: model 'all-minilm' not found, try pulling it first

I WAIVER. Too many hours without a solution.
when you make a simple and functional project I will be happy

backend-1 | 2024/04/04 13:43:49 Error adding document: error adding document: model 'all-minilm' not found, try pulling it first
backend-1 | 2024/04/04 13:43:49 error from evaluator: Error adding document: error adding document: model 'all-minilm' not found, try pulling it first
backend-1 | 2024/04/04 13:43:49 Error adding document: error adding document: model 'all-minilm' not found, try pulling it first
backend-1 | 2024/04/04 13:43:49 error from evaluator: Error adding document: error adding document: model 'all-minilm' not found, try pulling it first

rst
backend-1 | 2024/04/04 13:43:27 INFO Creating new session session=9b2eea7b-c5eb-4662-908c-2435f77d3c75
backend-1 | 2024/04/04 13:43:27 INFO Starting agent chain session=9b2eea7b-c5eb-4662-908c-2435f77d3c75 userQuery="{Prompt:how much do OpenAI and Microsoft plan to spend on their new datacenter? MaxIterations:30 ModelName:knoopx/hermes-2-pro-mistral:7b-q8_0 Session:9b2eea7b-c5eb-4662-908c-2435f77d3c75}" startTime=2024-04-04T13:43:27.128Z
searxng-1 | 2024-04-04 13:43:48,208 WARNING:searx.engines.qwant: ErrorContext('searx/engines/qwant.py', 191, 'raise SearxEngineAPIException(f"{msg} ({error_code})")', 'searx.exceptions.SearxEngineAPIException', None, ('unknown (27)',)) False
searxng-1 | 2024-04-04 13:43:48,209 ERROR:searx.engines.qwant: exception : unknown (27)
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/online.py", line 163, in search
searxng-1 | search_results = self._search_basic(query, params)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/search/processors/online.py", line 151, in _search_basic
searxng-1 | return self.engine.response(response)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/qwant.py", line 151, in response
searxng-1 | return parse_web_api(resp)
searxng-1 | ^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/qwant.py", line 191, in parse_web_api
searxng-1 | raise SearxEngineAPIException(f"{msg} ({error_code})")
searxng-1 | searx.exceptions.SearxEngineAPIException: unknown (27)
backend-1 | 2024/04/04 13:43:49 Search found 44 Results
backend-1 | 2024/04/04 13:43:49 error from evaluator: no content found

bug: container hostnames seem to be hardcoded

I was trying to figure out why the frontend wouldn't connect to my backend container and found that the container names appear to be hard coded.

For example if I understand https://github.com/nilsherzig/LLocalSearch/blob/main/vite.config.ts#L9 correctly this assumes the backend container is always going to exist at http://backend:8080 - which won't work if your backend container is named something else, e.g. in my case llocalsearch-backend and may be behind a traefik load balancer so could be something like https://llocalsearch-backend.my.domain:443

  • Would it be possible to move common config options such as the container names, ports, URLs to a .env file?

Get "https://registry-1.docker.io/v2/": read tcp 192.168.1.198:55070->54.227.20.253:443: read: connection reset by peer

Hi, I'm installing using make dev on my Arch Linux box.

Is this an authentication error?

(LLocalsearch) 19:45:18 piero@gl753vd  LLocalsearch $ make dev
docker-compose -f ./docker-compose.dev.yaml build
[+] Building 1.3s (13/13) FINISHED                                                                                                                            docker:default
 => [backend-dev internal] load build definition from Dockerfile.dev                                                                                                    0.0s
 => => transferring dockerfile: 149B                                                                                                                                    0.0s
 => [backend-dev internal] load metadata for docker.io/library/golang:alpine3.19                                                                                        0.5s
 => [backend-dev internal] load .dockerignore                                                                                                                           0.0s
 => => transferring context: 2B                                                                                                                                         0.0s
 => [backend-dev 1/3] FROM docker.io/library/golang:alpine3.19@sha256:0466223b8544fb7d4ff04748acc4d75a608234bf4e79563bff208d2060c0dd79                                  0.0s
 => CACHED [backend-dev 2/3] WORKDIR /app                                                                                                                               0.0s
 => CACHED [backend-dev 3/3] RUN go install github.com/cosmtrek/air@latest                                                                                              0.0s
 => [backend-dev] exporting to image                                                                                                                                    0.0s
 => => exporting layers                                                                                                                                                 0.0s
 => => writing image sha256:082259fe1045e35be0d8337ae5126406ed4d0f74403bc59e581d39536df22120                                                                            0.0s
 => => naming to docker.io/library/llocalsearch-backend-dev                                                                                                             0.0s
 => [frontend-dev internal] load build definition from Dockerfile.dev                                                                                                   0.0s
 => => transferring dockerfile: 148B                                                                                                                                    0.0s
 => [frontend-dev internal] load metadata for docker.io/library/node:20-alpine3.19                                                                                      0.6s
 => [frontend-dev internal] load .dockerignore                                                                                                                          0.0s
 => => transferring context: 2B                                                                                                                                         0.0s
 => [frontend-dev 1/2] FROM docker.io/library/node:20-alpine3.19@sha256:ef3f47741e161900ddd07addcaca7e76534a9205e4cd73b2ed091ba339004a75                                0.0s
 => CACHED [frontend-dev 2/2] WORKDIR /app                                                                                                                              0.0s
 => [frontend-dev] exporting to image                                                                                                                                   0.0s
 => => exporting layers                                                                                                                                                 0.0s
 => => writing image sha256:eee1d3e3951d679fe05a6f47a218d743e4050b39cb8567d75fa2b8e8eebecd79                                                                            0.0s
 => => naming to docker.io/library/llocalsearch-frontend-dev                                                                                                            0.0s
docker-compose -f ./docker-compose.dev.yaml up
[+] Running 3/3
 โœ˜ searxng Error  context canceled                                                                                                                                      0.4s 
 โœ˜ chromadb Error context canceled                                                                                                                                      0.4s 
 โœ˜ redis Error    Get "https://registry-1.docker.io/v2/": read tcp 192.168.1.198:55070->54.227.20.253:443: read: connection reset by peer                               0.4s 
Error response from daemon: Get "https://registry-1.docker.io/v2/": read tcp 192.168.1.198:55070->54.227.20.253:443: read: connection reset by peer
make: *** [Makefile:7: dev] Error 18

Thank you,
Piero

An option to just output final message?

This would be nice, maybe have it pop up the chain messages fleetingly similar to when microsoft copilot searches for things, then just display the final answer.

"Exiting chain with error: invalid character '<' looking for beginning of value"

Issue:

Error "Exiting chain with error: invalid character '<' looking for beginning of value"

Description:

I have installed LLocalSearch on Ubuntu 22.04 using Docker and have successfully connected it to my Ollama instance running on the same server (not in Docker). The Ollama service is configured to listen on all interfaces and responds to API requests from other systems on the LAN.

Ollama Installation:

It can successfully connect to my Ollama instance on the same server (not in Docker). I can tell it works because it successfully used the API to pull all-minilm:v2. Also, I changed the Ollama service to listen on all interfaces (ex. Environment="OLLAMA_HOST=0.0.0.0:11434" in /etc/systemd/system/ollama.service. I verified that I get a response when I run this from another system on the LAN, which makes me think Ollama is fine:

curl http://192.168.0.80:11434/api/generate -d '{
  "model": "llama2",
  "prompt":"Why is the sky blue?"
}'

Error

However, when I use the LLocalSearch interface at http://localhost:3000, any preset or longer chat prompt I choose results in the following error:

Exiting chain with error: invalid character '<' looking for beginning of value

The backend logs show:

2024/04/04 06:23:04 INFO Starting the server
Server started at http://localhost:8080
2024/04/04 06:25:16 INFO Creating new session session=418c6f73-c3a6-4378-82cb-2881e48dda83
2024/04/04 06:25:16 INFO Starting agent chain session=418c6f73-c3a6-4378-82cb-2881e48dda83 userQuery="{Prompt:how much does obsidian sync cost? MaxIterations:30 ModelName:knoopx/hermes-2-pro-mistral:7b-q8_0 Session:418c6f73-c3a6-4378-82cb-2881e48dda83}" startTime=2024-04-04T06:25:16.250Z
Error parsing the JSON: invalid character '<' looking for beginning of value
Exiting chain with error: invalid character '<' looking for beginning of value

Simple test queries that don't trigger a search seem to work fine. For example, if I write "test," I get the expected response:

Test
The question "test" is not specific enough for me to provide an accurate response or determine if a tool is necessary. Could you please rephrase your question or provide more context so I can better assist you?

Logs:

2024/04/04 06:53:57 INFO Starting agent chain session=e0584807-dc7f-465b-871f-5b7162cafea3 userQuery="{Prompt:test MaxIterations:30 ModelName:knoopx/hermes-2-pro-mistral:7b-q8_0 Session:e0584807-dc7f-465b-871f-5b7162cafea3}" startTime=2024-04-04T06:53:57.390Z
2024/04/04 06:53:58 mem messages [{
    1. Fromat your answer (after AI:) in markdown. 
    2. You have to use your tools to answer questions. 
    3. You have to provide the sources / links you've used to answer the quesion.
    4. You may use tools more than once.
    Question: test} { # Test
The question "test" is not specific enough for me to provide an accurate response or determine if a tool is necessary. Could you please rephrase the question or provide more context so that I can better assist you?<|im_end|> <nil>}]

Docker-compose

Here is my docker-compose configuration. All I've changed is the IP for Ollama.

services:
  backend:
    image: nilsherzig/llocalsearch-backend:latest
    environment:
      # the ip / url of YOUR Ollama server
      # CHANGE THIS
      - OLLAMA_HOST=http://192.168.0.80:11434

      # the url of the chroma db
      - CHROMA_DB_URL=http://chromadb:8000

      # the url of the redis db
      - SEARXNG_DOMAIN=http://searxng:8080

      # the maximum amount of iterations the agent will run to find your answer
      - MAX_ITERATIONS=30
    networks:
      - llm_network

  frontend:
    depends_on:
      - backend
    image: nilsherzig/llocalsearch-frontend:latest
    ports:
      - '3000:4173'
    networks:
      - llm_network

  chromadb:
    image: chromadb/chroma
    networks:
      - llm_network

  redis:
    image: docker.io/library/redis:alpine
    command: redis-server --save 30 1 --loglevel warning
    networks:
      - searxng
    volumes:
      - redis-data:/data
    cap_drop:
      - ALL
    cap_add:
      - SETGID
      - SETUID
      - DAC_OVERRIDE

  searxng:
    image: docker.io/searxng/searxng:latest
    networks:
      - searxng
      - llm_network
    volumes:
      - ./searxng:/etc/searxng:rw
    environment:
      - SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - SETGID
      - SETUID
    logging:
      driver: 'json-file'
      options:
        max-size: '1m'
        max-file: '1'

networks:
  llm_network:
    driver: bridge
  searxng:
    ipam:
      driver: default

volumes:
  redis-data:

I have double-checked the configuration and connections between the components, and everything seems to be set up correctly.

Could you please help me identify the cause of this error and provide guidance on how to resolve it? Let me know if you need any additional information.

Thank you for your assistance!

Can I bundle it all in one ?

Is your feature request related to a problem? Please describe.
I want to let my friends to use this project. But they are not programmers.

Describe the solution you'd like
Can I bundle it all in one, how ? so that my friends could run the project in one click and no need to wait for docker image downloads and model downloads.

Describe alternatives you've considered
None

Additional context
None

Can't connect to redis db

Describe the bug
Running docker-compose up does not work as expected.

To Reproduce

git clone https://github.com/nilsherzig/LLocalSearch.git
cd ./LLocalSearch
docker-compose up 

Expected behavior
Application starts.

Screenshots

...
chromadb-1  | DEBUG:    [04-04-2024 10:50:37] Starting component SegmentAPI
searxng-1   | 2024-04-04 10:50:37,048 ERROR:searx.redisdb: [searxng (977)] can't connect redis DB ...
searxng-1   | Traceback (most recent call last):
searxng-1   |   File "/usr/lib/python3.11/site-packages/redis/connection.py", line 276, in connect
...

Additional context

The docker-compose.yml has not been modified. The variable for SEARXNG_DOMAIN is set as follows:

- SEARXNG_DOMAIN=http://searxng:8080

And the container name is:

searxng:
    image: docker.io/searxng/searxng:latest
    networks:
      - searxng
      - llm_network
      ...

minimal instructions on how to setup ollama for this project?

I installed ollama, downloaded the all-minilm:v2 model as is mentioned in the error message from this project:
Model all-minilm:v2 does not exist and could not be pulled: Post "http://127.0.0.1:11434/api/pull": dial tcp 127.0.0.1:11434: connect: connection refused

curl http://127.0.0.1:11434 shows:
Ollama is running

ollama list
NAME ID SIZE MODIFIED
all-minilm:v2 1b226e2802db 45 MB 11 minutes ago

Suggestion

This is strictly opinionated but I think you should only put 2 or 3 sample prompts on the page. And make them a bit less controversial than some of the ones that are on there.

Let me know what you think

bug: backend: Error parsing the JSON: invalid character 'B' looking for beginning of value

When performing a search the following error occurs:

2024/04/04 01:58:57 INFO Starting the server
Server started at http://localhost:8080
2024/04/04 01:59:12 INFO Creating new session session=40f2d35b-1ca5-4b4f-a210-1ee1632f7cd7
2024/04/04 01:59:12 INFO Starting agent chain session=40f2d35b-1ca5-4b4f-a210-1ee1632f7cd7 userQuery="{Prompt:Pixel 7 camera specs MaxIterations:30 ModelName:knoopx/hermes-2-pro-mistral:7b-q8_0 Session:40f2d35b-1ca5-4b4f-a210-1ee1632f7cd7}" startTime=2024-04-04T01:59:12.609Z
Error parsing the JSON: invalid character 'B' looking for beginning of value
Exiting chain with error: invalid character 'B' looking for beginning of value

2024/04/04 02:09:18 INFO Starting the server
Server started at http://localhost:8080
2024/04/04 02:09:22 INFO Creating new session session=033e3836-1bb9-4867-8303-4b149ae38426
2024/04/04 02:09:22 INFO Starting agent chain session=033e3836-1bb9-4867-8303-4b149ae38426 userQuery="{Prompt:Pixel 7 camera specs MaxIterations:30 ModelName:knoopx/hermes-2-pro-mistral:7b-q8_0 Session:033e3836-1bb9-4867-8303-4b149ae38426}" startTime=2024-04-04T02:09:22.854Z
Error parsing the JSON: invalid character '<' looking for beginning of value
Exiting chain with error: invalid character '<' looking for beginning of value

I also notice that the model name set in the environment is being ignored.

...
    environment:
      - BACKEND_URL=http://llocalsearch-backend:8080
      - OLLAMA_HOST=https://ollama.my.domain:443
      - OLLAMA_MODEL_NAME=eramax/starling-lm-7b-beta:q6

I wonder if there are some other hardcoded hostnames/urls? #21

Modify system prompt to follow the language of the search query

First of all, thanks @nilsherzig for getting this wonderful project together!

When searching in other non English languages, LlocalSearch responds in English by default.

Prompt engineering in the search string doesn't work properly. Things like:

  • Describe in Spanish topic 1, messes the topic 1 with how to describe something in spanish
  • Topic 1 main ideas in Spanish, produces similar effects.

This happens as the search query is passed to the llm as the string to work upon, not the instructions to produce the output.

To fix this behavior, the language "selection" should be outside of search query. I suspect you have a base template for the system role. So, the way to fix this would be to add a sentence like: "Create your reply in the same language as the search string. When you are not able to determine the search string input, default to English."

Some additional variations could be crafted and tested to make sure that output is produced in the same language as input.

I am happy to support testing these changes

Not able to run docker

When running docker-compose up on the head, it throws the following error

ERROR: Invalid interpolation format for "searxng" option in service "services": "SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/"

The program reported an error and could not be used properly.

    • description error * *.

Run the latest version of the error, open the Web interface on http://localhost:3000, the search can not see the progress and the final answer.

    • reproduce * *.
      To reproduce the behavior:
  1. Git clone https://github.com/nilsherzig/LLocalSearch.git (latest).

  2. Cd. / LLocalSearch.

  3. Docker-compose up.

  4. See the mistake.

(1) console.
(base) root@DESKTOP-O48EQIG:/mnt/d/LLocalSearch# docker-compose up
[+] Running 5/5
โœ” Container llocalsearch-searxng-1 Created 0.0s
โœ” Container llocalsearch-chromadb-1 Created 0.0s
โœ” Container llocalsearch-redis-1 Created 0.0s
โœ” Container llocalsearch-backend-1 Recreated 1.5s
โœ” Container llocalsearch-frontend-1 Recreated 0.1s
Attaching to backend-1, chromadb-1, frontend-1, redis-1, searxng-1
backend-1 | 2024/04/05 12:56:13 INFO Starting the server
backend-1 | Server started at http://localhost:8080
chromadb-1 | Starting 'uvicorn chromadb.app:app' with args: --workers 1 --host 0.0.0.0 --port 8000 --proxy-headers --log-config chromadb/log_config.yml --timeout-keep-alive 30
searxng-1 | SearXNG version 2024.3.29+f5bb64cca
searxng-1 | Use existing /etc/searxng/uwsgi.ini
searxng-1 | Use existing /etc/searxng/settings.yml
searxng-1 | Listen on 0.0.0.0:8080
searxng-1 | [uWSGI] getting INI configuration from /etc/searxng/uwsgi.ini
searxng-1 | [uwsgi-static] added mapping for /static => /usr/local/searxng/searx/static
searxng-1 | *** Starting uWSGI 2.0.23 (64bit) on [Fri Apr 5 12:56:14 2024] ***
searxng-1 | compiled with version: 13.2.1 20231014 on 30 November 2023 14:34:33
searxng-1 | os: Linux-5.15.133.1-microsoft-standard-WSL2 #1 SMP Thu Oct 5 21:02:42 UTC 2023
searxng-1 | nodename: cb016636a311
searxng-1 | machine: x86_64
searxng-1 | clock source: unix
searxng-1 | pcre jit disabled
searxng-1 | detected number of CPU cores: 12
searxng-1 | current working directory: /usr/local/searxng
searxng-1 | detected binary path: /usr/sbin/uwsgi
searxng-1 | chdir() to /usr/local/searxng/searx/
searxng-1 | your memory page size is 4096 bytes
searxng-1 | detected max file descriptor number: 1048576
searxng-1 | building mime-types dictionary from file /etc/mime.types...1390 entry found
searxng-1 | lock engine: pthread robust mutexes
searxng-1 | thunder lock: disabled (you can enable it with --thunder-lock)
searxng-1 | uwsgi socket 0 bound to TCP address 0.0.0.0:8080 fd 3
searxng-1 | Python version: 3.11.8 (main, Feb 19 2024, 17:01:17) [GCC 13.2.1 20231014]
searxng-1 | Python main interpreter initialized at 0x7f71c61072d8
searxng-1 | python threads support enabled
searxng-1 | your server socket listen backlog is limited to 100 connections
searxng-1 | your mercy for graceful operations on workers is 60 seconds
searxng-1 | mapped 1568736 bytes (1531 KB) for 48 cores
searxng-1 | *** Operational MODE: preforking+threaded ***
searxng-1 | added /usr/local/searxng/ to pythonpath.
searxng-1 | spawned uWSGI master process (pid: 7)
searxng-1 | spawned uWSGI worker 1 (pid: 10, cores: 4)
searxng-1 | spawned uWSGI worker 2 (pid: 11, cores: 4)
searxng-1 | spawned uWSGI worker 3 (pid: 12, cores: 4)
searxng-1 | spawned 4 offload threads for uWSGI worker 3
searxng-1 | spawned uWSGI worker 4 (pid: 17, cores: 4)
searxng-1 | spawned uWSGI worker 5 (pid: 19, cores: 4)
searxng-1 | spawned uWSGI worker 6 (pid: 22, cores: 4)
searxng-1 | spawned 4 offload threads for uWSGI worker 4
searxng-1 | spawned 4 offload threads for uWSGI worker 5
searxng-1 | spawned uWSGI worker 7 (pid: 30, cores: 4)
searxng-1 | spawned 4 offload threads for uWSGI worker 6
searxng-1 | spawned uWSGI worker 8 (pid: 33, cores: 4)
searxng-1 | spawned uWSGI worker 9 (pid: 40, cores: 4)
searxng-1 | spawned 4 offload threads for uWSGI worker 7
searxng-1 | spawned 4 offload threads for uWSGI worker 8
searxng-1 | spawned uWSGI worker 10 (pid: 44, cores: 4)
searxng-1 | spawned 4 offload threads for uWSGI worker 9
searxng-1 | spawned uWSGI worker 11 (pid: 48, cores: 4)
searxng-1 | spawned uWSGI worker 12 (pid: 49, cores: 4)
searxng-1 | spawned 4 offload threads for uWSGI worker 2
searxng-1 | spawned 4 offload threads for uWSGI worker 10
searxng-1 | spawned 4 offload threads for uWSGI worker 1
searxng-1 | spawned 4 offload threads for uWSGI worker 12
searxng-1 | spawned 4 offload threads for uWSGI worker 11
chromadb-1 | DEBUG: [05-04-2024 12:56:14] Registering provider: token_config
chromadb-1 | DEBUG: [05-04-2024 12:56:14] Registering provider: user_token_config
chromadb-1 | DEBUG: [05-04-2024 12:56:14] Registering provider: token
chromadb-1 | DEBUG: [05-04-2024 12:56:14] Registering provider: token
frontend-1 |
frontend-1 | > [email protected] preview
frontend-1 | > vite preview --host
frontend-1 |
searxng-1 | WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x7f71c61072d8 pid: 49 (default app)
searxng-1 | WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x7f71c61072d8 pid: 19 (default app)
searxng-1 | WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x7f71c61072d8 pid: 44 (default app)
searxng-1 | WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x7f71c61072d8 pid: 40 (default app)
searxng-1 | WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x7f71c61072d8 pid: 33 (default app)
searxng-1 | WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x7f71c61072d8 pid: 12 (default app)
searxng-1 | WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x7f71c61072d8 pid: 30 (default app)
searxng-1 | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7f71c61072d8 pid: 48 (default app)
searxng-1 | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7f71c61072d8 pid: 22 (default app)
searxng-1 | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7f71c61072d8 pid: 10 (default app)
searxng-1 | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7f71c61072d8 pid: 17 (default app)
searxng-1 | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7f71c61072d8 pid: 11 (default app)
chromadb-1 | WARNING: [05-04-2024 12:56:16] chroma_server_nofile is set to 65535, but this is less than current soft limit of 1048576. chroma_server_nofile will not be set.
chromadb-1 | INFO: [05-04-2024 12:56:16] Anonymized telemetry enabled. See https://docs.trychroma.com/telemetry for more information.
chromadb-1 | DEBUG: [05-04-2024 12:56:16] Starting component System
chromadb-1 | DEBUG: [05-04-2024 12:56:16] Starting component OpenTelemetryClient
chromadb-1 | DEBUG: [05-04-2024 12:56:16] Starting component SimpleAssignmentPolicy
chromadb-1 | DEBUG: [05-04-2024 12:56:16] Starting component SqliteDB
chromadb-1 | DEBUG: [05-04-2024 12:56:16] Starting component QuotaEnforcer
chromadb-1 | DEBUG: [05-04-2024 12:56:16] Starting component Posthog
chromadb-1 | DEBUG: [05-04-2024 12:56:16] Starting component LocalSegmentManager
chromadb-1 | DEBUG: [05-04-2024 12:56:16] Starting component SegmentAPI
chromadb-1 | INFO: [05-04-2024 12:56:16] Started server process [1]
chromadb-1 | INFO: [05-04-2024 12:56:16] Waiting for application startup.
chromadb-1 | INFO: [05-04-2024 12:56:16] Application startup complete.
chromadb-1 | INFO: [05-04-2024 12:56:16] Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
frontend-1 | โžœ Local: http://localhost:4173/
frontend-1 | โžœ Network: http://172.21.0.4:4173/
searxng-1 | 2024-04-05 12:56:18,903 ERROR:searx.engines.wikidata: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng-1 | raise TimeoutError()
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 774, in init
searxng-1 | jsonresponse = send_wikidata_query(query)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 161, in send_wikidata_query
searxng-1 | http_response = get(SPARQL_ENDPOINT_URL + '?' + urlencode({'query': query}), headers=get_headers())
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 97, in request
searxng-1 | raise httpx.TimeoutException('Timeout', request=None) from e
searxng-1 | httpx.TimeoutException: Timeout
searxng-1 | 2024-04-05 12:56:18,983 ERROR:searx.engines.wikidata: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng-1 | raise TimeoutError()
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 774, in init
searxng-1 | jsonresponse = send_wikidata_query(query)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 161, in send_wikidata_query
searxng-1 | http_response = get(SPARQL_ENDPOINT_URL + '?' + urlencode({'query': query}), headers=get_headers())
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 97, in request
searxng-1 | raise httpx.TimeoutException('Timeout', request=None) from e
searxng-1 | httpx.TimeoutException: Timeout
searxng-1 | 2024-04-05 12:56:19,006 ERROR:searx.engines.soundcloud: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/lib/python3.11/site-packages/anyio/streams/tls.py", line 140, in _call_sslobject_method
searxng-1 | result = func(*args)
searxng-1 | ^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/ssl.py", line 979, in do_handshake
searxng-1 | self._sslobj.do_handshake()
searxng-1 | ssl.SSLWantReadError: The operation did not complete (read) (_ssl.c:1006)
searxng-1 |
searxng-1 | During handling of the above exception, another exception occurred:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/lib/python3.11/site-packages/anyio/_core/_tasks.py", line 115, in fail_after
searxng-1 | yield cancel_scope
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_backends/anyio.py", line 69, in start_tls
searxng-1 | ssl_stream = await anyio.streams.tls.TLSStream.wrap(
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/anyio/streams/tls.py", line 132, in wrap
searxng-1 | await wrapper._call_sslobject_method(ssl_object.do_handshake)
searxng-1 | File "/usr/lib/python3.11/site-packages/anyio/streams/tls.py", line 147, in _call_sslobject_method
searxng-1 | data = await self.transport_stream.receive()
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/anyio/_backends/_asyncio.py", line 1133, in receive
searxng-1 | await self._protocol.read_event.wait()
searxng-1 | File "/usr/lib/python3.11/asyncio/locks.py", line 213, in wait
searxng-1 | await fut
searxng-1 | asyncio.exceptions.CancelledError: Cancelled by cancel scope 7f71c0fc9950
searxng-1 |
searxng-1 | During handling of the above exception, another exception occurred:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_exceptions.py", line 10, in map_exceptions
searxng-1 | yield
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_backends/anyio.py", line 78, in start_tls
searxng-1 | raise exc
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_backends/anyio.py", line 68, in start_tls
searxng-1 | with anyio.fail_after(timeout):
searxng-1 | File "/usr/lib/python3.11/contextlib.py", line 158, in exit
searxng-1 | self.gen.throw(typ, value, traceback)
searxng-1 | File "/usr/lib/python3.11/site-packages/anyio/_core/_tasks.py", line 118, in fail_after
searxng-1 | raise TimeoutError
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_transports/default.py", line 60, in map_httpcore_exceptions
searxng-1 | yield
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_transports/default.py", line 353, in handle_async_request
searxng-1 | resp = await self._pool.handle_async_request(req)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_async/connection_pool.py", line 262, in handle_async_request
searxng-1 | raise exc
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_async/connection_pool.py", line 245, in handle_async_request
searxng-1 | response = await connection.handle_async_request(request)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_async/connection.py", line 92, in handle_async_request
searxng-1 | raise exc
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_async/connection.py", line 69, in handle_async_request
searxng-1 | stream = await self._connect(request)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_async/connection.py", line 149, in _connect
searxng-1 | stream = await stream.start_tls(**kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_backends/anyio.py", line 66, in start_tls
searxng-1 | with map_exceptions(exc_map):
searxng-1 | File "/usr/lib/python3.11/contextlib.py", line 158, in exit
searxng-1 | self.gen.throw(typ, value, traceback)
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_exceptions.py", line 14, in map_exceptions
searxng-1 | raise to_exc(exc) from exc
searxng-1 | httpcore.ConnectTimeout
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/soundcloud.py", line 69, in init
searxng-1 | guest_client_id = get_client_id()
searxng-1 | ^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/soundcloud.py", line 45, in get_client_id
searxng-1 | resp = http_get("https://soundcloud.com")
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 456, in result
searxng-1 | return self.__get_result()
searxng-1 | ^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 401, in __get_result
searxng-1 | raise self._exception
searxng-1 | File "/usr/local/searxng/searx/network/network.py", line 289, in request
searxng-1 | return await self.call_client(False, method, url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/network.py", line 285, in call_client
searxng-1 | raise e
searxng-1 | File "/usr/local/searxng/searx/network/network.py", line 270, in call_client
searxng-1 | response = await client.request(method, url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_client.py", line 1530, in request
searxng-1 | return await self.send(request, auth=auth, follow_redirects=follow_redirects)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_client.py", line 1617, in send
searxng-1 | response = await self._send_handling_auth(
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_client.py", line 1645, in _send_handling_auth
searxng-1 | response = await self._send_handling_redirects(
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_client.py", line 1682, in _send_handling_redirects
searxng-1 | response = await self._send_single_request(request)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_client.py", line 1719, in _send_single_request
searxng-1 | response = await transport.handle_async_request(request)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_transports/default.py", line 352, in handle_async_request
searxng-1 | with map_httpcore_exceptions():
searxng-1 | File "/usr/lib/python3.11/contextlib.py", line 158, in exit
searxng-1 | self.gen.throw(typ, value, traceback)
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_transports/default.py", line 77, in map_httpcore_exceptions
searxng-1 | raise mapped_exc(message) from exc
searxng-1 | httpx.ConnectTimeout
searxng-1 | 2024-04-05 12:56:19,039 ERROR:searx.engines.soundcloud: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/lib/python3.11/site-packages/anyio/streams/tls.py", line 140, in _call_sslobject_method
searxng-1 | result = func(*args)
searxng-1 | ^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/ssl.py", line 979, in do_handshake
searxng-1 | self._sslobj.do_handshake()
searxng-1 | ssl.SSLWantReadError: The operation did not complete (read) (_ssl.c:1006)
searxng-1 |
searxng-1 | During handling of the above exception, another exception occurred:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/lib/python3.11/site-packages/anyio/_core/_tasks.py", line 115, in fail_after
searxng-1 | yield cancel_scope
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_backends/anyio.py", line 69, in start_tls
searxng-1 | ssl_stream = await anyio.streams.tls.TLSStream.wrap(
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/anyio/streams/tls.py", line 132, in wrap
searxng-1 | await wrapper._call_sslobject_method(ssl_object.do_handshake)
searxng-1 | File "/usr/lib/python3.11/site-packages/anyio/streams/tls.py", line 147, in _call_sslobject_method
searxng-1 | data = await self.transport_stream.receive()
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/anyio/_backends/_asyncio.py", line 1133, in receive
searxng-1 | await self._protocol.read_event.wait()
searxng-1 | File "/usr/lib/python3.11/asyncio/locks.py", line 213, in wait
searxng-1 | await fut
searxng-1 | asyncio.exceptions.CancelledError: Cancelled by cancel scope 7f71c0fc1790
searxng-1 |
searxng-1 | During handling of the above exception, another exception occurred:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_exceptions.py", line 10, in map_exceptions
searxng-1 | yield
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_backends/anyio.py", line 78, in start_tls
searxng-1 | raise exc
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_backends/anyio.py", line 68, in start_tls
searxng-1 | with anyio.fail_after(timeout):
searxng-1 | File "/usr/lib/python3.11/contextlib.py", line 158, in exit
searxng-1 | self.gen.throw(typ, value, traceback)
searxng-1 | File "/usr/lib/python3.11/site-packages/anyio/_core/_tasks.py", line 118, in fail_after
searxng-1 | raise TimeoutError
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_transports/default.py", line 60, in map_httpcore_exceptions
searxng-1 | yield
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_transports/default.py", line 353, in handle_async_request
searxng-1 | resp = await self._pool.handle_async_request(req)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_async/connection_pool.py", line 262, in handle_async_request
searxng-1 | raise exc
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_async/connection_pool.py", line 245, in handle_async_request
searxng-1 | response = await connection.handle_async_request(request)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_async/connection.py", line 92, in handle_async_request
searxng-1 | raise exc
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_async/connection.py", line 69, in handle_async_request
searxng-1 | stream = await self._connect(request)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_async/connection.py", line 149, in _connect
searxng-1 | stream = await stream.start_tls(**kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_backends/anyio.py", line 66, in start_tls
searxng-1 | with map_exceptions(exc_map):
searxng-1 | File "/usr/lib/python3.11/contextlib.py", line 158, in exit
searxng-1 | self.gen.throw(typ, value, traceback)
searxng-1 | File "/usr/lib/python3.11/site-packages/httpcore/_exceptions.py", line 14, in map_exceptions
searxng-1 | raise to_exc(exc) from exc
searxng-1 | httpcore.ConnectTimeout
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/soundcloud.py", line 69, in init
searxng-1 | guest_client_id = get_client_id()
searxng-1 | ^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/soundcloud.py", line 45, in get_client_id
searxng-1 | resp = http_get("https://soundcloud.com")
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 456, in result
searxng-1 | return self.__get_result()
searxng-1 | ^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 401, in __get_result
searxng-1 | raise self._exception
searxng-1 | File "/usr/local/searxng/searx/network/network.py", line 289, in request
searxng-1 | return await self.call_client(False, method, url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/network.py", line 285, in call_client
searxng-1 | raise e
searxng-1 | File "/usr/local/searxng/searx/network/network.py", line 270, in call_client
searxng-1 | response = await client.request(method, url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_client.py", line 1530, in request
searxng-1 | return await self.send(request, auth=auth, follow_redirects=follow_redirects)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_client.py", line 1617, in send
searxng-1 | response = await self._send_handling_auth(
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_client.py", line 1645, in _send_handling_auth
searxng-1 | response = await self._send_handling_redirects(
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_client.py", line 1682, in _send_handling_redirects
searxng-1 | response = await self._send_single_request(request)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_client.py", line 1719, in _send_single_request
searxng-1 | response = await transport.handle_async_request(request)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_transports/default.py", line 352, in handle_async_request
searxng-1 | with map_httpcore_exceptions():
searxng-1 | File "/usr/lib/python3.11/contextlib.py", line 158, in exit
searxng-1 | self.gen.throw(typ, value, traceback)
searxng-1 | File "/usr/lib/python3.11/site-packages/httpx/_transports/default.py", line 77, in map_httpcore_exceptions
searxng-1 | raise mapped_exc(message) from exc
searxng-1 | httpx.ConnectTimeout
searxng-1 | 2024-04-05 12:56:19,061 ERROR:searx.engines.wikidata: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng-1 | raise TimeoutError()
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 774, in init
searxng-1 | jsonresponse = send_wikidata_query(query)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 161, in send_wikidata_query
searxng-1 | http_response = get(SPARQL_ENDPOINT_URL + '?' + urlencode({'query': query}), headers=get_headers())
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 97, in request
searxng-1 | raise httpx.TimeoutException('Timeout', request=None) from e
searxng-1 | httpx.TimeoutException: Timeout
searxng-1 | 2024-04-05 12:56:19,091 ERROR:searx.engines.wikidata: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng-1 | raise TimeoutError()
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 774, in init
searxng-1 | jsonresponse = send_wikidata_query(query)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 161, in send_wikidata_query
searxng-1 | http_response = get(SPARQL_ENDPOINT_URL + '?' + urlencode({'query': query}), headers=get_headers())
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 97, in request
searxng-1 | raise httpx.TimeoutException('Timeout', request=None) from e
searxng-1 | httpx.TimeoutException: Timeout
searxng-1 | 2024-04-05 12:56:19,109 ERROR:searx.engines.wikidata: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng-1 | raise TimeoutError()
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 774, in init
searxng-1 | jsonresponse = send_wikidata_query(query)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 161, in send_wikidata_query
searxng-1 | http_response = get(SPARQL_ENDPOINT_URL + '?' + urlencode({'query': query}), headers=get_headers())
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 97, in request
searxng-1 | raise httpx.TimeoutException('Timeout', request=None) from e
searxng-1 | httpx.TimeoutException: Timeout
searxng-1 | 2024-04-05 12:56:19,108 ERROR:searx.engines.wikidata: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng-1 | raise TimeoutError()
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 774, in init
searxng-1 | jsonresponse = send_wikidata_query(query)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 161, in send_wikidata_query
searxng-1 | http_response = get(SPARQL_ENDPOINT_URL + '?' + urlencode({'query': query}), headers=get_headers())
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 97, in request
searxng-1 | raise httpx.TimeoutException('Timeout', request=None) from e
searxng-1 | httpx.TimeoutException: Timeout
searxng-1 | 2024-04-05 12:56:19,146 ERROR:searx.engines.wikidata: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng-1 | raise TimeoutError()
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 774, in init
searxng-1 | jsonresponse = send_wikidata_query(query)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 161, in send_wikidata_query
searxng-1 | http_response = get(SPARQL_ENDPOINT_URL + '?' + urlencode({'query': query}), headers=get_headers())
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 97, in request
searxng-1 | raise httpx.TimeoutException('Timeout', request=None) from e
searxng-1 | httpx.TimeoutException: Timeout
searxng-1 | 2024-04-05 12:56:19,147 ERROR:searx.engines.wikidata: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng-1 | raise TimeoutError()
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 774, in init
searxng-1 | jsonresponse = send_wikidata_query(query)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 161, in send_wikidata_query
searxng-1 | http_response = get(SPARQL_ENDPOINT_URL + '?' + urlencode({'query': query}), headers=get_headers())
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 97, in request
searxng-1 | raise httpx.TimeoutException('Timeout', request=None) from e
searxng-1 | httpx.TimeoutException: Timeout
searxng-1 | 2024-04-05 12:56:19,169 ERROR:searx.engines.soundcloud: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng-1 | raise TimeoutError()
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/soundcloud.py", line 69, in init
searxng-1 | guest_client_id = get_client_id()
searxng-1 | ^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/soundcloud.py", line 45, in get_client_id
searxng-1 | resp = http_get("https://soundcloud.com")
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 97, in request
searxng-1 | raise httpx.TimeoutException('Timeout', request=None) from e
searxng-1 | httpx.TimeoutException: Timeout
searxng-1 | 2024-04-05 12:56:19,180 ERROR:searx.engines.wikidata: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng-1 | raise TimeoutError()
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 774, in init
searxng-1 | jsonresponse = send_wikidata_query(query)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 161, in send_wikidata_query
searxng-1 | http_response = get(SPARQL_ENDPOINT_URL + '?' + urlencode({'query': query}), headers=get_headers())
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 97, in request
searxng-1 | raise httpx.TimeoutException('Timeout', request=None) from e
searxng-1 | httpx.TimeoutException: Timeout
searxng-1 | 2024-04-05 12:56:19,269 ERROR:searx.engines.wikidata: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng-1 | raise TimeoutError()
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 774, in init
searxng-1 | jsonresponse = send_wikidata_query(query)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 161, in send_wikidata_query
searxng-1 | http_response = get(SPARQL_ENDPOINT_URL + '?' + urlencode({'query': query}), headers=get_headers())
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 97, in request
searxng-1 | raise httpx.TimeoutException('Timeout', request=None) from e
searxng-1 | httpx.TimeoutException: Timeout
searxng-1 | 2024-04-05 12:56:19,276 ERROR:searx.engines.soundcloud: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng-1 | raise TimeoutError()
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/soundcloud.py", line 69, in init
searxng-1 | guest_client_id = get_client_id()
searxng-1 | ^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/soundcloud.py", line 57, in get_client_id
searxng-1 | resp = http_get(app_js_url)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 97, in request
searxng-1 | raise httpx.TimeoutException('Timeout', request=None) from e
searxng-1 | httpx.TimeoutException: Timeout
searxng-1 | 2024-04-05 12:56:19,295 ERROR:searx.engines.wikidata: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng-1 | raise TimeoutError()
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 774, in init
searxng-1 | jsonresponse = send_wikidata_query(query)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 161, in send_wikidata_query
searxng-1 | http_response = get(SPARQL_ENDPOINT_URL + '?' + urlencode({'query': query}), headers=get_headers())
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 97, in request
searxng-1 | raise httpx.TimeoutException('Timeout', request=None) from e
searxng-1 | httpx.TimeoutException: Timeout
searxng-1 | 2024-04-05 12:56:19,341 ERROR:searx.engines.wikidata: Fail to initialize
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 95, in request
searxng-1 | return future.result(timeout)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/lib/python3.11/concurrent/futures/_base.py", line 458, in result
searxng-1 | raise TimeoutError()
searxng-1 | TimeoutError
searxng-1 |
searxng-1 | The above exception was the direct cause of the following exception:
searxng-1 |
searxng-1 | Traceback (most recent call last):
searxng-1 | File "/usr/local/searxng/searx/search/processors/abstract.py", line 73, in initialize
searxng-1 | self.engine.init(get_engine_from_settings(self.engine_name))
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 774, in init
searxng-1 | jsonresponse = send_wikidata_query(query)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/engines/wikidata.py", line 161, in send_wikidata_query
searxng-1 | http_response = get(SPARQL_ENDPOINT_URL + '?' + urlencode({'query': query}), headers=get_headers())
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 164, in get
searxng-1 | return request('get', url, **kwargs)
searxng-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
searxng-1 | File "/usr/local/searxng/searx/network/init.py", line 97, in request
searxng-1 | raise httpx.TimeoutException('Timeout', request=None) from e
searxng-1 | httpx.TimeoutException: Timeout

(2) browser.

image

Exiting chain with error: Get "http://searxng:8080/?q=LLocalSearch&format=json": dial tcp: lookup searxng on 127.0.0.11 lookup searxng on 53: no such host.

    • expected behavior * *.

How to solve the above problems, online and so on.

Error logs generated while running a request

Describe the bug
I get a bunch of error messages while processing the requests like

backend-1   | 2024/04/05 10:25:52 Error adding document: error adding document: Post "http://host.docker.internal:11434/api/embeddings": context deadline exceeded
backend-1   | 2024/04/05 10:25:52 error from evaluator: Error adding document: error adding document: Post "http://host.docker.internal:11434/api/embeddings": context deadline exceeded
backend-1   | 2024/04/05 10:25:52 Error adding document: error adding document: Post "http://host.docker.internal:11434/api/embeddings": context deadline exceeded
backend-1   | 2024/04/05 10:25:52 error from evaluator: Error adding document: error adding document: Post "http://host.docker.internal:11434/api/embeddings": context deadline exceeded
backend-1   | 2024/04/05 10:25:52 Error adding document: error adding document: Post "http://chromadb:8000/api/v1/collections/23c6026d-4ded-4fdd-8741-8f9541dfeebd/add": context deadline exceeded
backend-1   | 2024/04/05 10:25:52 error from evaluator: Error adding document: error adding document: Post "http://chromadb:8000/api/v1/collections/23c6026d-4ded-4fdd-8741-8f9541dfeebd/add": context deadline exceeded
backend-1   | 2024/04/05 10:25:52 Error adding document: error adding document: Post "http://host.docker.internal:11434/api/embeddings": context deadline exceeded
backend-1   | 2024/04/05 10:25:52 error from evaluator: Error adding document: error adding document: Post "http://host.docker.internal:11434/api/embeddings": context deadline exceeded
backend-1   | 2024/04/05 10:25:52 Error adding document: error adding document: Post "http://host.docker.internal:11434/api/embeddings": context deadline exceeded
backend-1   | 2024/04/05 10:25:52 error from evaluator: Error adding document: error adding document: Post "http://host.docker.internal:11434/api/embeddings": context deadline exceeded
backend-1   | 2024/04/05 10:25:52 Error adding document: error adding document: Post "http://host.docker.internal:11434/api/embeddings": context deadline exceeded
backend-1   | 2024/04/05 10:25:52 error from evaluator: Error adding document: error adding document: Post "http://host.docker.internal:11434/api/embeddings": context deadline exceeded
backend-1   | 2024/04/05 10:25:52 Error adding document: error adding document: Post "http://host.docker.internal:11434/api/embeddings": context deadline exceeded
backend-1   | 2024/04/05 10:25:52 error from evaluator: Error adding document: error adding document: Post "http://host.docker.internal:11434/api/embeddings": context deadline exceeded
backend-1   | 2024/04/05 10:25:53 Error adding document: error adding document: Post "http://host.docker.internal:11434/api/embeddings": context deadline exceeded
backend-1   | 2024/04/05 10:25:53 error from evaluator: Error adding document: error adding document: Post "http://host.docker.internal:11434/api/embeddings": context deadline exceeded

To Reproduce
Steps to reproduce the behavior:

  1. Start LLSearch via docker and give a request
  2. Watch the request logs in the command prompt
  3. UI is updated with proper response

Additional context
Not sure if there is actually a problem here but just wanted to report the logs

[Feature Request] Podman support

I tried to start this with podman compose up and got several errors like the following:

Error: short-name "nilsherzig/llocalsearch-backend:latest" did not resolve to an alias and no unqualified-search registries are defined in "/etc/containers/registries.conf"

I think this can be resolved by explicitly including the host in the container URLs?

I know you're using docker, but it would be nice if podman was supported as well.

Windows Docker Setup: Connection to Ollama "dial tcp 127.0.0.1:11434: connect: connection refused"

Describe the bug
I'm using Docker Desktop on Windows 11 and followed the instructions in the Readme for the Docker Setup. I'm running Ollama native on Windows.

Docker compose log:

docker-compose up
[+] Running 5/5
 โœ” Container llocalsearch-redis-1     Created                                                                      0.0s
 โœ” Container llocalsearch-chromadb-1  Created                                                                      0.0s
 โœ” Container llocalsearch-searxng-1   Created                                                                      0.0s
 โœ” Container llocalsearch-backend-1   Recreated                                                                    0.1s
 โœ” Container llocalsearch-frontend-1  Recreated                                                                    0.1s
Attaching to backend-1, chromadb-1, frontend-1, redis-1, searxng-1
chromadb-1  | Starting 'uvicorn chromadb.app:app' with args: --workers 1 --host 0.0.0.0 --port 8000 --proxy-headers --log-config chromadb/log_config.yml --timeout-keep-alive 30
backend-1   | Server started at http://localhost:8080
backend-1   | 2024/04/04 11:57:02 INFO Starting the server
searxng-1   | SearXNG version 2024.3.29+f5bb64cca
searxng-1   | Use existing /etc/searxng/uwsgi.ini
searxng-1   | Use existing /etc/searxng/settings.yml
searxng-1   | Listen on 0.0.0.0:8080
searxng-1   | [uWSGI] getting INI configuration from /etc/searxng/uwsgi.ini
searxng-1   | [uwsgi-static] added mapping for /static => /usr/local/searxng/searx/static
searxng-1   | *** Starting uWSGI 2.0.23 (64bit) on [Thu Apr  4 11:57:02 2024] ***
searxng-1   | compiled with version: 13.2.1 20231014 on 30 November 2023 14:34:33
searxng-1   | os: Linux-5.15.146.1-microsoft-standard-WSL2 #1 SMP Thu Jan 11 04:09:03 UTC 2024
searxng-1   | nodename: 80f67ff16773
searxng-1   | machine: x86_64
searxng-1   | clock source: unix
searxng-1   | pcre jit disabled
searxng-1   | detected number of CPU cores: 12
searxng-1   | current working directory: /usr/local/searxng
searxng-1   | detected binary path: /usr/sbin/uwsgi
searxng-1   | chdir() to /usr/local/searxng/searx/
searxng-1   | your memory page size is 4096 bytes
searxng-1   | detected max file descriptor number: 1048576
searxng-1   | building mime-types dictionary from file /etc/mime.types...1390 entry found
searxng-1   | lock engine: pthread robust mutexes
searxng-1   | thunder lock: disabled (you can enable it with --thunder-lock)
searxng-1   | uwsgi socket 0 bound to TCP address 0.0.0.0:8080 fd 3
searxng-1   | Python version: 3.11.8 (main, Feb 19 2024, 17:01:17) [GCC 13.2.1 20231014]
searxng-1   | Python main interpreter initialized at 0x7fd776bd92d8
searxng-1   | python threads support enabled
searxng-1   | your server socket listen backlog is limited to 100 connections
searxng-1   | your mercy for graceful operations on workers is 60 seconds
searxng-1   | mapped 1568736 bytes (1531 KB) for 48 cores
searxng-1   | *** Operational MODE: preforking+threaded ***
searxng-1   | added /usr/local/searxng/ to pythonpath.
searxng-1   | spawned uWSGI master process (pid: 7)
searxng-1   | spawned uWSGI worker 1 (pid: 10, cores: 4)
searxng-1   | spawned uWSGI worker 2 (pid: 13, cores: 4)
searxng-1   | spawned 4 offload threads for uWSGI worker 1
searxng-1   | spawned 4 offload threads for uWSGI worker 2
searxng-1   | spawned uWSGI worker 3 (pid: 20, cores: 4)
searxng-1   | spawned 4 offload threads for uWSGI worker 3
searxng-1   | spawned uWSGI worker 4 (pid: 25, cores: 4)
searxng-1   | spawned 4 offload threads for uWSGI worker 4
searxng-1   | spawned uWSGI worker 5 (pid: 30, cores: 4)
searxng-1   | spawned 4 offload threads for uWSGI worker 5
searxng-1   | spawned uWSGI worker 6 (pid: 35, cores: 4)
chromadb-1  | DEBUG:    [04-04-2024 11:57:02] Registering provider: token_config
chromadb-1  | DEBUG:    [04-04-2024 11:57:02] Registering provider: user_token_config
searxng-1   | spawned 4 offload threads for uWSGI worker 6
chromadb-1  | DEBUG:    [04-04-2024 11:57:02] Registering provider: token
searxng-1   | spawned uWSGI worker 7 (pid: 40, cores: 4)
chromadb-1  | DEBUG:    [04-04-2024 11:57:02] Registering provider: token
searxng-1   | spawned uWSGI worker 8 (pid: 42, cores: 4)
searxng-1   | spawned 4 offload threads for uWSGI worker 8
searxng-1   | spawned 4 offload threads for uWSGI worker 7
searxng-1   | spawned uWSGI worker 9 (pid: 50, cores: 4)
searxng-1   | spawned uWSGI worker 10 (pid: 51, cores: 4)
searxng-1   | spawned 4 offload threads for uWSGI worker 9
searxng-1   | spawned uWSGI worker 11 (pid: 56, cores: 4)
searxng-1   | spawned uWSGI worker 12 (pid: 58, cores: 4)
searxng-1   | spawned 4 offload threads for uWSGI worker 12
searxng-1   | spawned 4 offload threads for uWSGI worker 10
searxng-1   | spawned 4 offload threads for uWSGI worker 11
frontend-1  |
frontend-1  | > [email protected] preview
frontend-1  | > vite preview --host
frontend-1  |
chromadb-1  | WARNING:  [04-04-2024 11:57:03] chroma_server_nofile is set to 65535, but this is less than current soft limit of 1048576. chroma_server_nofile will not be set.
chromadb-1  | INFO:     [04-04-2024 11:57:04] Anonymized telemetry enabled. See                     https://docs.trychroma.com/telemetry for more information.
chromadb-1  | DEBUG:    [04-04-2024 11:57:04] Starting component System
chromadb-1  | DEBUG:    [04-04-2024 11:57:04] Starting component OpenTelemetryClient
chromadb-1  | DEBUG:    [04-04-2024 11:57:04] Starting component SimpleAssignmentPolicy
chromadb-1  | DEBUG:    [04-04-2024 11:57:04] Starting component SqliteDB
chromadb-1  | DEBUG:    [04-04-2024 11:57:04] Starting component QuotaEnforcer
chromadb-1  | DEBUG:    [04-04-2024 11:57:04] Starting component Posthog
chromadb-1  | DEBUG:    [04-04-2024 11:57:04] Starting component LocalSegmentManager
chromadb-1  | DEBUG:    [04-04-2024 11:57:04] Starting component SegmentAPI
searxng-1   | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7fd776bd92d8 pid: 30 (default app)
chromadb-1  | INFO:     [04-04-2024 11:57:04] Started server process [1]
chromadb-1  | INFO:     [04-04-2024 11:57:04] Waiting for application startup.
chromadb-1  | INFO:     [04-04-2024 11:57:04] Application startup complete.
chromadb-1  | INFO:     [04-04-2024 11:57:04] Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
searxng-1   | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7fd776bd92d8 pid: 58 (default app)
searxng-1   | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7fd776bd92d8 pid: 13 (default app)
searxng-1   | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7fd776bd92d8 pid: 40 (default app)
searxng-1   | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7fd776bd92d8 pid: 20 (default app)
searxng-1   | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7fd776bd92d8 pid: 42 (default app)
searxng-1   | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7fd776bd92d8 pid: 35 (default app)
searxng-1   | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7fd776bd92d8 pid: 51 (default app)
searxng-1   | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7fd776bd92d8 pid: 10 (default app)
searxng-1   | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7fd776bd92d8 pid: 56 (default app)
searxng-1   | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7fd776bd92d8 pid: 50 (default app)
searxng-1   | WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x7fd776bd92d8 pid: 25 (default app)
frontend-1  |   โžœ  Local:   http://localhost:4173/
frontend-1  |   โžœ  Network: http://172.18.0.5:4173/
backend-1   | 2024/04/04 11:57:10 WARN Model does not exist, pulling it model=all-minilm:v2
backend-1   | 2024/04/04 11:57:10 ERROR Model does not exist and could not be pulled model=all-minilm:v2 error="Post \"http://localhost:11434/api/pull\": dial tcp 127.0.0.1:11434: connect: connection refused"

I've changed my docker-compose.yaml to localhost for Ollama.

services:
  backend:
    image: nilsherzig/llocalsearch-backend:latest
    environment:
      # the ip / url of YOUR Ollama server
      # CHANGE THIS
      - OLLAMA_HOST=http://localhost:11434

When I visit the http://localhost:11434/ URL in my browser, the Ollama endpoint comes up. So it seems like the communication between Docker and Ollama isn't working.

How can I resolve that?

Invalid SSL Certificate Error for Searxng

Hi there,
I tried the docker image and configured the Ollama host correctly and the agent part seems to be working, but the logs return errors related to the searxng ssl connection (that fails to verify the ssl certificates). I tried to add a
REQUESTS_CA_BUNDLE environment variable in the docker compose yaml file (together with the attached volume file) to pass the my environment's ca-certificates.crt file, but it does not seem to resolve the issue.
ANy pointer on how to solve this issue?
Thanks!

local file search

Is your feature request related to a problem? Please describe.
Not all my files are public

Describe the solution you'd like
Adding one or more folders to the backend (or uploading files) should result in them being present in the vector db.

If a local folder is mounted, file changes should be monitored and the vector db should be updated accordingly.

Describe alternatives you've considered
None

Additional context
I already got it working for markdown, adding csv and pdf now

error connecting to the searxng container

Describe the bug
When I run a search it errors when trying to connect to the searxng container.

To Reproduce
Steps to reproduce the behavior:

  1. git clone https://github.com/nilsherzig/LLocalSearch
  2. podman-compose up
  3. navigate to http://localhost:3000/ in the browser
  4. click a default search

Expected behavior
Connect to the searxng container and get search results

Console

2024/04/05 21:46:37 Error making the request: Get "http://searxng:8080/?q=average+weight+of+a+llama&format=json": dial tcp 10.89.5.62:8080: i/o timeout
[backend]  | Exiting chain with error: Get "http://searxng:8080/?q=average+weight+of+a+llama&format=json": dial tcp 10.89.5.62:8080: i/o timeout

Additional context
I'm on the most recent changes ie I just did a git pull and podman-compose pull

Thank you for the help

Fine-tune mode

Accepts a list of LLMs / settings and basically does table testing with them. Uses user input to vote on the results. Used to find good configurations by brute force.

Maybe crowd source this, since it will take hours / days to run.

feat: implement a working menu

Settings like #2 should be hidden behind a settings menu to avoid cluttering the main UI.

Something like the settings popup from claude?
image

Please add your ideas - infrastructure planing thread

Please comment if you have any thoughts on this:

We have a "chat layer" which has a history of the user's prompts and messages (green and purple). If needed, this chat chain can call other chains, which run autonomous without user interaction by using a self critique loop.

It would be very easy to add more chains to this, like a "programming chain" using deepseek-coder as the LLM.

I would have to come up with a config format for these chains, but essentially they are just a couple of conditions and strings in / strings out.

infra drawio

Redis docker: remove chown necessity?

Hello, I run all my dockers in UNRAID, and the redis container forcing a chown command is preventing it from starting because UNRAID doesn't allow the use of chown or chmod, permissions are handled automatically or ahead, not by containers.

image
image

Note: this doesn't prevent the app from starting though.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.