Skip to content

Commit 95190e9

Browse files
committed
refactor(llm): unify ModelCapabilityService and LlmServiceProxy provider resolution onto LlmProviderRegistry
1 parent b7ee57f commit 95190e9

3 files changed

Lines changed: 27 additions & 31 deletions

File tree

TelegramSearchBot.LLM.Test/Service/AI/LLM/ModelCapabilityServiceTests.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class ModelCapabilityServiceTests {
2121
private readonly Mock<ILogger<ModelCapabilityService>> _loggerMock;
2222
private readonly Mock<IServiceProvider> _serviceProviderMock;
2323
private readonly Mock<OpenAIService> _openAIServiceMock;
24+
private readonly Mock<LlmProviderRegistry> _registryMock = new((IServiceProvider)null);
2425
private readonly ModelCapabilityService _service;
2526

2627
public ModelCapabilityServiceTests() {
@@ -39,11 +40,13 @@ public ModelCapabilityServiceTests() {
3940
new Mock<IHttpClientFactory>().Object);
4041
_serviceProviderMock.Setup(sp => sp.GetService(typeof(OpenAIService)))
4142
.Returns(_openAIServiceMock.Object);
43+
_registryMock.Setup(r => r.GetProvider(It.IsAny<LLMProvider>()))
44+
.Returns(_openAIServiceMock.Object);
4245

4346
_service = new ModelCapabilityService(
4447
_loggerMock.Object,
4548
_dbContext,
46-
_serviceProviderMock.Object);
49+
_registryMock.Object);
4750
}
4851

4952
[Fact]

TelegramSearchBot.LLM/Service/AI/LLM/ModelCapabilityService.cs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ public class ModelCapabilityService : IModelCapabilityService, IService {
2222

2323
private readonly ILogger<ModelCapabilityService> _logger;
2424
private readonly DataDbContext _dbContext;
25-
private readonly IServiceProvider _serviceProvider;
25+
private readonly LlmProviderRegistry _registry;
2626

2727
public ModelCapabilityService(
2828
ILogger<ModelCapabilityService> logger,
2929
DataDbContext dbContext,
30-
IServiceProvider serviceProvider) {
30+
LlmProviderRegistry registry) {
3131
_logger = logger;
3232
_dbContext = dbContext;
33-
_serviceProvider = serviceProvider;
33+
_registry = registry;
3434
}
3535

3636
/// <summary>
@@ -279,19 +279,14 @@ private string GetCapabilityDescription(string capabilityName) {
279279
}
280280

281281
/// <summary>
282-
/// 根据提供商获取对应的LLM服务
282+
/// 根据提供商获取对应的LLM服务;未知提供商返回 null(保持原有的降级语义)。
283283
/// </summary>
284284
private ILlmProvider GetProvider(LLMProvider provider) {
285-
return provider switch {
286-
LLMProvider.OpenAI => _serviceProvider.GetService(typeof(OpenAIService)) as ILlmProvider,
287-
LLMProvider.Ollama => _serviceProvider.GetService(typeof(OllamaService)) as ILlmProvider,
288-
LLMProvider.Gemini => _serviceProvider.GetService(typeof(GeminiService)) as ILlmProvider,
289-
LLMProvider.MiniMax => _serviceProvider.GetService(typeof(OpenAIService)) as ILlmProvider,
290-
LLMProvider.LMStudio => _serviceProvider.GetService(typeof(OpenAIService)) as ILlmProvider,
291-
LLMProvider.Anthropic => _serviceProvider.GetService(typeof(AnthropicService)) as ILlmProvider,
292-
LLMProvider.ResponsesAPI => _serviceProvider.GetService(typeof(OpenAIResponsesService)) as ILlmProvider,
293-
_ => null
294-
};
285+
try {
286+
return _registry.GetProvider(provider);
287+
} catch (KeyNotFoundException) {
288+
return null;
289+
}
295290
}
296291

297292
/// <summary>

TelegramSearchBot.LLMAgent/Service/LlmServiceProxy.cs

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111
namespace TelegramSearchBot.LLMAgent.Service {
1212
public sealed class LlmServiceProxy : IAgentTaskExecutor {
1313
private readonly IServiceProvider _serviceProvider;
14+
private readonly LlmProviderRegistry _registry;
1415
private readonly ILogger<LlmServiceProxy> _logger;
1516

1617
public LlmServiceProxy(IServiceProvider serviceProvider, ILogger<LlmServiceProxy> logger) {
1718
_serviceProvider = serviceProvider;
19+
_registry = serviceProvider.GetRequiredService<LlmProviderRegistry>();
1820
_logger = logger;
1921
}
2022

@@ -77,25 +79,21 @@ public async IAsyncEnumerable<string> CallAsync(
7779
}
7880

7981
private ILlmProvider ResolveService(LLMProvider provider) {
80-
return provider switch {
81-
LLMProvider.Ollama => _serviceProvider.GetRequiredService<OllamaService>(),
82-
LLMProvider.Gemini => _serviceProvider.GetRequiredService<GeminiService>(),
83-
LLMProvider.Anthropic => _serviceProvider.GetRequiredService<AnthropicService>(),
84-
LLMProvider.ResponsesAPI => _serviceProvider.GetRequiredService<OpenAIResponsesService>(),
85-
_ => _serviceProvider.GetRequiredService<OpenAIService>()
86-
};
82+
try {
83+
return _registry.GetProvider(provider);
84+
} catch (KeyNotFoundException) {
85+
// 保持原有降级语义:未知 provider 回退到 OpenAI 兼容路径
86+
return _registry.GetProvider(LLMProvider.OpenAI);
87+
}
8788
}
8889

89-
/// <summary>按 binding 线协议解析 client(与 LlmProviderRegistry.GetProvider(LlmProtocol) 同构)。</summary>
90+
/// <summary>按 binding 线协议解析 client,统一委托给 LlmProviderRegistry;未知协议回退 OpenAI。</summary>
9091
private ILlmProvider ResolveService(LlmProtocol protocol) {
91-
return protocol switch {
92-
LlmProtocol.OpenAIChat => _serviceProvider.GetRequiredService<OpenAIService>(),
93-
LlmProtocol.OpenAIResponses => _serviceProvider.GetRequiredService<OpenAIResponsesService>(),
94-
LlmProtocol.AnthropicMessages => _serviceProvider.GetRequiredService<AnthropicService>(),
95-
LlmProtocol.Ollama => _serviceProvider.GetRequiredService<OllamaService>(),
96-
LlmProtocol.Gemini => _serviceProvider.GetRequiredService<GeminiService>(),
97-
_ => _serviceProvider.GetRequiredService<OpenAIService>()
98-
};
92+
try {
93+
return _registry.GetProvider(protocol);
94+
} catch (KeyNotFoundException) {
95+
return _registry.GetProvider(LlmProtocol.OpenAIChat);
96+
}
9997
}
10098

10199
private void ApplyBotIdentity(string botName, long botUserId) {

0 commit comments

Comments
 (0)