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);
}
}