Feature/combine agentspan#123
Open
kowser-orkes wants to merge 3 commits into
Open
Conversation
Four new Gradle modules carrying the agent SDK from agentspan-ai/agentspan sdk/java @ f8704fa3: - conductor-ai core SDK (107 main + 29 test files) - conductor-ai-spring Boot 3 auto-configuration (3 main + 2 test) - conductor-ai-e2e 26 e2e suites, all tasks gated behind -Pe2e - conductor-ai-examples 158 runnable examples (-PmainClass runner) Sources are copied verbatim; the only churn is a mechanical spotlessApply conforming them to the repo conventions (Apache header, Conductor import order). Build files clone the shapes of conductor-client-metrics, conductor-client-spring, tests, and harness respectively; conductor-ai[-spring] publish via publish-config as org.conductoross:conductor-ai[-spring]. Upstream docs land under docs/agents/ (content pass to follow). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Modeled on the python-sdk agent-e2e action. Downloads the pinned agentspan-server-0.4.0.jar release asset (cached), boots it on :8080 with the LLM repo secrets in the server env only, starts mcp-testkit, then runs ./gradlew :conductor-ai-e2e:test -Pe2e. A guard parses the JUnit XML and fails on zero executed tests, because BaseTest assumeTrue-skips every suite when the server is unreachable — without it a boot failure would green-wash the job. Fork PRs (no secrets) fail at the guard by design. Needs OPENAI_API_KEY and ANTHROPIC_API_KEY repo secrets before it can go green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- docs/agents/: dependency snippets now point at org.conductoross:conductor-ai[-spring]:5.1.0 (was org.conductoross.conductor:conductor-agent-sdk[-spring]:0.1.0); license note switched to Apache 2.0 (repo LICENSE); one source path updated to conductor-ai/src. Java package references are unchanged (the package itself did not move). - Root README: Durable AI Agents blurb in the AI & LLM Workflows section and an AI Agents row in the Documentation table. - CHANGELOG: Unreleased entry for the merge, coordinate supersession note, and the new agent-e2e workflow. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Comment on lines
+23
to
+121
| runs-on: ubuntu-latest | ||
| timeout-minutes: 45 | ||
| env: | ||
| OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | ||
| ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} | ||
| AGENTSPAN_SERVER_URL: http://localhost:8080/api | ||
| steps: | ||
| - name: Checkout code | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Set up Java | ||
| uses: actions/setup-java@v4 | ||
| with: | ||
| distribution: temurin | ||
| java-version: '21' | ||
|
|
||
| # Python is only needed for mcp-testkit and the XML guard. | ||
| # No `cache: pip` — it hard-fails without a requirements file. | ||
| - name: Set up Python | ||
| uses: actions/setup-python@v5 | ||
| with: | ||
| python-version: '3.12' | ||
|
|
||
| - name: Cache server JAR | ||
| id: jar_cache | ||
| uses: actions/cache@v4 | ||
| with: | ||
| path: agentspan-server.jar | ||
| key: agentspan-server-${{ env.AGENTSPAN_VERSION }} | ||
|
|
||
| - name: Download server JAR from release | ||
| if: steps.jar_cache.outputs.cache-hit != 'true' | ||
| env: | ||
| GH_TOKEN: ${{ github.token }} | ||
| run: | | ||
| gh release download "v${AGENTSPAN_VERSION}" --repo agentspan-ai/agentspan \ | ||
| --pattern "agentspan-server-${AGENTSPAN_VERSION}.jar" --output agentspan-server.jar | ||
|
|
||
| - name: Install mcp-testkit | ||
| run: | | ||
| python -m pip install --upgrade pip | ||
| pip install mcp-testkit | ||
|
|
||
| - name: Start mcp-testkit | ||
| run: | | ||
| mcp-testkit --transport http --port 3001 & | ||
| sleep 2 | ||
|
|
||
| - name: Start server | ||
| run: | | ||
| java -jar agentspan-server.jar --server.port=8080 > server.log 2>&1 & | ||
|
|
||
| - name: Wait for server health | ||
| run: | | ||
| for i in $(seq 1 45); do | ||
| if curl -sf http://localhost:8080/health | grep -q '"healthy"[[:space:]]*:[[:space:]]*true'; then | ||
| echo "server healthy after ~$((i*2))s"; exit 0 | ||
| fi | ||
| sleep 2 | ||
| done | ||
| echo "::error::server failed to become healthy within 90s" | ||
| tail -100 server.log | ||
| exit 1 | ||
|
|
||
| - name: Run e2e suites | ||
| run: ./gradlew :conductor-ai-e2e:test -Pe2e | ||
|
|
||
| # BaseTest assumeTrue-skips every suite when the server is unreachable — | ||
| # without this guard a boot failure after the health gate (or a future | ||
| # gate regression) would yield a green job that ran nothing. | ||
| - name: Guard against silently-empty runs | ||
| if: always() | ||
| run: | | ||
| python - <<'EOF' | ||
| import glob | ||
| import sys | ||
| import xml.etree.ElementTree as ET | ||
|
|
||
| total = executed = 0 | ||
| for path in glob.glob("conductor-ai-e2e/build/test-results/test/TEST-*.xml"): | ||
| root = ET.parse(path).getroot() | ||
| t = int(root.get("tests", 0)) | ||
| sk = int(root.get("skipped", 0)) | ||
| total += t | ||
| executed += t - sk | ||
| print(f"executed {executed}/{total} tests") | ||
| sys.exit(0 if executed > 0 else 1) | ||
| EOF | ||
|
|
||
| - name: Upload results | ||
| if: always() | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: agent-e2e-results | ||
| path: | | ||
| conductor-ai-e2e/build/test-results/test/ | ||
| conductor-ai-e2e/build/reports/tests/test/ | ||
| server.log | ||
| retention-days: 14 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pull Request type
NOTE: Please remember to run
./gradlew spotlessApplyto fix any format violations.Changes in this PR
Describe the new behavior from this PR, and why it's needed
Issue #
Alternatives considered
Describe alternative implementation you have considered