Files
20260512-skg-tk/web/canvas-app/src/hooks/useProvider.js

125 lines
2.8 KiB
JavaScript

/**
* Provider Hook | 渠道管理 Hook
* 管理当前选中的 API 渠道,提供请求/响应适配功能
*/
import { ref, computed } from 'vue'
import { PROVIDERS, getProviderList, getDefaultProvider, getProviderConfig } from '@/config/providers'
// 存储键名
const STORAGE_KEY = 'api-provider'
/**
* Get stored value from localStorage | 从 localStorage 获取存储值
*/
const getStored = (key, defaultValue = '') => {
try {
return localStorage.getItem(key) || defaultValue
} catch {
return defaultValue
}
}
/**
* Set stored value to localStorage | 设置存储值到 localStorage
*/
const setStored = (key, value) => {
try {
localStorage.setItem(key, value)
} catch {
// ignore
}
}
/**
* Remove stored value from localStorage | 从 localStorage 移除存储值
*/
const removeStored = (key) => {
try {
localStorage.removeItem(key)
} catch {
// ignore
}
}
/**
* 获取存储的渠道
*/
const getStoredProvider = () => {
return getStored(STORAGE_KEY)
}
/**
* Provider Hook | 渠道管理 Hook
*/
export const useProvider = () => {
// 当前选中的渠道
const currentProvider = ref(getStoredProvider() || getDefaultProvider())
// 渠道列表
const providerList = getProviderList()
// 当前渠道配置
const providerConfig = computed(() => getProviderConfig(currentProvider.value))
// 当前渠道标签
const providerLabel = computed(() => providerConfig.value.label || currentProvider.value)
/**
* 设置当前渠道
*/
const setProvider = (provider) => {
if (PROVIDERS[provider]) {
currentProvider.value = provider
setStored(STORAGE_KEY, provider)
}
}
/**
* 清除渠道配置
*/
const clearProvider = () => {
currentProvider.value = getDefaultProvider()
removeStored(STORAGE_KEY)
}
/**
* 适配请求参数
* @param {string} type - 请求类型:'chat' | 'image' | 'video'
* @param {Object} params - 原始请求参数
*/
const adaptRequest = (type, params) => {
const config = providerConfig.value
if (config.requestAdapter && config.requestAdapter[type]) {
return config.requestAdapter[type](params)
}
// 如果没有适配器,返回原始参数
return params
}
/**
* 适配响应数据
* @param {string} type - 响应类型:'chat' | 'image' | 'video'
* @param {Object} response - 原始响应数据
*/
const adaptResponse = (type, response) => {
const config = providerConfig.value
if (config.responseAdapter && config.responseAdapter[type]) {
return config.responseAdapter[type](response)
}
// 如果没有适配器,返回原始响应
return response
}
return {
currentProvider,
providerList,
providerConfig,
providerLabel,
setProvider,
clearProvider,
adaptRequest,
adaptResponse
}
}