Files
prompt-optimizer/packages/core/src/utils/environment.ts
linshen bf9d98eb69 新增 Vercel 跨域代理支持和环境检测功能
- 在核心服务中添加 Vercel 环境检测和代理工具函数
- 更新 LLM 服务,支持通过 Vercel 代理解决跨域问题
- 扩展模型配置类型,新增 `useVercelProxy` 选项
- 在 ModelManager 组件中添加 Vercel 代理可用性检测和配置
- 更新技术开发指南,详细说明跨域代理解决方案
- 调整 Vercel 配置,支持 API 代理和环境变量设置
2025-03-03 00:25:02 +08:00

102 lines
2.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 环境工具函数
*/
// 存储Vercel环境检测结果的缓存
let vercelStatusCache: { available: boolean; checked: boolean } = {
available: false,
checked: false
};
/**
* 检查是否在浏览器环境中
*/
export const isBrowser = (): boolean => {
return typeof window !== 'undefined';
};
/**
* 检测Vercel API是否可用
* 使用异步方式检测,结果会被缓存
*/
export const checkVercelApiAvailability = async (): Promise<boolean> => {
// 如果已经检查过,直接返回缓存结果
if (vercelStatusCache.checked) {
return vercelStatusCache.available;
}
if (!isBrowser()) {
vercelStatusCache = { available: false, checked: true };
return false;
}
try {
// 获取当前域名作为基础URL
const origin = window.location.origin;
const response = await fetch(`${origin}/api/vercel-status`, {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
// 设置较短的超时时间,避免长时间等待
signal: AbortSignal.timeout(3000)
});
// 检查响应状态只有200状态码且内容proxySupport为true
if (response.status !== 200) {
vercelStatusCache = { available: false, checked: true };
console.log('[环境检测] 未检测到Vercel部署环境代理功能不可用');
return false;
}
// 解析JSON响应
const data = await response.json();
const isAvailable = data.status === 'available' && data.proxySupport === true;
vercelStatusCache = { available: isAvailable, checked: true };
if (isAvailable) {
console.log('[环境检测] 检测到Vercel部署环境代理功能可用');
} else {
console.log('[环境检测] 未检测到Vercel部署环境代理功能不可用');
}
return isAvailable;
} catch (error) {
console.log('[环境检测] Vercel API检测失败', error);
vercelStatusCache = { available: false, checked: true };
return false;
}
};
/**
* 重置环境检测缓存
* 用于在需要重新检测时调用
*/
export const resetVercelStatusCache = (): void => {
vercelStatusCache = { available: false, checked: false };
};
/**
* 检查是否在Vercel环境中同步版本使用缓存结果
*/
export const isVercel = (): boolean => {
// 如果未检查过返回false应用需要先调用异步检测方法
return vercelStatusCache.checked && vercelStatusCache.available;
};
/**
* 获取API代理URL
* @param baseURL 原始基础URL
* @param isStream 是否是流式请求
*/
export const getProxyUrl = (baseURL: string | undefined, isStream: boolean = false): string => {
if (!baseURL) {
return '';
}
// 获取当前域名作为基础URL
const origin = isBrowser() ? window.location.origin : '';
const proxyEndpoint = isStream ? 'stream' : 'proxy';
// 返回完整的绝对URL
return `${origin}/api/${proxyEndpoint}?targetUrl=${encodeURIComponent(baseURL)}`;
};