Commit 518627ca by Archer Committed by GitHub

fix: getquote api auth error (#6792)

* deploy doc

* perf: completions api support null

* fix: getquote api auth error
parent 4fbf8430
...@@ -497,10 +497,15 @@ services: ...@@ -497,10 +497,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -475,10 +475,15 @@ services: ...@@ -475,10 +475,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -457,10 +457,15 @@ services: ...@@ -457,10 +457,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -456,10 +456,15 @@ services: ...@@ -456,10 +456,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -462,10 +462,15 @@ services: ...@@ -462,10 +462,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -439,10 +439,15 @@ services: ...@@ -439,10 +439,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -497,10 +497,15 @@ services: ...@@ -497,10 +497,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -475,10 +475,15 @@ services: ...@@ -475,10 +475,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -457,10 +457,15 @@ services: ...@@ -457,10 +457,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -456,10 +456,15 @@ services: ...@@ -456,10 +456,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -462,10 +462,15 @@ services: ...@@ -462,10 +462,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -439,10 +439,15 @@ services: ...@@ -439,10 +439,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -438,10 +438,15 @@ ${{vec.db}} ...@@ -438,10 +438,15 @@ ${{vec.db}}
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -497,10 +497,15 @@ services: ...@@ -497,10 +497,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -475,10 +475,15 @@ services: ...@@ -475,10 +475,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -457,10 +457,15 @@ services: ...@@ -457,10 +457,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -456,10 +456,15 @@ services: ...@@ -456,10 +456,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -462,10 +462,15 @@ services: ...@@ -462,10 +462,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -439,10 +439,15 @@ services: ...@@ -439,10 +439,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -497,10 +497,15 @@ services: ...@@ -497,10 +497,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -475,10 +475,15 @@ services: ...@@ -475,10 +475,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -457,10 +457,15 @@ services: ...@@ -457,10 +457,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -456,10 +456,15 @@ services: ...@@ -456,10 +456,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -462,10 +462,15 @@ services: ...@@ -462,10 +462,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -439,10 +439,15 @@ services: ...@@ -439,10 +439,15 @@ services:
retries: 10 retries: 10
networks: networks:
data: data:
name: fastgpt_data
app: app:
name: fastgpt_app
codesandbox: codesandbox:
name: fastgpt_codesandbox
opensandbox: opensandbox:
name: fastgpt_opensandbox
aiproxy: aiproxy:
name: fastgpt_aiproxy
volumes: volumes:
fastgpt-pg: fastgpt-pg:
......
...@@ -12,19 +12,19 @@ const WebCompletionsSchema = z.object({ ...@@ -12,19 +12,19 @@ const WebCompletionsSchema = z.object({
chatId: z chatId: z
.string() .string()
.max(1024) .max(1024)
.optional() .nullish()
.meta({ description: '聊天ID, 传入的话会自动获取历史记录,不传入则认为是新对话' }), .meta({ description: '聊天ID, 传入的话会自动获取历史记录,不传入则认为是新对话' }),
appId: ObjectIdSchema.optional(), appId: ObjectIdSchema.nullish(),
customUid: z.string().max(1024).optional().meta({ description: '自定义用户ID(分享链接)' }), customUid: z.string().max(1024).nullish().meta({ description: '自定义用户ID(分享链接)' }),
metadata: z.record(z.string(), z.any()).optional().meta({ description: '元数据' }) metadata: z.record(z.string(), z.any()).nullish().meta({ description: '元数据' })
}); });
// completions 接口实际上并没有用完所有字段,所以这里就取局部即可 // completions 接口实际上并没有用完所有字段,所以这里就取局部即可
const ChatCompletionCreateParamsSchema = z.object({ const ChatCompletionCreateParamsSchema = z.object({
messages: z.array(ChatCompletionMessageParamSchema).optional().default([]).meta({ messages: z.array(ChatCompletionMessageParamSchema).nullish().default([]).meta({
description: '消息列表' description: '消息列表'
}), }),
stream: z.boolean().optional().default(false).meta({ stream: z.boolean().nullish().default(false).meta({
description: '是否流式返回' description: '是否流式返回'
}) })
}); });
...@@ -32,23 +32,23 @@ const ChatCompletionCreateParamsSchema = z.object({ ...@@ -32,23 +32,23 @@ const ChatCompletionCreateParamsSchema = z.object({
export const CompletionsPropsSchema = OutLinkChatAuthSchema.extend(WebCompletionsSchema.shape) export const CompletionsPropsSchema = OutLinkChatAuthSchema.extend(WebCompletionsSchema.shape)
.extend(ChatCompletionCreateParamsSchema.shape) .extend(ChatCompletionCreateParamsSchema.shape)
.extend({ .extend({
variables: z.record(z.string(), z.any()).optional().default({}).meta({ variables: z.record(z.string(), z.any()).nullish().default({}).meta({
description: '全局变量或插件输入' description: '全局变量或插件输入'
}), }),
responseChatItemId: z responseChatItemId: z
.string() .string()
.optional() .nullish()
.default(() => getNanoid()) .default(() => getNanoid())
.meta({ .meta({
description: '自定义响应的 assistant 的消息 ID,如果不传入,则自动生成一个' description: '自定义响应的 assistant 的消息 ID,如果不传入,则自动生成一个'
}), }),
detail: z.boolean().optional().default(false).meta({ detail: z.boolean().nullish().default(false).meta({
description: '是否返回详细信息,包括 reasoning_content, tool_calls, usage 等' description: '是否返回详细信息,包括 reasoning_content, tool_calls, usage 等'
}), }),
retainDatasetCite: z.boolean().optional().default(false).meta({ retainDatasetCite: z.boolean().nullish().default(false).meta({
description: '是否保留数据集引用' description: '是否保留数据集引用'
}), }),
showSkillReferences: z.boolean().optional().default(false).meta({ showSkillReferences: z.boolean().nullish().default(false).meta({
description: '是否显示技能引用' description: '是否显示技能引用'
}) })
}); });
...@@ -129,12 +129,12 @@ export const ChatTestPropsSchema = z.object({ ...@@ -129,12 +129,12 @@ export const ChatTestPropsSchema = z.object({
messages: z.array(ChatCompletionMessageParamSchema).meta({ description: '消息列表' }), messages: z.array(ChatCompletionMessageParamSchema).meta({ description: '消息列表' }),
responseChatItemId: z responseChatItemId: z
.string() .string()
.optional() .nullish()
.meta({ description: '自定义响应的 assistant 的消息 ID,如果不传入,则自动生成一个' }), .meta({ description: '自定义响应的 assistant 的消息 ID,如果不传入,则自动生成一个' }),
nodes: z.array(OpenAPIStoreNodeItemTypeSchema).meta({ description: '节点列表' }), nodes: z.array(OpenAPIStoreNodeItemTypeSchema).meta({ description: '节点列表' }),
edges: z.array(StoreEdgeItemTypeSchema).meta({ description: '边列表' }), edges: z.array(StoreEdgeItemTypeSchema).meta({ description: '边列表' }),
chatConfig: AppChatConfigTypeSchema.meta({ description: '聊天配置' }), chatConfig: AppChatConfigTypeSchema.meta({ description: '聊天配置' }),
variables: z.record(z.string(), z.any()).optional().default({}).meta({ variables: z.record(z.string(), z.any()).nullish().default({}).meta({
description: '全局变量或插件输入' description: '全局变量或插件输入'
}), }),
appId: ObjectIdSchema.meta({ description: '应用ID' }), appId: ObjectIdSchema.meta({ description: '应用ID' }),
......
...@@ -70,33 +70,29 @@ export type DeleteDatasetDataQuery = z.infer<typeof DeleteDatasetDataQuerySchema ...@@ -70,33 +70,29 @@ export type DeleteDatasetDataQuery = z.infer<typeof DeleteDatasetDataQuerySchema
* API: 获取引用数据 * API: 获取引用数据
* Route: POST /api/core/dataset/data/getQuoteData * Route: POST /api/core/dataset/data/getQuoteData
* ============================================================================ */ * ============================================================================ */
export const GetQuoteDataBodySchema = z.union([ export const GetQuoteDataBodySchema = OutLinkChatAuthSchema.extend({
z.object({ id: ObjectIdSchema.meta({
id: ObjectIdSchema.meta({ example: '68ad85a7463006c963799a05',
example: '68ad85a7463006c963799a05', description: '数据 ID'
description: '数据 ID'
})
}), }),
OutLinkChatAuthSchema.extend({ // 对话模式下的额外字段(三者必须同时提供,否则走 API 模式)
id: ObjectIdSchema.meta({ appId: ObjectIdSchema.optional().meta({
example: '68ad85a7463006c963799a05', example: '68ad85a7463006c963799a10',
description: '数据 ID' description: '应用 ID(对话模式必填)'
}), }),
// 对话模式下的额外字段(可选) chatId: z.string().optional().meta({
appId: ObjectIdSchema.meta({ example: '68ad85a7463006c963799a11',
example: '68ad85a7463006c963799a10', description: '对话 ID(对话模式必填)'
description: '应用 ID(对话模式必填)' }),
}), chatItemDataId: z.string().optional().meta({
chatId: z.string().meta({ example: '68ad85a7463006c963799a12',
example: '68ad85a7463006c963799a11', description: '对话条目数据 ID(对话模式必填)'
description: '对话 ID(对话模式必填)'
}),
chatItemDataId: z.string().meta({
example: '68ad85a7463006c963799a12',
description: '对话条目数据 ID(对话模式必填)'
})
}) })
]); }).refine(
(d) =>
(!!d.chatId && !!d.appId && !!d.chatItemDataId) || (!d.chatId && !d.appId && !d.chatItemDataId),
{ message: '对话模式下 appId / chatId / chatItemDataId 必须同时提供' }
);
export type GetQuoteDataBody = z.infer<typeof GetQuoteDataBodySchema>; export type GetQuoteDataBody = z.infer<typeof GetQuoteDataBodySchema>;
export const GetQuoteDataResponseSchema = z.object({ export const GetQuoteDataResponseSchema = z.object({
......
...@@ -136,8 +136,17 @@ const nextConfig: NextConfig = { ...@@ -136,8 +136,17 @@ const nextConfig: NextConfig = {
} }
if (isServer) { if (isServer) {
// 这些包只在服务端运行,且内部使用动态 import / 原生可选依赖(ws 的 bufferutil、
// utf-8-validate,pi-ai 的 node:os/provider dynamicImport 等),让 webpack 直接
// externalize,避免扫描源码产生 Critical dependency / Module not found 警告。
config.externals.push({ config.externals.push({
'@node-rs/jieba': '@node-rs/jieba' '@node-rs/jieba': '@node-rs/jieba',
'@mariozechner/pi-ai': 'commonjs @mariozechner/pi-ai',
'@mariozechner/pi-agent-core': 'commonjs @mariozechner/pi-agent-core',
'@google/genai': 'commonjs @google/genai',
ws: 'commonjs ws',
bufferutil: 'commonjs bufferutil',
'utf-8-validate': 'commonjs utf-8-validate'
}); });
} }
......
...@@ -21,7 +21,7 @@ async function handler(req: ApiRequestProps): Promise<GetQuoteDataResponse> { ...@@ -21,7 +21,7 @@ async function handler(req: ApiRequestProps): Promise<GetQuoteDataResponse> {
// Auth // Auth
const { collection, q, a } = await (async () => { const { collection, q, a } = await (async () => {
if ('chatId' in body) { if (body.chatId && body.appId && body.chatItemDataId) {
const { appId, chatId, shareId, outLinkUid, teamId, teamToken, chatItemDataId } = body; const { appId, chatId, shareId, outLinkUid, teamId, teamToken, chatItemDataId } = body;
await authChatCrud({ await authChatCrud({
req, req,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment