Adding VoyageAI integration - #1

Open
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration
Open

Adding VoyageAI integration#1
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration

Conversation

@fzowl

Copy link
Copy Markdown
Owner

What

Adds a VoyageAI integration module (aiservices/voyageai) providing text embedding, multimodal embedding, contextualized embedding, and reranking services, plus a small reranking abstraction (TextRerankingService, RerankResult) in semantickernel-api.

Why this round (CI repair)

The upstream PR (microsoft#345) was red on merge-gatekeeper, which was blocked by the Java CI build failing under the bug-check profile. Root causes and fixes:

  • SpotBugs CT_CONSTRUCTOR_THROW: RerankResult and the four VoyageAI service classes plus VoyageAIClient throw validation exceptions from non-final constructors (finalizer-attack vector). Marked these classes final (behavior unchanged; validation preserved). This was the failure that stopped the CI build at semantickernel-api.
  • SpotBugs EI_EXPOSE_REP / EI_EXPOSE_REP2: the VoyageAIModels Jackson DTO accessors expose mutable list/array fields. Annotated the individual getters/setters/constructor with @SuppressFBWarnings, matching the existing pattern in the HuggingFace/OpenAI/Google DTOs. (This surfaced only after the first fix let the build reach the VoyageAI module.)
  • Version alignment: merged current upstream/main (which advanced the repo to 1.5.1-SNAPSHOT); the VoyageAI module still pinned 1.4.4-RC3-SNAPSHOT, which made the semantickernel-bom import unresolvable. Bumped the module's parent version to match.

Validation

Full reactor build with the CI command ./mvnw -Pbug-check -DskipTests -Pcompile-jdk17 clean install passes the semantickernel-api and aiservices/voyageai modules (SpotBugs clean). The VoyageAI unit tests pass (33 run; 6 live-API integration tests skipped without credentials).

Diff scope vs upstream/main is limited to the VoyageAI module, the two new reranking API files, PACKAGES.md, and the root pom.xml module entry.

fzowland others added 30 commits November 17, 2025 10:54
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v5...v6)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-6
Bump actions/checkout from 5 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v5...v6)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-6
Bump actions/upload-artifact from 5 to 6
Bumps org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.3
Java: Bump org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.3 to 3.27.7.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](assertj/assertj@assertj-build-3.26.3...assertj-build-3.27.7)
---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
dependency-version: 3.27.7
dependency-type: direct:development
...
Signed-off-by: dependabot[bot] <support@github.com>
…les/semantickernel-demos/semantickernel-spring-starter/org.assertj-assertj-core-3.27.7
Java: Bump org.assertj:assertj-core from 3.26.3 to 3.27.7 in /samples/semantickernel-demos/semantickernel-spring-starter
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.18.0 to 2.18.6.
- [Commits](FasterXML/jackson-core@jackson-core-2.18.0...jackson-core-2.18.6)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.18.6
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [net.sourceforge.pmd:pmd-core](https://github.com/pmd/pmd) from 7.10.0 to 7.22.0.
- [Release notes](https://github.com/pmd/pmd/releases)
- [Commits](pmd/pmd@pmd_releases/7.10.0...pmd_releases/7.22.0)
---
updated-dependencies:
- dependency-name: net.sourceforge.pmd:pmd-core
dependency-version: 7.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v6...v7)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-7
Bump actions/upload-artifact from 6 to 7
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.18.6
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.18.0 to 2.18.6 in /semantickernel-bom
…sourceforge.pmd-pmd-core-7.22.0
Java: Bump net.sourceforge.pmd:pmd-core from 7.10.0 to 7.22.0
Bumps org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.4
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.4
Java: Bump org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4
Bumps [actions/github-script](https://github.com/actions/github-script) from 8 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](actions/github-script@v8...v9)
---
updated-dependencies:
- dependency-name: actions/github-script
dependency-version: '9'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/github-script-9
Bump actions/github-script from 8 to 9
Update testcontainers and fix testing
Remove unsused test
johnoliverand others added 26 commits April 22, 2026 21:14
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.11.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.11)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.11
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.11
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.11 in /data/semantickernel-data-postgres
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v6...v7)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-7
Bump actions/checkout from 6 to 7
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.21.2 to 2.22.0.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.0
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.21.2 to 2.22.0 in /semantickernel-bom
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.11 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.11...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.11 to 42.7.12 in /data/semantickernel-data-postgres
…/semantickernel-data-jdbc/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.12 in /data/semantickernel-data-jdbc
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.22.0 to 2.22.1.
- [Commits](FasterXML/jackson-core@jackson-core-2.22.0...jackson-core-2.22.1)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.22.0 to 2.22.1.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.22.0 to 2.22.1 in /semantickernel-bom
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.22.0 to 2.22.1 in /semantickernel-bom
Bumps [actions/stale](https://github.com/actions/stale) from 10 to 11.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](actions/stale@v10...v11)
---
updated-dependencies:
- dependency-name: actions/stale
dependency-version: '11'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/stale-11
Bump actions/stale from 10 to 11
…CONSTRUCTOR_THROW
SpotBugs (bug-check profile) flagged CT_CONSTRUCTOR_THROW on classes whose
constructors throw validation exceptions while being non-final, which the
Java CI build treats as an error and fails merge-gatekeeper. Marking these
value/service classes final removes the finalizer-attack vector SpotBugs
warns about while preserving the existing constructor validation.
After merging upstream/main, the repository version advanced to
1.5.1-SNAPSHOT while the VoyageAI module still pinned the old
1.4.4-RC3-SNAPSHOT parent, which made the semantickernel-bom import
unresolvable and broke the reactor build.
The VoyageAIModels request/response DTOs expose their mutable list and
array fields directly through getters, setters and one constructor, which
SpotBugs (bug-check profile) flags as EI_EXPOSE_REP/EI_EXPOSE_REP2. These
are plain Jackson-mapped data holders, so annotate the individual accessors
with @SuppressFBWarnings, matching the pattern already used by the other
aiservices DTOs (e.g. HuggingFace, OpenAI, Google).
@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

The CI-repair objective this round was aimed at is met, and commit hygiene is clean — but there are correctness and convention issues that should be fixed before merge.

What's solid

  • CT_CONSTRUCTOR_THROW fixed correctly.RerankResult and all four VoyageAI service classes plus VoyageAIClient are now final, so the throwing constructors are no longer finalizer-attack vectors. This is exactly the failure @karianna flagged on Adding VoyageAI integration microsoft/semantic-kernel-java#345.
  • EI_EXPOSE_REP / EI_EXPOSE_REP2 applied correctly.VoyageAIModels getters returning mutable List/float[]/nested DTOs carry @SuppressFBWarnings("EI_EXPOSE_REP"); setters and the MultimodalInput(List) ctor carry EI_EXPOSE_REP2; primitive/String accessors correctly omit it. Mirrors the HuggingFace/OpenAI DTO pattern — no over/under-application.
  • Wiring correct: parent bumped to 1.5.1-SNAPSHOT, module registered in root pom.xml, PACKAGES.md documented.
  • Commit hygiene clean: no Co-Authored-By, no "Generated with", no .claude/ files anywhere in the branch.
  • Solid unit coverage of the service layer (happy path, builder, validation, rerank descending-sort, contextualized insertion-order).

Should fix before merge

  1. [Medium] Blocking I/O on a Reactor thread.VoyageAIClient.sendRequestAsync wraps a synchronous newCall(...).execute() in Mono.fromCallable with no .subscribeOn(Schedulers.boundedElastic()). In a reactive library this blocks a non-blocking thread. Use OkHttp's async enqueue (Mono.create) or add subscribeOn(boundedElastic()).
  2. [Medium] New HTTP stack diverges from every other connector. Every existing connector (openai/google/huggingface) uses com.azure.core.http.HttpClient; this module pulls in com.squareup.okhttp3:okhttp with a hardcoded 4.12.0 — the other deps here are correctly unversioned via the parent BOM. Either align on azure-core, or at minimum centralize the OkHttp version in semantickernel-bom/parent dependencyManagement.
  3. [Medium] FAIL_ON_UNKNOWN_PROPERTIES not disabled globally. Only the wrapper DTOs carry @JsonIgnoreProperties(ignoreUnknown=true); leaf DTOs (EmbeddingDataItem, RerankDataItem, EmbeddingUsage, MultimodalContentItem) don't, so any new field VoyageAI returns will throw. Set it on the ObjectMapper instead of relying on unevenly-applied annotations.
  4. [Medium] VoyageAIClient has zero tests — the riskiest code (URL/auth header, non-2xx to AIException mapping, null/empty body, deserialization guards). OkHttp ships mockwebserver; a MockWebServer test here would be high value.
  5. [Low] rerankAsync throws synchronously for the null-query check instead of returning Mono.error(...), breaking reactive composition (the null-documents branch just below does it right).
  6. [Low] Inconsistent @JsonInclude(NON_NULL)EmbeddingRequest and RerankRequest lack it, so unset optionals serialize as explicit nulls ("top_k":null, etc.); other request DTOs have it.
  7. [Low] Possible NPE on response.getData().stream() if a 200 body deserializes with null data; and documents.get(item.getIndex()) trusts the API index is in range.
  8. [Low] Unused importorg.junit.jupiter.api.Disabled in VoyageAIIntegrationTest — likely a checkstyle failure in this project.

Items 1–4 are the ones I'd want addressed; the CI fixes themselves are correct and can stay as-is.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

CI-repair round — merge-gatekeeper status

Investigated the merge-gatekeeper red on upstream microsoft#345 (head 5139ecb). Findings:

Root cause is the fork-PR workflow-approval gate, not a code defect. All five upstream workflow runs on the head commit are stuck at action_required (never executed):

WorkflowState
Build Java Semantic Kernelcompleted/action_required
Spell Checkcompleted/action_required
Check .md linkscompleted/action_required
Run Java Integration Tests and Samplescompleted/action_required
Merge Gatekeepercompleted/action_required

Combined commit status is pending; PR is MERGEABLE but BLOCKED. merge-gatekeeper aggregates the other checks, and since none have been allowed to run, it can never report green. Clearing this requires a Microsoft maintainer to click Approve and run workflows on microsoft#345 (external-contributor gate). No push from this side changes it.

The actual build is verified green locally on the current head (5139ecb), so the checks will pass once approved:

  • ./mvnw -B -Pbug-check -DskipTests -Pcompile-jdk17 clean installsemantickernel-api + aiservices/voyageaiBUILD SUCCESS, SpotBugs clean (CT_CONSTRUCTOR_THROW + EI_EXPOSE_REP fixes hold).
  • ./mvnw -B -Pbug-check -Pcompile-jdk17 test -pl aiservices/voyageai33 run, 0 failures, 6 skipped (live-API integration tests skip without credentials).
  • typos -c .github/_typos.toml — clean (Spell Check).
  • Branch is 0 commits behind upstream/main; git diff --stat upstream/main...voyageai_integration is limited to the VoyageAI module, the two reranking API files, PACKAGES.md, and the root pom.xml entry — no unrelated files.

The only unrelated local build noise is semantickernel-data-oracle testcontainers failing because Docker is absent on this machine — that module is outside this diff and passes in CI where Docker is available.

No code change is warranted for this scoped round (merge-gatekeeper only). The separate review items (blocking I/O, OkHttp version, etc.) are out of scope here and left untouched.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

Thanks for this — it's a substantial, well-organized contribution. The diff is cleanly scoped (16 files vs the merge-base with upstream/main), the Javadoc is thorough, the builder patterns and constructor validation are consistent across the four services, and the tests (33) are meaningful. The SpotBugs CI-repair work is correct and well-reasoned: marking the value/service classes final for CT_CONSTRUCTOR_THROW, and annotating the DTO accessors with @SuppressFBWarnings to match the existing HuggingFace/OpenAI/Google pattern. The change is purely additive (no breaking changes) and the 1.5.1-SNAPSHOT version alignment is right.

Commit hygiene: clean. No Co-Authored-By, no "Generated with" trailers, no .claude/ files, correct authorship, and descriptive commit messages.

That said, a few items should be addressed before merge:

1. Module missing from semantickernel-bom (convention gap — should fix).
The module is added to the reactor in the root pom.xml, but unlike huggingface, openai, and google it is not registered in semantickernel-bom/pom.xml. Consumers importing the BOM won't get a managed version for semantickernel-aiservices-voyageai. Add the matching <dependency> entry (${project.version}) alongside the other aiservices modules (~line 96).

2. HTTP client diverges from project convention (design — please justify or align).
Every other aiservices module uses com.azure.core.http.HttpClient. This module introduces okhttp3 as a brand-new dependency to the whole repo, with a hardcoded 4.12.0 version not managed by the parent/BOM. That adds a new transitive-dependency surface and a version that won't track centrally. Prefer reusing azure-core's HttpClient (as HuggingFace does) — or, if okhttp is intentional, at minimum move the version into dependency management and flag the new dependency for the maintainers.

3. Blocking I/O on the subscriber thread (reactive correctness).
VoyageAIClient.sendRequestAsync wraps a blocking okhttp .execute() in Mono.fromCallable(...) with no .subscribeOn(Schedulers.boundedElastic()). This blocks whatever thread subscribes — a real problem in a fully reactive pipeline. By contrast, HuggingFaceClient uses azure-core's non-blocking HttpClient.send() returning a Mono. Either switch to a non-blocking client or offload with boundedElastic().

4. Reactive contract violation (minor).
VoyageAITextRerankingService.rerankAsync throws IllegalArgumentException synchronously for a null/empty query, whereas a method returning Mono should signal via Mono.error(...) (the empty-documents case already returns Mono.just(...)). Same eager-throw pattern is worth auditing across the services.

Minor / optional:

  • Unit tests mock VoyageAIClient, so the client's own serialize → HTTP → deserialize → error-handling path is only exercised by the live integration tests (skipped without credentials). A MockWebServer-based test would close that gap.
  • response.getData() is dereferenced (.size(), .stream()) without a null guard; a malformed response body would NPE rather than surface a clean AIException.

None of these are blockers in spirit — (1) and (3) are the ones I'd want resolved, and (2) is worth a conscious decision from the maintainers. Happy to re-review once addressed.

@karianna

Copy link
Copy Markdown

@johnoliver - Can you review this with a view to future direction of Microsoft Agent Framework. Happy to accept extra functionality in principle.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@fzowl@karianna@johnoliver@web-flow
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Adding VoyageAI integration - #1

Open
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration
Open

Adding VoyageAI integration#1
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration

Conversation

@fzowl

Copy link
Copy Markdown
Owner

What

Adds a VoyageAI integration module (aiservices/voyageai) providing text embedding, multimodal embedding, contextualized embedding, and reranking services, plus a small reranking abstraction (TextRerankingService, RerankResult) in semantickernel-api.

Why this round (CI repair)

The upstream PR (microsoft#345) was red on merge-gatekeeper, which was blocked by the Java CI build failing under the bug-check profile. Root causes and fixes:

  • SpotBugs CT_CONSTRUCTOR_THROW: RerankResult and the four VoyageAI service classes plus VoyageAIClient throw validation exceptions from non-final constructors (finalizer-attack vector). Marked these classes final (behavior unchanged; validation preserved). This was the failure that stopped the CI build at semantickernel-api.
  • SpotBugs EI_EXPOSE_REP / EI_EXPOSE_REP2: the VoyageAIModels Jackson DTO accessors expose mutable list/array fields. Annotated the individual getters/setters/constructor with @SuppressFBWarnings, matching the existing pattern in the HuggingFace/OpenAI/Google DTOs. (This surfaced only after the first fix let the build reach the VoyageAI module.)
  • Version alignment: merged current upstream/main (which advanced the repo to 1.5.1-SNAPSHOT); the VoyageAI module still pinned 1.4.4-RC3-SNAPSHOT, which made the semantickernel-bom import unresolvable. Bumped the module's parent version to match.

Validation

Full reactor build with the CI command ./mvnw -Pbug-check -DskipTests -Pcompile-jdk17 clean install passes the semantickernel-api and aiservices/voyageai modules (SpotBugs clean). The VoyageAI unit tests pass (33 run; 6 live-API integration tests skipped without credentials).

Diff scope vs upstream/main is limited to the VoyageAI module, the two new reranking API files, PACKAGES.md, and the root pom.xml module entry.

fzowland others added 30 commits November 17, 2025 10:54
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v5...v6)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-6
Bump actions/checkout from 5 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v5...v6)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-6
Bump actions/upload-artifact from 5 to 6
Bumps org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.3
Java: Bump org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.3 to 3.27.7.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](assertj/assertj@assertj-build-3.26.3...assertj-build-3.27.7)
---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
dependency-version: 3.27.7
dependency-type: direct:development
...
Signed-off-by: dependabot[bot] <support@github.com>
…les/semantickernel-demos/semantickernel-spring-starter/org.assertj-assertj-core-3.27.7
Java: Bump org.assertj:assertj-core from 3.26.3 to 3.27.7 in /samples/semantickernel-demos/semantickernel-spring-starter
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.18.0 to 2.18.6.
- [Commits](FasterXML/jackson-core@jackson-core-2.18.0...jackson-core-2.18.6)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.18.6
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [net.sourceforge.pmd:pmd-core](https://github.com/pmd/pmd) from 7.10.0 to 7.22.0.
- [Release notes](https://github.com/pmd/pmd/releases)
- [Commits](pmd/pmd@pmd_releases/7.10.0...pmd_releases/7.22.0)
---
updated-dependencies:
- dependency-name: net.sourceforge.pmd:pmd-core
dependency-version: 7.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v6...v7)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-7
Bump actions/upload-artifact from 6 to 7
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.18.6
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.18.0 to 2.18.6 in /semantickernel-bom
…sourceforge.pmd-pmd-core-7.22.0
Java: Bump net.sourceforge.pmd:pmd-core from 7.10.0 to 7.22.0
Bumps org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.4
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.4
Java: Bump org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4
Bumps [actions/github-script](https://github.com/actions/github-script) from 8 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](actions/github-script@v8...v9)
---
updated-dependencies:
- dependency-name: actions/github-script
dependency-version: '9'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/github-script-9
Bump actions/github-script from 8 to 9
Update testcontainers and fix testing
Remove unsused test
johnoliverand others added 26 commits April 22, 2026 21:14
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.11.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.11)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.11
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.11
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.11 in /data/semantickernel-data-postgres
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v6...v7)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-7
Bump actions/checkout from 6 to 7
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.21.2 to 2.22.0.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.0
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.21.2 to 2.22.0 in /semantickernel-bom
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.11 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.11...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.11 to 42.7.12 in /data/semantickernel-data-postgres
…/semantickernel-data-jdbc/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.12 in /data/semantickernel-data-jdbc
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.22.0 to 2.22.1.
- [Commits](FasterXML/jackson-core@jackson-core-2.22.0...jackson-core-2.22.1)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.22.0 to 2.22.1.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.22.0 to 2.22.1 in /semantickernel-bom
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.22.0 to 2.22.1 in /semantickernel-bom
Bumps [actions/stale](https://github.com/actions/stale) from 10 to 11.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](actions/stale@v10...v11)
---
updated-dependencies:
- dependency-name: actions/stale
dependency-version: '11'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/stale-11
Bump actions/stale from 10 to 11
…CONSTRUCTOR_THROW
SpotBugs (bug-check profile) flagged CT_CONSTRUCTOR_THROW on classes whose
constructors throw validation exceptions while being non-final, which the
Java CI build treats as an error and fails merge-gatekeeper. Marking these
value/service classes final removes the finalizer-attack vector SpotBugs
warns about while preserving the existing constructor validation.
After merging upstream/main, the repository version advanced to
1.5.1-SNAPSHOT while the VoyageAI module still pinned the old
1.4.4-RC3-SNAPSHOT parent, which made the semantickernel-bom import
unresolvable and broke the reactor build.
The VoyageAIModels request/response DTOs expose their mutable list and
array fields directly through getters, setters and one constructor, which
SpotBugs (bug-check profile) flags as EI_EXPOSE_REP/EI_EXPOSE_REP2. These
are plain Jackson-mapped data holders, so annotate the individual accessors
with @SuppressFBWarnings, matching the pattern already used by the other
aiservices DTOs (e.g. HuggingFace, OpenAI, Google).
@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

The CI-repair objective this round was aimed at is met, and commit hygiene is clean — but there are correctness and convention issues that should be fixed before merge.

What's solid

  • CT_CONSTRUCTOR_THROW fixed correctly.RerankResult and all four VoyageAI service classes plus VoyageAIClient are now final, so the throwing constructors are no longer finalizer-attack vectors. This is exactly the failure @karianna flagged on Adding VoyageAI integration microsoft/semantic-kernel-java#345.
  • EI_EXPOSE_REP / EI_EXPOSE_REP2 applied correctly.VoyageAIModels getters returning mutable List/float[]/nested DTOs carry @SuppressFBWarnings("EI_EXPOSE_REP"); setters and the MultimodalInput(List) ctor carry EI_EXPOSE_REP2; primitive/String accessors correctly omit it. Mirrors the HuggingFace/OpenAI DTO pattern — no over/under-application.
  • Wiring correct: parent bumped to 1.5.1-SNAPSHOT, module registered in root pom.xml, PACKAGES.md documented.
  • Commit hygiene clean: no Co-Authored-By, no "Generated with", no .claude/ files anywhere in the branch.
  • Solid unit coverage of the service layer (happy path, builder, validation, rerank descending-sort, contextualized insertion-order).

Should fix before merge

  1. [Medium] Blocking I/O on a Reactor thread.VoyageAIClient.sendRequestAsync wraps a synchronous newCall(...).execute() in Mono.fromCallable with no .subscribeOn(Schedulers.boundedElastic()). In a reactive library this blocks a non-blocking thread. Use OkHttp's async enqueue (Mono.create) or add subscribeOn(boundedElastic()).
  2. [Medium] New HTTP stack diverges from every other connector. Every existing connector (openai/google/huggingface) uses com.azure.core.http.HttpClient; this module pulls in com.squareup.okhttp3:okhttp with a hardcoded 4.12.0 — the other deps here are correctly unversioned via the parent BOM. Either align on azure-core, or at minimum centralize the OkHttp version in semantickernel-bom/parent dependencyManagement.
  3. [Medium] FAIL_ON_UNKNOWN_PROPERTIES not disabled globally. Only the wrapper DTOs carry @JsonIgnoreProperties(ignoreUnknown=true); leaf DTOs (EmbeddingDataItem, RerankDataItem, EmbeddingUsage, MultimodalContentItem) don't, so any new field VoyageAI returns will throw. Set it on the ObjectMapper instead of relying on unevenly-applied annotations.
  4. [Medium] VoyageAIClient has zero tests — the riskiest code (URL/auth header, non-2xx to AIException mapping, null/empty body, deserialization guards). OkHttp ships mockwebserver; a MockWebServer test here would be high value.
  5. [Low] rerankAsync throws synchronously for the null-query check instead of returning Mono.error(...), breaking reactive composition (the null-documents branch just below does it right).
  6. [Low] Inconsistent @JsonInclude(NON_NULL)EmbeddingRequest and RerankRequest lack it, so unset optionals serialize as explicit nulls ("top_k":null, etc.); other request DTOs have it.
  7. [Low] Possible NPE on response.getData().stream() if a 200 body deserializes with null data; and documents.get(item.getIndex()) trusts the API index is in range.
  8. [Low] Unused importorg.junit.jupiter.api.Disabled in VoyageAIIntegrationTest — likely a checkstyle failure in this project.

Items 1–4 are the ones I'd want addressed; the CI fixes themselves are correct and can stay as-is.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

CI-repair round — merge-gatekeeper status

Investigated the merge-gatekeeper red on upstream microsoft#345 (head 5139ecb). Findings:

Root cause is the fork-PR workflow-approval gate, not a code defect. All five upstream workflow runs on the head commit are stuck at action_required (never executed):

WorkflowState
Build Java Semantic Kernelcompleted/action_required
Spell Checkcompleted/action_required
Check .md linkscompleted/action_required
Run Java Integration Tests and Samplescompleted/action_required
Merge Gatekeepercompleted/action_required

Combined commit status is pending; PR is MERGEABLE but BLOCKED. merge-gatekeeper aggregates the other checks, and since none have been allowed to run, it can never report green. Clearing this requires a Microsoft maintainer to click Approve and run workflows on microsoft#345 (external-contributor gate). No push from this side changes it.

The actual build is verified green locally on the current head (5139ecb), so the checks will pass once approved:

  • ./mvnw -B -Pbug-check -DskipTests -Pcompile-jdk17 clean installsemantickernel-api + aiservices/voyageaiBUILD SUCCESS, SpotBugs clean (CT_CONSTRUCTOR_THROW + EI_EXPOSE_REP fixes hold).
  • ./mvnw -B -Pbug-check -Pcompile-jdk17 test -pl aiservices/voyageai33 run, 0 failures, 6 skipped (live-API integration tests skip without credentials).
  • typos -c .github/_typos.toml — clean (Spell Check).
  • Branch is 0 commits behind upstream/main; git diff --stat upstream/main...voyageai_integration is limited to the VoyageAI module, the two reranking API files, PACKAGES.md, and the root pom.xml entry — no unrelated files.

The only unrelated local build noise is semantickernel-data-oracle testcontainers failing because Docker is absent on this machine — that module is outside this diff and passes in CI where Docker is available.

No code change is warranted for this scoped round (merge-gatekeeper only). The separate review items (blocking I/O, OkHttp version, etc.) are out of scope here and left untouched.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

Thanks for this — it's a substantial, well-organized contribution. The diff is cleanly scoped (16 files vs the merge-base with upstream/main), the Javadoc is thorough, the builder patterns and constructor validation are consistent across the four services, and the tests (33) are meaningful. The SpotBugs CI-repair work is correct and well-reasoned: marking the value/service classes final for CT_CONSTRUCTOR_THROW, and annotating the DTO accessors with @SuppressFBWarnings to match the existing HuggingFace/OpenAI/Google pattern. The change is purely additive (no breaking changes) and the 1.5.1-SNAPSHOT version alignment is right.

Commit hygiene: clean. No Co-Authored-By, no "Generated with" trailers, no .claude/ files, correct authorship, and descriptive commit messages.

That said, a few items should be addressed before merge:

1. Module missing from semantickernel-bom (convention gap — should fix).
The module is added to the reactor in the root pom.xml, but unlike huggingface, openai, and google it is not registered in semantickernel-bom/pom.xml. Consumers importing the BOM won't get a managed version for semantickernel-aiservices-voyageai. Add the matching <dependency> entry (${project.version}) alongside the other aiservices modules (~line 96).

2. HTTP client diverges from project convention (design — please justify or align).
Every other aiservices module uses com.azure.core.http.HttpClient. This module introduces okhttp3 as a brand-new dependency to the whole repo, with a hardcoded 4.12.0 version not managed by the parent/BOM. That adds a new transitive-dependency surface and a version that won't track centrally. Prefer reusing azure-core's HttpClient (as HuggingFace does) — or, if okhttp is intentional, at minimum move the version into dependency management and flag the new dependency for the maintainers.

3. Blocking I/O on the subscriber thread (reactive correctness).
VoyageAIClient.sendRequestAsync wraps a blocking okhttp .execute() in Mono.fromCallable(...) with no .subscribeOn(Schedulers.boundedElastic()). This blocks whatever thread subscribes — a real problem in a fully reactive pipeline. By contrast, HuggingFaceClient uses azure-core's non-blocking HttpClient.send() returning a Mono. Either switch to a non-blocking client or offload with boundedElastic().

4. Reactive contract violation (minor).
VoyageAITextRerankingService.rerankAsync throws IllegalArgumentException synchronously for a null/empty query, whereas a method returning Mono should signal via Mono.error(...) (the empty-documents case already returns Mono.just(...)). Same eager-throw pattern is worth auditing across the services.

Minor / optional:

  • Unit tests mock VoyageAIClient, so the client's own serialize → HTTP → deserialize → error-handling path is only exercised by the live integration tests (skipped without credentials). A MockWebServer-based test would close that gap.
  • response.getData() is dereferenced (.size(), .stream()) without a null guard; a malformed response body would NPE rather than surface a clean AIException.

None of these are blockers in spirit — (1) and (3) are the ones I'd want resolved, and (2) is worth a conscious decision from the maintainers. Happy to re-review once addressed.

@karianna

Copy link
Copy Markdown

@johnoliver - Can you review this with a view to future direction of Microsoft Agent Framework. Happy to accept extra functionality in principle.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@fzowl@karianna@johnoliver@web-flow
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Adding VoyageAI integration - #1

Open
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration
Open

Adding VoyageAI integration#1
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration

Conversation

@fzowl

Copy link
Copy Markdown
Owner

What

Adds a VoyageAI integration module (aiservices/voyageai) providing text embedding, multimodal embedding, contextualized embedding, and reranking services, plus a small reranking abstraction (TextRerankingService, RerankResult) in semantickernel-api.

Why this round (CI repair)

The upstream PR (microsoft#345) was red on merge-gatekeeper, which was blocked by the Java CI build failing under the bug-check profile. Root causes and fixes:

  • SpotBugs CT_CONSTRUCTOR_THROW: RerankResult and the four VoyageAI service classes plus VoyageAIClient throw validation exceptions from non-final constructors (finalizer-attack vector). Marked these classes final (behavior unchanged; validation preserved). This was the failure that stopped the CI build at semantickernel-api.
  • SpotBugs EI_EXPOSE_REP / EI_EXPOSE_REP2: the VoyageAIModels Jackson DTO accessors expose mutable list/array fields. Annotated the individual getters/setters/constructor with @SuppressFBWarnings, matching the existing pattern in the HuggingFace/OpenAI/Google DTOs. (This surfaced only after the first fix let the build reach the VoyageAI module.)
  • Version alignment: merged current upstream/main (which advanced the repo to 1.5.1-SNAPSHOT); the VoyageAI module still pinned 1.4.4-RC3-SNAPSHOT, which made the semantickernel-bom import unresolvable. Bumped the module's parent version to match.

Validation

Full reactor build with the CI command ./mvnw -Pbug-check -DskipTests -Pcompile-jdk17 clean install passes the semantickernel-api and aiservices/voyageai modules (SpotBugs clean). The VoyageAI unit tests pass (33 run; 6 live-API integration tests skipped without credentials).

Diff scope vs upstream/main is limited to the VoyageAI module, the two new reranking API files, PACKAGES.md, and the root pom.xml module entry.

fzowland others added 30 commits November 17, 2025 10:54
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v5...v6)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-6
Bump actions/checkout from 5 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v5...v6)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-6
Bump actions/upload-artifact from 5 to 6
Bumps org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.3
Java: Bump org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.3 to 3.27.7.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](assertj/assertj@assertj-build-3.26.3...assertj-build-3.27.7)
---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
dependency-version: 3.27.7
dependency-type: direct:development
...
Signed-off-by: dependabot[bot] <support@github.com>
…les/semantickernel-demos/semantickernel-spring-starter/org.assertj-assertj-core-3.27.7
Java: Bump org.assertj:assertj-core from 3.26.3 to 3.27.7 in /samples/semantickernel-demos/semantickernel-spring-starter
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.18.0 to 2.18.6.
- [Commits](FasterXML/jackson-core@jackson-core-2.18.0...jackson-core-2.18.6)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.18.6
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [net.sourceforge.pmd:pmd-core](https://github.com/pmd/pmd) from 7.10.0 to 7.22.0.
- [Release notes](https://github.com/pmd/pmd/releases)
- [Commits](pmd/pmd@pmd_releases/7.10.0...pmd_releases/7.22.0)
---
updated-dependencies:
- dependency-name: net.sourceforge.pmd:pmd-core
dependency-version: 7.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v6...v7)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-7
Bump actions/upload-artifact from 6 to 7
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.18.6
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.18.0 to 2.18.6 in /semantickernel-bom
…sourceforge.pmd-pmd-core-7.22.0
Java: Bump net.sourceforge.pmd:pmd-core from 7.10.0 to 7.22.0
Bumps org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.4
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.4
Java: Bump org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4
Bumps [actions/github-script](https://github.com/actions/github-script) from 8 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](actions/github-script@v8...v9)
---
updated-dependencies:
- dependency-name: actions/github-script
dependency-version: '9'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/github-script-9
Bump actions/github-script from 8 to 9
Update testcontainers and fix testing
Remove unsused test
johnoliverand others added 26 commits April 22, 2026 21:14
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.11.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.11)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.11
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.11
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.11 in /data/semantickernel-data-postgres
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v6...v7)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-7
Bump actions/checkout from 6 to 7
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.21.2 to 2.22.0.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.0
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.21.2 to 2.22.0 in /semantickernel-bom
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.11 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.11...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.11 to 42.7.12 in /data/semantickernel-data-postgres
…/semantickernel-data-jdbc/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.12 in /data/semantickernel-data-jdbc
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.22.0 to 2.22.1.
- [Commits](FasterXML/jackson-core@jackson-core-2.22.0...jackson-core-2.22.1)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.22.0 to 2.22.1.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.22.0 to 2.22.1 in /semantickernel-bom
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.22.0 to 2.22.1 in /semantickernel-bom
Bumps [actions/stale](https://github.com/actions/stale) from 10 to 11.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](actions/stale@v10...v11)
---
updated-dependencies:
- dependency-name: actions/stale
dependency-version: '11'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/stale-11
Bump actions/stale from 10 to 11
…CONSTRUCTOR_THROW
SpotBugs (bug-check profile) flagged CT_CONSTRUCTOR_THROW on classes whose
constructors throw validation exceptions while being non-final, which the
Java CI build treats as an error and fails merge-gatekeeper. Marking these
value/service classes final removes the finalizer-attack vector SpotBugs
warns about while preserving the existing constructor validation.
After merging upstream/main, the repository version advanced to
1.5.1-SNAPSHOT while the VoyageAI module still pinned the old
1.4.4-RC3-SNAPSHOT parent, which made the semantickernel-bom import
unresolvable and broke the reactor build.
The VoyageAIModels request/response DTOs expose their mutable list and
array fields directly through getters, setters and one constructor, which
SpotBugs (bug-check profile) flags as EI_EXPOSE_REP/EI_EXPOSE_REP2. These
are plain Jackson-mapped data holders, so annotate the individual accessors
with @SuppressFBWarnings, matching the pattern already used by the other
aiservices DTOs (e.g. HuggingFace, OpenAI, Google).
@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

The CI-repair objective this round was aimed at is met, and commit hygiene is clean — but there are correctness and convention issues that should be fixed before merge.

What's solid

  • CT_CONSTRUCTOR_THROW fixed correctly.RerankResult and all four VoyageAI service classes plus VoyageAIClient are now final, so the throwing constructors are no longer finalizer-attack vectors. This is exactly the failure @karianna flagged on Adding VoyageAI integration microsoft/semantic-kernel-java#345.
  • EI_EXPOSE_REP / EI_EXPOSE_REP2 applied correctly.VoyageAIModels getters returning mutable List/float[]/nested DTOs carry @SuppressFBWarnings("EI_EXPOSE_REP"); setters and the MultimodalInput(List) ctor carry EI_EXPOSE_REP2; primitive/String accessors correctly omit it. Mirrors the HuggingFace/OpenAI DTO pattern — no over/under-application.
  • Wiring correct: parent bumped to 1.5.1-SNAPSHOT, module registered in root pom.xml, PACKAGES.md documented.
  • Commit hygiene clean: no Co-Authored-By, no "Generated with", no .claude/ files anywhere in the branch.
  • Solid unit coverage of the service layer (happy path, builder, validation, rerank descending-sort, contextualized insertion-order).

Should fix before merge

  1. [Medium] Blocking I/O on a Reactor thread.VoyageAIClient.sendRequestAsync wraps a synchronous newCall(...).execute() in Mono.fromCallable with no .subscribeOn(Schedulers.boundedElastic()). In a reactive library this blocks a non-blocking thread. Use OkHttp's async enqueue (Mono.create) or add subscribeOn(boundedElastic()).
  2. [Medium] New HTTP stack diverges from every other connector. Every existing connector (openai/google/huggingface) uses com.azure.core.http.HttpClient; this module pulls in com.squareup.okhttp3:okhttp with a hardcoded 4.12.0 — the other deps here are correctly unversioned via the parent BOM. Either align on azure-core, or at minimum centralize the OkHttp version in semantickernel-bom/parent dependencyManagement.
  3. [Medium] FAIL_ON_UNKNOWN_PROPERTIES not disabled globally. Only the wrapper DTOs carry @JsonIgnoreProperties(ignoreUnknown=true); leaf DTOs (EmbeddingDataItem, RerankDataItem, EmbeddingUsage, MultimodalContentItem) don't, so any new field VoyageAI returns will throw. Set it on the ObjectMapper instead of relying on unevenly-applied annotations.
  4. [Medium] VoyageAIClient has zero tests — the riskiest code (URL/auth header, non-2xx to AIException mapping, null/empty body, deserialization guards). OkHttp ships mockwebserver; a MockWebServer test here would be high value.
  5. [Low] rerankAsync throws synchronously for the null-query check instead of returning Mono.error(...), breaking reactive composition (the null-documents branch just below does it right).
  6. [Low] Inconsistent @JsonInclude(NON_NULL)EmbeddingRequest and RerankRequest lack it, so unset optionals serialize as explicit nulls ("top_k":null, etc.); other request DTOs have it.
  7. [Low] Possible NPE on response.getData().stream() if a 200 body deserializes with null data; and documents.get(item.getIndex()) trusts the API index is in range.
  8. [Low] Unused importorg.junit.jupiter.api.Disabled in VoyageAIIntegrationTest — likely a checkstyle failure in this project.

Items 1–4 are the ones I'd want addressed; the CI fixes themselves are correct and can stay as-is.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

CI-repair round — merge-gatekeeper status

Investigated the merge-gatekeeper red on upstream microsoft#345 (head 5139ecb). Findings:

Root cause is the fork-PR workflow-approval gate, not a code defect. All five upstream workflow runs on the head commit are stuck at action_required (never executed):

WorkflowState
Build Java Semantic Kernelcompleted/action_required
Spell Checkcompleted/action_required
Check .md linkscompleted/action_required
Run Java Integration Tests and Samplescompleted/action_required
Merge Gatekeepercompleted/action_required

Combined commit status is pending; PR is MERGEABLE but BLOCKED. merge-gatekeeper aggregates the other checks, and since none have been allowed to run, it can never report green. Clearing this requires a Microsoft maintainer to click Approve and run workflows on microsoft#345 (external-contributor gate). No push from this side changes it.

The actual build is verified green locally on the current head (5139ecb), so the checks will pass once approved:

  • ./mvnw -B -Pbug-check -DskipTests -Pcompile-jdk17 clean installsemantickernel-api + aiservices/voyageaiBUILD SUCCESS, SpotBugs clean (CT_CONSTRUCTOR_THROW + EI_EXPOSE_REP fixes hold).
  • ./mvnw -B -Pbug-check -Pcompile-jdk17 test -pl aiservices/voyageai33 run, 0 failures, 6 skipped (live-API integration tests skip without credentials).
  • typos -c .github/_typos.toml — clean (Spell Check).
  • Branch is 0 commits behind upstream/main; git diff --stat upstream/main...voyageai_integration is limited to the VoyageAI module, the two reranking API files, PACKAGES.md, and the root pom.xml entry — no unrelated files.

The only unrelated local build noise is semantickernel-data-oracle testcontainers failing because Docker is absent on this machine — that module is outside this diff and passes in CI where Docker is available.

No code change is warranted for this scoped round (merge-gatekeeper only). The separate review items (blocking I/O, OkHttp version, etc.) are out of scope here and left untouched.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

Thanks for this — it's a substantial, well-organized contribution. The diff is cleanly scoped (16 files vs the merge-base with upstream/main), the Javadoc is thorough, the builder patterns and constructor validation are consistent across the four services, and the tests (33) are meaningful. The SpotBugs CI-repair work is correct and well-reasoned: marking the value/service classes final for CT_CONSTRUCTOR_THROW, and annotating the DTO accessors with @SuppressFBWarnings to match the existing HuggingFace/OpenAI/Google pattern. The change is purely additive (no breaking changes) and the 1.5.1-SNAPSHOT version alignment is right.

Commit hygiene: clean. No Co-Authored-By, no "Generated with" trailers, no .claude/ files, correct authorship, and descriptive commit messages.

That said, a few items should be addressed before merge:

1. Module missing from semantickernel-bom (convention gap — should fix).
The module is added to the reactor in the root pom.xml, but unlike huggingface, openai, and google it is not registered in semantickernel-bom/pom.xml. Consumers importing the BOM won't get a managed version for semantickernel-aiservices-voyageai. Add the matching <dependency> entry (${project.version}) alongside the other aiservices modules (~line 96).

2. HTTP client diverges from project convention (design — please justify or align).
Every other aiservices module uses com.azure.core.http.HttpClient. This module introduces okhttp3 as a brand-new dependency to the whole repo, with a hardcoded 4.12.0 version not managed by the parent/BOM. That adds a new transitive-dependency surface and a version that won't track centrally. Prefer reusing azure-core's HttpClient (as HuggingFace does) — or, if okhttp is intentional, at minimum move the version into dependency management and flag the new dependency for the maintainers.

3. Blocking I/O on the subscriber thread (reactive correctness).
VoyageAIClient.sendRequestAsync wraps a blocking okhttp .execute() in Mono.fromCallable(...) with no .subscribeOn(Schedulers.boundedElastic()). This blocks whatever thread subscribes — a real problem in a fully reactive pipeline. By contrast, HuggingFaceClient uses azure-core's non-blocking HttpClient.send() returning a Mono. Either switch to a non-blocking client or offload with boundedElastic().

4. Reactive contract violation (minor).
VoyageAITextRerankingService.rerankAsync throws IllegalArgumentException synchronously for a null/empty query, whereas a method returning Mono should signal via Mono.error(...) (the empty-documents case already returns Mono.just(...)). Same eager-throw pattern is worth auditing across the services.

Minor / optional:

  • Unit tests mock VoyageAIClient, so the client's own serialize → HTTP → deserialize → error-handling path is only exercised by the live integration tests (skipped without credentials). A MockWebServer-based test would close that gap.
  • response.getData() is dereferenced (.size(), .stream()) without a null guard; a malformed response body would NPE rather than surface a clean AIException.

None of these are blockers in spirit — (1) and (3) are the ones I'd want resolved, and (2) is worth a conscious decision from the maintainers. Happy to re-review once addressed.

@karianna

Copy link
Copy Markdown

@johnoliver - Can you review this with a view to future direction of Microsoft Agent Framework. Happy to accept extra functionality in principle.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@fzowl@karianna@johnoliver@web-flow
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Adding VoyageAI integration - #1

Open
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration
Open

Adding VoyageAI integration#1
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration

Conversation

@fzowl

Copy link
Copy Markdown
Owner

What

Adds a VoyageAI integration module (aiservices/voyageai) providing text embedding, multimodal embedding, contextualized embedding, and reranking services, plus a small reranking abstraction (TextRerankingService, RerankResult) in semantickernel-api.

Why this round (CI repair)

The upstream PR (microsoft#345) was red on merge-gatekeeper, which was blocked by the Java CI build failing under the bug-check profile. Root causes and fixes:

  • SpotBugs CT_CONSTRUCTOR_THROW: RerankResult and the four VoyageAI service classes plus VoyageAIClient throw validation exceptions from non-final constructors (finalizer-attack vector). Marked these classes final (behavior unchanged; validation preserved). This was the failure that stopped the CI build at semantickernel-api.
  • SpotBugs EI_EXPOSE_REP / EI_EXPOSE_REP2: the VoyageAIModels Jackson DTO accessors expose mutable list/array fields. Annotated the individual getters/setters/constructor with @SuppressFBWarnings, matching the existing pattern in the HuggingFace/OpenAI/Google DTOs. (This surfaced only after the first fix let the build reach the VoyageAI module.)
  • Version alignment: merged current upstream/main (which advanced the repo to 1.5.1-SNAPSHOT); the VoyageAI module still pinned 1.4.4-RC3-SNAPSHOT, which made the semantickernel-bom import unresolvable. Bumped the module's parent version to match.

Validation

Full reactor build with the CI command ./mvnw -Pbug-check -DskipTests -Pcompile-jdk17 clean install passes the semantickernel-api and aiservices/voyageai modules (SpotBugs clean). The VoyageAI unit tests pass (33 run; 6 live-API integration tests skipped without credentials).

Diff scope vs upstream/main is limited to the VoyageAI module, the two new reranking API files, PACKAGES.md, and the root pom.xml module entry.

fzowland others added 30 commits November 17, 2025 10:54
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v5...v6)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-6
Bump actions/checkout from 5 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v5...v6)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-6
Bump actions/upload-artifact from 5 to 6
Bumps org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.3
Java: Bump org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.3 to 3.27.7.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](assertj/assertj@assertj-build-3.26.3...assertj-build-3.27.7)
---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
dependency-version: 3.27.7
dependency-type: direct:development
...
Signed-off-by: dependabot[bot] <support@github.com>
…les/semantickernel-demos/semantickernel-spring-starter/org.assertj-assertj-core-3.27.7
Java: Bump org.assertj:assertj-core from 3.26.3 to 3.27.7 in /samples/semantickernel-demos/semantickernel-spring-starter
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.18.0 to 2.18.6.
- [Commits](FasterXML/jackson-core@jackson-core-2.18.0...jackson-core-2.18.6)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.18.6
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [net.sourceforge.pmd:pmd-core](https://github.com/pmd/pmd) from 7.10.0 to 7.22.0.
- [Release notes](https://github.com/pmd/pmd/releases)
- [Commits](pmd/pmd@pmd_releases/7.10.0...pmd_releases/7.22.0)
---
updated-dependencies:
- dependency-name: net.sourceforge.pmd:pmd-core
dependency-version: 7.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v6...v7)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-7
Bump actions/upload-artifact from 6 to 7
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.18.6
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.18.0 to 2.18.6 in /semantickernel-bom
…sourceforge.pmd-pmd-core-7.22.0
Java: Bump net.sourceforge.pmd:pmd-core from 7.10.0 to 7.22.0
Bumps org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.4
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.4
Java: Bump org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4
Bumps [actions/github-script](https://github.com/actions/github-script) from 8 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](actions/github-script@v8...v9)
---
updated-dependencies:
- dependency-name: actions/github-script
dependency-version: '9'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/github-script-9
Bump actions/github-script from 8 to 9
Update testcontainers and fix testing
Remove unsused test
johnoliverand others added 26 commits April 22, 2026 21:14
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.11.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.11)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.11
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.11
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.11 in /data/semantickernel-data-postgres
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v6...v7)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-7
Bump actions/checkout from 6 to 7
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.21.2 to 2.22.0.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.0
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.21.2 to 2.22.0 in /semantickernel-bom
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.11 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.11...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.11 to 42.7.12 in /data/semantickernel-data-postgres
…/semantickernel-data-jdbc/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.12 in /data/semantickernel-data-jdbc
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.22.0 to 2.22.1.
- [Commits](FasterXML/jackson-core@jackson-core-2.22.0...jackson-core-2.22.1)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.22.0 to 2.22.1.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.22.0 to 2.22.1 in /semantickernel-bom
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.22.0 to 2.22.1 in /semantickernel-bom
Bumps [actions/stale](https://github.com/actions/stale) from 10 to 11.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](actions/stale@v10...v11)
---
updated-dependencies:
- dependency-name: actions/stale
dependency-version: '11'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/stale-11
Bump actions/stale from 10 to 11
…CONSTRUCTOR_THROW
SpotBugs (bug-check profile) flagged CT_CONSTRUCTOR_THROW on classes whose
constructors throw validation exceptions while being non-final, which the
Java CI build treats as an error and fails merge-gatekeeper. Marking these
value/service classes final removes the finalizer-attack vector SpotBugs
warns about while preserving the existing constructor validation.
After merging upstream/main, the repository version advanced to
1.5.1-SNAPSHOT while the VoyageAI module still pinned the old
1.4.4-RC3-SNAPSHOT parent, which made the semantickernel-bom import
unresolvable and broke the reactor build.
The VoyageAIModels request/response DTOs expose their mutable list and
array fields directly through getters, setters and one constructor, which
SpotBugs (bug-check profile) flags as EI_EXPOSE_REP/EI_EXPOSE_REP2. These
are plain Jackson-mapped data holders, so annotate the individual accessors
with @SuppressFBWarnings, matching the pattern already used by the other
aiservices DTOs (e.g. HuggingFace, OpenAI, Google).
@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

The CI-repair objective this round was aimed at is met, and commit hygiene is clean — but there are correctness and convention issues that should be fixed before merge.

What's solid

  • CT_CONSTRUCTOR_THROW fixed correctly.RerankResult and all four VoyageAI service classes plus VoyageAIClient are now final, so the throwing constructors are no longer finalizer-attack vectors. This is exactly the failure @karianna flagged on Adding VoyageAI integration microsoft/semantic-kernel-java#345.
  • EI_EXPOSE_REP / EI_EXPOSE_REP2 applied correctly.VoyageAIModels getters returning mutable List/float[]/nested DTOs carry @SuppressFBWarnings("EI_EXPOSE_REP"); setters and the MultimodalInput(List) ctor carry EI_EXPOSE_REP2; primitive/String accessors correctly omit it. Mirrors the HuggingFace/OpenAI DTO pattern — no over/under-application.
  • Wiring correct: parent bumped to 1.5.1-SNAPSHOT, module registered in root pom.xml, PACKAGES.md documented.
  • Commit hygiene clean: no Co-Authored-By, no "Generated with", no .claude/ files anywhere in the branch.
  • Solid unit coverage of the service layer (happy path, builder, validation, rerank descending-sort, contextualized insertion-order).

Should fix before merge

  1. [Medium] Blocking I/O on a Reactor thread.VoyageAIClient.sendRequestAsync wraps a synchronous newCall(...).execute() in Mono.fromCallable with no .subscribeOn(Schedulers.boundedElastic()). In a reactive library this blocks a non-blocking thread. Use OkHttp's async enqueue (Mono.create) or add subscribeOn(boundedElastic()).
  2. [Medium] New HTTP stack diverges from every other connector. Every existing connector (openai/google/huggingface) uses com.azure.core.http.HttpClient; this module pulls in com.squareup.okhttp3:okhttp with a hardcoded 4.12.0 — the other deps here are correctly unversioned via the parent BOM. Either align on azure-core, or at minimum centralize the OkHttp version in semantickernel-bom/parent dependencyManagement.
  3. [Medium] FAIL_ON_UNKNOWN_PROPERTIES not disabled globally. Only the wrapper DTOs carry @JsonIgnoreProperties(ignoreUnknown=true); leaf DTOs (EmbeddingDataItem, RerankDataItem, EmbeddingUsage, MultimodalContentItem) don't, so any new field VoyageAI returns will throw. Set it on the ObjectMapper instead of relying on unevenly-applied annotations.
  4. [Medium] VoyageAIClient has zero tests — the riskiest code (URL/auth header, non-2xx to AIException mapping, null/empty body, deserialization guards). OkHttp ships mockwebserver; a MockWebServer test here would be high value.
  5. [Low] rerankAsync throws synchronously for the null-query check instead of returning Mono.error(...), breaking reactive composition (the null-documents branch just below does it right).
  6. [Low] Inconsistent @JsonInclude(NON_NULL)EmbeddingRequest and RerankRequest lack it, so unset optionals serialize as explicit nulls ("top_k":null, etc.); other request DTOs have it.
  7. [Low] Possible NPE on response.getData().stream() if a 200 body deserializes with null data; and documents.get(item.getIndex()) trusts the API index is in range.
  8. [Low] Unused importorg.junit.jupiter.api.Disabled in VoyageAIIntegrationTest — likely a checkstyle failure in this project.

Items 1–4 are the ones I'd want addressed; the CI fixes themselves are correct and can stay as-is.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

CI-repair round — merge-gatekeeper status

Investigated the merge-gatekeeper red on upstream microsoft#345 (head 5139ecb). Findings:

Root cause is the fork-PR workflow-approval gate, not a code defect. All five upstream workflow runs on the head commit are stuck at action_required (never executed):

WorkflowState
Build Java Semantic Kernelcompleted/action_required
Spell Checkcompleted/action_required
Check .md linkscompleted/action_required
Run Java Integration Tests and Samplescompleted/action_required
Merge Gatekeepercompleted/action_required

Combined commit status is pending; PR is MERGEABLE but BLOCKED. merge-gatekeeper aggregates the other checks, and since none have been allowed to run, it can never report green. Clearing this requires a Microsoft maintainer to click Approve and run workflows on microsoft#345 (external-contributor gate). No push from this side changes it.

The actual build is verified green locally on the current head (5139ecb), so the checks will pass once approved:

  • ./mvnw -B -Pbug-check -DskipTests -Pcompile-jdk17 clean installsemantickernel-api + aiservices/voyageaiBUILD SUCCESS, SpotBugs clean (CT_CONSTRUCTOR_THROW + EI_EXPOSE_REP fixes hold).
  • ./mvnw -B -Pbug-check -Pcompile-jdk17 test -pl aiservices/voyageai33 run, 0 failures, 6 skipped (live-API integration tests skip without credentials).
  • typos -c .github/_typos.toml — clean (Spell Check).
  • Branch is 0 commits behind upstream/main; git diff --stat upstream/main...voyageai_integration is limited to the VoyageAI module, the two reranking API files, PACKAGES.md, and the root pom.xml entry — no unrelated files.

The only unrelated local build noise is semantickernel-data-oracle testcontainers failing because Docker is absent on this machine — that module is outside this diff and passes in CI where Docker is available.

No code change is warranted for this scoped round (merge-gatekeeper only). The separate review items (blocking I/O, OkHttp version, etc.) are out of scope here and left untouched.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

Thanks for this — it's a substantial, well-organized contribution. The diff is cleanly scoped (16 files vs the merge-base with upstream/main), the Javadoc is thorough, the builder patterns and constructor validation are consistent across the four services, and the tests (33) are meaningful. The SpotBugs CI-repair work is correct and well-reasoned: marking the value/service classes final for CT_CONSTRUCTOR_THROW, and annotating the DTO accessors with @SuppressFBWarnings to match the existing HuggingFace/OpenAI/Google pattern. The change is purely additive (no breaking changes) and the 1.5.1-SNAPSHOT version alignment is right.

Commit hygiene: clean. No Co-Authored-By, no "Generated with" trailers, no .claude/ files, correct authorship, and descriptive commit messages.

That said, a few items should be addressed before merge:

1. Module missing from semantickernel-bom (convention gap — should fix).
The module is added to the reactor in the root pom.xml, but unlike huggingface, openai, and google it is not registered in semantickernel-bom/pom.xml. Consumers importing the BOM won't get a managed version for semantickernel-aiservices-voyageai. Add the matching <dependency> entry (${project.version}) alongside the other aiservices modules (~line 96).

2. HTTP client diverges from project convention (design — please justify or align).
Every other aiservices module uses com.azure.core.http.HttpClient. This module introduces okhttp3 as a brand-new dependency to the whole repo, with a hardcoded 4.12.0 version not managed by the parent/BOM. That adds a new transitive-dependency surface and a version that won't track centrally. Prefer reusing azure-core's HttpClient (as HuggingFace does) — or, if okhttp is intentional, at minimum move the version into dependency management and flag the new dependency for the maintainers.

3. Blocking I/O on the subscriber thread (reactive correctness).
VoyageAIClient.sendRequestAsync wraps a blocking okhttp .execute() in Mono.fromCallable(...) with no .subscribeOn(Schedulers.boundedElastic()). This blocks whatever thread subscribes — a real problem in a fully reactive pipeline. By contrast, HuggingFaceClient uses azure-core's non-blocking HttpClient.send() returning a Mono. Either switch to a non-blocking client or offload with boundedElastic().

4. Reactive contract violation (minor).
VoyageAITextRerankingService.rerankAsync throws IllegalArgumentException synchronously for a null/empty query, whereas a method returning Mono should signal via Mono.error(...) (the empty-documents case already returns Mono.just(...)). Same eager-throw pattern is worth auditing across the services.

Minor / optional:

  • Unit tests mock VoyageAIClient, so the client's own serialize → HTTP → deserialize → error-handling path is only exercised by the live integration tests (skipped without credentials). A MockWebServer-based test would close that gap.
  • response.getData() is dereferenced (.size(), .stream()) without a null guard; a malformed response body would NPE rather than surface a clean AIException.

None of these are blockers in spirit — (1) and (3) are the ones I'd want resolved, and (2) is worth a conscious decision from the maintainers. Happy to re-review once addressed.

@karianna

Copy link
Copy Markdown

@johnoliver - Can you review this with a view to future direction of Microsoft Agent Framework. Happy to accept extra functionality in principle.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@fzowl@karianna@johnoliver@web-flow
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Adding VoyageAI integration - #1

Open
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration
Open

Adding VoyageAI integration#1
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration

Conversation

@fzowl

Copy link
Copy Markdown
Owner

What

Adds a VoyageAI integration module (aiservices/voyageai) providing text embedding, multimodal embedding, contextualized embedding, and reranking services, plus a small reranking abstraction (TextRerankingService, RerankResult) in semantickernel-api.

Why this round (CI repair)

The upstream PR (microsoft#345) was red on merge-gatekeeper, which was blocked by the Java CI build failing under the bug-check profile. Root causes and fixes:

  • SpotBugs CT_CONSTRUCTOR_THROW: RerankResult and the four VoyageAI service classes plus VoyageAIClient throw validation exceptions from non-final constructors (finalizer-attack vector). Marked these classes final (behavior unchanged; validation preserved). This was the failure that stopped the CI build at semantickernel-api.
  • SpotBugs EI_EXPOSE_REP / EI_EXPOSE_REP2: the VoyageAIModels Jackson DTO accessors expose mutable list/array fields. Annotated the individual getters/setters/constructor with @SuppressFBWarnings, matching the existing pattern in the HuggingFace/OpenAI/Google DTOs. (This surfaced only after the first fix let the build reach the VoyageAI module.)
  • Version alignment: merged current upstream/main (which advanced the repo to 1.5.1-SNAPSHOT); the VoyageAI module still pinned 1.4.4-RC3-SNAPSHOT, which made the semantickernel-bom import unresolvable. Bumped the module's parent version to match.

Validation

Full reactor build with the CI command ./mvnw -Pbug-check -DskipTests -Pcompile-jdk17 clean install passes the semantickernel-api and aiservices/voyageai modules (SpotBugs clean). The VoyageAI unit tests pass (33 run; 6 live-API integration tests skipped without credentials).

Diff scope vs upstream/main is limited to the VoyageAI module, the two new reranking API files, PACKAGES.md, and the root pom.xml module entry.

fzowland others added 30 commits November 17, 2025 10:54
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v5...v6)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-6
Bump actions/checkout from 5 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v5...v6)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-6
Bump actions/upload-artifact from 5 to 6
Bumps org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.3
Java: Bump org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.3 to 3.27.7.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](assertj/assertj@assertj-build-3.26.3...assertj-build-3.27.7)
---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
dependency-version: 3.27.7
dependency-type: direct:development
...
Signed-off-by: dependabot[bot] <support@github.com>
…les/semantickernel-demos/semantickernel-spring-starter/org.assertj-assertj-core-3.27.7
Java: Bump org.assertj:assertj-core from 3.26.3 to 3.27.7 in /samples/semantickernel-demos/semantickernel-spring-starter
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.18.0 to 2.18.6.
- [Commits](FasterXML/jackson-core@jackson-core-2.18.0...jackson-core-2.18.6)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.18.6
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [net.sourceforge.pmd:pmd-core](https://github.com/pmd/pmd) from 7.10.0 to 7.22.0.
- [Release notes](https://github.com/pmd/pmd/releases)
- [Commits](pmd/pmd@pmd_releases/7.10.0...pmd_releases/7.22.0)
---
updated-dependencies:
- dependency-name: net.sourceforge.pmd:pmd-core
dependency-version: 7.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v6...v7)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-7
Bump actions/upload-artifact from 6 to 7
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.18.6
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.18.0 to 2.18.6 in /semantickernel-bom
…sourceforge.pmd-pmd-core-7.22.0
Java: Bump net.sourceforge.pmd:pmd-core from 7.10.0 to 7.22.0
Bumps org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.4
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.4
Java: Bump org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4
Bumps [actions/github-script](https://github.com/actions/github-script) from 8 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](actions/github-script@v8...v9)
---
updated-dependencies:
- dependency-name: actions/github-script
dependency-version: '9'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/github-script-9
Bump actions/github-script from 8 to 9
Update testcontainers and fix testing
Remove unsused test
johnoliverand others added 26 commits April 22, 2026 21:14
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.11.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.11)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.11
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.11
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.11 in /data/semantickernel-data-postgres
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v6...v7)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-7
Bump actions/checkout from 6 to 7
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.21.2 to 2.22.0.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.0
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.21.2 to 2.22.0 in /semantickernel-bom
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.11 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.11...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.11 to 42.7.12 in /data/semantickernel-data-postgres
…/semantickernel-data-jdbc/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.12 in /data/semantickernel-data-jdbc
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.22.0 to 2.22.1.
- [Commits](FasterXML/jackson-core@jackson-core-2.22.0...jackson-core-2.22.1)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.22.0 to 2.22.1.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.22.0 to 2.22.1 in /semantickernel-bom
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.22.0 to 2.22.1 in /semantickernel-bom
Bumps [actions/stale](https://github.com/actions/stale) from 10 to 11.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](actions/stale@v10...v11)
---
updated-dependencies:
- dependency-name: actions/stale
dependency-version: '11'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/stale-11
Bump actions/stale from 10 to 11
…CONSTRUCTOR_THROW
SpotBugs (bug-check profile) flagged CT_CONSTRUCTOR_THROW on classes whose
constructors throw validation exceptions while being non-final, which the
Java CI build treats as an error and fails merge-gatekeeper. Marking these
value/service classes final removes the finalizer-attack vector SpotBugs
warns about while preserving the existing constructor validation.
After merging upstream/main, the repository version advanced to
1.5.1-SNAPSHOT while the VoyageAI module still pinned the old
1.4.4-RC3-SNAPSHOT parent, which made the semantickernel-bom import
unresolvable and broke the reactor build.
The VoyageAIModels request/response DTOs expose their mutable list and
array fields directly through getters, setters and one constructor, which
SpotBugs (bug-check profile) flags as EI_EXPOSE_REP/EI_EXPOSE_REP2. These
are plain Jackson-mapped data holders, so annotate the individual accessors
with @SuppressFBWarnings, matching the pattern already used by the other
aiservices DTOs (e.g. HuggingFace, OpenAI, Google).
@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

The CI-repair objective this round was aimed at is met, and commit hygiene is clean — but there are correctness and convention issues that should be fixed before merge.

What's solid

  • CT_CONSTRUCTOR_THROW fixed correctly.RerankResult and all four VoyageAI service classes plus VoyageAIClient are now final, so the throwing constructors are no longer finalizer-attack vectors. This is exactly the failure @karianna flagged on Adding VoyageAI integration microsoft/semantic-kernel-java#345.
  • EI_EXPOSE_REP / EI_EXPOSE_REP2 applied correctly.VoyageAIModels getters returning mutable List/float[]/nested DTOs carry @SuppressFBWarnings("EI_EXPOSE_REP"); setters and the MultimodalInput(List) ctor carry EI_EXPOSE_REP2; primitive/String accessors correctly omit it. Mirrors the HuggingFace/OpenAI DTO pattern — no over/under-application.
  • Wiring correct: parent bumped to 1.5.1-SNAPSHOT, module registered in root pom.xml, PACKAGES.md documented.
  • Commit hygiene clean: no Co-Authored-By, no "Generated with", no .claude/ files anywhere in the branch.
  • Solid unit coverage of the service layer (happy path, builder, validation, rerank descending-sort, contextualized insertion-order).

Should fix before merge

  1. [Medium] Blocking I/O on a Reactor thread.VoyageAIClient.sendRequestAsync wraps a synchronous newCall(...).execute() in Mono.fromCallable with no .subscribeOn(Schedulers.boundedElastic()). In a reactive library this blocks a non-blocking thread. Use OkHttp's async enqueue (Mono.create) or add subscribeOn(boundedElastic()).
  2. [Medium] New HTTP stack diverges from every other connector. Every existing connector (openai/google/huggingface) uses com.azure.core.http.HttpClient; this module pulls in com.squareup.okhttp3:okhttp with a hardcoded 4.12.0 — the other deps here are correctly unversioned via the parent BOM. Either align on azure-core, or at minimum centralize the OkHttp version in semantickernel-bom/parent dependencyManagement.
  3. [Medium] FAIL_ON_UNKNOWN_PROPERTIES not disabled globally. Only the wrapper DTOs carry @JsonIgnoreProperties(ignoreUnknown=true); leaf DTOs (EmbeddingDataItem, RerankDataItem, EmbeddingUsage, MultimodalContentItem) don't, so any new field VoyageAI returns will throw. Set it on the ObjectMapper instead of relying on unevenly-applied annotations.
  4. [Medium] VoyageAIClient has zero tests — the riskiest code (URL/auth header, non-2xx to AIException mapping, null/empty body, deserialization guards). OkHttp ships mockwebserver; a MockWebServer test here would be high value.
  5. [Low] rerankAsync throws synchronously for the null-query check instead of returning Mono.error(...), breaking reactive composition (the null-documents branch just below does it right).
  6. [Low] Inconsistent @JsonInclude(NON_NULL)EmbeddingRequest and RerankRequest lack it, so unset optionals serialize as explicit nulls ("top_k":null, etc.); other request DTOs have it.
  7. [Low] Possible NPE on response.getData().stream() if a 200 body deserializes with null data; and documents.get(item.getIndex()) trusts the API index is in range.
  8. [Low] Unused importorg.junit.jupiter.api.Disabled in VoyageAIIntegrationTest — likely a checkstyle failure in this project.

Items 1–4 are the ones I'd want addressed; the CI fixes themselves are correct and can stay as-is.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

CI-repair round — merge-gatekeeper status

Investigated the merge-gatekeeper red on upstream microsoft#345 (head 5139ecb). Findings:

Root cause is the fork-PR workflow-approval gate, not a code defect. All five upstream workflow runs on the head commit are stuck at action_required (never executed):

WorkflowState
Build Java Semantic Kernelcompleted/action_required
Spell Checkcompleted/action_required
Check .md linkscompleted/action_required
Run Java Integration Tests and Samplescompleted/action_required
Merge Gatekeepercompleted/action_required

Combined commit status is pending; PR is MERGEABLE but BLOCKED. merge-gatekeeper aggregates the other checks, and since none have been allowed to run, it can never report green. Clearing this requires a Microsoft maintainer to click Approve and run workflows on microsoft#345 (external-contributor gate). No push from this side changes it.

The actual build is verified green locally on the current head (5139ecb), so the checks will pass once approved:

  • ./mvnw -B -Pbug-check -DskipTests -Pcompile-jdk17 clean installsemantickernel-api + aiservices/voyageaiBUILD SUCCESS, SpotBugs clean (CT_CONSTRUCTOR_THROW + EI_EXPOSE_REP fixes hold).
  • ./mvnw -B -Pbug-check -Pcompile-jdk17 test -pl aiservices/voyageai33 run, 0 failures, 6 skipped (live-API integration tests skip without credentials).
  • typos -c .github/_typos.toml — clean (Spell Check).
  • Branch is 0 commits behind upstream/main; git diff --stat upstream/main...voyageai_integration is limited to the VoyageAI module, the two reranking API files, PACKAGES.md, and the root pom.xml entry — no unrelated files.

The only unrelated local build noise is semantickernel-data-oracle testcontainers failing because Docker is absent on this machine — that module is outside this diff and passes in CI where Docker is available.

No code change is warranted for this scoped round (merge-gatekeeper only). The separate review items (blocking I/O, OkHttp version, etc.) are out of scope here and left untouched.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

Thanks for this — it's a substantial, well-organized contribution. The diff is cleanly scoped (16 files vs the merge-base with upstream/main), the Javadoc is thorough, the builder patterns and constructor validation are consistent across the four services, and the tests (33) are meaningful. The SpotBugs CI-repair work is correct and well-reasoned: marking the value/service classes final for CT_CONSTRUCTOR_THROW, and annotating the DTO accessors with @SuppressFBWarnings to match the existing HuggingFace/OpenAI/Google pattern. The change is purely additive (no breaking changes) and the 1.5.1-SNAPSHOT version alignment is right.

Commit hygiene: clean. No Co-Authored-By, no "Generated with" trailers, no .claude/ files, correct authorship, and descriptive commit messages.

That said, a few items should be addressed before merge:

1. Module missing from semantickernel-bom (convention gap — should fix).
The module is added to the reactor in the root pom.xml, but unlike huggingface, openai, and google it is not registered in semantickernel-bom/pom.xml. Consumers importing the BOM won't get a managed version for semantickernel-aiservices-voyageai. Add the matching <dependency> entry (${project.version}) alongside the other aiservices modules (~line 96).

2. HTTP client diverges from project convention (design — please justify or align).
Every other aiservices module uses com.azure.core.http.HttpClient. This module introduces okhttp3 as a brand-new dependency to the whole repo, with a hardcoded 4.12.0 version not managed by the parent/BOM. That adds a new transitive-dependency surface and a version that won't track centrally. Prefer reusing azure-core's HttpClient (as HuggingFace does) — or, if okhttp is intentional, at minimum move the version into dependency management and flag the new dependency for the maintainers.

3. Blocking I/O on the subscriber thread (reactive correctness).
VoyageAIClient.sendRequestAsync wraps a blocking okhttp .execute() in Mono.fromCallable(...) with no .subscribeOn(Schedulers.boundedElastic()). This blocks whatever thread subscribes — a real problem in a fully reactive pipeline. By contrast, HuggingFaceClient uses azure-core's non-blocking HttpClient.send() returning a Mono. Either switch to a non-blocking client or offload with boundedElastic().

4. Reactive contract violation (minor).
VoyageAITextRerankingService.rerankAsync throws IllegalArgumentException synchronously for a null/empty query, whereas a method returning Mono should signal via Mono.error(...) (the empty-documents case already returns Mono.just(...)). Same eager-throw pattern is worth auditing across the services.

Minor / optional:

  • Unit tests mock VoyageAIClient, so the client's own serialize → HTTP → deserialize → error-handling path is only exercised by the live integration tests (skipped without credentials). A MockWebServer-based test would close that gap.
  • response.getData() is dereferenced (.size(), .stream()) without a null guard; a malformed response body would NPE rather than surface a clean AIException.

None of these are blockers in spirit — (1) and (3) are the ones I'd want resolved, and (2) is worth a conscious decision from the maintainers. Happy to re-review once addressed.

@karianna

Copy link
Copy Markdown

@johnoliver - Can you review this with a view to future direction of Microsoft Agent Framework. Happy to accept extra functionality in principle.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@fzowl@karianna@johnoliver@web-flow
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Adding VoyageAI integration - #1

Open
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration
Open

Adding VoyageAI integration#1
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration

Conversation

@fzowl

Copy link
Copy Markdown
Owner

What

Adds a VoyageAI integration module (aiservices/voyageai) providing text embedding, multimodal embedding, contextualized embedding, and reranking services, plus a small reranking abstraction (TextRerankingService, RerankResult) in semantickernel-api.

Why this round (CI repair)

The upstream PR (microsoft#345) was red on merge-gatekeeper, which was blocked by the Java CI build failing under the bug-check profile. Root causes and fixes:

  • SpotBugs CT_CONSTRUCTOR_THROW: RerankResult and the four VoyageAI service classes plus VoyageAIClient throw validation exceptions from non-final constructors (finalizer-attack vector). Marked these classes final (behavior unchanged; validation preserved). This was the failure that stopped the CI build at semantickernel-api.
  • SpotBugs EI_EXPOSE_REP / EI_EXPOSE_REP2: the VoyageAIModels Jackson DTO accessors expose mutable list/array fields. Annotated the individual getters/setters/constructor with @SuppressFBWarnings, matching the existing pattern in the HuggingFace/OpenAI/Google DTOs. (This surfaced only after the first fix let the build reach the VoyageAI module.)
  • Version alignment: merged current upstream/main (which advanced the repo to 1.5.1-SNAPSHOT); the VoyageAI module still pinned 1.4.4-RC3-SNAPSHOT, which made the semantickernel-bom import unresolvable. Bumped the module's parent version to match.

Validation

Full reactor build with the CI command ./mvnw -Pbug-check -DskipTests -Pcompile-jdk17 clean install passes the semantickernel-api and aiservices/voyageai modules (SpotBugs clean). The VoyageAI unit tests pass (33 run; 6 live-API integration tests skipped without credentials).

Diff scope vs upstream/main is limited to the VoyageAI module, the two new reranking API files, PACKAGES.md, and the root pom.xml module entry.

fzowland others added 30 commits November 17, 2025 10:54
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v5...v6)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-6
Bump actions/checkout from 5 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v5...v6)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-6
Bump actions/upload-artifact from 5 to 6
Bumps org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.3
Java: Bump org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.3 to 3.27.7.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](assertj/assertj@assertj-build-3.26.3...assertj-build-3.27.7)
---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
dependency-version: 3.27.7
dependency-type: direct:development
...
Signed-off-by: dependabot[bot] <support@github.com>
…les/semantickernel-demos/semantickernel-spring-starter/org.assertj-assertj-core-3.27.7
Java: Bump org.assertj:assertj-core from 3.26.3 to 3.27.7 in /samples/semantickernel-demos/semantickernel-spring-starter
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.18.0 to 2.18.6.
- [Commits](FasterXML/jackson-core@jackson-core-2.18.0...jackson-core-2.18.6)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.18.6
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [net.sourceforge.pmd:pmd-core](https://github.com/pmd/pmd) from 7.10.0 to 7.22.0.
- [Release notes](https://github.com/pmd/pmd/releases)
- [Commits](pmd/pmd@pmd_releases/7.10.0...pmd_releases/7.22.0)
---
updated-dependencies:
- dependency-name: net.sourceforge.pmd:pmd-core
dependency-version: 7.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v6...v7)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-7
Bump actions/upload-artifact from 6 to 7
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.18.6
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.18.0 to 2.18.6 in /semantickernel-bom
…sourceforge.pmd-pmd-core-7.22.0
Java: Bump net.sourceforge.pmd:pmd-core from 7.10.0 to 7.22.0
Bumps org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.4
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.4
Java: Bump org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4
Bumps [actions/github-script](https://github.com/actions/github-script) from 8 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](actions/github-script@v8...v9)
---
updated-dependencies:
- dependency-name: actions/github-script
dependency-version: '9'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/github-script-9
Bump actions/github-script from 8 to 9
Update testcontainers and fix testing
Remove unsused test
johnoliverand others added 26 commits April 22, 2026 21:14
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.11.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.11)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.11
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.11
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.11 in /data/semantickernel-data-postgres
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v6...v7)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-7
Bump actions/checkout from 6 to 7
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.21.2 to 2.22.0.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.0
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.21.2 to 2.22.0 in /semantickernel-bom
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.11 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.11...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.11 to 42.7.12 in /data/semantickernel-data-postgres
…/semantickernel-data-jdbc/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.12 in /data/semantickernel-data-jdbc
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.22.0 to 2.22.1.
- [Commits](FasterXML/jackson-core@jackson-core-2.22.0...jackson-core-2.22.1)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.22.0 to 2.22.1.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.22.0 to 2.22.1 in /semantickernel-bom
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.22.0 to 2.22.1 in /semantickernel-bom
Bumps [actions/stale](https://github.com/actions/stale) from 10 to 11.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](actions/stale@v10...v11)
---
updated-dependencies:
- dependency-name: actions/stale
dependency-version: '11'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/stale-11
Bump actions/stale from 10 to 11
…CONSTRUCTOR_THROW
SpotBugs (bug-check profile) flagged CT_CONSTRUCTOR_THROW on classes whose
constructors throw validation exceptions while being non-final, which the
Java CI build treats as an error and fails merge-gatekeeper. Marking these
value/service classes final removes the finalizer-attack vector SpotBugs
warns about while preserving the existing constructor validation.
After merging upstream/main, the repository version advanced to
1.5.1-SNAPSHOT while the VoyageAI module still pinned the old
1.4.4-RC3-SNAPSHOT parent, which made the semantickernel-bom import
unresolvable and broke the reactor build.
The VoyageAIModels request/response DTOs expose their mutable list and
array fields directly through getters, setters and one constructor, which
SpotBugs (bug-check profile) flags as EI_EXPOSE_REP/EI_EXPOSE_REP2. These
are plain Jackson-mapped data holders, so annotate the individual accessors
with @SuppressFBWarnings, matching the pattern already used by the other
aiservices DTOs (e.g. HuggingFace, OpenAI, Google).
@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

The CI-repair objective this round was aimed at is met, and commit hygiene is clean — but there are correctness and convention issues that should be fixed before merge.

What's solid

  • CT_CONSTRUCTOR_THROW fixed correctly.RerankResult and all four VoyageAI service classes plus VoyageAIClient are now final, so the throwing constructors are no longer finalizer-attack vectors. This is exactly the failure @karianna flagged on Adding VoyageAI integration microsoft/semantic-kernel-java#345.
  • EI_EXPOSE_REP / EI_EXPOSE_REP2 applied correctly.VoyageAIModels getters returning mutable List/float[]/nested DTOs carry @SuppressFBWarnings("EI_EXPOSE_REP"); setters and the MultimodalInput(List) ctor carry EI_EXPOSE_REP2; primitive/String accessors correctly omit it. Mirrors the HuggingFace/OpenAI DTO pattern — no over/under-application.
  • Wiring correct: parent bumped to 1.5.1-SNAPSHOT, module registered in root pom.xml, PACKAGES.md documented.
  • Commit hygiene clean: no Co-Authored-By, no "Generated with", no .claude/ files anywhere in the branch.
  • Solid unit coverage of the service layer (happy path, builder, validation, rerank descending-sort, contextualized insertion-order).

Should fix before merge

  1. [Medium] Blocking I/O on a Reactor thread.VoyageAIClient.sendRequestAsync wraps a synchronous newCall(...).execute() in Mono.fromCallable with no .subscribeOn(Schedulers.boundedElastic()). In a reactive library this blocks a non-blocking thread. Use OkHttp's async enqueue (Mono.create) or add subscribeOn(boundedElastic()).
  2. [Medium] New HTTP stack diverges from every other connector. Every existing connector (openai/google/huggingface) uses com.azure.core.http.HttpClient; this module pulls in com.squareup.okhttp3:okhttp with a hardcoded 4.12.0 — the other deps here are correctly unversioned via the parent BOM. Either align on azure-core, or at minimum centralize the OkHttp version in semantickernel-bom/parent dependencyManagement.
  3. [Medium] FAIL_ON_UNKNOWN_PROPERTIES not disabled globally. Only the wrapper DTOs carry @JsonIgnoreProperties(ignoreUnknown=true); leaf DTOs (EmbeddingDataItem, RerankDataItem, EmbeddingUsage, MultimodalContentItem) don't, so any new field VoyageAI returns will throw. Set it on the ObjectMapper instead of relying on unevenly-applied annotations.
  4. [Medium] VoyageAIClient has zero tests — the riskiest code (URL/auth header, non-2xx to AIException mapping, null/empty body, deserialization guards). OkHttp ships mockwebserver; a MockWebServer test here would be high value.
  5. [Low] rerankAsync throws synchronously for the null-query check instead of returning Mono.error(...), breaking reactive composition (the null-documents branch just below does it right).
  6. [Low] Inconsistent @JsonInclude(NON_NULL)EmbeddingRequest and RerankRequest lack it, so unset optionals serialize as explicit nulls ("top_k":null, etc.); other request DTOs have it.
  7. [Low] Possible NPE on response.getData().stream() if a 200 body deserializes with null data; and documents.get(item.getIndex()) trusts the API index is in range.
  8. [Low] Unused importorg.junit.jupiter.api.Disabled in VoyageAIIntegrationTest — likely a checkstyle failure in this project.

Items 1–4 are the ones I'd want addressed; the CI fixes themselves are correct and can stay as-is.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

CI-repair round — merge-gatekeeper status

Investigated the merge-gatekeeper red on upstream microsoft#345 (head 5139ecb). Findings:

Root cause is the fork-PR workflow-approval gate, not a code defect. All five upstream workflow runs on the head commit are stuck at action_required (never executed):

WorkflowState
Build Java Semantic Kernelcompleted/action_required
Spell Checkcompleted/action_required
Check .md linkscompleted/action_required
Run Java Integration Tests and Samplescompleted/action_required
Merge Gatekeepercompleted/action_required

Combined commit status is pending; PR is MERGEABLE but BLOCKED. merge-gatekeeper aggregates the other checks, and since none have been allowed to run, it can never report green. Clearing this requires a Microsoft maintainer to click Approve and run workflows on microsoft#345 (external-contributor gate). No push from this side changes it.

The actual build is verified green locally on the current head (5139ecb), so the checks will pass once approved:

  • ./mvnw -B -Pbug-check -DskipTests -Pcompile-jdk17 clean installsemantickernel-api + aiservices/voyageaiBUILD SUCCESS, SpotBugs clean (CT_CONSTRUCTOR_THROW + EI_EXPOSE_REP fixes hold).
  • ./mvnw -B -Pbug-check -Pcompile-jdk17 test -pl aiservices/voyageai33 run, 0 failures, 6 skipped (live-API integration tests skip without credentials).
  • typos -c .github/_typos.toml — clean (Spell Check).
  • Branch is 0 commits behind upstream/main; git diff --stat upstream/main...voyageai_integration is limited to the VoyageAI module, the two reranking API files, PACKAGES.md, and the root pom.xml entry — no unrelated files.

The only unrelated local build noise is semantickernel-data-oracle testcontainers failing because Docker is absent on this machine — that module is outside this diff and passes in CI where Docker is available.

No code change is warranted for this scoped round (merge-gatekeeper only). The separate review items (blocking I/O, OkHttp version, etc.) are out of scope here and left untouched.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

Thanks for this — it's a substantial, well-organized contribution. The diff is cleanly scoped (16 files vs the merge-base with upstream/main), the Javadoc is thorough, the builder patterns and constructor validation are consistent across the four services, and the tests (33) are meaningful. The SpotBugs CI-repair work is correct and well-reasoned: marking the value/service classes final for CT_CONSTRUCTOR_THROW, and annotating the DTO accessors with @SuppressFBWarnings to match the existing HuggingFace/OpenAI/Google pattern. The change is purely additive (no breaking changes) and the 1.5.1-SNAPSHOT version alignment is right.

Commit hygiene: clean. No Co-Authored-By, no "Generated with" trailers, no .claude/ files, correct authorship, and descriptive commit messages.

That said, a few items should be addressed before merge:

1. Module missing from semantickernel-bom (convention gap — should fix).
The module is added to the reactor in the root pom.xml, but unlike huggingface, openai, and google it is not registered in semantickernel-bom/pom.xml. Consumers importing the BOM won't get a managed version for semantickernel-aiservices-voyageai. Add the matching <dependency> entry (${project.version}) alongside the other aiservices modules (~line 96).

2. HTTP client diverges from project convention (design — please justify or align).
Every other aiservices module uses com.azure.core.http.HttpClient. This module introduces okhttp3 as a brand-new dependency to the whole repo, with a hardcoded 4.12.0 version not managed by the parent/BOM. That adds a new transitive-dependency surface and a version that won't track centrally. Prefer reusing azure-core's HttpClient (as HuggingFace does) — or, if okhttp is intentional, at minimum move the version into dependency management and flag the new dependency for the maintainers.

3. Blocking I/O on the subscriber thread (reactive correctness).
VoyageAIClient.sendRequestAsync wraps a blocking okhttp .execute() in Mono.fromCallable(...) with no .subscribeOn(Schedulers.boundedElastic()). This blocks whatever thread subscribes — a real problem in a fully reactive pipeline. By contrast, HuggingFaceClient uses azure-core's non-blocking HttpClient.send() returning a Mono. Either switch to a non-blocking client or offload with boundedElastic().

4. Reactive contract violation (minor).
VoyageAITextRerankingService.rerankAsync throws IllegalArgumentException synchronously for a null/empty query, whereas a method returning Mono should signal via Mono.error(...) (the empty-documents case already returns Mono.just(...)). Same eager-throw pattern is worth auditing across the services.

Minor / optional:

  • Unit tests mock VoyageAIClient, so the client's own serialize → HTTP → deserialize → error-handling path is only exercised by the live integration tests (skipped without credentials). A MockWebServer-based test would close that gap.
  • response.getData() is dereferenced (.size(), .stream()) without a null guard; a malformed response body would NPE rather than surface a clean AIException.

None of these are blockers in spirit — (1) and (3) are the ones I'd want resolved, and (2) is worth a conscious decision from the maintainers. Happy to re-review once addressed.

@karianna

Copy link
Copy Markdown

@johnoliver - Can you review this with a view to future direction of Microsoft Agent Framework. Happy to accept extra functionality in principle.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@fzowl@karianna@johnoliver@web-flow
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Adding VoyageAI integration - #1

Open
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration
Open

Adding VoyageAI integration#1
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration

Conversation

@fzowl

Copy link
Copy Markdown
Owner

What

Adds a VoyageAI integration module (aiservices/voyageai) providing text embedding, multimodal embedding, contextualized embedding, and reranking services, plus a small reranking abstraction (TextRerankingService, RerankResult) in semantickernel-api.

Why this round (CI repair)

The upstream PR (microsoft#345) was red on merge-gatekeeper, which was blocked by the Java CI build failing under the bug-check profile. Root causes and fixes:

  • SpotBugs CT_CONSTRUCTOR_THROW: RerankResult and the four VoyageAI service classes plus VoyageAIClient throw validation exceptions from non-final constructors (finalizer-attack vector). Marked these classes final (behavior unchanged; validation preserved). This was the failure that stopped the CI build at semantickernel-api.
  • SpotBugs EI_EXPOSE_REP / EI_EXPOSE_REP2: the VoyageAIModels Jackson DTO accessors expose mutable list/array fields. Annotated the individual getters/setters/constructor with @SuppressFBWarnings, matching the existing pattern in the HuggingFace/OpenAI/Google DTOs. (This surfaced only after the first fix let the build reach the VoyageAI module.)
  • Version alignment: merged current upstream/main (which advanced the repo to 1.5.1-SNAPSHOT); the VoyageAI module still pinned 1.4.4-RC3-SNAPSHOT, which made the semantickernel-bom import unresolvable. Bumped the module's parent version to match.

Validation

Full reactor build with the CI command ./mvnw -Pbug-check -DskipTests -Pcompile-jdk17 clean install passes the semantickernel-api and aiservices/voyageai modules (SpotBugs clean). The VoyageAI unit tests pass (33 run; 6 live-API integration tests skipped without credentials).

Diff scope vs upstream/main is limited to the VoyageAI module, the two new reranking API files, PACKAGES.md, and the root pom.xml module entry.

fzowland others added 30 commits November 17, 2025 10:54
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v5...v6)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-6
Bump actions/checkout from 5 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v5...v6)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-6
Bump actions/upload-artifact from 5 to 6
Bumps org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.3
Java: Bump org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.3 to 3.27.7.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](assertj/assertj@assertj-build-3.26.3...assertj-build-3.27.7)
---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
dependency-version: 3.27.7
dependency-type: direct:development
...
Signed-off-by: dependabot[bot] <support@github.com>
…les/semantickernel-demos/semantickernel-spring-starter/org.assertj-assertj-core-3.27.7
Java: Bump org.assertj:assertj-core from 3.26.3 to 3.27.7 in /samples/semantickernel-demos/semantickernel-spring-starter
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.18.0 to 2.18.6.
- [Commits](FasterXML/jackson-core@jackson-core-2.18.0...jackson-core-2.18.6)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.18.6
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [net.sourceforge.pmd:pmd-core](https://github.com/pmd/pmd) from 7.10.0 to 7.22.0.
- [Release notes](https://github.com/pmd/pmd/releases)
- [Commits](pmd/pmd@pmd_releases/7.10.0...pmd_releases/7.22.0)
---
updated-dependencies:
- dependency-name: net.sourceforge.pmd:pmd-core
dependency-version: 7.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v6...v7)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-7
Bump actions/upload-artifact from 6 to 7
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.18.6
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.18.0 to 2.18.6 in /semantickernel-bom
…sourceforge.pmd-pmd-core-7.22.0
Java: Bump net.sourceforge.pmd:pmd-core from 7.10.0 to 7.22.0
Bumps org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.4
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.4
Java: Bump org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4
Bumps [actions/github-script](https://github.com/actions/github-script) from 8 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](actions/github-script@v8...v9)
---
updated-dependencies:
- dependency-name: actions/github-script
dependency-version: '9'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/github-script-9
Bump actions/github-script from 8 to 9
Update testcontainers and fix testing
Remove unsused test
johnoliverand others added 26 commits April 22, 2026 21:14
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.11.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.11)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.11
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.11
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.11 in /data/semantickernel-data-postgres
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v6...v7)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-7
Bump actions/checkout from 6 to 7
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.21.2 to 2.22.0.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.0
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.21.2 to 2.22.0 in /semantickernel-bom
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.11 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.11...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.11 to 42.7.12 in /data/semantickernel-data-postgres
…/semantickernel-data-jdbc/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.12 in /data/semantickernel-data-jdbc
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.22.0 to 2.22.1.
- [Commits](FasterXML/jackson-core@jackson-core-2.22.0...jackson-core-2.22.1)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.22.0 to 2.22.1.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.22.0 to 2.22.1 in /semantickernel-bom
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.22.0 to 2.22.1 in /semantickernel-bom
Bumps [actions/stale](https://github.com/actions/stale) from 10 to 11.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](actions/stale@v10...v11)
---
updated-dependencies:
- dependency-name: actions/stale
dependency-version: '11'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/stale-11
Bump actions/stale from 10 to 11
…CONSTRUCTOR_THROW
SpotBugs (bug-check profile) flagged CT_CONSTRUCTOR_THROW on classes whose
constructors throw validation exceptions while being non-final, which the
Java CI build treats as an error and fails merge-gatekeeper. Marking these
value/service classes final removes the finalizer-attack vector SpotBugs
warns about while preserving the existing constructor validation.
After merging upstream/main, the repository version advanced to
1.5.1-SNAPSHOT while the VoyageAI module still pinned the old
1.4.4-RC3-SNAPSHOT parent, which made the semantickernel-bom import
unresolvable and broke the reactor build.
The VoyageAIModels request/response DTOs expose their mutable list and
array fields directly through getters, setters and one constructor, which
SpotBugs (bug-check profile) flags as EI_EXPOSE_REP/EI_EXPOSE_REP2. These
are plain Jackson-mapped data holders, so annotate the individual accessors
with @SuppressFBWarnings, matching the pattern already used by the other
aiservices DTOs (e.g. HuggingFace, OpenAI, Google).
@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

The CI-repair objective this round was aimed at is met, and commit hygiene is clean — but there are correctness and convention issues that should be fixed before merge.

What's solid

  • CT_CONSTRUCTOR_THROW fixed correctly.RerankResult and all four VoyageAI service classes plus VoyageAIClient are now final, so the throwing constructors are no longer finalizer-attack vectors. This is exactly the failure @karianna flagged on Adding VoyageAI integration microsoft/semantic-kernel-java#345.
  • EI_EXPOSE_REP / EI_EXPOSE_REP2 applied correctly.VoyageAIModels getters returning mutable List/float[]/nested DTOs carry @SuppressFBWarnings("EI_EXPOSE_REP"); setters and the MultimodalInput(List) ctor carry EI_EXPOSE_REP2; primitive/String accessors correctly omit it. Mirrors the HuggingFace/OpenAI DTO pattern — no over/under-application.
  • Wiring correct: parent bumped to 1.5.1-SNAPSHOT, module registered in root pom.xml, PACKAGES.md documented.
  • Commit hygiene clean: no Co-Authored-By, no "Generated with", no .claude/ files anywhere in the branch.
  • Solid unit coverage of the service layer (happy path, builder, validation, rerank descending-sort, contextualized insertion-order).

Should fix before merge

  1. [Medium] Blocking I/O on a Reactor thread.VoyageAIClient.sendRequestAsync wraps a synchronous newCall(...).execute() in Mono.fromCallable with no .subscribeOn(Schedulers.boundedElastic()). In a reactive library this blocks a non-blocking thread. Use OkHttp's async enqueue (Mono.create) or add subscribeOn(boundedElastic()).
  2. [Medium] New HTTP stack diverges from every other connector. Every existing connector (openai/google/huggingface) uses com.azure.core.http.HttpClient; this module pulls in com.squareup.okhttp3:okhttp with a hardcoded 4.12.0 — the other deps here are correctly unversioned via the parent BOM. Either align on azure-core, or at minimum centralize the OkHttp version in semantickernel-bom/parent dependencyManagement.
  3. [Medium] FAIL_ON_UNKNOWN_PROPERTIES not disabled globally. Only the wrapper DTOs carry @JsonIgnoreProperties(ignoreUnknown=true); leaf DTOs (EmbeddingDataItem, RerankDataItem, EmbeddingUsage, MultimodalContentItem) don't, so any new field VoyageAI returns will throw. Set it on the ObjectMapper instead of relying on unevenly-applied annotations.
  4. [Medium] VoyageAIClient has zero tests — the riskiest code (URL/auth header, non-2xx to AIException mapping, null/empty body, deserialization guards). OkHttp ships mockwebserver; a MockWebServer test here would be high value.
  5. [Low] rerankAsync throws synchronously for the null-query check instead of returning Mono.error(...), breaking reactive composition (the null-documents branch just below does it right).
  6. [Low] Inconsistent @JsonInclude(NON_NULL)EmbeddingRequest and RerankRequest lack it, so unset optionals serialize as explicit nulls ("top_k":null, etc.); other request DTOs have it.
  7. [Low] Possible NPE on response.getData().stream() if a 200 body deserializes with null data; and documents.get(item.getIndex()) trusts the API index is in range.
  8. [Low] Unused importorg.junit.jupiter.api.Disabled in VoyageAIIntegrationTest — likely a checkstyle failure in this project.

Items 1–4 are the ones I'd want addressed; the CI fixes themselves are correct and can stay as-is.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

CI-repair round — merge-gatekeeper status

Investigated the merge-gatekeeper red on upstream microsoft#345 (head 5139ecb). Findings:

Root cause is the fork-PR workflow-approval gate, not a code defect. All five upstream workflow runs on the head commit are stuck at action_required (never executed):

WorkflowState
Build Java Semantic Kernelcompleted/action_required
Spell Checkcompleted/action_required
Check .md linkscompleted/action_required
Run Java Integration Tests and Samplescompleted/action_required
Merge Gatekeepercompleted/action_required

Combined commit status is pending; PR is MERGEABLE but BLOCKED. merge-gatekeeper aggregates the other checks, and since none have been allowed to run, it can never report green. Clearing this requires a Microsoft maintainer to click Approve and run workflows on microsoft#345 (external-contributor gate). No push from this side changes it.

The actual build is verified green locally on the current head (5139ecb), so the checks will pass once approved:

  • ./mvnw -B -Pbug-check -DskipTests -Pcompile-jdk17 clean installsemantickernel-api + aiservices/voyageaiBUILD SUCCESS, SpotBugs clean (CT_CONSTRUCTOR_THROW + EI_EXPOSE_REP fixes hold).
  • ./mvnw -B -Pbug-check -Pcompile-jdk17 test -pl aiservices/voyageai33 run, 0 failures, 6 skipped (live-API integration tests skip without credentials).
  • typos -c .github/_typos.toml — clean (Spell Check).
  • Branch is 0 commits behind upstream/main; git diff --stat upstream/main...voyageai_integration is limited to the VoyageAI module, the two reranking API files, PACKAGES.md, and the root pom.xml entry — no unrelated files.

The only unrelated local build noise is semantickernel-data-oracle testcontainers failing because Docker is absent on this machine — that module is outside this diff and passes in CI where Docker is available.

No code change is warranted for this scoped round (merge-gatekeeper only). The separate review items (blocking I/O, OkHttp version, etc.) are out of scope here and left untouched.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

Thanks for this — it's a substantial, well-organized contribution. The diff is cleanly scoped (16 files vs the merge-base with upstream/main), the Javadoc is thorough, the builder patterns and constructor validation are consistent across the four services, and the tests (33) are meaningful. The SpotBugs CI-repair work is correct and well-reasoned: marking the value/service classes final for CT_CONSTRUCTOR_THROW, and annotating the DTO accessors with @SuppressFBWarnings to match the existing HuggingFace/OpenAI/Google pattern. The change is purely additive (no breaking changes) and the 1.5.1-SNAPSHOT version alignment is right.

Commit hygiene: clean. No Co-Authored-By, no "Generated with" trailers, no .claude/ files, correct authorship, and descriptive commit messages.

That said, a few items should be addressed before merge:

1. Module missing from semantickernel-bom (convention gap — should fix).
The module is added to the reactor in the root pom.xml, but unlike huggingface, openai, and google it is not registered in semantickernel-bom/pom.xml. Consumers importing the BOM won't get a managed version for semantickernel-aiservices-voyageai. Add the matching <dependency> entry (${project.version}) alongside the other aiservices modules (~line 96).

2. HTTP client diverges from project convention (design — please justify or align).
Every other aiservices module uses com.azure.core.http.HttpClient. This module introduces okhttp3 as a brand-new dependency to the whole repo, with a hardcoded 4.12.0 version not managed by the parent/BOM. That adds a new transitive-dependency surface and a version that won't track centrally. Prefer reusing azure-core's HttpClient (as HuggingFace does) — or, if okhttp is intentional, at minimum move the version into dependency management and flag the new dependency for the maintainers.

3. Blocking I/O on the subscriber thread (reactive correctness).
VoyageAIClient.sendRequestAsync wraps a blocking okhttp .execute() in Mono.fromCallable(...) with no .subscribeOn(Schedulers.boundedElastic()). This blocks whatever thread subscribes — a real problem in a fully reactive pipeline. By contrast, HuggingFaceClient uses azure-core's non-blocking HttpClient.send() returning a Mono. Either switch to a non-blocking client or offload with boundedElastic().

4. Reactive contract violation (minor).
VoyageAITextRerankingService.rerankAsync throws IllegalArgumentException synchronously for a null/empty query, whereas a method returning Mono should signal via Mono.error(...) (the empty-documents case already returns Mono.just(...)). Same eager-throw pattern is worth auditing across the services.

Minor / optional:

  • Unit tests mock VoyageAIClient, so the client's own serialize → HTTP → deserialize → error-handling path is only exercised by the live integration tests (skipped without credentials). A MockWebServer-based test would close that gap.
  • response.getData() is dereferenced (.size(), .stream()) without a null guard; a malformed response body would NPE rather than surface a clean AIException.

None of these are blockers in spirit — (1) and (3) are the ones I'd want resolved, and (2) is worth a conscious decision from the maintainers. Happy to re-review once addressed.

@karianna

Copy link
Copy Markdown

@johnoliver - Can you review this with a view to future direction of Microsoft Agent Framework. Happy to accept extra functionality in principle.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@fzowl@karianna@johnoliver@web-flow
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Adding VoyageAI integration - #1

Open
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration
Open

Adding VoyageAI integration#1
fzowl wants to merge 63 commits into
mainfrom
voyageai_integration

Conversation

@fzowl

Copy link
Copy Markdown
Owner

What

Adds a VoyageAI integration module (aiservices/voyageai) providing text embedding, multimodal embedding, contextualized embedding, and reranking services, plus a small reranking abstraction (TextRerankingService, RerankResult) in semantickernel-api.

Why this round (CI repair)

The upstream PR (microsoft#345) was red on merge-gatekeeper, which was blocked by the Java CI build failing under the bug-check profile. Root causes and fixes:

  • SpotBugs CT_CONSTRUCTOR_THROW: RerankResult and the four VoyageAI service classes plus VoyageAIClient throw validation exceptions from non-final constructors (finalizer-attack vector). Marked these classes final (behavior unchanged; validation preserved). This was the failure that stopped the CI build at semantickernel-api.
  • SpotBugs EI_EXPOSE_REP / EI_EXPOSE_REP2: the VoyageAIModels Jackson DTO accessors expose mutable list/array fields. Annotated the individual getters/setters/constructor with @SuppressFBWarnings, matching the existing pattern in the HuggingFace/OpenAI/Google DTOs. (This surfaced only after the first fix let the build reach the VoyageAI module.)
  • Version alignment: merged current upstream/main (which advanced the repo to 1.5.1-SNAPSHOT); the VoyageAI module still pinned 1.4.4-RC3-SNAPSHOT, which made the semantickernel-bom import unresolvable. Bumped the module's parent version to match.

Validation

Full reactor build with the CI command ./mvnw -Pbug-check -DskipTests -Pcompile-jdk17 clean install passes the semantickernel-api and aiservices/voyageai modules (SpotBugs clean). The VoyageAI unit tests pass (33 run; 6 live-API integration tests skipped without credentials).

Diff scope vs upstream/main is limited to the VoyageAI module, the two new reranking API files, PACKAGES.md, and the root pom.xml module entry.

fzowland others added 30 commits November 17, 2025 10:54
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v5...v6)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-6
Bump actions/checkout from 5 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v5...v6)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-6
Bump actions/upload-artifact from 5 to 6
Bumps org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.3
Java: Bump org.apache.logging.log4j:log4j-core from 2.24.1 to 2.25.3
Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.3 to 3.27.7.
- [Release notes](https://github.com/assertj/assertj/releases)
- [Commits](assertj/assertj@assertj-build-3.26.3...assertj-build-3.27.7)
---
updated-dependencies:
- dependency-name: org.assertj:assertj-core
dependency-version: 3.27.7
dependency-type: direct:development
...
Signed-off-by: dependabot[bot] <support@github.com>
…les/semantickernel-demos/semantickernel-spring-starter/org.assertj-assertj-core-3.27.7
Java: Bump org.assertj:assertj-core from 3.26.3 to 3.27.7 in /samples/semantickernel-demos/semantickernel-spring-starter
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.18.0 to 2.18.6.
- [Commits](FasterXML/jackson-core@jackson-core-2.18.0...jackson-core-2.18.6)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.18.6
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [net.sourceforge.pmd:pmd-core](https://github.com/pmd/pmd) from 7.10.0 to 7.22.0.
- [Release notes](https://github.com/pmd/pmd/releases)
- [Commits](pmd/pmd@pmd_releases/7.10.0...pmd_releases/7.22.0)
---
updated-dependencies:
- dependency-name: net.sourceforge.pmd:pmd-core
dependency-version: 7.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v6...v7)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/upload-artifact-7
Bump actions/upload-artifact from 6 to 7
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.18.6
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.18.0 to 2.18.6 in /semantickernel-bom
…sourceforge.pmd-pmd-core-7.22.0
Java: Bump net.sourceforge.pmd:pmd-core from 7.10.0 to 7.22.0
Bumps org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4.
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-version: 2.25.4
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…apache.logging.log4j-log4j-core-2.25.4
Java: Bump org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4
Bumps [actions/github-script](https://github.com/actions/github-script) from 8 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](actions/github-script@v8...v9)
---
updated-dependencies:
- dependency-name: actions/github-script
dependency-version: '9'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/github-script-9
Bump actions/github-script from 8 to 9
Update testcontainers and fix testing
Remove unsused test
johnoliverand others added 26 commits April 22, 2026 21:14
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.11.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.11)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.11
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.11
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.11 in /data/semantickernel-data-postgres
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v6...v7)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/checkout-7
Bump actions/checkout from 6 to 7
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.21.2 to 2.22.0.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.0
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.21.2 to 2.22.0 in /semantickernel-bom
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.10...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.11 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](pgjdbc/pgjdbc@REL42.7.11...REL42.7.12)
---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
dependency-version: 42.7.12
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…/semantickernel-data-postgres/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.11 to 42.7.12 in /data/semantickernel-data-postgres
…/semantickernel-data-jdbc/org.postgresql-postgresql-42.7.12
Java: Bump org.postgresql:postgresql from 42.7.10 to 42.7.12 in /data/semantickernel-data-jdbc
Bumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.22.0 to 2.22.1.
- [Commits](FasterXML/jackson-core@jackson-core-2.22.0...jackson-core-2.22.1)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-core
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.22.0 to 2.22.1.
- [Commits](https://github.com/FasterXML/jackson/commits)
---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
dependency-version: 2.22.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
…ntickernel-bom/com.fasterxml.jackson.core-jackson-core-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-core from 2.22.0 to 2.22.1 in /semantickernel-bom
…ntickernel-bom/com.fasterxml.jackson.core-jackson-databind-2.22.1
Java: Bump com.fasterxml.jackson.core:jackson-databind from 2.22.0 to 2.22.1 in /semantickernel-bom
Bumps [actions/stale](https://github.com/actions/stale) from 10 to 11.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](actions/stale@v10...v11)
---
updated-dependencies:
- dependency-name: actions/stale
dependency-version: '11'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
…ions/actions/stale-11
Bump actions/stale from 10 to 11
…CONSTRUCTOR_THROW
SpotBugs (bug-check profile) flagged CT_CONSTRUCTOR_THROW on classes whose
constructors throw validation exceptions while being non-final, which the
Java CI build treats as an error and fails merge-gatekeeper. Marking these
value/service classes final removes the finalizer-attack vector SpotBugs
warns about while preserving the existing constructor validation.
After merging upstream/main, the repository version advanced to
1.5.1-SNAPSHOT while the VoyageAI module still pinned the old
1.4.4-RC3-SNAPSHOT parent, which made the semantickernel-bom import
unresolvable and broke the reactor build.
The VoyageAIModels request/response DTOs expose their mutable list and
array fields directly through getters, setters and one constructor, which
SpotBugs (bug-check profile) flags as EI_EXPOSE_REP/EI_EXPOSE_REP2. These
are plain Jackson-mapped data holders, so annotate the individual accessors
with @SuppressFBWarnings, matching the pattern already used by the other
aiservices DTOs (e.g. HuggingFace, OpenAI, Google).
@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

The CI-repair objective this round was aimed at is met, and commit hygiene is clean — but there are correctness and convention issues that should be fixed before merge.

What's solid

  • CT_CONSTRUCTOR_THROW fixed correctly.RerankResult and all four VoyageAI service classes plus VoyageAIClient are now final, so the throwing constructors are no longer finalizer-attack vectors. This is exactly the failure @karianna flagged on Adding VoyageAI integration microsoft/semantic-kernel-java#345.
  • EI_EXPOSE_REP / EI_EXPOSE_REP2 applied correctly.VoyageAIModels getters returning mutable List/float[]/nested DTOs carry @SuppressFBWarnings("EI_EXPOSE_REP"); setters and the MultimodalInput(List) ctor carry EI_EXPOSE_REP2; primitive/String accessors correctly omit it. Mirrors the HuggingFace/OpenAI DTO pattern — no over/under-application.
  • Wiring correct: parent bumped to 1.5.1-SNAPSHOT, module registered in root pom.xml, PACKAGES.md documented.
  • Commit hygiene clean: no Co-Authored-By, no "Generated with", no .claude/ files anywhere in the branch.
  • Solid unit coverage of the service layer (happy path, builder, validation, rerank descending-sort, contextualized insertion-order).

Should fix before merge

  1. [Medium] Blocking I/O on a Reactor thread.VoyageAIClient.sendRequestAsync wraps a synchronous newCall(...).execute() in Mono.fromCallable with no .subscribeOn(Schedulers.boundedElastic()). In a reactive library this blocks a non-blocking thread. Use OkHttp's async enqueue (Mono.create) or add subscribeOn(boundedElastic()).
  2. [Medium] New HTTP stack diverges from every other connector. Every existing connector (openai/google/huggingface) uses com.azure.core.http.HttpClient; this module pulls in com.squareup.okhttp3:okhttp with a hardcoded 4.12.0 — the other deps here are correctly unversioned via the parent BOM. Either align on azure-core, or at minimum centralize the OkHttp version in semantickernel-bom/parent dependencyManagement.
  3. [Medium] FAIL_ON_UNKNOWN_PROPERTIES not disabled globally. Only the wrapper DTOs carry @JsonIgnoreProperties(ignoreUnknown=true); leaf DTOs (EmbeddingDataItem, RerankDataItem, EmbeddingUsage, MultimodalContentItem) don't, so any new field VoyageAI returns will throw. Set it on the ObjectMapper instead of relying on unevenly-applied annotations.
  4. [Medium] VoyageAIClient has zero tests — the riskiest code (URL/auth header, non-2xx to AIException mapping, null/empty body, deserialization guards). OkHttp ships mockwebserver; a MockWebServer test here would be high value.
  5. [Low] rerankAsync throws synchronously for the null-query check instead of returning Mono.error(...), breaking reactive composition (the null-documents branch just below does it right).
  6. [Low] Inconsistent @JsonInclude(NON_NULL)EmbeddingRequest and RerankRequest lack it, so unset optionals serialize as explicit nulls ("top_k":null, etc.); other request DTOs have it.
  7. [Low] Possible NPE on response.getData().stream() if a 200 body deserializes with null data; and documents.get(item.getIndex()) trusts the API index is in range.
  8. [Low] Unused importorg.junit.jupiter.api.Disabled in VoyageAIIntegrationTest — likely a checkstyle failure in this project.

Items 1–4 are the ones I'd want addressed; the CI fixes themselves are correct and can stay as-is.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

CI-repair round — merge-gatekeeper status

Investigated the merge-gatekeeper red on upstream microsoft#345 (head 5139ecb). Findings:

Root cause is the fork-PR workflow-approval gate, not a code defect. All five upstream workflow runs on the head commit are stuck at action_required (never executed):

WorkflowState
Build Java Semantic Kernelcompleted/action_required
Spell Checkcompleted/action_required
Check .md linkscompleted/action_required
Run Java Integration Tests and Samplescompleted/action_required
Merge Gatekeepercompleted/action_required

Combined commit status is pending; PR is MERGEABLE but BLOCKED. merge-gatekeeper aggregates the other checks, and since none have been allowed to run, it can never report green. Clearing this requires a Microsoft maintainer to click Approve and run workflows on microsoft#345 (external-contributor gate). No push from this side changes it.

The actual build is verified green locally on the current head (5139ecb), so the checks will pass once approved:

  • ./mvnw -B -Pbug-check -DskipTests -Pcompile-jdk17 clean installsemantickernel-api + aiservices/voyageaiBUILD SUCCESS, SpotBugs clean (CT_CONSTRUCTOR_THROW + EI_EXPOSE_REP fixes hold).
  • ./mvnw -B -Pbug-check -Pcompile-jdk17 test -pl aiservices/voyageai33 run, 0 failures, 6 skipped (live-API integration tests skip without credentials).
  • typos -c .github/_typos.toml — clean (Spell Check).
  • Branch is 0 commits behind upstream/main; git diff --stat upstream/main...voyageai_integration is limited to the VoyageAI module, the two reranking API files, PACKAGES.md, and the root pom.xml entry — no unrelated files.

The only unrelated local build noise is semantickernel-data-oracle testcontainers failing because Docker is absent on this machine — that module is outside this diff and passes in CI where Docker is available.

No code change is warranted for this scoped round (merge-gatekeeper only). The separate review items (blocking I/O, OkHttp version, etc.) are out of scope here and left untouched.

@fzowl

Copy link
Copy Markdown
OwnerAuthor

VERDICT:CHANGES_NEEDED

Thanks for this — it's a substantial, well-organized contribution. The diff is cleanly scoped (16 files vs the merge-base with upstream/main), the Javadoc is thorough, the builder patterns and constructor validation are consistent across the four services, and the tests (33) are meaningful. The SpotBugs CI-repair work is correct and well-reasoned: marking the value/service classes final for CT_CONSTRUCTOR_THROW, and annotating the DTO accessors with @SuppressFBWarnings to match the existing HuggingFace/OpenAI/Google pattern. The change is purely additive (no breaking changes) and the 1.5.1-SNAPSHOT version alignment is right.

Commit hygiene: clean. No Co-Authored-By, no "Generated with" trailers, no .claude/ files, correct authorship, and descriptive commit messages.

That said, a few items should be addressed before merge:

1. Module missing from semantickernel-bom (convention gap — should fix).
The module is added to the reactor in the root pom.xml, but unlike huggingface, openai, and google it is not registered in semantickernel-bom/pom.xml. Consumers importing the BOM won't get a managed version for semantickernel-aiservices-voyageai. Add the matching <dependency> entry (${project.version}) alongside the other aiservices modules (~line 96).

2. HTTP client diverges from project convention (design — please justify or align).
Every other aiservices module uses com.azure.core.http.HttpClient. This module introduces okhttp3 as a brand-new dependency to the whole repo, with a hardcoded 4.12.0 version not managed by the parent/BOM. That adds a new transitive-dependency surface and a version that won't track centrally. Prefer reusing azure-core's HttpClient (as HuggingFace does) — or, if okhttp is intentional, at minimum move the version into dependency management and flag the new dependency for the maintainers.

3. Blocking I/O on the subscriber thread (reactive correctness).
VoyageAIClient.sendRequestAsync wraps a blocking okhttp .execute() in Mono.fromCallable(...) with no .subscribeOn(Schedulers.boundedElastic()). This blocks whatever thread subscribes — a real problem in a fully reactive pipeline. By contrast, HuggingFaceClient uses azure-core's non-blocking HttpClient.send() returning a Mono. Either switch to a non-blocking client or offload with boundedElastic().

4. Reactive contract violation (minor).
VoyageAITextRerankingService.rerankAsync throws IllegalArgumentException synchronously for a null/empty query, whereas a method returning Mono should signal via Mono.error(...) (the empty-documents case already returns Mono.just(...)). Same eager-throw pattern is worth auditing across the services.

Minor / optional:

  • Unit tests mock VoyageAIClient, so the client's own serialize → HTTP → deserialize → error-handling path is only exercised by the live integration tests (skipped without credentials). A MockWebServer-based test would close that gap.
  • response.getData() is dereferenced (.size(), .stream()) without a null guard; a malformed response body would NPE rather than surface a clean AIException.

None of these are blockers in spirit — (1) and (3) are the ones I'd want resolved, and (2) is worth a conscious decision from the maintainers. Happy to re-review once addressed.

@karianna

Copy link
Copy Markdown

@johnoliver - Can you review this with a view to future direction of Microsoft Agent Framework. Happy to accept extra functionality in principle.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@fzowl@karianna@johnoliver@web-flow