pcm-agents 0.5.5 → 0.5.7
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/dist/cjs/{config.store-CKEkFvrj.js → config.store-D6bSL0Ny.js} +3 -3
- package/dist/cjs/{config.store-CKEkFvrj.js.map → config.store-D6bSL0Ny.js.map} +1 -1
- package/dist/cjs/{index-mS6rAdT-.js → index-CSrasZsM.js} +47 -5
- package/dist/cjs/index-CSrasZsM.js.map +1 -0
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/pcm-1zhanshi-mnms-modal_17.cjs.entry.js +2 -2
- package/dist/cjs/pcm-mnms-video-modal.cjs.entry.js +2 -2
- package/dist/cjs/pcm-mnms-zp-modal.cjs.entry.js +2 -2
- package/dist/collection/utils/utils.js +51 -3
- package/dist/collection/utils/utils.js.map +1 -1
- package/dist/components/index.js +45 -3
- package/dist/components/index.js.map +1 -1
- package/dist/esm/{config.store-DxgEmx8e.js → config.store-DH12tJ7a.js} +3 -3
- package/dist/esm/{config.store-DxgEmx8e.js.map → config.store-DH12tJ7a.js.map} +1 -1
- package/dist/esm/{index-C70tZyK5.js → index-Nkad66qo.js} +47 -5
- package/dist/esm/index-Nkad66qo.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/pcm-1zhanshi-mnms-modal_17.entry.js +2 -2
- package/dist/esm/pcm-mnms-video-modal.entry.js +2 -2
- package/dist/esm/pcm-mnms-zp-modal.entry.js +2 -2
- package/dist/pcm-agents/index.esm.js +1 -1
- package/dist/pcm-agents/{p-c38c4e71.entry.js → p-653c1be5.entry.js} +2 -2
- package/dist/pcm-agents/{p-D5LurcVu.js → p-Ba5-0ra8.js} +2 -2
- package/dist/pcm-agents/{p-D5LurcVu.js.map → p-Ba5-0ra8.js.map} +1 -1
- package/dist/pcm-agents/p-CUmmX60i.js +2 -0
- package/dist/pcm-agents/p-CUmmX60i.js.map +1 -0
- package/dist/pcm-agents/{p-6e0c2254.entry.js → p-a1eb7672.entry.js} +2 -2
- package/dist/pcm-agents/{p-ba6f589c.entry.js → p-aa072467.entry.js} +2 -2
- package/dist/pcm-agents/pcm-agents.esm.js +1 -1
- package/package.json +1 -1
- package/dist/cjs/index-mS6rAdT-.js.map +0 -1
- package/dist/esm/index-C70tZyK5.js.map +0 -1
- package/dist/pcm-agents/p-CvwVC5Ba.js +0 -2
- package/dist/pcm-agents/p-CvwVC5Ba.js.map +0 -1
- /package/dist/pcm-agents/{p-c38c4e71.entry.js.map → p-653c1be5.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-6e0c2254.entry.js.map → p-a1eb7672.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-ba6f589c.entry.js.map → p-aa072467.entry.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index = require('./index-
|
|
3
|
+
var index = require('./index-CSrasZsM.js');
|
|
4
4
|
|
|
5
5
|
class ErrorEventBus {
|
|
6
6
|
/**
|
|
@@ -94,6 +94,6 @@ onChange('data', value => {
|
|
|
94
94
|
|
|
95
95
|
exports.ErrorEventBus = ErrorEventBus;
|
|
96
96
|
exports.configStore = configStore;
|
|
97
|
-
//# sourceMappingURL=config.store-
|
|
97
|
+
//# sourceMappingURL=config.store-D6bSL0Ny.js.map
|
|
98
98
|
|
|
99
|
-
//# sourceMappingURL=config.store-
|
|
99
|
+
//# sourceMappingURL=config.store-D6bSL0Ny.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.store-
|
|
1
|
+
{"version":3,"file":"config.store-D6bSL0Ny.js","sources":["src/utils/error-event.ts","store/config.store.ts"],"sourcesContent":["export interface ErrorEventDetail {\r\n source: string;\r\n error: any;\r\n message: string;\r\n type: 'api' | 'ui' | 'network' | 'other';\r\n}\r\n\r\nexport class ErrorEventBus {\r\n /**\r\n * 触发错误事件\r\n */\r\n static emitError(detail: ErrorEventDetail): void {\r\n const event = new CustomEvent('pcm-error', {\r\n bubbles: true,\r\n composed: true,\r\n detail\r\n });\r\n document.dispatchEvent(event);\r\n }\r\n\r\n /**\r\n * 添加错误事件监听器\r\n */\r\n static addErrorListener(callback: (detail: ErrorEventDetail) => void): () => void {\r\n const handler = (event: CustomEvent<ErrorEventDetail>) => {\r\n callback(event.detail);\r\n };\r\n \r\n document.addEventListener('pcm-error', handler as EventListener);\r\n \r\n // 返回移除监听器的函数\r\n return () => {\r\n document.removeEventListener('pcm-error', handler as EventListener);\r\n };\r\n }\r\n} ","import { createStore } from '@stencil/store';\r\n\r\n// 定义配置数据的类型\r\nexport interface ConfigData {\r\n [key: string]: any;\r\n}\r\n\r\n// 从localStorage获取初始配置\r\nconst getInitialConfig = (): ConfigData => {\r\n try {\r\n const storedConfig = localStorage.getItem('pcm-sdk-config-data');\r\n return storedConfig ? JSON.parse(storedConfig) : {};\r\n } catch (error) {\r\n console.error('Error parsing stored config:', error);\r\n return {};\r\n }\r\n};\r\n\r\n// 创建配置存储\r\nexport const { state: configState, onChange } = createStore<{\r\n data: ConfigData;\r\n}>({\r\n data: getInitialConfig()\r\n});\r\n\r\n// 配置存储的辅助方法\r\nexport const configStore = {\r\n // 获取整个配置对象\r\n getConfig: (): ConfigData => configState.data,\r\n \r\n // 获取特定配置项\r\n getItem: <T>(key: string, defaultValue?: T): T => {\r\n return configState.data[key] !== undefined ? configState.data[key] : defaultValue;\r\n },\r\n \r\n // 设置特定配置项\r\n setItem: <T>(key: string, value: T): void => {\r\n configState.data = {\r\n ...configState.data,\r\n [key]: value\r\n };\r\n },\r\n \r\n // 移除特定配置项\r\n removeItem: (key: string): void => {\r\n const newConfig = { ...configState.data };\r\n delete newConfig[key];\r\n configState.data = newConfig;\r\n },\r\n \r\n // 清除所有配置\r\n clear: (): void => {\r\n configState.data = {};\r\n },\r\n \r\n // 批量更新配置\r\n updateConfig: (newConfig: Partial<ConfigData>): void => {\r\n configState.data = {\r\n ...configState.data,\r\n ...newConfig\r\n };\r\n }\r\n};\r\n\r\n// 自动保存到localStorage\r\nonChange('data', value => {\r\n try {\r\n if (Object.keys(value).length > 0) {\r\n localStorage.setItem('pcm-sdk-config-data', JSON.stringify(value));\r\n } else {\r\n localStorage.removeItem('pcm-sdk-config-data');\r\n }\r\n } catch (error) {\r\n console.error('Error saving config to localStorage:', error);\r\n }\r\n}); "],"names":["createStore"],"mappings":";;;;MAOa,aAAa,CAAA;AACxB;;AAEG;IACH,OAAO,SAAS,CAAC,MAAwB,EAAA;AACvC,QAAA,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,WAAW,EAAE;AACzC,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,QAAQ,EAAE,IAAI;YACd;AACD,SAAA,CAAC;AACF,QAAA,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;;AAG/B;;AAEG;IACH,OAAO,gBAAgB,CAAC,QAA4C,EAAA;AAClE,QAAA,MAAM,OAAO,GAAG,CAAC,KAAoC,KAAI;AACvD,YAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;AACxB,SAAC;AAED,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAwB,CAAC;;AAGhE,QAAA,OAAO,MAAK;AACV,YAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,OAAwB,CAAC;AACrE,SAAC;;AAEJ;;AC5BD;AACA,MAAM,gBAAgB,GAAG,MAAiB;AACxC,IAAA,IAAI;QACF,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,qBAAqB,CAAC;AAChE,QAAA,OAAO,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE;;IACnD,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC;AACpD,QAAA,OAAO,EAAE;;AAEb,CAAC;AAED;AACO,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAGA,iBAAW,CAExD;IACD,IAAI,EAAE,gBAAgB;AACvB,CAAA,CAAC;AAEF;AACa,MAAA,WAAW,GAAG;;AAEzB,IAAA,SAAS,EAAE,MAAkB,WAAW,CAAC,IAAI;;AAG7C,IAAA,OAAO,EAAE,CAAI,GAAW,EAAE,YAAgB,KAAO;QAC/C,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY;KAClF;;AAGD,IAAA,OAAO,EAAE,CAAI,GAAW,EAAE,KAAQ,KAAU;QAC1C,WAAW,CAAC,IAAI,GAAG;YACjB,GAAG,WAAW,CAAC,IAAI;YACnB,CAAC,GAAG,GAAG;SACR;KACF;;AAGD,IAAA,UAAU,EAAE,CAAC,GAAW,KAAU;QAChC,MAAM,SAAS,GAAG,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE;AACzC,QAAA,OAAO,SAAS,CAAC,GAAG,CAAC;AACrB,QAAA,WAAW,CAAC,IAAI,GAAG,SAAS;KAC7B;;IAGD,KAAK,EAAE,MAAW;AAChB,QAAA,WAAW,CAAC,IAAI,GAAG,EAAE;KACtB;;AAGD,IAAA,YAAY,EAAE,CAAC,SAA8B,KAAU;QACrD,WAAW,CAAC,IAAI,GAAG;YACjB,GAAG,WAAW,CAAC,IAAI;AACnB,YAAA,GAAG;SACJ;;;AAIL;AACA,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAG;AACvB,IAAA,IAAI;QACF,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AACjC,YAAA,YAAY,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;;aAC7D;AACL,YAAA,YAAY,CAAC,UAAU,CAAC,qBAAqB,CAAC;;;IAEhD,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC;;AAEhE,CAAC,CAAC;;;;;"}
|
|
@@ -233,6 +233,36 @@ function format(first, middle, last) {
|
|
|
233
233
|
const getEffectiveToken = () => {
|
|
234
234
|
return authStore.getToken() || '';
|
|
235
235
|
};
|
|
236
|
+
/**
|
|
237
|
+
* 请求超时时间(毫秒)
|
|
238
|
+
*/
|
|
239
|
+
const REQUEST_TIMEOUT = 2 * 60 * 1000; // 2分钟
|
|
240
|
+
/**
|
|
241
|
+
* 创建带超时的 fetch 请求
|
|
242
|
+
* @param url 请求URL
|
|
243
|
+
* @param options fetch选项
|
|
244
|
+
* @param timeout 超时时间(毫秒)
|
|
245
|
+
* @returns Promise<Response>
|
|
246
|
+
*/
|
|
247
|
+
const fetchWithTimeout = async (url, options, timeout = REQUEST_TIMEOUT) => {
|
|
248
|
+
const controller = new AbortController();
|
|
249
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
250
|
+
try {
|
|
251
|
+
const response = await fetch(url, {
|
|
252
|
+
...options,
|
|
253
|
+
signal: controller.signal,
|
|
254
|
+
});
|
|
255
|
+
clearTimeout(timeoutId);
|
|
256
|
+
return response;
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
clearTimeout(timeoutId);
|
|
260
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
261
|
+
throw new Error('请求超时,请检查网络连接后重试');
|
|
262
|
+
}
|
|
263
|
+
throw error;
|
|
264
|
+
}
|
|
265
|
+
};
|
|
236
266
|
/**
|
|
237
267
|
* 发送 SSE 流式请求
|
|
238
268
|
* @param config 请求配置
|
|
@@ -251,7 +281,7 @@ const sendSSERequest = async (config, isRetry = false) => {
|
|
|
251
281
|
headers['authorization'] = `Bearer ${token}`;
|
|
252
282
|
}
|
|
253
283
|
}
|
|
254
|
-
const response = await
|
|
284
|
+
const response = await fetchWithTimeout(requestUrl, {
|
|
255
285
|
method,
|
|
256
286
|
headers: {
|
|
257
287
|
'Accept': 'text/event-stream',
|
|
@@ -304,6 +334,10 @@ const sendSSERequest = async (config, isRetry = false) => {
|
|
|
304
334
|
}
|
|
305
335
|
catch (error) {
|
|
306
336
|
console.error('SSE 请求错误:', error);
|
|
337
|
+
// 如果是超时错误且不是重试请求,则重试一次
|
|
338
|
+
if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {
|
|
339
|
+
return sendSSERequest(config, true);
|
|
340
|
+
}
|
|
307
341
|
onError?.(error);
|
|
308
342
|
}
|
|
309
343
|
};
|
|
@@ -370,7 +404,7 @@ const sendHttpRequest = async (config, isRetry = true) => {
|
|
|
370
404
|
});
|
|
371
405
|
requestUrl += (queryParams.toString() ? '&' : '?') + dataParams.toString();
|
|
372
406
|
}
|
|
373
|
-
const response = await
|
|
407
|
+
const response = await fetchWithTimeout(requestUrl, requestConfig);
|
|
374
408
|
// 检查是否为401错误(未授权)
|
|
375
409
|
if (response.status === 401) {
|
|
376
410
|
// 触发全局token无效事件
|
|
@@ -411,6 +445,10 @@ const sendHttpRequest = async (config, isRetry = true) => {
|
|
|
411
445
|
}
|
|
412
446
|
catch (error) {
|
|
413
447
|
console.error('HTTP请求错误:', error);
|
|
448
|
+
// 如果是超时错误且允许重试,则重试一次
|
|
449
|
+
if (error instanceof Error && error.message.includes('请求超时') && isRetry) {
|
|
450
|
+
return sendHttpRequest(config, false);
|
|
451
|
+
}
|
|
414
452
|
if (config.onError) {
|
|
415
453
|
config.onError(error);
|
|
416
454
|
}
|
|
@@ -522,7 +560,7 @@ const synthesizeAudio = async (text, token, isRetry = false) => {
|
|
|
522
560
|
throw new Error('API密钥不能为空');
|
|
523
561
|
}
|
|
524
562
|
try {
|
|
525
|
-
const response = await
|
|
563
|
+
const response = await fetchWithTimeout(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {
|
|
526
564
|
method: 'POST',
|
|
527
565
|
headers: {
|
|
528
566
|
'Content-Type': 'application/json',
|
|
@@ -548,6 +586,10 @@ const synthesizeAudio = async (text, token, isRetry = false) => {
|
|
|
548
586
|
}
|
|
549
587
|
catch (error) {
|
|
550
588
|
console.error('语音合成错误:', error);
|
|
589
|
+
// 如果是超时错误且不是重试请求,则重试一次
|
|
590
|
+
if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {
|
|
591
|
+
return synthesizeAudio(text, token, true);
|
|
592
|
+
}
|
|
551
593
|
throw error;
|
|
552
594
|
}
|
|
553
595
|
};
|
|
@@ -561,6 +603,6 @@ exports.sendSSERequest = sendSSERequest;
|
|
|
561
603
|
exports.synthesizeAudio = synthesizeAudio;
|
|
562
604
|
exports.uploadFileToBackend = uploadFileToBackend;
|
|
563
605
|
exports.verifyApiKey = verifyApiKey;
|
|
564
|
-
//# sourceMappingURL=index-
|
|
606
|
+
//# sourceMappingURL=index-CSrasZsM.js.map
|
|
565
607
|
|
|
566
|
-
//# sourceMappingURL=index-
|
|
608
|
+
//# sourceMappingURL=index-CSrasZsM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CSrasZsM.js","sources":["src/utils/env.ts","node_modules/.pnpm/@stencil+store@2.1.3_@stencil+core@4.31.0/node_modules/@stencil/store/dist/index.js","store/auth.store.ts"],"sourcesContent":["// 默认 API 域名\r\nconst DEFAULT_API_DOMAIN = 'https://api.pincaimao.com/agents/platform';\r\n\r\n// 从环境变量获取 API 域名,如果未设置则使用默认值\r\nexport const API_DOMAIN = process.env.API_DOMAIN || DEFAULT_API_DOMAIN;\r\n\r\n// 导出其他环境变量\r\nexport const ENV = {\r\n API_DOMAIN,\r\n // 可以添加其他环境变量\r\n}; ","import { getRenderingRef, forceUpdate } from '@stencil/core';\n\nconst appendToMap = (map, propName, value) => {\n const items = map.get(propName);\n if (!items) {\n map.set(propName, [value]);\n }\n else if (!items.includes(value)) {\n items.push(value);\n }\n};\nconst debounce = (fn, ms) => {\n let timeoutId;\n return (...args) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n timeoutId = 0;\n fn(...args);\n }, ms);\n };\n};\n\n/**\n * Check if a possible element isConnected.\n * The property might not be there, so we check for it.\n *\n * We want it to return true if isConnected is not a property,\n * otherwise we would remove these elements and would not update.\n *\n * Better leak in Edge than to be useless.\n */\nconst isConnected = (maybeElement) => !('isConnected' in maybeElement) || maybeElement.isConnected;\nconst cleanupElements = debounce((map) => {\n for (let key of map.keys()) {\n map.set(key, map.get(key).filter(isConnected));\n }\n}, 2_000);\nconst stencilSubscription = () => {\n if (typeof getRenderingRef !== 'function') {\n // If we are not in a stencil project, we do nothing.\n // This function is not really exported by @stencil/core.\n return {};\n }\n const elmsToUpdate = new Map();\n return {\n dispose: () => elmsToUpdate.clear(),\n get: (propName) => {\n const elm = getRenderingRef();\n if (elm) {\n appendToMap(elmsToUpdate, propName, elm);\n }\n },\n set: (propName) => {\n const elements = elmsToUpdate.get(propName);\n if (elements) {\n elmsToUpdate.set(propName, elements.filter(forceUpdate));\n }\n cleanupElements(elmsToUpdate);\n },\n reset: () => {\n elmsToUpdate.forEach((elms) => elms.forEach(forceUpdate));\n cleanupElements(elmsToUpdate);\n },\n };\n};\n\nconst unwrap = (val) => (typeof val === 'function' ? val() : val);\nconst createObservableMap = (defaultState, shouldUpdate = (a, b) => a !== b) => {\n const unwrappedState = unwrap(defaultState);\n let states = new Map(Object.entries(unwrappedState ?? {}));\n const handlers = {\n dispose: [],\n get: [],\n set: [],\n reset: [],\n };\n const reset = () => {\n // When resetting the state, the default state may be a function - unwrap it to invoke it.\n // otherwise, the state won't be properly reset\n states = new Map(Object.entries(unwrap(defaultState) ?? {}));\n handlers.reset.forEach((cb) => cb());\n };\n const dispose = () => {\n // Call first dispose as resetting the state would\n // cause less updates ;)\n handlers.dispose.forEach((cb) => cb());\n reset();\n };\n const get = (propName) => {\n handlers.get.forEach((cb) => cb(propName));\n return states.get(propName);\n };\n const set = (propName, value) => {\n const oldValue = states.get(propName);\n if (shouldUpdate(value, oldValue, propName)) {\n states.set(propName, value);\n handlers.set.forEach((cb) => cb(propName, value, oldValue));\n }\n };\n const state = (typeof Proxy === 'undefined'\n ? {}\n : new Proxy(unwrappedState, {\n get(_, propName) {\n return get(propName);\n },\n ownKeys(_) {\n return Array.from(states.keys());\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true,\n };\n },\n has(_, propName) {\n return states.has(propName);\n },\n set(_, propName, value) {\n set(propName, value);\n return true;\n },\n }));\n const on = (eventName, callback) => {\n handlers[eventName].push(callback);\n return () => {\n removeFromArray(handlers[eventName], callback);\n };\n };\n const onChange = (propName, cb) => {\n const unSet = on('set', (key, newValue) => {\n if (key === propName) {\n cb(newValue);\n }\n });\n // We need to unwrap the defaultState because it might be a function.\n // Otherwise we might not be sending the right reset value.\n const unReset = on('reset', () => cb(unwrap(defaultState)[propName]));\n return () => {\n unSet();\n unReset();\n };\n };\n const use = (...subscriptions) => {\n const unsubs = subscriptions.reduce((unsubs, subscription) => {\n if (subscription.set) {\n unsubs.push(on('set', subscription.set));\n }\n if (subscription.get) {\n unsubs.push(on('get', subscription.get));\n }\n if (subscription.reset) {\n unsubs.push(on('reset', subscription.reset));\n }\n if (subscription.dispose) {\n unsubs.push(on('dispose', subscription.dispose));\n }\n return unsubs;\n }, []);\n return () => unsubs.forEach((unsub) => unsub());\n };\n const forceUpdate = (key) => {\n const oldValue = states.get(key);\n handlers.set.forEach((cb) => cb(key, oldValue, oldValue));\n };\n return {\n state,\n get,\n set,\n on,\n onChange,\n use,\n dispose,\n reset,\n forceUpdate,\n };\n};\nconst removeFromArray = (array, item) => {\n const index = array.indexOf(item);\n if (index >= 0) {\n array[index] = array[array.length - 1];\n array.length--;\n }\n};\n\nconst createStore = (defaultState, shouldUpdate) => {\n const map = createObservableMap(defaultState, shouldUpdate);\n map.use(stencilSubscription());\n return map;\n};\n\nexport { createObservableMap, createStore };\n","// src/store/auth.store.ts\r\nimport { createStore } from '@stencil/store';\r\n\r\nexport const { state: authState, onChange } = createStore({\r\n token: localStorage.getItem('pcm-sdk-auth-token') || null\r\n});\r\n\r\n// 添加一些辅助方法\r\nexport const authStore = {\r\n getToken: () => authState.token,\r\n setToken: (token: string) => {\r\n authState.token = token;\r\n localStorage.setItem('pcm-sdk-auth-token', token);\r\n },\r\n clearToken: () => {\r\n authState.token = null;\r\n localStorage.removeItem('pcm-sdk-auth-token');\r\n }\r\n};\r\n\r\n// 自动保存到localStorage\r\nonChange('token', value => {\r\n if (value) {\r\n localStorage.setItem('pcm-sdk-auth-token', value);\r\n } else {\r\n localStorage.removeItem('pcm-sdk-auth-token');\r\n }\r\n});"],"names":["getRenderingRef","forceUpdate"],"mappings":"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","x_google_ignoreList":[1]}
|
package/dist/cjs/index.cjs.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var index = require('./index-C_qhED9Z.js');
|
|
4
|
-
var index$1 = require('./index-
|
|
5
|
-
var config_store = require('./config.store-
|
|
4
|
+
var index$1 = require('./index-CSrasZsM.js');
|
|
5
|
+
var config_store = require('./config.store-D6bSL0Ny.js');
|
|
6
6
|
|
|
7
7
|
const pcm1zhanshiMnmsModalCss = "";
|
|
8
8
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var index = require('./index-C_qhED9Z.js');
|
|
4
|
-
var index$1 = require('./index-
|
|
5
|
-
var config_store = require('./config.store-
|
|
4
|
+
var index$1 = require('./index-CSrasZsM.js');
|
|
5
|
+
var config_store = require('./config.store-D6bSL0Ny.js');
|
|
6
6
|
|
|
7
7
|
const pcmMnmsVideoModalCss = "";
|
|
8
8
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var index = require('./index-C_qhED9Z.js');
|
|
4
|
-
var index$1 = require('./index-
|
|
5
|
-
var config_store = require('./config.store-
|
|
4
|
+
var index$1 = require('./index-CSrasZsM.js');
|
|
5
|
+
var config_store = require('./config.store-D6bSL0Ny.js');
|
|
6
6
|
|
|
7
7
|
const pcmMnmsZpModalCss = "";
|
|
8
8
|
|
|
@@ -44,6 +44,36 @@ const syncDelay = (ms) => {
|
|
|
44
44
|
export const getEffectiveToken = () => {
|
|
45
45
|
return authStore.getToken() || '';
|
|
46
46
|
};
|
|
47
|
+
/**
|
|
48
|
+
* 请求超时时间(毫秒)
|
|
49
|
+
*/
|
|
50
|
+
const REQUEST_TIMEOUT = 2 * 60 * 1000; // 2分钟
|
|
51
|
+
/**
|
|
52
|
+
* 创建带超时的 fetch 请求
|
|
53
|
+
* @param url 请求URL
|
|
54
|
+
* @param options fetch选项
|
|
55
|
+
* @param timeout 超时时间(毫秒)
|
|
56
|
+
* @returns Promise<Response>
|
|
57
|
+
*/
|
|
58
|
+
const fetchWithTimeout = async (url, options, timeout = REQUEST_TIMEOUT) => {
|
|
59
|
+
const controller = new AbortController();
|
|
60
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
61
|
+
try {
|
|
62
|
+
const response = await fetch(url, {
|
|
63
|
+
...options,
|
|
64
|
+
signal: controller.signal,
|
|
65
|
+
});
|
|
66
|
+
clearTimeout(timeoutId);
|
|
67
|
+
return response;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
clearTimeout(timeoutId);
|
|
71
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
72
|
+
throw new Error('请求超时,请检查网络连接后重试');
|
|
73
|
+
}
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
47
77
|
/**
|
|
48
78
|
* 发送 SSE 流式请求
|
|
49
79
|
* @param config 请求配置
|
|
@@ -62,7 +92,7 @@ export const sendSSERequest = async (config, isRetry = false) => {
|
|
|
62
92
|
headers['authorization'] = `Bearer ${token}`;
|
|
63
93
|
}
|
|
64
94
|
}
|
|
65
|
-
const response = await
|
|
95
|
+
const response = await fetchWithTimeout(requestUrl, {
|
|
66
96
|
method,
|
|
67
97
|
headers: {
|
|
68
98
|
'Accept': 'text/event-stream',
|
|
@@ -116,6 +146,12 @@ export const sendSSERequest = async (config, isRetry = false) => {
|
|
|
116
146
|
}
|
|
117
147
|
catch (error) {
|
|
118
148
|
console.error('SSE 请求错误:', error);
|
|
149
|
+
// 如果是超时错误且不是重试请求,则重试一次
|
|
150
|
+
if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {
|
|
151
|
+
console.log('SSE请求超时,正在重试...');
|
|
152
|
+
syncDelay(1000); // 延迟1秒后重试
|
|
153
|
+
return sendSSERequest(config, true);
|
|
154
|
+
}
|
|
119
155
|
onError?.(error);
|
|
120
156
|
}
|
|
121
157
|
};
|
|
@@ -182,7 +218,7 @@ export const sendHttpRequest = async (config, isRetry = true) => {
|
|
|
182
218
|
});
|
|
183
219
|
requestUrl += (queryParams.toString() ? '&' : '?') + dataParams.toString();
|
|
184
220
|
}
|
|
185
|
-
const response = await
|
|
221
|
+
const response = await fetchWithTimeout(requestUrl, requestConfig);
|
|
186
222
|
// 检查是否为401错误(未授权)
|
|
187
223
|
if (response.status === 401) {
|
|
188
224
|
// 触发全局token无效事件
|
|
@@ -224,6 +260,12 @@ export const sendHttpRequest = async (config, isRetry = true) => {
|
|
|
224
260
|
}
|
|
225
261
|
catch (error) {
|
|
226
262
|
console.error('HTTP请求错误:', error);
|
|
263
|
+
// 如果是超时错误且允许重试,则重试一次
|
|
264
|
+
if (error instanceof Error && error.message.includes('请求超时') && isRetry) {
|
|
265
|
+
console.log('HTTP请求超时,正在重试...');
|
|
266
|
+
syncDelay(1000); // 延迟1秒后重试
|
|
267
|
+
return sendHttpRequest(config, false);
|
|
268
|
+
}
|
|
227
269
|
if (config.onError) {
|
|
228
270
|
config.onError(error);
|
|
229
271
|
}
|
|
@@ -337,7 +379,7 @@ export const synthesizeAudio = async (text, token, isRetry = false) => {
|
|
|
337
379
|
throw new Error('API密钥不能为空');
|
|
338
380
|
}
|
|
339
381
|
try {
|
|
340
|
-
const response = await
|
|
382
|
+
const response = await fetchWithTimeout(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {
|
|
341
383
|
method: 'POST',
|
|
342
384
|
headers: {
|
|
343
385
|
'Content-Type': 'application/json',
|
|
@@ -364,6 +406,12 @@ export const synthesizeAudio = async (text, token, isRetry = false) => {
|
|
|
364
406
|
}
|
|
365
407
|
catch (error) {
|
|
366
408
|
console.error('语音合成错误:', error);
|
|
409
|
+
// 如果是超时错误且不是重试请求,则重试一次
|
|
410
|
+
if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {
|
|
411
|
+
console.log('语音合成请求超时,正在重试...');
|
|
412
|
+
syncDelay(1000); // 延迟1秒后重试
|
|
413
|
+
return synthesizeAudio(text, token, true);
|
|
414
|
+
}
|
|
367
415
|
throw error;
|
|
368
416
|
}
|
|
369
417
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// 导入环境变量\r\nimport { API_DOMAIN } from './env';\r\nimport { authStore } from '../../store/auth.store'; // 导入 authStore\r\n\r\nexport { API_DOMAIN };\r\n\r\nexport function format(first?: string, middle?: string, last?: string): string {\r\n return (first || '') + (middle ? ` ${middle}` : '') + (last ? ` ${last}` : '');\r\n}\r\n\r\n// 添加类型定义\r\nexport interface UserInputMessageType {\r\n message: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface WorkFlowNode {\r\n message_id?: string;\r\n conversation_id?: string;\r\n created_at?: string;\r\n event?: string;\r\n answer?: string;\r\n data?: {\r\n outputs?: {\r\n answer?: string;\r\n };\r\n status?: string;\r\n error?: any;\r\n };\r\n}\r\n\r\nexport interface MessageRound extends UserInputMessageType {\r\n id?: string;\r\n conversation_id?: string;\r\n created_at?: string;\r\n answer?: string;\r\n status?: string;\r\n error?: any;\r\n}\r\n\r\n/**\r\n * 将工作流节点转换为消息轮次\r\n * @param message_event 消息事件类型\r\n * @param inputMessage 用户输入消息\r\n * @param streamNode 工作流节点\r\n * @returns 消息轮次\r\n */\r\nexport const convertWorkflowStreamNodeToMessageRound = (message_event: string, inputMessage: UserInputMessageType, streamNode: WorkFlowNode): MessageRound => {\r\n const messageRound: MessageRound = {\r\n ...inputMessage,\r\n };\r\n if (message_event === 'workflow_finished') messageRound.answer = streamNode.data?.outputs?.answer;\r\n if (message_event === 'agent_message' || message_event === 'message') messageRound.answer = streamNode?.answer;\r\n messageRound.id = streamNode.message_id;\r\n messageRound.conversation_id = streamNode.conversation_id;\r\n messageRound.created_at = streamNode.created_at;\r\n messageRound.status = streamNode.data?.status;\r\n messageRound.error = streamNode.data?.error;\r\n return messageRound;\r\n};\r\n\r\n/**\r\n * SSE 流式请求配置接口\r\n */\r\nexport interface SSERequestConfig {\r\n url: string;\r\n method: string;\r\n headers?: Record<string, string>;\r\n data?: any;\r\n onMessage?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n onComplete?: () => void;\r\n}\r\n\r\n/**\r\n * 同步延迟函数,阻塞主线程指定的毫秒数\r\n * @param ms 延迟的毫秒数\r\n */\r\nconst syncDelay = (ms: number) => {\r\n const start = Date.now();\r\n while(Date.now() - start < ms) {\r\n // 空循环,阻塞主线程\r\n }\r\n};\r\n\r\n/**\r\n * 获取有效的 token,从 authStore 中获取\r\n * @returns string 有效的 token\r\n */\r\nexport const getEffectiveToken = (): string => {\r\n return authStore.getToken() || '';\r\n};\r\n\r\n/**\r\n * 发送 SSE 流式请求\r\n * @param config 请求配置\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<void>\r\n */\r\nexport const sendSSERequest = async (config: SSERequestConfig, isRetry = false): Promise<void> => {\r\n const { url, method, headers = {}, data, onMessage, onError, onComplete } = config;\r\n\r\n try {\r\n // 使用 API_DOMAIN 拼接完整的请求URL\r\n const requestUrl = `${API_DOMAIN}${url}`;\r\n\r\n // 如果没有提供 Authorization 头,则从 authStore 获取 token\r\n if (!headers['authorization'] && !headers['Authorization']) {\r\n const token = getEffectiveToken();\r\n if (token) {\r\n headers['authorization'] = `Bearer ${token}`;\r\n }\r\n }\r\n\r\n const response = await fetch(requestUrl, {\r\n method,\r\n headers: {\r\n 'Accept': 'text/event-stream',\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n\r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 如果不是重试请求,则使用同步延迟500毫秒后重试一次\r\n if (!isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return sendSSERequest(config, true);\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n console.error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const reader = response.body?.getReader();\r\n if (!reader) throw new Error('No reader available');\r\n\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n while (true) {\r\n const { value, done } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n\r\n // 处理缓冲区中的完整消息\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || ''; // 保留最后一个不完整的行\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data:')) {\r\n try {\r\n const jsonStr = line.substring(5).trim();\r\n if (!jsonStr) continue;\r\n\r\n const data = JSON.parse(jsonStr);\r\n onMessage?.(data);\r\n } catch (e) {\r\n console.error('解析 SSE 数据错误:', e, '原始数据:', line);\r\n }\r\n }\r\n }\r\n }\r\n\r\n onComplete?.();\r\n } catch (error) {\r\n console.error('SSE 请求错误:', error);\r\n onError?.(error);\r\n }\r\n};\r\n\r\n/**\r\n * HTTP请求配置接口\r\n */\r\nexport interface HttpRequestConfig {\r\n url: string;\r\n method?: string;\r\n headers?: Record<string, string>;\r\n params?: Record<string, any>;\r\n data?: any;\r\n formData?: FormData; // 添加FormData支持\r\n onMessage?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n onComplete?: () => void;\r\n}\r\n\r\n/**\r\n * 统一的API响应接口\r\n */\r\nexport interface ApiResponse<T = any> {\r\n code: number;\r\n message: string;\r\n data?: T;\r\n}\r\n\r\n/**\r\n * HTTP响应接口\r\n */\r\nexport interface HttpResponse<T = any> {\r\n success: boolean;\r\n data?: T;\r\n error?: any;\r\n message?: string;\r\n}\r\n\r\n// 添加一个全局事件发射器用于处理401错误\r\nexport const createTokenInvalidEvent = () => {\r\n const event = new CustomEvent('pcm-token-invalid', {\r\n bubbles: true,\r\n composed: true,\r\n detail: { timestamp: new Date().getTime() },\r\n });\r\n document.dispatchEvent(event);\r\n};\r\n\r\n/**\r\n * 发送HTTP请求\r\n * @param config 请求配置\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<HttpResponse>\r\n */\r\nexport const sendHttpRequest = async <T = any>(config: HttpRequestConfig, isRetry = true): Promise<HttpResponse<T>> => {\r\n const { url, method = 'GET', headers = {}, params = {}, data, formData, onMessage } = config;\r\n\r\n try {\r\n // 构建URL和查询参数\r\n const queryParams = new URLSearchParams();\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n queryParams.append(key, String(value));\r\n }\r\n });\r\n\r\n // 使用 API_DOMAIN 拼接完整的请求URL\r\n let requestUrl = `${API_DOMAIN}${url}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`;\r\n // 如果没有提供 Authorization 头,则从 authStore 获取 token\r\n if (headers['authorization'] == undefined && headers['Authorization'] == undefined) {\r\n const token = getEffectiveToken();\r\n \r\n if (token) {\r\n headers['authorization'] = `Bearer ${token}`;\r\n }\r\n }\r\n\r\n // 创建请求配置对象\r\n const requestConfig: RequestInit = {\r\n method,\r\n headers: formData\r\n ? { ...headers }\r\n : {\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n };\r\n\r\n // 处理请求体\r\n if (formData) {\r\n // 如果提供了FormData,直接使用\r\n requestConfig.body = formData;\r\n } else if (method !== 'GET' && method !== 'HEAD' && data) {\r\n // 否则,如果是非GET/HEAD请求且有data,将其JSON序列化\r\n requestConfig.body = JSON.stringify(data);\r\n }\r\n\r\n // 如果是 GET 方法且有 data,将其作为查询参数添加到 URL\r\n if (method === 'GET' && data) {\r\n const dataParams = new URLSearchParams();\r\n Object.entries(data).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n dataParams.append(key, String(value));\r\n }\r\n });\r\n requestUrl += (queryParams.toString() ? '&' : '?') + dataParams.toString();\r\n }\r\n\r\n const response = await fetch(requestUrl, requestConfig);\r\n \r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 重试请求\r\n if (isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return sendHttpRequest(config, false);\r\n }\r\n }\r\n\r\n const responseData: ApiResponse<T> = await response.json();\r\n\r\n // 调用 onMessage 回调\r\n if (onMessage) {\r\n onMessage(responseData);\r\n }\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n console.error(`HTTP错误: ${response.status} ${response.statusText}`);\r\n return {\r\n success: false,\r\n message: responseData.message || `HTTP错误: ${response.status}`,\r\n error: responseData,\r\n };\r\n }\r\n\r\n // 检查业务状态码\r\n if (responseData.code !== 0) {\r\n console.error(`API错误: ${responseData.message}`);\r\n return {\r\n success: false,\r\n message: responseData.message,\r\n error: responseData,\r\n };\r\n }\r\n\r\n // 直接返回data\r\n return {\r\n success: true,\r\n data: responseData.data,\r\n };\r\n } catch (error) {\r\n console.error('HTTP请求错误:', error);\r\n if (config.onError) {\r\n config.onError(error);\r\n }\r\n return {\r\n success: false,\r\n error,\r\n message: error instanceof Error ? error.message : '未知错误',\r\n };\r\n } finally {\r\n if (config.onComplete) {\r\n config.onComplete();\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * 验证API密钥\r\n * @param token API密钥\r\n * @returns Promise<boolean> 验证是否成功\r\n */\r\nexport const verifyApiKey = async (token: string): Promise<boolean> => {\r\n\r\n const response = await sendHttpRequest({\r\n url: '/sdk/v1/user',\r\n method: 'GET',\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n }, false);\r\n \r\n // 如果是401错误,同步延迟500毫秒后返回\r\n if (!response.success && response.error && response.error.code === 401) {\r\n // 执行同步延迟\r\n syncDelay(500);\r\n return false;\r\n } else {\r\n return response.success;\r\n }\r\n};\r\n\r\n/**\r\n * 获取智能体信息\r\n * @param botId 智能体ID\r\n * @returns Promise<any> 智能体信息数据\r\n */\r\nexport const fetchAgentInfo = async (botId: string): Promise<any> => {\r\n \r\n if (!botId) {\r\n throw new Error('智能体ID不能为空');\r\n }\r\n\r\n try {\r\n const response = await sendHttpRequest({\r\n url: `/sdk/v1/agent/${botId}/info`,\r\n method: 'GET',\r\n });\r\n\r\n if (!response.success) {\r\n throw new Error(response.message || '获取智能体信息失败');\r\n }\r\n\r\n return response.data;\r\n } catch (error) {\r\n console.error('获取智能体信息失败:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * 文件上传响应数据接口\r\n */\r\nexport interface FileUploadResponse {\r\n /** 文件在对象存储中的唯一标识符 */\r\n cos_key: string;\r\n /** 文件名称 */\r\n file_name: string;\r\n /** 文件大小(带单位的字符串,如 \"1.5MB\") */\r\n file_size: string;\r\n /** 文件的预签名URL */\r\n presigned_url: string;\r\n /** 文件扩展名 */\r\n ext: string;\r\n}\r\n\r\n/**\r\n * 通过后端API上传文件\r\n * @param file 要上传的文件\r\n * @param headers 可选的请求头\r\n * @param params 可选的额外参数\r\n * @returns Promise 包含上传结果\r\n */\r\nexport const uploadFileToBackend = async (file: File, headers?: Record<string, string>, params?: Record<string, any>): Promise<FileUploadResponse> => {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n // 添加额外参数到 formData\r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n formData.append(key, String(value));\r\n }\r\n });\r\n }\r\n\r\n try {\r\n const response = await sendHttpRequest<{ cos_key: string; file_name: string; file_size: string; presigned_url: string; ext: string }>({\r\n url: '/sdk/v1/files/upload',\r\n method: 'POST',\r\n headers: {\r\n ...headers,\r\n },\r\n formData,\r\n });\r\n\r\n if (!response.success || !response.data) {\r\n throw new Error(response.message || '文件上传失败');\r\n }\r\n\r\n return response.data;\r\n } catch (error) {\r\n console.error('文件上传错误:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * 合成语音音频\r\n * @param text 要转换为语音的文本\r\n * @param token API密钥(可选,如果不提供则从 authStore 获取)\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<string> 返回音频的Blob URL\r\n */\r\nexport const synthesizeAudio = async (text: string, token?: string, isRetry = false): Promise<string> => {\r\n // 如果没有提供 token,则从 authStore 获取\r\n const effectiveToken = token || getEffectiveToken();\r\n \r\n if (!effectiveToken) {\r\n throw new Error('API密钥不能为空');\r\n }\r\n\r\n try {\r\n const response = await fetch(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'authorization': 'Bearer ' + effectiveToken,\r\n },\r\n body: JSON.stringify({ text }),\r\n });\r\n\r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 如果不是重试请求,则使用同步延迟500毫秒后重试一次\r\n if (!isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return synthesizeAudio(text, token, true);\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error('语音合成失败');\r\n }\r\n\r\n // 获取音频数据并创建Blob URL\r\n const audioBlob = await response.blob();\r\n return URL.createObjectURL(audioBlob);\r\n } catch (error) {\r\n console.error('语音合成错误:', error);\r\n throw error;\r\n }\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// 导入环境变量\r\nimport { API_DOMAIN } from './env';\r\nimport { authStore } from '../../store/auth.store'; // 导入 authStore\r\n\r\nexport { API_DOMAIN };\r\n\r\nexport function format(first?: string, middle?: string, last?: string): string {\r\n return (first || '') + (middle ? ` ${middle}` : '') + (last ? ` ${last}` : '');\r\n}\r\n\r\n// 添加类型定义\r\nexport interface UserInputMessageType {\r\n message: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface WorkFlowNode {\r\n message_id?: string;\r\n conversation_id?: string;\r\n created_at?: string;\r\n event?: string;\r\n answer?: string;\r\n data?: {\r\n outputs?: {\r\n answer?: string;\r\n };\r\n status?: string;\r\n error?: any;\r\n };\r\n}\r\n\r\nexport interface MessageRound extends UserInputMessageType {\r\n id?: string;\r\n conversation_id?: string;\r\n created_at?: string;\r\n answer?: string;\r\n status?: string;\r\n error?: any;\r\n}\r\n\r\n/**\r\n * 将工作流节点转换为消息轮次\r\n * @param message_event 消息事件类型\r\n * @param inputMessage 用户输入消息\r\n * @param streamNode 工作流节点\r\n * @returns 消息轮次\r\n */\r\nexport const convertWorkflowStreamNodeToMessageRound = (message_event: string, inputMessage: UserInputMessageType, streamNode: WorkFlowNode): MessageRound => {\r\n const messageRound: MessageRound = {\r\n ...inputMessage,\r\n };\r\n if (message_event === 'workflow_finished') messageRound.answer = streamNode.data?.outputs?.answer;\r\n if (message_event === 'agent_message' || message_event === 'message') messageRound.answer = streamNode?.answer;\r\n messageRound.id = streamNode.message_id;\r\n messageRound.conversation_id = streamNode.conversation_id;\r\n messageRound.created_at = streamNode.created_at;\r\n messageRound.status = streamNode.data?.status;\r\n messageRound.error = streamNode.data?.error;\r\n return messageRound;\r\n};\r\n\r\n/**\r\n * SSE 流式请求配置接口\r\n */\r\nexport interface SSERequestConfig {\r\n url: string;\r\n method: string;\r\n headers?: Record<string, string>;\r\n data?: any;\r\n onMessage?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n onComplete?: () => void;\r\n}\r\n\r\n/**\r\n * 同步延迟函数,阻塞主线程指定的毫秒数\r\n * @param ms 延迟的毫秒数\r\n */\r\nconst syncDelay = (ms: number) => {\r\n const start = Date.now();\r\n while(Date.now() - start < ms) {\r\n // 空循环,阻塞主线程\r\n }\r\n};\r\n\r\n/**\r\n * 获取有效的 token,从 authStore 中获取\r\n * @returns string 有效的 token\r\n */\r\nexport const getEffectiveToken = (): string => {\r\n return authStore.getToken() || '';\r\n};\r\n\r\n/**\r\n * 请求超时时间(毫秒)\r\n */\r\nconst REQUEST_TIMEOUT = 2 * 60 * 1000; // 2分钟\r\n\r\n/**\r\n * 创建带超时的 fetch 请求\r\n * @param url 请求URL\r\n * @param options fetch选项\r\n * @param timeout 超时时间(毫秒)\r\n * @returns Promise<Response>\r\n */\r\nconst fetchWithTimeout = async (url: string, options: RequestInit, timeout: number = REQUEST_TIMEOUT): Promise<Response> => {\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: controller.signal,\r\n });\r\n clearTimeout(timeoutId);\r\n return response;\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new Error('请求超时,请检查网络连接后重试');\r\n }\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * 发送 SSE 流式请求\r\n * @param config 请求配置\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<void>\r\n */\r\nexport const sendSSERequest = async (config: SSERequestConfig, isRetry = false): Promise<void> => {\r\n const { url, method, headers = {}, data, onMessage, onError, onComplete } = config;\r\n\r\n try {\r\n // 使用 API_DOMAIN 拼接完整的请求URL\r\n const requestUrl = `${API_DOMAIN}${url}`;\r\n\r\n // 如果没有提供 Authorization 头,则从 authStore 获取 token\r\n if (!headers['authorization'] && !headers['Authorization']) {\r\n const token = getEffectiveToken();\r\n if (token) {\r\n headers['authorization'] = `Bearer ${token}`;\r\n }\r\n }\r\n\r\n const response = await fetchWithTimeout(requestUrl, {\r\n method,\r\n headers: {\r\n 'Accept': 'text/event-stream',\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n\r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 如果不是重试请求,则使用同步延迟500毫秒后重试一次\r\n if (!isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return sendSSERequest(config, true);\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n console.error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const reader = response.body?.getReader();\r\n if (!reader) throw new Error('No reader available');\r\n\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n while (true) {\r\n const { value, done } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n\r\n // 处理缓冲区中的完整消息\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || ''; // 保留最后一个不完整的行\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data:')) {\r\n try {\r\n const jsonStr = line.substring(5).trim();\r\n if (!jsonStr) continue;\r\n\r\n const data = JSON.parse(jsonStr);\r\n onMessage?.(data);\r\n } catch (e) {\r\n console.error('解析 SSE 数据错误:', e, '原始数据:', line);\r\n }\r\n }\r\n }\r\n }\r\n\r\n onComplete?.();\r\n } catch (error) {\r\n console.error('SSE 请求错误:', error);\r\n \r\n // 如果是超时错误且不是重试请求,则重试一次\r\n if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {\r\n console.log('SSE请求超时,正在重试...');\r\n syncDelay(1000); // 延迟1秒后重试\r\n return sendSSERequest(config, true);\r\n }\r\n \r\n onError?.(error);\r\n }\r\n};\r\n\r\n/**\r\n * HTTP请求配置接口\r\n */\r\nexport interface HttpRequestConfig {\r\n url: string;\r\n method?: string;\r\n headers?: Record<string, string>;\r\n params?: Record<string, any>;\r\n data?: any;\r\n formData?: FormData; // 添加FormData支持\r\n onMessage?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n onComplete?: () => void;\r\n}\r\n\r\n/**\r\n * 统一的API响应接口\r\n */\r\nexport interface ApiResponse<T = any> {\r\n code: number;\r\n message: string;\r\n data?: T;\r\n}\r\n\r\n/**\r\n * HTTP响应接口\r\n */\r\nexport interface HttpResponse<T = any> {\r\n success: boolean;\r\n data?: T;\r\n error?: any;\r\n message?: string;\r\n}\r\n\r\n// 添加一个全局事件发射器用于处理401错误\r\nexport const createTokenInvalidEvent = () => {\r\n const event = new CustomEvent('pcm-token-invalid', {\r\n bubbles: true,\r\n composed: true,\r\n detail: { timestamp: new Date().getTime() },\r\n });\r\n document.dispatchEvent(event);\r\n};\r\n\r\n/**\r\n * 发送HTTP请求\r\n * @param config 请求配置\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<HttpResponse>\r\n */\r\nexport const sendHttpRequest = async <T = any>(config: HttpRequestConfig, isRetry = true): Promise<HttpResponse<T>> => {\r\n const { url, method = 'GET', headers = {}, params = {}, data, formData, onMessage } = config;\r\n\r\n try {\r\n // 构建URL和查询参数\r\n const queryParams = new URLSearchParams();\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n queryParams.append(key, String(value));\r\n }\r\n });\r\n\r\n // 使用 API_DOMAIN 拼接完整的请求URL\r\n let requestUrl = `${API_DOMAIN}${url}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`;\r\n // 如果没有提供 Authorization 头,则从 authStore 获取 token\r\n if (headers['authorization'] == undefined && headers['Authorization'] == undefined) {\r\n const token = getEffectiveToken();\r\n \r\n if (token) {\r\n headers['authorization'] = `Bearer ${token}`;\r\n }\r\n }\r\n\r\n // 创建请求配置对象\r\n const requestConfig: RequestInit = {\r\n method,\r\n headers: formData\r\n ? { ...headers }\r\n : {\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n };\r\n\r\n // 处理请求体\r\n if (formData) {\r\n // 如果提供了FormData,直接使用\r\n requestConfig.body = formData;\r\n } else if (method !== 'GET' && method !== 'HEAD' && data) {\r\n // 否则,如果是非GET/HEAD请求且有data,将其JSON序列化\r\n requestConfig.body = JSON.stringify(data);\r\n }\r\n\r\n // 如果是 GET 方法且有 data,将其作为查询参数添加到 URL\r\n if (method === 'GET' && data) {\r\n const dataParams = new URLSearchParams();\r\n Object.entries(data).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n dataParams.append(key, String(value));\r\n }\r\n });\r\n requestUrl += (queryParams.toString() ? '&' : '?') + dataParams.toString();\r\n }\r\n\r\n const response = await fetchWithTimeout(requestUrl, requestConfig);\r\n \r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 重试请求\r\n if (isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return sendHttpRequest(config, false);\r\n }\r\n }\r\n\r\n const responseData: ApiResponse<T> = await response.json();\r\n\r\n // 调用 onMessage 回调\r\n if (onMessage) {\r\n onMessage(responseData);\r\n }\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n console.error(`HTTP错误: ${response.status} ${response.statusText}`);\r\n return {\r\n success: false,\r\n message: responseData.message || `HTTP错误: ${response.status}`,\r\n error: responseData,\r\n };\r\n }\r\n\r\n // 检查业务状态码\r\n if (responseData.code !== 0) {\r\n console.error(`API错误: ${responseData.message}`);\r\n return {\r\n success: false,\r\n message: responseData.message,\r\n error: responseData,\r\n };\r\n }\r\n\r\n // 直接返回data\r\n return {\r\n success: true,\r\n data: responseData.data,\r\n };\r\n } catch (error) {\r\n console.error('HTTP请求错误:', error);\r\n \r\n // 如果是超时错误且允许重试,则重试一次\r\n if (error instanceof Error && error.message.includes('请求超时') && isRetry) {\r\n console.log('HTTP请求超时,正在重试...');\r\n syncDelay(1000); // 延迟1秒后重试\r\n return sendHttpRequest(config, false);\r\n }\r\n \r\n if (config.onError) {\r\n config.onError(error);\r\n }\r\n return {\r\n success: false,\r\n error,\r\n message: error instanceof Error ? error.message : '未知错误',\r\n };\r\n } finally {\r\n if (config.onComplete) {\r\n config.onComplete();\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * 验证API密钥\r\n * @param token API密钥\r\n * @returns Promise<boolean> 验证是否成功\r\n */\r\nexport const verifyApiKey = async (token: string): Promise<boolean> => {\r\n\r\n const response = await sendHttpRequest({\r\n url: '/sdk/v1/user',\r\n method: 'GET',\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n }, false);\r\n \r\n // 如果是401错误,同步延迟500毫秒后返回\r\n if (!response.success && response.error && response.error.code === 401) {\r\n // 执行同步延迟\r\n syncDelay(500);\r\n return false;\r\n } else {\r\n return response.success;\r\n }\r\n};\r\n\r\n/**\r\n * 获取智能体信息\r\n * @param botId 智能体ID\r\n * @returns Promise<any> 智能体信息数据\r\n */\r\nexport const fetchAgentInfo = async (botId: string): Promise<any> => {\r\n if (!botId) {\r\n throw new Error('智能体ID不能为空');\r\n }\r\n\r\n try {\r\n const response = await sendHttpRequest({\r\n url: `/sdk/v1/agent/${botId}/info`,\r\n method: 'GET',\r\n });\r\n\r\n if (!response.success) {\r\n throw new Error(response.message || '获取智能体信息失败');\r\n }\r\n\r\n return response.data;\r\n } catch (error) {\r\n console.error('获取智能体信息失败:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * 文件上传响应数据接口\r\n */\r\nexport interface FileUploadResponse {\r\n /** 文件在对象存储中的唯一标识符 */\r\n cos_key: string;\r\n /** 文件名称 */\r\n file_name: string;\r\n /** 文件大小(带单位的字符串,如 \"1.5MB\") */\r\n file_size: string;\r\n /** 文件的预签名URL */\r\n presigned_url: string;\r\n /** 文件扩展名 */\r\n ext: string;\r\n}\r\n\r\n/**\r\n * 通过后端API上传文件\r\n * @param file 要上传的文件\r\n * @param headers 可选的请求头\r\n * @param params 可选的额外参数\r\n * @returns Promise 包含上传结果\r\n */\r\nexport const uploadFileToBackend = async (file: File, headers?: Record<string, string>, params?: Record<string, any>): Promise<FileUploadResponse> => {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n // 添加额外参数到 formData\r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n formData.append(key, String(value));\r\n }\r\n });\r\n }\r\n\r\n try {\r\n const response = await sendHttpRequest<{ cos_key: string; file_name: string; file_size: string; presigned_url: string; ext: string }>({\r\n url: '/sdk/v1/files/upload',\r\n method: 'POST',\r\n headers: {\r\n ...headers,\r\n },\r\n formData,\r\n });\r\n\r\n if (!response.success || !response.data) {\r\n throw new Error(response.message || '文件上传失败');\r\n }\r\n\r\n return response.data;\r\n } catch (error) {\r\n console.error('文件上传错误:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * 合成语音音频\r\n * @param text 要转换为语音的文本\r\n * @param token API密钥(可选,如果不提供则从 authStore 获取)\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<string> 返回音频的Blob URL\r\n */\r\nexport const synthesizeAudio = async (text: string, token?: string, isRetry = false): Promise<string> => {\r\n // 如果没有提供 token,则从 authStore 获取\r\n const effectiveToken = token || getEffectiveToken();\r\n \r\n if (!effectiveToken) {\r\n throw new Error('API密钥不能为空');\r\n }\r\n\r\n try {\r\n const response = await fetchWithTimeout(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'authorization': 'Bearer ' + effectiveToken,\r\n },\r\n body: JSON.stringify({ text }),\r\n });\r\n\r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 如果不是重试请求,则使用同步延迟500毫秒后重试一次\r\n if (!isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return synthesizeAudio(text, token, true);\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error('语音合成失败');\r\n }\r\n\r\n // 获取音频数据并创建Blob URL\r\n const audioBlob = await response.blob();\r\n return URL.createObjectURL(audioBlob);\r\n } catch (error) {\r\n console.error('语音合成错误:', error);\r\n \r\n // 如果是超时错误且不是重试请求,则重试一次\r\n if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {\r\n console.log('语音合成请求超时,正在重试...');\r\n syncDelay(1000); // 延迟1秒后重试\r\n return synthesizeAudio(text, token, true);\r\n }\r\n \r\n throw error;\r\n }\r\n};\r\n"]}
|
package/dist/components/index.js
CHANGED
|
@@ -42,6 +42,36 @@ function format(first, middle, last) {
|
|
|
42
42
|
const getEffectiveToken = () => {
|
|
43
43
|
return authStore.getToken() || '';
|
|
44
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* 请求超时时间(毫秒)
|
|
47
|
+
*/
|
|
48
|
+
const REQUEST_TIMEOUT = 2 * 60 * 1000; // 2分钟
|
|
49
|
+
/**
|
|
50
|
+
* 创建带超时的 fetch 请求
|
|
51
|
+
* @param url 请求URL
|
|
52
|
+
* @param options fetch选项
|
|
53
|
+
* @param timeout 超时时间(毫秒)
|
|
54
|
+
* @returns Promise<Response>
|
|
55
|
+
*/
|
|
56
|
+
const fetchWithTimeout = async (url, options, timeout = REQUEST_TIMEOUT) => {
|
|
57
|
+
const controller = new AbortController();
|
|
58
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
59
|
+
try {
|
|
60
|
+
const response = await fetch(url, {
|
|
61
|
+
...options,
|
|
62
|
+
signal: controller.signal,
|
|
63
|
+
});
|
|
64
|
+
clearTimeout(timeoutId);
|
|
65
|
+
return response;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
clearTimeout(timeoutId);
|
|
69
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
70
|
+
throw new Error('请求超时,请检查网络连接后重试');
|
|
71
|
+
}
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
45
75
|
/**
|
|
46
76
|
* 发送 SSE 流式请求
|
|
47
77
|
* @param config 请求配置
|
|
@@ -60,7 +90,7 @@ const sendSSERequest = async (config, isRetry = false) => {
|
|
|
60
90
|
headers['authorization'] = `Bearer ${token}`;
|
|
61
91
|
}
|
|
62
92
|
}
|
|
63
|
-
const response = await
|
|
93
|
+
const response = await fetchWithTimeout(requestUrl, {
|
|
64
94
|
method,
|
|
65
95
|
headers: {
|
|
66
96
|
'Accept': 'text/event-stream',
|
|
@@ -113,6 +143,10 @@ const sendSSERequest = async (config, isRetry = false) => {
|
|
|
113
143
|
}
|
|
114
144
|
catch (error) {
|
|
115
145
|
console.error('SSE 请求错误:', error);
|
|
146
|
+
// 如果是超时错误且不是重试请求,则重试一次
|
|
147
|
+
if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {
|
|
148
|
+
return sendSSERequest(config, true);
|
|
149
|
+
}
|
|
116
150
|
onError?.(error);
|
|
117
151
|
}
|
|
118
152
|
};
|
|
@@ -179,7 +213,7 @@ const sendHttpRequest = async (config, isRetry = true) => {
|
|
|
179
213
|
});
|
|
180
214
|
requestUrl += (queryParams.toString() ? '&' : '?') + dataParams.toString();
|
|
181
215
|
}
|
|
182
|
-
const response = await
|
|
216
|
+
const response = await fetchWithTimeout(requestUrl, requestConfig);
|
|
183
217
|
// 检查是否为401错误(未授权)
|
|
184
218
|
if (response.status === 401) {
|
|
185
219
|
// 触发全局token无效事件
|
|
@@ -220,6 +254,10 @@ const sendHttpRequest = async (config, isRetry = true) => {
|
|
|
220
254
|
}
|
|
221
255
|
catch (error) {
|
|
222
256
|
console.error('HTTP请求错误:', error);
|
|
257
|
+
// 如果是超时错误且允许重试,则重试一次
|
|
258
|
+
if (error instanceof Error && error.message.includes('请求超时') && isRetry) {
|
|
259
|
+
return sendHttpRequest(config, false);
|
|
260
|
+
}
|
|
223
261
|
if (config.onError) {
|
|
224
262
|
config.onError(error);
|
|
225
263
|
}
|
|
@@ -331,7 +369,7 @@ const synthesizeAudio = async (text, token, isRetry = false) => {
|
|
|
331
369
|
throw new Error('API密钥不能为空');
|
|
332
370
|
}
|
|
333
371
|
try {
|
|
334
|
-
const response = await
|
|
372
|
+
const response = await fetchWithTimeout(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {
|
|
335
373
|
method: 'POST',
|
|
336
374
|
headers: {
|
|
337
375
|
'Content-Type': 'application/json',
|
|
@@ -357,6 +395,10 @@ const synthesizeAudio = async (text, token, isRetry = false) => {
|
|
|
357
395
|
}
|
|
358
396
|
catch (error) {
|
|
359
397
|
console.error('语音合成错误:', error);
|
|
398
|
+
// 如果是超时错误且不是重试请求,则重试一次
|
|
399
|
+
if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {
|
|
400
|
+
return synthesizeAudio(text, token, true);
|
|
401
|
+
}
|
|
360
402
|
throw error;
|
|
361
403
|
}
|
|
362
404
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"index.js","mappings":"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","names":[],"sources":["src/utils/env.ts","store/auth.store.ts","src/utils/utils.ts"],"sourcesContent":["// 默认 API 域名\r\nconst DEFAULT_API_DOMAIN = 'https://api.pincaimao.com/agents/platform';\r\n\r\n// 从环境变量获取 API 域名,如果未设置则使用默认值\r\nexport const API_DOMAIN = process.env.API_DOMAIN || DEFAULT_API_DOMAIN;\r\n\r\n// 导出其他环境变量\r\nexport const ENV = {\r\n API_DOMAIN,\r\n // 可以添加其他环境变量\r\n}; ","// src/store/auth.store.ts\r\nimport { createStore } from '@stencil/store';\r\n\r\nexport const { state: authState, onChange } = createStore({\r\n token: localStorage.getItem('pcm-sdk-auth-token') || null\r\n});\r\n\r\n// 添加一些辅助方法\r\nexport const authStore = {\r\n getToken: () => authState.token,\r\n setToken: (token: string) => {\r\n authState.token = token;\r\n localStorage.setItem('pcm-sdk-auth-token', token);\r\n },\r\n clearToken: () => {\r\n authState.token = null;\r\n localStorage.removeItem('pcm-sdk-auth-token');\r\n }\r\n};\r\n\r\n// 自动保存到localStorage\r\nonChange('token', value => {\r\n if (value) {\r\n localStorage.setItem('pcm-sdk-auth-token', value);\r\n } else {\r\n localStorage.removeItem('pcm-sdk-auth-token');\r\n }\r\n});","// 导入环境变量\r\nimport { API_DOMAIN } from './env';\r\nimport { authStore } from '../../store/auth.store'; // 导入 authStore\r\n\r\nexport { API_DOMAIN };\r\n\r\nexport function format(first?: string, middle?: string, last?: string): string {\r\n return (first || '') + (middle ? ` ${middle}` : '') + (last ? ` ${last}` : '');\r\n}\r\n\r\n// 添加类型定义\r\nexport interface UserInputMessageType {\r\n message: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface WorkFlowNode {\r\n message_id?: string;\r\n conversation_id?: string;\r\n created_at?: string;\r\n event?: string;\r\n answer?: string;\r\n data?: {\r\n outputs?: {\r\n answer?: string;\r\n };\r\n status?: string;\r\n error?: any;\r\n };\r\n}\r\n\r\nexport interface MessageRound extends UserInputMessageType {\r\n id?: string;\r\n conversation_id?: string;\r\n created_at?: string;\r\n answer?: string;\r\n status?: string;\r\n error?: any;\r\n}\r\n\r\n/**\r\n * 将工作流节点转换为消息轮次\r\n * @param message_event 消息事件类型\r\n * @param inputMessage 用户输入消息\r\n * @param streamNode 工作流节点\r\n * @returns 消息轮次\r\n */\r\nexport const convertWorkflowStreamNodeToMessageRound = (message_event: string, inputMessage: UserInputMessageType, streamNode: WorkFlowNode): MessageRound => {\r\n const messageRound: MessageRound = {\r\n ...inputMessage,\r\n };\r\n if (message_event === 'workflow_finished') messageRound.answer = streamNode.data?.outputs?.answer;\r\n if (message_event === 'agent_message' || message_event === 'message') messageRound.answer = streamNode?.answer;\r\n messageRound.id = streamNode.message_id;\r\n messageRound.conversation_id = streamNode.conversation_id;\r\n messageRound.created_at = streamNode.created_at;\r\n messageRound.status = streamNode.data?.status;\r\n messageRound.error = streamNode.data?.error;\r\n return messageRound;\r\n};\r\n\r\n/**\r\n * SSE 流式请求配置接口\r\n */\r\nexport interface SSERequestConfig {\r\n url: string;\r\n method: string;\r\n headers?: Record<string, string>;\r\n data?: any;\r\n onMessage?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n onComplete?: () => void;\r\n}\r\n\r\n/**\r\n * 同步延迟函数,阻塞主线程指定的毫秒数\r\n * @param ms 延迟的毫秒数\r\n */\r\nconst syncDelay = (ms: number) => {\r\n const start = Date.now();\r\n while(Date.now() - start < ms) {\r\n // 空循环,阻塞主线程\r\n }\r\n};\r\n\r\n/**\r\n * 获取有效的 token,从 authStore 中获取\r\n * @returns string 有效的 token\r\n */\r\nexport const getEffectiveToken = (): string => {\r\n return authStore.getToken() || '';\r\n};\r\n\r\n/**\r\n * 发送 SSE 流式请求\r\n * @param config 请求配置\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<void>\r\n */\r\nexport const sendSSERequest = async (config: SSERequestConfig, isRetry = false): Promise<void> => {\r\n const { url, method, headers = {}, data, onMessage, onError, onComplete } = config;\r\n\r\n try {\r\n // 使用 API_DOMAIN 拼接完整的请求URL\r\n const requestUrl = `${API_DOMAIN}${url}`;\r\n\r\n // 如果没有提供 Authorization 头,则从 authStore 获取 token\r\n if (!headers['authorization'] && !headers['Authorization']) {\r\n const token = getEffectiveToken();\r\n if (token) {\r\n headers['authorization'] = `Bearer ${token}`;\r\n }\r\n }\r\n\r\n const response = await fetch(requestUrl, {\r\n method,\r\n headers: {\r\n 'Accept': 'text/event-stream',\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n\r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 如果不是重试请求,则使用同步延迟500毫秒后重试一次\r\n if (!isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return sendSSERequest(config, true);\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n console.error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const reader = response.body?.getReader();\r\n if (!reader) throw new Error('No reader available');\r\n\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n while (true) {\r\n const { value, done } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n\r\n // 处理缓冲区中的完整消息\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || ''; // 保留最后一个不完整的行\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data:')) {\r\n try {\r\n const jsonStr = line.substring(5).trim();\r\n if (!jsonStr) continue;\r\n\r\n const data = JSON.parse(jsonStr);\r\n onMessage?.(data);\r\n } catch (e) {\r\n console.error('解析 SSE 数据错误:', e, '原始数据:', line);\r\n }\r\n }\r\n }\r\n }\r\n\r\n onComplete?.();\r\n } catch (error) {\r\n console.error('SSE 请求错误:', error);\r\n onError?.(error);\r\n }\r\n};\r\n\r\n/**\r\n * HTTP请求配置接口\r\n */\r\nexport interface HttpRequestConfig {\r\n url: string;\r\n method?: string;\r\n headers?: Record<string, string>;\r\n params?: Record<string, any>;\r\n data?: any;\r\n formData?: FormData; // 添加FormData支持\r\n onMessage?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n onComplete?: () => void;\r\n}\r\n\r\n/**\r\n * 统一的API响应接口\r\n */\r\nexport interface ApiResponse<T = any> {\r\n code: number;\r\n message: string;\r\n data?: T;\r\n}\r\n\r\n/**\r\n * HTTP响应接口\r\n */\r\nexport interface HttpResponse<T = any> {\r\n success: boolean;\r\n data?: T;\r\n error?: any;\r\n message?: string;\r\n}\r\n\r\n// 添加一个全局事件发射器用于处理401错误\r\nexport const createTokenInvalidEvent = () => {\r\n const event = new CustomEvent('pcm-token-invalid', {\r\n bubbles: true,\r\n composed: true,\r\n detail: { timestamp: new Date().getTime() },\r\n });\r\n document.dispatchEvent(event);\r\n};\r\n\r\n/**\r\n * 发送HTTP请求\r\n * @param config 请求配置\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<HttpResponse>\r\n */\r\nexport const sendHttpRequest = async <T = any>(config: HttpRequestConfig, isRetry = true): Promise<HttpResponse<T>> => {\r\n const { url, method = 'GET', headers = {}, params = {}, data, formData, onMessage } = config;\r\n\r\n try {\r\n // 构建URL和查询参数\r\n const queryParams = new URLSearchParams();\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n queryParams.append(key, String(value));\r\n }\r\n });\r\n\r\n // 使用 API_DOMAIN 拼接完整的请求URL\r\n let requestUrl = `${API_DOMAIN}${url}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`;\r\n // 如果没有提供 Authorization 头,则从 authStore 获取 token\r\n if (headers['authorization'] == undefined && headers['Authorization'] == undefined) {\r\n const token = getEffectiveToken();\r\n \r\n if (token) {\r\n headers['authorization'] = `Bearer ${token}`;\r\n }\r\n }\r\n\r\n // 创建请求配置对象\r\n const requestConfig: RequestInit = {\r\n method,\r\n headers: formData\r\n ? { ...headers }\r\n : {\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n };\r\n\r\n // 处理请求体\r\n if (formData) {\r\n // 如果提供了FormData,直接使用\r\n requestConfig.body = formData;\r\n } else if (method !== 'GET' && method !== 'HEAD' && data) {\r\n // 否则,如果是非GET/HEAD请求且有data,将其JSON序列化\r\n requestConfig.body = JSON.stringify(data);\r\n }\r\n\r\n // 如果是 GET 方法且有 data,将其作为查询参数添加到 URL\r\n if (method === 'GET' && data) {\r\n const dataParams = new URLSearchParams();\r\n Object.entries(data).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n dataParams.append(key, String(value));\r\n }\r\n });\r\n requestUrl += (queryParams.toString() ? '&' : '?') + dataParams.toString();\r\n }\r\n\r\n const response = await fetch(requestUrl, requestConfig);\r\n \r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 重试请求\r\n if (isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return sendHttpRequest(config, false);\r\n }\r\n }\r\n\r\n const responseData: ApiResponse<T> = await response.json();\r\n\r\n // 调用 onMessage 回调\r\n if (onMessage) {\r\n onMessage(responseData);\r\n }\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n console.error(`HTTP错误: ${response.status} ${response.statusText}`);\r\n return {\r\n success: false,\r\n message: responseData.message || `HTTP错误: ${response.status}`,\r\n error: responseData,\r\n };\r\n }\r\n\r\n // 检查业务状态码\r\n if (responseData.code !== 0) {\r\n console.error(`API错误: ${responseData.message}`);\r\n return {\r\n success: false,\r\n message: responseData.message,\r\n error: responseData,\r\n };\r\n }\r\n\r\n // 直接返回data\r\n return {\r\n success: true,\r\n data: responseData.data,\r\n };\r\n } catch (error) {\r\n console.error('HTTP请求错误:', error);\r\n if (config.onError) {\r\n config.onError(error);\r\n }\r\n return {\r\n success: false,\r\n error,\r\n message: error instanceof Error ? error.message : '未知错误',\r\n };\r\n } finally {\r\n if (config.onComplete) {\r\n config.onComplete();\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * 验证API密钥\r\n * @param token API密钥\r\n * @returns Promise<boolean> 验证是否成功\r\n */\r\nexport const verifyApiKey = async (token: string): Promise<boolean> => {\r\n\r\n const response = await sendHttpRequest({\r\n url: '/sdk/v1/user',\r\n method: 'GET',\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n }, false);\r\n \r\n // 如果是401错误,同步延迟500毫秒后返回\r\n if (!response.success && response.error && response.error.code === 401) {\r\n // 执行同步延迟\r\n syncDelay(500);\r\n return false;\r\n } else {\r\n return response.success;\r\n }\r\n};\r\n\r\n/**\r\n * 获取智能体信息\r\n * @param botId 智能体ID\r\n * @returns Promise<any> 智能体信息数据\r\n */\r\nexport const fetchAgentInfo = async (botId: string): Promise<any> => {\r\n \r\n if (!botId) {\r\n throw new Error('智能体ID不能为空');\r\n }\r\n\r\n try {\r\n const response = await sendHttpRequest({\r\n url: `/sdk/v1/agent/${botId}/info`,\r\n method: 'GET',\r\n });\r\n\r\n if (!response.success) {\r\n throw new Error(response.message || '获取智能体信息失败');\r\n }\r\n\r\n return response.data;\r\n } catch (error) {\r\n console.error('获取智能体信息失败:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * 文件上传响应数据接口\r\n */\r\nexport interface FileUploadResponse {\r\n /** 文件在对象存储中的唯一标识符 */\r\n cos_key: string;\r\n /** 文件名称 */\r\n file_name: string;\r\n /** 文件大小(带单位的字符串,如 \"1.5MB\") */\r\n file_size: string;\r\n /** 文件的预签名URL */\r\n presigned_url: string;\r\n /** 文件扩展名 */\r\n ext: string;\r\n}\r\n\r\n/**\r\n * 通过后端API上传文件\r\n * @param file 要上传的文件\r\n * @param headers 可选的请求头\r\n * @param params 可选的额外参数\r\n * @returns Promise 包含上传结果\r\n */\r\nexport const uploadFileToBackend = async (file: File, headers?: Record<string, string>, params?: Record<string, any>): Promise<FileUploadResponse> => {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n // 添加额外参数到 formData\r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n formData.append(key, String(value));\r\n }\r\n });\r\n }\r\n\r\n try {\r\n const response = await sendHttpRequest<{ cos_key: string; file_name: string; file_size: string; presigned_url: string; ext: string }>({\r\n url: '/sdk/v1/files/upload',\r\n method: 'POST',\r\n headers: {\r\n ...headers,\r\n },\r\n formData,\r\n });\r\n\r\n if (!response.success || !response.data) {\r\n throw new Error(response.message || '文件上传失败');\r\n }\r\n\r\n return response.data;\r\n } catch (error) {\r\n console.error('文件上传错误:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * 合成语音音频\r\n * @param text 要转换为语音的文本\r\n * @param token API密钥(可选,如果不提供则从 authStore 获取)\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<string> 返回音频的Blob URL\r\n */\r\nexport const synthesizeAudio = async (text: string, token?: string, isRetry = false): Promise<string> => {\r\n // 如果没有提供 token,则从 authStore 获取\r\n const effectiveToken = token || getEffectiveToken();\r\n \r\n if (!effectiveToken) {\r\n throw new Error('API密钥不能为空');\r\n }\r\n\r\n try {\r\n const response = await fetch(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'authorization': 'Bearer ' + effectiveToken,\r\n },\r\n body: JSON.stringify({ text }),\r\n });\r\n\r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 如果不是重试请求,则使用同步延迟500毫秒后重试一次\r\n if (!isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return synthesizeAudio(text, token, true);\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error('语音合成失败');\r\n }\r\n\r\n // 获取音频数据并创建Blob URL\r\n const audioBlob = await response.blob();\r\n return URL.createObjectURL(audioBlob);\r\n } catch (error) {\r\n console.error('语音合成错误:', error);\r\n throw error;\r\n }\r\n};\r\n"],"version":3}
|
|
1
|
+
{"file":"index.js","mappings":";;;AAAA;AAGA;AACO,MAAM,UAAU,GAAG,2CAA4C;;ACJtE;AAGO,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;IACxD,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI;AACtD,CAAA,CAAC;AAEF;AACa,MAAA,SAAS,GAAG;AACvB,IAAA,QAAQ,EAAE,MAAM,SAAS,CAAC,KAAK;AAC/B,IAAA,QAAQ,EAAE,CAAC,KAAa,KAAI;AAC1B,QAAA,SAAS,CAAC,KAAK,GAAG,KAAK;AACvB,QAAA,YAAY,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC;KAClD;IACD,UAAU,EAAE,MAAK;AACf,QAAA,SAAS,CAAC,KAAK,GAAG,IAAI;AACtB,QAAA,YAAY,CAAC,UAAU,CAAC,oBAAoB,CAAC;;;AAIjD;AACA,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAG;IACxB,IAAI,KAAK,EAAE;AACT,QAAA,YAAY,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC;;SAC5C;AACL,QAAA,YAAY,CAAC,UAAU,CAAC,oBAAoB,CAAC;;AAEjD,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":[],"sources":["src/utils/env.ts","store/auth.store.ts"],"sourcesContent":["// 默认 API 域名\r\nconst DEFAULT_API_DOMAIN = 'https://api.pincaimao.com/agents/platform';\r\n\r\n// 从环境变量获取 API 域名,如果未设置则使用默认值\r\nexport const API_DOMAIN = process.env.API_DOMAIN || DEFAULT_API_DOMAIN;\r\n\r\n// 导出其他环境变量\r\nexport const ENV = {\r\n API_DOMAIN,\r\n // 可以添加其他环境变量\r\n}; ","// src/store/auth.store.ts\r\nimport { createStore } from '@stencil/store';\r\n\r\nexport const { state: authState, onChange } = createStore({\r\n token: localStorage.getItem('pcm-sdk-auth-token') || null\r\n});\r\n\r\n// 添加一些辅助方法\r\nexport const authStore = {\r\n getToken: () => authState.token,\r\n setToken: (token: string) => {\r\n authState.token = token;\r\n localStorage.setItem('pcm-sdk-auth-token', token);\r\n },\r\n clearToken: () => {\r\n authState.token = null;\r\n localStorage.removeItem('pcm-sdk-auth-token');\r\n }\r\n};\r\n\r\n// 自动保存到localStorage\r\nonChange('token', value => {\r\n if (value) {\r\n localStorage.setItem('pcm-sdk-auth-token', value);\r\n } else {\r\n localStorage.removeItem('pcm-sdk-auth-token');\r\n }\r\n});"],"version":3}
|