Skip to content

Conversation

@CH3CHO
Copy link
Collaborator

@CH3CHO CH3CHO commented Dec 14, 2025

Ⅰ. Describe what this PR did

Make sure AiRoutes with fallback enabled are also synced after a provider is updated.

Ⅱ. Does this pull request fix one issue?

Ⅲ. Why don't you add test cases (unit test/integration test)?

Ⅳ. Describe how to verify it

Ⅴ. Special notes for reviews

@CH3CHO CH3CHO requested a review from lexburner as a code owner December 14, 2025 08:22
@lingma-agents
Copy link

lingma-agents bot commented Dec 14, 2025

修复AI路由在提供者更新时的同步问题并增强处理逻辑

变更概述
  • 问题修复

    • 修复了当LLM提供者更新时,启用fallback的AI路由未能正确同步的问题。现在会在提供者更新后检查主上游和fallback上游是否包含该提供者,并触发相应路由的更新。
    • 增加对AiRouteService不可用情况的异常处理,确保在需要AI路由同步时服务存在。
  • 新功能

    • 引入QwenLlmProviderHandlerAzureLlmProviderHandler以支持更多类型的LLM提供者。
    • 添加辅助方法hasProvider用于判断给定上游列表中是否存在指定名称的提供者,提升代码复用性和可读性。
  • 重构

    • 调整了PROVIDER_HANDLERS静态初始化块中的处理器注册顺序,并新增对通义千问(Qwen)和Azure模型的支持。
    • syncRelatedAiRoutes方法进行了逻辑扩展,使其能够同时考虑主路径和fallback路径上的提供者变更。
  • 依赖更新

    • 导入新的模型类AiUpstream以支持更复杂的上游配置结构。
变更文件
文件路径 变更说明
backend/​sdk/​src/​main/​java/​com/​alibaba/​higress/​sdk/​service/​ai/​LlmProviderServiceImpl.​java 增加了对Qwen和Azure LLM提供者的支持;改进了AI路由同步机制,确保在提供者更新时能正确处理启用了fallback的路由;添加了AiUpstream导入依赖及相关的帮助函数。
时序图
sequenceDiagram
    participant LPS as LlmProviderServiceImpl
    participant ARS as AiRouteService
    LPS->>LPS: update(provider)
    alt Provider handlers updated
        LPS->>LPS: register Qwen & Azure handlers
    end
    LPS->>LPS: syncRelatedAiRoutes(provider)
    loop For each AiRoute
        LPS->>LPS: check upstreams for provider
        alt Match found or fallback enabled with match
            LPS->>ARS: update(AiRoute)
        end
    end
Loading

💡 小贴士

与 lingma-agents 交流的方式

📜 直接回复评论
直接回复本条评论,lingma-agents 将自动处理您的请求。例如:

  • 在当前代码中添加详细的注释说明。

  • 请详细介绍一下你说的 LRU 改造方案,并使用伪代码加以说明。

📜 在代码行处标记
在文件的特定位置创建评论并 @lingma-agents。例如:

  • @lingma-agents 分析这个方法的性能瓶颈并提供优化建议。

  • @lingma-agents 对这个方法生成优化代码。

📜 在讨论中提问
在任何讨论中 @lingma-agents 来获取帮助。例如:

  • @lingma-agents 请总结上述讨论并提出解决方案。

  • @lingma-agents 请根据讨论内容生成优化代码。

Copy link

@lingma-agents lingma-agents bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔎 代码评审报告

🎯 评审意见概览
严重度 数量 说明
🔴 Blocker 0 阻断性问题,需立即修复。例如:系统崩溃、关键功能不可用或严重安全漏洞。
🟠 Critical 0 严重问题,高优先级修复。例如:核心功能异常或性能瓶颈影响用户体验。
🟡 Major 0 主要问题,建议修复。例如:非核心功能缺陷或代码维护性较差。
🟢 Minor 3 次要问题,酬情优化。例如:代码格式不规范或注释缺失。

总计: 3 个问题

📋 评审意见详情
💡 代码实现建议
以下是文件级别的代码建议,聚焦于代码的可读性、可维护性和潜在问题。
☕ backend/sdk/src/main/java/com/alibaba/higress/sdk/service/ai/LlmProviderServiceImpl.java (3 💬)
🚀 架构设计建议
以下是对代码架构和设计的综合分析,聚焦于跨文件交互、系统一致性和潜在优化空间。
🔍1. 同步逻辑中潜在的重复处理风险

syncRelatedAiRoutes 方法中,当 AI 路由配置了回退(fallback)机制时,如果主上游和回退上游都引用了同一个 LLM 提供商,则可能导致对该路由的不必要多次更新。这不仅影响性能,还可能引发并发问题或数据一致性问题。建议优化逻辑以避免重复处理同一 AI 路由。

📌 关键代码

if (hasProvider(aiRoute.getUpstreams(), providerName)
    || aiRoute.getFallbackConfig() != null && Boolean.TRUE.equals(aiRoute.getFallbackConfig().getEnabled())
        && hasProvider(aiRoute.getFallbackConfig().getUpstreams(), providerName)) {
    aiRouteService.update(aiRoute);
}

⚠️ 潜在风险

可能会导致不必要的资源消耗、增加系统负载,并有可能引起并发更新冲突或者状态不一致的问题。

🔍2. 新增 handler 的初始化顺序与可维护性

在静态初始化块中直接硬编码添加新的 LLM 提供商处理器(如 Qwen 和 Azure),虽然实现了功能需求,但降低了代码的灵活性和可扩展性。随着支持的提供商增多,这种写法会变得难以维护。推荐采用更灵活的注册机制来管理不同类型的处理器。

📌 关键代码

new QwenLlmProviderHandler(), new AzureLlmProviderHandler(),

⚠️ 潜在风险

未来添加新提供商需要修改核心类,容易引入错误;不利于插件化架构的发展,限制系统的可拓展性和维护效率。

🔍3. hasProvider 方法缺乏通用性和复用性考量

当前实现的 hasProvider 静态方法仅用于判断给定列表中的 AiUpstream 是否包含指定的提供商名称,但由于其逻辑简单且特定于当前场景,在其他类似业务逻辑中无法被重用。考虑将其抽象为一个工具类方法以便提高代码复用率并增强整体设计的一致性。

📌 关键代码

private static boolean hasProvider(List<AiUpstream> upstreams, String providerName) {
    if (CollectionUtils.isEmpty(upstreams)) {
        return false;
    }
    for (AiUpstream upstream : upstreams) {
        if (providerName.equals(upstream.getProvider())) {
            return true;
        }
    }
    return false;
}

⚠️ 潜在风险

若将来有相似逻辑的需求出现,将不得不复制该段代码,造成冗余,违反 DRY 原则,同时也会增加后期重构的成本。

审查详情
📒 文件清单 (1 个文件)
📝 变更: 1 个文件

📝 变更文件:

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

💡 小贴士

与 lingma-agents 交流的方式

📜 直接回复评论
直接回复本条评论,lingma-agents 将自动处理您的请求。例如:

  • 在当前代码中添加详细的注释说明。

  • 请详细介绍一下你说的 LRU 改造方案,并使用伪代码加以说明。

📜 在代码行处标记
在文件的特定位置创建评论并 @lingma-agents。例如:

  • @lingma-agents 分析这个方法的性能瓶颈并提供优化建议。

  • @lingma-agents 对这个方法生成优化代码。

📜 在讨论中提问
在任何讨论中 @lingma-agents 来获取帮助。例如:

  • @lingma-agents 请总结上述讨论并提出解决方案。

  • @lingma-agents 请根据讨论内容生成优化代码。

import com.alibaba.higress.sdk.model.WasmPluginInstance;
import com.alibaba.higress.sdk.model.WasmPluginInstanceScope;
import com.alibaba.higress.sdk.model.ai.AiRoute;
import com.alibaba.higress.sdk.model.ai.AiUpstream;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

添加对AiUpstream类的导入声明。

🟢 Minor | 🧹 Code Smells

📋 问题详情

新增了一个用于表示AI上游服务的类AiUpstream,需要在文件中显式导入以便后续引用。此改动是合理的依赖引入,没有明显问题。

💡 解决方案

此行为正确的包导入语句,无需修改。


您的反馈对我们很重要!(建议右键在新标签页中打开以下链接)

有用意见👍无用意见👎错误意见❌

new DefaultLlmProviderHandler(LlmProviderType.MOONSHOT, "api.moonshot.cn", 443, V1McpBridge.PROTOCOL_HTTPS),
new QwenLlmProviderHandler(),
new AzureLlmProviderHandler(),
new QwenLlmProviderHandler(), new AzureLlmProviderHandler(),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

初始化静态处理器列表时添加新的处理程序实例。

🟢 Minor | 🧹 Code Smells

📋 问题详情

在静态初始化块中增加了对通义千问(Qwen)和Azure平台的支持处理器。这是为了扩展系统支持的模型范围所必需的操作,符合预期功能增强目标。

💡 解决方案

这部分代码是对现有处理器注册机制的正常扩展,不建议做任何更改。


您的反馈对我们很重要!(建议右键在新标签页中打开以下链接)

有用意见👍无用意见👎错误意见❌

AiRouteService aiRouteService = this.aiRouteService;
if (aiRouteService == null) {
return;
throw new IllegalStateException("AiRouteService is not available when AI route syncing is needed.");
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

当AI路由服务不可用时抛出异常。

🟢 Minor | 🧹 Code Smells

📋 问题详情

在执行同步操作前检查aiRouteService是否存在,若为空则主动抛出异常防止空指针错误。这是一个良好的防御性编程实践,有助于快速定位潜在的服务状态问题。

💡 解决方案

当前实现合理地处理了服务缺失情况,不需要额外调整。


您的反馈对我们很重要!(建议右键在新标签页中打开以下链接)

有用意见👍无用意见👎错误意见❌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant