Skip to content

Commit 53aa8a5

Browse files
authored
feat: Update AI route configurations after updating an LLM provider with specific types (higress-group#550)
1 parent d603d42 commit 53aa8a5

File tree

5 files changed

+54
-1
lines changed

5 files changed

+54
-1
lines changed

backend/sdk/src/main/java/com/alibaba/higress/sdk/service/HigressServiceProviderImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class HigressServiceProviderImpl implements HigressServiceProvider {
6969
llmProviderService = new LlmProviderServiceImpl(serviceSourceService, wasmPluginInstanceService);
7070
aiRouteService = new AiRouteServiceImpl(kubernetesModelConverter, kubernetesClientService, routeService,
7171
llmProviderService, wasmPluginInstanceService);
72+
((LlmProviderServiceImpl)llmProviderService).setAiRouteService(aiRouteService);
7273
mcpServerService = new McpServiceContextImpl(kubernetesClientService, kubernetesModelConverter,
7374
wasmPluginInstanceService, routeService);
7475
}

backend/sdk/src/main/java/com/alibaba/higress/sdk/service/ai/LlmProviderHandler.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,20 @@ default LlmProvider createProvider() {
4040

4141
ServiceSource buildServiceSource(String providerName, Map<String, Object> providerConfig);
4242

43-
default List<ServiceSource> getExtraServiceSources(String providerName, Map<String, Object> providerConfig, boolean forDelete) {
43+
default List<ServiceSource> getExtraServiceSources(String providerName, Map<String, Object> providerConfig,
44+
boolean forDelete) {
4445
return null;
4546
}
4647

4748
UpstreamService buildUpstreamService(String providerName, Map<String, Object> providerConfig);
49+
50+
/**
51+
* For some LLM providers, the upstream service name may change after an update. So we need to sync the
52+
* configuration of related AI routes after updating a provider.
53+
*
54+
* @return true if a sync is required.
55+
*/
56+
default boolean needSyncRouteAfterUpdate() {
57+
return false;
58+
}
4859
}

backend/sdk/src/main/java/com/alibaba/higress/sdk/service/ai/LlmProviderServiceImpl.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.alibaba.higress.sdk.model.ServiceSource;
3838
import com.alibaba.higress.sdk.model.WasmPluginInstance;
3939
import com.alibaba.higress.sdk.model.WasmPluginInstanceScope;
40+
import com.alibaba.higress.sdk.model.ai.AiRoute;
4041
import com.alibaba.higress.sdk.model.ai.LlmProvider;
4142
import com.alibaba.higress.sdk.model.ai.LlmProviderProtocol;
4243
import com.alibaba.higress.sdk.model.ai.LlmProviderType;
@@ -46,6 +47,8 @@
4647
import com.alibaba.higress.sdk.service.kubernetes.crd.mcp.V1McpBridge;
4748
import com.alibaba.higress.sdk.util.MapUtil;
4849

50+
import lombok.Setter;
51+
4952
@SuppressWarnings("unchecked")
5053
public class LlmProviderServiceImpl implements LlmProviderService {
5154

@@ -86,6 +89,8 @@ public class LlmProviderServiceImpl implements LlmProviderService {
8689

8790
private final ServiceSourceService serviceSourceService;
8891
private final WasmPluginInstanceService wasmPluginInstanceService;
92+
@Setter
93+
private AiRouteService aiRouteService;
8994

9095
public LlmProviderServiceImpl(ServiceSourceService serviceSourceService,
9196
WasmPluginInstanceService wasmPluginInstanceService) {
@@ -173,6 +178,10 @@ public LlmProvider addOrUpdate(LlmProvider provider) {
173178
serviceSourceService.addOrUpdate(serviceSource);
174179
wasmPluginInstanceService.addOrUpdate(serviceInstance);
175180

181+
if (handler.needSyncRouteAfterUpdate()) {
182+
syncRelatedAiRoutes(provider);
183+
}
184+
176185
return query(provider.getName());
177186
}
178187

@@ -272,6 +281,28 @@ public UpstreamService buildUpstreamService(String providerName) {
272281
return handler.buildUpstreamService(provider.getName(), provider.getRawConfigs());
273282
}
274283

284+
private void syncRelatedAiRoutes(LlmProvider provider) {
285+
AiRouteService aiRouteService = this.aiRouteService;
286+
if (aiRouteService == null) {
287+
return;
288+
}
289+
290+
PaginatedResult<AiRoute> aiRoutes = aiRouteService.list(null);
291+
if (aiRoutes == null || CollectionUtils.isEmpty(aiRoutes.getData())) {
292+
return;
293+
}
294+
295+
String providerName = provider.getName();
296+
for (AiRoute aiRoute : aiRoutes.getData()) {
297+
if (CollectionUtils.isEmpty(aiRoute.getUpstreams())) {
298+
continue;
299+
}
300+
if (aiRoute.getUpstreams().stream().anyMatch(u -> providerName.equals(u.getProvider()))) {
301+
aiRouteService.update(aiRoute);
302+
}
303+
}
304+
}
305+
275306
private SortedMap<String, LlmProvider> getProviders() {
276307
WasmPluginInstance instance =
277308
wasmPluginInstanceService.query(WasmPluginInstanceScope.GLOBAL, null, BuiltInPluginName.AI_PROXY, true);

backend/sdk/src/main/java/com/alibaba/higress/sdk/service/ai/OllamaLlmProviderHandler.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ public void normalizeConfigs(Map<String, Object> configurations) {
5757
configurations.put(SERVER_PORT_KEY, serverPort);
5858
}
5959

60+
@Override
61+
public boolean needSyncRouteAfterUpdate() {
62+
return true;
63+
}
64+
6065
@Override
6166
protected List<LlmProviderEndpoint> getProviderEndpoints(Map<String, Object> providerConfig) {
6267
return Collections.singletonList(new LlmProviderEndpoint(getServiceProtocol(providerConfig),

backend/sdk/src/main/java/com/alibaba/higress/sdk/service/ai/OpenaiLlmProviderHandler.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ public void normalizeConfigs(Map<String, Object> configurations) {
6767
}
6868
}
6969

70+
@Override
71+
public boolean needSyncRouteAfterUpdate() {
72+
return true;
73+
}
74+
7075
@Override
7176
protected List<LlmProviderEndpoint> getProviderEndpoints(Map<String, Object> providerConfig) {
7277
List<URI> customUris = getCustomUris(providerConfig);

0 commit comments

Comments
 (0)