Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ public class AgentSettings
public string DataDir { get; set; } = string.Empty;
public string TemplateFormat { get; set; } = "liquid";
public string HostAgentId { get; set; } = string.Empty;
public bool EnableTranslator { get; set; } = false;

/// <summary>
/// This is the default LLM config for agent
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace BotSharp.Abstraction.Translation.Models;

public class TranslationOutput
{
[JsonPropertyName("input_lang")]
public string InputLanguage { get; set; } = null!;

[JsonPropertyName("output_lang")]
public string OutputLanguage { get; set; } = LanguageType.ENGLISH;

[JsonPropertyName("texts")]
public string[] Texts { get; set; } = Array.Empty<string>();
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,7 @@ public class RouteToAgentRoutingHandler : RoutingHandlerBase, IRoutingHandler
required: true),
new ParameterPropertyDef("is_new_task",
"whether the user is requesting a new task that is different from the previous topic.",
type: "boolean"),
new ParameterPropertyDef("language",
"User preferred language, considering the whole conversation. Language could be English, Spanish or Chinese.",
required: true)
type: "boolean")
};

public RouteToAgentRoutingHandler(IServiceProvider services, ILogger<RouteToAgentRoutingHandler> logger, RoutingSettings settings)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public async Task<string> GetConversationContent(List<RoleDialogModel> dialogs,
role = agent.Name;
}

conversation += $"{role}: {dialog.Payload ?? dialog.SecondaryContent ?? dialog.Content}\r\n";
conversation += $"{role}: {dialog.Payload ?? dialog.Content}\r\n";
}

return conversation;
Expand Down
31 changes: 17 additions & 14 deletions src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,26 +82,29 @@ public async Task<RoleDialogModel> InstructLoop(RoleDialogModel message, List<Ro

_context.Push(_router.Id);

dialogs.Add(message);

// Get first instruction
_router.TemplateDict["conversation"] = await GetConversationContent(dialogs);
var inst = await planner.GetNextInstruction(_router, message.MessageId, dialogs);

// Handle multi-language for input
var translator = _services.GetRequiredService<ITranslationService>();

var language = states.GetState("language", inst.Language);
if (language != LanguageType.UNKNOWN && language != LanguageType.ENGLISH)
var agentSettings = _services.GetRequiredService<AgentSettings>();
if (agentSettings.EnableTranslator)
{
message.SecondaryContent = message.Content;
message.Content = await translator.Translate(_router, message.MessageId, message.Content,
language: LanguageType.ENGLISH,
clone: false);
var translator = _services.GetRequiredService<ITranslationService>();

var language = states.GetState("language", LanguageType.UNKNOWN);
if (language != LanguageType.ENGLISH)
{
message.SecondaryContent = message.Content;
message.Content = await translator.Translate(_router, message.MessageId, message.Content,
language: LanguageType.ENGLISH,
clone: false);
}
}

dialogs.Add(message);
storage.Append(convService.ConversationId, message);

// Get first instruction
_router.TemplateDict["conversation"] = await GetConversationContent(dialogs);
var inst = await planner.GetNextInstruction(_router, message.MessageId, dialogs);

int loopCount = 1;
while (true)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ public TranslationResponseHook(IServiceProvider services,
}
public override async Task OnResponseGenerated(RoleDialogModel message)
{
var agentSettings = _services.GetRequiredService<AgentSettings>();
if (!agentSettings.EnableTranslator)
{
return;
}

// Handle multi-language for output
var agentService = _services.GetRequiredService<IAgentService>();
var router = await agentService.LoadAgent(AIAssistant);
Expand Down
14 changes: 11 additions & 3 deletions src/Infrastructure/BotSharp.Core/Translation/TranslationService.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using BotSharp.Abstraction.Infrastructures.Enums;
using BotSharp.Abstraction.MLTasks;
using BotSharp.Abstraction.Options;
using BotSharp.Abstraction.Templating;
using BotSharp.Abstraction.Translation.Models;
using System.Collections;
using System.Reflection;

Expand Down Expand Up @@ -57,7 +59,13 @@ public async Task<T> Translate<T>(Agent router, string messageId, T data, string

try
{
var translatedTexts = translatedStringList.JsonArrayContent<string>();
// Override language if it's Unknown, it's used to output the corresponding language.
var states = _services.GetRequiredService<IConversationStateService>();
var inputLanguage = string.IsNullOrEmpty(translatedStringList.InputLanguage) ? LanguageType.ENGLISH : translatedStringList.InputLanguage;
var languageState = states.GetState("language", inputLanguage);
states.SetState("language", languageState, activeRounds: 1);

var translatedTexts = translatedStringList.Texts;
var map = new Dictionary<string, string>();

for (var i = 0; i < texts.Length; i++)
Expand Down Expand Up @@ -283,7 +291,7 @@ private T Assign<T>(T data, Dictionary<string, string> map) where T : class
/// <param name="list"></param>
/// <param name="language"></param>
/// <returns></returns>
private async Task<string> InnerTranslate(string texts, string language, string template)
private async Task<TranslationOutput> InnerTranslate(string texts, string language, string template)
{
var translator = new Agent
{
Expand All @@ -308,7 +316,7 @@ private async Task<string> InnerTranslate(string texts, string language, string
}
};
var response = await _completion.GetChatCompletions(translator, translationDialogs);
return response.Content;
return response.Content.JsonContent<TranslationOutput>();
}

#region Type methods
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{{ text_list }}

=====
Translate the above sentences in the list into {{ language }}, output the translated text in JSON array [""].
Translate the above sentences in the list into {{ language }}.
Output the translated text in JSON {"input_lang":"", "output_lang":"{{ language }}", "texts":[""]}, input_lang is based on the original sentences.