From bf5c2efa994cb634d351a4164577712bae80909a Mon Sep 17 00:00:00 2001 From: rajakumar05032000 Date: Sun, 31 Mar 2024 15:19:29 +0530 Subject: [PATCH 01/43] Fix - optimized UI dockerfile and removed unnecessary index.html file --- app.dockerfile | 37 ++++++++++++++++++------------------- ui/package.json | 2 ++ ui/static/index.html | 13 ------------- ui/svelte.config.js | 3 ++- 4 files changed, 22 insertions(+), 33 deletions(-) delete mode 100644 ui/static/index.html diff --git a/app.dockerfile b/app.dockerfile index 67a99764..6f7bfb68 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -1,29 +1,28 @@ -FROM debian:12 +# Pulling stage 1 image, keep alias as layer1 +FROM node:latest as layer1 -# setting up build variable +# Setting necessary arguments ARG VITE_API_BASE_URL ENV VITE_API_BASE_URL=${VITE_API_BASE_URL} -# setting up os env -USER root +# Copy UI source code +copy ui /home/nonroot/client + +# Change Work directory WORKDIR /home/nonroot/client -RUN groupadd -r nonroot && useradd -r -g nonroot -d /home/nonroot/client -s /bin/bash nonroot -# install node js -RUN apt-get update && apt-get upgrade -RUN apt-get install -y build-essential software-properties-common curl sudo wget git -RUN curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - -RUN apt-get install nodejs +# Building APP bundle +RUN npm run build -# copying devika app client only -COPY ui /home/nonroot/client/ui -COPY src /home/nonroot/client/src -COPY config.toml /home/nonroot/client/ +# Pulling stage 2 image, to significantly reduce image size +FROM gcr.io/distroless/nodejs20-debian11 -RUN cd ui && npm install && npm install -g npm && npm install -g bun -RUN chown -R nonroot:nonroot /home/nonroot/client +# Copy build files from layer 1 +COPY --from=layer1 /home/nonroot/client/build /app +COPY --from=layer1 /home/nonroot/client/package.json /app -USER nonroot -WORKDIR /home/nonroot/client/ui +# Change Work directory +WORKDIR /app -ENTRYPOINT [ "npx", "bun", "run", "dev", "--", "--host" ] \ No newline at end of file +# RUN APP +CMD ["index.js"] \ No newline at end of file diff --git a/ui/package.json b/ui/package.json index 7171132f..0fbd3ae1 100644 --- a/ui/package.json +++ b/ui/package.json @@ -20,6 +20,8 @@ }, "type": "module", "dependencies": { + "@sveltejs/adapter-node": "^5.0.1", + "@sveltejs/adapter-static": "^3.0.1", "clsx": "^2.1.0", "xterm": "^5.3.0", "xterm-addon-fit": "^0.8.0" diff --git a/ui/static/index.html b/ui/static/index.html deleted file mode 100644 index 2e43b702..00000000 --- a/ui/static/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Devika AI - - - - -
- - \ No newline at end of file diff --git a/ui/svelte.config.js b/ui/svelte.config.js index 4df404aa..5e4d0abc 100644 --- a/ui/svelte.config.js +++ b/ui/svelte.config.js @@ -1,5 +1,6 @@ +import adapter from "@sveltejs/adapter-node"; import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; -import adapter from "@sveltejs/adapter-auto"; + /** @type {import('@sveltejs/kit').Config} */ const config = { From 4c0512685e7a94ec39d6fa883cd0d4e0510dea40 Mon Sep 17 00:00:00 2001 From: rajakumar05032000 Date: Sun, 31 Mar 2024 15:45:10 +0530 Subject: [PATCH 02/43] Fix - Added npm install --- app.dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/app.dockerfile b/app.dockerfile index 6f7bfb68..8b5817ac 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -11,6 +11,7 @@ copy ui /home/nonroot/client # Change Work directory WORKDIR /home/nonroot/client +RUN npm install # Building APP bundle RUN npm run build From cfff71391f422defb9add054e2263f34045a1736 Mon Sep 17 00:00:00 2001 From: Md Zuhair <62602902+obliviousz@users.noreply.github.com> Date: Sun, 14 Apr 2024 16:13:49 +0530 Subject: [PATCH 03/43] Update prompt.jinja2 with an example for more consistent format reply Changed the prompt by giving an example for more consistent replies as sometimes the plan doesn't show up. Issue: https://github.com/stitionai/devika/issues/429 --- src/agents/planner/prompt.jinja2 | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/agents/planner/prompt.jinja2 b/src/agents/planner/prompt.jinja2 index 31d26839..8c38aa94 100644 --- a/src/agents/planner/prompt.jinja2 +++ b/src/agents/planner/prompt.jinja2 @@ -22,9 +22,23 @@ Plan: Summary: ``` +For example, consider a project about user registration system, then this would be the exact output(not even change of lowercase and uppercase of Project Name or Plan or Summary, etc). +``` +Project Name: User Registration System + +Your Reply to the Human Prompter: I've broken down the steps to build a basic user registration page with a database that stores user data. Let's get started! + +Current Focus: Establish the database to store user information. + +Plan: +- [ ] Step 1: Create a database using MySQL or PostgreSQL. +- [ ] Step 2: Design a table with columns for user information, such as name, email, password, and other relevant fields. + +Summary: This plan focuses on setting up the database to store user data securely and efficiently. By following these steps, you'll have a solid foundation for your user registration system. +``` Each step should be a clear, concise description of a specific task or action required. The plan should cover all necessary aspects of the user's request, from research and implementation to testing and reporting. -Write the plan with knowing that you have access to the browser and search engine to accomplish the task. +Write the plan knowing that you have access to the browser and search engine to accomplish the task. After listing the steps, provide a brief summary of the plan, highlighting any key considerations, dependencies, or potential challenges. @@ -33,4 +47,4 @@ Remember to tailor the plan to the specific task requested by the user, and prov if the task is simple, and you think you can do it without other assistance, just give one or simple two steps to accomplish the task. don't need to overcomplicate if it's not necessary. -Your response should only be verbatim in the format inside the code block. Any other response format will be rejected. \ No newline at end of file +Your response should only be verbatim in the format inside the code block. Any other response format will be rejected. From 8c3a963bf78bd8055f2e8df4266d684ae314d68d Mon Sep 17 00:00:00 2001 From: Dmitry Vasilev Date: Thu, 18 Apr 2024 19:56:12 +0700 Subject: [PATCH 04/43] Fix agent_state codestyle --- devika.py | 24 ++++++++++++------------ src/llm/llm.py | 6 +++--- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/devika.py b/devika.py index bf97df62..69c91169 100644 --- a/devika.py +++ b/devika.py @@ -42,7 +42,7 @@ os.environ["TOKENIZERS_PARALLELISM"] = "false" manager = ProjectManager() -AgentState = AgentState() +agent_state = AgentState() config = Config() logger = Logger() @@ -88,7 +88,7 @@ def handle_message(data): new_message['from_devika'] = False manager.add_message_from_user(project_name, new_message['message']) - if AgentState.is_agent_completed(project_name): + if agent_state.is_agent_completed(project_name): thread = Thread(target=lambda: agent.subsequent_execute(message, project_name)) thread.start() @@ -102,7 +102,7 @@ def handle_message(data): def is_agent_active(): data = request.json project_name = data.get("project_name") - is_active = AgentState.is_agent_active(project_name) + is_active = agent_state.is_agent_active(project_name) return jsonify({"is_active": is_active}) @@ -111,8 +111,8 @@ def is_agent_active(): def get_agent_state(): data = request.json project_name = data.get("project_name") - agent_state = AgentState.get_latest_state(project_name) - return jsonify({"state": agent_state}) + latest_state = agent_state.get_latest_state(project_name) + return jsonify({"state": latest_state}) @app.route("/api/get-browser-snapshot", methods=["GET"]) @@ -126,11 +126,11 @@ def browser_snapshot(): @route_logger(logger) def get_browser_session(): project_name = request.args.get("project_name") - agent_state = AgentState.get_latest_state(project_name) - if not agent_state: + latest_state = agent_state.get_latest_state(project_name) + if not latest_state: return jsonify({"session": None}) else: - browser_session = agent_state["browser_session"] + browser_session = latest_state["browser_session"] return jsonify({"session": browser_session}) @@ -138,11 +138,11 @@ def get_browser_session(): @route_logger(logger) def get_terminal_session(): project_name = request.args.get("project_name") - agent_state = AgentState.get_latest_state(project_name) - if not agent_state: + latest_state = agent_state.get_latest_state(project_name) + if not latest_state: return jsonify({"terminal_state": None}) else: - terminal_state = agent_state["terminal_session"] + terminal_state = latest_state["terminal_session"] return jsonify({"terminal_state": terminal_state}) @@ -169,7 +169,7 @@ def calculate_tokens(): @route_logger(logger) def token_usage(): project_name = request.args.get("project_name") - token_count = AgentState.get_latest_token_usage(project_name) + token_count = agent_state.get_latest_token_usage(project_name) return jsonify({"token_usage": token_count}) diff --git a/src/llm/llm.py b/src/llm/llm.py index f040c38f..c3b44c1f 100644 --- a/src/llm/llm.py +++ b/src/llm/llm.py @@ -18,7 +18,7 @@ ollama = Ollama() logger = Logger() -agentState = AgentState() +agent_state = AgentState() class LLM: @@ -69,9 +69,9 @@ def model_id_to_enum_mapping(self) -> dict: @staticmethod def update_global_token_usage(string: str, project_name: str): token_usage = len(TIKTOKEN_ENC.encode(string)) - agentState.update_token_usage(project_name, token_usage) + agent_state.update_token_usage(project_name, token_usage) - total = agentState.get_latest_token_usage(project_name) + token_usage + total = agent_state.get_latest_token_usage(project_name) + token_usage emit_agent("tokens", {"token_usage": total}) def inference(self, prompt: str, project_name: str) -> str: From 1f3fae92d64f62eda3385b9b06cae832951fef00 Mon Sep 17 00:00:00 2001 From: kgott Date: Fri, 17 May 2024 09:36:41 +0700 Subject: [PATCH 05/43] Strip backquote from generated filenames Fixes https://github.com/stitionai/devika/issues/566 --- src/agents/coder/coder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/agents/coder/coder.py b/src/agents/coder/coder.py index 3e021d61..a396d7df 100644 --- a/src/agents/coder/coder.py +++ b/src/agents/coder/coder.py @@ -52,7 +52,7 @@ def validate_response(self, response: str) -> Union[List[Dict[str, str]], bool]: if line.startswith("File: "): if current_file and current_code: result.append({"file": current_file, "code": "\n".join(current_code)}) - current_file = line.split(":")[1].strip() + current_file = line.split(":")[1].replace("`", "").strip() current_code = [] code_block = False elif line.startswith("```"): From 75f4889f1633402e079ad5512ef9e16569e09bbf Mon Sep 17 00:00:00 2001 From: Anurag sikdar <90986145+shvynu@users.noreply.github.com> Date: Tue, 27 Aug 2024 09:31:48 +0530 Subject: [PATCH 06/43] search_engine.md --- docs/Installation/search_engine.md | 72 +++++++++++++++++++----------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/docs/Installation/search_engine.md b/docs/Installation/search_engine.md index 0334457d..62f07993 100644 --- a/docs/Installation/search_engine.md +++ b/docs/Installation/search_engine.md @@ -1,33 +1,53 @@ -# search Engine setup +# Search Engine Setup for Devika -To use the search engine capabilities of Devika, you need to set up the search engine API keys. Currently, Devika supports Bing, Google and DuckDuckGo search engines. If you want to use duckduckgo, you don't need to set up any API keys. +Devika supports three search engines: **Bing**, **Google**, and **DuckDuckGo**. While **DuckDuckGo** does not require any API keys, **Bing** and **Google** do. Follow the steps below to set up the API keys for Bing and Google. -For Bing and Google search engines, you need to set up the API keys. Here's how you can do it: +## 1. Bing Search API Setup -## Bing Search API -- Create Azure account. You can create a free account [here](https://azure.microsoft.com/en-us/free/). -- Go to the [Bing Search API](https://www.microsoft.com/en-us/bing/apis/bing-web-search-api) website. -- click on the `Try now` button. -- Sign in/sign up with your Azure account. -- Create a new resource group (if you don't have any). -![alt text](images/bing.png) -- click on the `Review and create` button. -- if everything is fine, click on the `Create` button. +### Step 1: Create an Azure Account +- Visit the [Azure website](https://azure.microsoft.com/en-us/free/) and create a free account. + +### Step 2: Access the Bing Search API +- Go to the [Bing Search API](https://www.microsoft.com/en-us/bing/apis/bing-web-search-api) page. +- Click on the `Try now` button. +- Sign in or sign up using your Azure account. + +### Step 3: Create a Resource Group +- If you don't have a resource group, create one during the setup process. + +### Step 4: Create a Bing Search API Resource +- Fill in the necessary details for your Bing Search API resource. +- Click on the `Review and create` button. +- If everything is correct, click on the `Create` button. + +### Step 5: Retrieve Your API Keys and Endpoint - Once the resource is created, go to the `Keys and Endpoint` tab. -![alt text](images/bing-1.png) -- Copy either `Key1` or `Key2` and paste it into the `API_KEYS` field with the name `BING` in the `config.toml` file located in the root directory of Devika, or you can set it via the UI. +- ![Keys and Endpoint](images/bing-1.png) +- Copy either `Key1` or `Key2`. +- Paste the key into the `API_KEYS` field with the name `BING` in the `config.toml` file located in the root directory of Devika, or you can set it via the UI. - Copy the `Endpoint` and paste it into the `API_Endpoints` field with the name `BING` in the `config.toml` file located in the root directory of Devika, or you can set it via the UI. +## 2. Google Search API Setup + +### Step 1: Create a Google Cloud Project +- If you don't have one, create a Google Cloud Project via the [Google Cloud Console](https://console.cloud.google.com/). + +### Step 2: Enable the Custom Search API +- Visit the [Google Custom Search API Documentation](https://developers.google.com/custom-search/v1/overview). +- Click on `Get a Key`. +- Select your project or create a new one. +- ![Create Project](images/google.png) +- This will enable the Custom Search API for your project and generate an API key. + +### Step 3: Retrieve Your API Key +- Copy the API key. +- Paste it in the `API_KEYS` field with the name `GOOGLE_SEARCH` in the `config.toml` file located in the root directory of Devika, or you can set it via the UI. + +### Step 4: Create a Custom Search Engine +- Go to the [Google Custom Search Engine](https://programmablesearchengine.google.com/controlpanel/all) website. +- Click on the `Add` button to create a new search engine. +- ![Create Search Engine](images/google-2.png) +- After creating the engine, copy the `Search Engine ID`. +- Paste it in the `API_Endpoints` field with the name `GOOGLE_SEARCH_ENGINE_ID` in the `config.toml` file located in the root directory of Devika, or you can set it via the UI. +``` -## Google Search API -- if don't have then create GCP account [Google Cloud Console](https://console.cloud.google.com/). -- visit [Here](https://developers.google.com/custom-search/v1/overview) is the official documentation. -- click on `Get a Key`. -- select the project you have or create a new project. click on next. -![alt text](images/google.png) -- it enable the Custom Search API for the project and create the API key. -- Copy the API key and paste it in the API_KEYS field with the name `GOOGLE_SEARCH` in the `config.toml` file in the root directory of Devika or you can set it via UI. -- for the search engine id, go to the [Google Custom Search Engine](https://programmablesearchengine.google.com/controlpanel/all) website. -- click on the `Add` button. -![alt text](images/google-2.png) -- After creating the engine. Copy the `Search Engine ID` and paste it in the API_Endpoints field with the name `GOOGLE_SEARCH_ENGINE_ID` in the `config.toml` file in the root directory of Devika or you can set it via UI. From 35e5e4351cbcd330b8a93fdc64470a502d43fe5f Mon Sep 17 00:00:00 2001 From: Edenware Date: Wed, 25 Sep 2024 18:53:42 -0300 Subject: [PATCH 07/43] Fix 'ask_user' error Prevent hanging by fixing a 'ask_user' var related error. --- devika.py | 2 ++ src/agents/researcher/researcher.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/devika.py b/devika.py index 961b792a..f0483c1f 100644 --- a/devika.py +++ b/devika.py @@ -29,7 +29,9 @@ CORS(app, resources={r"/*": {"origins": # Change the origin to your frontend URL [ "https://localhost:3000", + "https://localhost:3001", "http://localhost:3000", + "http://localhost:3001" ]}}) app.register_blueprint(project_bp) socketio.init_app(app) diff --git a/src/agents/researcher/researcher.py b/src/agents/researcher/researcher.py index cec2b2ff..b52d5252 100644 --- a/src/agents/researcher/researcher.py +++ b/src/agents/researcher/researcher.py @@ -30,8 +30,8 @@ def validate_response(self, response: str) -> dict | bool: return False else: return { - "queries": response["queries"], - "ask_user": response["ask_user"] + "queries": response.get("queries", []), + "ask_user": response.get("ask_user", None) } @retry_wrapper From 8fb3c06274d458efbfbb335976bd7292f55fd776 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Sun, 6 Oct 2024 10:33:34 +0200 Subject: [PATCH 08/43] Update README.md --- docs/architecture/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/architecture/README.md b/docs/architecture/README.md index 7fa3bc16..7918f727 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -12,5 +12,5 @@ Devika's system architecture consists of the following key components: 8. **Knowledge Base**: Stores and retrieves project-specific information, code snippets, and learned knowledge for efficient access. 9. **Database**: Persists project data, agent states, and configuration settings. -Read [ARCHITECTURE.md](https://github.com/stitionai/devika/Docs/architecture/ARCHITECTURE.md) for the detailed architecture of Devika. -Read [UNDER_THE_HOOD.md](https://github.com/stitionai/devika/Docs/architecture/UNDER_THE_HOOD.md) for the detailed working of Devika. +Read [ARCHITECTURE.md](https://github.com/stitionai/devika/docs/architecture/ARCHITECTURE.md) for the detailed architecture of Devika. +Read [UNDER_THE_HOOD.md](https://github.com/stitionai/devika/docs/architecture/UNDER_THE_HOOD.md) for the detailed working of Devika. From cd227ab8080022a79f680d76f733639d79cacba7 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Sun, 6 Oct 2024 10:42:41 +0200 Subject: [PATCH 09/43] Update README.md --- docs/architecture/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/architecture/README.md b/docs/architecture/README.md index 7918f727..d81dbae1 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -12,5 +12,5 @@ Devika's system architecture consists of the following key components: 8. **Knowledge Base**: Stores and retrieves project-specific information, code snippets, and learned knowledge for efficient access. 9. **Database**: Persists project data, agent states, and configuration settings. -Read [ARCHITECTURE.md](https://github.com/stitionai/devika/docs/architecture/ARCHITECTURE.md) for the detailed architecture of Devika. -Read [UNDER_THE_HOOD.md](https://github.com/stitionai/devika/docs/architecture/UNDER_THE_HOOD.md) for the detailed working of Devika. +Read [ARCHITECTURE.md](https://github.com/stitionai/devika/blob/main/docs/architecture/ARCHITECTURE.md) for the detailed architecture of Devika. +Read [UNDER_THE_HOOD.md](https://github.com/stitionai/devika/blob/main/docs/architecture/UNDER_THE_HOOD.md) for the detailed working of Devika. From 61b9f8b9834822c41776b32d27921195b4163a11 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Sun, 6 Oct 2024 21:16:54 +0200 Subject: [PATCH 10/43] devika.py aktualisieren changed to CORS(app) --- devika.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/devika.py b/devika.py index 961b792a..d96e0be2 100644 --- a/devika.py +++ b/devika.py @@ -26,11 +26,7 @@ app = Flask(__name__) -CORS(app, resources={r"/*": {"origins": # Change the origin to your frontend URL - [ - "https://localhost:3000", - "http://localhost:3000", - ]}}) +CORS(app) app.register_blueprint(project_bp) socketio.init_app(app) From 0f4c51fd3cad48ce49f2ec943aab23c7b23fe276 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:05:19 +0200 Subject: [PATCH 11/43] Update README.md --- README.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 63c8961d..05fd0590 100644 --- a/README.md +++ b/README.md @@ -55,14 +55,18 @@ Read [**README.md**](docs/architecture) for the detailed documentation. ## Getting Started -### Requirements -``` -Version's requirements - - Python >= 3.10 and < 3.12 - - NodeJs >= 18 - - bun -``` - +- Python >= 3.10 and < 3.12 + + sudo apt update && sudo apt upgrade + + sudo apt install python3 python-is-python3 + +- NodeJs >= 18 Installation + + sudo apt install nodejs + node -v + +- bun Installation [bun installation](https://bun.sh/docs/installation#:~:text=Installing%20a%20specific%20version%20of%20Bun%20on%20Linux/Mac.%20To) - Install uv - Python Package manager [download](https://github.com/astral-sh/uv) - Install bun - JavaScript runtime [download](https://bun.sh/docs/installation) - For ollama [ollama setup guide](docs/Installation/ollama.md) (optinal: if you don't want to use the local models then you can skip this step) From 712082b6c7b76d701da362f7746bf794fbe78727 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:07:20 +0200 Subject: [PATCH 12/43] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 05fd0590..67c733a7 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,6 @@ Read [**README.md**](docs/architecture) for the detailed documentation. sudo apt install nodejs node -v -- bun Installation [bun installation](https://bun.sh/docs/installation#:~:text=Installing%20a%20specific%20version%20of%20Bun%20on%20Linux/Mac.%20To) - Install uv - Python Package manager [download](https://github.com/astral-sh/uv) - Install bun - JavaScript runtime [download](https://bun.sh/docs/installation) - For ollama [ollama setup guide](docs/Installation/ollama.md) (optinal: if you don't want to use the local models then you can skip this step) From e3503633985f7f110a4d33e13d58bab837533de9 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:18:48 +0200 Subject: [PATCH 13/43] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 67c733a7..ac13cf6b 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ Read [**README.md**](docs/architecture) for the detailed documentation. - NodeJs >= 18 Installation sudo apt install nodejs + node -v - Install uv - Python Package manager [download](https://github.com/astral-sh/uv) From 8f1aadc3e06fb1ada7962b1a2bf07807105cee46 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:21:38 +0200 Subject: [PATCH 14/43] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index ac13cf6b..987fd261 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,10 @@ Read [**README.md**](docs/architecture) for the detailed documentation. node -v +- Pip Installation + + sudo apt install python3-pip + - Install uv - Python Package manager [download](https://github.com/astral-sh/uv) - Install bun - JavaScript runtime [download](https://bun.sh/docs/installation) - For ollama [ollama setup guide](docs/Installation/ollama.md) (optinal: if you don't want to use the local models then you can skip this step) From 822b9a001b233fdcea7d905f78869be4eb5daa07 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:23:09 +0200 Subject: [PATCH 15/43] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 987fd261..dddd9d2b 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,9 @@ Read [**README.md**](docs/architecture) for the detailed documentation. sudo apt install python3-pip - Install uv - Python Package manager [download](https://github.com/astral-sh/uv) + + $ pip install uv + - Install bun - JavaScript runtime [download](https://bun.sh/docs/installation) - For ollama [ollama setup guide](docs/Installation/ollama.md) (optinal: if you don't want to use the local models then you can skip this step) - For API models, configure the API keys via setting page in UI. From d01c5c76746ef0f0573c75995de1229806a08a5d Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:29:09 +0200 Subject: [PATCH 16/43] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index dddd9d2b..fbac41ef 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,8 @@ Read [**README.md**](docs/architecture) for the detailed documentation. node -v - Pip Installation + + python3 -m pip config set global.break-system-packages true sudo apt install python3-pip From 9b4866647beb703c717438c0d72d3229919672f7 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:31:30 +0200 Subject: [PATCH 17/43] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index fbac41ef..eb7454be 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,8 @@ Read [**README.md**](docs/architecture) for the detailed documentation. - Pip Installation python3 -m pip config set global.break-system-packages true + + als Alternative im uv pip installieren ??? sudo apt install python3-pip From d4cfbb5322caceb8be8df036c97b2d1213db5c53 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:42:44 +0200 Subject: [PATCH 18/43] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index eb7454be..e7d0ae3f 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,7 @@ Read [**README.md**](docs/architecture) for the detailed documentation. - Install bun - JavaScript runtime [download](https://bun.sh/docs/installation) - For ollama [ollama setup guide](docs/Installation/ollama.md) (optinal: if you don't want to use the local models then you can skip this step) + ollama run llama3.2 - For API models, configure the API keys via setting page in UI. From cf965f32889753c24201ae5863dc9b9d9e5b346a Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:43:52 +0200 Subject: [PATCH 19/43] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index e7d0ae3f..e3ed9f4e 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,11 @@ Read [**README.md**](docs/architecture) for the detailed documentation. - Install bun - JavaScript runtime [download](https://bun.sh/docs/installation) - For ollama [ollama setup guide](docs/Installation/ollama.md) (optinal: if you don't want to use the local models then you can skip this step) + + sudo snap install ollama + ollama run llama3.2 + - For API models, configure the API keys via setting page in UI. From 9855bbd5720524c617ed4a8fa87d560c0fe9a190 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:44:44 +0200 Subject: [PATCH 20/43] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e3ed9f4e..d43d679d 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,8 @@ Read [**README.md**](docs/architecture) for the detailed documentation. - For API models, configure the API keys via setting page in UI. + without <> + ### Installation From b274a70e04148ba154c19a2829a1ea04020f8120 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:49:20 +0200 Subject: [PATCH 21/43] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d43d679d..8350859c 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,8 @@ Read [**README.md**](docs/architecture) for the detailed documentation. - For API models, configure the API keys via setting page in UI. - without <> + Keys without <> + ### Installation From 614eb316c67e51ed81d4ede3c2feeac038341160 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:55:28 +0200 Subject: [PATCH 22/43] Update devika.py --- devika.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devika.py b/devika.py index d96e0be2..f1baa71e 100644 --- a/devika.py +++ b/devika.py @@ -32,7 +32,7 @@ log = logging.getLogger("werkzeug") -log.disabled = True +log.disabled = False TIKTOKEN_ENC = tiktoken.get_encoding("cl100k_base") From 66de63e2c594d1e99a43b5fd243a1d68dfd3b21a Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 13:25:57 +0200 Subject: [PATCH 23/43] Update README.md --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 8350859c..f439966c 100644 --- a/README.md +++ b/README.md @@ -136,6 +136,19 @@ To install Devika, follow these steps: ``` 8. Access the Devika web interface by opening a browser and navigating to `http://127.0.0.1:3001` +9. Install xterm in wsl + + sudo apt install xterm + +10. Windows run Xming Server from http://www.straightrunning.com/XmingNotes/#head-16 + + xterm + +11. Install Code + + sudo snap install --classic code + + ### how to use To start using Devika, follow these steps: From 12883d4c04caba4bcdc35ef0a251d8f2adb885c5 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 13:29:11 +0200 Subject: [PATCH 24/43] Update README.md --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f439966c..84abee0a 100644 --- a/README.md +++ b/README.md @@ -142,9 +142,15 @@ To install Devika, follow these steps: 10. Windows run Xming Server from http://www.straightrunning.com/XmingNotes/#head-16 - xterm +11. Change Fontsize in xterm + + vi ~./Xresources + + xterm*font: *-fixed-*-*-*-18-* + + run xrdb -merge ~/.Xresources -11. Install Code +14. Install Code sudo snap install --classic code From 2106a6f92a9e2adddf6a3bc3b535419cb7aab3e8 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 13:31:03 +0200 Subject: [PATCH 25/43] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 84abee0a..44595535 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,8 @@ To install Devika, follow these steps: 10. Windows run Xming Server from http://www.straightrunning.com/XmingNotes/#head-16 11. Change Fontsize in xterm + + sudo apt install x11-xserver-utils vi ~./Xresources From 74da6a2a7cddfda3d9d7c313e1eec7dff3e415e6 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 20:13:30 +0200 Subject: [PATCH 26/43] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 44595535..1750d3f7 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,8 @@ Read [**README.md**](docs/architecture) for the detailed documentation. - Install bun - JavaScript runtime [download](https://bun.sh/docs/installation) - For ollama [ollama setup guide](docs/Installation/ollama.md) (optinal: if you don't want to use the local models then you can skip this step) + sudo apt install snap + sudo snap install ollama ollama run llama3.2 From 6a2e14dd5a44ee67b6843ef797e6e21a02dfc5c8 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Tue, 8 Oct 2024 20:14:14 +0200 Subject: [PATCH 27/43] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1750d3f7..98b5a81b 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ Read [**README.md**](docs/architecture) for the detailed documentation. - Install bun - JavaScript runtime [download](https://bun.sh/docs/installation) - For ollama [ollama setup guide](docs/Installation/ollama.md) (optinal: if you don't want to use the local models then you can skip this step) - sudo apt install snap + sudo apt install snapd sudo snap install ollama From 594dae611726c3c9283d0cebe9142139581b82e5 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Wed, 9 Oct 2024 08:26:51 +0200 Subject: [PATCH 28/43] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 98b5a81b..1f818bf9 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,8 @@ Read [**README.md**](docs/architecture) for the detailed documentation. node -v - Pip Installation + + sudo apt install pip python3 -m pip config set global.break-system-packages true From 3023d61fb4d8a2796e5bbfa375a1cb21beeb9743 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Wed, 9 Oct 2024 08:28:39 +0200 Subject: [PATCH 29/43] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1f818bf9..0dde72ba 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,8 @@ Read [**README.md**](docs/architecture) for the detailed documentation. - NodeJs >= 18 Installation sudo apt install nodejs + + sudo apt install npm node -v From 9d5b942c9b706b04d99c3dcfbc5f5d1e9d0d02b0 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Wed, 9 Oct 2024 08:31:15 +0200 Subject: [PATCH 30/43] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0dde72ba..507b7e74 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ Read [**README.md**](docs/architecture) for the detailed documentation. sudo apt install python3 python-is-python3 - NodeJs >= 18 Installation + [NodeJs >= 18 Installation](https://linuxconfig.org/how-to-install-node-js-on-ubuntu-24-04) sudo apt install nodejs From 9b7f97db97f798a29bbfa27e415d6be8292d8dde Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Wed, 9 Oct 2024 09:03:21 +0200 Subject: [PATCH 31/43] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 507b7e74..0cd47ad5 100644 --- a/README.md +++ b/README.md @@ -88,9 +88,9 @@ Read [**README.md**](docs/architecture) for the detailed documentation. - For ollama [ollama setup guide](docs/Installation/ollama.md) (optinal: if you don't want to use the local models then you can skip this step) sudo apt install snapd - - sudo snap install ollama + curl -fsSL https://ollama.com/install.sh | sh + ollama run llama3.2 - For API models, configure the API keys via setting page in UI. From 035c6d0dab461784e45bce9334a02211bcac0f7d Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Wed, 9 Oct 2024 09:51:49 +0200 Subject: [PATCH 32/43] README.md aktualisieren --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 0cd47ad5..eefb3288 100644 --- a/README.md +++ b/README.md @@ -87,8 +87,6 @@ Read [**README.md**](docs/architecture) for the detailed documentation. - Install bun - JavaScript runtime [download](https://bun.sh/docs/installation) - For ollama [ollama setup guide](docs/Installation/ollama.md) (optinal: if you don't want to use the local models then you can skip this step) - sudo apt install snapd - curl -fsSL https://ollama.com/install.sh | sh ollama run llama3.2 From 4ec321e35a63e00be5166e60ad2b6c42545a2d5e Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:15:06 +0200 Subject: [PATCH 33/43] Update requirements.txt --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/requirements.txt b/requirements.txt index 91666960..a0a18437 100644 --- a/requirements.txt +++ b/requirements.txt @@ -31,3 +31,5 @@ orjson gevent gevent-websocket curl_cffi +vite +shutils From 50de1976d723b127e686ef9293d07c70acdd77f9 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:22:11 +0200 Subject: [PATCH 34/43] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eefb3288..c7d2c520 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ Read [**README.md**](docs/architecture) for the detailed documentation. curl -fsSL https://ollama.com/install.sh | sh - ollama run llama3.2 + ollama run llama3.2 llama3 gemma qwen qwen2 mistral phi3:14b phi3:3.8b codellama qwen2.5 llama2 gemma2 llama3.1:70b - For API models, configure the API keys via setting page in UI. From 237696cccf2a78b007277f53a3ef2ad2d1f7117d Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:27:36 +0200 Subject: [PATCH 35/43] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index c7d2c520..993ad094 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,12 @@ Read [**README.md**](docs/architecture) for the detailed documentation. ## Getting Started +- Nvidia Driver installation + + https://linuxconfig.org/how-to-install-nvidia-drivers-on-ubuntu-24-04 + nvtop to see installed Nvidia Cards + - Python >= 3.10 and < 3.12 sudo apt update && sudo apt upgrade From 5a0b6e1cb63557f3a93f4c8f3c8708a7f84ed9ad Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:37:57 +0200 Subject: [PATCH 36/43] Update README.md --- README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 993ad094..0209cfa2 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,21 @@ Read [**README.md**](docs/architecture) for the detailed documentation. curl -fsSL https://ollama.com/install.sh | sh - ollama run llama3.2 llama3 gemma qwen qwen2 mistral phi3:14b phi3:3.8b codellama qwen2.5 llama2 gemma2 llama3.1:70b + ollama pull llama3.2 + ollama pull llama3 + ollama pull gemma + ollama pull qwen + ollama run qwen2 + ollama run mistral + ollama run phi3:14b + ollama run phi3:3.8b + ollama run codellama + ollama run qwen2.5 + ollama run llama2 + ollama run gemma2 + ollama run llama3.1:70b + + - For API models, configure the API keys via setting page in UI. From f4fdd762359eee1d7d8914b52b0386207735a25b Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:40:14 +0200 Subject: [PATCH 37/43] Update README.md --- README.md | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 0209cfa2..8d4aa9b7 100644 --- a/README.md +++ b/README.md @@ -95,18 +95,30 @@ Read [**README.md**](docs/architecture) for the detailed documentation. curl -fsSL https://ollama.com/install.sh | sh ollama pull llama3.2 + ollama pull llama3 + ollama pull gemma + ollama pull qwen - ollama run qwen2 - ollama run mistral - ollama run phi3:14b - ollama run phi3:3.8b - ollama run codellama - ollama run qwen2.5 - ollama run llama2 - ollama run gemma2 - ollama run llama3.1:70b + + ollama pull qwen2 + + ollama pull mistral + + ollama pull phi3:14b + + ollama pull phi3:3.8b + + ollama pull codellama + + ollama pull qwen2.5 + + ollama pull llama2 + + ollama pull gemma2 + + ollama pull llama3.1:70b From e8aaeb251c2aef3792fd499d9f1d8a669c2aa5b4 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:56:19 +0200 Subject: [PATCH 38/43] Add files via upload Download Ollama Modell llama3.2 llama3.1 llama3 gemma qwen qwen2 mistral phi3:14b phi3:3.8b codellama qwen2.5 llama2 gemma2 llama3.1:70b --- get-ollama-modells.sh | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 get-ollama-modells.sh diff --git a/get-ollama-modells.sh b/get-ollama-modells.sh new file mode 100644 index 00000000..c5e3ece6 --- /dev/null +++ b/get-ollama-modells.sh @@ -0,0 +1,43 @@ +#! /bin/bash +echo "/usr/local/bin/ollama pull llama3.2" +echo +/usr/local/bin/ollama pull llama3.2 +echo +echo "/usr/local/bin/ollama pull llama3.1" +/usr/local/bin/ollama pull llama3.1 +echo +echo "/usr/local/bin/ollama pull llama3" +/usr/local/bin/ollama pull llama3 +echo +echo "/usr/local/bin/ollama pull gemma" +/usr/local/bin/ollama pull gemma +echo +echo "/usr/local/bin/ollama pull qwen" +/usr/local/bin/ollama pull qwen +echo +echo "/usr/local/bin/ollama pull qwen2" +/usr/local/bin/ollama pull qwen2 +echo +echo "/usr/local/bin/ollama pull mistral" +/usr/local/bin/ollama pull mistral +echo +echo "/usr/local/bin/ollama pull phi3:14b" +/usr/local/bin/ollama pull phi3:14b +echo +echo "/usr/local/bin/ollama pull phi3:3.8b" +/usr/local/bin/ollama pull phi3:3.8b +echo +echo "/usr/local/bin/ollama pull codellama" +/usr/local/bin/ollama pull codellama +echo +echo "/usr/local/bin/ollama pull qwen2.5" +/usr/local/bin/ollama pull qwen2.5 +echo +echo "/usr/local/bin/ollama pull llama2" +/usr/local/bin/ollama pull llama2 +echo +echo "/usr/local/bin/ollama pull gemma2" +/usr/local/bin/ollama pull gemma2 +echo +echo "/usr/local/bin/ollama pull llama3.1:70b" +/usr/local/bin/ollama pull llama3.1:70b From 009575547051fbb32a37fddd4baa1ca74e7fe187 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Wed, 9 Oct 2024 11:00:23 +0200 Subject: [PATCH 39/43] Update README.md --- README.md | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/README.md b/README.md index 8d4aa9b7..923dedb3 100644 --- a/README.md +++ b/README.md @@ -94,31 +94,7 @@ Read [**README.md**](docs/architecture) for the detailed documentation. curl -fsSL https://ollama.com/install.sh | sh - ollama pull llama3.2 - - ollama pull llama3 - - ollama pull gemma - - ollama pull qwen - - ollama pull qwen2 - - ollama pull mistral - - ollama pull phi3:14b - - ollama pull phi3:3.8b - - ollama pull codellama - - ollama pull qwen2.5 - - ollama pull llama2 - - ollama pull gemma2 - - ollama pull llama3.1:70b + ./get-ollama-models.sh From f41c4d91bd8beca3cc0e08d07da3eac39b19efe5 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Wed, 9 Oct 2024 11:01:09 +0200 Subject: [PATCH 40/43] Rename get-ollama-modells.sh to get-ollama-models.sh --- get-ollama-modells.sh => get-ollama-models.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename get-ollama-modells.sh => get-ollama-models.sh (100%) diff --git a/get-ollama-modells.sh b/get-ollama-models.sh similarity index 100% rename from get-ollama-modells.sh rename to get-ollama-models.sh From abb0c21221603c25b645e36866a2c2515c287dd7 Mon Sep 17 00:00:00 2001 From: alexanderbehrens1978 <35383014+alexanderbehrens1978@users.noreply.github.com> Date: Wed, 9 Oct 2024 12:49:58 +0200 Subject: [PATCH 41/43] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 923dedb3..2bc7f785 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,7 @@ To install Devika, follow these steps: ``` 5. Start the Devika server: ```bash + npm install @sveltejs/adapter-node python devika.py ``` 6. if everything is working fine, you see the following output: From e3700c0964a6499bf6c3bc8a923f201e0ae5a675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Marget=C3=ADn?= <> Date: Thu, 28 Nov 2024 21:38:11 +0100 Subject: [PATCH 42/43] Added OpenAI Compatible Support - Added NewAI(OpenAI) API key and endpoint to sample.config.toml - Updated Config class to handle NewAI(OpenAI) API settings - Created newai_client.py for NewAI (OpenAI) API interaction --- sample.config.toml | 2 ++ src/config.py | 14 ++++++++++++++ src/llm/newai_client.py | 23 +++++++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 src/llm/newai_client.py diff --git a/sample.config.toml b/sample.config.toml index 62cde107..794ffc02 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -16,11 +16,13 @@ GEMINI = "" MISTRAL = "" GROQ = "" NETLIFY = "" +NEWAI = "" [API_ENDPOINTS] BING = "https://api.bing.microsoft.com/v7.0/search" GOOGLE = "https://www.googleapis.com/customsearch/v1" OLLAMA = "http://127.0.0.1:11434" +NEWAI = "https://api.newai.com/v1" LM_STUDIO = "http://localhost:1234/v1" OPENAI = "https://api.openai.com/v1" diff --git a/src/config.py b/src/config.py index a3303118..080febd7 100644 --- a/src/config.py +++ b/src/config.py @@ -182,6 +182,20 @@ def set_timeout_inference(self, value): def save_config(self): with open("config.toml", "w") as f: toml.dump(self.config, f) + + def get_newai_api_key(self): + return self.config["API_KEYS"]["NEWAI"] + + def get_newai_api_endpoint(self): + return self.config["API_ENDPOINTS"]["NEWAI"] + + def set_newai_api_key(self, key): + self.config["API_KEYS"]["NEWAI"] = key + self.save_config() + + def set_newai_api_endpoint(self, endpoint): + self.config["API_ENDPOINTS"]["NEWAI"] = endpoint + self.save_config() def update_config(self, data): for key, value in data.items(): diff --git a/src/llm/newai_client.py b/src/llm/newai_client.py new file mode 100644 index 00000000..057fd808 --- /dev/null +++ b/src/llm/newai_client.py @@ -0,0 +1,23 @@ +from openai import OpenAI + +from src.config import Config + +class NewAi: + def __init__(self): + config = Config() + api_key = config.get_newai_api_key() + base_url = config.get_newai_api_endpoint() + self.client = OpenAI(api_key=api_key, base_url=base_url) + + def inference(self, model_id: str, prompt: str) -> str: + chat_completion = self.client.chat.completions.create( + messages=[ + { + "role": "user", + "content": prompt.strip(), + } + ], + model=model_id, + temperature=0 + ) + return chat_completion.choices[0].message.content \ No newline at end of file From 65b46c4a311784e47572bc6961220c5847e1e6b2 Mon Sep 17 00:00:00 2001 From: Edenware Date: Thu, 12 Dec 2024 19:05:13 -0300 Subject: [PATCH 43/43] Bugfixes and DuckDuckGo compatibilty --- devika.py | 6 +-- src/browser/search.py | 95 +++++++++++++++++++++++++++++------------- src/llm/llm.py | 2 +- ui/bun.lockb | Bin 89723 -> 95103 bytes 4 files changed, 70 insertions(+), 33 deletions(-) diff --git a/devika.py b/devika.py index 192fe49e..cabb77fe 100644 --- a/devika.py +++ b/devika.py @@ -86,17 +86,17 @@ def handle_message(data): agent = Agent(base_model=base_model, search_engine=search_engine) - state = AgentState.get_latest_state(project_name) + state = agent_state.get_latest_state(project_name) if not state: thread = Thread(target=lambda: agent.execute(message, project_name)) thread.start() else: - if AgentState.is_agent_completed(project_name): + if AgentState.is_agent_completed(agent_state, project_name): thread = Thread(target=lambda: agent.subsequent_execute(message, project_name)) thread.start() else: emit_agent("info", {"type": "warning", "message": "previous agent doesn't completed it's task."}) - last_state = AgentState.get_latest_state(project_name) + last_state = agent_state.get_latest_state(project_name) if last_state["agent_is_active"] or not last_state["completed"]: thread = Thread(target=lambda: agent.execute(message, project_name)) thread.start() diff --git a/src/browser/search.py b/src/browser/search.py index 030fa5fe..06a9fbad 100644 --- a/src/browser/search.py +++ b/src/browser/search.py @@ -87,8 +87,6 @@ class DuckDuckGoSearch: """DuckDuckGo search engine class. methods are inherited from the duckduckgo_search package. do not change the methods. - - currently, the package is not working with our current setup. """ def __init__(self): from curl_cffi import requests as curl_requests @@ -99,45 +97,84 @@ def __init__(self): def _get_url(self, method, url, data): try: resp = self.asession.request(method, url, data=data) - if resp.status_code == 200: + if resp.status_code == 200 and resp.content: return resp.content - if resp.status_code == (202, 301, 403): - raise Exception(f"Error: {resp.status_code} rate limit error") - if not resp: - return None + elif resp.status_code in (202, 301, 403): + raise Exception(f"Error: {resp.status_code} - Rate limit error") + else: + raise ValueError("Received an invalid or empty response from DuckDuckGo") except Exception as error: if "timeout" in str(error).lower(): - raise TimeoutError("Duckduckgo timed out error") + raise TimeoutError("DuckDuckGo request timed out") + raise ValueError(f"Error fetching DuckDuckGo response: {error}") def duck(self, query): - resp = self._get_url("POST", "https://duckduckgo.com/", data={"q": query}) - vqd = self.extract_vqd(resp) - - params = {"q": query, "kl": 'en-us', "p": "1", "s": "0", "df": "", "vqd": vqd, "ex": ""} - resp = self._get_url("GET", "https://links.duckduckgo.com/d.js", params) - page_data = self.text_extract_json(resp) - - results = [] - for row in page_data: - href = row.get("u") - if href and href != f"http://www.google.com/search?q={query}": - body = self.normalize(row["a"]) - if body: - result = { - "title": self.normalize(row["t"]), - "href": self.normalize_url(href), - "body": self.normalize(row["a"]), - } - results.append(result) - - self.query_result = results + try: + resp = self._get_url("POST", "https://duckduckgo.com/", data={"q": query}) + if not resp: + raise ValueError("Failed to fetch initial DuckDuckGo response") + + if resp is None: + raise ValueError("Invalid response received from DuckDuckGo") + + if resp.status_code != 200: + raise ValueError("Invalid response received from DuckDuckGo (status code: {resp.status_code})") + + vqd = self.extract_vqd(resp) + if not vqd: + raise ValueError("Failed to extract 'vqd' from the response") + + params = {"q": query, "kl": 'en-us', "p": "1", "s": "0", "df": "", "vqd": vqd, "ex": ""} + resp = self._get_url("GET", "https://links.duckduckgo.com/d.js", params) + if not resp: + raise ValueError("Failed to fetch results from DuckDuckGo") + + page_data = self.text_extract_json(resp) + results = [] + for row in page_data: + href = row.get("u") + if href and href != f"http://www.google.com/search?q={query}": + body = self.normalize(row["a"]) + if body: + result = { + "title": self.normalize(row["t"]), + "href": self.normalize_url(href), + "body": self.normalize(row["a"]), + } + results.append(result) + if not self.query_result: + raise ValueError("No results available from search") + + self.query_result = results + + except Exception as e: + print(f"Error during DuckDuckGo search: {e}") def search(self, query): self.duck(query) def get_first_link(self): + if not self.query_result: + raise ValueError("No results available from search") return self.query_result[0]["href"] + @staticmethod + def extract_vqd(html_bytes: bytes) -> str: + if not html_bytes: + raise ValueError("HTML content is empty or None.") + + patterns = [(b'vqd="', 5, b'"'), (b"vqd=", 4, b"&"), (b"vqd='", 5, b"'")] + for start_pattern, offset, end_pattern in patterns: + try: + start = html_bytes.index(start_pattern) + offset + end = html_bytes.index(end_pattern, start) + return html_bytes[start:end].decode() + except (ValueError, AttributeError): + continue + + # Se nenhum padrão foi encontrado, levante uma exceção + raise ValueError("Unable to extract vqd; no matching pattern found.") + @staticmethod def extract_vqd(html_bytes: bytes) -> str: patterns = [(b'vqd="', 5, b'"'), (b"vqd=", 4, b"&"), (b"vqd='", 5, b"'")] diff --git a/src/llm/llm.py b/src/llm/llm.py index ece78eda..9d4f9dbd 100644 --- a/src/llm/llm.py +++ b/src/llm/llm.py @@ -21,7 +21,7 @@ ollama = Ollama() logger = Logger() -agentState = AgentState() +agent_state = AgentState() config = Config() diff --git a/ui/bun.lockb b/ui/bun.lockb index f6fdf255dde653e71b3e704f3a8430173590fb46..d1990a072581054b5a301aaa5de437b424909e37 100755 GIT binary patch delta 16502 zcmeHud017|_xITs5Uz^M!etO~HsUgK#eoZorUD8%T)`0q5oJ)oIR#ToOHJ775plxV zG;>NTEvL#bO-XY=Q^}!FQ%OZ7mG`sGAiQP$zTfwGet*54htFAit-bc%Yp=cb-sc|9 z{$syI%}tAi`nF|B9ozI67PZ@{b(e~ZYf9t3y7$TZ+aB*Z*QRvg1_$r=9^T7h0$o-4 zCeNUi52Q41<5T5SPU@JP%rVIsdT7}RLS7!k4L}!Z1i=}UndN`jB)74-AXtO*gS0+q zMq);0YLXy0fY*YboS2?Q_00lr3w{DSzeM7t{vy0=Lt6dd) z-R$Kq<%~+spl<6GJ`|L?&>uyqwA4>HfF@&h8HXkcE#RC+gxP+mH@Q zt>01P^%~1#^b~Tc_jmBn&&~T93G&4Xj62Z+@YET-iyR8gL8-z1$S3NolPeerO8QDg ze_M}Qex<8ykXp|r7-owa^A5Pl74PQb%$z%SbC>PcdC1L-P0ShPGbVX*44gpy3jw7F z?b}2UU_o9eC@RR?4@&YDP53dhCb>-!*wp=krZT+@iU#u>AgAtUPe@M7Nfre6W`Y2Z znA0T8=r{at^`l|*A;pml)Q6Xp@%`q3!f@SEt`y@MOacUT*H3 zThdl`SnO-EB{_-1hbInCOWp}NImFIe*3QXJOC64q;n1U6zk!@u^94@LMr)75R$Wpk55fY5}No)<#Y2IAVIEu>?=>!8=zEisltB=O8HwA`BFvx zHYj2(FGJx?pk#1_BG-dbIaej$3Y6-7sF&Nh4B8lrMBaBukm4Rt8p}0`!aPYq$eX0_ zBSEQxtjx5u@nZ#HM>|14l;tf3rE!>~@Iyf-7L_1bKZ>a;Um&s*_+g^hurp>I|w*f{{t7WUdhUhFs74NK*)< zgOdI*P_#QRuP+i5xmi8rm`wp~0Dd4S$vZ1_Ur*V<yffpMsV({qyHiuWFtO@zZm;spEBl7L z-!h}9@AjnIX6<+F=s0@G<&s-fSAL&YeCEU(?XGPvy%yc?oy10?_w1TEeT(0&;5jdP z@%z>T_>)G%n32cZ7}+FVi2HGV0rxFjXKU2hnDGSLFpI%vf)K=i^6qGbL@#v9oG02E z*cGm`GisWf^8~vvmdp$7jO=560rzWMXK&PaSnve^Z9`t>5~fW?ShbgGCReQD@j4@W$_sTytq%f>D2MX4Eva;mh2@SQNkDW@PzX=Wb*rl-4o? zJ{f~<+8QkSgX_sXoI0@8T<2kAH9Q{osk{((M1+S?qp|0%O~SNsSeVEf#>?H{0dQo2 z883D=XiHz_c{v%hHkeW5D|6~Qi{tU0M(q~J{2{B)i**K#){&QahH1xOreKAElh8r! zT5ugCm2ww@_A)qfi%R^Vjl$Loz2o-HNbwF4W*FX)YobDghI>)cAV4WZ*{&<+JhUI*94 zpv?#OIygisJoE*)ep1WeH1@4|f?t^SEj%?vODfcvZ^8M1v*N{G2Ca1)xoQh3B>I7) z;Xp{BYsXaZwrEObT(~Os6y7UC+hdgN|V^erxfaGl46SywWs9o}! zJn^vlVKw_6To-7=A%O;shc_<^3}f+J7i47b^Y|d6_Pn=18$6mqoNAn3=Vd`*wBiOE z*?b-!Y}B4ak7;{A>mCM8kPlxL8Ahv3uuv?S_;rTY!|TcjjfT3;ZnS4nrzhD!cWi>>*OUBw6P`HFp70N-apqW!>RKxwT

8p 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 NY^GPerGoWi{{dG&@lyZ*