From 4f10539f8313da8f127ea81b93eff4beeb79cac8 Mon Sep 17 00:00:00 2001 From: drohbo Date: Fri, 11 Jul 2025 18:18:06 +0200 Subject: [PATCH] feat(integrations): simplify the continue.dev plugin guide --- docs/tutorials/integrations/continue-dev.md | 219 ++++++++++++------ .../continue_dev_extension_input_field.png | Bin 0 -> 32131 bytes .../continue-dev/continue_dev_vscode_icon.png | Bin 0 -> 1274 bytes 3 files changed, 142 insertions(+), 77 deletions(-) create mode 100644 static/images/tutorials/continue-dev/continue_dev_extension_input_field.png create mode 100644 static/images/tutorials/continue-dev/continue_dev_vscode_icon.png diff --git a/docs/tutorials/integrations/continue-dev.md b/docs/tutorials/integrations/continue-dev.md index a888f295..b2c0d65b 100644 --- a/docs/tutorials/integrations/continue-dev.md +++ b/docs/tutorials/integrations/continue-dev.md @@ -4,116 +4,181 @@ title: "⚛️ Continue.dev VSCode Extension with Open WebUI" --- :::warning -This tutorial is a community contribution and is not supported by the Open WebUI team. It serves only as a demonstration on how to customize Open WebUI for your specific use case. Want to contribute? Check out the contributing tutorial. +This tutorial is a community contribution and is not supported by the Open WebUI team. It serves only as a demonstration on how to customize Open WebUI for your specific use case. Want to contribute? Check out the [contributing tutorial](/docs/contributing.mdx). ::: # Integrating Continue.dev VSCode Extension with Open WebUI -### Download Extension +## Download Extension -You can download the VSCode extension here on the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=Continue.continue) +You can download the VSCode extension on the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=Continue.continue) or directly via the `EXTENSION:MARKETPLACE` within VSCode by searching for `continue`. +Once installed, you can access the application via the `continue` tab in the side bar of VSCode. -Once installed you should now have a 'continue' tab in the side bar. Open this. +**VSCode side bar icon:** -Click on the Assistant selector above the main chat input. Then hover over "Local Assistant" and you should see a settings icon (looks like a cog). - -Once you click on the settings icon, a `config.yaml` should open up in the editor. - -Here you'll be able to configure continue to use Open WebUI. +![continue.dev vscode icon](/images/tutorials/continue-dev/continue_dev_vscode_icon.png) --- -Currently the 'ollama' provider does not support authentication so we cannot use this provider with Open WebUI. +## Setup -However Ollama and Open WebUI both have compatibily with OpenAI API spec. You can see a blog post from Ollama [here](https://ollama.com/blog/openai-compatibility) on this. +Click on the assistant selector to the right of the main chat input. Then hover over `Local Assistant` and click on the settings icon (⚙️). +This will open the `config.yaml` file in your editor. Here you can change the settings of your `Local Assistant`. -We can still setup Continue to use the openai provider which will allow us to use Open WebUI's authentication token. +![continue.dev chat input](/images/tutorials/continue-dev/continue_dev_extension_input_field.png) ---- +:::info -## Config +Currently the `ollama` provider does not support authentication so we cannot use this provider with Open WebUI. +However Ollama and Open WebUI both have compatibility with OpenAI API spec. Read more about the specification in the [Ollama blog post](https://ollama.com/blog/openai-compatibility). +We can still setup continue.dev to use the openai provider which will allow us to use Open WebUI's authentication token. -In `config.yaml` all you will need to do is add/change the following options. +::: -### Change provider to openai +### Example config -```yaml -provider: openai -``` - -### Add or update apiBase - -Set this to your Open Web UI domain on the end. - -```yaml -apiBase: http://localhost:3000/ #If you followed Getting Started Docker -``` - -### Add apiKey - -```yaml -apiKey: sk-79970662256d425eb274fc4563d4525b # Replace with your API key -``` - -You can find and generate your api key from Open WebUI -> Settings -> Account -> API Keys - -You'll want to copy the "API Key" (this starts with sk-) - -## Example Config - -Here is a base example of config.yaml using Open WebUI via an openai provider. Using Granite Code as the model. -Make sure you pull the model into your ollama instance/s beforehand. +Below you find an example config for Llama3 as the model with a local Open WebUI setup. ```yaml name: Local Assistant version: 1.0.0 schema: v1 models: - - name: Granite Code + - name: LLama3 provider: openai - model: granite-code:latest + model: /models/Meta-Llama-3-8B-Instruct-Q4_K_M.gguf env: useLegacyCompletionsEndpoint: false - apiBase: http://YOUROPENWEBUI/ollama/v1 - apiKey: sk-YOUR-API-KEY + apiBase: http://localhost:3000/api + apiKey: YOUR_OPEN_WEBUI_API_KEY roles: - chat - edit +context: + - provider: code + - provider: docs + - provider: diff + - provider: terminal + - provider: problems + - provider: folder + - provider: codebase - - name: Model ABC from pipeline - provider: openai - model: PIPELINE_MODEL_ID - env: - useLegacyCompletionsEndpoint: false - apiBase: http://YOUROPENWEBUI/api - apiKey: sk-YOUR-API-KEY - roles: - - chat - - edit - - - name: Granite Code Autocomplete - provider: openai - model: granite-code:latest - env: - useLegacyCompletionsEndpoint: false - apiBase: http://localhost:3000/ollama/v1 - apiKey: sk-YOUR-API-KEY - roles: - - autocomplete - -prompts: - - name: test - description: Write unit tests for highlighted code - prompt: | - Write a comprehensive set of unit tests for the selected code. It should setup, run tests that check for correctness including important edge cases, and teardown. Ensure that the tests are complete and sophisticated. Give the tests just as chat output, don't edit any file. ``` -Save your `config.yaml` and thats it! +--- -You should now see your model in the Continue tab model selection. +### Miscellaneous Configuration Settings -Select it and you should now be chatting via Open WebUI (and or any [pipelines](/pipelines) you have setup ) +These values are needed by the extension to work properly. Find more information in the [official config guide](https://docs.continue.dev/reference). -You can do this for as many models you would like to use, altough any model should work, you should use a model that is designed for code. +```yaml +name: Local Assistant +version: 1.0.0 +schema: v1 +``` -See the continue documentation for additional continue configuration, [Continue Documentation](https://docs.continue.dev/reference/Model%20Providers/openai) +The context section provides additional information to the models. Find more information in the [official config guide](https://docs.continue.dev/reference#context) and in the [context provider guide](https://docs.continue.dev/customize/custom-providers). + +```yaml +context: + - provider: code + - provider: docs + - provider: diff + - provider: terminal + - provider: problems + - provider: folder + - provider: codebase +``` + +--- + +### Models + +The models section is where you specify all models you want to add. Find more information in the [official models guide](https://docs.continue.dev/reference#models). + +```yaml +models: + - ... +``` + +--- + +### Name + +Sets the name for the model you want to use. This will be displayed within the chat input of the extension. + +```yaml +name: LLama3 +``` + +![continue.dev chat input](/images/tutorials/continue-dev/continue_dev_extension_input_field.png) + +--- + +### Provider + +Specifies the method used to communicate with the API, which in our case is the OpenAI API endpoint provided by Open WebUI. + +```yaml +provider: openai +``` + +--- + +### Model + +This is the actual name of your model in Open WebUI. Navigate to `Admin Panel` > `Settings` > `Models`, and then click on your preferred LLM. +Below the user-given name, you'll find the actual model name. + +```yaml +model: /models/Meta-Llama-3-8B-Instruct-Q4_K_M.gguf +``` + +--- + +### Legacy completions endpoint + +This setting is not needed for Open WebUI, though more information is available in the [original guide](https://platform.openai.com/docs/guides/completions/completions-api-legacy). + +```yaml +env: + useLegacyCompletionsEndpoint: false +``` + +--- + +### APIBase + +This is a crucial step: you need to direct the continue.dev extension requests to your Open WebUI instance. +Either use an actual domain name if the instance is hosted somewhere (e.g. `https://example.com/api`) or your localhost setup (e.g. `http://localhost:3000/api`). +You can find more information about the URLs in the [API Endpoints guide](/docs/getting-started/api-endpoints.md). + +```yaml +apiBase: http://localhost:3000/api +``` + +--- + +### API Key + +To authenticate with your Open WebUI instance, you'll need to generate an API key. +Follow the instructions in [this guide](https://docs.openwebui.com/getting-started/advanced-topics/monitoring#authentication-setup-for-api-key-) to create it. + +```yaml +apiKey: YOUR_OPEN_WEBUI_API_KEY +``` + +--- + +### Roles + +The roles will allow your model to be used by the extension for certain tasks. For the beginning you can choose `chat` and `edit`. +You can find more information about roles in the [official roles guide](https://docs.continue.dev/customize/model-roles/intro). + +```yaml +roles: + - chat + - edit +``` + +The setup is now completed and you can interact with your model(s) via the chat input. Find more information about the features and usage of the continue.dev plugin in the [official documentation](https://docs.continue.dev/getting-started/overview). diff --git a/static/images/tutorials/continue-dev/continue_dev_extension_input_field.png b/static/images/tutorials/continue-dev/continue_dev_extension_input_field.png new file mode 100644 index 0000000000000000000000000000000000000000..f1f27d144d0798fd8238a71387fd66f871f524ab GIT binary patch literal 32131 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 YEk%%l=_KEQx~hZ8NGOU|i5ds}AI4nL#{d8T literal 0 HcmV?d00001 diff --git a/static/images/tutorials/continue-dev/continue_dev_vscode_icon.png b/static/images/tutorials/continue-dev/continue_dev_vscode_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2c615c6e6a87f1c22bd445a814fccb4e14850a58 GIT binary patch literal 1274 zcmVA$v)0WN@t(4M?$t+B#iBO_~#ss5+#6%M}F8v06 zjr%oRx%Cs6$i~=(q#II*MGSP%(xIk0v53JM=b=lqBBnJA`#l{HlIFy3VafQ;YCqodU~2ur%vHG z4l64w7=}SMn@2&xyI7X> zXW(U7W^!^8RaM#9*}?NXlF1~V=V9A6j~+cbFisRj!r?IGav9sUxpnInkw}C)ckb}` z@#ABcPoP$rN~JIi1K;;CO_Q;)F+@>hYiolFaVWG z<;V@_a2$*JUkwcnasB#r?%uu2>gp<+o12)X*;TCX`>d_4VObWEB#}%eDV0h9q|<3q zsZ`e-fp)%LuM-M|Xf~UC{rZ)BK9B3VUB`Q#$M*I%s;aWLx5t||Z%8B(oH=ubcs$PP z>S|Yc0(Bcf5D)|bQ4|pbAxH`YK|qqEPKVjg({0H>z_OW`m>`?Yl1im;U6F>OV)uE1z&nmZE|;TTuQM|&DefpGI zt@cyz_kEviHjAPtXqv{8Cr^k(BD7j9c6N3GKSqRJzqoZ>=ia@0gu~%OJB91Itgo+= z$z*u`{P}Nt2KM}WP_0&3Uth=feMC__aO@ked_K?Hw{L#~_CM-*=liJ>{ckgX@0SMf k{n7xwUmC#oOD7usZ%TsZT?Z0M6951J07*qoM6N<$g0h5gVE_OC literal 0 HcmV?d00001