Skip to content

Commit 2f83692

Browse files
Merge branch 'ag-ui-protocol:main' into issue-35-strands-integration
2 parents bd3183f + 29f52c1 commit 2f83692

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+3784
-734
lines changed

.github/CODEOWNERS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@ docs/sdk/go @mattsp1290
1111

1212
sdks/community/dart @mattsp1290
1313
docs/sdk/dart @mattsp1290
14+
15+
integrations/adk-middleware @contextablemark
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
name: Publish Kotlin SDK to Maven Central
2+
3+
on:
4+
# Manual trigger only - no automatic publishing
5+
workflow_dispatch:
6+
inputs:
7+
dry_run:
8+
description: 'Run in dry-run mode (test without uploading)'
9+
required: false
10+
type: boolean
11+
default: false
12+
13+
jobs:
14+
publish:
15+
runs-on: ubuntu-latest
16+
17+
permissions:
18+
contents: read
19+
20+
steps:
21+
- name: Checkout code
22+
uses: actions/checkout@v4
23+
24+
- name: Set up JDK 21
25+
uses: actions/setup-java@v4
26+
with:
27+
java-version: "21"
28+
distribution: "temurin"
29+
30+
- name: Setup Gradle
31+
uses: gradle/gradle-build-action@v3
32+
33+
- name: Install Android SDK
34+
uses: android-actions/setup-android@v3
35+
36+
- name: Install Android SDK 36 components
37+
run: |
38+
echo "Installing Android SDK 36 components..."
39+
sdkmanager --install "platforms;android-36"
40+
sdkmanager --install "build-tools;36.0.0"
41+
42+
- name: Accept Android licenses
43+
run: yes | sdkmanager --licenses || true
44+
45+
- name: Verify Android SDK installation
46+
run: |
47+
echo "Checking Android SDK installation..."
48+
sdkmanager --list_installed | grep -E "(platforms;android-36|build-tools;36)"
49+
50+
- name: Run tests
51+
working-directory: sdks/community/kotlin/library
52+
run: ./gradlew allTests --no-daemon --stacktrace
53+
54+
- name: Parse test results
55+
if: always()
56+
working-directory: sdks/community/kotlin/library
57+
run: |
58+
echo "## Kotlin SDK Test Results Summary"
59+
echo ""
60+
61+
total_tests=0
62+
total_failures=0
63+
total_errors=0
64+
65+
for module in core client tools; do
66+
xml_dir="$module/build/test-results/jvmTest"
67+
68+
if [ -d "$xml_dir" ]; then
69+
# Sum up test counts from all XML files in the directory
70+
module_tests=$(find "$xml_dir" -name "*.xml" -exec grep -h '<testsuite' {} \; | grep -o 'tests="[0-9]*"' | sed 's/tests="\([0-9]*\)"/\1/' | awk '{sum += $1} END {print sum}')
71+
module_failures=$(find "$xml_dir" -name "*.xml" -exec grep -h '<testsuite' {} \; | grep -o 'failures="[0-9]*"' | sed 's/failures="\([0-9]*\)"/\1/' | awk '{sum += $1} END {print sum}')
72+
module_errors=$(find "$xml_dir" -name "*.xml" -exec grep -h '<testsuite' {} \; | grep -o 'errors="[0-9]*"' | sed 's/errors="\([0-9]*\)"/\1/' | awk '{sum += $1} END {print sum}')
73+
74+
# Default to 0 if empty
75+
module_tests=${module_tests:-0}
76+
module_failures=${module_failures:-0}
77+
module_errors=${module_errors:-0}
78+
79+
if [ "$module_tests" -gt 0 ]; then
80+
echo "✅ kotlin-$module: $module_tests tests, $module_failures failures, $module_errors errors"
81+
total_tests=$((total_tests + module_tests))
82+
total_failures=$((total_failures + module_failures))
83+
total_errors=$((total_errors + module_errors))
84+
fi
85+
fi
86+
done
87+
88+
echo ""
89+
echo "---"
90+
echo "### Overall Results: $total_tests tests, $total_failures failures, $total_errors errors"
91+
92+
if [ $total_failures -gt 0 ] || [ $total_errors -gt 0 ]; then
93+
echo "❌ Some tests failed - aborting publish"
94+
exit 1
95+
elif [ $total_tests -eq 0 ]; then
96+
echo "⚠️ No tests were found or executed - aborting publish"
97+
exit 1
98+
else
99+
echo "✅ All $total_tests tests passed!"
100+
fi
101+
102+
- name: Publish to Maven Central (dry-run)
103+
if: inputs.dry_run == true
104+
working-directory: sdks/community/kotlin
105+
env:
106+
JRELEASER_MAVENCENTRAL_SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
107+
JRELEASER_MAVENCENTRAL_SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
108+
JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
109+
JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }}
110+
JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
111+
run: |
112+
echo "🔍 Running publish script in dry-run mode..."
113+
./publish.sh --dry-run
114+
115+
- name: Publish to Maven Central
116+
if: inputs.dry_run == false
117+
working-directory: sdks/community/kotlin
118+
env:
119+
JRELEASER_MAVENCENTRAL_SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
120+
JRELEASER_MAVENCENTRAL_SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
121+
JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
122+
JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }}
123+
JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
124+
run: |
125+
echo "🚀 Publishing to Maven Central..."
126+
./publish.sh
127+
128+
- name: Upload JReleaser logs
129+
if: always()
130+
uses: actions/upload-artifact@v4
131+
with:
132+
name: jreleaser-logs
133+
path: sdks/community/kotlin/library/build/jreleaser/
134+
retention-days: 7
135+
136+
- name: Summary
137+
if: success() && inputs.dry_run == false
138+
working-directory: sdks/community/kotlin/library
139+
run: |
140+
# Extract version from build.gradle.kts
141+
VERSION=$(grep "^version = " build.gradle.kts | sed 's/version = "\(.*\)"/\1/')
142+
143+
echo "## ✅ Publishing Complete!" >> $GITHUB_STEP_SUMMARY
144+
echo "" >> $GITHUB_STEP_SUMMARY
145+
echo "The Kotlin SDK has been published to Maven Central." >> $GITHUB_STEP_SUMMARY
146+
echo "" >> $GITHUB_STEP_SUMMARY
147+
echo "### Published Artifacts" >> $GITHUB_STEP_SUMMARY
148+
echo "- \`com.ag-ui.community:kotlin-core:${VERSION}\` (JVM, Android, iOS)" >> $GITHUB_STEP_SUMMARY
149+
echo "- \`com.ag-ui.community:kotlin-client:${VERSION}\` (JVM, Android, iOS)" >> $GITHUB_STEP_SUMMARY
150+
echo "- \`com.ag-ui.community:kotlin-tools:${VERSION}\` (JVM, Android, iOS)" >> $GITHUB_STEP_SUMMARY
151+
echo "" >> $GITHUB_STEP_SUMMARY
152+
echo "**Note:** All platforms published including iOS artifacts in .klib format." >> $GITHUB_STEP_SUMMARY
153+
echo "" >> $GITHUB_STEP_SUMMARY
154+
echo "### Next Steps" >> $GITHUB_STEP_SUMMARY
155+
echo "1. Check deployment status: https://central.sonatype.com/publishing" >> $GITHUB_STEP_SUMMARY
156+
echo "2. Artifacts will be validated automatically" >> $GITHUB_STEP_SUMMARY
157+
echo "3. Publishing completes in ~10-30 minutes" >> $GITHUB_STEP_SUMMARY
158+
159+
- name: Dry-run Summary
160+
if: success() && inputs.dry_run == true
161+
run: |
162+
echo "## ✅ Dry-run Complete!" >> $GITHUB_STEP_SUMMARY
163+
echo "" >> $GITHUB_STEP_SUMMARY
164+
echo "The dry-run completed successfully. No artifacts were uploaded." >> $GITHUB_STEP_SUMMARY
165+
echo "" >> $GITHUB_STEP_SUMMARY
166+
echo "Run without the dry-run flag to publish to Maven Central." >> $GITHUB_STEP_SUMMARY

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,9 @@ AG-UI is complementary to the other 2 top agentic protocols
7979

8080
## 🛠 Supported Integrations
8181

82-
AG-UI was born from CopilotKit's initial partnership with LangGraph and CrewAI - and brings the incredibly popular agent-user-interactivity infrastructure to the wider agentic ecosystem.
82+
AG-UI was born from CopilotKit's initial **partnership** with LangGraph and CrewAI - and brings the incredibly popular agent-user-interactivity infrastructure to the wider agentic ecosystem.
83+
84+
**1st party** = the platforms that have AG‑UI built in and provide documentation for guidance.
8385

8486
## Frameworks
8587

@@ -91,13 +93,13 @@ AG-UI was born from CopilotKit's initial partnership with LangGraph and CrewAI -
9193
| Framework | Status | AG-UI Resources |
9294
| ---------- | ------- | ---------------- |
9395
| [LangGraph](https://www.langchain.com/langgraph) | ✅ Supported | ➡️ [Docs](https://docs.copilotkit.ai/langgraph/) 🎮 [Demos](https://dojo.ag-ui.com/langgraph-fastapi/feature/shared_state) |
94-
| [Google ADK](https://google.github.io/adk-docs/get-started/) | ✅ Supported | ➡️ [Docs](https://docs.copilotkit.ai/adk) 🎮 [Demos](https://dojo.ag-ui.com/adk-middleware/feature/shared_state?openCopilot=true) |
9596
| [CrewAI](https://crewai.com/) | ✅ Supported | ➡️ [Docs](https://docs.copilotkit.ai/crewai-flows) 🎮 [Demos](https://dojo.ag-ui.com/crewai/feature/shared_state) |
9697

9798
#### 🧩 1st Party
9899
| Framework | Status | AG-UI Resources |
99100
| ---------- | ------- | ---------------- |
100101
| [Microsoft Agent Framework](https://azure.microsoft.com/en-us/blog/introducing-microsoft-agent-framework/) | ✅ Supported | ➡️ [Docs](https://docs.copilotkit.ai/microsoft-agent-framework) 🎮 [Demos](https://dojo.ag-ui.com/microsoft-agent-framework-dotnet/feature/shared_state) |
102+
| [Google ADK](https://google.github.io/adk-docs/get-started/) | ✅ Supported | ➡️ [Docs](https://docs.copilotkit.ai/adk) 🎮 [Demos](https://dojo.ag-ui.com/adk-middleware/feature/shared_state?openCopilot=true) |
101103
| [Mastra](https://mastra.ai/) | ✅ Supported | ➡️ [Docs](https://docs.copilotkit.ai/mastra/) 🎮 [Demos](https://dojo.ag-ui.com/mastra/feature/tool_based_generative_ui) |
102104
| [Pydantic AI](https://github.com/pydantic/pydantic-ai) | ✅ Supported | ➡️ [Docs](https://docs.copilotkit.ai/pydantic-ai/) 🎮 [Demos](https://dojo.ag-ui.com/pydantic-ai/feature/shared_state) |
103105
| [Agno](https://github.com/agno-agi/agno) | ✅ Supported | ➡️ [Docs](https://docs.copilotkit.ai/agno/) 🎮 [Demos](https://dojo.ag-ui.com/agno/feature/tool_based_generative_ui) |

apps/dojo/scripts/prep-dojo-everything.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,16 @@ const ALL_TARGETS = {
112112
name: "Dojo",
113113
cwd: gitRoot,
114114
},
115+
"microsoft-agent-framework-python": {
116+
command: "uv sync",
117+
name: "Microsoft Agent Framework (Python)",
118+
cwd: path.join(integrationsRoot, "microsoft-agent-framework/python/examples"),
119+
},
120+
"microsoft-agent-framework-dotnet": {
121+
command: "dotnet restore AGUIDojoServer/AGUIDojoServer.csproj",
122+
name: "Microsoft Agent Framework (.NET)",
123+
cwd: path.join(integrationsRoot, "microsoft-agent-framework/dotnet/examples"),
124+
},
115125
};
116126

117127
function printDryRunServices(procs) {

apps/dojo/scripts/run-dojo-everything.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,18 @@ const ALL_SERVICES = {
141141
cwd: path.join(middlewaresRoot, "a2a-middleware/examples"),
142142
env: { PORT: 8014 },
143143
}],
144+
'microsoft-agent-framework-python': [{
145+
command: 'uv run dev',
146+
name: 'Microsoft Agent Framework (Python)',
147+
cwd: path.join(integrationsRoot, 'microsoft-agent-framework/python/examples'),
148+
env: { PORT: 8015 },
149+
}],
150+
'microsoft-agent-framework-dotnet': [{
151+
command: 'dotnet run --project AGUIDojoServer/AGUIDojoServer.csproj --urls "http://localhost:8889" --no-build',
152+
name: 'Microsoft Agent Framework (.NET)',
153+
cwd: path.join(integrationsRoot, 'microsoft-agent-framework/dotnet/examples'),
154+
env: { PORT: 8016 },
155+
}],
144156
'dojo': [{
145157
command: 'pnpm run start',
146158
name: 'Dojo',

apps/dojo/src/agents.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,34 @@ export const agentsIntegrations: AgentIntegrationConfig[] = [
346346
};
347347
},
348348
},
349+
{
350+
id: "microsoft-agent-framework-python",
351+
agents: async () => {
352+
return {
353+
agentic_chat: new HttpAgent({
354+
url: `${envVars.agentFrameworkPythonUrl}/agentic_chat`,
355+
}),
356+
backend_tool_rendering: new HttpAgent({
357+
url: `${envVars.agentFrameworkPythonUrl}/backend_tool_rendering`,
358+
}),
359+
human_in_the_loop: new HttpAgent({
360+
url: `${envVars.agentFrameworkPythonUrl}/human_in_the_loop`,
361+
}),
362+
agentic_generative_ui: new HttpAgent({
363+
url: `${envVars.agentFrameworkPythonUrl}/agentic_generative_ui`,
364+
}),
365+
shared_state: new HttpAgent({
366+
url: `${envVars.agentFrameworkPythonUrl}/shared_state`,
367+
}),
368+
tool_based_generative_ui: new HttpAgent({
369+
url: `${envVars.agentFrameworkPythonUrl}/tool_based_generative_ui`,
370+
}),
371+
predictive_state_updates: new HttpAgent({
372+
url: `${envVars.agentFrameworkPythonUrl}/predictive_state_updates`,
373+
}),
374+
};
375+
},
376+
},
349377
{
350378
id: "a2a-basic",
351379
agents: async () => {
@@ -381,6 +409,9 @@ export const agentsIntegrations: AgentIntegrationConfig[] = [
381409
tool_based_generative_ui: new HttpAgent({
382410
url: `${envVars.agentFrameworkDotnetUrl}/tool_based_generative_ui`,
383411
}),
412+
predictive_state_updates: new HttpAgent({
413+
url: `${envVars.agentFrameworkDotnetUrl}/predictive_state_updates`,
414+
}),
384415
};
385416
},
386417
},

apps/dojo/src/env.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ type envVars = {
1111
crewAiUrl: string;
1212
pydanticAIUrl: string;
1313
adkMiddlewareUrl: string;
14+
agentFrameworkPythonUrl: string;
1415
a2aUrl: string;
1516
agentFrameworkDotnetUrl: string;
1617
a2aMiddlewareBuildingsManagementUrl: string;
@@ -42,6 +43,7 @@ export default function getEnvVars(): envVars {
4243
crewAiUrl: process.env.CREW_AI_URL || 'http://localhost:9002',
4344
pydanticAIUrl: process.env.PYDANTIC_AI_URL || 'http://localhost:9000',
4445
adkMiddlewareUrl: process.env.ADK_MIDDLEWARE_URL || 'http://localhost:8000',
46+
agentFrameworkPythonUrl: process.env.AGENT_FRAMEWORK_PYTHON_URL || 'http://localhost:8888',
4547
agentFrameworkDotnetUrl: process.env.AGENT_FRAMEWORK_DOTNET_URL || 'http://localhost:5018',
4648
springAiUrl: process.env.SPRING_AI_URL || 'http://localhost:8080',
4749
a2aUrl: process.env.A2A_URL || 'http://localhost:10002',

0 commit comments

Comments
 (0)