From c99ea384d1553e7cedc1c854d6a03d65b111ae71 Mon Sep 17 00:00:00 2001 From: Jonathan Segev Date: Thu, 28 May 2026 11:56:29 -0400 Subject: [PATCH 1/3] Add automated issue labeling workflow Adds three independent labelers that run in parallel on issue open/edit: - area: classifies by technical subsystem (area-provider, area-mcp, etc.) - type: classifies as bug/enhancement/question/chore - language: identifies python vs typescript Uses the shared issue-labeler action from devtools which validates LLM output against the hardcoded label allowlists in .github/labelers/. --- .github/labelers/area.yml | 42 ++++++++++++++++++++++ .github/labelers/language.yml | 15 ++++++++ .github/labelers/type.yml | 18 ++++++++++ .github/workflows/issue-labeler.yml | 55 +++++++++++++++++++++++++++++ 4 files changed, 130 insertions(+) create mode 100644 .github/labelers/area.yml create mode 100644 .github/labelers/language.yml create mode 100644 .github/labelers/type.yml create mode 100644 .github/workflows/issue-labeler.yml diff --git a/.github/labelers/area.yml b/.github/labelers/area.yml new file mode 100644 index 0000000000..e7062ea8e0 --- /dev/null +++ b/.github/labelers/area.yml @@ -0,0 +1,42 @@ +# .github/labelers/area.yml +# Classifies issues by technical area/subsystem. + +instructions: | + This is the Strands Agents SDK repository (Python + TypeScript monorepo). + CI dependency bumps (dependabot, renovate) should be labeled area-community. + +labels: + area-a2a: + description: "Agent-to-Agent protocol, A2AAgent, A2AClient, A2AServer, agent cards" + area-async: + description: "Asynchronous flows, multi-threading, asyncio, concurrent execution, event loops" + area-bidirectional-streaming: + description: "Bidirectional streaming, BidiAgent, real-time audio/video, WebRTC, WebSocket, Nova Sonic" + area-community: + description: "Community health, monorepo consolidation, contributor guides, governance, CI dependency bumps" + area-config: + description: "Config-based agents, agent config files, mcp-config, declarative definitions" + area-context: + description: "Conversation management, context windows, context reduction, sliding window, token management" + area-devx: + description: "Developer experience, better APIs, ergonomics, helper methods, error messages, usability" + area-hil: + description: "Human-in-the-loop, interrupt/resume, suspend/resume, approval workflows" + area-hooks: + description: "Hook events, hook registry, callbacks, lifecycle events, BeforeEvent/AfterEvent" + area-language: + description: "New language SDKs (Ruby, .NET, Rust, Go, etc.)" + area-mcp: + description: "Model Context Protocol, MCP servers/clients/transport/tools" + area-multiagent: + description: "Multi-agent patterns, swarm, graph, orchestrator, agent-as-tool, arena" + area-otel: + description: "OpenTelemetry, tracing, metrics, spans, observability, OTLP" + area-persistence: + description: "Session storage, checkpointing, S3SessionManager, DynamoDB sessions, state serialization" + area-provider: + description: "Model providers (Bedrock, OpenAI, Anthropic, Ollama, LiteLLM, SageMaker, vLLM, Mistral)" + area-structured-output: + description: "Structured output API, JSON schema enforcement, Pydantic output models" + area-tool: + description: "Tool behavior, tool definitions, tool execution, @tool decorator, tool results" diff --git a/.github/labelers/language.yml b/.github/labelers/language.yml new file mode 100644 index 0000000000..bba0d90f89 --- /dev/null +++ b/.github/labelers/language.yml @@ -0,0 +1,15 @@ +# .github/labelers/language.yml +# Identifies which SDK language the issue relates to. +# Use max_labels: 1 since most issues target one language. + +instructions: | + This is a monorepo with Python and TypeScript SDKs. + Look for language-specific keywords: Python paths (strands-py/, .py files, pip, pyproject.toml), + TypeScript paths (strands-ts/, .ts files, npm, package.json). + If the issue is language-agnostic or unclear, do not assign a label. + +labels: + lang-python: + description: "Issue relates to the Python SDK (strands-py/, .py files, pip, pyproject.toml)" + lang-typescript: + description: "Issue relates to the TypeScript SDK (strands-ts/, .ts files, npm, package.json)" diff --git a/.github/labelers/type.yml b/.github/labelers/type.yml new file mode 100644 index 0000000000..afbe3745de --- /dev/null +++ b/.github/labelers/type.yml @@ -0,0 +1,18 @@ +# .github/labelers/type.yml +# Classifies issues by type (bug, feature, etc.) +# Use max_labels: 1 in the workflow since these are mutually exclusive. + +instructions: | + Choose exactly one type. If the title starts with [BUG] it is a bug. + If the title starts with [FEATURE] it is an enhancement. + CI/dependency PRs that open as issues are chores. + +labels: + bug: + description: "Something is broken or not working as documented" + enhancement: + description: "New feature request or improvement to existing functionality" + question: + description: "User asking for help, clarification, or how to do something" + chore: + description: "Maintenance tasks, dependency updates, CI changes, refactoring with no user-facing impact" diff --git a/.github/workflows/issue-labeler.yml b/.github/workflows/issue-labeler.yml new file mode 100644 index 0000000000..946d2302f8 --- /dev/null +++ b/.github/workflows/issue-labeler.yml @@ -0,0 +1,55 @@ +name: Issue Labeler + +on: + issues: + types: [opened, edited] + +permissions: + issues: write + id-token: write + contents: read + +jobs: + label-area: + name: "Label: Area" + runs-on: ubuntu-latest + timeout-minutes: 2 + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: .github/labelers + sparse-checkout-cone-mode: false + - uses: strands-agents/devtools/issue-labeler@main + with: + aws_role_arn: ${{ secrets.AWS_ROLE_ARN }} + config_path: '.github/labelers/area.yml' + + label-type: + name: "Label: Type" + runs-on: ubuntu-latest + timeout-minutes: 2 + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: .github/labelers + sparse-checkout-cone-mode: false + - uses: strands-agents/devtools/issue-labeler@main + with: + aws_role_arn: ${{ secrets.AWS_ROLE_ARN }} + config_path: '.github/labelers/type.yml' + max_labels: '1' + + label-language: + name: "Label: Language" + runs-on: ubuntu-latest + timeout-minutes: 2 + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: .github/labelers + sparse-checkout-cone-mode: false + - uses: strands-agents/devtools/issue-labeler@main + with: + aws_role_arn: ${{ secrets.AWS_ROLE_ARN }} + config_path: '.github/labelers/language.yml' + max_labels: '1' From ef361332173308d6730ea1fdd1d445ca98388069 Mon Sep 17 00:00:00 2001 From: Jonathan Segev Date: Thu, 28 May 2026 12:01:13 -0400 Subject: [PATCH 2/3] Use python/javascript as language labels --- .github/labelers/language.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/labelers/language.yml b/.github/labelers/language.yml index bba0d90f89..07bafe2b46 100644 --- a/.github/labelers/language.yml +++ b/.github/labelers/language.yml @@ -9,7 +9,7 @@ instructions: | If the issue is language-agnostic or unclear, do not assign a label. labels: - lang-python: + python: description: "Issue relates to the Python SDK (strands-py/, .py files, pip, pyproject.toml)" - lang-typescript: - description: "Issue relates to the TypeScript SDK (strands-ts/, .ts files, npm, package.json)" + javascript: + description: "Issue relates to the TypeScript/JavaScript SDK (strands-ts/, .ts files, npm, package.json)" From 82455f17d102f396b2331d40ebba253feacccc1f Mon Sep 17 00:00:00 2001 From: Jonathan Segev Date: Thu, 28 May 2026 12:06:27 -0400 Subject: [PATCH 3/3] Address review feedback - Drop edited trigger to avoid redundant re-classification on minor edits - Add comment clarifying max_labels is intentionally omitted for area labels - Add disambiguation hints for commonly confused label pairs (mcp vs tool, provider vs async, hooks vs others) - Add guidance for cross-SDK language issues --- .github/labelers/area.yml | 3 +++ .github/labelers/language.yml | 1 + .github/workflows/issue-labeler.yml | 3 ++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/labelers/area.yml b/.github/labelers/area.yml index e7062ea8e0..7082be6e51 100644 --- a/.github/labelers/area.yml +++ b/.github/labelers/area.yml @@ -4,6 +4,9 @@ instructions: | This is the Strands Agents SDK repository (Python + TypeScript monorepo). CI dependency bumps (dependabot, renovate) should be labeled area-community. + MCP tools should be labeled area-mcp, not area-tool. + Provider-specific async/streaming bugs belong to area-provider, not area-async. + Issues about hook lifecycle events belong to area-hooks even if they mention tools or agents. labels: area-a2a: diff --git a/.github/labelers/language.yml b/.github/labelers/language.yml index 07bafe2b46..1f69ee7884 100644 --- a/.github/labelers/language.yml +++ b/.github/labelers/language.yml @@ -6,6 +6,7 @@ instructions: | This is a monorepo with Python and TypeScript SDKs. Look for language-specific keywords: Python paths (strands-py/, .py files, pip, pyproject.toml), TypeScript paths (strands-ts/, .ts files, npm, package.json). + If the issue clearly targets both languages equally, prefer the language where the bug or feature originates. If the issue is language-agnostic or unclear, do not assign a label. labels: diff --git a/.github/workflows/issue-labeler.yml b/.github/workflows/issue-labeler.yml index 946d2302f8..9ac7e5e627 100644 --- a/.github/workflows/issue-labeler.yml +++ b/.github/workflows/issue-labeler.yml @@ -2,7 +2,7 @@ name: Issue Labeler on: issues: - types: [opened, edited] + types: [opened] permissions: issues: write @@ -19,6 +19,7 @@ jobs: with: sparse-checkout: .github/labelers sparse-checkout-cone-mode: false + # max_labels omitted: issues may span multiple areas - uses: strands-agents/devtools/issue-labeler@main with: aws_role_arn: ${{ secrets.AWS_ROLE_ARN }}