From 5fd39fb1cac3a92ea093a8e2e87a7f5614c87f21 Mon Sep 17 00:00:00 2001 From: Diwak4r Date: Thu, 9 Jul 2026 01:16:11 +0545 Subject: [PATCH 1/2] fix(Plugins.Web): Tavily max_results must not subtract Skip Tavily has no offset parameter, so max_results is its page size. Subtracting Skip under-fetched results when paging (Top=5, Skip=2 sent max_results=3), and Skip >= Top sent max_results <= 0. Send top directly, matching Bing's count/offset handling. Co-Authored-By: Claude Sonnet 4.6 --- .../Web/Tavily/TavilyTextSearchTests.cs | 20 +++++++++++++++++++ .../Plugins.Web/Tavily/TavilyTextSearch.cs | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/dotnet/src/Plugins/Plugins.UnitTests/Web/Tavily/TavilyTextSearchTests.cs b/dotnet/src/Plugins/Plugins.UnitTests/Web/Tavily/TavilyTextSearchTests.cs index be5c78d41d0f..ebb01dd13b7b 100644 --- a/dotnet/src/Plugins/Plugins.UnitTests/Web/Tavily/TavilyTextSearchTests.cs +++ b/dotnet/src/Plugins/Plugins.UnitTests/Web/Tavily/TavilyTextSearchTests.cs @@ -496,6 +496,26 @@ public async Task StringContainsStillWorksWithLINQFiltersAsync() Assert.Contains("\"max_results\":5", requestBodyJson); } + [Fact] + public async Task SkipIsNotSubtractedFromMaxResultsAsync() + { + // Arrange + this._messageHandlerStub.AddJsonResponse(File.ReadAllText(SiteFilterDevBlogsResponseJson)); + ITextSearch textSearch = new TavilyTextSearch(apiKey: "ApiKey", options: new() { HttpClient = this._httpClient }); + + // Act - Tavily has no offset parameter, so max_results must equal Top regardless of Skip. + var searchOptions = new TextSearchOptions + { + Top = 5, + Skip = 2 + }; + await textSearch.SearchAsync("What is the Semantic Kernel?", searchOptions); + + // Assert + var requestBodyJson = Encoding.UTF8.GetString(this._messageHandlerStub.RequestContents[0]!); + Assert.Contains("\"max_results\":5", requestBodyJson); + } + #endregion #region private diff --git a/dotnet/src/Plugins/Plugins.Web/Tavily/TavilyTextSearch.cs b/dotnet/src/Plugins/Plugins.Web/Tavily/TavilyTextSearch.cs index 41fd5cd35df1..b74ff31fb257 100644 --- a/dotnet/src/Plugins/Plugins.Web/Tavily/TavilyTextSearch.cs +++ b/dotnet/src/Plugins/Plugins.Web/Tavily/TavilyTextSearch.cs @@ -676,7 +676,7 @@ private TavilySearchRequest BuildRequestContent(string query, int top, int skip, string? topic = null; string? timeRange = null; int? days = null; - int? maxResults = top - skip; + int? maxResults = top; IList? includeDomains = null; IList? excludeDomains = null; From 1790c0cc2d5830c7fd2dc88157bbf5b01698d4c0 Mon Sep 17 00:00:00 2001 From: Diwak4r Date: Sat, 1 Aug 2026 05:09:07 +0545 Subject: [PATCH 2/2] test: add Top == Skip and Top < Skip boundary cases to Tavily max_results test --- .../Web/Tavily/TavilyTextSearchTests.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/dotnet/src/Plugins/Plugins.UnitTests/Web/Tavily/TavilyTextSearchTests.cs b/dotnet/src/Plugins/Plugins.UnitTests/Web/Tavily/TavilyTextSearchTests.cs index ebb01dd13b7b..d144516c8694 100644 --- a/dotnet/src/Plugins/Plugins.UnitTests/Web/Tavily/TavilyTextSearchTests.cs +++ b/dotnet/src/Plugins/Plugins.UnitTests/Web/Tavily/TavilyTextSearchTests.cs @@ -496,8 +496,11 @@ public async Task StringContainsStillWorksWithLINQFiltersAsync() Assert.Contains("\"max_results\":5", requestBodyJson); } - [Fact] - public async Task SkipIsNotSubtractedFromMaxResultsAsync() + [Theory] + [InlineData(5, 2, 5)] // Top > Skip + [InlineData(2, 2, 2)] // Top == Skip + [InlineData(1, 5, 1)] // Top < Skip + public async Task SkipIsNotSubtractedFromMaxResultsAsync(int top, int skip, int expectedMaxResults) { // Arrange this._messageHandlerStub.AddJsonResponse(File.ReadAllText(SiteFilterDevBlogsResponseJson)); @@ -506,14 +509,14 @@ public async Task SkipIsNotSubtractedFromMaxResultsAsync() // Act - Tavily has no offset parameter, so max_results must equal Top regardless of Skip. var searchOptions = new TextSearchOptions { - Top = 5, - Skip = 2 + Top = top, + Skip = skip }; await textSearch.SearchAsync("What is the Semantic Kernel?", searchOptions); // Assert var requestBodyJson = Encoding.UTF8.GetString(this._messageHandlerStub.RequestContents[0]!); - Assert.Contains("\"max_results\":5", requestBodyJson); + Assert.Contains($"\"max_results\":{expectedMaxResults}", requestBodyJson); } #endregion