From 6ca769acbc7e2f4afc6cc289d3b846bb02b24fa9 Mon Sep 17 00:00:00 2001 From: Agustin Carrasco Date: Thu, 14 Dec 2023 01:15:22 -0300 Subject: [PATCH 1/4] feat(lobe chat): add lobe chat app --- apps/lobe-chat/config.json | 41 +++++++++++++++++++++++++ apps/lobe-chat/docker-compose.yml | 15 +++++++++ apps/lobe-chat/metadata/description.md | 13 ++++++++ apps/lobe-chat/metadata/logo.jpg | Bin 0 -> 43186 bytes 4 files changed, 69 insertions(+) create mode 100644 apps/lobe-chat/config.json create mode 100644 apps/lobe-chat/docker-compose.yml create mode 100644 apps/lobe-chat/metadata/description.md create mode 100644 apps/lobe-chat/metadata/logo.jpg diff --git a/apps/lobe-chat/config.json b/apps/lobe-chat/config.json new file mode 100644 index 00000000..49a1f343 --- /dev/null +++ b/apps/lobe-chat/config.json @@ -0,0 +1,41 @@ +{ + "name": "Lobe Chat", + "available": true, + "port": 3210, + "exposable": true, + "id": "lobe-chat", + "description": "LobeChat is an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible (Function Call) plugin system.", + "tipi_version": 1, + "version": "0.116.4", + "categories": ["utilities", "ai", "development"], + "short_desc": "LLM chatbot framework", + "author": "https://github.com/lobehub", + "source": "https://github.com/lobehub/lobe-chat", + "website": "https://github.com/lobehub/lobe-chat", + "form_fields": [ + { + "type": "text", + "label": "OpenAI API Key", + "required": true, + "env_variable": "OPENAI_API_KEY" + }, + { + "type": "fqdn", + "label": "OpenAI API URL", + "required": false, + "env_variable": "OPENAI_PROXY_URL" + }, + { + "type": "text", + "label": "Custom Models", + "required": false, + "env_variable": "CUSTOM_MODELS" + }, + { + "type": "password", + "label": "Password", + "required": false, + "env_variable": "ACCESS_CODE" + } + ] +} diff --git a/apps/lobe-chat/docker-compose.yml b/apps/lobe-chat/docker-compose.yml new file mode 100644 index 00000000..618a4ebf --- /dev/null +++ b/apps/lobe-chat/docker-compose.yml @@ -0,0 +1,15 @@ +version: "3.9" +services: + lobe-chat: + container_name: lobe-chat + image: lobehub/lobe-chat:v0.116.4 + environment: + - OPENAI_API_KEY=${OPENAI_API_KEY} + - OPENAI_PROXY_URL=${OPEANAI_PROXY_URL} + - CUSTOM_MODELS=${CUSTOM_MODELS} + - ACCESS_CODE=${ACCESS_CODE} + ports: + - ${APP_PORT}:3210 + restart: unless-stopped + networks: + - tipi_main_network diff --git a/apps/lobe-chat/metadata/description.md b/apps/lobe-chat/metadata/description.md new file mode 100644 index 00000000..f56fe8bd --- /dev/null +++ b/apps/lobe-chat/metadata/description.md @@ -0,0 +1,13 @@ +# Lobe Chat + +LobeChat is an open-source, high-performance chatbot framework that supports +speech synthesis, multimodal, and extensible +([Function Call](https://sspai.com/post/81986)) plugin system. + +## Settings +| Environment Variable | Required | Description | Example | +| -------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| `OPENAI_API_KEY` | Yes | This is the API key you apply on the OpenAI account page | `sk-xxxxxx...xxxxxx` | +| `OPENAI_PROXY_URL` | No | If you manually configure the OpenAI interface proxy, you can use this configuration item to override the default OpenAI API request base URL | `https://api.chatanywhere.cn/v1`
The default value is
`https://api.openai.com/v1` | +| `ACCESS_CODE` | No | Add a password to access this service; you can set a long password to avoid leaking. If this value contains a comma, it is a password array. | `awCTe)re_r74` or `rtrt_ewee3@09!` or `code1,code2,code3` | +| `CUSTOM_MODELS` | No | Used to control the model list. Use `+` to add a model, `-` to hide a model, and `model_name=display_name` to customize the display name of a model, separated by commas. | `qwen-7b-chat,+glm-6b,-gpt-3.5-turbo` | diff --git a/apps/lobe-chat/metadata/logo.jpg b/apps/lobe-chat/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13df2a977476b98c98a2509a760eed199332a56a GIT binary patch literal 43186 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 bdliq=-3=<|%~VWDZVT?pvf>nf`fvZ)g?8!` literal 0 HcmV?d00001 From 6e160833fdaafe8c7ccb69a4e594c3c699c29b2d Mon Sep 17 00:00:00 2001 From: Agustin Carrasco Date: Wed, 27 Dec 2023 00:45:34 -0300 Subject: [PATCH 2/4] style(lobe chat): adjust description file --- apps/lobe-chat/config.json | 3 ++- apps/lobe-chat/metadata/description.md | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/lobe-chat/config.json b/apps/lobe-chat/config.json index 49a1f343..d544d686 100644 --- a/apps/lobe-chat/config.json +++ b/apps/lobe-chat/config.json @@ -37,5 +37,6 @@ "required": false, "env_variable": "ACCESS_CODE" } - ] + ], + "supported_architectures": ["arm64", "amd64"] } diff --git a/apps/lobe-chat/metadata/description.md b/apps/lobe-chat/metadata/description.md index f56fe8bd..0aed4a3e 100644 --- a/apps/lobe-chat/metadata/description.md +++ b/apps/lobe-chat/metadata/description.md @@ -2,12 +2,12 @@ LobeChat is an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible -([Function Call](https://sspai.com/post/81986)) plugin system. +([Function Call](https://platform.openai.com/docs/guides/function-calling)) plugin system. ## Settings -| Environment Variable | Required | Description | Example | -| -------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | -| `OPENAI_API_KEY` | Yes | This is the API key you apply on the OpenAI account page | `sk-xxxxxx...xxxxxx` | -| `OPENAI_PROXY_URL` | No | If you manually configure the OpenAI interface proxy, you can use this configuration item to override the default OpenAI API request base URL | `https://api.chatanywhere.cn/v1`
The default value is
`https://api.openai.com/v1` | -| `ACCESS_CODE` | No | Add a password to access this service; you can set a long password to avoid leaking. If this value contains a comma, it is a password array. | `awCTe)re_r74` or `rtrt_ewee3@09!` or `code1,code2,code3` | -| `CUSTOM_MODELS` | No | Used to control the model list. Use `+` to add a model, `-` to hide a model, and `model_name=display_name` to customize the display name of a model, separated by commas. | `qwen-7b-chat,+glm-6b,-gpt-3.5-turbo` | +| Environment Variable | Required | Description | Example | +| -------------------- | -------- | ------------| --------| +| `OPENAI_API_KEY` | Yes | API key for OpenAI. You can generate it on [your OpenAI account page](https://platform.openai.com/api-keys). **Note:** Keep your `OPENAI_API_KEY` secure to prevent unauthorized access. | `sk-xxxxxx...xxxxxx` | +| `OPENAI_PROXY_URL` | No | Override the default OpenAI API base URL for requests. **Caution:** Only use a trusted proxy to ensure the security of your data. | `https://api.chatanywhere.cn/v1`
The default value is
`https://api.openai.com/v1` | +| `ACCESS_CODE` | No | Password to avoid leaking. If you want to have multiple passwords, use a comma separated list. **Security Best Practice:** Avoid storing passwords directly in environment variables. Use a secrets management service to protect sensitive information. | `awCTe)re_r74` or `rtrt_ewee3@09!` or `code1,code2,code3` | +| `CUSTOM_MODELS` | No | Control the model list. Use `+` to add a model, `-` to hide a model, and `model_name=display_name` to customize the display name of a model, separated by commas. | `qwen-7b-chat,+glm-6b,-gpt-3.5-turbo` | From 4b177a04f89b158cdf9efe2df62681ecf7dcd213 Mon Sep 17 00:00:00 2001 From: Agustin Carrasco Date: Sat, 6 Jan 2024 00:09:35 -0300 Subject: [PATCH 3/4] fix(lobe chat): minor adjustments to config definition --- apps/lobe-chat/config.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/lobe-chat/config.json b/apps/lobe-chat/config.json index d544d686..7f50be32 100644 --- a/apps/lobe-chat/config.json +++ b/apps/lobe-chat/config.json @@ -7,7 +7,7 @@ "description": "LobeChat is an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible (Function Call) plugin system.", "tipi_version": 1, "version": "0.116.4", - "categories": ["utilities", "ai", "development"], + "categories": ["ai"], "short_desc": "LLM chatbot framework", "author": "https://github.com/lobehub", "source": "https://github.com/lobehub/lobe-chat", @@ -20,7 +20,7 @@ "env_variable": "OPENAI_API_KEY" }, { - "type": "fqdn", + "type": "url", "label": "OpenAI API URL", "required": false, "env_variable": "OPENAI_PROXY_URL" @@ -28,6 +28,7 @@ { "type": "text", "label": "Custom Models", + "hint": "Comma separated list of model IDs", "required": false, "env_variable": "CUSTOM_MODELS" }, From 841523506f915577261da21a5e13eceef8056f91 Mon Sep 17 00:00:00 2001 From: Agustin Carrasco Date: Sat, 6 Jan 2024 00:10:03 -0300 Subject: [PATCH 4/4] fix(lobe chat): add traefik labels to make app exposable --- apps/lobe-chat/docker-compose.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/apps/lobe-chat/docker-compose.yml b/apps/lobe-chat/docker-compose.yml index 618a4ebf..03ae4f6b 100644 --- a/apps/lobe-chat/docker-compose.yml +++ b/apps/lobe-chat/docker-compose.yml @@ -13,3 +13,28 @@ services: restart: unless-stopped networks: - tipi_main_network + labels: + # Main + traefik.enable: true + traefik.http.middlewares.lobe-chat-web-redirect.redirectscheme.scheme: https + traefik.http.services.lobe-chat.loadbalancer.server.port: 16662 + # Web + traefik.http.routers.lobe-chat-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.lobe-chat-insecure.entrypoints: web + traefik.http.routers.lobe-chat-insecure.service: lobe-chat + traefik.http.routers.lobe-chat-insecure.middlewares: lobe-chat-web-redirect + # Websecure + traefik.http.routers.lobe-chat.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.lobe-chat.entrypoints: websecure + traefik.http.routers.lobe-chat.service: lobe-chat + traefik.http.routers.lobe-chat.tls.certresolver: myresolver + # Local domain + traefik.http.routers.lobe-chat-local-insecure.rule: Host(`lobe-chat.${LOCAL_DOMAIN}`) + traefik.http.routers.lobe-chat-local-insecure.entrypoints: web + traefik.http.routers.lobe-chat-local-insecure.service: lobe-chat + traefik.http.routers.lobe-chat-local-insecure.middlewares: lobe-chat-web-redirect + # Local domain secure + traefik.http.routers.lobe-chat-local.rule: Host(`lobe-chat.${LOCAL_DOMAIN}`) + traefik.http.routers.lobe-chat-local.entrypoints: websecure + traefik.http.routers.lobe-chat-local.service: lobe-chat + traefik.http.routers.lobe-chat-local.tls: true