feat(web-ai): support qwen image search safely
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
import type { WebAiCapabilities, WebAiResponse } from '@/types/api';
|
||||
import { apiRequest } from './api';
|
||||
import type { KnowledgeMediaSelectedFile, WebAiCapabilities, WebAiResponse } from '@/types/api';
|
||||
import { apiRequest, apiUrl, authHeaders, readTextPayload } from './api';
|
||||
|
||||
type RawCapabilities = {
|
||||
enabled: boolean;
|
||||
supportsImage?: boolean;
|
||||
provider: string;
|
||||
requiresConsent: boolean;
|
||||
maxQuestionLength: number;
|
||||
@@ -24,6 +25,22 @@ const domainOf = (value: string) => {
|
||||
try { return new URL(value).hostname; } catch { return ''; }
|
||||
};
|
||||
|
||||
const normalizeResponse = (raw: RawWebAiResponse): WebAiResponse => ({
|
||||
requestId: `web:${Date.now()}`,
|
||||
status: raw.status,
|
||||
provider: raw.provider,
|
||||
answer: raw.answer || '',
|
||||
citations: (raw.sources || []).map((source) => ({
|
||||
title: source.title,
|
||||
url: source.url,
|
||||
domain: domainOf(source.url),
|
||||
snippet: source.snippet
|
||||
})),
|
||||
noEvidence: raw.status !== 'OK',
|
||||
warning: raw.notice,
|
||||
redacted: raw.redacted
|
||||
});
|
||||
|
||||
export const getWebAiCapabilities = async (): Promise<WebAiCapabilities> => {
|
||||
const raw = await apiRequest<RawCapabilities>({
|
||||
url: '/api/aihr/web-ai/capabilities',
|
||||
@@ -32,6 +49,7 @@ export const getWebAiCapabilities = async (): Promise<WebAiCapabilities> => {
|
||||
});
|
||||
return {
|
||||
enabled: raw.enabled,
|
||||
supportsImage: raw.supportsImage,
|
||||
requiresConsent: raw.requiresConsent,
|
||||
providerName: raw.provider,
|
||||
maxQuestionLength: raw.maxQuestionLength,
|
||||
@@ -46,19 +64,25 @@ export const queryWebAi = async (question: string, consent: boolean): Promise<We
|
||||
data: { question, consent },
|
||||
timeout: 45000
|
||||
});
|
||||
return {
|
||||
requestId: `web:${Date.now()}`,
|
||||
status: raw.status,
|
||||
provider: raw.provider,
|
||||
answer: raw.answer || '',
|
||||
citations: (raw.sources || []).map((source) => ({
|
||||
title: source.title,
|
||||
url: source.url,
|
||||
domain: domainOf(source.url),
|
||||
snippet: source.snippet
|
||||
})),
|
||||
noEvidence: raw.status !== 'OK',
|
||||
warning: raw.notice,
|
||||
redacted: raw.redacted
|
||||
};
|
||||
return normalizeResponse(raw);
|
||||
};
|
||||
|
||||
export const queryWebAiWithImage = (file: KnowledgeMediaSelectedFile, question: string, consent: boolean) =>
|
||||
new Promise<WebAiResponse>((resolve, reject) => {
|
||||
uni.uploadFile({
|
||||
url: apiUrl('/api/aihr/web-ai/query-image'),
|
||||
filePath: file.path,
|
||||
name: 'file',
|
||||
header: authHeaders(false),
|
||||
formData: { question, consent: String(consent) },
|
||||
timeout: 60000,
|
||||
success: (response) => {
|
||||
try {
|
||||
resolve(normalizeResponse(readTextPayload<RawWebAiResponse>(response.statusCode, response.data)));
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
}
|
||||
},
|
||||
fail: () => reject(new Error('图片上传或联网识图失败'))
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user