diff --git a/dotnet/test/E2E/ToolsE2ETests.cs b/dotnet/test/E2E/ToolsE2ETests.cs index 57ed6be2d..7424cfa3a 100644 --- a/dotnet/test/E2E/ToolsE2ETests.cs +++ b/dotnet/test/E2E/ToolsE2ETests.cs @@ -61,6 +61,59 @@ static string EncryptString([Description("String to encrypt")] string input) => input.ToUpperInvariant(); } + [Fact] + public async Task Low_Level_Tool_Definition() + { + string currentPhase = string.Empty; + + var session = await CreateSessionAsync(new SessionConfig + { + Tools = + [ + AIFunctionFactory.Create(SetCurrentPhase, new AIFunctionFactoryOptions + { + Name = "set_current_phase", + Description = "Sets the current phase of the agent", + }), + AIFunctionFactory.Create(SearchItems, new AIFunctionFactoryOptions + { + Name = "search_items", + Description = "Search for items by keyword", + }), + ], + AvailableTools = new ToolSet().AddCustom("*").AddBuiltIn("web_fetch"), + OnPermissionRequest = PermissionHandler.ApproveAll, + }); + + await session.SendAsync(new MessageOptions + { + Prompt = "First, set the current phase to 'analyzing'. Then search for items with keyword 'copilot'. Report the phase and search results." + }); + + var assistantMessage = await TestHelper.GetFinalAssistantMessageAsync(session); + + Assert.NotNull(assistantMessage); + var content = assistantMessage!.Data.Content ?? string.Empty; + Assert.NotEmpty(content); + Assert.Contains("analyzing", content, StringComparison.OrdinalIgnoreCase); + Assert.True(content.Contains("item_alpha", StringComparison.OrdinalIgnoreCase) + || content.Contains("item_beta", StringComparison.OrdinalIgnoreCase), + $"Expected content to mention item_alpha or item_beta, got: {content}"); + Assert.Equal("analyzing", currentPhase); + + Task SetCurrentPhase(string phase) + { + currentPhase = phase; + return Task.FromResult($"Phase set to {phase}"); + } + + Task SearchItems(AIFunctionArguments args) + { + Assert.Equal("copilot", args["keyword"]?.ToString()); + return Task.FromResult("Found: item_alpha, item_beta"); + } + } + [Fact] public async Task Handles_Tool_Calling_Errors() {