From b8cb27731ee488c5e7d1c8e61d897981d55637d3 Mon Sep 17 00:00:00 2001 From: DireMunchkin <1665676+DireMunchkin@users.noreply.github.com> Date: Fri, 29 Sep 2023 05:58:18 +0000 Subject: [PATCH] Add Serge Chat (#1283) --- README.md | 1 + apps/serge/config.json | 16 ++++++ apps/serge/docker-compose.yml | 38 +++++++++++++ apps/serge/metadata/description.md | 82 +++++++++++++++++++++++++++++ apps/serge/metadata/logo.jpg | Bin 0 -> 12497 bytes 5 files changed, 137 insertions(+) create mode 100644 apps/serge/config.json create mode 100644 apps/serge/docker-compose.yml create mode 100644 apps/serge/metadata/description.md create mode 100644 apps/serge/metadata/logo.jpg diff --git a/README.md b/README.md index 931f4ddd..d79571cf 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,7 @@ This is the official repository for the Tipi App Store. It contains all the apps - [Sabnzbd](https://github.com/sabnzbd/sabnzbd) - Sabnzbd makes Usenet as simple and streamlined as possible by automating everything we can" - [SearXNG](https://github.com/searxng/searxng) - SearXNG is a free internet metasearch engine which aggregates results from various search services and databases. Users are neither tracked nor profiled - [Send](https://gitlab.com/timvisee/send) - Simple, private file sharing +- [Serge](https://github.com/serge-chat/serge) - A web interface for chatting with Alpaca through llama.cpp. - [SimpleX SMP](https://github.com/simplex-chat/simplexmq) - A reference implementation of the SimpleX Messaging Protocol for simplex queues over public networks. - [Sonarr](https://github.com/Sonarr/Sonarr) - TV show manager for Usenet and BitTorrent - [Sshwifty](https://github.com/nirui/sshwifty/) - Web SSH & Telnet (WebSSH & WebTelnet client) diff --git a/apps/serge/config.json b/apps/serge/config.json new file mode 100644 index 00000000..1928e4bd --- /dev/null +++ b/apps/serge/config.json @@ -0,0 +1,16 @@ +{ + "$schema": "../schema.json", + "name": "Serge", + "available": true, + "exposable": true, + "port": 8008, + "id": "serge", + "tipi_version": 1, + "version": "0.4.1", + "categories": ["ai"], + "description": "", + "short_desc": "LLaMA made easy", + "author": "nsarrazin", + "source": "https://github.com/serge-chat/serge", + "form_fields": [] +} diff --git a/apps/serge/docker-compose.yml b/apps/serge/docker-compose.yml new file mode 100644 index 00000000..206073dd --- /dev/null +++ b/apps/serge/docker-compose.yml @@ -0,0 +1,38 @@ +version: "3.7" +services: + serge: + image: ghcr.io/serge-chat/serge:0.4.1 + container_name: serge + restart: unless-stopped + ports: + - ${APP_PORT}:8008 + networks: + - tipi_main_network + volumes: + - ${APP_DATA_DIR}/data/weights:/usr/src/app/weights + - ${APP_DATA_DIR}/data/db:/data/db/ + labels: + # Main + traefik.enable: true + traefik.http.middlewares.serge-web-redirect.redirectscheme.scheme: https + traefik.http.services.serge.loadbalancer.server.port: 8008 + # Web + traefik.http.routers.serge-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.serge-insecure.entrypoints: web + traefik.http.routers.serge-insecure.service: serge + traefik.http.routers.serge-insecure.middlewares: serge-web-redirect + # Websecure + traefik.http.routers.serge.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.serge.entrypoints: websecure + traefik.http.routers.serge.service: serge + traefik.http.routers.serge.tls.certresolver: myresolver + # Local domain + traefik.http.routers.serge-local-insecure.rule: Host(`serge.${LOCAL_DOMAIN}`) + traefik.http.routers.serge-local-insecure.entrypoints: web + traefik.http.routers.serge-local-insecure.service: serge + traefik.http.routers.serge-local-insecure.middlewares: serge-web-redirect + # Local domain secure + traefik.http.routers.serge-local.rule: Host(`serge.${LOCAL_DOMAIN}`) + traefik.http.routers.serge-local.entrypoints: websecure + traefik.http.routers.serge-local.service: serge + traefik.http.routers.serge-local.tls: true diff --git a/apps/serge/metadata/description.md b/apps/serge/metadata/description.md new file mode 100644 index 00000000..fd115f73 --- /dev/null +++ b/apps/serge/metadata/description.md @@ -0,0 +1,82 @@ +# Serge - LLaMA made easy ๐Ÿฆ™ + +Serge is a chat interface crafted with [llama.cpp](https://github.com/ggerganov/llama.cpp) for running Alpaca models. No API keys, entirely self-hosted! + +- ๐ŸŒ **SvelteKit** frontend +- ๐Ÿ’พ **[Redis](https://github.com/redis/redis)** for storing chat history & parameters +- โš™๏ธ **FastAPI + LangChain** for the API, wrapping calls to [llama.cpp](https://github.com/ggerganov/llama.cpp) using the [python bindings](https://github.com/abetlen/llama-cpp-python) + + +## ๐Ÿง  Supported Models + +| Category | Models | +|:-------------:|:-------| +| **Alpaca ๐Ÿฆ™** | Alpaca-LoRA-65B, GPT4-Alpaca-LoRA-30B | +| **Chronos ๐ŸŒ‘**| Chronos-13B, Chronos-33B, Chronos-Hermes-13B | +| **GPT4All ๐ŸŒ**| GPT4All-13B | +| **Koala ๐Ÿจ** | Koala-7B, Koala-13B | +| **LLaMA ๐Ÿฆ™** | FinLLaMA-33B, LLaMA-Supercot-30B, LLaMA2 7B, LLaMA2 13B, LLaMA2 70B | +| **Lazarus ๐Ÿ’€**| Lazarus-30B | +| **Nous ๐Ÿง ** | Nous-Hermes-13B | +| **OpenAssistant ๐ŸŽ™๏ธ** | OpenAssistant-30B | +| **Orca ๐Ÿฌ** | Orca-Mini-v2-7B, Orca-Mini-v2-13B, OpenOrca-Preview1-13B | +| **Samantha ๐Ÿ‘ฉ**| Samantha-7B, Samantha-13B, Samantha-33B | +| **Vicuna ๐Ÿฆ™** | Stable-Vicuna-13B, Vicuna-CoT-7B, Vicuna-CoT-13B, Vicuna-v1.1-7B, Vicuna-v1.1-13B, VicUnlocked-30B, VicUnlocked-65B | +| **Wizard ๐Ÿง™** | Wizard-Mega-13B, WizardLM-Uncensored-7B, WizardLM-Uncensored-13B, WizardLM-Uncensored-30B, WizardCoder-Python-13B-V1.0 | + +Additional weights can be added to the `serge_weights` volume using `docker cp`: + +```bash +docker cp ./my_weight.bin serge:/usr/src/app/weights/ +``` + +## โš ๏ธ Memory Usage + +LLaMA will crash if you don't have enough available memory for the model: + +| Model | Max RAM Required | +|-------------|------------------| +| 7B | 4.5GB | +| 7B-q2_K | 5.37GB | +| 7B-q3_K_L | 6.10GB | +| 7B-q4_1 | 6.71GB | +| 7B-q4_K_M | 6.58GB | +| 7B-q5_1 | 7.56GB | +| 7B-q5_K_M | 7.28GB | +| 7B-q6_K | 8.03GB | +| 7B-q8_0 | 9.66GB | +| 13B | 12GB | +| 13B-q2_K | 8.01GB | +| 13B-q3_K_L | 9.43GB | +| 13B-q4_1 | 10.64GB | +| 13B-q4_K_M | 10.37GB | +| 13B-q5_1 | 12.26GB | +| 13B-q5_K_M | 11.73GB | +| 13B-q6_K | 13.18GB | +| 13B-q8_0 | 16.33GB | +| 33B | 20GB | +| 33B-q2_K | 16.21GB | +| 33B-q3_K_L | 19.78GB | +| 33B-q4_1 | 22.83GB | +| 33B-q4_K_M | 22.12GB | +| 33B-q5_1 | 26.90GB | +| 33B-q5_K_M | 25.55GB | +| 33B-q6_K | 29.19GB | +| 33B-q8_0 | 37.06GB | +| 65B | 50GB | +| 65B-q2_K | 29.95GB | +| 65B-q3_K_L | 37.15GB | +| 65B-q4_1 | 43.31GB | +| 65B-q4_K_M | 41.85GB | +| 65B-q5_1 | 51.47GB | +| 65B-q5_K_M | 48.74GB | +| 65B-q6_K | 56.06GB | +| 65B-q8_0 | 71.87GB | + +## ๐Ÿงพ License + +[Nathan Sarrazin](https://github.com/nsarrazin) and [Contributors](https://github.com/serge-chat/serge/graphs/contributors). `Serge` is free and open-source software licensed under the [MIT License](https://github.com/serge-chat/serge/blob/master/LICENSE). + +## ๐Ÿ’ฌ Support + +Need help? Join our [Discord](https://discord.gg/62Hc6FEYQH) diff --git a/apps/serge/metadata/logo.jpg b/apps/serge/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b3d5e87f9e241569f2607f987a6ed05e903d5b8 GIT binary patch literal 12497 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 literal 0 HcmV?d00001