#AI
zhou zhou
4 小时以前 51877df13075ad10ef51107f15bcd21f1661febe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package com.vincent.rsf.server.ai.service;
 
import com.vincent.rsf.server.ai.config.AiProperties;
import com.vincent.rsf.server.system.entity.AiParam;
import com.vincent.rsf.server.system.service.AiParamService;
import lombok.Data;
import org.springframework.stereotype.Service;
 
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
 
@Service
public class AiRuntimeConfigService {
 
    @Resource
    private AiProperties aiProperties;
    @Resource
    private AiParamService aiParamService;
 
    /**
     * 枚举当前可用的模型运行时配置。
     * 优先从数据库读取租户可运营的模型参数;数据库不可用时回退到 application 配置。
     */
    public List<ModelRuntimeConfig> listEnabledModels() {
        List<ModelRuntimeConfig> output = new ArrayList<>();
        try {
            List<AiParam> list = aiParamService.listEnabledModels();
            for (AiParam item : list) {
                output.add(toRuntimeConfig(item));
            }
        } catch (Exception ignore) {
        }
        if (!output.isEmpty()) {
            return output;
        }
        for (AiProperties.ModelConfig model : aiProperties.getEnabledModels()) {
            ModelRuntimeConfig config = new ModelRuntimeConfig();
            config.setCode(model.getCode());
            config.setName(model.getName());
            config.setProvider(model.getProvider());
            config.setSystemPrompt(aiProperties.getSystemPrompt());
            config.setMaxContextMessages(aiProperties.getMaxContextMessages());
            config.setEnabled(model.getEnabled());
            output.add(config);
        }
        return output;
    }
 
    /**
     * 解析指定模型编码对应的运行时配置。
     * 如果未指定模型编码,则返回当前默认模型;如果数据库无记录,则回退到静态配置。
     */
    public ModelRuntimeConfig resolveModel(String modelCode) {
        try {
            AiParam aiParam;
            if (modelCode == null || modelCode.trim().isEmpty()) {
                aiParam = aiParamService.getDefaultModel();
            } else {
                aiParam = aiParamService.getEnabledModel(modelCode);
            }
            if (aiParam != null) {
                return toRuntimeConfig(aiParam);
            }
        } catch (Exception ignore) {
        }
        String targetCode = modelCode;
        if (targetCode == null || targetCode.trim().isEmpty()) {
            targetCode = aiProperties.resolveDefaultModelCode();
        }
        for (AiProperties.ModelConfig model : aiProperties.getEnabledModels()) {
            if (targetCode.equals(model.getCode())) {
                ModelRuntimeConfig config = new ModelRuntimeConfig();
                config.setCode(model.getCode());
                config.setName(model.getName());
                config.setProvider(model.getProvider());
                config.setSystemPrompt(aiProperties.getSystemPrompt());
                config.setMaxContextMessages(aiProperties.getMaxContextMessages());
                config.setEnabled(model.getEnabled());
                return config;
            }
        }
        ModelRuntimeConfig config = new ModelRuntimeConfig();
        config.setCode(aiProperties.resolveDefaultModelCode());
        config.setName(aiProperties.resolveDefaultModelCode());
        config.setProvider("mock");
        config.setSystemPrompt(aiProperties.getSystemPrompt());
        config.setMaxContextMessages(aiProperties.getMaxContextMessages());
        config.setEnabled(true);
        return config;
    }
 
    /**
     * 获取系统当前默认模型编码。
     */
    public String resolveDefaultModelCode() {
        return resolveModel(null).getCode();
    }
 
    /**
     * 将数据库中的 AI 参数实体转换为运行时统一使用的模型配置对象。
     */
    private ModelRuntimeConfig toRuntimeConfig(AiParam aiParam) {
        ModelRuntimeConfig config = new ModelRuntimeConfig();
        config.setCode(aiParam.getModelCode());
        config.setName(aiParam.getName());
        config.setProvider(aiParam.getProvider());
        config.setChatUrl(aiParam.getChatUrl());
        config.setApiKey(aiParam.getApiKey());
        config.setModelName(aiParam.getModelName());
        config.setSystemPrompt(aiParam.getSystemPrompt() == null || aiParam.getSystemPrompt().trim().isEmpty()
                ? aiProperties.getSystemPrompt()
                : aiParam.getSystemPrompt());
        config.setMaxContextMessages(aiParam.getMaxContextMessages() == null || aiParam.getMaxContextMessages() <= 0
                ? aiProperties.getMaxContextMessages()
                : aiParam.getMaxContextMessages());
        config.setEnabled(Integer.valueOf(1).equals(aiParam.getStatus()));
        return config;
    }
 
    @Data
    public static class ModelRuntimeConfig {
        private String code;
        private String name;
        private String provider;
        private String chatUrl;
        private String apiKey;
        private String modelName;
        private String systemPrompt;
        private Integer maxContextMessages;
        private Boolean enabled;
    }
}