@lobehub/chat 1.60.7 → 1.60.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -23,6 +23,7 @@ body:
23
23
  multiple: true
24
24
  options:
25
25
  - 'client db (lobe-chat image)'
26
+ - 'client pgelite db (lobe-chat-pglite image)'
26
27
  - 'server db(lobe-chat-database image)'
27
28
  validations:
28
29
  required: true
@@ -31,7 +32,7 @@ body:
31
32
  label: '📌 Version'
32
33
  validations:
33
34
  required: true
34
-
35
+
35
36
  - type: dropdown
36
37
  attributes:
37
38
  label: '💻 Operating System'
@@ -23,6 +23,7 @@ body:
23
23
  multiple: true
24
24
  options:
25
25
  - '客户端模式(lobe-chat 镜像)'
26
+ - '客户端 Pglite 模式(lobe-chat-pglite 镜像)'
26
27
  - '服务端模式(lobe-chat-database 镜像)'
27
28
  validations:
28
29
  required: true
@@ -0,0 +1,161 @@
1
+ name: Publish Docker Pglite Image
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ release:
6
+ types: [published]
7
+ pull_request:
8
+ types: [synchronize, labeled, unlabeled]
9
+
10
+ concurrency:
11
+ group: ${{ github.ref }}-${{ github.workflow }}
12
+ cancel-in-progress: true
13
+
14
+ env:
15
+ REGISTRY_IMAGE: lobehub/lobe-chat-pglite
16
+ PR_TAG_PREFIX: pr-
17
+
18
+ jobs:
19
+ build:
20
+ # 添加 PR label 触发条件
21
+ if: |
22
+ (github.event_name == 'pull_request' &&
23
+ contains(github.event.pull_request.labels.*.name, 'Build Docker')) ||
24
+ github.event_name != 'pull_request'
25
+
26
+ strategy:
27
+ matrix:
28
+ include:
29
+ - platform: linux/amd64
30
+ os: ubuntu-latest
31
+ - platform: linux/arm64
32
+ os: ubuntu-24.04-arm
33
+ runs-on: ${{ matrix.os }}
34
+ name: Build ${{ matrix.platform }} Image
35
+ steps:
36
+ - name: Prepare
37
+ run: |
38
+ platform=${{ matrix.platform }}
39
+ echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
40
+
41
+ - name: Checkout base
42
+ uses: actions/checkout@v4
43
+ with:
44
+ fetch-depth: 0
45
+
46
+ - name: Set up Docker Buildx
47
+ uses: docker/setup-buildx-action@v3
48
+
49
+ # 为 PR 生成特殊的 tag
50
+ - name: Generate PR metadata
51
+ if: github.event_name == 'pull_request'
52
+ id: pr_meta
53
+ run: |
54
+ branch_name="${{ github.head_ref }}"
55
+ sanitized_branch=$(echo "${branch_name}" | sed -E 's/[^a-zA-Z0-9_.-]+/-/g')
56
+ echo "pr_tag=${sanitized_branch}-$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
57
+
58
+ - name: Docker meta
59
+ id: meta
60
+ uses: docker/metadata-action@v5
61
+ with:
62
+ images: ${{ env.REGISTRY_IMAGE }}
63
+ tags: |
64
+ # PR 构建使用特殊的 tag
65
+ type=raw,value=${{ env.PR_TAG_PREFIX }}${{ steps.pr_meta.outputs.pr_tag }},enable=${{ github.event_name == 'pull_request' }}
66
+ # release 构建使用版本号
67
+ type=semver,pattern={{version}},enable=${{ github.event_name != 'pull_request' }}
68
+ type=raw,value=latest,enable=${{ github.event_name != 'pull_request' }}
69
+
70
+ - name: Docker login
71
+ uses: docker/login-action@v3
72
+ with:
73
+ username: ${{ secrets.DOCKER_REGISTRY_USER }}
74
+ password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
75
+
76
+ - name: Get commit SHA
77
+ if: github.ref == 'refs/heads/main'
78
+ id: vars
79
+ run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
80
+
81
+ - name: Build and export
82
+ id: build
83
+ uses: docker/build-push-action@v5
84
+ with:
85
+ platforms: ${{ matrix.platform }}
86
+ context: .
87
+ file: ./Dockerfile.pglite
88
+ labels: ${{ steps.meta.outputs.labels }}
89
+ build-args: |
90
+ SHA=${{ steps.vars.outputs.sha_short }}
91
+ outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
92
+
93
+ - name: Export digest
94
+ run: |
95
+ rm -rf /tmp/digests
96
+ mkdir -p /tmp/digests
97
+ digest="${{ steps.build.outputs.digest }}"
98
+ touch "/tmp/digests/${digest#sha256:}"
99
+
100
+ - name: Upload artifact
101
+ uses: actions/upload-artifact@v4
102
+ with:
103
+ name: digest-${{ env.PLATFORM_PAIR }}
104
+ path: /tmp/digests/*
105
+ if-no-files-found: error
106
+ retention-days: 1
107
+
108
+ merge:
109
+ name: Merge
110
+ needs: build
111
+ runs-on: ubuntu-latest
112
+ steps:
113
+ - name: Checkout base
114
+ uses: actions/checkout@v4
115
+ with:
116
+ fetch-depth: 0
117
+
118
+ - name: Download digests
119
+ uses: actions/download-artifact@v4
120
+ with:
121
+ path: /tmp/digests
122
+ pattern: digest-*
123
+ merge-multiple: true
124
+
125
+ - name: Set up Docker Buildx
126
+ uses: docker/setup-buildx-action@v3
127
+
128
+ # 为 merge job 添加 PR metadata 生成
129
+ - name: Generate PR metadata
130
+ if: github.event_name == 'pull_request'
131
+ id: pr_meta
132
+ run: |
133
+ branch_name="${{ github.head_ref }}"
134
+ sanitized_branch=$(echo "${branch_name}" | sed -E 's/[^a-zA-Z0-9_.-]+/-/g')
135
+ echo "pr_tag=${sanitized_branch}-$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
136
+
137
+ - name: Docker meta
138
+ id: meta
139
+ uses: docker/metadata-action@v5
140
+ with:
141
+ images: ${{ env.REGISTRY_IMAGE }}
142
+ tags: |
143
+ type=raw,value=${{ env.PR_TAG_PREFIX }}${{ steps.pr_meta.outputs.pr_tag }},enable=${{ github.event_name == 'pull_request' }}
144
+ type=semver,pattern={{version}},enable=${{ github.event_name != 'pull_request' }}
145
+ type=raw,value=latest,enable=${{ github.event_name != 'pull_request' }}
146
+
147
+ - name: Docker login
148
+ uses: docker/login-action@v3
149
+ with:
150
+ username: ${{ secrets.DOCKER_REGISTRY_USER }}
151
+ password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
152
+
153
+ - name: Create manifest list and push
154
+ working-directory: /tmp/digests
155
+ run: |
156
+ docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
157
+ $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
158
+
159
+ - name: Inspect image
160
+ run: |
161
+ docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}
package/CHANGELOG.md CHANGED
@@ -2,6 +2,48 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ### [Version 1.60.9](https://github.com/lobehub/lobe-chat/compare/v1.60.8...v1.60.9)
6
+
7
+ <sup>Released on **2025-02-18**</sup>
8
+
9
+ <br/>
10
+
11
+ <details>
12
+ <summary><kbd>Improvements and Fixes</kbd></summary>
13
+
14
+ </details>
15
+
16
+ <div align="right">
17
+
18
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
19
+
20
+ </div>
21
+
22
+ ### [Version 1.60.8](https://github.com/lobehub/lobe-chat/compare/v1.60.7...v1.60.8)
23
+
24
+ <sup>Released on **2025-02-18**</sup>
25
+
26
+ #### 💄 Styles
27
+
28
+ - **misc**: Sync chat limit.
29
+
30
+ <br/>
31
+
32
+ <details>
33
+ <summary><kbd>Improvements and Fixes</kbd></summary>
34
+
35
+ #### Styles
36
+
37
+ - **misc**: Sync chat limit, closes [#6207](https://github.com/lobehub/lobe-chat/issues/6207) ([cc2f536](https://github.com/lobehub/lobe-chat/commit/cc2f536))
38
+
39
+ </details>
40
+
41
+ <div align="right">
42
+
43
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
44
+
45
+ </div>
46
+
5
47
  ### [Version 1.60.7](https://github.com/lobehub/lobe-chat/compare/v1.60.6...v1.60.7)
6
48
 
7
49
  <sup>Released on **2025-02-17**</sup>
@@ -0,0 +1,244 @@
1
+ ## Set global build ENV
2
+ ARG NODEJS_VERSION="22"
3
+
4
+ ## Base image for all building stages
5
+ FROM node:${NODEJS_VERSION}-slim AS base
6
+
7
+ ARG USE_CN_MIRROR
8
+
9
+ ENV DEBIAN_FRONTEND="noninteractive"
10
+
11
+ RUN \
12
+ # If you want to build docker in China, build with --build-arg USE_CN_MIRROR=true
13
+ if [ "${USE_CN_MIRROR:-false}" = "true" ]; then \
14
+ sed -i "s/deb.debian.org/mirrors.ustc.edu.cn/g" "/etc/apt/sources.list.d/debian.sources"; \
15
+ fi \
16
+ # Add required package
17
+ && apt update \
18
+ && apt install ca-certificates proxychains-ng -qy \
19
+ # Prepare required package to distroless
20
+ && mkdir -p /distroless/bin /distroless/etc /distroless/etc/ssl/certs /distroless/lib \
21
+ # Copy proxychains to distroless
22
+ && cp /usr/lib/$(arch)-linux-gnu/libproxychains.so.4 /distroless/lib/libproxychains.so.4 \
23
+ && cp /usr/lib/$(arch)-linux-gnu/libdl.so.2 /distroless/lib/libdl.so.2 \
24
+ && cp /usr/bin/proxychains4 /distroless/bin/proxychains \
25
+ && cp /etc/proxychains4.conf /distroless/etc/proxychains4.conf \
26
+ # Copy node to distroless
27
+ && cp /usr/lib/$(arch)-linux-gnu/libstdc++.so.6 /distroless/lib/libstdc++.so.6 \
28
+ && cp /usr/lib/$(arch)-linux-gnu/libgcc_s.so.1 /distroless/lib/libgcc_s.so.1 \
29
+ && cp /usr/local/bin/node /distroless/bin/node \
30
+ # Copy CA certificates to distroless
31
+ && cp /etc/ssl/certs/ca-certificates.crt /distroless/etc/ssl/certs/ca-certificates.crt \
32
+ # Cleanup temp files
33
+ && rm -rf /tmp/* /var/lib/apt/lists/* /var/tmp/*
34
+
35
+ ## Builder image, install all the dependencies and build the app
36
+ FROM base AS builder
37
+
38
+ ARG USE_CN_MIRROR
39
+ ARG NEXT_PUBLIC_BASE_PATH
40
+ ARG NEXT_PUBLIC_SENTRY_DSN
41
+ ARG NEXT_PUBLIC_ANALYTICS_POSTHOG
42
+ ARG NEXT_PUBLIC_POSTHOG_HOST
43
+ ARG NEXT_PUBLIC_POSTHOG_KEY
44
+ ARG NEXT_PUBLIC_ANALYTICS_UMAMI
45
+ ARG NEXT_PUBLIC_UMAMI_SCRIPT_URL
46
+ ARG NEXT_PUBLIC_UMAMI_WEBSITE_ID
47
+
48
+ ENV NEXT_PUBLIC_CLIENT_DB="pglite"
49
+ ENV NEXT_PUBLIC_BASE_PATH="${NEXT_PUBLIC_BASE_PATH}"
50
+
51
+ # Sentry
52
+ ENV NEXT_PUBLIC_SENTRY_DSN="${NEXT_PUBLIC_SENTRY_DSN}" \
53
+ SENTRY_ORG="" \
54
+ SENTRY_PROJECT=""
55
+
56
+ # Posthog
57
+ ENV NEXT_PUBLIC_ANALYTICS_POSTHOG="${NEXT_PUBLIC_ANALYTICS_POSTHOG}" \
58
+ NEXT_PUBLIC_POSTHOG_HOST="${NEXT_PUBLIC_POSTHOG_HOST}" \
59
+ NEXT_PUBLIC_POSTHOG_KEY="${NEXT_PUBLIC_POSTHOG_KEY}"
60
+
61
+ # Umami
62
+ ENV NEXT_PUBLIC_ANALYTICS_UMAMI="${NEXT_PUBLIC_ANALYTICS_UMAMI}" \
63
+ NEXT_PUBLIC_UMAMI_SCRIPT_URL="${NEXT_PUBLIC_UMAMI_SCRIPT_URL}" \
64
+ NEXT_PUBLIC_UMAMI_WEBSITE_ID="${NEXT_PUBLIC_UMAMI_WEBSITE_ID}"
65
+
66
+ # Node
67
+ ENV NODE_OPTIONS="--max-old-space-size=8192"
68
+
69
+ WORKDIR /app
70
+
71
+ COPY package.json ./
72
+ COPY .npmrc ./
73
+
74
+ RUN \
75
+ # If you want to build docker in China, build with --build-arg USE_CN_MIRROR=true
76
+ if [ "${USE_CN_MIRROR:-false}" = "true" ]; then \
77
+ export SENTRYCLI_CDNURL="https://npmmirror.com/mirrors/sentry-cli"; \
78
+ npm config set registry "https://registry.npmmirror.com/"; \
79
+ echo 'canvas_binary_host_mirror=https://npmmirror.com/mirrors/canvas' >> .npmrc; \
80
+ fi \
81
+ # Set the registry for corepack
82
+ && export COREPACK_NPM_REGISTRY=$(npm config get registry | sed 's/\/$//') \
83
+ # Update corepack to latest (nodejs/corepack#612)
84
+ && npm i -g corepack@latest \
85
+ # Enable corepack
86
+ && corepack enable \
87
+ # Use pnpm for corepack
88
+ && corepack use $(sed -n 's/.*"packageManager": "\(.*\)".*/\1/p' package.json) \
89
+ # Install the dependencies
90
+ && pnpm i \
91
+ # Add sharp dependencies
92
+ && mkdir -p /deps \
93
+ && pnpm add sharp --prefix /deps
94
+
95
+ COPY . .
96
+
97
+ # run build standalone for docker version
98
+ RUN npm run build:docker
99
+
100
+ ## Application image, copy all the files for production
101
+ FROM busybox:latest AS app
102
+
103
+ COPY --from=base /distroless/ /
104
+
105
+ COPY --from=builder /app/public /app/public
106
+
107
+ # Automatically leverage output traces to reduce image size
108
+ # https://nextjs.org/docs/advanced-features/output-file-tracing
109
+ COPY --from=builder /app/.next/standalone /app/
110
+ COPY --from=builder /app/.next/static /app/.next/static
111
+ COPY --from=builder /deps/node_modules/.pnpm /app/node_modules/.pnpm
112
+
113
+ # Copy server launcher
114
+ COPY --from=builder /app/scripts/serverLauncher/startServer.js /app/startServer.js
115
+
116
+ RUN \
117
+ # Add nextjs:nodejs to run the app
118
+ addgroup -S -g 1001 nodejs \
119
+ && adduser -D -G nodejs -H -S -h /app -u 1001 nextjs \
120
+ # Set permission for nextjs:nodejs
121
+ && chown -R nextjs:nodejs /app /etc/proxychains4.conf
122
+
123
+ ## Production image, copy all the files and run next
124
+ FROM scratch
125
+
126
+ # Copy all the files from app, set the correct permission for prerender cache
127
+ COPY --from=app / /
128
+
129
+ ENV NODE_ENV="production" \
130
+ NODE_OPTIONS="--dns-result-order=ipv4first --use-openssl-ca" \
131
+ NODE_EXTRA_CA_CERTS="" \
132
+ NODE_TLS_REJECT_UNAUTHORIZED="" \
133
+ SSL_CERT_DIR="/etc/ssl/certs/ca-certificates.crt"
134
+
135
+ # Make the middleware rewrite through local as default
136
+ # refs: https://github.com/lobehub/lobe-chat/issues/5876
137
+ ENV MIDDLEWARE_REWRITE_THROUGH_LOCAL="1"
138
+
139
+ # set hostname to localhost
140
+ ENV HOSTNAME="0.0.0.0" \
141
+ PORT="3210"
142
+
143
+ # General Variables
144
+ ENV ACCESS_CODE="" \
145
+ API_KEY_SELECT_MODE="" \
146
+ DEFAULT_AGENT_CONFIG="" \
147
+ SYSTEM_AGENT="" \
148
+ FEATURE_FLAGS="" \
149
+ PROXY_URL=""
150
+
151
+ # Model Variables
152
+ ENV \
153
+ # AI21
154
+ AI21_API_KEY="" AI21_MODEL_LIST="" \
155
+ # Ai360
156
+ AI360_API_KEY="" AI360_MODEL_LIST="" \
157
+ # Anthropic
158
+ ANTHROPIC_API_KEY="" ANTHROPIC_MODEL_LIST="" ANTHROPIC_PROXY_URL="" \
159
+ # Amazon Bedrock
160
+ AWS_ACCESS_KEY_ID="" AWS_SECRET_ACCESS_KEY="" AWS_REGION="" AWS_BEDROCK_MODEL_LIST="" \
161
+ # Azure OpenAI
162
+ AZURE_API_KEY="" AZURE_API_VERSION="" AZURE_ENDPOINT="" AZURE_MODEL_LIST="" \
163
+ # Baichuan
164
+ BAICHUAN_API_KEY="" BAICHUAN_MODEL_LIST="" \
165
+ # Cloudflare
166
+ CLOUDFLARE_API_KEY="" CLOUDFLARE_BASE_URL_OR_ACCOUNT_ID="" CLOUDFLARE_MODEL_LIST="" \
167
+ # DeepSeek
168
+ DEEPSEEK_API_KEY="" DEEPSEEK_MODEL_LIST="" \
169
+ # Fireworks AI
170
+ FIREWORKSAI_API_KEY="" FIREWORKSAI_MODEL_LIST="" \
171
+ # Gitee AI
172
+ GITEE_AI_API_KEY="" GITEE_AI_MODEL_LIST="" \
173
+ # GitHub
174
+ GITHUB_TOKEN="" GITHUB_MODEL_LIST="" \
175
+ # Google
176
+ GOOGLE_API_KEY="" GOOGLE_MODEL_LIST="" GOOGLE_PROXY_URL="" \
177
+ # Groq
178
+ GROQ_API_KEY="" GROQ_MODEL_LIST="" GROQ_PROXY_URL="" \
179
+ # Higress
180
+ HIGRESS_API_KEY="" HIGRESS_MODEL_LIST="" HIGRESS_PROXY_URL="" \
181
+ # HuggingFace
182
+ HUGGINGFACE_API_KEY="" HUGGINGFACE_MODEL_LIST="" HUGGINGFACE_PROXY_URL="" \
183
+ # Hunyuan
184
+ HUNYUAN_API_KEY="" HUNYUAN_MODEL_LIST="" \
185
+ # InternLM
186
+ INTERNLM_API_KEY="" INTERNLM_MODEL_LIST="" \
187
+ # Jina
188
+ JINA_API_KEY="" JINA_MODEL_LIST="" JINA_PROXY_URL="" \
189
+ # Minimax
190
+ MINIMAX_API_KEY="" MINIMAX_MODEL_LIST="" \
191
+ # Mistral
192
+ MISTRAL_API_KEY="" MISTRAL_MODEL_LIST="" \
193
+ # Moonshot
194
+ MOONSHOT_API_KEY="" MOONSHOT_MODEL_LIST="" MOONSHOT_PROXY_URL="" \
195
+ # Novita
196
+ NOVITA_API_KEY="" NOVITA_MODEL_LIST="" \
197
+ # Nvidia NIM
198
+ NVIDIA_API_KEY="" NVIDIA_MODEL_LIST="" NVIDIA_PROXY_URL="" \
199
+ # Ollama
200
+ ENABLED_OLLAMA="" OLLAMA_MODEL_LIST="" OLLAMA_PROXY_URL="" \
201
+ # OpenAI
202
+ OPENAI_API_KEY="" OPENAI_MODEL_LIST="" OPENAI_PROXY_URL="" \
203
+ # OpenRouter
204
+ OPENROUTER_API_KEY="" OPENROUTER_MODEL_LIST="" \
205
+ # Perplexity
206
+ PERPLEXITY_API_KEY="" PERPLEXITY_MODEL_LIST="" PERPLEXITY_PROXY_URL="" \
207
+ # Qwen
208
+ QWEN_API_KEY="" QWEN_MODEL_LIST="" QWEN_PROXY_URL="" \
209
+ # SambaNova
210
+ SAMBANOVA_API_KEY="" SAMBANOVA_MODEL_LIST="" \
211
+ # SenseNova
212
+ SENSENOVA_API_KEY="" SENSENOVA_MODEL_LIST="" \
213
+ # SiliconCloud
214
+ SILICONCLOUD_API_KEY="" SILICONCLOUD_MODEL_LIST="" SILICONCLOUD_PROXY_URL="" \
215
+ # Spark
216
+ SPARK_API_KEY="" SPARK_MODEL_LIST="" \
217
+ # Stepfun
218
+ STEPFUN_API_KEY="" STEPFUN_MODEL_LIST="" \
219
+ # Taichu
220
+ TAICHU_API_KEY="" TAICHU_MODEL_LIST="" \
221
+ # TogetherAI
222
+ TOGETHERAI_API_KEY="" TOGETHERAI_MODEL_LIST="" \
223
+ # Upstage
224
+ UPSTAGE_API_KEY="" UPSTAGE_MODEL_LIST="" \
225
+ # vLLM
226
+ VLLM_API_KEY="" VLLM_MODEL_LIST="" VLLM_PROXY_URL="" \
227
+ # Wenxin
228
+ WENXIN_API_KEY="" WENXIN_MODEL_LIST="" \
229
+ # xAI
230
+ XAI_API_KEY="" XAI_MODEL_LIST="" XAI_PROXY_URL="" \
231
+ # 01.AI
232
+ ZEROONE_API_KEY="" ZEROONE_MODEL_LIST="" \
233
+ # Zhipu
234
+ ZHIPU_API_KEY="" ZHIPU_MODEL_LIST="" \
235
+ # Tencent Cloud
236
+ TENCENT_CLOUD_API_KEY="" TENCENT_CLOUD_MODEL_LIST=""
237
+
238
+ USER nextjs
239
+
240
+ EXPOSE 3210/tcp
241
+
242
+ ENTRYPOINT ["/bin/node"]
243
+
244
+ CMD ["/app/startServer.js"]
package/README.md CHANGED
@@ -363,12 +363,12 @@ Our marketplace is not just a showcase platform but also a collaborative space.
363
363
 
364
364
  | Recent Submits | Description |
365
365
  | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
366
+ | [Cron Expression Assistant](https://lobechat.com/discover/assistant/crontab-generate)<br/><sup>By **[edgesider](https://github.com/edgesider)** on **2025-02-17**</sup> | Crontab Expression Generator<br/>`crontab` `time-expression` `trigger-time` `generator` `technical-assistance` |
366
367
  | [Xiao Zhi French Translation Assistant](https://lobechat.com/discover/assistant/xiao-zhi-french-translation-asst-v-1)<br/><sup>By **[WeR-Best](https://github.com/WeR-Best)** on **2025-02-10**</sup> | A friendly, professional, and empathetic AI assistant for French translation<br/>`ai-assistant` `french-translation` `cross-cultural-communication` `creativity` |
367
- | [Astrology Researcher](https://lobechat.com/discover/assistant/fate-researcher)<br/><sup>By **[Jack980506](https://github.com/Jack980506)** on **2025-02-06**</sup> | Expert in BaZi astrology<br/>`astrology` `ba-zi` `traditional-culture` |
368
368
  | [Language Charm Learning Mentor](https://lobechat.com/discover/assistant/bad-language-helper)<br/><sup>By **[Guducat](https://github.com/Guducat)** on **2025-02-06**</sup> | Specializes in teaching the charm of language and witty responses<br/>`language-learning` `dialogue-examples` |
369
- | [Allinone](https://lobechat.com/discover/assistant/allinone-v-1)<br/><sup>By **[AXuanCreator](https://github.com/AXuanCreator)** on **2025-02-06**</sup> | Innovation · Future · Excellence<br/>`programming` `low-cost` `concise-answers` |
369
+ | [Astrology Researcher](https://lobechat.com/discover/assistant/fate-researcher)<br/><sup>By **[Jack980506](https://github.com/Jack980506)** on **2025-02-06**</sup> | Expert in BaZi astrology<br/>`astrology` `ba-zi` `traditional-culture` |
370
370
 
371
- > 📊 Total agents: [<kbd>**486**</kbd> ](https://lobechat.com/discover/assistants)
371
+ > 📊 Total agents: [<kbd>**487**</kbd> ](https://lobechat.com/discover/assistants)
372
372
 
373
373
  <!-- AGENT LIST -->
374
374
 
@@ -796,7 +796,7 @@ This project is [Apache 2.0](./LICENSE) licensed.
796
796
  [docker-pulls-link]: https://hub.docker.com/r/lobehub/lobe-chat
797
797
  [docker-pulls-shield]: https://img.shields.io/docker/pulls/lobehub/lobe-chat?color=45cc11&labelColor=black&style=flat-square
798
798
  [docker-release-link]: https://hub.docker.com/r/lobehub/lobe-chat
799
- [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square
799
+ [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square&sort=semver
800
800
  [docker-size-link]: https://hub.docker.com/r/lobehub/lobe-chat
801
801
  [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat?color=369eff&labelColor=black&style=flat-square
802
802
  [docs]: https://lobehub.com/docs/usage/start
package/README.zh-CN.md CHANGED
@@ -352,12 +352,12 @@ LobeChat 的插件生态系统是其核心功能的重要扩展,它极大地
352
352
 
353
353
  | 最近新增 | 描述 |
354
354
  | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
355
+ | [Cron 表达式助手](https://lobechat.com/discover/assistant/crontab-generate)<br/><sup>By **[edgesider](https://github.com/edgesider)** on **2025-02-17**</sup> | Crontab 表达式生成<br/>`crontab` `时间表达` `触发时间` `生成器` `技术辅助` |
355
356
  | [小智法语翻译助手](https://lobechat.com/discover/assistant/xiao-zhi-french-translation-asst-v-1)<br/><sup>By **[WeR-Best](https://github.com/WeR-Best)** on **2025-02-10**</sup> | 友好、专业、富有同理心的法语翻译 AI 助手<br/>`ai助手` `法语翻译` `跨文化交流` `创造力` |
356
- | [命理研究员](https://lobechat.com/discover/assistant/fate-researcher)<br/><sup>By **[Jack980506](https://github.com/Jack980506)** on **2025-02-06**</sup> | 精通八字命<br/>`命理学` `八字` `传统文化` |
357
357
  | [语言魅力学习导师](https://lobechat.com/discover/assistant/bad-language-helper)<br/><sup>By **[Guducat](https://github.com/Guducat)** on **2025-02-06**</sup> | 擅长教学语言的魅力与花样回复<br/>`语言学习` `对话示例` |
358
- | [Allinone](https://lobechat.com/discover/assistant/allinone-v-1)<br/><sup>By **[AXuanCreator](https://github.com/AXuanCreator)** on **2025-02-06**</sup> | 创新・未来・卓越<br/>`编程` `低成本` `简洁回答` |
358
+ | [命理研究员](https://lobechat.com/discover/assistant/fate-researcher)<br/><sup>By **[Jack980506](https://github.com/Jack980506)** on **2025-02-06**</sup> | 精通八字命<br/>`命理学` `八字` `传统文化` |
359
359
 
360
- > 📊 Total agents: [<kbd>**486**</kbd> ](https://lobechat.com/discover/assistants)
360
+ > 📊 Total agents: [<kbd>**487**</kbd> ](https://lobechat.com/discover/assistants)
361
361
 
362
362
  <!-- AGENT LIST -->
363
363
 
package/changelog/v1.json CHANGED
@@ -1,4 +1,18 @@
1
1
  [
2
+ {
3
+ "children": {},
4
+ "date": "2025-02-18",
5
+ "version": "1.60.9"
6
+ },
7
+ {
8
+ "children": {
9
+ "improvements": [
10
+ "Sync chat limit."
11
+ ]
12
+ },
13
+ "date": "2025-02-18",
14
+ "version": "1.60.8"
15
+ },
2
16
  {
3
17
  "children": {
4
18
  "improvements": [
@@ -128,6 +128,6 @@ We provide a [Docker image][docker-release-link] for deploying the LobeChat serv
128
128
  [docker-pulls-link]: https://hub.docker.com/r/lobehub/lobe-chat
129
129
  [docker-pulls-shield]: https://img.shields.io/docker/pulls/lobehub/lobe-chat?color=45cc11&labelColor=black&style=flat-square
130
130
  [docker-release-link]: https://hub.docker.com/r/lobehub/lobe-chat
131
- [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square
131
+ [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square&sort=semver
132
132
  [docker-size-link]: https://hub.docker.com/r/lobehub/lobe-chat
133
- [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat?color=369eff&labelColor=black&style=flat-square
133
+ [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat?color=369eff&labelColor=black&style=flat-square&sort=semver
@@ -12,11 +12,11 @@ tags:
12
12
  # Docker Compose 部署指引
13
13
 
14
14
  <div style={{display:"flex", gap: 4}}>
15
- [![](https://img.shields.io/docker/v/lobehub/lobe-chat?color=369eff\&label=docker\&labelColor=black\&logo=docker\&logoColor=white\&style=flat-square)](https://hub.docker.com/r/lobehub/lobe-chat)
15
+ [![][docker-release-shield]][docker-release-link]
16
16
 
17
- [![](https://img.shields.io/docker/image-size/lobehub/lobe-chat?color=369eff\&labelColor=black\&style=flat-square)](https://img.shields.io/docker/image-size/lobehub/lobe-chat?color=369eff\&labelColor=black\&style=flat-square)
17
+ [![][docker-size-shield]][docker-size-link]
18
18
 
19
- [![](https://img.shields.io/docker/pulls/lobehub/lobe-chat?color=45cc11\&labelColor=black\&style=flat-square)](https://img.shields.io/docker/pulls/lobehub/lobe-chat?color=45cc11\&labelColor=black\&style=flat-square)
19
+ [![][docker-pulls-shield]][docker-pulls-link]
20
20
  </div>
21
21
 
22
22
  我们提供了 [Docker 镜像](https://hub.docker.com/r/lobehub/lobe-chat) ,供你在自己的私有设备上部署 LobeChat 服务。
@@ -121,3 +121,12 @@ tags:
121
121
  */5 * * * * /path/to/auto-update-lobe-chat.sh >> /path/to/auto-update-lobe-chat.log 2>&1
122
122
  ```
123
123
  </Steps>
124
+
125
+
126
+
127
+ [docker-pulls-link]: https://hub.docker.com/r/lobehub/lobe-chat
128
+ [docker-pulls-shield]: https://img.shields.io/docker/pulls/lobehub/lobe-chat?color=45cc11&labelColor=black&style=flat-square
129
+ [docker-release-link]: https://hub.docker.com/r/lobehub/lobe-chat
130
+ [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square&sort=semver
131
+ [docker-size-link]: https://hub.docker.com/r/lobehub/lobe-chat
132
+ [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat?color=369eff&labelColor=black&style=flat-square&sort=semver
@@ -159,6 +159,6 @@ We provide a [Docker image][docker-release-link] for you to deploy the LobeChat
159
159
  [docker-pulls-link]: https://hub.docker.com/r/lobehub/lobe-chat
160
160
  [docker-pulls-shield]: https://img.shields.io/docker/pulls/lobehub/lobe-chat?color=45cc11&labelColor=black&style=flat-square
161
161
  [docker-release-link]: https://hub.docker.com/r/lobehub/lobe-chat
162
- [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square
162
+ [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square&sort=semver
163
163
  [docker-size-link]: https://hub.docker.com/r/lobehub/lobe-chat
164
- [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat?color=369eff&labelColor=black&style=flat-square
164
+ [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat?color=369eff&labelColor=black&style=flat-square&sort=semver
@@ -204,6 +204,6 @@ API Key 是使用 LobeChat 进行大语言模型会话的必要信息,本节
204
204
  [docker-pulls-link]: https://hub.docker.com/r/lobehub/lobe-chat
205
205
  [docker-pulls-shield]: https://img.shields.io/docker/pulls/lobehub/lobe-chat?color=45cc11&labelColor=black&style=flat-square
206
206
  [docker-release-link]: https://hub.docker.com/r/lobehub/lobe-chat
207
- [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square
207
+ [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square&sort=semver
208
208
  [docker-size-link]: https://hub.docker.com/r/lobehub/lobe-chat
209
- [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat?color=369eff&labelColor=black&style=flat-square
209
+ [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat?color=369eff&labelColor=black&style=flat-square&sort=semver
@@ -821,6 +821,6 @@ networks:
821
821
  [docker-pulls-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
822
822
  [docker-pulls-shield]: https://img.shields.io/docker/pulls/lobehub/lobe-chat-database?color=45cc11&labelColor=black&style=flat-square
823
823
  [docker-release-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
824
- [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat-database?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square
824
+ [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat-database?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square&sort=semver
825
825
  [docker-size-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
826
- [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat-database?color=369eff&labelColor=black&style=flat-square
826
+ [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat-database?color=369eff&labelColor=black&style=flat-square&sort=semver
@@ -825,6 +825,6 @@ networks:
825
825
  [docker-pulls-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
826
826
  [docker-pulls-shield]: https://img.shields.io/docker/pulls/lobehub/lobe-chat-database?color=45cc11&labelColor=black&style=flat-square
827
827
  [docker-release-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
828
- [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat-database?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square
828
+ [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat-database?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square&sort=semver
829
829
  [docker-size-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
830
- [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat-database?color=369eff&labelColor=black&style=flat-square
830
+ [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat-database?color=369eff&labelColor=black&style=flat-square&sort=semver
@@ -165,6 +165,6 @@ $ docker run -it -d --name lobe-chat-database -p 3210:3210 \
165
165
  [docker-pulls-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
166
166
  [docker-pulls-shield]: https://img.shields.io/docker/pulls/lobehub/lobe-chat-database?color=45cc11&labelColor=black&style=flat-square
167
167
  [docker-release-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
168
- [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat-database?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square
168
+ [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat-database?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square&sort=semver
169
169
  [docker-size-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
170
- [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat-database?color=369eff&labelColor=black&style=flat-square
170
+ [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat-database?color=369eff&labelColor=black&style=flat-square&sort=semver
@@ -166,6 +166,6 @@ $ docker run -it -d --name lobe-chat-database -p 3210:3210 \
166
166
  [docker-pulls-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
167
167
  [docker-pulls-shield]: https://img.shields.io/docker/pulls/lobehub/lobe-chat-database?color=45cc11&labelColor=black&style=flat-square
168
168
  [docker-release-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
169
- [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat-database?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square
169
+ [docker-release-shield]: https://img.shields.io/docker/v/lobehub/lobe-chat-database?color=369eff&label=docker&labelColor=black&logo=docker&logoColor=white&style=flat-square&sort=semver
170
170
  [docker-size-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
171
- [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat-database?color=369eff&labelColor=black&style=flat-square
171
+ [docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat-database?color=369eff&labelColor=black&style=flat-square&sort=semver
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/chat",
3
- "version": "1.60.7",
3
+ "version": "1.60.9",
4
4
  "description": "Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.",
5
5
  "keywords": [
6
6
  "framework",
@@ -94,7 +94,7 @@ const AgentChat = memo(() => {
94
94
  valuePropName: 'checked',
95
95
  },
96
96
  {
97
- children: <SliderWithInput max={32} min={1} />,
97
+ children: <SliderWithInput max={20} min={0} />,
98
98
  desc: t('settingChat.historyCount.desc'),
99
99
  divider: false,
100
100
  hidden: !enableHistoryCount,
@@ -0,0 +1,255 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+
3
+ import { lambdaClient } from '@/libs/trpc/client';
4
+ import { LobeSessionType } from '@/types/session';
5
+
6
+ import { ServerService } from './server';
7
+
8
+ vi.mock('@/libs/trpc/client', () => ({
9
+ lambdaClient: {
10
+ session: {
11
+ createSession: { mutate: vi.fn() },
12
+ batchCreateSessions: { mutate: vi.fn() },
13
+ cloneSession: { mutate: vi.fn() },
14
+ getGroupedSessions: { query: vi.fn() },
15
+ countSessions: { query: vi.fn() },
16
+ rankSessions: { query: vi.fn() },
17
+ updateSession: { mutate: vi.fn() },
18
+ updateSessionConfig: { mutate: vi.fn() },
19
+ updateSessionChatConfig: { mutate: vi.fn() },
20
+ getSessions: { query: vi.fn() },
21
+ searchSessions: { query: vi.fn() },
22
+ removeSession: { mutate: vi.fn() },
23
+ removeAllSessions: { mutate: vi.fn() },
24
+ },
25
+ agent: {
26
+ getAgentConfig: { query: vi.fn() },
27
+ },
28
+ sessionGroup: {
29
+ createSessionGroup: { mutate: vi.fn() },
30
+ getSessionGroup: { query: vi.fn() },
31
+ removeSessionGroup: { mutate: vi.fn() },
32
+ removeAllSessionGroups: { mutate: vi.fn() },
33
+ updateSessionGroup: { mutate: vi.fn() },
34
+ updateSessionGroupOrder: { mutate: vi.fn() },
35
+ },
36
+ },
37
+ }));
38
+
39
+ describe('ServerService', () => {
40
+ let service: ServerService;
41
+
42
+ beforeEach(() => {
43
+ vi.clearAllMocks();
44
+ service = new ServerService();
45
+ });
46
+
47
+ it('hasSessions should return true if count is 0', async () => {
48
+ vi.mocked(lambdaClient.session.countSessions.query).mockResolvedValue(0);
49
+ const result = await service.hasSessions();
50
+ expect(result).toBe(true);
51
+ });
52
+
53
+ it('createSession should call lambdaClient with correct params', async () => {
54
+ const mockData = {
55
+ config: {
56
+ model: 'gpt-3.5',
57
+ params: {},
58
+ systemRole: '',
59
+ chatConfig: {
60
+ autoCreateTopicThreshold: 2,
61
+ compressThreshold: 10,
62
+ enableAutoCreateTopic: true,
63
+ enableCompressThreshold: true,
64
+ maxTokens: 2000,
65
+ model: 'gpt-3.5-turbo',
66
+ params: {},
67
+ temperature: 0.7,
68
+ title: 'test',
69
+ },
70
+ tts: {
71
+ showAllLocaleVoice: false,
72
+ sttLocale: 'auto',
73
+ ttsService: 'openai' as const,
74
+ voice: {
75
+ model: 'tts-1',
76
+ name: 'alloy',
77
+ type: 'tts',
78
+ openai: 'voice-id',
79
+ },
80
+ },
81
+ },
82
+ group: 'testGroup',
83
+ meta: { description: 'test' },
84
+ title: 'Test Session',
85
+ };
86
+
87
+ await service.createSession(LobeSessionType.Agent, mockData);
88
+
89
+ expect(lambdaClient.session.createSession.mutate).toBeCalledWith({
90
+ config: { ...mockData.config, description: 'test' },
91
+ session: { title: 'Test Session', groupId: 'testGroup' },
92
+ type: LobeSessionType.Agent,
93
+ });
94
+ });
95
+
96
+ it('batchCreateSessions should call lambdaClient', async () => {
97
+ const mockSessions = [
98
+ {
99
+ id: '1',
100
+ title: 'Test',
101
+ config: {
102
+ model: 'gpt-3.5',
103
+ params: {},
104
+ systemRole: '',
105
+ chatConfig: {
106
+ autoCreateTopicThreshold: 2,
107
+ compressThreshold: 10,
108
+ enableAutoCreateTopic: true,
109
+ enableCompressThreshold: true,
110
+ maxTokens: 2000,
111
+ model: 'gpt-3.5-turbo',
112
+ params: {},
113
+ temperature: 0.7,
114
+ title: 'test',
115
+ },
116
+ tts: {
117
+ showAllLocaleVoice: false,
118
+ sttLocale: 'auto',
119
+ ttsService: 'openai' as const,
120
+ voice: {
121
+ model: 'tts-1',
122
+ name: 'alloy',
123
+ type: 'tts',
124
+ openai: 'voice-id',
125
+ },
126
+ },
127
+ },
128
+ createdAt: new Date(),
129
+ meta: { description: 'test' },
130
+ model: 'gpt-3.5',
131
+ type: LobeSessionType.Agent,
132
+ updatedAt: new Date(),
133
+ },
134
+ ];
135
+
136
+ await service.batchCreateSessions(mockSessions as any);
137
+ expect(lambdaClient.session.batchCreateSessions.mutate).toBeCalledWith(mockSessions);
138
+ });
139
+
140
+ it('cloneSession should call lambdaClient', async () => {
141
+ await service.cloneSession('123', 'New Title');
142
+ expect(lambdaClient.session.cloneSession.mutate).toBeCalledWith({
143
+ id: '123',
144
+ newTitle: 'New Title',
145
+ });
146
+ });
147
+
148
+ it('getGroupedSessions should call lambdaClient', async () => {
149
+ await service.getGroupedSessions();
150
+ expect(lambdaClient.session.getGroupedSessions.query).toBeCalled();
151
+ });
152
+
153
+ it('countSessions should call lambdaClient with params', async () => {
154
+ const params = { startDate: '2023-01-01' };
155
+ await service.countSessions(params);
156
+ expect(lambdaClient.session.countSessions.query).toBeCalledWith(params);
157
+ });
158
+
159
+ it('rankSessions should call lambdaClient with limit', async () => {
160
+ await service.rankSessions(10);
161
+ expect(lambdaClient.session.rankSessions.query).toBeCalledWith(10);
162
+ });
163
+
164
+ it('updateSession should call lambdaClient with correct params', async () => {
165
+ const mockData = {
166
+ group: 'default',
167
+ pinned: true,
168
+ meta: { description: 'bar' },
169
+ updatedAt: new Date(),
170
+ };
171
+
172
+ await service.updateSession('123', mockData);
173
+
174
+ expect(lambdaClient.session.updateSession.mutate).toBeCalledWith({
175
+ id: '123',
176
+ value: {
177
+ groupId: null,
178
+ pinned: true,
179
+ description: 'bar',
180
+ updatedAt: mockData.updatedAt,
181
+ },
182
+ });
183
+ });
184
+
185
+ it('getSessionConfig should call lambdaClient', async () => {
186
+ await service.getSessionConfig('123');
187
+ expect(lambdaClient.agent.getAgentConfig.query).toBeCalledWith({ sessionId: '123' });
188
+ });
189
+
190
+ it('updateSessionConfig should call lambdaClient', async () => {
191
+ const config = { model: 'gpt-4' };
192
+ const signal = new AbortController().signal;
193
+ await service.updateSessionConfig('123', config, signal);
194
+ expect(lambdaClient.session.updateSessionConfig.mutate).toBeCalledWith(
195
+ { id: '123', value: config },
196
+ { signal },
197
+ );
198
+ });
199
+
200
+ it('getSessionsByType should call lambdaClient', async () => {
201
+ await service.getSessionsByType('all');
202
+ expect(lambdaClient.session.getSessions.query).toBeCalledWith({});
203
+ });
204
+
205
+ it('searchSessions should call lambdaClient with keywords', async () => {
206
+ await service.searchSessions('test');
207
+ expect(lambdaClient.session.searchSessions.query).toBeCalledWith({ keywords: 'test' });
208
+ });
209
+
210
+ it('removeSession should call lambdaClient', async () => {
211
+ await service.removeSession('123');
212
+ expect(lambdaClient.session.removeSession.mutate).toBeCalledWith({ id: '123' });
213
+ });
214
+
215
+ it('removeAllSessions should call lambdaClient', async () => {
216
+ await service.removeAllSessions();
217
+ expect(lambdaClient.session.removeAllSessions.mutate).toBeCalled();
218
+ });
219
+
220
+ it('createSessionGroup should call lambdaClient', async () => {
221
+ await service.createSessionGroup('Test Group', 1);
222
+ expect(lambdaClient.sessionGroup.createSessionGroup.mutate).toBeCalledWith({
223
+ name: 'Test Group',
224
+ sort: 1,
225
+ });
226
+ });
227
+
228
+ it('getSessionGroups should call lambdaClient', async () => {
229
+ await service.getSessionGroups();
230
+ expect(lambdaClient.sessionGroup.getSessionGroup.query).toBeCalled();
231
+ });
232
+
233
+ it('removeSessionGroup should call lambdaClient', async () => {
234
+ await service.removeSessionGroup('123', true);
235
+ expect(lambdaClient.sessionGroup.removeSessionGroup.mutate).toBeCalledWith({
236
+ id: '123',
237
+ removeChildren: true,
238
+ });
239
+ });
240
+
241
+ it('updateSessionGroup should call lambdaClient', async () => {
242
+ const value = { name: 'Updated Group' };
243
+ await service.updateSessionGroup('123', value);
244
+ expect(lambdaClient.sessionGroup.updateSessionGroup.mutate).toBeCalledWith({
245
+ id: '123',
246
+ value,
247
+ });
248
+ });
249
+
250
+ it('updateSessionGroupOrder should call lambdaClient', async () => {
251
+ const sortMap = [{ id: '123', sort: 1 }];
252
+ await service.updateSessionGroupOrder(sortMap);
253
+ expect(lambdaClient.sessionGroup.updateSessionGroupOrder.mutate).toBeCalledWith({ sortMap });
254
+ });
255
+ });