Skip to content

Commit da14d00

Browse files
authored
Merge pull request #979 from iceljc/master
fix file selection
2 parents afc5c67 + a3cb654 commit da14d00

File tree

13 files changed

+87
-53
lines changed

13 files changed

+87
-53
lines changed

src/Infrastructure/BotSharp.Abstraction/Agents/Models/MCPTool.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,16 @@ namespace BotSharp.Abstraction.Agents.Models;
22

33
public class McpTool
44
{
5+
[JsonPropertyName("name")]
56
public string Name { get; set; }
7+
8+
[JsonPropertyName("server_id")]
69
public string ServerId { get; set; }
10+
11+
[JsonPropertyName("disabled")]
712
public bool Disabled { get; set; }
13+
14+
[JsonPropertyName("functions")]
815
public IEnumerable<McpFunction> Functions { get; set; } = [];
916

1017
public McpTool()

src/Infrastructure/BotSharp.Abstraction/Files/Models/SelectFileOptions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ public class SelectFileOptions
88
public string? Provider { get; set; }
99

1010
/// <summary>
11-
/// Llm model id
11+
/// Llm model
1212
/// </summary>
13-
public string? ModelId { get; set; }
13+
public string? Model { get; set; }
1414

1515
/// <summary>
1616
/// Agent id

src/Infrastructure/BotSharp.Core.MCP/BotSharpMCPExtensions.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ public static class BotSharpMcpExtensions
1818
/// <returns></returns>
1919
public static IServiceCollection AddBotSharpMCP(this IServiceCollection services, IConfiguration config)
2020
{
21-
var settings = config.GetSection("MCPSettings").Get<McpSettings>();
22-
services.AddScoped<McpSettings>(provider => { return settings; });
23-
if (settings != null && !settings.McpServerConfigs.IsNullOrEmpty())
21+
var settings = config.GetSection("MCP").Get<McpSettings>();
22+
services.AddScoped(provider => { return settings; });
23+
if (settings != null && settings.Enabled && !settings.McpServerConfigs.IsNullOrEmpty())
2424
{
2525
var clientManager = new McpClientManager(settings);
2626
services.AddSingleton(clientManager);

src/Infrastructure/BotSharp.Core.MCP/Hooks/MCPToolAgentHook.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using BotSharp.Core.MCP.Helpers;
22
using BotSharp.Core.MCP.Managers;
3+
using BotSharp.Core.MCP.Settings;
34
using ModelContextProtocol.Client;
45

56
namespace BotSharp.Core.MCP.Hooks;
@@ -39,6 +40,13 @@ public override void OnAgentMcpToolLoaded(Agent agent)
3940
private async Task<IEnumerable<FunctionDef>> GetMcpContent(Agent agent)
4041
{
4142
var functionDefs = new List<FunctionDef>();
43+
44+
var settings = _services.GetRequiredService<McpSettings>();
45+
if (settings?.Enabled != true)
46+
{
47+
return functionDefs;
48+
}
49+
4250
var mcpClientManager = _services.GetRequiredService<McpClientManager>();
4351
var mcps = agent.McpTools.Where(x => !x.Disabled);
4452
foreach (var item in mcps)

src/Infrastructure/BotSharp.Core.MCP/Managers/McpClientManager.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,18 @@ namespace BotSharp.Core.MCP.Managers;
55

66
public class McpClientManager : IDisposable
77
{
8+
private readonly McpSettings _mcpSettings;
89

9-
private readonly McpSettings mcpSettings;
10-
11-
public McpClientManager(McpSettings settings)
10+
public McpClientManager(McpSettings mcpSettings)
1211
{
13-
mcpSettings = settings;
12+
_mcpSettings = mcpSettings;
1413
}
1514

1615
public async Task<IMcpClient> GetMcpClientAsync(string serverId)
1716
{
1817
return await McpClientFactory.CreateAsync(
19-
mcpSettings.McpServerConfigs.Where(x=> x.Name == serverId).First(),
20-
mcpSettings.McpClientOptions);
18+
_mcpSettings.McpServerConfigs.Where(x=> x.Name == serverId).First(),
19+
_mcpSettings.McpClientOptions);
2120
}
2221

2322
public void Dispose()
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using BotSharp.Abstraction.Plugins.Models;
2+
using BotSharp.Abstraction.Plugins;
3+
using BotSharp.Abstraction.Settings;
4+
using BotSharp.Core.MCP.Settings;
5+
using Microsoft.Extensions.Configuration;
6+
7+
namespace BotSharp.Core.MCP;
8+
9+
public class McpPlugin : IBotSharpPlugin
10+
{
11+
public string Id => "0cfb486a-229e-4470-a4c6-d2d4a5fdc727";
12+
public string Name => "Model context protocol";
13+
public string Description => "Model context protocol";
14+
15+
public SettingsMeta Settings =>
16+
new SettingsMeta("MCP");
17+
18+
public object GetNewSettingsInstance() =>
19+
new McpSettings();
20+
21+
public void RegisterDI(IServiceCollection services, IConfiguration config)
22+
{
23+
}
24+
25+
public bool AttachMenu(List<PluginMenuDef> menu)
26+
{
27+
return true;
28+
}
29+
}

src/Infrastructure/BotSharp.Core.MCP/Settings/MCPSettings.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace BotSharp.Core.MCP.Settings;
55

66
public class McpSettings
77
{
8+
public bool Enabled { get; set; } = true;
89
public McpClientOptions McpClientOptions { get; set; }
910
public List<McpServerConfig> McpServerConfigs { get; set; } = new();
1011

src/Infrastructure/BotSharp.Core/Files/Services/Instruct/FileInstructService.Image.cs

Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public async Task<RoleDialogModel> GenerateImage(string text, InstructOptions? o
5757
{
5858
Id = innerAgentId,
5959
Instruction = instruction
60-
}, new RoleDialogModel(AgentRole.User, text));
60+
}, new RoleDialogModel(AgentRole.User, instruction ?? text));
6161

6262
var hooks = _services.GetServices<IInstructHook>();
6363
foreach (var hook in hooks)
@@ -90,8 +90,6 @@ public async Task<RoleDialogModel> VaryImage(InstructFileModel image, InstructOp
9090
}
9191

9292
var innerAgentId = options?.AgentId ?? Guid.Empty.ToString();
93-
var instruction = await GetAgentTemplate(innerAgentId, options?.TemplateName);
94-
9593
var completion = CompletionProvider.GetImageCompletion(_services, provider: options?.Provider ?? "openai", model: options?.Model ?? "dall-e-2");
9694
var bytes = await DownloadFile(image);
9795
using var stream = new MemoryStream();
@@ -101,8 +99,7 @@ public async Task<RoleDialogModel> VaryImage(InstructFileModel image, InstructOp
10199
var fileName = $"{image.FileName ?? "image"}.{image.FileExtension ?? "png"}";
102100
var message = await completion.GetImageVariation(new Agent()
103101
{
104-
Id = innerAgentId,
105-
Instruction = instruction
102+
Id = innerAgentId
106103
}, new RoleDialogModel(AgentRole.User, string.Empty), stream, fileName);
107104

108105
stream.Close();
@@ -120,9 +117,7 @@ await hook.OnResponseGenerated(new InstructResponseModel
120117
AgentId = innerAgentId,
121118
Provider = completion.Provider,
122119
Model = completion.Model,
123-
TemplateName = options?.TemplateName,
124120
UserMessage = string.Empty,
125-
SystemInstruction = instruction,
126121
CompletionText = message.Content
127122
});
128123
}
@@ -149,9 +144,8 @@ public async Task<RoleDialogModel> EditImage(string text, InstructFileModel imag
149144
var fileName = $"{image.FileName ?? "image"}.{image.FileExtension ?? "png"}";
150145
var message = await completion.GetImageEdits(new Agent()
151146
{
152-
Id = innerAgentId,
153-
Instruction = instruction
154-
}, new RoleDialogModel(AgentRole.User, text), stream, fileName);
147+
Id = innerAgentId
148+
}, new RoleDialogModel(AgentRole.User, instruction ?? text), stream, fileName);
155149

156150
stream.Close();
157151

@@ -205,9 +199,8 @@ public async Task<RoleDialogModel> EditImage(string text, InstructFileModel imag
205199
var maskName = $"{mask.FileName ?? "mask"}.{mask.FileExtension ?? "png"}";
206200
var message = await completion.GetImageEdits(new Agent()
207201
{
208-
Id = innerAgentId,
209-
Instruction = instruction
210-
}, new RoleDialogModel(AgentRole.User, text), imageStream, imageName, maskStream, maskName);
202+
Id = innerAgentId
203+
}, new RoleDialogModel(AgentRole.User, instruction ?? text), imageStream, imageName, maskStream, maskName);
211204

212205
imageStream.Close();
213206
maskStream.Close();
@@ -234,23 +227,4 @@ await hook.OnResponseGenerated(new InstructResponseModel
234227

235228
return message;
236229
}
237-
238-
#region Private methods
239-
private async Task<byte[]> DownloadFile(InstructFileModel file)
240-
{
241-
var bytes = new byte[0];
242-
if (!string.IsNullOrEmpty(file.FileUrl))
243-
{
244-
var http = _services.GetRequiredService<IHttpClientFactory>();
245-
using var client = http.CreateClient();
246-
bytes = await client.GetByteArrayAsync(file.FileUrl);
247-
}
248-
else if (!string.IsNullOrEmpty(file.FileData))
249-
{
250-
(_, bytes) = FileUtility.GetFileInfoFromData(file.FileData);
251-
}
252-
253-
return bytes;
254-
}
255-
#endregion
256230
}

src/Infrastructure/BotSharp.Core/Files/Services/Instruct/FileInstructService.SelectFile.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,9 @@ private async Task<IEnumerable<MessageFileModel>> SelectFiles(IEnumerable<Messag
9393
}
9494

9595
var providerName = options.Provider ?? "openai";
96-
var modelId = options?.ModelId ?? "gpt-4o";
96+
var model = options?.Model ?? "gpt-4o-mini";
9797
var provider = llmProviderService.GetProviders().FirstOrDefault(x => x == providerName);
98-
var model = llmProviderService.GetProviderModel(provider: provider, id: modelId);
99-
var completion = CompletionProvider.GetChatCompletion(_services, provider: provider, model: model.Name);
98+
var completion = CompletionProvider.GetChatCompletion(_services, provider: provider, model: model);
10099

101100
var response = await completion.GetChatCompletions(agent, new List<RoleDialogModel> { message });
102101
var content = response?.Content ?? string.Empty;

src/Infrastructure/BotSharp.Core/Files/Services/Instruct/FileInstructService.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public FileInstructService(
1919
_services = services;
2020
}
2121

22+
#region Private methods
2223
private void DeleteIfExistDirectory(string? dir, bool createNew = false)
2324
{
2425
if (_fileStorage.ExistDirectory(dir))
@@ -31,6 +32,23 @@ private void DeleteIfExistDirectory(string? dir, bool createNew = false)
3132
}
3233
}
3334

35+
private async Task<byte[]> DownloadFile(InstructFileModel file)
36+
{
37+
var bytes = new byte[0];
38+
if (!string.IsNullOrEmpty(file.FileUrl))
39+
{
40+
var http = _services.GetRequiredService<IHttpClientFactory>();
41+
using var client = http.CreateClient();
42+
bytes = await client.GetByteArrayAsync(file.FileUrl);
43+
}
44+
else if (!string.IsNullOrEmpty(file.FileData))
45+
{
46+
(_, bytes) = FileUtility.GetFileInfoFromData(file.FileData);
47+
}
48+
49+
return bytes;
50+
}
51+
3452
private async Task<string?> GetAgentTemplate(string agentId, string? templateName)
3553
{
3654
if (string.IsNullOrWhiteSpace(agentId) || string.IsNullOrWhiteSpace(templateName))
@@ -48,4 +66,5 @@ private void DeleteIfExistDirectory(string? dir, bool createNew = false)
4866
var instruction = agentService.RenderedTemplate(agent, templateName);
4967
return instruction;
5068
}
69+
#endregion
5170
}

src/Infrastructure/BotSharp.OpenAPI/Controllers/InstructModeController.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,7 @@ public async Task<ImageGenerationViewModel> ImageVariation([FromBody] ImageVaria
242242
{
243243
Provider = input.Provider,
244244
Model = input.Model,
245-
AgentId = input.AgentId,
246-
TemplateName = input.TemplateName
245+
AgentId = input.AgentId
247246
});
248247
imageViewModel.Content = message.Content;
249248
imageViewModel.Images = message.GeneratedImages.Select(x => ImageViewModel.ToViewModel(x)).ToList();
@@ -262,7 +261,7 @@ public async Task<ImageGenerationViewModel> ImageVariation([FromBody] ImageVaria
262261
[HttpPost("/instruct/image-variation/upload")]
263262
public async Task<ImageGenerationViewModel> ImageVariation(IFormFile file, [FromForm] string? provider = null,
264263
[FromForm] string? model = null, [FromForm] List<MessageState>? states = null,
265-
[FromForm] string? agentId = null, [FromForm] string? templateName = null)
264+
[FromForm] string? agentId = null)
266265
{
267266
var state = _services.GetRequiredService<IConversationStateService>();
268267
states?.ForEach(x => state.SetState(x.Key, x.Value, activeRounds: x.ActiveRounds, source: StateSource.External));
@@ -276,8 +275,7 @@ public async Task<ImageGenerationViewModel> ImageVariation(IFormFile file, [From
276275
{
277276
Provider = provider,
278277
Model = model,
279-
AgentId = agentId,
280-
TemplateName = templateName
278+
AgentId = agentId
281279
});
282280

283281
imageViewModel.Content = message.Content;

src/Plugins/BotSharp.Plugin.OpenAI/Providers/Image/ImageCompletionProvider.Edit.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using OpenAI.Images;
2-
using static System.Net.Mime.MediaTypeNames;
32

43
namespace BotSharp.Plugin.OpenAI.Providers.Image;
54

src/WebStarter/appsettings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@
172172
}
173173
},
174174

175-
"MCPSettings": {
175+
"MCP": {
176+
"Enabled": true,
176177
"McpClientOptions": {
177178
"ClientInfo": {
178179
"Name": "SimpleToolsBotsharp",

0 commit comments

Comments
 (0)