From 79be213b7a202ca5f2895b3c132247a996337ce1 Mon Sep 17 00:00:00 2001 From: Pujarini Mohapatra Date: Fri, 20 Mar 2026 18:29:35 +0530 Subject: [PATCH 01/13] fix: resolve Windows dependency installation issues in CrewAI sample (#241) - Cap `requires-python` at <3.14 to prevent pydantic-core build failure (PyO3 v0.24.1 does not support Python 3.14) - Add uv override to cap lancedb at <=0.30.0 on Windows; lancedb 0.30.1+ only ships Linux/macOS wheels and has no win_amd64 distribution Fixes #241 --- python/crewai/sample_agent/pyproject.toml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/python/crewai/sample_agent/pyproject.toml b/python/crewai/sample_agent/pyproject.toml index 792c5b04..ecd29744 100644 --- a/python/crewai/sample_agent/pyproject.toml +++ b/python/crewai/sample_agent/pyproject.toml @@ -3,7 +3,7 @@ name = "crew_agent" version = "0.1.0" description = "CrewAI Sample Agent using Microsoft Agent 365 SDK with MCP tooling support" authors = [{ name = "Microsoft", email = "support@microsoft.com" }] -requires-python = ">=3.11" +requires-python = ">=3.11,<3.14" dependencies = [ "crewai[azure-ai-inference,tools]==1.4.1", "pysqlite3-binary>=0.5.2; sys_platform == 'linux'", @@ -42,3 +42,7 @@ type = "crew" # This ensures we always get the latest features and fixes [tool.uv] prerelease = "allow" +override-dependencies = [ + # lancedb 0.30.1+ has no Windows wheels; cap at 0.30.0 which does + "lancedb<=0.30.0; sys_platform == 'win32'", +] From 468ad630bbd27293c6d91f883f2eb4d414e6683b Mon Sep 17 00:00:00 2001 From: biswapm Date: Thu, 26 Mar 2026 11:31:11 +0530 Subject: [PATCH 02/13] fix: address PR review comments --- python/crewai/sample_agent/README.md | 2 +- python/crewai/sample_agent/pyproject.toml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/python/crewai/sample_agent/README.md b/python/crewai/sample_agent/README.md index f0a0589d..2f07ca30 100644 --- a/python/crewai/sample_agent/README.md +++ b/python/crewai/sample_agent/README.md @@ -17,7 +17,7 @@ For comprehensive documentation and guidance on building agents with the Microso ## Prerequisites -- Python 3.11+ +- Python 3.11–3.13 - [UV](https://docs.astral.sh/uv/) (recommended for dependency management) - Azure OpenAI API credentials OR OpenAI API key - [Tavily API key](https://tavily.com) for weather search functionality diff --git a/python/crewai/sample_agent/pyproject.toml b/python/crewai/sample_agent/pyproject.toml index ecd29744..22115660 100644 --- a/python/crewai/sample_agent/pyproject.toml +++ b/python/crewai/sample_agent/pyproject.toml @@ -26,6 +26,9 @@ dependencies = [ "microsoft_agents_a365_notifications>=0.1.0", "microsoft_agents_a365_runtime>=0.1.0", "wrapt>=2.0.1", + # lancedb 0.30.1+ has no Windows wheels; cap at 0.30.0 on Windows. + # Also enforced via [tool.uv] override-dependencies for uv users. + "lancedb<=0.30.0; sys_platform == 'win32'", ] [project.scripts] From 107c399ac6ff8c03483f68a74d88d4fa42c5002f Mon Sep 17 00:00:00 2001 From: Pujarini Mohapatra Date: Thu, 26 Mar 2026 11:44:31 +0530 Subject: [PATCH 03/13] Update python/crewai/sample_agent/pyproject.toml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- python/crewai/sample_agent/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/crewai/sample_agent/pyproject.toml b/python/crewai/sample_agent/pyproject.toml index 22115660..66b2af1d 100644 --- a/python/crewai/sample_agent/pyproject.toml +++ b/python/crewai/sample_agent/pyproject.toml @@ -46,6 +46,6 @@ type = "crew" [tool.uv] prerelease = "allow" override-dependencies = [ - # lancedb 0.30.1+ has no Windows wheels; cap at 0.30.0 which does + # lancedb 0.30.1+ has no Windows wheels; cap at 0.30.0 which does provide Windows wheels. "lancedb<=0.30.0; sys_platform == 'win32'", ] From e63612f8ff651fd5598b1c3814bcc1dc0aab34c8 Mon Sep 17 00:00:00 2001 From: biswapm Date: Thu, 26 Mar 2026 11:48:00 +0530 Subject: [PATCH 04/13] fix: remove recordResponseId and correlationId calls not in SDK types --- nodejs/claude/sample-agent/src/agent.ts | 1 - nodejs/claude/sample-agent/src/client.ts | 1 - nodejs/langchain/sample-agent/src/agent.ts | 1 - nodejs/langchain/sample-agent/src/client.ts | 1 - nodejs/openai/sample-agent/src/agent.ts | 1 - nodejs/openai/sample-agent/src/client.ts | 1 - nodejs/vercel-sdk/sample-agent/src/client.ts | 1 - 7 files changed, 7 deletions(-) diff --git a/nodejs/claude/sample-agent/src/agent.ts b/nodejs/claude/sample-agent/src/agent.ts index f5d3ef80..f4b47c17 100644 --- a/nodejs/claude/sample-agent/src/agent.ts +++ b/nodejs/claude/sample-agent/src/agent.ts @@ -85,7 +85,6 @@ export class MyAgent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Initial onboarding session') - .correlationId("7ff6dca0-917c-4bb0-b31a-794e533d8aad") .build(); // Preload/refresh exporter token diff --git a/nodejs/claude/sample-agent/src/client.ts b/nodejs/claude/sample-agent/src/client.ts index 88b6c341..76350ee6 100644 --- a/nodejs/claude/sample-agent/src/client.ts +++ b/nodejs/claude/sample-agent/src/client.ts @@ -158,7 +158,6 @@ class ClaudeClient implements Client { // Record the inference response with token usage scope?.recordOutputMessages([response]); scope?.recordInputMessages([prompt]); - scope?.recordResponseId(`resp-${Date.now()}`); scope?.recordInputTokens(45); scope?.recordOutputTokens(78); scope?.recordFinishReasons(['stop']); diff --git a/nodejs/langchain/sample-agent/src/agent.ts b/nodejs/langchain/sample-agent/src/agent.ts index a00b9cb1..58defd08 100644 --- a/nodejs/langchain/sample-agent/src/agent.ts +++ b/nodejs/langchain/sample-agent/src/agent.ts @@ -80,7 +80,6 @@ export class A365Agent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Initial onboarding session') - .correlationId(`corr-${Date.now()}`) .build(); // Preload/refresh exporter token diff --git a/nodejs/langchain/sample-agent/src/client.ts b/nodejs/langchain/sample-agent/src/client.ts index fab36352..b24e5072 100644 --- a/nodejs/langchain/sample-agent/src/client.ts +++ b/nodejs/langchain/sample-agent/src/client.ts @@ -227,7 +227,6 @@ class LangChainClient implements Client { // Record the inference response with token usage scope.recordOutputMessages([response]); scope.recordInputMessages([prompt]); - scope.recordResponseId(`resp-${Date.now()}`); scope.recordInputTokens(45); scope.recordOutputTokens(78); scope.recordFinishReasons(['stop']); diff --git a/nodejs/openai/sample-agent/src/agent.ts b/nodejs/openai/sample-agent/src/agent.ts index ab66409a..38a66892 100644 --- a/nodejs/openai/sample-agent/src/agent.ts +++ b/nodejs/openai/sample-agent/src/agent.ts @@ -90,7 +90,6 @@ export class MyAgent extends AgentApplication { new BaggageBuilder(), turnContext ).sessionDescription('Initial onboarding session') - .correlationId("7ff6dca0-917c-4bb0-b31a-794e533d8aad") .build(); // Preloads or refreshes the Observability token used by the Agent 365 Observability exporter. diff --git a/nodejs/openai/sample-agent/src/client.ts b/nodejs/openai/sample-agent/src/client.ts index 37b7b2b1..428e9fbf 100644 --- a/nodejs/openai/sample-agent/src/client.ts +++ b/nodejs/openai/sample-agent/src/client.ts @@ -166,7 +166,6 @@ class OpenAIClient implements Client { // Record the inference response with token usage scope.recordOutputMessages([response]); scope.recordInputMessages([prompt]); - scope.recordResponseId(`resp-${Date.now()}`); scope.recordInputTokens(45); scope.recordOutputTokens(78); scope.recordFinishReasons(['stop']); diff --git a/nodejs/vercel-sdk/sample-agent/src/client.ts b/nodejs/vercel-sdk/sample-agent/src/client.ts index a0a42c15..039ae416 100644 --- a/nodejs/vercel-sdk/sample-agent/src/client.ts +++ b/nodejs/vercel-sdk/sample-agent/src/client.ts @@ -122,7 +122,6 @@ class VercelAiClient implements Client { response = await this.invokeAgent(prompt); scope.recordOutputMessages([response]); scope.recordInputMessages([prompt]); - scope.recordResponseId(`resp-${Date.now()}`); scope.recordInputTokens(45); scope.recordOutputTokens(78); scope.recordFinishReasons(['stop']); From 6d3f1151365cd6d66809de9c2c0c6bc166675a06 Mon Sep 17 00:00:00 2001 From: biswapm Date: Wed, 1 Apr 2026 16:01:27 +0530 Subject: [PATCH 05/13] fix: resolve Google ADK agent Playground and production issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix AUTH_HANDLER_NAME env-driven pattern — empty = anonymous/Playground, AGENTIC = production - Fix expired BEARER_TOKEN detection via JWT exp claim to prevent OBO hang - Skip MCP tool init when no token and no auth handler (avoids MCP session errors) - Add 10s timeout on MCP tool initialization with graceful fallback to bare LLM - Fix AgentAuthConfiguration construction (typed object not plain dict) for JWT middleware - Read PORT from env for Azure/GCP compatibility (default 3978 for local dev) - Read GEMINI_MODEL from env (default gemini-2.5-flash, replaces deprecated gemini-2.0-flash) - Fix instruction dropped when rebuilding Agent with MCP tools - Add getattr fallback for recipient.tenant_id/agentic_user_id (Playground sends minimal activity) - Add typing indicator loop and immediate ack message in message handler - Add .gitignore for A365 deploy artifacts and manifest folder - Update .env.template with all keys, placeholders, port guidance and needDeployment notes - Update README with local dev, Agents Playground, Azure/GCP deploy, publish lifecycle and troubleshooting --- .gitignore | 6 + python/google-adk/sample-agent/.env.template | 48 +- python/google-adk/sample-agent/.gitignore | 21 + python/google-adk/sample-agent/README.md | 424 +++++++++++++++++- python/google-adk/sample-agent/agent.py | 69 ++- python/google-adk/sample-agent/hosting.py | 16 +- .../sample-agent/images/agents-playground.png | Bin 0 -> 174818 bytes python/google-adk/sample-agent/main.py | 71 ++- .../mcp_tool_registration_service.py | 1 + 9 files changed, 588 insertions(+), 68 deletions(-) create mode 100644 python/google-adk/sample-agent/.gitignore create mode 100644 python/google-adk/sample-agent/images/agents-playground.png diff --git a/.gitignore b/.gitignore index 938dae64..7193dd15 100644 --- a/.gitignore +++ b/.gitignore @@ -103,6 +103,12 @@ coverage/ **/.claude/ .idea/ +# A365 deploy artifacts — generated by `a365 deploy` / `a365 develop` +a365.config.json +a365.generated.config.json +app.zip +publish/ + # OS-specific files .DS_Store Thumbs.db diff --git a/python/google-adk/sample-agent/.env.template b/python/google-adk/sample-agent/.env.template index 80dd31c5..a5b06806 100644 --- a/python/google-adk/sample-agent/.env.template +++ b/python/google-adk/sample-agent/.env.template @@ -1,11 +1,15 @@ +# Google Gemini Configuration GOOGLE_GENAI_USE_VERTEXAI=FALSE -GOOGLE_API_KEY= +GOOGLE_API_KEY=<> +GEMINI_MODEL=gemini-2.5-flash + +USE_AGENTIC_AUTH=true # Agent365 Agentic Authentication Configuration -CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID= -CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET= -CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID= -CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPES=5a807f24-c9de-44ee-a3a7-329e88a00ffc/.default +CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=<> +CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=<> +CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=<> +CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPES=<>/.default AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__AGENTIC__SETTINGS__TYPE=AgenticUserAuthorization AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__AGENTIC__SETTINGS__SCOPES=https://graph.microsoft.com/.default @@ -14,9 +18,31 @@ AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__AGENTIC__SETTINGS__ALTERNATEBLUEP CONNECTIONSMAP__0__SERVICEURL=* CONNECTIONSMAP__0__CONNECTION=SERVICE_CONNECTION -# These values are expected to be in the activity's recipient field -AGENTIC_UPN= -AGENTIC_NAME= -AGENTIC_USER_ID= -AGENTIC_APP_ID= -AGENTIC_TENANT_ID= \ No newline at end of file +# Agent Identity (from the A365 portal / blueprint) +AGENTIC_UPN=<> +AGENTIC_NAME=<> +AGENTIC_USER_ID=<> +AGENTIC_APP_ID=<> +AGENTIC_TENANT_ID=<> + +# Bearer token for local dev / Playground — obtain with: a365 develop get-token -o raw +# Leave empty to run in bare LLM mode (no MCP tools) +BEARER_TOKEN= + +# Authentication Handler Configuration +# Set to "AGENTIC" for production agentic auth, or leave empty for Playground/local dev +AUTH_HANDLER_NAME= + +# Logging +LOG_LEVEL=INFO + +# Server Configuration +# Local dev: 3978 — Azure App Service / GCP Cloud Run: port is injected automatically by the platform (typically 8000) +PORT=3978 + +# Observability +ENABLE_OBSERVABILITY=true +ENABLE_A365_OBSERVABILITY_EXPORTER=false +PYTHON_ENVIRONMENT=development +OBSERVABILITY_SERVICE_NAME=GoogleADKSampleAgent +OBSERVABILITY_SERVICE_NAMESPACE=GoogleADKTesting diff --git a/python/google-adk/sample-agent/.gitignore b/python/google-adk/sample-agent/.gitignore new file mode 100644 index 00000000..84cc73c9 --- /dev/null +++ b/python/google-adk/sample-agent/.gitignore @@ -0,0 +1,21 @@ +# A365 deploy artifacts — generated by `a365 deploy` / `a365 develop` +a365.config.json +a365.generated.config.json +app.zip +publish/ + +# Manifest folder — generated during deploy +manifest/ + +# Python virtual environment and caches +.venv/ +venv/ +__pycache__/ +*.py[cod] +*.egg-info/ +dist/ +build/ +uv.lock + +# Environment — contains secrets +.env diff --git a/python/google-adk/sample-agent/README.md b/python/google-adk/sample-agent/README.md index 7c555a34..79badbb4 100644 --- a/python/google-adk/sample-agent/README.md +++ b/python/google-adk/sample-agent/README.md @@ -11,17 +11,320 @@ This sample uses the [Microsoft Agent 365 SDK for Python](https://github.com/mic For comprehensive documentation and guidance on building agents with the Microsoft Agent 365 SDK, including how to add tooling, observability, and notifications, visit the [Microsoft Agent 365 Developer Documentation](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/). +--- + ## Prerequisites -- Python 3.x -- Microsoft Agent 365 SDK -- Google ADK SDK (google-adk) -- Google API credentials +- Python 3.11+ +- [uv](https://docs.astral.sh/uv/) package manager (recommended) or pip +- Google API key with Gemini access (paid tier recommended — free tier has low rate limits) +- Microsoft Agent 365 SDK credentials (for production / MCP tools) +- [Node.js](https://nodejs.org/) (for Agents Playground) + +--- + +## Quick Start — Local Development + +### 1. Clone and set up the environment + +```bash +cd python/google-adk/sample-agent + +# Create virtual environment and install dependencies +uv venv +uv sync + +# Bootstrap pip (required by the a365 CLI and some tools) +.venv/Scripts/python.exe -m ensurepip --upgrade # Windows +.venv/bin/python -m ensurepip --upgrade # Linux / macOS +``` + +### 2. Configure environment variables + +Copy the template and fill in your values: + +```bash +cp .env.template .env +``` + +Minimum required for local/Playground testing: + +```env +GOOGLE_API_KEY= +GEMINI_MODEL=gemini-2.5-flash +AUTH_HANDLER_NAME= # leave empty for Playground/local dev +``` + +> **Note**: `AUTH_HANDLER_NAME` must be **empty** for Agents Playground. Setting it to `AGENTIC` requires a real AAD token that Playground does not provide. + +### 3. Initialize A365 configuration + +```bash +a365 config init +``` + +This creates `a365.config.json` with your agent configuration. For local dev or self-hosted servers (GCP, AWS), set `"needDeployment": false` to tell the CLI not to deploy to Azure: + +```json +{ + "messagingEndpoint": "https:///api/messages", + "needDeployment": false +} +``` + +> `"needDeployment": false` — **I host my own server; don't deploy to Azure.** Use this for local dev tunnels, GCP Cloud Run, AWS, or any non-Azure hosting. +> +> `"needDeployment": true` — **Deploy my code to Azure App Service.** Use this when you want `a365 deploy` to package and upload your agent. + +You can also run `a365 setup all` to provision all cloud resources in one step. + +### 4. Run the agent + +```bash +# Activate the virtual environment +.venv/Scripts/activate # Windows +source .venv/bin/activate # Linux / macOS + +# Start the server (listens on localhost:3978) +python main.py +``` + +You should see: + +``` +INFO main: Listening on localhost:3978/api/messages +INFO main: No auth handler configured — anonymous mode (Playground/local dev) +INFO main: No token and no auth handler — skipping MCP tools, running bare LLM +``` + +### 5. Get a bearer token for MCP tools (optional) + +To enable MCP tool access locally, get a fresh token using the A365 CLI: + +```bash +a365 develop get-token -o raw +``` + +Copy the output and set it in `.env`: + +```env +BEARER_TOKEN= +``` + +The token expires in ~90 minutes. The agent detects expiry automatically and falls back to bare LLM mode. + +--- + +## Testing with Agents Playground + +The Agents Playground is a local testing tool that connects directly to your running agent — **no tunnel or deployment required**. + +### Install + +```bash +# Via npm (recommended) +npm install -g @microsoft/m365agentsplayground + +# Or via winget (Windows) +winget install agentsplayground +``` + +### Run locally (anonymous mode) + +1. Start your agent: + +```bash +python main.py +``` + +2. In a separate terminal, launch the Playground: + +```bash +agentsplayground -e "http://localhost:3978/api/messages" -c "emulator" +``` + +3. The Playground opens in your browser — start chatting with your agent. + +### Run with authentication + +```bash +agentsplayground -e "http://localhost:3978/api/messages" -c "emulator" \ + --client-id "" \ + --client-secret "" \ + --tenant-id "" +``` + +### Key CLI options + +| Option | Description | +|--------|-------------| +| `-e` | Agent endpoint (e.g. `http://localhost:3978/api/messages`) | +| `-c` | Channel type: `emulator`, `webchat`, or `msteams` | +| `--client-id` | Entra ID client ID (for auth mode) | +| `--client-secret` | Client secret (for auth mode) | +| `--tenant-id` | Tenant ID (for auth mode) | + +Run `agentsplayground --help` for all options. + +> For full setup documentation see [Test your agent locally in Agents Playground](https://learn.microsoft.com/en-us/microsoft-365/agents-sdk/test-with-toolkit-project). + +### Testing checklist + +| Test | How | +|------|-----| +| Basic message | Send any text message in the Playground chat | +| Install/uninstall | Agents Playground → Mock an Activity → Install application | +| Typing indicator | Send a message — you should see "Got it — working on it…" then "..." animation | +| MCP tools | Set `BEARER_TOKEN` in `.env` and restart — tools listed in server logs | +| User identity | Check server logs for `Turn received from user — DisplayName:` | + +### Expected Playground behavior + +1. You send a message +2. Agent immediately replies: **"Got it — working on it…"** +3. Typing indicator (`...`) appears while Gemini processes +4. Agent sends the final response + +![Agents Playground - Google ADK Sample Agent](images/agents-playground.png) + +--- + +## Deploying to Production + +### Full lifecycle with A365 CLI + +```bash +# 1. Initialize config (first time only) +a365 config init + +# 2. Provision all cloud resources and set up the blueprint +a365 setup all + +# 3. Deploy agent code to Azure +a365 deploy + +# 4. Publish agent to Microsoft 365 admin center +a365 publish +``` + +### Running on Azure App Service + +See [Deploy agent to Azure](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/deploy-agent-azure?tabs=dotnet) for full instructions. + +Set `messagingEndpoint` in `a365.config.json` to your Azure Web App URL and `"needDeployment": true` (see [configuration reference above](#3-initialize-a365-configuration)). + +Set the Azure App Service **startup command** to: + +```bash +python main.py +``` + +> **Port**: Azure App Service injects `PORT=8000` automatically. The app reads it from the environment — do not hardcode `3978` in any startup command. + +### Configure Application Settings + +The `.env` file is **not** deployed. Set all variables as Azure App Service Application Settings: + +| Key | Value | +|-----|-------| +| `GOOGLE_API_KEY` | Your Google API key | +| `GOOGLE_GENAI_USE_VERTEXAI` | `FALSE` | +| `GEMINI_MODEL` | `gemini-2.5-flash` | +| `CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID` | App registration client ID | +| `CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET` | Client secret | +| `CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID` | Tenant ID | +| `CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPES` | `/.default` | +| `AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__AGENTIC__SETTINGS__TYPE` | `AgenticUserAuthorization` | +| `AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__AGENTIC__SETTINGS__SCOPES` | `https://graph.microsoft.com/.default` | +| `AUTH_HANDLER_NAME` | `AGENTIC` | +| `AGENTIC_APP_ID` | Agent app ID from A365 portal | +| `AGENTIC_TENANT_ID` | Tenant ID | +| `AGENTIC_USER_ID` | Agent user ID from A365 portal | +| `ENABLE_OBSERVABILITY` | `true` | +| `OBSERVABILITY_SERVICE_NAME` | `GoogleADKSampleAgent` | + +### Running on GCP (Cloud Run) + +See [Deploy agent to GCP](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/deploy-agent-gcp) for full instructions. + +```bash +# Deploy to Cloud Run +gcloud run deploy gcp-a365-agent --source . --region us-central1 --platform managed --allow-unauthenticated +``` + +Set `a365.config.json` with your Cloud Run URL and `needDeployment: false`: + +```json +{ + "messagingEndpoint": "https://gcp-a365-agent-XXXX-uc.run.app/api/messages", + "needDeployment": false +} +``` + +> `"needDeployment": false` — tells the CLI "I host my own server; don't deploy to Azure." Use this for GCP, AWS, or any self-hosted server. + +Register only the messaging endpoint (skip Azure deploy): + +```bash +a365 setup blueprint --endpoint-only +``` + +### Messaging endpoint reference + +See [Configure messaging endpoint](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/agent-messaging-endpoint) for all hosting options. + +| Hosting | `messagingEndpoint` format | `needDeployment` | +|---------|--------------------------|-----------------| +| Azure App Service | `https://.azurewebsites.net/api/messages` | `true` | +| GCP Cloud Run | `https://.run.app/api/messages` | `false` | +| AWS | `https://.amazonaws.com/api/messages` | `false` | +| Dev Tunnel (local) | `https://.devtunnels.ms:3978/api/messages` | `false` | + +--- + +## After Publishing — Configure in Teams Developer Portal + +After running `a365 publish`, configure the agent blueprint in the Teams Developer Portal so it can receive messages from Teams and Microsoft 365: + +1. Get your blueprint ID: + +```bash +a365 config display -g +``` + +2. Open `https://dev.teams.microsoft.com/tools/agent-blueprint//configuration` +3. Set **Agent Type** to **API Based** +4. Set **Notification URL** to your messaging endpoint +5. Click **Save** and wait 5–10 minutes for propagation + +> See [Configure agent in Teams Developer Portal](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/create-instance#1-configure-agent-in-teams-developer-portal) and [Publish agent](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/publish) for full instructions. + +--- + +## Configuration Reference + +All configuration is via environment variables (`.env` for local, App Settings for Azure): + +| Variable | Default | Description | +|----------|---------|-------------| +| `GOOGLE_API_KEY` | — | **Required**. Google Gemini API key | +| `GEMINI_MODEL` | `gemini-2.5-flash` | Gemini model to use | +| `GOOGLE_GENAI_USE_VERTEXAI` | `FALSE` | Set `TRUE` to use Vertex AI instead of Gemini API | +| `AUTH_HANDLER_NAME` | _(empty)_ | Empty = anonymous (Playground/local), `AGENTIC` = production | +| `BEARER_TOKEN` | _(empty)_ | Token for MCP tool access. Get with `a365 develop get-token -o raw` | +| `AGENTIC_APP_ID` | — | Agent App ID from A365 portal | +| `AGENTIC_TENANT_ID` | — | Azure tenant ID | +| `AGENTIC_USER_ID` | — | Agent User ID from A365 portal | +| `PORT` | `3978` | Server port (Azure sets this to `8000` automatically) | +| `ENABLE_OBSERVABILITY` | `true` | Enable OpenTelemetry tracing | +| `ENABLE_A365_OBSERVABILITY_EXPORTER` | `false` | Send traces to A365 backend (`true` for production) | +| `LOG_LEVEL` | `INFO` | Logging level (`DEBUG`, `INFO`, `WARNING`, `ERROR`) | + +--- ## Working with User Identity -On every incoming message, the A365 platform populates `activity.from_property` with basic user -information — always available with no API calls or token acquisition: +On every incoming message, the A365 platform populates `activity.from_property` with basic user information — always available with no API calls or token acquisition: | Field | Description | |---|---| @@ -29,32 +332,28 @@ information — always available with no API calls or token acquisition: | `activity.from_property.name` | Display name as known to the channel | | `activity.from_property.aad_object_id` | Azure AD Object ID — use this to call Microsoft Graph | -The sample logs these fields at the start of every message turn and injects the display name -into the LLM system instructions for personalized responses. +The sample logs these fields at the start of every message turn and injects the display name into the LLM system instructions for personalized responses. + +--- ## Handling Agent Install and Uninstall -When a user installs (hires) or uninstalls (removes) the agent, the A365 platform sends an `InstallationUpdate` activity — also referred to as the `agentInstanceCreated` event. The sample handles this in `on_installation_update` in `hosting.py`: +When a user installs (hires) or uninstalls (removes) the agent, the A365 platform sends an `InstallationUpdate` activity. The sample handles this in `on_installation_update` in `hosting.py`: | Action | Description | |---|---| | `add` | Agent was installed — send a welcome message | | `remove` | Agent was uninstalled — send a farewell message | -```python -if action == "add": - await context.send_activity("Thank you for hiring me! Looking forward to assisting you in your professional journey!") -elif action == "remove": - await context.send_activity("Thank you for your time, I enjoyed working with you.") -``` +To test with Agents Playground, use **Mock an Activity → Install application**. -To test with Agents Playground, use **Mock an Activity → Install application** to send a simulated `installationUpdate` activity. +--- ## Sending Multiple Messages in Teams Agent365 agents can send multiple discrete messages in response to a single user prompt. This is the recommended pattern for agentic identities in Teams. -> **Important**: Streaming (SSE) is not supported for agentic identities in Teams. The SDK detects agentic identity and buffers streaming into a single message. Instead, call `send_activity` multiple times to send multiple messages. +> **Important**: Streaming (SSE) is not supported for agentic identities in Teams. Instead, call `send_activity` multiple times. ### Pattern @@ -65,9 +364,8 @@ Agent365 agents can send multiple discrete messages in response to a single user ### Typing Indicators - Typing indicators show a progress animation in Teams -- They have a built-in ~5-second visual timeout -- For long-running operations, re-send the typing indicator in a loop every ~4 seconds -- Typing indicators are only visible in 1:1 chats and small group chats (not channels) +- They have a built-in ~5-second visual timeout — re-send every ~4 seconds for long operations +- Only visible in 1:1 chats and small group chats (not channels) ### Code Example @@ -101,12 +399,86 @@ finally: pass ``` -## Running the Agent +--- -To set up and test this agent, refer to the [Configure Agent Testing](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/testing?tabs=python) guide for complete instructions. +## Troubleshooting + +### Agent not responding in Playground + +**Symptom**: Messages sent, no response appears. + +**Cause**: `AUTH_HANDLER_NAME=AGENTIC` is set. Playground does not provide a real AAD token, so the OBO exchange hangs and the handler never fires. + +**Fix**: Set `AUTH_HANDLER_NAME=` (empty) in `.env` for local/Playground testing. + +--- + +### "Retrieving agentic user token" in logs — agent hangs + +**Cause**: Same as above — `AUTH_HANDLER_NAME=AGENTIC` with no valid AAD token. + +**Fix**: Clear `AUTH_HANDLER_NAME` for Playground. For production with MCP tools, provide a fresh `BEARER_TOKEN`. + +--- + +### "Failed to create MCP session" error + +**Cause**: Expired or missing `BEARER_TOKEN` with no auth handler configured — the agent tries to connect to MCP servers with invalid credentials. + +**Fix**: Either refresh `BEARER_TOKEN` with `a365 develop get-token -o raw`, or set `AUTH_HANDLER_NAME=` to skip MCP tools entirely and run in bare LLM mode. + +--- + +### Getting HTTP 201 instead of 202 from `/api/messages` + +**Cause**: Python on Windows defaults to `WindowsProactorEventLoopPolicy`, which can break aiohttp socket writes. The `run_app()` call in `main.py` uses the correct event loop — no manual policy override needed. + +**Fix**: Ensure you are using `run_app()` from aiohttp (not `asyncio.run()`). Do not override the event loop policy manually. + +--- + +### Azure container startup timeout (230s) + +**Cause**: Port hardcoded to `3978` — Azure App Service injects `PORT=8000` and the app binds to the wrong port. + +**Fix**: Already handled in `main.py` — `port = int(os.getenv("PORT", 3978))`. + +--- + +### `pip not found` during `a365 deploy` + +**Cause**: `uv venv` / `uv sync` does not install pip by default. + +**Fix**: +```bash +.venv/Scripts/python.exe -m ensurepip --upgrade # Windows +.venv/bin/python -m ensurepip --upgrade # Linux / macOS +``` + +Note: Re-run this after every `uv sync` as uv removes pip. + +--- + +### `AttributeError: 'dict' object has no attribute 'TENANT_ID'` + +**Cause**: JWT middleware received a plain dict instead of a typed `AgentAuthConfiguration` object. + +**Fix**: Already handled in `main.py` — `AgentAuthConfiguration` is built explicitly from env vars. + +--- + +### Gemini model 404 error + +**Cause**: `gemini-2.0-flash` is deprecated for new API key users. + +**Fix**: Use `GEMINI_MODEL=gemini-2.5-flash` (default) in `.env`. + +--- For a detailed explanation of the agent code and implementation, see the [Agent Code Walkthrough](AGENT-CODE-WALKTHROUGH.md). +--- + ## Support For issues, questions, or feedback: @@ -128,7 +500,13 @@ This project has adopted the [Microsoft Open Source Code of Conduct](https://ope - [Microsoft Agent 365 SDK - Python repository](https://github.com/microsoft/Agent365-python) - [Microsoft 365 Agents SDK - Python repository](https://github.com/Microsoft/Agents-for-python) - [Google ADK API documentation](https://google.github.io/adk-docs/) -- [Python API documentation](https://learn.microsoft.com/python/api/?view=m365-agents-sdk&preserve-view=true) +- [Configure messaging endpoint](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/agent-messaging-endpoint) +- [Deploy agent to Azure](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/deploy-agent-azure?tabs=dotnet) +- [Deploy agent to GCP](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/deploy-agent-gcp) +- [Publish agent](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/publish) +- [Configure agent in Teams Developer Portal](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/create-instance#1-configure-agent-in-teams-developer-portal) +- [Configure Agent Testing](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/testing?tabs=python) +- [Test your agent locally in Agents Playground](https://learn.microsoft.com/en-us/microsoft-365/agents-sdk/test-with-toolkit-project) ## Trademarks diff --git a/python/google-adk/sample-agent/agent.py b/python/google-adk/sample-agent/agent.py index a3bb134e..dc619581 100644 --- a/python/google-adk/sample-agent/agent.py +++ b/python/google-adk/sample-agent/agent.py @@ -1,6 +1,8 @@ # Copyright (c) Microsoft. All rights reserved. +import asyncio import os +import time from typing import Optional from google.adk.agents import Agent @@ -36,7 +38,7 @@ def _get_instruction(cls, user_name: str) -> str: def __init__( self, agent_name: str = "my_agent", - model: str = "gemini-2.0-flash", + model: str = os.getenv("GEMINI_MODEL", "gemini-2.5-flash"), description: str = "Agent to test Mcp tools.", instruction: str = """ You are a helpful AI assistant with access to external tools through MCP servers. @@ -122,12 +124,18 @@ async def invoke_agent( ) responses = [] - result = await runner.run_debug( - user_messages=[message] - ) + try: + result = await runner.run_debug( + user_messages=[message] + ) + except Exception as e: + logger.error("run_debug failed: %s", e) + await self._cleanup_agent(agent) + return "Sorry, I encountered an error while processing your request. Please try again." # Extract text responses from the result if not hasattr(result, '__iter__'): + await self._cleanup_agent(agent) return "I couldn't get a response from the agent. :(" for event in result: @@ -161,8 +169,11 @@ async def invoke_agent_with_scope( Returns: List of response messages from the agent """ - tenant_id = context.activity.recipient.tenant_id - agent_id = context.activity.recipient.agentic_user_id + # Playground sends a minimal recipient (id + name only). + # Fall back to env vars so observability baggage is still populated. + recipient = context.activity.recipient + tenant_id = getattr(recipient, "tenant_id", None) or os.getenv("AGENTIC_TENANT_ID", "") + agent_id = getattr(recipient, "agentic_user_id", None) or os.getenv("AGENTIC_USER_ID", "") with BaggageBuilder().tenant_id(tenant_id).agent_id(agent_id).build(): return await self.invoke_agent(message=message, auth=auth, auth_handler_name=auth_handler_name, context=context) @@ -175,17 +186,45 @@ async def _cleanup_agent(self, agent: Agent): async def _initialize_agent(self, agent, auth, auth_handler_name, turn_context): """Initialize the agent with MCP tools and authentication.""" + # Validate BEARER_TOKEN — pass empty string if expired so the SDK uses + # the proper auth handler instead of a stale token that triggers an OBO hang. + bearer_token = os.getenv("BEARER_TOKEN", "") + if bearer_token: + try: + import base64, json as _json + payload = bearer_token.split(".")[1] + payload += "=" * (4 - len(payload) % 4) + exp = _json.loads(base64.b64decode(payload)).get("exp", 0) + if exp and time.time() > exp: + logger.warning("BEARER_TOKEN is expired — skipping token, will use auth handler") + bearer_token = "" + except Exception: + pass # non-JWT token format; pass it through as-is + + # Skip MCP init if there's no token and no auth handler — avoids MCP + # session errors when running locally/Playground without valid credentials. + if not bearer_token and not auth_handler_name: + logger.info("No token and no auth handler — skipping MCP tools, running bare LLM") + return agent + try: - # Add MCP tools to the agent tool_service = McpToolRegistrationService() - return await tool_service.add_tool_servers_to_agent( - agent=agent, - agentic_app_id=os.getenv("AGENTIC_APP_ID", "agent123"), - auth=auth, - auth_handler_name=auth_handler_name, - context=turn_context, - auth_token=os.getenv("BEARER_TOKEN", ""), + # Wrap in a timeout — if token exchange hangs (e.g. Playground user has + # no real AAD token for OBO), fall through to bare LLM mode after 10s. + return await asyncio.wait_for( + tool_service.add_tool_servers_to_agent( + agent=agent, + agentic_app_id=os.getenv("AGENTIC_APP_ID", "agent123"), + auth=auth, + auth_handler_name=auth_handler_name, + context=turn_context, + auth_token=bearer_token, + ), + timeout=10.0, ) + except asyncio.TimeoutError: + logger.warning("MCP tool initialization timed out — running without tools") + return agent except Exception as e: - logger.error(f"Error during agent initialization: {e}") + logger.error("Error during agent initialization: %s", e) return agent \ No newline at end of file diff --git a/python/google-adk/sample-agent/hosting.py b/python/google-adk/sample-agent/hosting.py index 4344cd9c..6d8c217d 100644 --- a/python/google-adk/sample-agent/hosting.py +++ b/python/google-adk/sample-agent/hosting.py @@ -73,14 +73,22 @@ def __init__(self, agent: AgentInterface): ) self.agent = agent - self.auth_handler_name = "AGENTIC" + # Read from AUTH_HANDLER_NAME env var. Set to "AGENTIC" for production + # agentic auth. Leave empty (default) for local dev and Agents Playground. + self.auth_handler_name = os.getenv("AUTH_HANDLER_NAME", "") or None + if self.auth_handler_name: + logger.info("Auth handler: %s", self.auth_handler_name) + else: + logger.info("No auth handler configured — anonymous mode (Playground/local dev)") self.agent_notification = AgentNotification(self) self._setup_handlers() def _setup_handlers(self): """Set up activity handlers for the agent.""" - auth_handlers = [self.auth_handler_name] + # Only enforce auth when AUTH_HANDLER_NAME is configured. + # Without it the Agents Playground (and local dev) can reach the handler. + handler_config = {"auth_handlers": [self.auth_handler_name]} if self.auth_handler_name else {} @self.conversation_update("membersAdded") async def help_handler(context: TurnContext, _: TurnState): @@ -107,7 +115,7 @@ async def on_installation_update(context: TurnContext, _: TurnState): elif action == "remove": await context.send_activity("Thank you for your time, I enjoyed working with you.") - @self.activity("message", auth_handlers=auth_handlers, rank=2) + @self.activity("message", **handler_config, rank=2) async def message_handler(context: TurnContext, _: TurnState): """Handle message activities.""" user_message = context.activity.text @@ -151,7 +159,7 @@ async def _typing_loop(): @self.agent_notification.on_agent_notification( channel_id=ChannelId(channel="agents", sub_channel="*"), - auth_handlers=auth_handlers, + **handler_config, rank=1 ) async def agent_notification_handler( diff --git a/python/google-adk/sample-agent/images/agents-playground.png b/python/google-adk/sample-agent/images/agents-playground.png new file mode 100644 index 0000000000000000000000000000000000000000..4d648605e232b9513f4f37aa1ade575da7d5525b GIT binary patch literal 174818 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

j zX1#h3!G^X-GpiL>2geb})?&er9J%zKV1z!GiLDgU1%UO?97f0;BYf*A`||iRU9{J% zM}V{aL8{S%LrarYfU%ri@sOFIy2i~{qvUQRy6Bn(Lc@iW*H*)?@b-h!jz^u*2focN zfvr+^t8gE|-gm)tJh{9K*vlXV`#phCr)SvShXG?F=o8s zfagA`f<4m5CzOzNX)WCiLOqqvgkPN}6Encyzpea*6TjC=|H&P+vxmS0?)a{_Igyrfr1 zxRPbsv#{KD^RkX#Stuwje#!G^{MN3F1hrJpdFnah?IYxY5MfczK1!%WYy}?Gcv(w_w^fT;${BhbyVL=;J}Zo*$?} z>`e?Ifqj_o*g;Rf3b0iO8_-D!p|wHRI(fzp#@EkC-bUs<&>NnmrR%kM(cWy1KI6rg zTzm&}Y`n!r6S7piOggqpn#mzJDtm!fR<24KiURsUS&Ed!QHR-PE!fm@!yF{Y{;Laa zm^_kpKV25=0^_1cR`qG|c1%51-{1yIfuh_7_$+*VT`qJZQlZnK?14rrW=jx`{=FSz z#do~WAsDK+K6x;X_h!XpD}Gbi_<|QDW2nQ|mV}PfG$YO##A@+1B3$e$_Q_PPWO@GL`v`5MmlDsE0Q^qe%SD#oRr1+ilN!ijuT6gPC3AlkEP| z$$Av?F^K~}2xo4Ui^eXyzE5x&rB)DXgR3%HPe)^T-SVXv zhoT4s|Hx&$1=M;UG6sCey6%18GIhK@xuWfkr>;D>aT+~wUTYV8 zH+vMXmgytqojMU!TGBGVd)lQda^oXqj_-j|QPD=bb|yM^+=J1pcwQtjB3gGFXIs`5 zQd(MD3nPVCdI+g7U?^^6tbH%bRnFv9PBS4Mcd{wKy$&+Y2hrn zXDGdo4VSdN%o|cJ4E1Cr;7Jd-CAF4zdlB;|fV{#(c3QhmN;6Im^v|RpXjCXs2 z(g)aZxyZ4xRC7A@V@ssRnUU)+19YX|s!(6{0xRdD3bdJwLEI~&Pn0ieiHE63img{k zv|L1O;-JxRIPp9mSEhI*lD{n4KMO-}G>+j@wK;Z3+n~pA2@RdUFGI}SHIww7ao>$3 zX2s_lY)lwRuegx9gU%1A<9@+=Vd~sQFDDbh`Xc*{z2_`S64TKD5&S0ZGf>6u=67FW zKlb5lm_=`-nNENAg1+BkQQzR&>MV~CJr6d-VLQDp6&o`$;8eAo6rBYI#PN9LO<#~` zZRnVqaOfVBhS55kQ{Cu`jZ?xp!qhQ^bn?vuog&wqsԟ?Uk;FvLvj7RuRq~k%Q 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∋^o=W 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 V%#d6Vufx2gysU~$;XR}0{|{SU4SN6p literal 0 HcmV?d00001 diff --git a/python/google-adk/sample-agent/main.py b/python/google-adk/sample-agent/main.py index f1e85977..2e6cbc1d 100644 --- a/python/google-adk/sample-agent/main.py +++ b/python/google-adk/sample-agent/main.py @@ -5,14 +5,13 @@ from hosting import MyAgent from agent import GoogleADKAgent -import os - # Server imports from aiohttp.web import Application, Request, Response, run_app from aiohttp.web_middlewares import middleware as web_middleware # Microsoft Agents SDK imports from microsoft_agents.hosting.core import AgentApplication, ClaimsIdentity, AuthenticationConstants +from microsoft_agents.hosting.core.authorization import AgentAuthConfiguration from microsoft_agents.hosting.aiohttp import start_agent_process, jwt_authorization_middleware from microsoft_agents.activity import load_configuration_from_env @@ -23,8 +22,10 @@ from dotenv import load_dotenv load_dotenv() -# Logging +# Logging — respect LOG_LEVEL from .env import logging +log_level = getattr(logging, os.getenv("LOG_LEVEL", "INFO").upper(), logging.INFO) +logging.basicConfig(level=log_level, format="%(asctime)s %(levelname)s %(name)s: %(message)s") logger = logging.getLogger(__name__) def start_server(agent_app: AgentApplication): @@ -47,32 +48,72 @@ async def anonymous_claims(request, handler): ) return await handler(request) + # Build AgentAuthConfiguration — the JWT middleware requires an object with + # attribute access (.TENANT_ID, .ANONYMOUS_ALLOWED), not a plain dict. + # Read from CONNECTIONS__SERVICE_CONNECTION__SETTINGS__* (A365 format) or + # direct CLIENT_ID / TENANT_ID / CLIENT_SECRET vars as fallback. + agent_auth_config = None + client_id = ( + os.getenv("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID") + or os.getenv("CLIENT_ID") + ) + tenant_id = ( + os.getenv("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID") + or os.getenv("TENANT_ID") + ) + client_secret = ( + os.getenv("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET") + or os.getenv("CLIENT_SECRET") + ) + if client_id and tenant_id and client_secret: + try: + agent_auth_config = AgentAuthConfiguration( + client_id=client_id, + tenant_id=tenant_id, + client_secret=client_secret, + ) + logger.info("JWT auth configured (client_id=%s)", client_id) + except Exception as e: + logger.warning("Failed to build AgentAuthConfiguration, running anonymous: %s", e) + else: + logger.info("No auth credentials found — running in anonymous mode") + middlewares = [anonymous_claims] - auth_config = load_configuration_from_env(os.environ) - if (auth_config and isProduction): + if agent_auth_config and isProduction: middlewares.append(jwt_authorization_middleware) + logger.info("JWT authorization middleware enabled") # Configure App app = Application(middlewares=middlewares) app.router.add_post("/api/messages", entry_point) - app["agent_configuration"] = auth_config + app["agent_configuration"] = agent_auth_config try: host = "0.0.0.0" if isProduction else "localhost" - run_app(app, host=host, port=int(3978), handle_signals=True) + port = int(os.getenv("PORT", 3978)) + logger.info("Listening on %s:%d/api/messages", host, port) + run_app(app, host=host, port=port, handle_signals=True) except KeyboardInterrupt: logger.info("\nShutting down server gracefully...") - except Exception as e: - logger.error(f"Server error: {e}") - raise e def main(): """Main function to run the sample agent application.""" - # Configure observability - configure( - service_name="GoogleADKSampleAgent", - service_namespace="GoogleADKTesting", - ) + # Configure observability from .env + # ENABLE_OBSERVABILITY=true/false controls whether tracing is set up. + # ENABLE_A365_OBSERVABILITY_EXPORTER=true sends traces to the A365 backend; + # false falls back to the console exporter (expected in local/dev). + if os.getenv("ENABLE_OBSERVABILITY", "true").lower() == "true": + configure( + service_name=os.getenv("OBSERVABILITY_SERVICE_NAME", "GoogleADKSampleAgent"), + service_namespace=os.getenv("OBSERVABILITY_SERVICE_NAMESPACE", "GoogleADKTesting"), + ) + logger.info( + "Observability configured (service=%s, a365_exporter=%s)", + os.getenv("OBSERVABILITY_SERVICE_NAME", "GoogleADKSampleAgent"), + os.getenv("ENABLE_A365_OBSERVABILITY_EXPORTER", "false"), + ) + else: + logger.info("Observability disabled (ENABLE_OBSERVABILITY=false)") agent_application = MyAgent(GoogleADKAgent()) start_server(agent_application) diff --git a/python/google-adk/sample-agent/mcp_tool_registration_service.py b/python/google-adk/sample-agent/mcp_tool_registration_service.py index ab167173..4543365f 100644 --- a/python/google-adk/sample-agent/mcp_tool_registration_service.py +++ b/python/google-adk/sample-agent/mcp_tool_registration_service.py @@ -89,5 +89,6 @@ async def add_tool_servers_to_agent( name=agent.name, model=agent.model, description=agent.description, + instruction=agent.instruction, tools=all_tools, ) From e168b20394249027299f91dc212958b02673895a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 1 Apr 2026 11:06:32 +0000 Subject: [PATCH 06/13] fix: address PR review comments - copyright headers, unused import, host binding, JWT parsing, env template Agent-Logs-Url: https://github.com/microsoft/Agent365-Samples/sessions/a8694946-d298-4af8-b7a5-bbf06db84366 Co-authored-by: biswapm <29349597+biswapm@users.noreply.github.com> --- python/google-adk/sample-agent/.env.template | 2 -- python/google-adk/sample-agent/agent.py | 11 +++++++---- python/google-adk/sample-agent/main.py | 10 +++++++--- .../sample-agent/mcp_tool_registration_service.py | 3 ++- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/python/google-adk/sample-agent/.env.template b/python/google-adk/sample-agent/.env.template index a5b06806..9f9a22e6 100644 --- a/python/google-adk/sample-agent/.env.template +++ b/python/google-adk/sample-agent/.env.template @@ -3,8 +3,6 @@ GOOGLE_GENAI_USE_VERTEXAI=FALSE GOOGLE_API_KEY=<> GEMINI_MODEL=gemini-2.5-flash -USE_AGENTIC_AUTH=true - # Agent365 Agentic Authentication Configuration CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=<> CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=<> diff --git a/python/google-adk/sample-agent/agent.py b/python/google-adk/sample-agent/agent.py index dc619581..23c6d61e 100644 --- a/python/google-adk/sample-agent/agent.py +++ b/python/google-adk/sample-agent/agent.py @@ -1,4 +1,5 @@ -# Copyright (c) Microsoft. All rights reserved. +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. import asyncio import os @@ -191,10 +192,12 @@ async def _initialize_agent(self, agent, auth, auth_handler_name, turn_context): bearer_token = os.getenv("BEARER_TOKEN", "") if bearer_token: try: - import base64, json as _json + from base64 import urlsafe_b64decode + import json as _json payload = bearer_token.split(".")[1] - payload += "=" * (4 - len(payload) % 4) - exp = _json.loads(base64.b64decode(payload)).get("exp", 0) + if len(payload) % 4 != 0: + payload += "=" * (4 - len(payload) % 4) + exp = _json.loads(urlsafe_b64decode(payload)).get("exp", 0) if exp and time.time() > exp: logger.warning("BEARER_TOKEN is expired — skipping token, will use auth handler") bearer_token = "" diff --git a/python/google-adk/sample-agent/main.py b/python/google-adk/sample-agent/main.py index 2e6cbc1d..7e93d3dc 100644 --- a/python/google-adk/sample-agent/main.py +++ b/python/google-adk/sample-agent/main.py @@ -1,4 +1,5 @@ -# Copyright (c) Microsoft. All rights reserved. +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. # Internal imports import os @@ -13,7 +14,6 @@ from microsoft_agents.hosting.core import AgentApplication, ClaimsIdentity, AuthenticationConstants from microsoft_agents.hosting.core.authorization import AgentAuthConfiguration from microsoft_agents.hosting.aiohttp import start_agent_process, jwt_authorization_middleware -from microsoft_agents.activity import load_configuration_from_env # Microsoft Agent 365 Observability Imports from microsoft_agents_a365.observability.core.config import configure @@ -30,7 +30,11 @@ def start_server(agent_app: AgentApplication): """Start the agent application server.""" - isProduction = os.getenv("WEBSITE_SITE_NAME") is not None + isProduction = ( + os.getenv("WEBSITE_SITE_NAME") is not None # Azure App Service + or os.getenv("K_SERVICE") is not None # GCP Cloud Run + or os.getenv("ENVIRONMENT", "").lower() == "production" # Explicit flag + ) async def entry_point(req: Request) -> Response: return await start_agent_process(req, agent_app, agent_app.adapter) diff --git a/python/google-adk/sample-agent/mcp_tool_registration_service.py b/python/google-adk/sample-agent/mcp_tool_registration_service.py index 4543365f..95516680 100644 --- a/python/google-adk/sample-agent/mcp_tool_registration_service.py +++ b/python/google-adk/sample-agent/mcp_tool_registration_service.py @@ -1,4 +1,5 @@ -# Copyright (c) Microsoft. All rights reserved. +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. from typing import Optional import logging From ee083f3f746c33de1be510be7067d55f909bbb5a Mon Sep 17 00:00:00 2001 From: biswapm Date: Wed, 1 Apr 2026 18:56:27 +0530 Subject: [PATCH 07/13] changes to use prod for AGENTIC_APP_ID --- nodejs/claude/sample-agent/package.json | 16 ++++++++-------- nodejs/claude/sample-agent/src/client.ts | 13 ++++++------- nodejs/langchain/sample-agent/package.json | 12 ++++++------ nodejs/langchain/sample-agent/src/client.ts | 12 ++++++------ nodejs/openai/sample-agent/package.json | 20 ++++++++++---------- nodejs/openai/sample-agent/src/client.ts | 13 ++++++------- nodejs/vercel-sdk/sample-agent/package.json | 8 +++++--- nodejs/vercel-sdk/sample-agent/src/client.ts | 15 +++++++-------- python/google-adk/sample-agent/main.py | 6 ++++-- 9 files changed, 58 insertions(+), 57 deletions(-) diff --git a/nodejs/claude/sample-agent/package.json b/nodejs/claude/sample-agent/package.json index aa44ad32..4a8b4945 100644 --- a/nodejs/claude/sample-agent/package.json +++ b/nodejs/claude/sample-agent/package.json @@ -16,15 +16,15 @@ "license": "MIT", "description": "", "dependencies": { - "@microsoft/agents-hosting": "^1.2.2", - "@microsoft/agents-activity": "^1.2.2", - "@microsoft/agents-a365-notifications": "^0.1.0-preview.30", - "@microsoft/agents-a365-observability": "^0.1.0-preview.30", - "@microsoft/agents-a365-runtime": "^0.1.0-preview.30", - "@microsoft/agents-a365-observability-hosting": "^0.1.0-preview.64", - "@microsoft/agents-a365-tooling": "^0.1.0-preview.30", - "@microsoft/agents-a365-tooling-extensions-claude": "^0.1.0-preview.30", "@anthropic-ai/claude-agent-sdk": "^0.1.1", + "@microsoft/agents-a365-notifications": "latest", + "@microsoft/agents-a365-observability": "latest", + "@microsoft/agents-a365-observability-hosting": "latest", + "@microsoft/agents-a365-runtime": "latest", + "@microsoft/agents-a365-tooling": "latest", + "@microsoft/agents-a365-tooling-extensions-claude": "latest", + "@microsoft/agents-activity": "^1.2.2", + "@microsoft/agents-hosting": "^1.2.2", "dotenv": "^17.2.2", "express": "^5.1.0" }, diff --git a/nodejs/claude/sample-agent/src/client.ts b/nodejs/claude/sample-agent/src/client.ts index 76350ee6..93bb9e34 100644 --- a/nodejs/claude/sample-agent/src/client.ts +++ b/nodejs/claude/sample-agent/src/client.ts @@ -13,8 +13,8 @@ import { Builder, InferenceOperationType, AgentDetails, - TenantDetails, InferenceDetails, + Request, Agent365ExporterOptions, } from '@microsoft/agents-a365-observability'; import { AgenticTokenCacheInstance } from '@microsoft/agents-a365-observability-hosting'; @@ -141,17 +141,16 @@ class ClaudeClient implements Client { model: this.config.model || "", }; - const agentDetails: AgentDetails = { - agentId: 'claude-travel-agent', - agentName: 'Claude Travel Agent', + const request: Request = { conversationId: 'conv-12345', }; - const tenantDetails: TenantDetails = { - tenantId: 'claude-sample-tenant', + const agentDetails: AgentDetails = { + agentId: 'claude-travel-agent', + agentName: 'Claude Travel Agent', }; - const scope = InferenceScope.start(inferenceDetails, agentDetails, tenantDetails); + const scope = InferenceScope.start(request, inferenceDetails, agentDetails); const response = await this.invokeAgent(prompt); diff --git a/nodejs/langchain/sample-agent/package.json b/nodejs/langchain/sample-agent/package.json index 346868fc..aa7b43fe 100644 --- a/nodejs/langchain/sample-agent/package.json +++ b/nodejs/langchain/sample-agent/package.json @@ -23,14 +23,14 @@ "@langchain/langgraph": "^1.0.2", "@langchain/mcp-adapters": "^1.0.0", "@langchain/openai": "^1.0.2", - "@microsoft/agents-a365-notifications": "^0.1.0-preview.30", - "@microsoft/agents-a365-observability": "^0.1.0-preview.30", - "@microsoft/agents-a365-runtime": "^0.1.0-preview.30", - "@microsoft/agents-a365-tooling": "^0.1.0-preview.30", - "@microsoft/agents-a365-tooling-extensions-langchain": "^0.1.0-preview.30", + "@microsoft/agents-a365-notifications": "latest", + "@microsoft/agents-a365-observability": "latest", + "@microsoft/agents-a365-observability-hosting": "latest", + "@microsoft/agents-a365-runtime": "latest", + "@microsoft/agents-a365-tooling": "latest", + "@microsoft/agents-a365-tooling-extensions-langchain": "latest", "@microsoft/agents-activity": "^1.2.2", "@microsoft/agents-hosting": "^1.2.2", - "@microsoft/agents-a365-observability-hosting": "^0.1.0-preview.64", "dotenv": "^17.2.3", "express": "^5.1.0", "langchain": "^1.0.1", diff --git a/nodejs/langchain/sample-agent/src/client.ts b/nodejs/langchain/sample-agent/src/client.ts index b24e5072..c18445a3 100644 --- a/nodejs/langchain/sample-agent/src/client.ts +++ b/nodejs/langchain/sample-agent/src/client.ts @@ -16,8 +16,8 @@ import { Builder, InferenceOperationType, AgentDetails, - TenantDetails, InferenceDetails, + Request, Agent365ExporterOptions, } from '@microsoft/agents-a365-observability'; import { AgenticTokenCacheInstance } from '@microsoft/agents-a365-observability-hosting'; @@ -209,18 +209,18 @@ class LangChainClient implements Client { model: "gpt-4o-mini", }; - const agentDetails: AgentDetails = { - agentId: this.turnContext?.activity?.recipient?.agenticAppId || agentName, - agentName: agentName, + const request: Request = { conversationId: this.turnContext?.activity?.conversation?.id || `conv-${Date.now()}`, }; - const tenantDetails: TenantDetails = { + const agentDetails: AgentDetails = { + agentId: this.turnContext?.activity?.recipient?.agenticAppId || agentName, + agentName: agentName, tenantId: this.turnContext?.activity?.recipient?.tenantId || 'sample-tenant', }; let response = ''; - const scope = InferenceScope.start(inferenceDetails, agentDetails, tenantDetails); + const scope = InferenceScope.start(request, inferenceDetails, agentDetails); try { await scope.withActiveSpanAsync(async () => { response = await this.invokeAgent(prompt); diff --git a/nodejs/openai/sample-agent/package.json b/nodejs/openai/sample-agent/package.json index a07a3777..fd41fa32 100644 --- a/nodejs/openai/sample-agent/package.json +++ b/nodejs/openai/sample-agent/package.json @@ -15,19 +15,19 @@ "license": "MIT", "description": "", "dependencies": { - "@microsoft/agents-hosting": "^1.2.2", + "@microsoft/agents-a365-notifications": "latest", + "@microsoft/agents-a365-observability": "latest", + "@microsoft/agents-a365-observability-extensions-openai": "latest", + "@microsoft/agents-a365-observability-hosting": "latest", + "@microsoft/agents-a365-runtime": "latest", + "@microsoft/agents-a365-tooling": "latest", + "@microsoft/agents-a365-tooling-extensions-openai": "latest", "@microsoft/agents-activity": "^1.2.2", - "@microsoft/agents-a365-notifications": "^0.1.0-preview.30", - "@microsoft/agents-a365-observability": "^0.1.0-preview.30", - "@microsoft/agents-a365-runtime": "^0.1.0-preview.30", - "@microsoft/agents-a365-observability-hosting": "^0.1.0-preview.64", - "@microsoft/agents-a365-tooling": "^0.1.0-preview.30", - "@microsoft/agents-a365-tooling-extensions-openai": "^0.1.0-preview.30", - "@microsoft/agents-a365-observability-extensions-openai": "^0.1.0-preview.30", + "@microsoft/agents-hosting": "^1.2.2", "@openai/agents": "^0.1.11", - "openai": "^4.77.0", "dotenv": "^17.2.2", - "express": "^5.1.0" + "express": "^5.1.0", + "openai": "^4.77.0" }, "devDependencies": { "@microsoft/m365agentsplayground": "^0.2.18", diff --git a/nodejs/openai/sample-agent/src/client.ts b/nodejs/openai/sample-agent/src/client.ts index 428e9fbf..a59d3248 100644 --- a/nodejs/openai/sample-agent/src/client.ts +++ b/nodejs/openai/sample-agent/src/client.ts @@ -22,8 +22,8 @@ import { Builder, InferenceOperationType, AgentDetails, - TenantDetails, InferenceDetails, + Request, Agent365ExporterOptions, } from '@microsoft/agents-a365-observability'; import { OpenAIAgentsTraceInstrumentor } from '@microsoft/agents-a365-observability-extensions-openai'; @@ -147,17 +147,16 @@ class OpenAIClient implements Client { model: this.agent.model.toString(), }; + const request: Request = { + conversationId: 'conv-12345', + }; + const agentDetails: AgentDetails = { agentId: 'typescript-compliance-agent', agentName: 'TypeScript Compliance Agent', - conversationId: 'conv-12345', }; - const tenantDetails: TenantDetails = { - tenantId: 'typescript-sample-tenant', - }; - - const scope = InferenceScope.start(inferenceDetails, agentDetails, tenantDetails); + const scope = InferenceScope.start(request, inferenceDetails, agentDetails); try { await scope.withActiveSpanAsync(async () => { try { diff --git a/nodejs/vercel-sdk/sample-agent/package.json b/nodejs/vercel-sdk/sample-agent/package.json index 52bd2a27..57e627fb 100644 --- a/nodejs/vercel-sdk/sample-agent/package.json +++ b/nodejs/vercel-sdk/sample-agent/package.json @@ -20,9 +20,11 @@ "license": "MIT", "dependencies": { "@ai-sdk/anthropic": "^2.0.31", - "@microsoft/agents-a365-notifications": "^0.1.0-preview.30", - "@microsoft/agents-a365-observability": "^0.1.0-preview.30", - "@microsoft/agents-a365-runtime": "^0.1.0-preview.30", + "@microsoft/agents-a365-notifications": "latest", + "@microsoft/agents-a365-observability": "latest", + "@microsoft/agents-a365-observability-hosting": "latest", + "@microsoft/agents-a365-runtime": "latest", + "@microsoft/agents-a365-tooling": "latest", "@microsoft/agents-activity": "^1.1.0-alpha.85", "@microsoft/agents-hosting": "^1.1.0-alpha.85", "ai": "^5.0.72", diff --git a/nodejs/vercel-sdk/sample-agent/src/client.ts b/nodejs/vercel-sdk/sample-agent/src/client.ts index 039ae416..a727e9f5 100644 --- a/nodejs/vercel-sdk/sample-agent/src/client.ts +++ b/nodejs/vercel-sdk/sample-agent/src/client.ts @@ -12,8 +12,8 @@ import { Builder, InferenceOperationType, AgentDetails, - TenantDetails, - InferenceDetails + InferenceDetails, + Request } from '@microsoft/agents-a365-observability'; const modelName = 'claude-sonnet-4-20250514'; @@ -104,18 +104,17 @@ class VercelAiClient implements Client { model: modelName, }; - const agentDetails: AgentDetails = { - agentId: 'vercel-ai-sdk-agent', - agentName: 'Vercel AI SDK Agent', + const request: Request = { conversationId: 'conv-12345', }; - const tenantDetails: TenantDetails = { - tenantId: 'vercel-ai-sdk-sample-agent', + const agentDetails: AgentDetails = { + agentId: 'vercel-ai-sdk-agent', + agentName: 'Vercel AI SDK Agent', }; let response = ''; - const scope = InferenceScope.start(inferenceDetails, agentDetails, tenantDetails); + const scope = InferenceScope.start(request, inferenceDetails, agentDetails); try { await scope.withActiveSpanAsync(async () => { try { diff --git a/python/google-adk/sample-agent/main.py b/python/google-adk/sample-agent/main.py index 2e6cbc1d..bd80bae9 100644 --- a/python/google-adk/sample-agent/main.py +++ b/python/google-adk/sample-agent/main.py @@ -54,11 +54,13 @@ async def anonymous_claims(request, handler): # direct CLIENT_ID / TENANT_ID / CLIENT_SECRET vars as fallback. agent_auth_config = None client_id = ( - os.getenv("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID") + os.getenv("AGENTIC_APP_ID") + or os.getenv("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID") or os.getenv("CLIENT_ID") ) tenant_id = ( - os.getenv("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID") + os.getenv("AGENTIC_TENANT_ID") + or os.getenv("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID") or os.getenv("TENANT_ID") ) client_secret = ( From 46a87ddbcf0ec633a2b0c725ad062ed4b16788c5 Mon Sep 17 00:00:00 2001 From: biswapm Date: Wed, 1 Apr 2026 19:07:03 +0530 Subject: [PATCH 08/13] package.json changes --- nodejs/claude/sample-agent/package.json | 12 ++++++------ nodejs/langchain/sample-agent/package.json | 12 ++++++------ nodejs/openai/sample-agent/package.json | 14 +++++++------- nodejs/vercel-sdk/sample-agent/package.json | 10 +++++----- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/nodejs/claude/sample-agent/package.json b/nodejs/claude/sample-agent/package.json index 4a8b4945..00e58a49 100644 --- a/nodejs/claude/sample-agent/package.json +++ b/nodejs/claude/sample-agent/package.json @@ -17,12 +17,12 @@ "description": "", "dependencies": { "@anthropic-ai/claude-agent-sdk": "^0.1.1", - "@microsoft/agents-a365-notifications": "latest", - "@microsoft/agents-a365-observability": "latest", - "@microsoft/agents-a365-observability-hosting": "latest", - "@microsoft/agents-a365-runtime": "latest", - "@microsoft/agents-a365-tooling": "latest", - "@microsoft/agents-a365-tooling-extensions-claude": "latest", + "@microsoft/agents-a365-notifications": "^0.1.0-preview.125", + "@microsoft/agents-a365-observability": "^0.1.0-preview.125", + "@microsoft/agents-a365-observability-hosting": "^0.1.0-preview.125", + "@microsoft/agents-a365-runtime": "^0.1.0-preview.125", + "@microsoft/agents-a365-tooling": "^0.1.0-preview.125", + "@microsoft/agents-a365-tooling-extensions-claude": "^0.1.0-preview.125", "@microsoft/agents-activity": "^1.2.2", "@microsoft/agents-hosting": "^1.2.2", "dotenv": "^17.2.2", diff --git a/nodejs/langchain/sample-agent/package.json b/nodejs/langchain/sample-agent/package.json index aa7b43fe..b0717bcb 100644 --- a/nodejs/langchain/sample-agent/package.json +++ b/nodejs/langchain/sample-agent/package.json @@ -23,12 +23,12 @@ "@langchain/langgraph": "^1.0.2", "@langchain/mcp-adapters": "^1.0.0", "@langchain/openai": "^1.0.2", - "@microsoft/agents-a365-notifications": "latest", - "@microsoft/agents-a365-observability": "latest", - "@microsoft/agents-a365-observability-hosting": "latest", - "@microsoft/agents-a365-runtime": "latest", - "@microsoft/agents-a365-tooling": "latest", - "@microsoft/agents-a365-tooling-extensions-langchain": "latest", + "@microsoft/agents-a365-notifications": "^0.1.0-preview.125", + "@microsoft/agents-a365-observability": "^0.1.0-preview.125", + "@microsoft/agents-a365-observability-hosting": "^0.1.0-preview.125", + "@microsoft/agents-a365-runtime": "^0.1.0-preview.125", + "@microsoft/agents-a365-tooling": "^0.1.0-preview.125", + "@microsoft/agents-a365-tooling-extensions-langchain": "^0.1.0-preview.125", "@microsoft/agents-activity": "^1.2.2", "@microsoft/agents-hosting": "^1.2.2", "dotenv": "^17.2.3", diff --git a/nodejs/openai/sample-agent/package.json b/nodejs/openai/sample-agent/package.json index fd41fa32..89df73ed 100644 --- a/nodejs/openai/sample-agent/package.json +++ b/nodejs/openai/sample-agent/package.json @@ -15,13 +15,13 @@ "license": "MIT", "description": "", "dependencies": { - "@microsoft/agents-a365-notifications": "latest", - "@microsoft/agents-a365-observability": "latest", - "@microsoft/agents-a365-observability-extensions-openai": "latest", - "@microsoft/agents-a365-observability-hosting": "latest", - "@microsoft/agents-a365-runtime": "latest", - "@microsoft/agents-a365-tooling": "latest", - "@microsoft/agents-a365-tooling-extensions-openai": "latest", + "@microsoft/agents-a365-notifications": "^0.1.0-preview.125", + "@microsoft/agents-a365-observability": "^0.1.0-preview.125", + "@microsoft/agents-a365-observability-extensions-openai": "^0.1.0-preview.125", + "@microsoft/agents-a365-observability-hosting": "^0.1.0-preview.125", + "@microsoft/agents-a365-runtime": "^0.1.0-preview.125", + "@microsoft/agents-a365-tooling": "^0.1.0-preview.125", + "@microsoft/agents-a365-tooling-extensions-openai": "^0.1.0-preview.125", "@microsoft/agents-activity": "^1.2.2", "@microsoft/agents-hosting": "^1.2.2", "@openai/agents": "^0.1.11", diff --git a/nodejs/vercel-sdk/sample-agent/package.json b/nodejs/vercel-sdk/sample-agent/package.json index 57e627fb..69a48a93 100644 --- a/nodejs/vercel-sdk/sample-agent/package.json +++ b/nodejs/vercel-sdk/sample-agent/package.json @@ -20,11 +20,11 @@ "license": "MIT", "dependencies": { "@ai-sdk/anthropic": "^2.0.31", - "@microsoft/agents-a365-notifications": "latest", - "@microsoft/agents-a365-observability": "latest", - "@microsoft/agents-a365-observability-hosting": "latest", - "@microsoft/agents-a365-runtime": "latest", - "@microsoft/agents-a365-tooling": "latest", + "@microsoft/agents-a365-notifications": "^0.1.0-preview.125", + "@microsoft/agents-a365-observability": "^0.1.0-preview.125", + "@microsoft/agents-a365-observability-hosting": "^0.1.0-preview.125", + "@microsoft/agents-a365-runtime": "^0.1.0-preview.125", + "@microsoft/agents-a365-tooling": "^0.1.0-preview.125", "@microsoft/agents-activity": "^1.1.0-alpha.85", "@microsoft/agents-hosting": "^1.1.0-alpha.85", "ai": "^5.0.72", From dfd1a903d2cf03838101a568f626df207eaaa5da Mon Sep 17 00:00:00 2001 From: biswapm Date: Thu, 2 Apr 2026 15:30:03 +0530 Subject: [PATCH 09/13] updated config value parameter --- python/google-adk/sample-agent/.env.template | 15 ++++++ python/google-adk/sample-agent/README.md | 52 +++++++++++++------- 2 files changed, 48 insertions(+), 19 deletions(-) diff --git a/python/google-adk/sample-agent/.env.template b/python/google-adk/sample-agent/.env.template index 9f9a22e6..45eb731c 100644 --- a/python/google-adk/sample-agent/.env.template +++ b/python/google-adk/sample-agent/.env.template @@ -4,6 +4,15 @@ GOOGLE_API_KEY=<> GEMINI_MODEL=gemini-2.5-flash # Agent365 Agentic Authentication Configuration +# These values come from running `a365 setup all`. After setup, find them in: +# a365.generated.config.json — produced automatically by the CLI (do not commit to source control) +# a365.config.json — your input configuration +# +# Variable mapping: +# CLIENTID => a365.generated.config.json: agentBlueprintId +# CLIENTSECRET => a365.generated.config.json: agentBlueprintClientSecret (decrypted via `a365 config display -g`) +# TENANTID => a365.config.json: tenantId +# SCOPES => a365.generated.config.json: agentBlueprintId + "/.default" CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=<> CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=<> CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=<> @@ -17,6 +26,12 @@ CONNECTIONSMAP__0__SERVICEURL=* CONNECTIONSMAP__0__CONNECTION=SERVICE_CONNECTION # Agent Identity (from the A365 portal / blueprint) +# Variable mapping: +# AGENTIC_UPN => a365.config.json: agentUserPrincipalName +# AGENTIC_NAME => a365.config.json: agentUserDisplayName +# AGENTIC_USER_ID => a365.generated.config.json: AgenticUserId (populated after Teams admin approves the agent instance) +# AGENTIC_APP_ID => a365.generated.config.json: agentBlueprintId +# AGENTIC_TENANT_ID => a365.config.json: tenantId AGENTIC_UPN=<> AGENTIC_NAME=<> AGENTIC_USER_ID=<> diff --git a/python/google-adk/sample-agent/README.md b/python/google-adk/sample-agent/README.md index 79badbb4..c70a4483 100644 --- a/python/google-adk/sample-agent/README.md +++ b/python/google-adk/sample-agent/README.md @@ -59,6 +59,16 @@ AUTH_HANDLER_NAME= # leave empty for Playground/local dev ### 3. Initialize A365 configuration +The fastest way is the **AI-guided setup** — attach the instruction file to GitHub Copilot Chat (agent mode) and it walks you through every step automatically: + +``` +Follow the steps in #file:a365-setup-instructions.md +``` + +> See [AI-guided setup for Agent 365](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/ai-guided-setup) for full instructions and to download `a365-setup-instructions.md`. + +Alternatively, run the CLI manually: + ```bash a365 config init ``` @@ -223,25 +233,29 @@ python main.py ### Configure Application Settings -The `.env` file is **not** deployed. Set all variables as Azure App Service Application Settings: - -| Key | Value | -|-----|-------| -| `GOOGLE_API_KEY` | Your Google API key | -| `GOOGLE_GENAI_USE_VERTEXAI` | `FALSE` | -| `GEMINI_MODEL` | `gemini-2.5-flash` | -| `CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID` | App registration client ID | -| `CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET` | Client secret | -| `CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID` | Tenant ID | -| `CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPES` | `/.default` | -| `AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__AGENTIC__SETTINGS__TYPE` | `AgenticUserAuthorization` | -| `AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__AGENTIC__SETTINGS__SCOPES` | `https://graph.microsoft.com/.default` | -| `AUTH_HANDLER_NAME` | `AGENTIC` | -| `AGENTIC_APP_ID` | Agent app ID from A365 portal | -| `AGENTIC_TENANT_ID` | Tenant ID | -| `AGENTIC_USER_ID` | Agent user ID from A365 portal | -| `ENABLE_OBSERVABILITY` | `true` | -| `OBSERVABILITY_SERVICE_NAME` | `GoogleADKSampleAgent` | +The `.env` file is **not** deployed. Set all variables as Azure App Service Application Settings. + +All values below come from `a365.config.json` and `a365.generated.config.json` (produced by `a365 setup all`). Run `a365 config display -g` to view the decrypted generated values. + +| Key | Source | Value | +|-----|--------|-------| +| `GOOGLE_API_KEY` | Google AI Studio | Your Google API key | +| `GOOGLE_GENAI_USE_VERTEXAI` | — | `FALSE` | +| `GEMINI_MODEL` | — | `gemini-2.5-flash` | +| `CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID` | `a365.generated.config.json` → `agentBlueprintId` | Blueprint App ID | +| `CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET` | `a365.generated.config.json` → `agentBlueprintClientSecret` | Blueprint client secret | +| `CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID` | `a365.config.json` → `tenantId` | Azure tenant ID | +| `CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPES` | `a365.generated.config.json` → `agentBlueprintId` + `/.default` | `/.default` | +| `AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__AGENTIC__SETTINGS__TYPE` | — | `AgenticUserAuthorization` | +| `AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__AGENTIC__SETTINGS__SCOPES` | — | `https://graph.microsoft.com/.default` | +| `AUTH_HANDLER_NAME` | — | `AGENTIC` | +| `AGENTIC_UPN` | `a365.config.json` → `agentUserPrincipalName` | Agent user principal name | +| `AGENTIC_NAME` | `a365.config.json` → `agentUserDisplayName` | Agent display name | +| `AGENTIC_APP_ID` | `a365.generated.config.json` → `agentBlueprintId` | Blueprint App ID | +| `AGENTIC_TENANT_ID` | `a365.config.json` → `tenantId` | Azure tenant ID | +| `AGENTIC_USER_ID` | `a365.generated.config.json` → `AgenticUserId` | Populated after Teams admin approves the agent instance | +| `ENABLE_OBSERVABILITY` | — | `true` | +| `OBSERVABILITY_SERVICE_NAME` | — | `GoogleADKSampleAgent` | ### Running on GCP (Cloud Run) From 27928e8c20213f1b67fccd09847f4957bad09754 Mon Sep 17 00:00:00 2001 From: biswapm Date: Thu, 2 Apr 2026 16:26:53 +0530 Subject: [PATCH 10/13] mcp tools changes to work local --- .../sample-agent/mcp_tool_registration_service.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/python/google-adk/sample-agent/mcp_tool_registration_service.py b/python/google-adk/sample-agent/mcp_tool_registration_service.py index 95516680..9e50ea83 100644 --- a/python/google-adk/sample-agent/mcp_tool_registration_service.py +++ b/python/google-adk/sample-agent/mcp_tool_registration_service.py @@ -75,9 +75,15 @@ async def add_tool_servers_to_agent( } for server_config in mcp_server_configs: + if not server_config.url: + self._logger.warning( + "Skipping MCP server '%s' — no URL configured (dev mode or manifest-only config).", + server_config.mcp_server_unique_name, + ) + continue server_info = McpToolset( connection_params=StreamableHTTPConnectionParams( - url=server_config.mcp_server_unique_name, + url=server_config.url, headers=mcp_server_headers ) ) From df3f73ff757cff5e874e3d920d0854fdb53518c5 Mon Sep 17 00:00:00 2001 From: biswapm Date: Fri, 3 Apr 2026 18:17:37 +0530 Subject: [PATCH 11/13] updated readme --- python/google-adk/sample-agent/README.md | 61 ++++++++++++++++++++---- 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/python/google-adk/sample-agent/README.md b/python/google-adk/sample-agent/README.md index c70a4483..71c73af3 100644 --- a/python/google-adk/sample-agent/README.md +++ b/python/google-adk/sample-agent/README.md @@ -296,23 +296,64 @@ See [Configure messaging endpoint](https://learn.microsoft.com/en-us/microsoft-a --- -## After Publishing — Configure in Teams Developer Portal +## After Publishing — Post-Deployment Steps -After running `a365 publish`, configure the agent blueprint in the Teams Developer Portal so it can receive messages from Teams and Microsoft 365: +After `a365 deploy` and `a365 publish` complete, the following steps require browser interaction and cannot be automated by the CLI. -1. Get your blueprint ID: +### Step 1: Configure in Teams Developer Portal -```bash -a365 config display -g -``` +1. Get your blueprint App ID: + ```bash + a365 config display -g + ``` + Copy the `agentBlueprintId` value from the output. -2. Open `https://dev.teams.microsoft.com/tools/agent-blueprint//configuration` -3. Set **Agent Type** to **API Based** -4. Set **Notification URL** to your messaging endpoint -5. Click **Save** and wait 5–10 minutes for propagation +2. Open your blueprint configuration page: + ``` + https://dev.teams.microsoft.com/tools/agent-blueprint//configuration + ``` + +3. Set **Agent Type** to `Bot Based` +4. Set **Bot ID** to your `agentBlueprintId` +5. Click **Save** > See [Configure agent in Teams Developer Portal](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/create-instance#1-configure-agent-in-teams-developer-portal) and [Publish agent](https://learn.microsoft.com/en-us/microsoft-agent-365/developer/publish) for full instructions. +### Step 2: Upload manifest to M365 Admin Center + +1. Go to [https://admin.microsoft.com](https://admin.microsoft.com) > **Agents** > **All agents** > **Upload custom agent** +2. Upload `manifest/manifest.zip` (created by `a365 publish`) + +### Step 3: Create agent instance + +1. In Microsoft Teams, go to **Apps** and search for your agent name +2. Select your agent and click **Request Instance** +3. A tenant admin must approve the request at: + ``` + https://admin.cloud.microsoft/#/agents/all/requested + ``` + +### Step 4: Update AGENTIC_USER_ID after approval + +Once the admin approves the agent instance, the agent user is created. Update `AGENTIC_USER_ID` in two places: + +1. Find the value in `a365.generated.config.json` → `AgenticUserId` + +2. Update `.env`: + ```env + AGENTIC_USER_ID= + ``` + +3. Update the Azure App Service Application Setting: + ```bash + az webapp config appsettings set \ + --name gemini-buddy-agent-webapp \ + --resource-group AgentSDKTestRG \ + --settings AGENTIC_USER_ID= + ``` + +> **Note:** The agent user creation is asynchronous — it can take a few minutes to a few hours to become searchable in Teams after the instance is approved. + --- ## Configuration Reference From 6b3bd1983c0f77894c9ef63cef51a453a03e7ac6 Mon Sep 17 00:00:00 2001 From: Grant Harris Date: Fri, 3 Apr 2026 13:57:37 -0700 Subject: [PATCH 12/13] fixes for deployed version --- python/google-adk/sample-agent/.env.template | 89 +++++++++++++------ python/google-adk/sample-agent/main.py | 25 +++++- python/google-adk/sample-agent/pyproject.toml | 2 +- 3 files changed, 85 insertions(+), 31 deletions(-) diff --git a/python/google-adk/sample-agent/.env.template b/python/google-adk/sample-agent/.env.template index 45eb731c..0acf1adf 100644 --- a/python/google-adk/sample-agent/.env.template +++ b/python/google-adk/sample-agent/.env.template @@ -1,59 +1,96 @@ +# ============================================================================= +# Google ADK Sample Agent — Environment Configuration +# ============================================================================= +# Copy this file to .env and fill in your values: +# cp .env.template .env +# +# All values marked <<...>> MUST be replaced before the agent will work. +# Run `a365 config init` first — it generates the config files referenced below. +# ============================================================================= + +# ----------------------------------------------------------------------------- # Google Gemini Configuration +# ----------------------------------------------------------------------------- GOOGLE_GENAI_USE_VERTEXAI=FALSE GOOGLE_API_KEY=<> GEMINI_MODEL=gemini-2.5-flash -# Agent365 Agentic Authentication Configuration -# These values come from running `a365 setup all`. After setup, find them in: -# a365.generated.config.json — produced automatically by the CLI (do not commit to source control) -# a365.config.json — your input configuration +# ----------------------------------------------------------------------------- +# Agent365 Service Connection (OAuth client credentials) +# ----------------------------------------------------------------------------- +# These values authenticate your agent with the Bot Framework and Agent 365. +# +# Where to find them (after running `a365 config init`): +# CLIENTID => a365.generated.config.json → agentBlueprintId +# CLIENTSECRET => a365.generated.config.json → agentBlueprintClientSecret +# TENANTID => a365.config.json → tenantId # -# Variable mapping: -# CLIENTID => a365.generated.config.json: agentBlueprintId -# CLIENTSECRET => a365.generated.config.json: agentBlueprintClientSecret (decrypted via `a365 config display -g`) -# TENANTID => a365.config.json: tenantId -# SCOPES => a365.generated.config.json: agentBlueprintId + "/.default" -CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=<> -CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=<> +# IMPORTANT — Client Secret: +# The a365.generated.config.json stores the secret encrypted with Windows DPAPI. +# Use `a365 config display -g` to view the decrypted secret, and copy it here. +# +# IMPORTANT — Client ID and JWT Audience: +# CLIENTID is the blueprint/app-registration ID. Bot Framework tokens are issued +# with aud=CLIENTID, so this value is also used for JWT audience validation. +CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=<> +CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=<> CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=<> -CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPES=<>/.default +CONNECTIONS__SERVICE_CONNECTION__SETTINGS__SCOPES=5a807f24-c9de-44ee-a3a7-329e88a00ffc/.default +# Agentic user-authorization handler settings (do not change these defaults) AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__AGENTIC__SETTINGS__TYPE=AgenticUserAuthorization AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__AGENTIC__SETTINGS__SCOPES=https://graph.microsoft.com/.default AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__AGENTIC__SETTINGS__ALTERNATEBLUEPRINTCONNECTIONNAME=https://graph.microsoft.com/.default +# Connection map (do not change) CONNECTIONSMAP__0__SERVICEURL=* CONNECTIONSMAP__0__CONNECTION=SERVICE_CONNECTION -# Agent Identity (from the A365 portal / blueprint) -# Variable mapping: -# AGENTIC_UPN => a365.config.json: agentUserPrincipalName -# AGENTIC_NAME => a365.config.json: agentUserDisplayName -# AGENTIC_USER_ID => a365.generated.config.json: AgenticUserId (populated after Teams admin approves the agent instance) -# AGENTIC_APP_ID => a365.generated.config.json: agentBlueprintId -# AGENTIC_TENANT_ID => a365.config.json: tenantId +# ----------------------------------------------------------------------------- +# Agent Identity +# ----------------------------------------------------------------------------- +# These identify your agent in the Agent 365 ecosystem. +# +# Where to find them: +# AGENTIC_UPN => a365.config.json → agentUserPrincipalName +# AGENTIC_NAME => a365.config.json → agentUserDisplayName +# AGENTIC_USER_ID => a365.generated.config.json → AgenticUserId +# AGENTIC_APP_ID => a365.generated.config.json → AgenticAppId +# AGENTIC_TENANT_ID => a365.config.json → tenantId +# +# NOTE: AGENTIC_APP_ID is the agentic app ID, which is different from the +# blueprint ID (CLIENTID above). Do not use AGENTIC_APP_ID for JWT validation. AGENTIC_UPN=<> AGENTIC_NAME=<> AGENTIC_USER_ID=<> AGENTIC_APP_ID=<> AGENTIC_TENANT_ID=<> +# ----------------------------------------------------------------------------- +# Local Development +# ----------------------------------------------------------------------------- # Bearer token for local dev / Playground — obtain with: a365 develop get-token -o raw # Leave empty to run in bare LLM mode (no MCP tools) BEARER_TOKEN= -# Authentication Handler Configuration -# Set to "AGENTIC" for production agentic auth, or leave empty for Playground/local dev +# Authentication handler: +# "AGENTIC" — production (Teams / Azure deployment). Enforces agentic auth on message handlers. +# "" — local dev / Agents Playground. Allows anonymous access. AUTH_HANDLER_NAME= -# Logging -LOG_LEVEL=INFO - -# Server Configuration -# Local dev: 3978 — Azure App Service / GCP Cloud Run: port is injected automatically by the platform (typically 8000) +# ----------------------------------------------------------------------------- +# Server +# ----------------------------------------------------------------------------- +# Port for the aiohttp server. +# Local dev default: 3978. Azure App Service injects PORT automatically. PORT=3978 +# Logging level: DEBUG, INFO, WARNING, ERROR +LOG_LEVEL=INFO + +# ----------------------------------------------------------------------------- # Observability +# ----------------------------------------------------------------------------- ENABLE_OBSERVABILITY=true ENABLE_A365_OBSERVABILITY_EXPORTER=false PYTHON_ENVIRONMENT=development diff --git a/python/google-adk/sample-agent/main.py b/python/google-adk/sample-agent/main.py index d502f21c..509627d4 100644 --- a/python/google-adk/sample-agent/main.py +++ b/python/google-adk/sample-agent/main.py @@ -56,11 +56,13 @@ async def anonymous_claims(request, handler): # attribute access (.TENANT_ID, .ANONYMOUS_ALLOWED), not a plain dict. # Read from CONNECTIONS__SERVICE_CONNECTION__SETTINGS__* (A365 format) or # direct CLIENT_ID / TENANT_ID / CLIENT_SECRET vars as fallback. + # IMPORTANT: client_id for JWT validation must be the blueprint/app-registration ID + # (CLIENTID), NOT the AGENTIC_APP_ID. Bot Framework tokens have aud=blueprint ID. agent_auth_config = None client_id = ( - os.getenv("AGENTIC_APP_ID") - or os.getenv("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID") + os.getenv("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID") or os.getenv("CLIENT_ID") + or os.getenv("AGENTIC_APP_ID") ) tenant_id = ( os.getenv("AGENTIC_TENANT_ID") @@ -84,13 +86,28 @@ async def anonymous_claims(request, handler): else: logger.info("No auth credentials found — running in anonymous mode") + # Wrap JWT middleware so it only applies to POST /api/messages. + # Azure App Service sends health probes (GET /robots933456.txt, GET /) + # that must return 200 without authentication. + @web_middleware + async def selective_jwt_auth(request, handler): + if request.method == "POST" and request.path == "/api/messages": + return await jwt_authorization_middleware(request, handler) + return await handler(request) + middlewares = [anonymous_claims] if agent_auth_config and isProduction: - middlewares.append(jwt_authorization_middleware) - logger.info("JWT authorization middleware enabled") + middlewares.append(selective_jwt_auth) + logger.info("JWT authorization middleware enabled (POST /api/messages only)") + + # Health / readiness endpoint — returns 200 for Azure App Service probes. + async def health_check(req: Request) -> Response: + return Response(text="OK", status=200) # Configure App app = Application(middlewares=middlewares) + app.router.add_get("/", health_check) + app.router.add_get("/robots933456.txt", health_check) app.router.add_post("/api/messages", entry_point) app["agent_configuration"] = agent_auth_config diff --git a/python/google-adk/sample-agent/pyproject.toml b/python/google-adk/sample-agent/pyproject.toml index 286cc813..ed548b6c 100644 --- a/python/google-adk/sample-agent/pyproject.toml +++ b/python/google-adk/sample-agent/pyproject.toml @@ -7,7 +7,7 @@ authors = [ ] dependencies = [ # Google ADK -- official package - "google-adk", + "google-adk>=1.18.0", # Microsoft Agents SDK - Official packages for hosting and integration "microsoft-agents-hosting-aiohttp", From c4bef898734f2ed5091644c5a097192f990b1753 Mon Sep 17 00:00:00 2001 From: biswapm Date: Mon, 6 Apr 2026 21:38:27 +0530 Subject: [PATCH 13/13] update for GCP use --- python/google-adk/sample-agent/.env.template | 4 +++- python/google-adk/sample-agent/main.py | 16 ++++++++++++++- python/google-adk/sample-agent/pyproject.toml | 20 +++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/python/google-adk/sample-agent/.env.template b/python/google-adk/sample-agent/.env.template index 0acf1adf..fe39cd21 100644 --- a/python/google-adk/sample-agent/.env.template +++ b/python/google-adk/sample-agent/.env.template @@ -14,7 +14,9 @@ GOOGLE_GENAI_USE_VERTEXAI=FALSE GOOGLE_API_KEY=<> GEMINI_MODEL=gemini-2.5-flash - +GOOGLE_CLOUD_PROJECT=<> +GOOGLE_CLOUD_LOCATION=<> +GOOGLE_GENAI_USE_VERTEXAI=TRUE # ----------------------------------------------------------------------------- # Agent365 Service Connection (OAuth client credentials) # ----------------------------------------------------------------------------- diff --git a/python/google-adk/sample-agent/main.py b/python/google-adk/sample-agent/main.py index 509627d4..d3378700 100644 --- a/python/google-adk/sample-agent/main.py +++ b/python/google-adk/sample-agent/main.py @@ -113,7 +113,21 @@ async def health_check(req: Request) -> Response: try: host = "0.0.0.0" if isProduction else "localhost" - port = int(os.getenv("PORT", 3978)) + + # PORT environment variable is optional - defaults to 3978 for local dev + # Azure App Service automatically sets PORT=8000 + port_str = os.getenv("PORT") + if port_str: + try: + port = int(port_str) + logger.info("Using PORT from environment: %d", port) + except ValueError: + logger.warning("Invalid PORT value '%s', using default 3978", port_str) + port = 3978 + else: + port = 3978 + logger.info("PORT not set, using default: %d", port) + logger.info("Listening on %s:%d/api/messages", host, port) run_app(app, host=host, port=port, handle_signals=True) except KeyboardInterrupt: diff --git a/python/google-adk/sample-agent/pyproject.toml b/python/google-adk/sample-agent/pyproject.toml index ed548b6c..a95436f2 100644 --- a/python/google-adk/sample-agent/pyproject.toml +++ b/python/google-adk/sample-agent/pyproject.toml @@ -50,6 +50,26 @@ default = true # This ensures we always get the latest features and fixes [tool.uv] prerelease = "allow" +# Overrides to resolve conflicts between google-adk and agent-framework-core: +# - google-adk requires opentelemetry-sdk<1.39.0 +# - agent-framework-core requires opentelemetry-sdk>=1.39.0 +# google-adk is the binding constraint; the otel API is stable across these versions. +# Also overrides gradio's outdated pydantic upper bound and old ruff pin. +override-dependencies = [ + # Pin entire otel stack to 1.38.x — google-adk requires sdk<1.39.0 + # and all otel packages must be on the same minor version. + "opentelemetry-api>=1.38.0,<1.39.0", + "opentelemetry-sdk>=1.38.0,<1.39.0", + "opentelemetry-exporter-otlp>=1.38.0,<1.39.0", + "opentelemetry-exporter-otlp-proto-http>=1.38.0,<1.39.0", + "opentelemetry-exporter-otlp-proto-grpc>=1.38.0,<1.39.0", + "opentelemetry-exporter-otlp-proto-common>=1.38.0,<1.39.0", + "opentelemetry-proto>=1.38.0,<1.39.0", + "opentelemetry-semantic-conventions>=0.59b0,<0.60b0", + "opentelemetry-instrumentation>=0.59b0,<0.60b0", + "pydantic>=2.0.0", + "ruff>=0.9.3", +] [project.optional-dependencies] dev = [