@lobehub/chat 1.107.6 → 1.108.1
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.
- package/.env.example +5 -0
- package/CHANGELOG.md +58 -0
- package/Dockerfile +2 -0
- package/Dockerfile.database +3 -1
- package/Dockerfile.pglite +3 -1
- package/README.md +3 -2
- package/README.zh-CN.md +3 -2
- package/changelog/v1.json +21 -0
- package/docs/usage/providers/ai302.mdx +45 -0
- package/docs/usage/providers/ai302.zh-CN.mdx +45 -0
- package/package.json +2 -2
- package/packages/types/src/user/settings/keyVaults.ts +1 -0
- package/src/app/(backend)/trpc/desktop/[trpc]/route.ts +1 -1
- package/src/app/[variants]/(main)/settings/llm/ProviderList/providers.tsx +2 -0
- package/src/app/[variants]/layout.tsx +1 -0
- package/src/config/aiModels/ai302.ts +148 -0
- package/src/config/aiModels/index.ts +3 -0
- package/src/config/llm.ts +7 -0
- package/src/config/modelProviders/ai302.ts +149 -0
- package/src/config/modelProviders/index.ts +3 -0
- package/src/database/models/__tests__/_test_template.ts +1 -1
- package/src/database/models/__tests__/agent.test.ts +1 -1
- package/src/database/models/__tests__/aiModel.test.ts +1 -1
- package/src/database/models/__tests__/aiProvider.test.ts +1 -1
- package/src/database/models/__tests__/asyncTask.test.ts +1 -1
- package/src/database/models/__tests__/chunk.test.ts +1 -1
- package/src/database/models/__tests__/file.test.ts +1 -1
- package/src/database/models/__tests__/generationTopic.test.ts +1 -1
- package/src/database/models/__tests__/knowledgeBase.test.ts +1 -1
- package/src/database/models/__tests__/message.test.ts +1 -1
- package/src/database/models/__tests__/session.test.ts +1 -1
- package/src/database/models/__tests__/sessionGroup.test.ts +1 -1
- package/src/database/models/__tests__/topic.test.ts +1 -1
- package/src/database/models/_template.ts +1 -1
- package/src/database/models/agent.ts +1 -1
- package/src/database/models/aiModel.ts +1 -1
- package/src/database/models/aiProvider.ts +1 -1
- package/src/database/models/apiKey.ts +1 -1
- package/src/database/models/asyncTask.ts +1 -1
- package/src/database/models/chunk.ts +1 -2
- package/src/database/models/document.ts +1 -1
- package/src/database/models/embedding.ts +1 -2
- package/src/database/models/file.ts +1 -2
- package/src/database/models/generationTopic.ts +1 -1
- package/src/database/models/knowledgeBase.ts +1 -1
- package/src/database/models/message.ts +1 -2
- package/src/database/models/plugin.ts +1 -1
- package/src/database/models/session.ts +15 -2
- package/src/database/models/sessionGroup.ts +1 -1
- package/src/database/models/thread.ts +1 -1
- package/src/database/models/topic.ts +1 -2
- package/src/database/models/user.ts +1 -1
- package/src/database/repositories/dataExporter/index.ts +1 -1
- package/src/database/repositories/dataImporter/__tests__/index.test.ts +1 -1
- package/src/database/repositories/dataImporter/deprecated/__tests__/index.test.ts +1 -1
- package/src/database/repositories/dataImporter/deprecated/index.ts +1 -2
- package/src/database/repositories/dataImporter/index.ts +1 -1
- package/src/database/server/models/__tests__/adapter.test.ts +1 -1
- package/src/database/server/models/__tests__/nextauth.test.ts +1 -1
- package/src/database/server/models/__tests__/user.test.ts +1 -1
- package/src/database/server/models/ragEval/dataset.ts +1 -1
- package/src/database/server/models/ragEval/datasetRecord.ts +1 -1
- package/src/database/server/models/ragEval/evaluation.ts +1 -2
- package/src/database/server/models/ragEval/evaluationRecord.ts +1 -1
- package/src/database/utils/genWhere.ts +1 -2
- package/src/features/User/UserAvatar.tsx +18 -2
- package/src/libs/model-runtime/ai302/index.ts +46 -0
- package/src/libs/model-runtime/runtimeMap.ts +2 -0
- package/src/libs/model-runtime/types/type.ts +1 -0
- package/src/libs/next-auth/adapter/index.ts +1 -1
- package/src/libs/oidc-provider/adapter.ts +1 -2
- package/src/server/routers/lambda/chunk.ts +1 -1
- package/src/services/session/client.test.ts +1 -1
- package/src/styles/antdOverride.ts +6 -0
@@ -1,6 +1,7 @@
|
|
1
1
|
import { ChatModelCard, ModelProviderCard } from '@/types/llm';
|
2
2
|
|
3
3
|
import Ai21Provider from './ai21';
|
4
|
+
import Ai302Provider from './ai302';
|
4
5
|
import Ai360Provider from './ai360';
|
5
6
|
import AiHubMixProvider from './aihubmix';
|
6
7
|
import AnthropicProvider from './anthropic';
|
@@ -169,6 +170,7 @@ export const DEFAULT_MODEL_PROVIDER_LIST = [
|
|
169
170
|
Search1APIProvider,
|
170
171
|
InfiniAIProvider,
|
171
172
|
QiniuProvider,
|
173
|
+
Ai302Provider,
|
172
174
|
];
|
173
175
|
|
174
176
|
export const filterEnabledModels = (provider: ModelProviderCard) => {
|
@@ -181,6 +183,7 @@ export const isProviderDisableBrowserRequest = (id: string) => {
|
|
181
183
|
};
|
182
184
|
|
183
185
|
export { default as Ai21ProviderCard } from './ai21';
|
186
|
+
export { default as Ai302ProviderCard } from './ai302';
|
184
187
|
export { default as Ai360ProviderCard } from './ai360';
|
185
188
|
export { default as AiHubMixProviderCard } from './aihubmix';
|
186
189
|
export { default as AnthropicProviderCard } from './anthropic';
|
@@ -1,5 +1,4 @@
|
|
1
|
-
import { cosineDistance, count, sql } from 'drizzle-orm';
|
2
|
-
import { and, asc, desc, eq, inArray, isNull } from 'drizzle-orm/expressions';
|
1
|
+
import { and, asc, cosineDistance, count, desc, eq, inArray, isNull, sql } from 'drizzle-orm';
|
3
2
|
import { chunk } from 'lodash-es';
|
4
3
|
|
5
4
|
import { LobeChatDatabase } from '@/database/type';
|
@@ -1,5 +1,4 @@
|
|
1
|
-
import { count, sum } from 'drizzle-orm';
|
2
|
-
import { and, asc, desc, eq, ilike, inArray, like, notExists, or } from 'drizzle-orm/expressions';
|
1
|
+
import { and, asc, count, desc, eq, ilike, inArray, like, notExists, or, sum } from 'drizzle-orm';
|
3
2
|
import type { PgTransaction } from 'drizzle-orm/pg-core';
|
4
3
|
|
5
4
|
import { LobeChatDatabase, Transaction } from '@/database/type';
|
@@ -1,7 +1,6 @@
|
|
1
1
|
import type { HeatmapsProps } from '@lobehub/charts';
|
2
2
|
import dayjs from 'dayjs';
|
3
|
-
import { count, sql } from 'drizzle-orm';
|
4
|
-
import { and, asc, desc, eq, gt, inArray, isNotNull, isNull, like } from 'drizzle-orm/expressions';
|
3
|
+
import { and, asc, count, desc, eq, gt, inArray, isNotNull, isNull, like, sql } from 'drizzle-orm';
|
5
4
|
|
6
5
|
import { LobeChatDatabase } from '@/database/type';
|
7
6
|
import {
|
@@ -1,5 +1,18 @@
|
|
1
|
-
import {
|
2
|
-
|
1
|
+
import {
|
2
|
+
Column,
|
3
|
+
and,
|
4
|
+
asc,
|
5
|
+
count,
|
6
|
+
desc,
|
7
|
+
eq,
|
8
|
+
gt,
|
9
|
+
inArray,
|
10
|
+
isNull,
|
11
|
+
like,
|
12
|
+
not,
|
13
|
+
or,
|
14
|
+
sql,
|
15
|
+
} from 'drizzle-orm';
|
3
16
|
import type { PartialDeep } from 'type-fest';
|
4
17
|
|
5
18
|
import { DEFAULT_INBOX_AVATAR } from '@/const/meta';
|
@@ -1,5 +1,4 @@
|
|
1
|
-
import { count, sql } from 'drizzle-orm';
|
2
|
-
import { and, desc, eq, gt, ilike, inArray, isNull } from 'drizzle-orm/expressions';
|
1
|
+
import { and, count, desc, eq, gt, ilike, inArray, isNull, sql } from 'drizzle-orm';
|
3
2
|
|
4
3
|
import { LobeChatDatabase } from '@/database/type';
|
5
4
|
import {
|
@@ -5,7 +5,7 @@ import type {
|
|
5
5
|
AdapterUser,
|
6
6
|
VerificationToken,
|
7
7
|
} from '@auth/core/adapters';
|
8
|
-
import { eq } from 'drizzle-orm
|
8
|
+
import { eq } from 'drizzle-orm';
|
9
9
|
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
|
10
10
|
|
11
11
|
import { getTestDBInstance } from '@/database/core/dbForTest';
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { TRPCError } from '@trpc/server';
|
2
2
|
import dayjs from 'dayjs';
|
3
|
-
import { eq } from 'drizzle-orm
|
3
|
+
import { eq } from 'drizzle-orm';
|
4
4
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
5
5
|
|
6
6
|
import { INBOX_SESSION_ID } from '@/const/session';
|
@@ -1,6 +1,5 @@
|
|
1
1
|
import dayjs, { Dayjs } from 'dayjs';
|
2
|
-
import { SQL } from 'drizzle-orm';
|
3
|
-
import { and, gte, lte } from 'drizzle-orm/expressions';
|
2
|
+
import { SQL, and, gte, lte } from 'drizzle-orm';
|
4
3
|
|
5
4
|
export const genWhere = (sqls: (SQL<any> | undefined)[]): SQL<any> | undefined => {
|
6
5
|
const where = sqls.filter(Boolean);
|
@@ -2,10 +2,13 @@
|
|
2
2
|
|
3
3
|
import { Avatar, type AvatarProps } from '@lobehub/ui';
|
4
4
|
import { createStyles } from 'antd-style';
|
5
|
-
import { forwardRef } from 'react';
|
5
|
+
import { forwardRef, useMemo } from 'react';
|
6
6
|
|
7
7
|
import { BRANDING_NAME } from '@/const/branding';
|
8
8
|
import { DEFAULT_USER_AVATAR_URL } from '@/const/meta';
|
9
|
+
import { isDesktop } from '@/const/version';
|
10
|
+
import { useElectronStore } from '@/store/electron';
|
11
|
+
import { electronSyncSelectors } from '@/store/electron/selectors';
|
9
12
|
import { useUserStore } from '@/store/user';
|
10
13
|
import { authSelectors, userProfileSelectors } from '@/store/user/selectors';
|
11
14
|
|
@@ -54,11 +57,24 @@ const UserAvatar = forwardRef<HTMLDivElement, UserAvatarProps>(
|
|
54
57
|
]);
|
55
58
|
|
56
59
|
const isSignedIn = useUserStore(authSelectors.isLogin);
|
60
|
+
const remoteServerUrl = useElectronStore(electronSyncSelectors.remoteServerUrl);
|
61
|
+
|
62
|
+
// Process avatar URL for desktop environment
|
63
|
+
const avatarUrl = useMemo(() => {
|
64
|
+
if (!isSignedIn || !avatar) return DEFAULT_USER_AVATAR_URL;
|
65
|
+
|
66
|
+
// If in desktop environment and avatar starts with /, prepend the remote server URL
|
67
|
+
if (isDesktop && avatar.startsWith('/') && remoteServerUrl) {
|
68
|
+
return remoteServerUrl + avatar;
|
69
|
+
}
|
70
|
+
|
71
|
+
return avatar;
|
72
|
+
}, [isSignedIn, avatar, remoteServerUrl]);
|
57
73
|
|
58
74
|
return (
|
59
75
|
<Avatar
|
60
76
|
alt={isSignedIn && !!username ? username : BRANDING_NAME}
|
61
|
-
avatar={
|
77
|
+
avatar={avatarUrl}
|
62
78
|
background={isSignedIn && avatar ? background : 'transparent'}
|
63
79
|
className={cx(clickable && styles.clickable, className)}
|
64
80
|
ref={ref}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
import { AgentRuntimeErrorType } from '../error';
|
2
|
+
import { ChatCompletionErrorPayload, ModelProvider } from '../types';
|
3
|
+
import { processMultiProviderModelList } from '../utils/modelParse';
|
4
|
+
import { createOpenAICompatibleRuntime } from '../utils/openaiCompatibleFactory';
|
5
|
+
|
6
|
+
export interface Ai302ModelCard {
|
7
|
+
id: string;
|
8
|
+
}
|
9
|
+
|
10
|
+
export const Lobe302AI = createOpenAICompatibleRuntime({
|
11
|
+
baseURL: 'https://api.302.ai/v1',
|
12
|
+
chatCompletion: {
|
13
|
+
handleError: (error: any): Omit<ChatCompletionErrorPayload, 'provider'> | undefined => {
|
14
|
+
let errorResponse: Response | undefined;
|
15
|
+
if (error instanceof Response) {
|
16
|
+
errorResponse = error;
|
17
|
+
} else if ('status' in (error as any)) {
|
18
|
+
errorResponse = error as Response;
|
19
|
+
}
|
20
|
+
if (errorResponse && errorResponse.status === 401) {
|
21
|
+
return {
|
22
|
+
error: errorResponse.status,
|
23
|
+
errorType: AgentRuntimeErrorType.InvalidProviderAPIKey,
|
24
|
+
};
|
25
|
+
}
|
26
|
+
|
27
|
+
return {
|
28
|
+
error,
|
29
|
+
};
|
30
|
+
},
|
31
|
+
},
|
32
|
+
debug: {
|
33
|
+
chatCompletion: () => process.env.DEBUG_SILICONCLOUD_CHAT_COMPLETION === '1',
|
34
|
+
},
|
35
|
+
errorType: {
|
36
|
+
bizError: AgentRuntimeErrorType.ProviderBizError,
|
37
|
+
invalidAPIKey: AgentRuntimeErrorType.InvalidProviderAPIKey,
|
38
|
+
},
|
39
|
+
models: async ({ client }) => {
|
40
|
+
const modelsPage = (await client.models.list()) as any;
|
41
|
+
const modelList: Ai302ModelCard[] = modelsPage.data;
|
42
|
+
|
43
|
+
return processMultiProviderModelList(modelList);
|
44
|
+
},
|
45
|
+
provider: ModelProvider.Ai302,
|
46
|
+
});
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import { LobeAi21AI } from './ai21';
|
2
|
+
import { Lobe302AI } from './ai302';
|
2
3
|
import { LobeAi360AI } from './ai360';
|
3
4
|
import { LobeAiHubMixAI } from './aihubmix';
|
4
5
|
import { LobeAnthropicAI } from './anthropic';
|
@@ -56,6 +57,7 @@ import { LobeZhipuAI } from './zhipu';
|
|
56
57
|
|
57
58
|
export const providerRuntimeMap = {
|
58
59
|
ai21: LobeAi21AI,
|
60
|
+
ai302: Lobe302AI,
|
59
61
|
ai360: LobeAi360AI,
|
60
62
|
aihubmix: LobeAiHubMixAI,
|
61
63
|
anthropic: LobeAnthropicAI,
|
@@ -4,7 +4,7 @@ import type {
|
|
4
4
|
AdapterUser,
|
5
5
|
VerificationToken,
|
6
6
|
} from '@auth/core/adapters';
|
7
|
-
import { and, eq } from 'drizzle-orm
|
7
|
+
import { and, eq } from 'drizzle-orm';
|
8
8
|
import type { NeonDatabase } from 'drizzle-orm/neon-serverless';
|
9
9
|
import { Adapter, AdapterAccount } from 'next-auth/adapters';
|
10
10
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import { Theme, css } from 'antd-style';
|
2
|
+
import { rgba } from 'polished';
|
2
3
|
|
3
4
|
export default ({ token }: { prefixCls: string; token: Theme }) => css`
|
4
5
|
.${token.prefixCls}-popover {
|
@@ -15,4 +16,9 @@ export default ({ token }: { prefixCls: string; token: Theme }) => css`
|
|
15
16
|
color: ${token.colorText};
|
16
17
|
}
|
17
18
|
}
|
19
|
+
|
20
|
+
.${token.prefixCls}-modal-mask, .${token.prefixCls}-drawer-mask {
|
21
|
+
background: ${rgba(token.colorBgLayout, 0.5)} !important;
|
22
|
+
backdrop-filter: blur(2px);
|
23
|
+
}
|
18
24
|
`;
|