From c12fc5fbdeca0c815c20bb2a57aaf6a73f5ec35d Mon Sep 17 00:00:00 2001 From: Rafael Oliveira Date: Thu, 27 Aug 2026 15:04:32 +0100 Subject: [PATCH 01/10] Marked Search & Match V1 as obsolete --- src/Textkernel.Tx.SDK/ITxClient.cs | 2 ++ src/Textkernel.Tx.SDK/Services/ISearchMatchService.cs | 3 +++ src/Textkernel.Tx.SDK/Textkernel.Tx.SDK.csproj | 2 +- src/Textkernel.Tx.SDK/TxClient.cs | 3 ++- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Textkernel.Tx.SDK/ITxClient.cs b/src/Textkernel.Tx.SDK/ITxClient.cs index 68a58910..db7f4a0b 100644 --- a/src/Textkernel.Tx.SDK/ITxClient.cs +++ b/src/Textkernel.Tx.SDK/ITxClient.cs @@ -20,6 +20,7 @@ using Textkernel.Tx.Models.Job; using Textkernel.Tx.Models.Matching; using Textkernel.Tx.Models.Resume; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Textkernel.Tx.Models.API.JobDescription; @@ -56,6 +57,7 @@ public interface ITxClient /// /// Contains all endpoints/methods for Search & Match V1 /// + [Obsolete("Search & Match V1 is deprecated. You should use SearchMatchV2 instead.")] ISearchMatchService SearchMatchV1 { get; } /// diff --git a/src/Textkernel.Tx.SDK/Services/ISearchMatchService.cs b/src/Textkernel.Tx.SDK/Services/ISearchMatchService.cs index 7e0000e1..29e5e8aa 100644 --- a/src/Textkernel.Tx.SDK/Services/ISearchMatchService.cs +++ b/src/Textkernel.Tx.SDK/Services/ISearchMatchService.cs @@ -22,6 +22,7 @@ namespace Textkernel.Tx.Services /// /// Use /// + [Obsolete("Search & Match V1 is deprecated. You should use SearchMatchV2 instead.")] public interface ISearchMatchService { @@ -261,6 +262,7 @@ Task Search( /// Settings to be used for this scoring request /// Either or /// Thrown when an API error occurs + [Obsolete("BimetricScore is deprecated.")] Task BimetricScore( ParsedResumeWithId sourceResume, List targetDocuments, @@ -280,6 +282,7 @@ Task BimetricScore( /// Settings to be used for this scoring request /// Either or /// Thrown when an API error occurs + [Obsolete("BimetricScore is deprecated.")] Task BimetricScore( ParsedJobWithId sourceJob, List targetDocuments, diff --git a/src/Textkernel.Tx.SDK/Textkernel.Tx.SDK.csproj b/src/Textkernel.Tx.SDK/Textkernel.Tx.SDK.csproj index 7952797e..81adfc49 100644 --- a/src/Textkernel.Tx.SDK/Textkernel.Tx.SDK.csproj +++ b/src/Textkernel.Tx.SDK/Textkernel.Tx.SDK.csproj @@ -10,7 +10,7 @@ Copyright © $([System.DateTime]::UtcNow.Year) Textkernel BV. All rights reserved. Apache-2.0 https://github.com/textkernel/tx-dotnet - 4.0.1 + 4.0.2 images\icon.png https://raw.githubusercontent.com/textkernel/tx-dotnet/master/src/Textkernel.Tx.SDK/icon.png true diff --git a/src/Textkernel.Tx.SDK/TxClient.cs b/src/Textkernel.Tx.SDK/TxClient.cs index 95c2acae..5a40920a 100644 --- a/src/Textkernel.Tx.SDK/TxClient.cs +++ b/src/Textkernel.Tx.SDK/TxClient.cs @@ -96,8 +96,9 @@ public class TxClient : ITxClient, IDisposable public IGeocoderService Geocoder { get; private set; } /// - /// Contains all endpoints/methods for Search & Match + /// Contains all endpoints/methods for Search & Match V1 /// + [Obsolete("Search & Match V1 is deprecated. You should use SearchMatchV2 instead.")] public ISearchMatchService SearchMatchV1 { get; private set; } /// From 692038d867cbdfda65fde402e4130092a959ffd0 Mon Sep 17 00:00:00 2001 From: Rafael Oliveira Date: Thu, 27 Aug 2026 15:19:42 +0100 Subject: [PATCH 02/10] Marked Search & Match V1 as obsolete --- .github/workflows/build.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b112e742..bb39c57c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,6 +37,11 @@ jobs: shell: bash env: CREDENTIALS_FILE: ${{secrets.TEST_CREDENTIALS}} + - name: Print account id + run: echo "$CREDENTIALS_FILE" | python3 -c "import sys,json; d=json.load(sys.stdin); print('AccountId:', d['AccountId'])" + shell: bash + env: + CREDENTIALS_FILE: ${{secrets.TEST_CREDENTIALS}} - name: Install dependencies run: dotnet restore working-directory: src/Textkernel.Tx.SDK.Tests From b1a03ce8b31fdfa835db93c1740759e2ec44a570 Mon Sep 17 00:00:00 2001 From: Rafael Oliveira Date: Thu, 27 Aug 2026 15:21:18 +0100 Subject: [PATCH 03/10] Marked Search & Match V1 as obsolete --- .github/workflows/build.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bb39c57c..b112e742 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,11 +37,6 @@ jobs: shell: bash env: CREDENTIALS_FILE: ${{secrets.TEST_CREDENTIALS}} - - name: Print account id - run: echo "$CREDENTIALS_FILE" | python3 -c "import sys,json; d=json.load(sys.stdin); print('AccountId:', d['AccountId'])" - shell: bash - env: - CREDENTIALS_FILE: ${{secrets.TEST_CREDENTIALS}} - name: Install dependencies run: dotnet restore working-directory: src/Textkernel.Tx.SDK.Tests From 9b8b84484a342625766736fc09c2dd2e7d2f2f1a Mon Sep 17 00:00:00 2001 From: Rafael Oliveira Date: Fri, 28 Aug 2026 12:11:08 +0100 Subject: [PATCH 04/10] Marked Search & Match V1 as obsolete --- .github/workflows/build.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b112e742..f7db153d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,6 +37,11 @@ jobs: shell: bash env: CREDENTIALS_FILE: ${{secrets.TEST_CREDENTIALS}} + - name: Print account info + run: echo "$CREDENTIALS_FILE" | python3 -c "import sys,json; d=json.load(sys.stdin); print('AccountId:', d['AccountId']); print('GeocodeProviderKey:', d['GeocodeProviderKey'])" + shell: bash + env: + CREDENTIALS_FILE: ${{secrets.TEST_CREDENTIALS}} - name: Install dependencies run: dotnet restore working-directory: src/Textkernel.Tx.SDK.Tests From 064f06686a7dff9f0fc4091be306d9d4e8537ca7 Mon Sep 17 00:00:00 2001 From: Rafael Oliveira Date: Fri, 28 Aug 2026 12:12:32 +0100 Subject: [PATCH 05/10] Marked Search & Match V1 as obsolete --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f7db153d..a9d53056 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,8 +37,8 @@ jobs: shell: bash env: CREDENTIALS_FILE: ${{secrets.TEST_CREDENTIALS}} - - name: Print account info - run: echo "$CREDENTIALS_FILE" | python3 -c "import sys,json; d=json.load(sys.stdin); print('AccountId:', d['AccountId']); print('GeocodeProviderKey:', d['GeocodeProviderKey'])" + - name: Print credentials file + run: echo "$CREDENTIALS_FILE" shell: bash env: CREDENTIALS_FILE: ${{secrets.TEST_CREDENTIALS}} From e752476f58fbeaea35627991ea08becb12f3436f Mon Sep 17 00:00:00 2001 From: Rafael Oliveira Date: Fri, 28 Aug 2026 12:14:25 +0100 Subject: [PATCH 06/10] Marked Search & Match V1 as obsolete --- .github/workflows/build.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a9d53056..c9faba42 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,10 +38,7 @@ jobs: env: CREDENTIALS_FILE: ${{secrets.TEST_CREDENTIALS}} - name: Print credentials file - run: echo "$CREDENTIALS_FILE" - shell: bash - env: - CREDENTIALS_FILE: ${{secrets.TEST_CREDENTIALS}} + run: cat src/Textkernel.Tx.SDK.Tests/credentials.json - name: Install dependencies run: dotnet restore working-directory: src/Textkernel.Tx.SDK.Tests From a2cc655f2f4abe3bd26e8f1c412fa968adbe3f57 Mon Sep 17 00:00:00 2001 From: Rafael Oliveira Date: Fri, 28 Aug 2026 12:15:51 +0100 Subject: [PATCH 07/10] Marked Search & Match V1 as obsolete --- .github/workflows/build.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c9faba42..b112e742 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,8 +37,6 @@ jobs: shell: bash env: CREDENTIALS_FILE: ${{secrets.TEST_CREDENTIALS}} - - name: Print credentials file - run: cat src/Textkernel.Tx.SDK.Tests/credentials.json - name: Install dependencies run: dotnet restore working-directory: src/Textkernel.Tx.SDK.Tests From 401833c153602a0f47bfdc80da98e79e2a90c72f Mon Sep 17 00:00:00 2001 From: Rafael Oliveira Date: Fri, 28 Aug 2026 15:14:27 +0100 Subject: [PATCH 08/10] Marked Search & Match V1 as obsolete --- .../IntegrationTests/MatchV2Tests.cs | 11 +++++-- .../IntegrationTests/ParsingTests.cs | 33 +++++++------------ src/Textkernel.Tx.SDK.Tests/TestBase.cs | 12 +++++++ 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/Textkernel.Tx.SDK.Tests/IntegrationTests/MatchV2Tests.cs b/src/Textkernel.Tx.SDK.Tests/IntegrationTests/MatchV2Tests.cs index 45b091ae..9947af9a 100644 --- a/src/Textkernel.Tx.SDK.Tests/IntegrationTests/MatchV2Tests.cs +++ b/src/Textkernel.Tx.SDK.Tests/IntegrationTests/MatchV2Tests.cs @@ -22,8 +22,8 @@ public class MatchV2Tests : TestBase public async Task SetupAIMatchingIndexes() { // add a document to each index - await Client.SearchMatchV2.AddJob(_documentId, TestParsedJobTech); - await Client.SearchMatchV2.AddCandidate(_documentId, TestParsedResume); + await Client.SearchMatchV2.AddJob(_documentId, TestParsedJobTechV2); + await Client.SearchMatchV2.AddCandidate(_documentId, TestParsedResumeV2); await DelayForIndexSync(5_000); } @@ -77,7 +77,12 @@ public async Task TestParseAndUpload() { ProfessionsSettings = new ProfessionsSettings() { - Normalize = false + Normalize = true + }, + SkillsSettings = new SkillsSettings() + { + Normalize = true, + TaxonomyVersion = "V2" }, IndexingOptions = new Models.API.Indexes.IndexingOptionsGeneric() { diff --git a/src/Textkernel.Tx.SDK.Tests/IntegrationTests/ParsingTests.cs b/src/Textkernel.Tx.SDK.Tests/IntegrationTests/ParsingTests.cs index 45713f82..ece63ce1 100644 --- a/src/Textkernel.Tx.SDK.Tests/IntegrationTests/ParsingTests.cs +++ b/src/Textkernel.Tx.SDK.Tests/IntegrationTests/ParsingTests.cs @@ -154,35 +154,24 @@ public async Task TestParseResumeGeocodeIndex() IndexingOptionsGeneric indexingOptions = new IndexingOptionsGeneric() { - IndexId = indexId + IndexId = indexId, + DocumentId = documentId }; - // since there isn't an address this will throw an exception - Assert.ThrowsAsync(async () => { - await Client.Parser.ParseResume(new ParseRequest(TestData.Resume) - { - GeocodeOptions = geocodeOptions, - IndexingOptions = indexingOptions - }); - }); - - - // confirm you can geocode but indexing fails - Assert.ThrowsAsync(async () => { - await Client.Parser.ParseResume(new ParseRequest(TestData.ResumeWithAddress) - { - GeocodeOptions = geocodeOptions, - IndexingOptions = indexingOptions - }); - }); - try { - // set the document id and create the index - indexingOptions.DocumentId = documentId; await Client.SearchMatchV1.CreateIndex(IndexType.Resume, indexId); await DelayForIndexSync(); + // since there isn't an address this will throw an exception + Assert.ThrowsAsync(async () => { + await Client.Parser.ParseResume(new ParseRequest(TestData.Resume) + { + GeocodeOptions = geocodeOptions, + IndexingOptions = indexingOptions + }); + }); + // confirm you can parse/geocode/index Assert.DoesNotThrowAsync(async () => { await Client.Parser.ParseResume(new ParseRequest(TestData.ResumeWithAddress) diff --git a/src/Textkernel.Tx.SDK.Tests/TestBase.cs b/src/Textkernel.Tx.SDK.Tests/TestBase.cs index b1cee459..73f23073 100644 --- a/src/Textkernel.Tx.SDK.Tests/TestBase.cs +++ b/src/Textkernel.Tx.SDK.Tests/TestBase.cs @@ -29,6 +29,7 @@ public abstract class TestBase protected static readonly ParsedJob TestParsedJob; protected static readonly ParsedJob TestParsedJobWithAddress; protected static readonly ParsedJob TestParsedJobTech; + protected static readonly ParsedJob TestParsedJobTechV2; protected static readonly ParsedJobWithId TestParsedJobWithId; protected static readonly ParsedResumeWithId TestParsedResumeWithId; @@ -94,6 +95,17 @@ static TestBase() parseJobResponseValue = Client.Parser.ParseJob(new ParseRequest(TestData.JobOrderTech)).Result.Value; TestParsedJobTech = parseJobResponseValue.JobData; + parseJobResponseValue = Client.Parser.ParseJob(new ParseRequest(TestData.JobOrderTech, new ParseOptions + { + ProfessionsSettings = new ProfessionsSettings { Normalize = true }, + SkillsSettings = new SkillsSettings + { + Normalize = true, + TaxonomyVersion = "V2" + } + })).Result.Value; + TestParsedJobTechV2 = parseJobResponseValue.JobData; + TestParsedJobWithId = new ParsedJobWithId() { Id = "1", From 3838aff4f05c21c15e28bf4be306a45d3733838a Mon Sep 17 00:00:00 2001 From: Rafael Oliveira Date: Tue, 1 Sep 2026 11:05:18 +0100 Subject: [PATCH 09/10] Marked Search & Match V1 as obsolete --- .../IntegrationTests/ParsingTests.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Textkernel.Tx.SDK.Tests/IntegrationTests/ParsingTests.cs b/src/Textkernel.Tx.SDK.Tests/IntegrationTests/ParsingTests.cs index ece63ce1..dab34fa7 100644 --- a/src/Textkernel.Tx.SDK.Tests/IntegrationTests/ParsingTests.cs +++ b/src/Textkernel.Tx.SDK.Tests/IntegrationTests/ParsingTests.cs @@ -172,6 +172,19 @@ await Client.Parser.ParseResume(new ParseRequest(TestData.Resume) }); }); + // confirm you can geocode but indexing fails (nonexistent index) + Assert.ThrowsAsync(async () => { + await Client.Parser.ParseResume(new ParseRequest(TestData.ResumeWithAddress) + { + GeocodeOptions = geocodeOptions, + IndexingOptions = new IndexingOptionsGeneric() + { + IndexId = indexId + "-nonexistent", + DocumentId = documentId + } + }); + }); + // confirm you can parse/geocode/index Assert.DoesNotThrowAsync(async () => { await Client.Parser.ParseResume(new ParseRequest(TestData.ResumeWithAddress) From 30d0b549c166cf0cf579a6c2cb9994b54e8a4389 Mon Sep 17 00:00:00 2001 From: Rafael Oliveira Date: Tue, 1 Sep 2026 13:34:16 +0100 Subject: [PATCH 10/10] Marked Search & Match V1 as obsolete --- .../IntegrationTests/ParsingTests.cs | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/Textkernel.Tx.SDK.Tests/IntegrationTests/ParsingTests.cs b/src/Textkernel.Tx.SDK.Tests/IntegrationTests/ParsingTests.cs index dab34fa7..285d0ca2 100644 --- a/src/Textkernel.Tx.SDK.Tests/IntegrationTests/ParsingTests.cs +++ b/src/Textkernel.Tx.SDK.Tests/IntegrationTests/ParsingTests.cs @@ -154,37 +154,35 @@ public async Task TestParseResumeGeocodeIndex() IndexingOptionsGeneric indexingOptions = new IndexingOptionsGeneric() { - IndexId = indexId, - DocumentId = documentId + IndexId = indexId }; + // since there isn't an address this will throw an exception + Assert.ThrowsAsync(async () => { + await Client.Parser.ParseResume(new ParseRequest(TestData.Resume) + { + GeocodeOptions = geocodeOptions, + IndexingOptions = indexingOptions + }); + }); + + + // confirm you can geocode but indexing fails + Assert.ThrowsAsync(async () => { + await Client.Parser.ParseResume(new ParseRequest(TestData.ResumeWithAddress) + { + GeocodeOptions = geocodeOptions, + IndexingOptions = indexingOptions + }); + }); + try { + // set the document id and create the index + indexingOptions.DocumentId = documentId; await Client.SearchMatchV1.CreateIndex(IndexType.Resume, indexId); await DelayForIndexSync(); - // since there isn't an address this will throw an exception - Assert.ThrowsAsync(async () => { - await Client.Parser.ParseResume(new ParseRequest(TestData.Resume) - { - GeocodeOptions = geocodeOptions, - IndexingOptions = indexingOptions - }); - }); - - // confirm you can geocode but indexing fails (nonexistent index) - Assert.ThrowsAsync(async () => { - await Client.Parser.ParseResume(new ParseRequest(TestData.ResumeWithAddress) - { - GeocodeOptions = geocodeOptions, - IndexingOptions = new IndexingOptionsGeneric() - { - IndexId = indexId + "-nonexistent", - DocumentId = documentId - } - }); - }); - // confirm you can parse/geocode/index Assert.DoesNotThrowAsync(async () => { await Client.Parser.ParseResume(new ParseRequest(TestData.ResumeWithAddress)