apiUtils.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import { formatMessageForAPI } from './messageUtils';
  2. // 构建API请求载荷
  3. export const buildApiPayload = (messages, systemPrompt, inputs, parameterEnabled) => {
  4. const processedMessages = messages.map(formatMessageForAPI);
  5. // 如果有系统提示,插入到消息开头
  6. if (systemPrompt && systemPrompt.trim()) {
  7. processedMessages.unshift({
  8. role: 'system',
  9. content: systemPrompt.trim()
  10. });
  11. }
  12. const payload = {
  13. model: inputs.model,
  14. messages: processedMessages,
  15. stream: inputs.stream,
  16. };
  17. // 添加启用的参数
  18. if (parameterEnabled.temperature && inputs.temperature !== undefined) {
  19. payload.temperature = inputs.temperature;
  20. }
  21. if (parameterEnabled.top_p && inputs.top_p !== undefined) {
  22. payload.top_p = inputs.top_p;
  23. }
  24. if (parameterEnabled.max_tokens && inputs.max_tokens !== undefined) {
  25. payload.max_tokens = inputs.max_tokens;
  26. }
  27. if (parameterEnabled.frequency_penalty && inputs.frequency_penalty !== undefined) {
  28. payload.frequency_penalty = inputs.frequency_penalty;
  29. }
  30. if (parameterEnabled.presence_penalty && inputs.presence_penalty !== undefined) {
  31. payload.presence_penalty = inputs.presence_penalty;
  32. }
  33. if (parameterEnabled.seed && inputs.seed !== undefined && inputs.seed !== null) {
  34. payload.seed = inputs.seed;
  35. }
  36. return payload;
  37. };
  38. // 处理API错误响应
  39. export const handleApiError = (error, response = null) => {
  40. const errorInfo = {
  41. error: error.message || '未知错误',
  42. timestamp: new Date().toISOString(),
  43. stack: error.stack
  44. };
  45. if (response) {
  46. errorInfo.status = response.status;
  47. errorInfo.statusText = response.statusText;
  48. }
  49. if (error.message.includes('HTTP error')) {
  50. errorInfo.details = '服务器返回了错误状态码';
  51. } else if (error.message.includes('Failed to fetch')) {
  52. errorInfo.details = '网络连接失败或服务器无响应';
  53. }
  54. return errorInfo;
  55. };
  56. // 处理模型数据
  57. export const processModelsData = (data, currentModel) => {
  58. const modelOptions = data.map(model => ({
  59. label: model,
  60. value: model,
  61. }));
  62. const hasCurrentModel = modelOptions.some(option => option.value === currentModel);
  63. const selectedModel = hasCurrentModel && modelOptions.length > 0
  64. ? currentModel
  65. : modelOptions[0]?.value;
  66. return { modelOptions, selectedModel };
  67. };
  68. // 处理分组数据
  69. export const processGroupsData = (data, userGroup) => {
  70. let groupOptions = Object.entries(data).map(([group, info]) => ({
  71. label: info.desc.length > 20 ? info.desc.substring(0, 20) + '...' : info.desc,
  72. value: group,
  73. ratio: info.ratio,
  74. fullLabel: info.desc,
  75. }));
  76. if (groupOptions.length === 0) {
  77. groupOptions = [{
  78. label: '用户分组',
  79. value: '',
  80. ratio: 1,
  81. }];
  82. } else if (userGroup) {
  83. const userGroupIndex = groupOptions.findIndex(g => g.value === userGroup);
  84. if (userGroupIndex > -1) {
  85. const userGroupOption = groupOptions.splice(userGroupIndex, 1)[0];
  86. groupOptions.unshift(userGroupOption);
  87. }
  88. }
  89. return groupOptions;
  90. };