diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Constants/LlmConstant.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Constants/LlmConstant.cs new file mode 100644 index 00000000..3919ca57 --- /dev/null +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Constants/LlmConstant.cs @@ -0,0 +1,6 @@ +namespace BotSharp.Abstraction.Agents.Constants; + +public static class LlmConstant +{ + public const int DEFAULT_MAX_OUTPUT_TOKEN = 1024; +} diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentLlmConfig.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentLlmConfig.cs index 8025c2b8..f1df3a01 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentLlmConfig.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/AgentLlmConfig.cs @@ -22,6 +22,16 @@ public class AgentLlmConfig [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? Model { get; set; } + /// + /// Max recursion depth + /// [JsonPropertyName("max_recursion_depth")] public int MaxRecursionDepth { get; set; } = 3; + + /// + /// Max output token + /// + [JsonPropertyName("max_output_tokens")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public int? MaxOutputTokens { get; set; } } diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index 516280a3..67a1f901 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -34,55 +34,32 @@ public interface IBotSharpRepository : IHaveServiceProvider #endregion #region User - User? GetUserByEmail(string email) - => throw new NotImplementedException(); - User? GetUserByPhone(string phone, string type = UserType.Client, string regionCode = "CN") - => throw new NotImplementedException(); - User? GetAffiliateUserByPhone(string phone) - => throw new NotImplementedException(); - User? GetUserById(string id) - => throw new NotImplementedException(); - List GetUserByIds(List ids) - => throw new NotImplementedException(); - List GetUsersByAffiliateId(string affiliateId) - => throw new NotImplementedException(); - User? GetUserByUserName(string userName) - => throw new NotImplementedException(); - void UpdateUserName(string userId, string userName) - => throw new NotImplementedException(); - Dashboard? GetDashboard(string userId = null) - => throw new NotImplementedException(); - void CreateUser(User user) - => throw new NotImplementedException(); - void UpdateExistUser(string userId, User user) - => throw new NotImplementedException(); - void UpdateUserVerified(string userId) - => throw new NotImplementedException(); - void AddDashboardConversation(string userId, string conversationId) - => throw new NotImplementedException(); - void RemoveDashboardConversation(string userId, string conversationId) - => throw new NotImplementedException(); - void UpdateDashboardConversation(string userId, DashboardConversation dashConv) - => throw new NotImplementedException(); - void UpdateUserVerificationCode(string userId, string verficationCode) - => throw new NotImplementedException(); - void UpdateUserPassword(string userId, string password) - => throw new NotImplementedException(); - void UpdateUserEmail(string userId, string email) - => throw new NotImplementedException(); - void UpdateUserPhone(string userId, string Iphone, string regionCode) - => throw new NotImplementedException(); - void UpdateUserIsDisable(string userId, bool isDisable) - => throw new NotImplementedException(); - void UpdateUsersIsDisable(List userIds, bool isDisable) - => throw new NotImplementedException(); - PagedItems GetUsers(UserFilter filter) - => throw new NotImplementedException(); - User? GetUserDetails(string userId, bool includeAgent = false) - => throw new NotImplementedException(); - bool UpdateUser(User user, bool updateUserAgents = false) - => throw new NotImplementedException(); - + User? GetUserByEmail(string email) => throw new NotImplementedException(); + User? GetUserByPhone(string phone, string type = UserType.Client, string regionCode = "CN") => throw new NotImplementedException(); + User? GetUserByPhoneV2(string phone, string source = UserType.Internal, string regionCode = "CN") => throw new NotImplementedException(); + User? GetAffiliateUserByPhone(string phone) => throw new NotImplementedException(); + User? GetUserById(string id) => throw new NotImplementedException(); + List GetUserByIds(List ids) => throw new NotImplementedException(); + List GetUsersByAffiliateId(string affiliateId) => throw new NotImplementedException(); + User? GetUserByUserName(string userName) => throw new NotImplementedException(); + void UpdateUserName(string userId, string userName) => throw new NotImplementedException(); + Dashboard? GetDashboard(string id = null) => throw new NotImplementedException(); + void CreateUser(User user) => throw new NotImplementedException(); + void UpdateExistUser(string userId, User user) => throw new NotImplementedException(); + void UpdateUserVerified(string userId) => throw new NotImplementedException(); + void AddDashboardConversation(string userId, string conversationId) => throw new NotImplementedException(); + void RemoveDashboardConversation(string userId, string conversationId) => throw new NotImplementedException(); + void UpdateDashboardConversation(string userId, DashboardConversation dashConv) => throw new NotImplementedException(); + void UpdateUserVerificationCode(string userId, string verficationCode) => throw new NotImplementedException(); + void UpdateUserPassword(string userId, string password) => throw new NotImplementedException(); + void UpdateUserEmail(string userId, string email) => throw new NotImplementedException(); + void UpdateUserPhone(string userId, string Iphone, string regionCode) => throw new NotImplementedException(); + void UpdateUserIsDisable(string userId, bool isDisable) => throw new NotImplementedException(); + void UpdateUsersIsDisable(List userIds, bool isDisable) => throw new NotImplementedException(); + PagedItems GetUsers(UserFilter filter) => throw new NotImplementedException(); + List SearchLoginUsers(User filter, string source = UserSource.Internal) =>throw new NotImplementedException(); + User? GetUserDetails(string userId, bool includeAgent = false) => throw new NotImplementedException(); + bool UpdateUser(User user, bool updateUserAgents = false) => throw new NotImplementedException(); #endregion #region Agent diff --git a/src/Infrastructure/BotSharp.Abstraction/Statistics/Models/BotSharpStats.cs b/src/Infrastructure/BotSharp.Abstraction/Statistics/Models/BotSharpStats.cs index 33178d6a..c0163a7e 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Statistics/Models/BotSharpStats.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Statistics/Models/BotSharpStats.cs @@ -52,7 +52,7 @@ public class BotSharpStats public static (DateTime, DateTime) BuildTimeInterval(DateTime recordTime, StatsInterval interval) { DateTime startTime = recordTime; - DateTime endTime = DateTime.UtcNow; + DateTime endTime = startTime; switch (interval) { @@ -70,6 +70,7 @@ public class BotSharpStats break; } + endTime = endTime.AddSeconds(-1); startTime = DateTime.SpecifyKind(startTime, DateTimeKind.Utc); endTime = DateTime.SpecifyKind(endTime, DateTimeKind.Utc); return (startTime, endTime); diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs b/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs index 8563b215..15b04f28 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs @@ -8,6 +8,7 @@ public interface IUserService { Task GetUser(string id); Task> GetUsers(UserFilter filter); + Task> SearchLoginUsers(User filter); Task GetUserDetails(string userId, bool includeAgent = false); Task IsAdminUser(string userId); Task GetUserAuthorizations(IEnumerable? agentIds = null); diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs index 5c984684..6b543c8b 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs @@ -28,6 +28,23 @@ public partial class FileRepository return query.FirstOrDefault(); } + public User? GetUserByPhoneV2(string phone, string? source = UserType.Internal, string regionCode = "CN") + { + var query = Users.Where(x => x.Phone == phone); + + if (!string.IsNullOrEmpty(source)) + { + query = query.Where(x => x.Type == source); + } + + if (!string.IsNullOrEmpty(regionCode)) + { + query = query.Where(x => x.RegionCode == regionCode); + } + + return query.FirstOrDefault(); + } + public User? GetAffiliateUserByPhone(string phone) { return Users.FirstOrDefault(x => x.Phone == phone && x.Type == UserType.Affiliate); @@ -128,6 +145,65 @@ public partial class FileRepository }; } + public List SearchLoginUsers(User filter, string source = UserSource.Internal) + { + List searchResult = new List(); + + // search by filters + if (!string.IsNullOrWhiteSpace(filter.Id)) + { + var curUser = Users.FirstOrDefault(x => x.Source == source && x.Id == filter.Id.ToLower()); + User user = curUser != null ? curUser : null; + if (user != null) + { + searchResult.Add(user); + } + } + else if (!string.IsNullOrWhiteSpace(filter.Phone) && !string.IsNullOrWhiteSpace(filter.RegionCode)) + { + string[] regionCodeData = filter.RegionCode.Split('|'); + if (regionCodeData.Length == 2) + { + string phoneNoCallingCode = filter.Phone; + string phoneWithCallingCode = filter.Phone; + if (!filter.Phone.StartsWith('+')) + { + phoneNoCallingCode = filter.Phone; + phoneWithCallingCode = $"{regionCodeData[1]}{filter.Phone}"; + } + else + { + phoneNoCallingCode = filter.Phone.Replace(regionCodeData[1], ""); + } + searchResult = Users.AsQueryable() + .Where(x => x.Source == source && (x.Phone == phoneNoCallingCode || x.Phone == phoneWithCallingCode) && x.RegionCode == regionCodeData[0]) + .ToList(); + } + } + else if (!string.IsNullOrWhiteSpace(filter.Email)) + { + var curUser = Users.AsQueryable().FirstOrDefault(x => x.Source == source && x.Email == filter.Email.ToString()); + User user = curUser != null ? curUser : null; + if (user != null) + { + searchResult.Add(user); + } + } + + + if (searchResult.Count == 0 && !string.IsNullOrWhiteSpace(filter.UserName)) + { + var curUser = Users.AsQueryable().FirstOrDefault(x => x.Source == source && x.UserName == filter.UserName); + User user = curUser != null ? curUser : null; + if (user != null) + { + searchResult.Add(user); + } + } + + return searchResult; + } + public User? GetUserDetails(string userId, bool includeAgent = false) { if (string.IsNullOrWhiteSpace(userId)) return null; diff --git a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs index 18bf96eb..60192e5f 100644 --- a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs +++ b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs @@ -55,6 +55,11 @@ public class UserService : IUserService if (record == null && !string.IsNullOrWhiteSpace(user.Phone)) { + //if (user.Type != "internal") + //{ + // record = db.GetUserByPhoneV2(user.Phone, regionCode: (string.IsNullOrWhiteSpace(user.RegionCode) ? "CN" : user.RegionCode)); + //} + record = db.GetUserByPhone(user.Phone, regionCode: (string.IsNullOrWhiteSpace(user.RegionCode) ? "CN" : user.RegionCode)); } @@ -477,11 +482,17 @@ public class UserService : IUserService var id = model.UserName; var db = _services.GetRequiredService(); var record = id.Contains("@") ? db.GetUserByEmail(id) : db.GetUserByUserName(id); + if (record == null) { record = db.GetUserByPhone(id, regionCode: (string.IsNullOrWhiteSpace(model.RegionCode) ? "CN" : model.RegionCode)); } + //if (record == null) + //{ + // record = db.GetUserByPhoneV2(id, regionCode: (string.IsNullOrWhiteSpace(model.RegionCode) ? "CN" : model.RegionCode)); + //} + if (record == null) { return default; @@ -570,6 +581,18 @@ public class UserService : IUserService return false; } + public async Task> SearchLoginUsers(User filter) + { + if (filter == null) + { + return new List(); + } + + var db = _services.GetRequiredService(); + + return db.SearchLoginUsers(filter); + } + public async Task VerifyPhoneExisting(string phone, string regionCode) { if (string.IsNullOrWhiteSpace(phone)) @@ -609,21 +632,12 @@ public class UserService : IUserService public async Task ResetVerificationCode(User user) { var db = _services.GetRequiredService(); - User record = null; - if (!string.IsNullOrEmpty(user.Email) && !string.IsNullOrEmpty(user.Phone)) + if (!string.IsNullOrWhiteSpace(user.Email) && !string.IsNullOrWhiteSpace(user.Phone)) { return null; } - if (!string.IsNullOrEmpty(user.Phone)) - { - record = db.GetUserByPhone(user.Phone, regionCode: user.RegionCode); - } - - if (!string.IsNullOrEmpty(user.Email)) - { - record = db.GetUserByEmail(user.Email); - } + User? record = GetLoginUserByUniqueFilter(user, db); if (record == null) { @@ -638,6 +652,36 @@ public class UserService : IUserService return record; } + private static User? GetLoginUserByUniqueFilter(User user, IBotSharpRepository db) + { + User? record = null; + if (!string.IsNullOrWhiteSpace(user.Id)) + { + record = db.GetUserById(user.Id); + } + + if (record == null && !string.IsNullOrWhiteSpace(user.Phone)) + { + record = db.GetUserByPhone(user.Phone, regionCode: string.IsNullOrWhiteSpace(user.RegionCode) ? "CN" : user.RegionCode); + //if (record == null) + //{ + // record = db.GetUserByPhoneV2(user.Phone, regionCode: string.IsNullOrWhiteSpace(user.RegionCode) ? "CN" : user.RegionCode); + //} + } + + if (record == null && !string.IsNullOrWhiteSpace(user.Email)) + { + record = db.GetUserByEmail(user.Email); + } + + if (record == null && !string.IsNullOrWhiteSpace(user.UserName)) + { + record = db.GetUserByUserName(user.UserName); + } + + return record; + } + public async Task SendVerificationCodeLogin() { var db = _services.GetRequiredService(); @@ -677,17 +721,7 @@ public class UserService : IUserService } var db = _services.GetRequiredService(); - User? record = null; - - if (!string.IsNullOrEmpty(user.Email)) - { - record = db.GetUserByEmail(user.Email); - } - - if (!string.IsNullOrEmpty(user.Phone)) - { - record = db.GetUserByPhone(user.Phone, regionCode: (string.IsNullOrWhiteSpace(user.RegionCode) ? "CN" : user.RegionCode)); - } + User? record = GetLoginUserByUniqueFilter(user, db); if (record == null) { @@ -712,20 +746,7 @@ public class UserService : IUserService } var db = _services.GetRequiredService(); - User? record = null; - - if (!string.IsNullOrEmpty(user.Id)) - { - record = db.GetUserById(user.Id); - } - else if (!string.IsNullOrEmpty(user.Phone)) - { - record = db.GetUserByPhone(user.Phone, regionCode: (string.IsNullOrWhiteSpace(user.RegionCode) ? "CN" : user.RegionCode)); - } - else if (!string.IsNullOrEmpty(user.Email)) - { - record = db.GetUserByEmail(user.Email); - } + User? record = GetLoginUserByUniqueFilter(user, db); if (record == null) { diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs index bb26836c..8e4d915d 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentCreationModel.cs @@ -80,7 +80,7 @@ public class AgentCreationModel MaxMessageCount = MaxMessageCount, Profiles = Profiles, Labels = Labels, - LlmConfig = LlmConfig, + LlmConfig = LlmConfig ?? new(), KnowledgeBases = KnowledgeBases, Rules = Rules, RoutingRules = RoutingRules?.Select(x => RoutingRuleUpdateModel.ToDomainElement(x))?.ToList() ?? [], diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs index 611d633f..ac2749b5 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Agents/AgentUpdateModel.cs @@ -105,7 +105,7 @@ public class AgentUpdateModel Utilities = Utilities ?? [], KnowledgeBases = KnowledgeBases ?? [], Rules = Rules ?? [], - LlmConfig = LlmConfig + LlmConfig = LlmConfig ?? new() }; return agent; diff --git a/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs index 8657b31b..b71306cf 100644 --- a/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs @@ -170,12 +170,14 @@ public class ChatCompletionProvider : IChatCompletion var state = _services.GetRequiredService(); var temperature = decimal.Parse(state.GetState("temperature", "0.0")); - var maxToken = int.Parse(state.GetState("max_tokens", "512")); + var maxTokens = int.TryParse(state.GetState("max_tokens"), out var tokens) + ? tokens + : agent.LlmConfig?.MaxOutputTokens ?? LlmConstant.DEFAULT_MAX_OUTPUT_TOKEN; var parameters = new MessageParameters() { Messages = messages, - MaxTokens = maxToken, + MaxTokens = maxTokens, Model = settings.Name, Stream = false, Temperature = temperature, diff --git a/src/Plugins/BotSharp.Plugin.AnthropicAI/Using.cs b/src/Plugins/BotSharp.Plugin.AnthropicAI/Using.cs index d00446fc..b2e4484c 100644 --- a/src/Plugins/BotSharp.Plugin.AnthropicAI/Using.cs +++ b/src/Plugins/BotSharp.Plugin.AnthropicAI/Using.cs @@ -8,6 +8,7 @@ global using Anthropic.SDK; global using Anthropic.SDK.Constants; global using Anthropic.SDK.Messaging; global using BotSharp.Abstraction.Agents; +global using BotSharp.Abstraction.Agents.Constants; global using BotSharp.Abstraction.Agents.Enums; global using BotSharp.Abstraction.Agents.Models; global using BotSharp.Abstraction.Conversations.Models; diff --git a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs index 9879e4fb..3fef7c0c 100644 --- a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs @@ -225,7 +225,10 @@ public class ChatCompletionProvider : IChatCompletion var messages = new List(); var temperature = float.Parse(state.GetState("temperature", "0.0")); - var maxTokens = int.Parse(state.GetState("max_tokens", "1024")); + var maxTokens = int.TryParse(state.GetState("max_tokens"), out var tokens) + ? tokens + : agent.LlmConfig?.MaxOutputTokens ?? LlmConstant.DEFAULT_MAX_OUTPUT_TOKEN; + var options = new ChatCompletionOptions() { Temperature = temperature, diff --git a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Using.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Using.cs index 71f5272d..2cc3faf0 100644 --- a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Using.cs +++ b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Using.cs @@ -5,6 +5,7 @@ global using System.IO; global using System.Threading.Tasks; global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.Logging; +global using BotSharp.Abstraction.Agents.Constants; global using BotSharp.Abstraction.Agents.Enums; global using BotSharp.Abstraction.Agents.Models; global using BotSharp.Abstraction.Conversations; diff --git a/src/Plugins/BotSharp.Plugin.DeepSeekAI/Providers/Chat/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.DeepSeekAI/Providers/Chat/ChatCompletionProvider.cs index 474c7350..ef4d0c8a 100644 --- a/src/Plugins/BotSharp.Plugin.DeepSeekAI/Providers/Chat/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.DeepSeekAI/Providers/Chat/ChatCompletionProvider.cs @@ -201,7 +201,9 @@ public class ChatCompletionProvider : IChatCompletion var messages = new List(); var temperature = float.Parse(state.GetState("temperature", "0.0")); - var maxTokens = int.Parse(state.GetState("max_tokens", "1024")); + var maxTokens = int.TryParse(state.GetState("max_tokens"), out var tokens) + ? tokens + : agent.LlmConfig?.MaxOutputTokens ?? LlmConstant.DEFAULT_MAX_OUTPUT_TOKEN; var options = new ChatCompletionOptions() { Temperature = temperature, diff --git a/src/Plugins/BotSharp.Plugin.DeepSeekAI/Using.cs b/src/Plugins/BotSharp.Plugin.DeepSeekAI/Using.cs index 4fa278e6..751f1aec 100644 --- a/src/Plugins/BotSharp.Plugin.DeepSeekAI/Using.cs +++ b/src/Plugins/BotSharp.Plugin.DeepSeekAI/Using.cs @@ -10,6 +10,7 @@ global using BotSharp.Abstraction.Conversations.Models; global using BotSharp.Abstraction.Agents.Models; global using BotSharp.Abstraction.MLTasks; global using BotSharp.Abstraction.Agents; +global using BotSharp.Abstraction.Agents.Constants; global using BotSharp.Abstraction.Agents.Enums; global using BotSharp.Abstraction.Conversations; global using BotSharp.Abstraction.Loggers; diff --git a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs index 5930a6b9..9567ae57 100644 --- a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs @@ -1,5 +1,6 @@ using BotSharp.Abstraction.Agents; using BotSharp.Abstraction.Agents.Enums; +using BotSharp.Abstraction.Conversations; using BotSharp.Abstraction.Loggers; using Google.Protobuf.WellKnownTypes; using Microsoft.Extensions.Logging; @@ -188,10 +189,20 @@ public class GeminiChatCompletionProvider : IChatCompletion } } + var state = _services.GetRequiredService(); + var temperature = float.Parse(state.GetState("temperature", "0.0")); + var maxTokens = int.TryParse(state.GetState("max_tokens"), out var tokens) + ? tokens + : agent.LlmConfig?.MaxOutputTokens ?? LlmConstant.DEFAULT_MAX_OUTPUT_TOKEN; var request = new GenerateContentRequest { Contents = contents, - Tools = tools + Tools = tools, + GenerationConfig = new() + { + Temperature = temperature, + MaxOutputTokens = maxTokens + } }; var prompt = GetPrompt(systemPrompts, funcPrompts, convPrompts); diff --git a/src/Plugins/BotSharp.Plugin.GoogleAI/Using.cs b/src/Plugins/BotSharp.Plugin.GoogleAI/Using.cs index 17152bf4..c7f6c176 100644 --- a/src/Plugins/BotSharp.Plugin.GoogleAI/Using.cs +++ b/src/Plugins/BotSharp.Plugin.GoogleAI/Using.cs @@ -5,6 +5,7 @@ global using System.Threading.Tasks; global using System.Linq; global using System.Text.Json; global using BotSharp.Abstraction.Conversations.Models; +global using BotSharp.Abstraction.Agents.Constants; global using BotSharp.Abstraction.Agents.Models; global using BotSharp.Abstraction.MLTasks; global using Microsoft.Extensions.Configuration; diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentLlmConfigMongoElement.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentLlmConfigMongoElement.cs index 5251b532..32989ad1 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentLlmConfigMongoElement.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/AgentLlmConfigMongoElement.cs @@ -8,6 +8,7 @@ public class AgentLlmConfigMongoElement public string? Model { get; set; } public bool IsInherit { get; set; } public int MaxRecursionDepth { get; set; } + public int? MaxOutputTokens { get; set; } public static AgentLlmConfigMongoElement? ToMongoElement(AgentLlmConfig? config) { @@ -19,6 +20,7 @@ public class AgentLlmConfigMongoElement Model = config.Model, IsInherit = config.IsInherit, MaxRecursionDepth = config.MaxRecursionDepth, + MaxOutputTokens = config.MaxOutputTokens, }; } @@ -32,6 +34,7 @@ public class AgentLlmConfigMongoElement Model = config.Model, IsInherit = config.IsInherit, MaxRecursionDepth = config.MaxRecursionDepth, + MaxOutputTokens = config.MaxOutputTokens, }; } } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs index 57ea76b9..3b6dd05f 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs @@ -37,6 +37,30 @@ public partial class MongoRepository return user != null ? user.ToUser() : null; } + public User? GetUserByPhoneV2(string phone, string source = UserType.Internal, string regionCode = "CN") + { + string phoneSecond = string.Empty; + // if phone number length is less than 4, return null + if (string.IsNullOrWhiteSpace(phone) || phone?.Length < 4) + { + return null; + } + + if (regionCode == "CN") + { + phoneSecond = (phone ?? "").StartsWith("+86") ? (phone ?? "").Replace("+86", "") : ($"+86{phone ?? ""}"); + } + else + { + phoneSecond = (phone ?? "").Substring(regionCode == "US" ? 2 : 3); + } + + var user = _dc.Users.AsQueryable().FirstOrDefault(x => (x.Phone == phone || x.Phone == phoneSecond) + && (x.RegionCode == regionCode || string.IsNullOrWhiteSpace(x.RegionCode)) + && (x.Source == source)); + return user != null ? user.ToUser() : null; + } + public User? GetAffiliateUserByPhone(string phone) { var user = _dc.Users.AsQueryable().FirstOrDefault(x => x.Phone == phone && x.Type == UserType.Affiliate); @@ -233,6 +257,77 @@ public partial class MongoRepository }; } + public List SearchLoginUsers(User filter, string source = UserSource.Internal) + { + List searchResult = new List(); + + // search by filters + if (!string.IsNullOrWhiteSpace(filter.Id)) + { + var curUser = _dc.Users.AsQueryable().FirstOrDefault(x => x.Source == source && x.Id == filter.Id.ToLower()); + User user = curUser != null ? curUser.ToUser() : null; + if (user != null) + { + searchResult.Add(user); + } + } + else if (!string.IsNullOrWhiteSpace(filter.Phone) && !string.IsNullOrWhiteSpace(filter.RegionCode)) + { + string[] regionCodeData = filter.RegionCode.Split('|'); + if (regionCodeData.Length == 2) + { + string phoneNoCallingCode = filter.Phone; + string phoneWithCallingCode = filter.Phone; + if (!filter.Phone.StartsWith('+')) + { + phoneNoCallingCode = filter.Phone; + phoneWithCallingCode = $"{regionCodeData[1]}{filter.Phone}"; + } + else + { + phoneNoCallingCode = filter.Phone.Replace(regionCodeData[1], ""); + } + var phoneUsers = _dc.Users.AsQueryable() + .Where(x => x.Source == source && (x.Phone == phoneNoCallingCode || x.Phone == phoneWithCallingCode) && x.RegionCode == regionCodeData[0]) + .ToList(); + + if (phoneUsers != null && phoneUsers.Count > 0) + { + foreach (var user in phoneUsers) + { + if (user != null) + { + searchResult.Add(user.ToUser()); + } + } + } + + } + } + else if (!string.IsNullOrWhiteSpace(filter.Email)) + { + var curUser = _dc.Users.AsQueryable().FirstOrDefault(x => x.Source == source && x.Email == filter.Email.ToLower()); + User user = curUser != null ? curUser.ToUser() : null; + if (user != null) + { + searchResult.Add(user); + } + } + + + if (searchResult.Count == 0 && !string.IsNullOrWhiteSpace(filter.UserName)) + { + var curUser = _dc.Users.AsQueryable().FirstOrDefault(x => x.Source == source && x.UserName == filter.UserName); + User user = curUser != null ? curUser.ToUser() : null; + if (user != null) + { + searchResult.Add(user); + } + } + + return searchResult; + } + public User? GetUserDetails(string userId, bool includeAgent = false) { if (string.IsNullOrWhiteSpace(userId)) return null; diff --git a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Chat/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Chat/ChatCompletionProvider.cs index 4eae5532..15eb04c5 100644 --- a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Chat/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Chat/ChatCompletionProvider.cs @@ -202,7 +202,9 @@ public class ChatCompletionProvider : IChatCompletion var messages = new List(); var temperature = float.Parse(state.GetState("temperature", "0.0")); - var maxTokens = int.Parse(state.GetState("max_tokens", "1024")); + var maxTokens = int.TryParse(state.GetState("max_tokens"), out var tokens) + ? tokens + : agent.LlmConfig?.MaxOutputTokens ?? LlmConstant.DEFAULT_MAX_OUTPUT_TOKEN; var options = new ChatCompletionOptions() { Temperature = temperature, diff --git a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs index f2763d7e..fe52863a 100644 --- a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs @@ -71,7 +71,9 @@ public class RealTimeCompletionProvider : IRealTimeCompletion var messages = new List(); var temperature = float.Parse(state.GetState("temperature", "0.0")); - var maxTokens = int.Parse(state.GetState("max_tokens", "1024")); + var maxTokens = int.TryParse(state.GetState("max_tokens"), out var tokens) + ? tokens + : agent.LlmConfig?.MaxOutputTokens ?? LlmConstant.DEFAULT_MAX_OUTPUT_TOKEN; var options = new ChatCompletionOptions() { ToolChoice = ChatToolChoice.CreateAutoChoice(), diff --git a/src/Plugins/BotSharp.Plugin.OpenAI/Using.cs b/src/Plugins/BotSharp.Plugin.OpenAI/Using.cs index e27c2529..e8e458c2 100644 --- a/src/Plugins/BotSharp.Plugin.OpenAI/Using.cs +++ b/src/Plugins/BotSharp.Plugin.OpenAI/Using.cs @@ -9,6 +9,7 @@ global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.Logging; global using BotSharp.Abstraction.Agents.Enums; +global using BotSharp.Abstraction.Agents.Constants; global using BotSharp.Abstraction.Agents.Models; global using BotSharp.Abstraction.Conversations; global using BotSharp.Abstraction.Conversations.Models; diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.cs index 4be41140..4d13e26f 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.cs @@ -75,9 +75,6 @@ public partial class PlaywrightWebDriver : IWebBrowser var page = _instance.GetPage(message.ContextId); if (page != null) { - // Click on the body to give focus to the page - await page.FocusAsync("input"); - await page.Keyboard.PressAsync(key); } }