The response has been limited to 50k tokens of the smallest files in the repo. You can remove this limitation by removing the max tokens filter.
├── .git-blame-ignore-revs
├── .gitattributes
├── .github
    ├── CODEOWNERS
    ├── ISSUE_TEMPLATE
    │   ├── bug-report.yml
    │   └── feature-request.yml
    ├── PULL_REQUEST_TEMPLATE.md
    ├── actions
    │   └── spelling
    │   │   ├── advice.md
    │   │   ├── allow.txt
    │   │   ├── excludes.txt
    │   │   └── line_forbidden.patterns
    ├── conventional-commit-lint.yaml
    ├── linters
    │   ├── .eslintrc.js
    │   ├── .jscpd.json
    │   ├── .markdownlint.json
    │   └── .stylelintrc.json
    ├── release-please.yml
    ├── release-trigger.yml
    ├── scripts
    │   └── deploy-404.sh
    └── workflows
    │   ├── dispatch-a2a-update.yml
    │   ├── docs.yml
    │   ├── generate-a2a-json.yml
    │   ├── issue-metrics.yml
    │   ├── links.yaml
    │   ├── linter.yaml
    │   ├── spelling.yaml
    │   └── stale.yaml
├── .gitignore
├── .mkdocs
    └── overrides
    │   └── main.html
├── .prettierrc
├── .ruff.toml
├── .vscode
    └── settings.json
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── GOVERNANCE.md
├── LICENSE
├── README.md
├── SECURITY.md
├── docs
    ├── 404.html
    ├── README.md
    ├── assets
    │   ├── a2a-actors.png
    │   ├── a2a-banner.png
    │   ├── a2a-logo-black.svg
    │   ├── a2a-logo-white.svg
    │   ├── a2a-main.png
    │   ├── a2a-mcp-readme.png
    │   ├── a2a-mcp.png
    │   ├── adk.svg
    │   ├── ag2-black.svg
    │   └── langgraph-color.svg
    ├── community.md
    ├── index.md
    ├── llms.txt
    ├── partners.md
    ├── robots.txt
    ├── sdk
    │   └── python
    │   │   └── index.md
    ├── specification.md
    ├── stylesheets
    │   └── custom.css
    ├── topics
    │   ├── a2a-and-mcp.md
    │   ├── agent-discovery.md
    │   ├── enterprise-ready.md
    │   ├── extensions.md
    │   ├── key-concepts.md
    │   ├── life-of-a-task.md
    │   ├── streaming-and-async.md
    │   └── what-is-a2a.md
    └── tutorials
    │   └── python
    │       ├── 1-introduction.md
    │       ├── 2-setup.md
    │       ├── 3-agent-skills-and-card.md
    │       ├── 4-agent-executor.md
    │       ├── 5-start-server.md
    │       ├── 6-interact-with-server.md
    │       ├── 7-streaming-and-multiturn.md
    │       └── 8-next-steps.md
├── lychee.toml
├── mkdocs.yml
├── requirements-docs.txt
├── specification
    ├── grpc
    │   ├── README.md
    │   ├── a2a.proto
    │   ├── buf.gen.yaml
    │   ├── buf.lock
    │   └── buf.yaml
    └── json
    │   ├── README.md
    │   └── a2a.json
└── types
    ├── .gitignore
    ├── README.md
    ├── package-lock.json
    ├── package.json
    ├── src
        └── types.ts
    └── tsconfig.json


/.git-blame-ignore-revs:
--------------------------------------------------------------------------------
 1 | # Template taken from https://github.com/v8/v8/blob/master/.git-blame-ignore-revs.
 2 | #
 3 | # This file contains a list of git hashes of revisions to be ignored by git blame. These
 4 | # revisions are considered "unimportant" in that they are unlikely to be what you are
 5 | # interested in when blaming. Most of these will probably be commits related to linting
 6 | # and code formatting.
 7 | #
 8 | # Instructions:
 9 | # - Only large (generally automated) reformatting or renaming CLs should be
10 | #   added to this list. Do not put things here just because you feel they are
11 | #   trivial or unimportant. If in doubt, do not put it on this list.
12 | # - Precede each revision with a comment containing the PR title and number.
13 | #   For bulk work over many commits, place all commits in a block with a single
14 | #   comment at the top describing the work done in those commits.
15 | # - Only put full 40-character hashes on this list (not short hashes or any
16 | #   other revision reference).
17 | # - Append to the bottom of the file (revisions should be in chronological order
18 | #   from oldest to newest).
19 | # - Because you must use a hash, you need to append to this list in a follow-up
20 | #   PR to the actual reformatting PR that you are trying to ignore.
21 | 0f8d9750bcb17f6b8b9f48793b46f7b8510cae24
22 | 


--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Documentation overrides
2 | /docs/** linguist-documentation=true
3 | /.mkdocs/** linguist-documentation=true
4 | /specification/json/a2a.json linguist-generated=true
5 | noxfile.py linguist-vendored=true
6 | 
7 | # Merge and diff setting
8 | CHANGELOG.md merge=union
9 | 


--------------------------------------------------------------------------------
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | # Code owners file.
2 | # This file controls who is tagged for review for any given pull request.
3 | #
4 | # For syntax help see:
5 | # https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners#codeowners-syntax
6 | 
7 | *   @a2aproject/google
8 | 


--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug-report.yml:
--------------------------------------------------------------------------------
 1 | name: 🐞 Bug Report
 2 | description: File a bug report
 3 | title: "[Bug]: "
 4 | type: "Bug"
 5 | body:
 6 |   - type: markdown
 7 |     attributes:
 8 |       value: |
 9 |         Thanks for stopping by to let us know something could be better!
10 |         Private Feedback? Please use this [Google form](https://goo.gle/a2a-feedback)
11 |   - type: textarea
12 |     id: what-happened
13 |     attributes:
14 |       label: What happened?
15 |       description: Also tell us what you expected to happen and how to reproduce the issue.
16 |       placeholder: Tell us what you see!
17 |       value: "A bug happened!"
18 |     validations:
19 |       required: true
20 |   - type: textarea
21 |     id: logs
22 |     attributes:
23 |       label: Relevant log output
24 |       description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
25 |       render: shell
26 |   - type: checkboxes
27 |     id: terms
28 |     attributes:
29 |       label: Code of Conduct
30 |       description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/a2aproject/A2A?tab=coc-ov-file#readme)
31 |       options:
32 |         - label: I agree to follow this project's Code of Conduct
33 |           required: true
34 | 


--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature-request.yml:
--------------------------------------------------------------------------------
 1 | name: 💡 Feature Request
 2 | description: Suggest an idea for this repository
 3 | title: "[Feat]: "
 4 | type: "Feature"
 5 | body:
 6 |   - type: markdown
 7 |     attributes:
 8 |       value: |
 9 |         Thanks for stopping by to let us know something could be better!
10 |         Private Feedback? Please use this [Google form](https://goo.gle/a2a-feedback)
11 |   - type: textarea
12 |     id: problem
13 |     attributes:
14 |       label: Is your feature request related to a problem? Please describe.
15 |       description: A clear and concise description of what the problem is.
16 |       placeholder: Ex. I'm always frustrated when [...]
17 |   - type: textarea
18 |     id: describe
19 |     attributes:
20 |       label: Describe the solution you'd like
21 |       description: A clear and concise description of what you want to happen.
22 |     validations:
23 |       required: true
24 |   - type: textarea
25 |     id: alternatives
26 |     attributes:
27 |       label: Describe alternatives you've considered
28 |       description: A clear and concise description of any alternative solutions or features you've considered.
29 |   - type: textarea
30 |     id: context
31 |     attributes:
32 |       label: Additional context
33 |       description: Add any other context or screenshots about the feature request here.
34 |   - type: checkboxes
35 |     id: terms
36 |     attributes:
37 |       label: Code of Conduct
38 |       description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/a2aproject/A2A?tab=coc-ov-file#readme)
39 |       options:
40 |         - label: I agree to follow this project's Code of Conduct
41 |           required: true
42 | 


--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
 1 | # Description
 2 | 
 3 | Thank you for opening a Pull Request!
 4 | Before submitting your PR, there are a few things you can do to make sure it goes smoothly:
 5 | 
 6 | - [ ] Follow the [`CONTRIBUTING` Guide](https://github.com/a2aproject/A2A/blob/main/CONTRIBUTING.md).
 7 | - [ ] Make your Pull Request title in the <https://www.conventionalcommits.org/> specification.
 8 | - [ ] Ensure the tests and linter pass (Run `nox -s format` from the repository root to format)
 9 | - [ ] Appropriate docs were updated (if necessary)
10 | 
11 | Fixes #<issue_number_goes_here> 🦕
12 | 


--------------------------------------------------------------------------------
/.github/actions/spelling/advice.md:
--------------------------------------------------------------------------------
 1 | <!-- See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice --> <!-- markdownlint-disable MD033 MD041 -->
 2 | <details><summary>If the flagged items are :exploding_head: false positives</summary>
 3 | 
 4 | If items relate to a ...
 5 | 
 6 | - binary file (or some other file you wouldn't want to check at all).
 7 | 
 8 |   Please add a file path to the `excludes.txt` file matching the containing file.
 9 | 
10 |   File paths are Perl 5 Regular Expressions - you can [test](https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.
11 | 
12 |   `^` refers to the file's path from the root of the repository, so `^README\.md



    
    

    
    

    
    
    
    

    
    
    
    




    

    
The response has been limited to 50k tokens of the smallest files in the repo. You can remove this limitation by removing the max tokens filter.
would exclude `README.md` (on whichever branch you're using). 13 | 14 | - well-formed pattern. 15 | 16 | If you can write a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it, 17 | try adding it to the `patterns.txt` file. 18 | 19 | Patterns are Perl 5 Regular Expressions - you can [test](https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines. 20 | 21 | Note that patterns can't match multiline strings. 22 | 23 | </details> 24 | 25 | <!-- adoption information--> 26 | 27 | :steam_locomotive: If you're seeing this message and your PR is from a branch that doesn't have check-spelling, 28 | please merge to your PR's base branch to get the version configured for your repository. 29 | -------------------------------------------------------------------------------- /.github/actions/spelling/allow.txt: -------------------------------------------------------------------------------- 1 | AAAANSUh 2 | AAAAUA 3 | AAAGHMHc 4 | ACMRTUXB 5 | ACard 6 | AClient 7 | ACo 8 | ADK 9 | AError 10 | AIP 11 | ARequest 12 | ASED 13 | ASGI 14 | AServer 15 | AService 16 | AStarlette 17 | Autogen 18 | Blogs 19 | CAs 20 | CLIs 21 | Camry 22 | Cjava 23 | DDo 24 | DGT 25 | Dotnet 26 | EBFF 27 | EUR 28 | EUg 29 | FBT 30 | FHIR 31 | Fbr 32 | GAPI 33 | GAPIC 34 | GBP 35 | GVsb 36 | Gapic 37 | Genkit 38 | Ghw 39 | Hackathon 40 | IFdvcmxk 41 | INR 42 | JHv 43 | JPY 44 | JWKS 45 | JWTs 46 | KGgo 47 | KRW 48 | LHR 49 | LLM 50 | LLMs 51 | MWpm 52 | OIDC 53 | OOa 54 | Ollama 55 | PLE 56 | PLW 57 | PMEEi 58 | PTH 59 | RPCs 60 | RUF 61 | SLAs 62 | SLF 63 | Solax 64 | TJS 65 | TMDB 66 | URLTo 67 | Upserting 68 | Urke 69 | VBORw 70 | Vsb 71 | WVw 72 | Witteveen 73 | Xca 74 | YTT 75 | YWFh 76 | Zipkin 77 | aab 78 | aacacac 79 | aboutasha 80 | achat 81 | aconnect 82 | adk 83 | agentcard 84 | agentic 85 | agentskill 86 | ainvoke 87 | aparse 88 | aproject 89 | arxiv 90 | askmarvin 91 | asyncclick 92 | autogen 93 | autouse 94 | backstory 95 | backticks 96 | bbb 97 | bufbuild 98 | bzr 99 | cae 100 | ccc 101 | cdn 102 | ceee 103 | cfe 104 | cls 105 | coc 106 | codegen 107 | codeowner 108 | crewai 109 | datamodel 110 | datapart 111 | dbc 112 | dcda 113 | dcfa 114 | dde 115 | direnv 116 | documentai 117 | dotnet 118 | efaab 119 | efbd 120 | embeddings 121 | endblock 122 | envoyproxy 123 | evt 124 | excinfo 125 | faa 126 | fafd 127 | ffbb 128 | firewalls 129 | flightbook 130 | forbes 131 | fsv 132 | fyi 133 | gapic 134 | gcp 135 | genai 136 | genkit 137 | genproto 138 | georoute 139 | gettickets 140 | gle 141 | googleai 142 | googleapi 143 | googleblog 144 | gpt 145 | gstatic 146 | gweb 147 | hqdefault 148 | iat 149 | ietf 150 | inbox 151 | inmemory 152 | iss 153 | jherr 154 | jti 155 | jwks 156 | konami 157 | kty 158 | langgraph 159 | linenums 160 | linkedin 161 | linting 162 | llm 163 | llms 164 | lng 165 | marvin 166 | mcp 167 | mesop 168 | mindsdb 169 | motherlode 170 | mozilla 171 | msword 172 | multiagent 173 | multipage 174 | nlp 175 | notif 176 | noxfile 177 | npush 178 | objc 179 | octicons 180 | ollama 181 | oneof 182 | oreilly 183 | pqr 184 | prefecthq 185 | protoc 186 | protolint 187 | pyguide 188 | pymdownx 189 | pypackages 190 | pytype 191 | pyupgrade 192 | qwq 193 | rcm 194 | reportgen 195 | reposted 196 | rvelicheti 197 | sllm 198 | squidfunk 199 | srcs 200 | sse 201 | stateclass 202 | stephenh 203 | styleguide 204 | svn 205 | systemctl 206 | tagwords 207 | taskssend 208 | taskstate 209 | taskstatus 210 | textpart 211 | threadsafe 212 | tok 213 | tracestate 214 | ugc 215 | utm 216 | versioned 217 | vnd 218 | voa 219 | vscode 220 | weavehacks 221 | webpage 222 | whatwg 223 | wikipedia 224 | wsgi 225 | wwwwwwww 226 | xxxxx 227 | xxxxxxxx 228 | youtube 229 | yyyyyyyy 230 | zzzzzzzz 231 | -------------------------------------------------------------------------------- /.github/actions/spelling/excludes.txt: -------------------------------------------------------------------------------- 1 | # See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-excludes 2 | (?:^|/)(?i)COPYRIGHT 3 | (?:^|/)(?i)LICEN[CS]E 4 | (?:^|/)(?i)CODE_OF_CONDUCT.md\E$ 5 | (?:^|/)(?i).gitignore\E$ 6 | (?:^|/)3rdparty/ 7 | (?:^|/)go\.sum$ 8 | (?:^|/)package(?:-lock|)\.json$ 9 | (?:^|/)Pipfile$ 10 | (?:^|/)pyproject.toml 11 | (?:^|/)requirements(?:-dev|-doc|-test|)\.txt$ 12 | (?:^|/)vendor/ 13 | /CODEOWNERS$ 14 | \.a$ 15 | \.ai$ 16 | \.all-contributorsrc$ 17 | \.avi$ 18 | \.bmp$ 19 | \.bz2$ 20 | \.cer$ 21 | \.class$ 22 | \.coveragerc$ 23 | \.crl$ 24 | \.crt$ 25 | \.csr$ 26 | \.dll$ 27 | \.docx?$ 28 | \.drawio$ 29 | \.DS_Store$ 30 | \.eot$ 31 | \.eps$ 32 | \.exe$ 33 | \.gif$ 34 | \.git-blame-ignore-revs$ 35 | \.gitattributes$ 36 | \.gitkeep$ 37 | \.graffle$ 38 | \.gz$ 39 | \.icns$ 40 | \.ico$ 41 | \.jar$ 42 | \.jks$ 43 | \.jpe?g$ 44 | \.key$ 45 | \.lib$ 46 | \.lock$ 47 | \.map$ 48 | \.min\.. 49 | \.mo$ 50 | \.mod$ 51 | \.mp[34]$ 52 | \.o$ 53 | \.ocf$ 54 | \.otf$ 55 | \.p12$ 56 | \.parquet$ 57 | \.pdf$ 58 | \.pem$ 59 | \.pfx$ 60 | \.png$ 61 | \.psd$ 62 | \.pyc$ 63 | \.pylintrc$ 64 | \.qm$ 65 | \.s$ 66 | \.sig$ 67 | \.so$ 68 | \.svgz?$ 69 | \.sys$ 70 | \.tar$ 71 | \.tgz$ 72 | \.tiff?$ 73 | \.ttf$ 74 | \.wav$ 75 | \.webm$ 76 | \.webp$ 77 | \.woff2?$ 78 | \.xcf$ 79 | \.xlsx?$ 80 | \.xpm$ 81 | \.xz$ 82 | \.zip$ 83 | ^\.github/actions/spelling/ 84 | ^\Q.github/workflows/spelling.yaml\E$ 85 | ^\Q.github/workflows/linter.yaml\E$ 86 | ^\Qdemo/ui/service/server/test_image.py\E$ 87 | ^\Qlychee.toml\E$ 88 | \.vscode/ 89 | ^\Qdocs/partners.md\E$ 90 | ^\Qspecification/json/a2a.json\E$ 91 | CHANGELOG.md 92 | \.gitignore 93 | ^\Qdocs/robots.txt\E$ 94 | -------------------------------------------------------------------------------- /.github/actions/spelling/line_forbidden.patterns: -------------------------------------------------------------------------------- 1 | # Should be `HH:MM:SS` 2 | \bHH:SS:MM\b 3 | 4 | # Should probably be `YYYYMMDD` 5 | \b[Yy]{4}[Dd]{2}[Mm]{2}(?!.*[Yy]{4}[Dd]{2}[Mm]{2}).*$ 6 | 7 | # Should be `anymore` 8 | \bany more[,.] 9 | 10 | # Should be `cannot` (or `can't`) 11 | # See https://www.grammarly.com/blog/cannot-or-can-not/ 12 | # > Don't use `can not` when you mean `cannot`. The only time you're likely to see `can not` written as separate words is when the word `can` happens to precede some other phrase that happens to start with `not`. 13 | # > `Can't` is a contraction of `cannot`, and it's best suited for informal writing. 14 | # > In formal writing and where contractions are frowned upon, use `cannot`. 15 | # > It is possible to write `can not`, but you generally find it only as part of some other construction, such as `not only . . . but also.` 16 | # - if you encounter such a case, add a pattern for that case to patterns.txt. 17 | \b[Cc]an not\b 18 | 19 | # Should be `GitHub` 20 | (?<![&*.]|// |\btype |\bimport )\bGithub\b(?![{()]) 21 | \b[Gg]it\s[Hh]ub\b 22 | 23 | # Should be `GitLab` 24 | (?<![&*.]|// |\btype )\bGitlab\b(?![{)]) 25 | 26 | # Should be `JavaScript` 27 | \bJavascript\b 28 | 29 | # Should be `macOS` or `Mac OS X` or ... 30 | \bMacOS\b 31 | 32 | # Should be `Microsoft` 33 | \bMicroSoft\b 34 | 35 | # Should be `OAuth` 36 | (?:^|[^-/*$])[ '"]oAuth(?: [a-z]|\d+ |[^ a-zA-Z0-9:;_.()]) 37 | 38 | # Should be `TypeScript` 39 | \bTypescript\b 40 | 41 | # Should be `another` 42 | \ban[- ]other\b 43 | 44 | # Should be `case-(in)sensitive` 45 | \bcase (?:in|)sensitive\b 46 | 47 | # Should be `coinciding` 48 | \bco-inciding\b 49 | 50 | # Should be `deprecation warning(s)` 51 | \b[Dd]epreciation [Ww]arnings?\b 52 | 53 | # Should be `greater than` 54 | \bgreater then\b 55 | 56 | # Should be `ID` 57 | #\bId\b 58 | 59 | # Should be `in front of` 60 | \bin from of\b 61 | 62 | # Should be `into` 63 | # when not phrasal and when `in order to` would be wrong: 64 | # https://thewritepractice.com/into-vs-in-to/ 65 | \sin to\s(?!if\b) 66 | 67 | # Should be `use` 68 | \sin used by\b 69 | 70 | # Should be `is obsolete` 71 | \bis obsolescent\b 72 | 73 | # Should be `it's` or `its` 74 | \bits['] 75 | 76 | # Should be `its` 77 | \bit's(?= own\b) 78 | 79 | # Should be `perform its` 80 | \bperform it's\b 81 | 82 | # Should be `opt-in` 83 | (?<!\sfor)\sopt in\s 84 | 85 | # Should be `less than` 86 | \bless then\b 87 | 88 | # Should be `load balancer` 89 | \b[Ll]oud balancer 90 | 91 | # Should be `one of` 92 | \bon of\b 93 | 94 | # Should be `otherwise` 95 | \bother[- ]wise\b 96 | 97 | # Should be `or (more|less)` 98 | \bore (?:more|less)\b 99 | 100 | # Should be `rather than` 101 | \brather then\b 102 | 103 | # Should be `regardless, ...` or `regardless of (whether)` 104 | \b[Rr]egardless if you\b 105 | 106 | # Should be `no longer needed` 107 | \bno more needed\b(?! than\b) 108 | 109 | # Should be `did not exist` 110 | \bwere not existent\b 111 | 112 | # Should be `nonexistent` 113 | \bnon existing\b 114 | 115 | # Should be `nonexistent` 116 | \b[Nn]o[nt][- ]existent\b 117 | 118 | # Should be `@brief` / `@details` / `@param` / `@return` / `@retval` 119 | (?:^\s*|(?:\*|//|/*)\s+`)[\\@](?:breif|(?:detail|detials)|(?:params(?!\.)|prama?)|ret(?:uns?)|retvl)\b 120 | 121 | # Should be `preexisting` 122 | [Pp]re[- ]existing 123 | 124 | # Should be `preempt` 125 | [Pp]re[- ]empt\b 126 | 127 | # Should be `preemptively` 128 | [Pp]re[- ]emptively 129 | 130 | # Should be `recently changed` or `recent changes` 131 | [Rr]ecent changed 132 | 133 | # Should be `reentrancy` 134 | [Rr]e[- ]entrancy 135 | 136 | # Should be `reentrant` 137 | [Rr]e[- ]entrant 138 | 139 | # Should be `understand` 140 | \bunder stand\b 141 | 142 | # Should be `workarounds` 143 | \bwork[- ]arounds\b 144 | 145 | # Should be `workaround` 146 | (?:(?:[Aa]|[Tt]he|ugly)\swork[- ]around\b|\swork[- ]around\s+for) 147 | 148 | # Should be `(coarse|fine)-grained` 149 | \b(?:coarse|fine) grained\b 150 | 151 | # Should be `neither/nor` -- or reword 152 | \bnot\b[^.?!"/(]+\bnor\b 153 | 154 | # Should be `neither/nor` (plus rewording the beginning) 155 | # This is probably a double negative... 156 | \bnot\b[^.?!"/]*\bneither\b[^.?!"/(]*\bnor\b 157 | 158 | # In English, duplicated words are generally mistakes 159 | # There are a few exceptions (e.g. "that that"). 160 | # If the highlighted doubled word pair is in: 161 | # * code, write a pattern to mask it. 162 | # * prose, have someone read the English before you dismiss this error. 163 | \s([A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})\s\g{-1}\s 164 | 165 | # Should be `Gen AI` 166 | \b[gG]enAI\b 167 | 168 | # Should be LangChain 169 | \b(?!LangChain\b)(?!langchain\b)[Ll]ang\s?[Cc]hain?\b 170 | 171 | # Should be LangGraph 172 | \b(?!LangGraph\b)(?!langgraph\b)[Ll]ang\s?[Gg]raph?\b 173 | 174 | # Should be LangServe 175 | \b(?!LangServe\b)(?!langserve\b)[Ll]ang\s?[Ss]erve?\b 176 | 177 | # Should be LlamaIndex 178 | \b(?!LlamaIndex\b)[Ll][Ll]ama\s?[Ii]ndex?\s 179 | 180 | # Should be Hugging Face 181 | \s(?!Hugging Face\b)[Hh]ugging\s?[Ff]ace?\b 182 | 183 | # Should be DeepSeek 184 | \b(?!DeepSeek\b)(?!deepseek\b)[Dd]eep\s?[Ss]eek?\b 185 | 186 | # Should be Vertex AI 187 | \b(?!Vertex AI\b)(?!.*[\(\)\{\},])(?<!import\s)(?<!\.)(?<!,\s)Vertex\s?[Aa]?[Ii]?\b 188 | 189 | # Should be Vertex AI 190 | \b[Vv]ertext\b 191 | 192 | # Should be Gemini 193 | \sgemini\s\w 194 | 195 | # Should be `Gemini Version Size` (e.g. `Gemini 2.0 Flash`) 196 | \bGemini\s(Pro|Flash|Ultra)\s?\d\.\d\b 197 | 198 | # Gemini Size should be capitalized (e.g. `Gemini 2.0 Flash`) 199 | \bGemini\s?\d\.\d\s(pro|flash|ultra)\b 200 | 201 | # Don't say "Google Gemini" or "Google Gemini" 202 | \b[Gg]oogle(?: [Cc]loud| [Dd]eep[Mm]ind)?'s [Gg]emini\b 203 | 204 | # Don't say "Powered by Gemini", instead say "with Gemini" 205 | \b[Pp]owered\s[Bb]y\s[Gg]emini\b 206 | 207 | # Should be Gemini API in Vertex AI 208 | \b[Vv]ertex\s[Aa][Ii]\s[Gg]emini\s[Aa][Pp][Ii]\b 209 | 210 | # Should be Agentspace 211 | \b(?!Agentspace\b)[Aa]gent\s?[Ss]pace?\b 212 | 213 | # Should be Imagen 214 | \simagen\s\w 215 | 216 | # Should be Imagen 2 or Imagen 3 217 | \bImagen\d\b 218 | 219 | # Should be BigQuery 220 | \b(?!BigQuery\b)(?!bigquery\b)[Bb]ig\s?[Qq]uery\b 221 | 222 | # Should be DataFrame or DataFrames 223 | \b(?!DataFrames?\b)(?!.*[\(\)\{\}\.,=])(?<!")\b[Dd]ata\s?[Ff]rames?\b(?!") 224 | 225 | # Should be Google Cloud 226 | \s[Gg][Cc][Pp]\s 227 | 228 | # Should be Google Cloud 229 | \b(?!Google\sCloud\b)[Gg]oogle\s?[Cc]loud\b 230 | 231 | # Should be DeepMind 232 | \b(?!DeepMind\b)[Dd]eep\s?[Mm]ind\b 233 | 234 | # Should be TensorFlow 235 | \b(?!TensorFlow\b)(?!tensorflow\b)[Tt]ensor\s?[Ff]low\b 236 | 237 | # Should be AlloyDB 238 | \b(?!AlloyDB\b)(?!alloydb\b)[Aa]lloy\s?[Dd]\s?[Bb]\b 239 | 240 | # Should be Translation API 241 | \bTranslate\s?API\b 242 | 243 | # Should be Dialogflow 244 | \bDialogFlow\b 245 | 246 | # Should be Firebase 247 | \b(?!Firebase\b)Fire\s?[Bb]ase\b 248 | 249 | # Should be Firestore 250 | \b(?!Firestore\b)Fire\s?[Ss]tore\b 251 | 252 | # Should be Memorystore 253 | \b(?!Memorystore\b)Memory\s?[Ss]tore\b 254 | 255 | # Should be Document AI 256 | \bDoc\s?AI\b 257 | 258 | # Should be Vertex AI Search 259 | \bVertex\s?Search\b 260 | 261 | # Should be Vertex AI Vector Search 262 | \bVertex\sVector\sSearch\b 263 | 264 | # Should be Colab 265 | \s(?!Colab)[Cc]o[Ll][Ll]?abs?\b 266 | 267 | # Should be Kaggle 268 | \skaggle\b 269 | 270 | # Should be TPU or TPUs 271 | \btpus?\b 272 | 273 | # Should be GKE 274 | \sgke\s 275 | 276 | # Should be GCS 277 | \sgcs\s 278 | 279 | # Should be Dataflow ML 280 | \b[Dd]ataflowML\b 281 | 282 | # Should be API 283 | \s(?!API)(?!.*[\(\)\{\},=#]+)[Aa][Pp][Ii]\s 284 | 285 | # Should be arXiv 286 | \bAr[Xx]iv\b 287 | 288 | # Should be DeepEval 289 | \b(?!DeepEval\b)(?!deepeval\b)[Dd]eep\s?[Ee]val\b 290 | 291 | # Invalid Space Character 292 | \w \w 293 | 294 | # Don't use "smart quotes" 295 | (?!'")[‘’“”] 296 | 297 | # "an" should only be before vowels. 298 | \ban\s+(?![FHLMNRSX][A-Z0-9]+\b)(?!hour\b)(?!honest\b)(?!npm\b)([b-df-hj-np-tv-zB-DF-HJ-NP-TV-Z]{1}\w*) 299 | 300 | # Don't use Google internal links 301 | ((corp|prod|sandbox).google.com|googleplex.com|https?://(?!localhost/)[0-9a-z][0-9a-z-]+/|(?:^|[^/.-])\b(?:go|b|cl|cr)/[a-z0-9_.-]+\b) 302 | 303 | # Use `%pip` instead of `!pip` or `!pip3` 304 | !\s?pip3? 305 | 306 | # Don't use embedded images, upload to Google Cloud Storage 307 | \(data:image/(?:jpeg|png);base64,[^{] 308 | -------------------------------------------------------------------------------- /.github/conventional-commit-lint.yaml: -------------------------------------------------------------------------------- 1 | enabled: true 2 | always_check_pr_title: true 3 | -------------------------------------------------------------------------------- /.github/linters/.eslintrc.js: -------------------------------------------------------------------------------- 1 | /** @type {import('eslint').Linter.Config} */ 2 | module.exports = { 3 | root: true, 4 | parser: '@typescript-eslint/parser', 5 | plugins: ['@typescript-eslint', 'n'], 6 | extends: [ 7 | 'eslint:recommended', 8 | 'plugin:@typescript-eslint/recommended', 9 | 'plugin:n/recommended', 10 | ], 11 | rules: { 12 | '@typescript-eslint/no-explicit-any': 'off', 13 | 'n/no-unsupported-features/es-syntax': 'off', 14 | }, 15 | overrides: [ 16 | { 17 | files: ['*.ts', '*.tsx'], 18 | parserOptions: { 19 | ecmaVersion: 'latest', 20 | sourceType: 'module', 21 | }, 22 | }, 23 | ], 24 | }; 25 | -------------------------------------------------------------------------------- /.github/linters/.jscpd.json: -------------------------------------------------------------------------------- 1 | { 2 | "ignore": [ 3 | "**/.github/**", 4 | "**/demo/**", 5 | "**/images/**", 6 | "**/samples/**", 7 | "**/tests/**", 8 | "**/.git/**" 9 | ], 10 | "threshold": 3, 11 | "reporters": ["html", "markdown"] 12 | } 13 | -------------------------------------------------------------------------------- /.github/linters/.markdownlint.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": true, 3 | "MD013": false, 4 | "MD007": { 5 | "indent": 4 6 | }, 7 | "MD033": false, 8 | "MD046": false 9 | } 10 | -------------------------------------------------------------------------------- /.github/linters/.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["stylelint-config-standard"], 3 | "rules": { 4 | "custom-property-pattern": null 5 | }, 6 | "overrides": [ 7 | { 8 | "extends": ["stylelint-config-recommended-scss"], 9 | "files": ["*.scss", "**/*.scss"], 10 | "customSyntax": "postcss-scss" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /.github/release-please.yml: -------------------------------------------------------------------------------- 1 | releaseType: simple 2 | handleGHRelease: true 3 | bumpMinorPreMajor: true 4 | bumpPatchForMinorPreMajor: true 5 | -------------------------------------------------------------------------------- /.github/release-trigger.yml: -------------------------------------------------------------------------------- 1 | enabled: true 2 | -------------------------------------------------------------------------------- /.github/scripts/deploy-404.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Exit immediately if a command exits with a non-zero status. 4 | set -e 5 | 6 | # This script deploys the custom 404.html page to the root of the gh-pages branch. 7 | # It's designed to be called from the GitHub Actions workflow. 8 | # 9 | # Arguments: 10 | # $1: The GitHub repository name (e.g., "a2aproject/A2A"). 11 | # $2: The GITHUB_TOKEN for authentication. 12 | 13 | # --- Validate Input --- 14 | if [ -z "$1" ] || [ -z "$2" ]; then 15 | echo "Error: Missing required arguments." 16 | echo "Usage: $0 <owner/repo> <github_token>" 17 | exit 1 18 | fi 19 | 20 | REPO_NAME=$1 21 | GH_TOKEN=$2 22 | 23 | echo "Deploying custom 404 page for repository: $REPO_NAME" 24 | 25 | # --- Deployment Logic --- 26 | # Clone the gh-pages branch using the provided token for authentication. 27 | # This ensures we have push access. 28 | git clone --branch=gh-pages --single-branch --depth=1 "https://x-access-token:${GH_TOKEN}@github.com/${REPO_NAME}.git" gh-pages-deploy 29 | 30 | # Copy the 404 page from the main branch checkout into the gh-pages clone 31 | cp docs/404.html gh-pages-deploy/404.html 32 | 33 | # Navigate into the cloned directory 34 | cd gh-pages-deploy 35 | 36 | # Add the 404 page to the staging area 37 | git add 404.html 38 | 39 | # Commit and push only if the 404 page has actually changed 40 | if git diff --staged --quiet; then 41 | echo "404.html is up-to-date. No new commit needed." 42 | else 43 | echo "Committing and pushing updated 404.html..." 44 | git commit -m "docs: deploy custom 404.html for redirects" 45 | git push 46 | fi 47 | 48 | echo "404 page deployment complete." 49 | -------------------------------------------------------------------------------- /.github/workflows/dispatch-a2a-update.yml: -------------------------------------------------------------------------------- 1 | name: Dispatch A2A JSON Update 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - "specification/**/*" 9 | 10 | jobs: 11 | dispatch: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Dispatch repository_dispatch to a2a-python 15 | uses: peter-evans/repository-dispatch@v3 16 | with: 17 | token: ${{ secrets.A2A_BOT_PAT }} 18 | repository: a2aproject/a2a-python 19 | event-type: a2a_json_update 20 | client-payload: | 21 | { 22 | "ref": "${{ github.ref }}", 23 | "sha": "${{ github.sha }}", 24 | "message": "Update to specification from ${{ github.sha }}" 25 | } 26 | -------------------------------------------------------------------------------- /.github/workflows/docs.yml: -------------------------------------------------------------------------------- 1 | name: Docs Build and Deploy 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - ".github/workflows/docs.yml" 9 | - ".github/scripts/deploy-404.sh" 10 | - "requirements-docs.txt" 11 | - "mkdocs.yml" 12 | - "docs/**" 13 | pull_request: 14 | branches: 15 | - main 16 | paths: 17 | - ".github/workflows/docs.yml" 18 | - ".github/scripts/deploy-404.sh" 19 | - "requirements-docs.txt" 20 | - "mkdocs.yml" 21 | - "docs/**" 22 | release: 23 | types: 24 | - published 25 | 26 | jobs: 27 | build_and_deploy: 28 | runs-on: ubuntu-latest 29 | permissions: 30 | contents: write 31 | actions: read 32 | 33 | if: github.repository == 'a2aproject/A2A' 34 | 35 | steps: 36 | - name: Checkout Code 37 | uses: actions/checkout@v4 38 | with: 39 | token: ${{ secrets.GITHUB_TOKEN }} 40 | fetch-depth: 0 41 | 42 | - name: Configure Git Credentials 43 | run: | 44 | git config --global user.name github-actions[bot] 45 | git config --global user.email 41898282+github-actions[bot]@users.noreply.github.com 46 | 47 | - name: Setup Python 48 | uses: actions/setup-python@v5 49 | with: 50 | python-version: 3.13 51 | 52 | - name: Restore pip cache 53 | uses: actions/cache@v4 54 | with: 55 | key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements-docs.txt') }} 56 | path: ~/.cache/pip 57 | restore-keys: | 58 | ${{ runner.os }}-pip- 59 | 60 | - name: Install documentation dependencies 61 | run: pip install -r requirements-docs.txt 62 | 63 | - name: Build Documentation (PR Check) 64 | if: github.event_name == 'pull_request' 65 | run: mkdocs build 66 | 67 | - name: Deploy development version from main branch 68 | if: github.event_name == 'push' && github.ref == 'refs/heads/main' 69 | run: | 70 | mike deploy --push --update-aliases dev latest 71 | 72 | echo "Setting 'latest' as the default version for the site..." 73 | mike set-default --push latest 74 | 75 | # Deploy 404 page 76 | bash .github/scripts/deploy-404.sh ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} 77 | 78 | - name: Deploy new release version and set as latest 79 | if: github.event_name == 'release' 80 | run: | 81 | # The release tag (e.g., v0.2.2) is used as the version number 82 | export MIKE_VERSION=${{ github.event.release.tag_name }} 83 | echo "Deploying docs for version $MIKE_VERSION and setting it as 'latest'..." 84 | mike deploy --push --update-aliases $MIKE_VERSION latest 85 | 86 | echo "Setting 'latest' as the default version for the site..." 87 | mike set-default --push latest 88 | 89 | # Call the reusable script to deploy the 404 page, passing the token 90 | bash .github/scripts/deploy-404.sh ${{ github.repository }} ${{ secrets.GITHUB_TOKEN }} 91 | -------------------------------------------------------------------------------- /.github/workflows/generate-a2a-json.yml: -------------------------------------------------------------------------------- 1 | name: Auto-generate A2A JSON Schema 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | paths: 8 | - "types/**" 9 | types: 10 | - opened 11 | - synchronize 12 | - reopened 13 | 14 | jobs: 15 | generate_json: 16 | name: Generate JSON Schema 17 | runs-on: ubuntu-latest 18 | permissions: 19 | contents: write 20 | 21 | steps: 22 | - name: Checkout Code 23 | uses: actions/checkout@v4 24 | with: 25 | fetch-depth: 0 26 | ref: ${{ github.event.pull_request.head.ref }} 27 | repository: ${{ github.event.pull_request.head.repo.full_name }} 28 | 29 | - name: Setup Node.js 30 | uses: actions/setup-node@v4 31 | with: 32 | node-version: "20" 33 | 34 | - name: Install dependencies and generate a2a.json 35 | working-directory: types 36 | run: | 37 | npm install 38 | npm run generate 39 | id: generate_schema 40 | 41 | - name: Configure Git for Bot 42 | if: github.event.pull_request.head.repo.full_name == github.repository 43 | run: | 44 | git config user.name "a2a-bot" 45 | git config user.email "a2a-bot@google.com" 46 | 47 | - name: Check for Changes 48 | id: git_status 49 | run: | 50 | git add specification/json/a2a.json 51 | if ! git diff --cached --quiet --exit-code; then 52 | echo "changes_detected=true" >> "$GITHUB_OUTPUT" 53 | echo "a2a.json is not up-to-date with types.ts" 54 | else 55 | echo "a2a.json is up-to-date." 56 | fi 57 | 58 | - name: Commit and Push Changes (if on base repository) 59 | if: steps.git_status.outputs.changes_detected == 'true' && github.event.pull_request.head.repo.full_name == github.repository 60 | run: | 61 | git commit -m "chore: Auto-generate a2a.json from types.ts changes" 62 | git push 63 | 64 | - name: Fail on Fork PR if Changes Required 65 | if: steps.git_status.outputs.changes_detected == 'true' && github.event.pull_request.head.repo.full_name != github.repository 66 | run: | 67 | echo "::error::a2a.json is out of date." 68 | echo "Please run 'npm install' then 'npm run generate' in the 'types' directory of your branch and commit the updated 'specification/json/a2a.json' file." 69 | exit 1 # Exit with a non-zero code to fail the workflow 70 | -------------------------------------------------------------------------------- /.github/workflows/issue-metrics.yml: -------------------------------------------------------------------------------- 1 | name: Monthly issue metrics 2 | on: 3 | workflow_dispatch: 4 | schedule: 5 | - cron: "3 2 1 * *" 6 | 7 | permissions: 8 | contents: read 9 | 10 | jobs: 11 | build: 12 | name: issue metrics 13 | runs-on: ubuntu-latest 14 | permissions: 15 | issues: write 16 | pull-requests: read 17 | steps: 18 | - name: Get dates for last month 19 | shell: bash 20 | run: | 21 | # Calculate the first day of the previous month 22 | first_day=$(date -d "last month" +%Y-%m-01) 23 | 24 | # Calculate the last day of the previous month 25 | last_day=$(date -d "$first_day +1 month -1 day" +%Y-%m-%d) 26 | 27 | # Set an environment variable with the date range 28 | echo "$first_day..$last_day" 29 | echo "last_month=$first_day..$last_day" >> "$GITHUB_ENV" 30 | 31 | - name: Run issue-metrics tool 32 | uses: github/issue-metrics@v3 33 | env: 34 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 35 | SEARCH_QUERY: 'repo:a2aproject/A2A is:issue created:${{ env.last_month }} -reason:"not planned"' 36 | 37 | - name: Create issue 38 | uses: peter-evans/create-issue-from-file@v5 39 | with: 40 | title: Monthly issue metrics report 41 | token: ${{ secrets.GITHUB_TOKEN }} 42 | content-filepath: ./issue_metrics.md 43 | -------------------------------------------------------------------------------- /.github/workflows/links.yaml: -------------------------------------------------------------------------------- 1 | name: Links 2 | 3 | on: 4 | repository_dispatch: 5 | workflow_dispatch: 6 | schedule: 7 | - cron: "00 18 * * *" 8 | 9 | jobs: 10 | linkChecker: 11 | runs-on: ubuntu-latest 12 | if: | 13 | github.repository == 'a2aproject/A2A' 14 | 15 | steps: 16 | - uses: actions/checkout@v4 17 | 18 | - name: Link Checker 19 | id: lychee 20 | uses: lycheeverse/lychee-action@v2 21 | 22 | - name: Create Issue From File 23 | if: env.lychee_exit_code != 0 24 | uses: peter-evans/create-issue-from-file@v5 25 | with: 26 | title: Link Checker Report 27 | content-filepath: ./lychee/out.md 28 | labels: report, automated issue 29 | -------------------------------------------------------------------------------- /.github/workflows/linter.yaml: -------------------------------------------------------------------------------- 1 | ################################# 2 | ################################# 3 | ## Super Linter GitHub Actions ## 4 | ################################# 5 | ################################# 6 | name: Lint Code Base 7 | 8 | # 9 | # Documentation: 10 | # https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions 11 | # 12 | 13 | ############################# 14 | # Start the job on all push # 15 | ############################# 16 | on: 17 | pull_request: 18 | branches: [main] 19 | 20 | ############### 21 | # Set the Job # 22 | ############### 23 | jobs: 24 | build: 25 | # Name the Job 26 | name: Lint Code Base 27 | # Set the agent to run on 28 | runs-on: ubuntu-latest 29 | # if on repo to avoid failing runs on forks 30 | if: | 31 | github.repository == 'a2aproject/A2A' 32 | 33 | ################## 34 | # Load all steps # 35 | ################## 36 | steps: 37 | ########################## 38 | # Checkout the code base # 39 | ########################## 40 | - name: Checkout Code 41 | uses: actions/checkout@v4 42 | with: 43 | # Full git history is needed to get a proper list of changed files within `super-linter` 44 | fetch-depth: 0 45 | 46 | ################################ 47 | # Run Linter against code base # 48 | ################################ 49 | - name: Lint Code Base 50 | uses: super-linter/super-linter/slim@v7 51 | env: 52 | DEFAULT_BRANCH: main 53 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 54 | LOG_LEVEL: WARN 55 | SHELLCHECK_OPTS: -e SC1091 -e 2086 56 | VALIDATE_ALL_CODEBASE: false 57 | FILTER_REGEX_EXCLUDE: "^(\\.github/|\\.vscode/).*|CODE_OF_CONDUCT.md|CHANGELOG.md|GOVERNANCE.md|\\.mkdocs/overrides/.*" 58 | VALIDATE_PYTHON_BLACK: false 59 | VALIDATE_PYTHON_FLAKE8: false 60 | VALIDATE_PYTHON_ISORT: false 61 | VALIDATE_PYTHON_MYPY: false 62 | VALIDATE_PYTHON_PYLINT: false 63 | VALIDATE_PYTHON_PYINK: false 64 | VALIDATE_CHECKOV: false 65 | VALIDATE_JAVASCRIPT_STANDARD: false 66 | VALIDATE_TYPESCRIPT_STANDARD: false 67 | VALIDATE_NATURAL_LANGUAGE: false 68 | MARKDOWN_CONFIG_FILE: ".markdownlint.json" 69 | VALIDATE_MARKDOWN_PRETTIER: false 70 | TYPESCRIPT_ES_CONFIG_FILE: ".eslintrc.js" 71 | VALIDATE_JAVASCRIPT_PRETTIER: false 72 | VALIDATE_JSON_PRETTIER: false 73 | VALIDATE_YAML_PRETTIER: false 74 | VALIDATE_GIT_COMMITLINT: false 75 | -------------------------------------------------------------------------------- /.github/workflows/spelling.yaml: -------------------------------------------------------------------------------- 1 | name: Check Spelling 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - "**" 7 | types: 8 | - "opened" 9 | - "reopened" 10 | - "synchronize" 11 | 12 | jobs: 13 | spelling: 14 | name: Check Spelling 15 | permissions: 16 | contents: read 17 | actions: read 18 | security-events: write 19 | outputs: 20 | followup: ${{ steps.spelling.outputs.followup }} 21 | runs-on: ubuntu-latest 22 | # if on repo to avoid failing runs on forks 23 | if: | 24 | github.repository == 'a2aproject/A2A' 25 | && (contains(github.event_name, 'pull_request') || github.event_name == 'push') 26 | concurrency: 27 | group: spelling-${{ github.event.pull_request.number || github.ref }} 28 | # note: If you use only_check_changed_files, you do not want cancel-in-progress 29 | cancel-in-progress: false 30 | steps: 31 | - name: check-spelling 32 | id: spelling 33 | uses: check-spelling/check-spelling@main 34 | with: 35 | suppress_push_for_open_pull_request: ${{ github.actor != 'dependabot[bot]' && 1 }} 36 | checkout: true 37 | check_file_names: 1 38 | spell_check_this: check-spelling/spell-check-this@main 39 | post_comment: 0 40 | use_magic_file: 1 41 | report-timing: 1 42 | warnings: bad-regex,binary-file,deprecated-feature,ignored-expect-variant,large-file,limited-references,no-newline-at-eof,noisy-file,non-alpha-in-dictionary,token-is-substring,unexpected-line-ending,whitespace-in-dictionary,minified-file,unsupported-configuration,no-files-to-check,unclosed-block-ignore-begin,unclosed-block-ignore-end 43 | experimental_apply_changes_via_bot: 1 44 | dictionary_source_prefixes: '{"cspell": "https://raw.githubusercontent.com/streetsidesoftware/cspell-dicts/main/dictionaries/"}' 45 | extra_dictionaries: | 46 | cspell:aws/dict/aws.txt 47 | cspell:bash/samples/bash-words.txt 48 | cspell:companies/dict/companies.txt 49 | cspell:css/dict/css.txt 50 | cspell:data-science/dict/data-science-models.txt 51 | cspell:data-science/dict/data-science.txt 52 | cspell:data-science/dict/data-science-tools.txt 53 | cspell:en_shared/dict/acronyms.txt 54 | cspell:en_shared/dict/shared-additional-words.txt 55 | cspell:en_GB/en_GB.trie 56 | cspell:en_US/en_US.trie 57 | cspell:filetypes/src/filetypes.txt 58 | cspell:fonts/dict/fonts.txt 59 | cspell:fullstack/dict/fullstack.txt 60 | cspell:golang/dict/go.txt 61 | cspell:google/dict/google.txt 62 | cspell:html/dict/html.txt 63 | cspell:java/src/java.txt 64 | cspell:k8s/dict/k8s.txt 65 | cspell:mnemonics/dict/mnemonics.txt 66 | cspell:monkeyc/src/monkeyc_keywords.txt 67 | cspell:node/dict/node.txt 68 | cspell:npm/dict/npm.txt 69 | cspell:people-names/dict/people-names.txt 70 | cspell:python/dict/python.txt 71 | cspell:python/dict/python-common.txt 72 | cspell:shell/dict/shell-all-words.txt 73 | cspell:software-terms/dict/softwareTerms.txt 74 | cspell:software-terms/dict/webServices.txt 75 | cspell:sql/src/common-terms.txt 76 | cspell:sql/src/sql.txt 77 | cspell:sql/src/tsql.txt 78 | cspell:terraform/dict/terraform.txt 79 | cspell:typescript/dict/typescript.txt 80 | check_extra_dictionaries: "" 81 | only_check_changed_files: true 82 | longest_word: "10" 83 | -------------------------------------------------------------------------------- /.github/workflows/stale.yaml: -------------------------------------------------------------------------------- 1 | # This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time. 2 | # 3 | # You can adjust the behavior by modifying this file. 4 | # For more information, see: 5 | # https://github.com/actions/stale 6 | name: Mark stale issues and pull requests 7 | 8 | on: 9 | schedule: 10 | # Scheduled to run at 10.30PM UTC everyday (1530PDT/1430PST) 11 | - cron: "30 22 * * *" 12 | workflow_dispatch: 13 | 14 | jobs: 15 | stale: 16 | runs-on: ubuntu-latest 17 | permissions: 18 | issues: write 19 | pull-requests: write 20 | actions: write 21 | 22 | steps: 23 | - uses: actions/stale@v9 24 | with: 25 | repo-token: ${{ secrets.GITHUB_TOKEN }} 26 | days-before-issue-stale: 14 27 | days-before-issue-close: 13 28 | stale-issue-label: "status:stale" 29 | close-issue-reason: not_planned 30 | any-of-labels: "status:awaiting response,status:more data needed" 31 | stale-issue-message: > 32 | Marking this issue as stale since it has been open for 14 days with no activity. 33 | This issue will be closed if no further activity occurs. 34 | close-issue-message: > 35 | This issue was closed because it has been inactive for 27 days. 36 | Please post a new issue if you need further assistance. Thanks! 37 | days-before-pr-stale: 14 38 | days-before-pr-close: 13 39 | stale-pr-label: "status:stale" 40 | stale-pr-message: > 41 | Marking this pull request as stale since it has been open for 14 days with no activity. 42 | This PR will be closed if no further activity occurs. 43 | close-pr-message: > 44 | This pull request was closed because it has been inactive for 27 days. 45 | Please open a new pull request if you need further assistance. Thanks! 46 | # Label that can be assigned to issues to exclude them from being marked as stale 47 | exempt-issue-labels: "override-stale" 48 | # Label that can be assigned to PRs to exclude them from being marked as stale 49 | exempt-pr-labels: "override-stale" 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *.pyc 5 | *$py.class 6 | **/dist 7 | /tmp 8 | /out-tsc 9 | /bazel-out 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | downloads/ 20 | eggs/ 21 | .eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | wheels/ 28 | pip-wheel-metadata/ 29 | share/python-wheels/ 30 | *.egg-info/ 31 | .installed.cfg 32 | *.egg 33 | MANIFEST 34 | 35 | # PyInstaller 36 | # Usually these files are written by a python script from a template 37 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 38 | *.manifest 39 | *.spec 40 | 41 | # Installer logs 42 | pip-log.txt 43 | pip-delete-this-directory.txt 44 | 45 | # Unit test / coverage reports 46 | htmlcov/ 47 | .tox/ 48 | .nox/ 49 | .coverage 50 | .coverage.* 51 | .cache 52 | nosetests.xml 53 | coverage.xml 54 | *.cover 55 | *.py,cover 56 | .hypothesis/ 57 | .pytest_cache/ 58 | 59 | # Translations 60 | *.mo 61 | *.pot 62 | 63 | # Django stuff: 64 | *.log 65 | local_settings.py 66 | db.sqlite3 67 | db.sqlite3-journal 68 | 69 | # Flask stuff: 70 | instance/ 71 | .webassets-cache 72 | 73 | # Scrapy stuff: 74 | .scrapy 75 | 76 | # Sphinx documentation 77 | docs/_build/ 78 | 79 | # PyBuilder 80 | target/ 81 | 82 | # Jupyter Notebook 83 | .ipynb_checkpoints 84 | 85 | # IPython 86 | profile_default/ 87 | ipython_config.py 88 | 89 | # pyenv 90 | .python-version 91 | 92 | # pipenv 93 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 94 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 95 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 96 | # install all needed dependencies. 97 | Pipfile.lock 98 | Pipfile 99 | 100 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 101 | __pypackages__/ 102 | 103 | # Celery stuff 104 | celerybeat-schedule 105 | celerybeat.pid 106 | 107 | # SageMath parsed files 108 | *.sage.py 109 | 110 | # Environments 111 | .env 112 | .venv 113 | .venv* 114 | env/ 115 | venv/ 116 | ENV/ 117 | env.bak/ 118 | venv.bak/ 119 | 120 | # Spyder project settings 121 | .spyderproject 122 | .spyproject 123 | 124 | # Rope project settings 125 | .ropeproject 126 | 127 | # mkdocs documentation 128 | /site 129 | 130 | # mypy 131 | .mypy_cache/ 132 | .dmypy.json 133 | dmypy.json 134 | .ruff_cache/ 135 | 136 | # Pyre type checker 137 | .pyre/ 138 | 139 | # macOS 140 | .DS_Store 141 | 142 | # PyCharm 143 | .idea 144 | 145 | # User-specific files 146 | language/examples/prompt-design/train.csv 147 | README-TOC*.md 148 | 149 | # Terraform 150 | terraform.tfstate** 151 | .terraform* 152 | .Terraform* 153 | 154 | tmp* 155 | 156 | # Node 157 | **/node_modules 158 | npm-debug.log 159 | yarn-error.log 160 | 161 | # IDEs and editors 162 | .idea/ 163 | .project 164 | .classpath 165 | .c9/ 166 | *.launch 167 | .settings/ 168 | *.sublime-workspace 169 | 170 | # Miscellaneous 171 | **/.angular/* 172 | /.angular/cache 173 | .sass-cache/ 174 | /connect.lock 175 | /coverage 176 | /libpeerconnection.log 177 | testem.log 178 | /typings 179 | 180 | # System files 181 | .DS_Store 182 | Thumbs.db 183 | -------------------------------------------------------------------------------- /.mkdocs/overrides/main.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block announce %} 4 | <div class="announce"> 5 | <p> 6 | Join us on July 12-13 at the Weights & Biases office in San Francisco for a 7 | <a href="https://lu.ma/weavehacks" class="md-button md-button--primary">A2A/MCP Hackathon</a> 8 | </p> 9 | </div> 10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "useTabs": false, 4 | "trailingComma": "es5", 5 | "bracketSameLine": true, 6 | "overrides": [ 7 | { 8 | "files": "*.md", 9 | "options": { 10 | "tabWidth": 4, 11 | "useTabs": false, 12 | "trailingComma": "es5" 13 | } 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /.ruff.toml: -------------------------------------------------------------------------------- 1 | ################################################################################# 2 | # 3 | # Ruff linter and code formatter for A2A 4 | # 5 | # This file follows the standards in Google Python Style Guide 6 | # https://google.github.io/styleguide/pyguide.html 7 | # 8 | # The settings below are for the IDE configuration, and are optional. 9 | #{ 10 | # "editor.formatOnSave": true, 11 | # "[python]": { 12 | # "editor.defaultFormatter": "charliermarsh.ruff", 13 | # "editor.formatOnSave": true, 14 | # "editor.codeActionsOnSave": { 15 | # "source.organizeImports": "true" 16 | # }, 17 | # }, 18 | # "ruff.importStrategy": "fromEnvironment", 19 | #} 20 | 21 | line-length = 80 # Google Style Guide §3.2: 80 columns 22 | indent-width = 4 # Google Style Guide §3.4: 4 spaces 23 | 24 | target-version = "py312" # Minimum Python version 25 | 26 | [lint] 27 | ignore = [ 28 | "COM812", 29 | "FBT001", 30 | "FBT002", 31 | "D203", 32 | "D213", 33 | "ANN001", 34 | "ANN201", 35 | "ANN204", 36 | "D100", # Ignore Missing docstring in public module (often desired at top level __init__.py) 37 | "D102", # Ignore return type annotation in public method 38 | "D104", # Ignore Missing docstring in public package (often desired at top level __init__.py) 39 | "D107", # Ignore Missing docstring in __init__ (use class docstring) 40 | "TD002", # Ignore Missing author in TODOs (often not required) 41 | "TD003", # Ignore Missing issue link in TODOs (often not required/available) 42 | "T201", # Ignore print presence 43 | "RUF012", # Ignore Mutable class attributes should be annotated with `typing.ClassVar` 44 | "RUF013", # Ignore implicit optional 45 | ] 46 | 47 | select = [ 48 | "E", # pycodestyle errors (PEP 8) 49 | "W", # pycodestyle warnings (PEP 8) 50 | "F", # Pyflakes (logical errors, unused imports/variables) 51 | "I", # isort (import sorting - Google Style §3.1.2) 52 | "D", # pydocstyle (docstring conventions - Google Style §3.8) 53 | "N", # pep8-naming (naming conventions - Google Style §3.16) 54 | "UP", # pyupgrade (use modern Python syntax) 55 | "ANN",# flake8-annotations (type hint usage/style - Google Style §2.22) 56 | "A", # flake8-builtins (avoid shadowing builtins) 57 | "B", # flake8-bugbear (potential logic errors & style issues - incl. mutable defaults B006, B008) 58 | "C4", # flake8-comprehensions (unnecessary list/set/dict comprehensions) 59 | "ISC",# flake8-implicit-str-concat (disallow implicit string concatenation across lines) 60 | "T20",# flake8-print (discourage `print` - prefer logging) 61 | "SIM",# flake8-simplify (simplify code, e.g., `if cond: return True else: return False`) 62 | "PTH",# flake8-use-pathlib (use pathlib instead of os.path where possible) 63 | "PL", # Pylint rules ported to Ruff (PLC, PLE, PLR, PLW) 64 | "PIE",# flake8-pie (misc code improvements, e.g., no-unnecessary-pass) 65 | "RUF",# Ruff-specific rules (e.g., RUF001-003 ambiguous unicode) 66 | "RET",# flake8-return (consistency in return statements) 67 | "SLF",# flake8-self (check for private member access via `self`) 68 | "TID",# flake8-tidy-imports (relative imports, banned imports - configure if needed) 69 | "YTT",# flake8-boolean-trap (checks for boolean positional arguments, truthiness tests - Google Style §3.10) 70 | "TD", # flake8-todos (check TODO format - Google Style §3.7) 71 | ] 72 | 73 | exclude = [ 74 | ".bzr", 75 | ".direnv", 76 | ".eggs", 77 | ".git", 78 | ".hg", 79 | ".mypy_cache", 80 | ".nox", 81 | ".pants.d", 82 | ".pytype", 83 | ".ruff_cache", 84 | ".svn", 85 | ".tox", 86 | ".venv", 87 | "__pypackages__", 88 | "_build", 89 | "buck-out", 90 | "build", 91 | "dist", 92 | "node_modules", 93 | "venv", 94 | "*/migrations/*", 95 | ] 96 | 97 | [lint.isort] 98 | #force-sort-within-sections = true 99 | #combine-as-imports = true 100 | case-sensitive = true 101 | #force-single-line = false 102 | #known-first-party = [] 103 | #known-third-party = [] 104 | lines-after-imports = 2 105 | lines-between-types = 1 106 | #no-lines-before = ["LOCALFOLDER"] 107 | #required-imports = [] 108 | #section-order = ["future", "standard-library", "third-party", "first-party", "local-folder"] 109 | 110 | [lint.pydocstyle] 111 | convention = "google" 112 | 113 | [lint.flake8-annotations] 114 | mypy-init-return = true 115 | allow-star-arg-any = false 116 | 117 | [lint.pep8-naming] 118 | ignore-names = ["test_*", "setUp", "tearDown", "mock_*"] 119 | classmethod-decorators = ["classmethod", "pydantic.validator", "pydantic.root_validator"] 120 | staticmethod-decorators = ["staticmethod"] 121 | 122 | [lint.flake8-tidy-imports] 123 | ban-relative-imports = "all" # Google generally prefers absolute imports (§3.1.2) 124 | 125 | [lint.flake8-quotes] 126 | docstring-quotes = "double" 127 | inline-quotes = "single" 128 | 129 | [lint.per-file-ignores] 130 | "__init__.py" = ["F401"] # Ignore unused imports in __init__.py 131 | "*_test.py" = ["D", "ANN"] # Ignore docstring and annotation issues in test files 132 | "test_*.py" = ["D", "ANN"] # Ignore docstring and annotation issues in test files 133 | 134 | [format] 135 | docstring-code-format = true 136 | docstring-code-line-length = "dynamic" # Or set to 80 137 | quote-style = "single" 138 | indent-style = "space" 139 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "[python]": { 4 | "editor.defaultFormatter": "charliermarsh.ruff", 5 | "editor.formatOnSave": true, 6 | "editor.codeActionsOnSave": { 7 | "source.organizeImports": "explicit" 8 | } 9 | }, 10 | "ruff.importStrategy": "fromEnvironment", 11 | "markdownlint.configFile": ".github/linters/.markdownlint.json", 12 | "[json]": { 13 | "editor.defaultFormatter": "vscode.json-language-features", 14 | "editor.formatOnSave": true 15 | }, 16 | "files.trimTrailingWhitespace": true, 17 | "files.insertFinalNewline": true 18 | } 19 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [0.2.5](https://github.com/a2aproject/A2A/compare/v0.2.4...v0.2.5) (2025-06-30) 4 | 5 | 6 | ### ⚠ BREAKING CHANGES 7 | 8 | * **spec:** Add a required protocol version to the agent card. ([#802](https://github.com/a2aproject/A2A/issues/802)) 9 | * Support for multiple pushNotification config per task ([#738](https://github.com/a2aproject/A2A/issues/738)) ([f355d3e](https://github.com/a2aproject/A2A/commit/f355d3e922de61ba97873fe2989a8987fc89eec2)) 10 | 11 | 12 | ### Features 13 | 14 | * **spec:** Add a required protocol version to the agent card. ([#802](https://github.com/a2aproject/A2A/issues/802)) ([90fa642](https://github.com/a2aproject/A2A/commit/90fa64209498948b329a7b2ac6ec38942369157a)) 15 | * **spec:** Support for multiple pushNotification config per task ([#738](https://github.com/a2aproject/A2A/issues/738)) ([f355d3e](https://github.com/a2aproject/A2A/commit/f355d3e922de61ba97873fe2989a8987fc89eec2)) 16 | 17 | 18 | ### Documentation 19 | 20 | * update spec & doc topic with non-restartable tasks ([#770](https://github.com/a2aproject/A2A/issues/770)) ([ebc4157](https://github.com/a2aproject/A2A/commit/ebc4157ca87ae08d1c55e38e522a1a17201f2854)) 21 | 22 | ## [0.2.4](https://github.com/a2aproject/A2A/compare/v0.2.3...v0.2.4) (2025-06-30) 23 | 24 | 25 | ### Features 26 | 27 | * feat: Add support for multiple transport announcement in AgentCard ([#749](https://github.com/a2aproject/A2A/issues/749)) ([b35485e](https://github.com/a2aproject/A2A/commit/b35485e02e796d15232dec01acfab93fc858c3ec)) 28 | 29 | ## [0.2.3](https://github.com/a2aproject/A2A/compare/v0.2.2...v0.2.3) (2025-06-12) 30 | 31 | 32 | ### Bug Fixes 33 | 34 | * Address some typos in gRPC annotations ([#747](https://github.com/a2aproject/A2A/issues/747)) ([f506881](https://github.com/a2aproject/A2A/commit/f506881c9b8ff0632d7c7107d5c426646ae31592)) 35 | 36 | ## [0.2.2](https://github.com/a2aproject/A2A/compare/v0.2.1...v0.2.2) (2025-06-09) 37 | 38 | 39 | ### ⚠ BREAKING CHANGES 40 | 41 | * Resolve spec inconsistencies with JSON-RPC 2.0 42 | 43 | ### Features 44 | 45 | * Add gRPC and REST definitions to A2A protocol specifications ([#695](https://github.com/a2aproject/A2A/issues/695)) ([89bb5b8](https://github.com/a2aproject/A2A/commit/89bb5b82438b74ff7bb0fafbe335db7100a0ac57)) 46 | * Add protocol support for extensions ([#716](https://github.com/a2aproject/A2A/issues/716)) ([70f1e2b](https://github.com/a2aproject/A2A/commit/70f1e2b0c68a3631888091ce9460a9f7fbfbdff2)) 47 | * **spec:** Add an optional iconUrl field to the AgentCard ([#687](https://github.com/a2aproject/A2A/issues/687)) ([9f3bb51](https://github.com/a2aproject/A2A/commit/9f3bb51257f008bd878d85e00ec5e88357016039)) 48 | 49 | 50 | ### Bug Fixes 51 | 52 | * Protocol should released as 0.2.2 ([22e7541](https://github.com/a2aproject/A2A/commit/22e7541be082c4f0845ff7fa044992cda05b437e)) 53 | * Resolve spec inconsistencies with JSON-RPC 2.0 ([628380e](https://github.com/a2aproject/A2A/commit/628380e7e392bc8f1778ae991d4719bd787c17a9)) 54 | 55 | ## [0.2.1](https://github.com/a2aproject/A2A/compare/v0.2.0...v0.2.1) (2025-05-27) 56 | 57 | ### Features 58 | 59 | * Add a new boolean for supporting authenticated extended cards ([#618](https://github.com/a2aproject/A2A/issues/618)) ([e0a3070](https://github.com/a2aproject/A2A/commit/e0a3070fc289110d43faf2e91b4ffe3c29ef81da)) 60 | * Add optional referenceTaskIds for task followups ([#608](https://github.com/a2aproject/A2A/issues/608)) ([5368e77](https://github.com/a2aproject/A2A/commit/5368e7728cb523caf1a9218fda0b1646325f524b)) 61 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of 9 | experience, education, socio-economic status, nationality, personal appearance, 10 | race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or reject 41 | comments, commits, code, wiki edits, issues, and other contributions that are 42 | not aligned to this Code of Conduct, or to ban temporarily or permanently any 43 | contributor for other behaviors that they deem inappropriate, threatening, 44 | offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | This Code of Conduct also applies outside the project spaces when the Project 56 | Steward has a reasonable belief that an individual's behavior may have a 57 | negative impact on the project or its community. 58 | 59 | ## Conflict Resolution 60 | 61 | We do not believe that all conflict is bad; healthy debate and disagreement 62 | often yield positive results. However, it is never okay to be disrespectful or 63 | to engage in behavior that violates the project’s code of conduct. 64 | 65 | If you see someone violating the code of conduct, you are encouraged to address 66 | the behavior directly with those involved. Many issues can be resolved quickly 67 | and easily, and this gives people more control over the outcome of their 68 | dispute. If you are unable to resolve the matter for any reason, or if the 69 | behavior is threatening or harassing, report it. We are dedicated to providing 70 | an environment where participants feel welcome and safe. 71 | 72 | Reports should be directed to *[PROJECT STEWARD NAME(s) AND EMAIL(s)]*, the 73 | Project Steward(s) for *[PROJECT NAME]*. It is the Project Steward’s duty to 74 | receive and address reported violations of the code of conduct. They will then 75 | work with a committee consisting of representatives from the Open Source 76 | Programs Office and the Google Open Source Strategy team. If for any reason you 77 | are uncomfortable reaching out to the Project Steward, please email 78 | opensource@google.com. 79 | 80 | We will investigate every complaint, but you may not receive a direct response. 81 | We will use our discretion in determining when and how to follow up on reported 82 | incidents, which may range from not taking action to permanent expulsion from 83 | the project and project-sponsored spaces. We will notify the accused of the 84 | report and provide them an opportunity to discuss it before any action is taken. 85 | The identity of the reporter will be omitted from the details of the report 86 | supplied to the accused. In potentially harmful situations, such as ongoing 87 | harassment or threats to anyone's safety, we may take action without notice. 88 | 89 | ## Attribution 90 | 91 | This Code of Conduct is adapted from the Contributor Covenant, version 1.4, 92 | available at 93 | https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 94 | 95 | Note: A version of this file is also available in the 96 | [New Project repo](https://github.com/google/new-project/blob/master/docs/code-of-conduct.md). 97 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to contribute 2 | 3 | We'd love to accept your patches and contributions to this project. 4 | 5 | ## Contribution process 6 | 7 | ### Code reviews 8 | 9 | All submissions, including submissions by project members, require review. We 10 | use GitHub pull requests for this purpose. Consult 11 | [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more 12 | information on using pull requests. 13 | 14 | ### Contributor Guide 15 | 16 | You may follow these steps to contribute: 17 | 18 | 1. **Fork the official repository.** This will create a copy of the official repository in your own account. 19 | 2. **Sync the branches.** This will ensure that your copy of the repository is up-to-date with the latest changes from the official repository. 20 | 3. **Work on your forked repository's feature branch.** This is where you will make your changes to the code. 21 | 4. **Commit your updates on your forked repository's feature branch.** This will save your changes to your copy of the repository. 22 | 5. **Submit a pull request to the official repository's main branch.** This will request that your changes be merged into the official repository. 23 | 6. **Resolve any linting errors.** This will ensure that your changes are formatted correctly. 24 | 25 | Here are some additional things to keep in mind during the process: 26 | 27 | - **Test your changes.** Before you submit a pull request, make sure that your changes work as expected. 28 | - **Be patient.** It may take some time for your pull request to be reviewed and merged. 29 | -------------------------------------------------------------------------------- /GOVERNANCE.md: -------------------------------------------------------------------------------- 1 | ## **The Agent to Agent project is governed by the Technical Steering Committee. The Committee has seven seats, each held by the following companies:** 2 | 3 | 1. Google 4 | 2. Microsoft 5 | 3. Cisco 6 | 4. Amazon Web Services 7 | 5. Salesforce 8 | 6. ServiceNow 9 | 7. SAP 10 | ## **Mission and Scope of the Project** 11 | 1. The mission of the Project is to help AI agents across different ecosystems communicate with each other. The Project includes collaborative development of the following components: 12 | 1. the Agent2Agent Protocol (the “Protocol”); 13 | 2. a SDK for designing implementations of the Protocol and related software components; and 14 | 3. documentation and other artifacts related to the Project. 15 | 2. The scope of the Project includes collaborative development under the Project License (as defined herein) supporting the mission, including documentation, testing, integration and the creation of other artifacts that aid the development, deployment, operation or adoption of the open source project. 16 | 17 | 18 | ## **Technical Steering Committee** 19 | 20 | 1. The Technical Steering Committee (the “TSC”) will be responsible for all technical oversight of the open source Project. 21 | 2. TSC Composition 22 | a. “Startup Phase.” At the inception of the Project, each organization listed in the [GOVERNANCE.MD](http://GOVERNANCE.MD) file in the governance repository of the Project will have the right to appoint (and remove and replace) one employee to serve as a voting member of the TSC. 23 | b. “Steady State.” The TSC will decide upon a “steady state” composition of the TSC (whether by election, sub-project technical leads, or other method as determined by the TSC) for composition of the TSC from the date that is 18 months following the inception of the Project, or at such other point as determined by the TSC. 24 | The TSC may choose an alternative approach for determining the voting members of the TSC, and any such alternative approach will be documented in the GOVERNANCE file. Any meetings of the Technical Steering Committee are intended to be open to the public, and can be conducted electronically, via teleconference, or in person. 25 | 3. TSC projects generally will involve Contributors and Maintainers. The TSC may adopt or modify roles so long as the roles are documented in the CONTRIBUTING file. Unless otherwise documented: 26 | a. Contributors include anyone in the technical community that contributes code, documentation, or other technical artifacts to the Project; 27 | b. Maintainers are Contributors who have earned the ability to modify (“commit”) source code, documentation or other technical artifacts in a project’s repository; and 28 | c. A Contributor may become a Maintainer by a vote of the TSC. A Maintainer may be removed by a vote of the TSC. 29 | d. Participation in the Project through becoming a Contributor and Maintainer is open to anyone so long as they abide by the terms of this Charter. 30 | 4. The TSC may (1) establish work flow procedures for the submission, approval, and closure/archiving of projects, (2) set requirements for the promotion of Contributors to Maintainer status, as applicable, and (3) amend, adjust, refine and/or eliminate the roles of Contributors, and Maintainer, and create new roles, and publicly document any TSC roles, as it sees fit. 31 | 5. The TSC may elect a TSC Chair, who will preside over meetings of the TSC and will serve until their resignation or replacement by the TSC. 32 | 6. Responsibilities: The TSC will be responsible for all aspects of oversight relating to the Project, which may include: 33 | 1. coordinating the technical direction of the Project; 34 | 2. approving project or system proposals (including, but not limited to, incubation, deprecation, and changes to a sub-project’s scope); 35 | 3. organizing sub-projects and removing sub-projects; 36 | 4. creating sub-committees or working groups to focus on cross-project technical issues and requirements; 37 | 5. appointing representatives to work with other open source or open standards communities; 38 | 6. establishing community norms, workflows, issuing releases, and security issue reporting policies; 39 | 7. approving and implementing policies and processes for contributing (to be published in the CONTRIBUTING file) and coordinating with the series manager of the Project (as provided for in the Series Agreement, the “Series Manager”) to resolve matters or concerns that may arise as set forth in Section 7 of this Charter; 40 | 8. discussions, seeking consensus, and where necessary, voting on technical matters relating to the code base that affect multiple projects; and 41 | 9. coordinating any marketing, events, or communications regarding the Project. 42 | ## TSC Voting 43 | While the Project aims to operate as a consensus-based community, if any TSC decision requires a vote to move the Project forward, the voting members of the TSC will vote on a one vote per voting member basis. 44 | Quorum for TSC meetings requires at least fifty percent of all voting members of the TSC to be present. The TSC may continue to meet if quorum is not met but will be prevented from making any decisions at the meeting. Except as provided in Section 7.c. and 8.a, decisions by vote at a meeting require a majority vote of those in attendance, provided quorum is met. Decisions made by electronic vote without a meeting require a majority vote of all voting members of the TSC. 45 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Agent2Agent (A2A) Protocol 2 | 3 | [![PyPI - Version](https://img.shields.io/pypi/v/a2a-sdk)](https://pypi.org/project/a2a-sdk) 4 | [![Apache License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) 5 | 6 | ![A2A Banner](docs/assets/a2a-banner.png) 7 | 8 | **An open protocol enabling communication and interoperability between opaque agentic applications.** 9 | 10 | The Agent2Agent (A2A) protocol addresses a critical challenge in the AI landscape: enabling gen AI agents, built on diverse frameworks by different companies running on separate servers, to communicate and collaborate effectively - as agents, not just as tools. A2A aims to provide a common language for agents, fostering a more interconnected, powerful, and innovative AI ecosystem. 11 | 12 | With A2A, agents can: 13 | 14 | - Discover each other's capabilities. 15 | - Negotiate interaction modalities (text, forms, media). 16 | - Securely collaborate on long running tasks. 17 | - Operate without exposing their internal state, memory, or tools. 18 | 19 | ## Intro to A2A Video 20 | 21 | [![A2A Intro Video](https://img.youtube.com/vi/Fbr_Solax1w/hqdefault.jpg)](https://goo.gle/a2a-video) 22 | 23 | ## Why A2A? 24 | 25 | As AI agents become more prevalent, their ability to interoperate is crucial for building complex, multi-functional applications. A2A aims to: 26 | 27 | - **Break Down Silos:** Connect agents across different ecosystems. 28 | - **Enable Complex Collaboration:** Allow specialized agents to work together on tasks that a single agent cannot handle alone. 29 | - **Promote Open Standards:** Foster a community-driven approach to agent communication, encouraging innovation and broad adoption. 30 | - **Preserve Opacity:** Allow agents to collaborate without needing to share internal memory, proprietary logic, or specific tool implementations, enhancing security and protecting intellectual property. 31 | 32 | ### Key Features 33 | 34 | - **Standardized Communication:** JSON-RPC 2.0 over HTTP(S). 35 | - **Agent Discovery:** Via "Agent Cards" detailing capabilities and connection info. 36 | - **Flexible Interaction:** Supports synchronous request/response, streaming (SSE), and asynchronous push notifications. 37 | - **Rich Data Exchange:** Handles text, files, and structured JSON data. 38 | - **Enterprise-Ready:** Designed with security, authentication, and observability in mind. 39 | 40 | ## Getting Started 41 | 42 | - 📚 **Explore the Documentation:** Visit the [Agent2Agent Protocol Documentation Site](https://goo.gle/a2a) for a complete overview, the full protocol specification, tutorials, and guides. 43 | - 📝 **View the Specification:** [A2A Protocol Specification](https://a2aproject.github.io/A2A/latest/specification/) 44 | - Use the SDKs: 45 | - [🐍 A2A Python SDK](https://github.com/a2aproject/a2a-python) `pip install a2a-sdk` 46 | - [🧑‍💻 A2A JS SDK](https://github.com/a2aproject/a2a-js) `npm install @a2a-js/sdk` 47 | - [☕️ A2A Java SDK](https://github.com/a2aproject/a2a-java) using maven 48 | - 🎬 Use our [samples](https://github.com/a2aproject/a2a-samples) to see A2A in action 49 | 50 | ## Contributing 51 | 52 | We welcome community contributions to enhance and evolve the A2A protocol! 53 | 54 | - **Questions & Discussions:** Join our [GitHub Discussions](https://github.com/a2aproject/A2A/discussions). 55 | - **Issues & Feedback:** Report issues or suggest improvements via [GitHub Issues](https://github.com/a2aproject/A2A/issues). 56 | - **Contribution Guide:** See our [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute. 57 | - **Private Feedback:** Use this [Google Form](https://goo.gle/a2a-feedback). 58 | - **Partner Program:** Google Cloud customers can join our partner program via this [form](https://goo.gle/a2a-partner). 59 | 60 | ## What's next 61 | 62 | ### Protocol Enhancements 63 | 64 | - **Agent Discovery:** 65 | - Formalize inclusion of authorization schemes and optional credentials directly within the `AgentCard`. 66 | - **Agent Collaboration:** 67 | - Investigate a `QuerySkill()` method for dynamically checking unsupported or unanticipated skills. 68 | - **Task Lifecycle & UX:** 69 | - Support for dynamic UX negotiation _within_ a task (e.g., agent adding audio/video mid-conversation). 70 | - **Client Methods & Transport:** 71 | - Explore extending support to client-initiated methods (beyond task management). 72 | - Improvements to streaming reliability and push notification mechanisms. 73 | 74 | ## About 75 | 76 | The A2A Protocol is an open-source project by Google LLC, under the [Apache License 2.0](LICENSE), and is open to contributions from the community. 77 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | To report a security issue, please use [g.co/vulnz](https://g.co/vulnz). 4 | 5 | The Google Security Team will respond within 5 working days of your report on g.co/vulnz. 6 | 7 | We use g.co/vulnz for our intake, and do coordination and disclosure here using GitHub Security Advisory to privately discuss and fix the issue. 8 | -------------------------------------------------------------------------------- /docs/404.html: -------------------------------------------------------------------------------- 1 | <!DOCTYPE html> 2 | <html> 3 | 4 | <head> 5 | <meta charset="utf-8"> 6 | <title>Redirecting...</title> 7 | <script> 8 | (function () { 9 | const basePath = '/A2A/'; 10 | const latestVersion = 'latest'; 11 | 12 | const path = window.location.pathname; 13 | const redirected = sessionStorage.getItem('redirected'); 14 | 15 | if (redirected) { 16 | sessionStorage.removeItem('redirected'); 17 | console.warn('Redirect loop detected. Stopping redirect.'); 18 | return; 19 | } 20 | 21 | // Check if the path is an asset or already a versioned path 22 | const isAsset = path.includes('/assets/') || path.includes('/stylesheets/'); 23 | const isVersioned = new RegExp(`${basePath}(v?(\d+\.\d+(\.\d+)?)|${latestVersion})/`).test(path); 24 | 25 | if (!isVersioned && !isAsset) { 26 | // Construct the new URL. 27 | // Example: /A2A/specification.md -> /A2A/latest/specification.md 28 | const newPath = path.replace(basePath, basePath + latestVersion + '/'); 29 | 30 | // Store a marker in sessionStorage to prevent loops 31 | sessionStorage.setItem('redirected', 'true'); 32 | 33 | // Perform the redirect 34 | window.location.replace(newPath + window.location.search + window.location.hash); 35 | } else { 36 | window.location.replace("https://a2aproject.github.io/A2A/"); 37 | } 38 | })(); 39 | </script> 40 | </head> 41 | 42 | <body> 43 | <h1>Page Not Found</h1> 44 | <p>We are attempting to redirect you to the latest version of this page.</p> 45 | <p>If you are not redirected automatically, please navigate to the <a href="/A2A/">project homepage</a>.</p> 46 | </body> 47 | 48 | </html> 49 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # A2A Docs 2 | 3 | ## Published A2A docs 4 | 5 | [`https://a2aproject.github.io/A2A`](https://a2aproject.github.io/A2A) 6 | 7 | ## Developing A2A docs 8 | 9 | 1. Clone this repository and `cd` into the repository directory 10 | 2. Run `pip install -r requirements-docs.txt` 11 | 3. Run `mkdocs serve`, edit `.md` files, and live preview 12 | 4. Contribute docs changes as usual 13 | 14 | ## How it works 15 | 16 | - The A2A docs use [mkdocs](https://www.mkdocs.org/) and the 17 | [mkdocs-material theme](https://squidfunk.github.io/mkdocs-material/) 18 | - All of the source documentation / Markdown files related to the A2A docs are 19 | in the `docs/` directory in the A2A repository 20 | - `mkdocs.yml` in the repository root contains all of the docs config, including 21 | the site navigation and organization 22 | - There is a GitHub Action in `.github/workflows/docs.yml` that builds and 23 | publishes the docs and pushes the built assets to the `gh-pages` branch in 24 | this repository using `mkdocs gh-deploy --force`. This happens automatically for all 25 | commits / merges to `main`. 26 | - The A2A documentation is hosted in GitHub pages, and the settings for this are 27 | in the A2A repository settings in GitHub. 28 | -------------------------------------------------------------------------------- /docs/assets/a2a-actors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google-a2a/A2A/74ec26167cfb8e87d71dec9a2defabbbbfab55ac/docs/assets/a2a-actors.png -------------------------------------------------------------------------------- /docs/assets/a2a-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google-a2a/A2A/74ec26167cfb8e87d71dec9a2defabbbbfab55ac/docs/assets/a2a-banner.png -------------------------------------------------------------------------------- /docs/assets/a2a-logo-black.svg: -------------------------------------------------------------------------------- 1 | <svg width="30" height="18.5" viewBox="3 9 30 18.5" fill="none" xmlns="http://www.w3.org/2000/svg"> 2 | <path d="M8.7 14.725C8.51667 14.9083 8.28333 15 8 15C7.71667 15 7.475 14.9083 7.275 14.725C7.09167 14.525 7 14.2833 7 14C7 13.7167 7.09167 13.4833 7.275 13.3C7.475 13.1 7.71667 13 8 13C8.28333 13 8.51667 13.1 8.7 13.3C8.9 13.4833 9 13.7167 9 14C9 14.2833 8.9 14.525 8.7 14.725Z" fill="black"/> 3 | <path d="M14.7 14.725C14.5167 14.9083 14.2833 15 14 15C13.7167 15 13.475 14.9083 13.275 14.725C13.0917 14.525 13 14.2833 13 14C13 13.7167 13.0917 13.4833 13.275 13.3C13.475 13.1 13.7167 13 14 13C14.2833 13 14.5167 13.1 14.7 13.3C14.9 13.4833 15 13.7167 15 14C15 14.2833 14.9 14.525 14.7 14.725Z" fill="black"/> 4 | <path d="M22.7 14.725C22.5167 14.9083 22.2833 15 22 15C21.7167 15 21.475 14.9083 21.275 14.725C21.0917 14.525 21 14.2833 21 14C21 13.7167 21.0917 13.4833 21.275 13.3C21.475 13.1 21.7167 13 22 13C22.2833 13 22.5167 13.1 22.7 13.3C22.9 13.4833 23 13.7167 23 14C23 14.2833 22.9 14.525 22.7 14.725Z" fill="black"/> 5 | <path d="M28.7 14.725C28.5167 14.9083 28.2833 15 28 15C27.7167 15 27.475 14.9083 27.275 14.725C27.0917 14.525 27 14.2833 27 14C27 13.7167 27.0917 13.4833 27.275 13.3C27.475 13.1 27.7167 13 28 13C28.2833 13 28.5167 13.1 28.7 13.3C28.9 13.4833 29 13.7167 29 14C29 14.2833 28.9 14.525 28.7 14.725Z" fill="black"/> 6 | <path fill-rule="evenodd" clip-rule="evenodd" d="M5 14C5 12.3431 6.34315 11 8 11H14C14.776 11 15.284 11.1537 15.64 11.3818C15.8589 10.794 16.1517 10.1709 16.555 9.59795C15.8797 9.21153 15.0386 9 14 9H8C5.23858 9 3 11.2386 3 14C3 16.7612 5.23759 19 7.99926 19H14C15.7634 19 16.9573 18.3902 17.7375 17.35C18.4228 16.4363 18.7148 15.266 18.9483 14.3299L18.9701 14.2425C19.2327 13.1924 19.4442 12.4077 19.8625 11.85C20.2073 11.3902 20.7634 11 22 11H28.0005C29.6572 11 31 12.343 31 14C31 15.6569 29.6569 17 28 17H22C21.224 17 20.716 16.8463 20.36 16.6182C20.1411 17.206 19.8483 17.8291 19.445 18.402C20.1203 18.7885 20.9614 19 22 19H28C30.7614 19 33 16.7614 33 14C33 11.2388 30.7621 9 28.0005 9H22C20.2366 9 19.0427 9.60979 18.2625 10.65C17.5772 11.5637 17.2852 12.734 17.0517 13.6701L17.0299 13.7575C16.7673 14.8076 16.5558 15.5923 16.1375 16.15C15.7927 16.6098 15.2366 17 14 17H7.99926C6.34265 17 5 15.6571 5 14Z" fill="black"/> 7 | <path d="M7 23.5C6.71667 23.5 6.475 23.4083 6.275 23.225C6.09167 23.025 6 22.7833 6 22.5C6 22.2167 6.09167 21.9833 6.275 21.8C6.475 21.6 6.71667 21.5 7 21.5H12C12.2833 21.5 12.5167 21.6 12.7 21.8C12.9 21.9833 13 22.2167 13 22.5C13 22.7833 12.9 23.025 12.7 23.225C12.5167 23.4083 12.2833 23.5 12 23.5H7ZM5 27.5C4.71667 27.5 4.475 27.4083 4.275 27.225C4.09167 27.025 4 26.7833 4 26.5C4 26.2167 4.09167 25.9833 4.275 25.8C4.475 25.6 4.71667 25.5 5 25.5H8C8.28333 25.5 8.51667 25.6 8.7 25.8C8.9 25.9833 9 26.2167 9 26.5C9 26.7833 8.9 27.025 8.7 27.225C8.51667 27.4083 8.28333 27.5 8 27.5H5ZM12 27.5C11.7167 27.5 11.475 27.4083 11.275 27.225C11.0917 27.025 11 26.7833 11 26.5C11 26.2167 11.0917 25.9833 11.275 25.8C11.475 25.6 11.7167 25.5 12 25.5H20C20.2833 25.5 20.5167 25.6 20.7 25.8C20.9 25.9833 21 26.2167 21 26.5C21 26.7833 20.9 27.025 20.7 27.225C20.5167 27.4083 20.2833 27.5 20 27.5H12ZM28 27.5C27.7167 27.5 27.475 27.4083 27.275 27.225C27.0917 27.025 27 26.7833 27 26.5C27 26.2167 27.0917 25.9833 27.275 25.8C27.475 25.6 27.7167 25.5 28 25.5H32C32.2833 25.5 32.5167 25.6 32.7 25.8C32.9 25.9833 33 26.2167 33 26.5C33 26.7833 32.9 27.025 32.7 27.225C32.5167 27.4083 32.2833 27.5 32 27.5H28ZM16 23.5C15.7167 23.5 15.475 23.4083 15.275 23.225C15.0917 23.025 15 22.7833 15 22.5C15 22.2167 15.0917 21.9833 15.275 21.8C15.475 21.6 15.7167 21.5 16 21.5C16.2833 21.5 16.5167 21.6 16.7 21.8C16.9 21.9833 17 22.2167 17 22.5C17 22.7833 16.9 23.025 16.7 23.225C16.5167 23.4083 16.2833 23.5 16 23.5ZM24 27.5C23.7167 27.5 23.475 27.4083 23.275 27.225C23.0917 27.025 23 26.7833 23 26.5C23 26.2167 23.0917 25.9833 23.275 25.8C23.475 25.6 23.7167 25.5 24 25.5C24.2833 25.5 24.5167 25.6 24.7 25.8C24.9 25.9833 25 26.2167 25 26.5C25 26.7833 24.9 27.025 24.7 27.225C24.5167 27.4083 24.2833 27.5 24 27.5Z" fill="black"/> 8 | <path d="M19.275 23.225C19.475 23.4083 19.7167 23.5 20 23.5H23C23.2833 23.5 23.5167 23.4083 23.7 23.225C23.9 23.025 24 22.7833 24 22.5C24 22.2167 23.9 21.9833 23.7 21.8C23.5167 21.6 23.2833 21.5 23 21.5H20C19.7167 21.5 19.475 21.6 19.275 21.8C19.0917 21.9833 19 22.2167 19 22.5C19 22.7833 19.0917 23.025 19.275 23.225Z" fill="black"/> 9 | <path d="M26.275 23.225C26.475 23.4083 26.7167 23.5 27 23.5H30C30.2833 23.5 30.5167 23.4083 30.7 23.225C30.9 23.025 31 22.7833 31 22.5C31 22.2167 30.9 21.9833 30.7 21.8C30.5167 21.6 30.2833 21.5 30 21.5H27C26.7167 21.5 26.475 21.6 26.275 21.8C26.0917 21.9833 26 22.2167 26 22.5C26 22.7833 26.0917 23.025 26.275 23.225Z" fill="black"/> 10 | </svg> 11 | -------------------------------------------------------------------------------- /docs/assets/a2a-logo-white.svg: -------------------------------------------------------------------------------- 1 | <svg width="30" height="18.5" viewBox="3 9 30 18.5" fill="none" xmlns="http://www.w3.org/2000/svg"> 2 | <path d="M8.7 14.725C8.51667 14.9083 8.28333 15 8 15C7.71667 15 7.475 14.9083 7.275 14.725C7.09167 14.525 7 14.2833 7 14C7 13.7167 7.09167 13.4833 7.275 13.3C7.475 13.1 7.71667 13 8 13C8.28333 13 8.51667 13.1 8.7 13.3C8.9 13.4833 9 13.7167 9 14C9 14.2833 8.9 14.525 8.7 14.725Z" fill="white"/> 3 | <path d="M14.7 14.725C14.5167 14.9083 14.2833 15 14 15C13.7167 15 13.475 14.9083 13.275 14.725C13.0917 14.525 13 14.2833 13 14C13 13.7167 13.0917 13.4833 13.275 13.3C13.475 13.1 13.7167 13 14 13C14.2833 13 14.5167 13.1 14.7 13.3C14.9 13.4833 15 13.7167 15 14C15 14.2833 14.9 14.525 14.7 14.725Z" fill="white"/> 4 | <path d="M22.7 14.725C22.5167 14.9083 22.2833 15 22 15C21.7167 15 21.475 14.9083 21.275 14.725C21.0917 14.525 21 14.2833 21 14C21 13.7167 21.0917 13.4833 21.275 13.3C21.475 13.1 21.7167 13 22 13C22.2833 13 22.5167 13.1 22.7 13.3C22.9 13.4833 23 13.7167 23 14C23 14.2833 22.9 14.525 22.7 14.725Z" fill="white"/> 5 | <path d="M28.7 14.725C28.5167 14.9083 28.2833 15 28 15C27.7167 15 27.475 14.9083 27.275 14.725C27.0917 14.525 27 14.2833 27 14C27 13.7167 27.0917 13.4833 27.275 13.3C27.475 13.1 27.7167 13 28 13C28.2833 13 28.5167 13.1 28.7 13.3C28.9 13.4833 29 13.7167 29 14C29 14.2833 28.9 14.525 28.7 14.725Z" fill="white"/> 6 | <path fill-rule="evenodd" clip-rule="evenodd" d="M5 14C5 12.3431 6.34315 11 8 11H14C14.776 11 15.284 11.1537 15.64 11.3818C15.8589 10.794 16.1517 10.1709 16.555 9.59795C15.8797 9.21153 15.0386 9 14 9H8C5.23858 9 3 11.2386 3 14C3 16.7612 5.23759 19 7.99926 19H14C15.7634 19 16.9573 18.3902 17.7375 17.35C18.4228 16.4363 18.7148 15.266 18.9483 14.3299L18.9701 14.2425C19.2327 13.1924 19.4442 12.4077 19.8625 11.85C20.2073 11.3902 20.7634 11 22 11H28.0005C29.6572 11 31 12.343 31 14C31 15.6569 29.6569 17 28 17H22C21.224 17 20.716 16.8463 20.36 16.6182C20.1411 17.206 19.8483 17.8291 19.445 18.402C20.1203 18.7885 20.9614 19 22 19H28C30.7614 19 33 16.7614 33 14C33 11.2388 30.7621 9 28.0005 9H22C20.2366 9 19.0427 9.60979 18.2625 10.65C17.5772 11.5637 17.2852 12.734 17.0517 13.6701L17.0299 13.7575C16.7673 14.8076 16.5558 15.5923 16.1375 16.15C15.7927 16.6098 15.2366 17 14 17H7.99926C6.34265 17 5 15.6571 5 14Z" fill="white"/> 7 | <path d="M7 23.5C6.71667 23.5 6.475 23.4083 6.275 23.225C6.09167 23.025 6 22.7833 6 22.5C6 22.2167 6.09167 21.9833 6.275 21.8C6.475 21.6 6.71667 21.5 7 21.5H12C12.2833 21.5 12.5167 21.6 12.7 21.8C12.9 21.9833 13 22.2167 13 22.5C13 22.7833 12.9 23.025 12.7 23.225C12.5167 23.4083 12.2833 23.5 12 23.5H7ZM5 27.5C4.71667 27.5 4.475 27.4083 4.275 27.225C4.09167 27.025 4 26.7833 4 26.5C4 26.2167 4.09167 25.9833 4.275 25.8C4.475 25.6 4.71667 25.5 5 25.5H8C8.28333 25.5 8.51667 25.6 8.7 25.8C8.9 25.9833 9 26.2167 9 26.5C9 26.7833 8.9 27.025 8.7 27.225C8.51667 27.4083 8.28333 27.5 8 27.5H5ZM12 27.5C11.7167 27.5 11.475 27.4083 11.275 27.225C11.0917 27.025 11 26.7833 11 26.5C11 26.2167 11.0917 25.9833 11.275 25.8C11.475 25.6 11.7167 25.5 12 25.5H20C20.2833 25.5 20.5167 25.6 20.7 25.8C20.9 25.9833 21 26.2167 21 26.5C21 26.7833 20.9 27.025 20.7 27.225C20.5167 27.4083 20.2833 27.5 20 27.5H12ZM28 27.5C27.7167 27.5 27.475 27.4083 27.275 27.225C27.0917 27.025 27 26.7833 27 26.5C27 26.2167 27.0917 25.9833 27.275 25.8C27.475 25.6 27.7167 25.5 28 25.5H32C32.2833 25.5 32.5167 25.6 32.7 25.8C32.9 25.9833 33 26.2167 33 26.5C33 26.7833 32.9 27.025 32.7 27.225C32.5167 27.4083 32.2833 27.5 32 27.5H28ZM16 23.5C15.7167 23.5 15.475 23.4083 15.275 23.225C15.0917 23.025 15 22.7833 15 22.5C15 22.2167 15.0917 21.9833 15.275 21.8C15.475 21.6 15.7167 21.5 16 21.5C16.2833 21.5 16.5167 21.6 16.7 21.8C16.9 21.9833 17 22.2167 17 22.5C17 22.7833 16.9 23.025 16.7 23.225C16.5167 23.4083 16.2833 23.5 16 23.5ZM24 27.5C23.7167 27.5 23.475 27.4083 23.275 27.225C23.0917 27.025 23 26.7833 23 26.5C23 26.2167 23.0917 25.9833 23.275 25.8C23.475 25.6 23.7167 25.5 24 25.5C24.2833 25.5 24.5167 25.6 24.7 25.8C24.9 25.9833 25 26.2167 25 26.5C25 26.7833 24.9 27.025 24.7 27.225C24.5167 27.4083 24.2833 27.5 24 27.5Z" fill="white"/> 8 | <path d="M19.275 23.225C19.475 23.4083 19.7167 23.5 20 23.5H23C23.2833 23.5 23.5167 23.4083 23.7 23.225C23.9 23.025 24 22.7833 24 22.5C24 22.2167 23.9 21.9833 23.7 21.8C23.5167 21.6 23.2833 21.5 23 21.5H20C19.7167 21.5 19.475 21.6 19.275 21.8C19.0917 21.9833 19 22.2167 19 22.5C19 22.7833 19.0917 23.025 19.275 23.225Z" fill="white"/> 9 | <path d="M26.275 23.225C26.475 23.4083 26.7167 23.5 27 23.5H30C30.2833 23.5 30.5167 23.4083 30.7 23.225C30.9 23.025 31 22.7833 31 22.5C31 22.2167 30.9 21.9833 30.7 21.8C30.5167 21.6 30.2833 21.5 30 21.5H27C26.7167 21.5 26.475 21.6 26.275 21.8C26.0917 21.9833 26 22.2167 26 22.5C26 22.7833 26.0917 23.025 26.275 23.225Z" fill="white"/> 10 | </svg> 11 | -------------------------------------------------------------------------------- /docs/assets/a2a-main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google-a2a/A2A/74ec26167cfb8e87d71dec9a2defabbbbfab55ac/docs/assets/a2a-main.png -------------------------------------------------------------------------------- /docs/assets/a2a-mcp-readme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google-a2a/A2A/74ec26167cfb8e87d71dec9a2defabbbbfab55ac/docs/assets/a2a-mcp-readme.png -------------------------------------------------------------------------------- /docs/assets/a2a-mcp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google-a2a/A2A/74ec26167cfb8e87d71dec9a2defabbbbfab55ac/docs/assets/a2a-mcp.png -------------------------------------------------------------------------------- /docs/assets/adk.svg: -------------------------------------------------------------------------------- 1 | <svg width="191" height="191" viewBox="0 0 191 191" fill="none" xmlns="http://www.w3.org/2000/svg"> 2 | <path fill-rule="evenodd" clip-rule="evenodd" d="M99.3385 117.419C101.449 119.951 101.107 123.715 98.5743 125.825L82.813 138.96L98.5743 152.094C101.107 154.205 101.449 157.968 99.3385 160.501C97.2282 163.033 93.4645 163.375 90.9321 161.265L70.0123 143.832C66.9699 141.296 66.9698 136.623 70.0123 134.088L90.9321 116.655C93.4645 114.544 97.2282 114.887 99.3385 117.419Z" fill="#EA4335"/> 3 | <path fill-rule="evenodd" clip-rule="evenodd" d="M127.474 117.419C125.364 119.951 125.706 123.715 128.238 125.825L143.999 138.96L128.238 152.094C125.706 154.205 125.364 157.968 127.474 160.501C129.584 163.033 133.348 163.375 135.88 161.265L156.8 143.832C159.843 141.296 159.843 136.623 156.8 134.088L135.88 116.655C133.348 114.544 129.584 114.887 127.474 117.419Z" fill="#EA4335"/> 4 | <path fill-rule="evenodd" clip-rule="evenodd" d="M71.252 36.1855C56.0059 36.1855 43.6465 48.5449 43.6465 63.791C43.6465 79.0371 56.0059 91.3965 71.252 91.3965H98.4844V103.334H71.252C49.413 103.334 31.709 85.63 31.709 63.791C31.709 41.952 49.413 24.248 71.252 24.248H110.049C113.345 24.248 116.018 26.9203 116.018 30.2168C116.018 33.5132 113.345 36.1855 110.049 36.1855H71.252Z" fill="#4285F4"/> 5 | <path fill-rule="evenodd" clip-rule="evenodd" d="M119.748 36.1855C134.994 36.1855 147.354 48.5449 147.354 63.791C147.354 79.0371 134.994 91.3965 119.748 91.3965H80.9512C77.6547 91.3965 74.9824 94.0688 74.9824 97.3652C74.9824 100.662 77.6547 103.334 80.9512 103.334H119.748C141.587 103.334 159.291 85.63 159.291 63.791C159.291 41.952 141.587 24.248 119.748 24.248H80.9512C77.6547 24.248 74.9824 26.9203 74.9824 30.2168C74.9824 33.5132 77.6547 36.1855 80.9512 36.1855H119.748Z" fill="#34A853"/> 6 | <path fill-rule="evenodd" clip-rule="evenodd" d="M43.6465 123.479H53.3457C56.6422 123.479 59.3145 120.806 59.3145 117.51C59.3145 114.213 56.6422 111.541 53.3457 111.541H41.4082C36.0515 111.541 31.709 115.884 31.709 121.24V157.053C31.709 162.409 36.0515 166.752 41.4082 166.752H53.3457C56.6422 166.752 59.3145 164.08 59.3145 160.783C59.3145 157.487 56.6422 154.814 53.3457 154.814H43.6465V123.479Z" fill="#FBBC04"/> 7 | <path fill-rule="evenodd" clip-rule="evenodd" d="M122.359 97.3652C122.359 94.0688 119.687 91.3965 116.391 91.3965H80.9512C77.6547 91.3965 74.9824 94.0688 74.9824 97.3652C74.9824 100.662 77.6547 103.334 80.9512 103.334H116.391C119.687 103.334 122.359 100.662 122.359 97.3652Z" fill="#4285F4"/> 8 | <path d="M79.459 63.791C79.459 67.4995 76.4526 70.5059 72.7441 70.5059C69.0356 70.5059 66.0293 67.4995 66.0293 63.791C66.0293 60.0825 69.0356 57.0762 72.7441 57.0762C76.4526 57.0762 79.459 60.0825 79.459 63.791Z" fill="#4285F4"/> 9 | <path d="M125.717 63.791C125.717 67.4995 122.71 70.5059 119.002 70.5059C115.293 70.5059 112.287 67.4995 112.287 63.791C112.287 60.0825 115.293 57.0762 119.002 57.0762C122.71 57.0762 125.717 60.0825 125.717 63.791Z" fill="#4285F4"/> 10 | </svg> 11 | -------------------------------------------------------------------------------- /docs/assets/ag2-black.svg: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" standalone="no"?> 2 | <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" 3 | "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> 4 | <svg version="1.0" xmlns="http://www.w3.org/2000/svg" 5 | width="180.000000pt" height="100.000000pt" viewBox="0 0 180.000000 100.000000" 6 | preserveAspectRatio="xMidYMid meet"> 7 | 8 | <g transform="translate(0.000000,100.000000) scale(0.100000,-0.100000)" 9 | fill="#000000" stroke="none"> 10 | <path d="M420 965 c0 -32 2 -35 29 -35 25 0 30 -4 33 -27 2 -23 8 -29 36 -31 11 | 28 -3 32 -7 32 -33 0 -26 3 -29 30 -29 28 0 30 -3 30 -35 0 -32 -2 -35 -30 12 | -35 -27 0 -30 -3 -30 -29 0 -26 -4 -30 -32 -33 -33 -3 -33 -3 -36 -65 l-3 -63 13 | 36 0 35 0 0 65 0 65 30 0 c27 0 30 3 30 30 l0 30 65 0 65 0 0 35 0 35 160 0 14 | 160 0 0 -35 0 -35 65 0 65 0 0 -30 c0 -28 3 -30 35 -30 l35 0 0 -65 0 -65 30 15 | 0 30 0 0 65 0 65 -30 0 c-27 0 -30 3 -30 30 0 28 -3 30 -35 30 -33 0 -35 2 16 | -35 35 0 33 2 35 35 35 32 0 35 2 35 30 0 27 3 30 30 30 27 0 30 3 30 29 0 26 17 | 4 30 33 33 28 3 32 7 35 36 3 31 2 32 -32 32 -33 0 -36 -2 -36 -30 0 -27 -3 18 | -30 -30 -30 -28 0 -30 -3 -30 -35 0 -33 -2 -35 -35 -35 -32 0 -35 -2 -35 -30 19 | l0 -30 -65 0 -65 0 0 30 0 30 -160 0 -160 0 0 -30 0 -30 -65 0 -65 0 0 30 c0 20 | 27 -3 30 -29 30 -26 0 -30 4 -33 33 -2 27 -8 33 -30 35 -24 3 -28 8 -28 33 0 21 | 27 -3 29 -35 29 -33 0 -35 -2 -35 -35z"/> 22 | <path d="M678 648 c-3 -29 -7 -33 -36 -36 l-33 -3 3 -62 3 -62 288 -3 287 -2 23 | 0 65 0 65 -30 0 c-28 0 -30 3 -30 35 l0 35 -224 0 -225 0 -3 -32z m132 -68 c0 24 | -28 -3 -30 -35 -30 -32 0 -35 2 -35 30 0 28 3 30 35 30 32 0 35 -2 35 -30z 25 | m250 0 c0 -27 -3 -30 -30 -30 -27 0 -30 3 -30 30 0 27 3 30 30 30 27 0 30 -3 26 | 30 -30z"/> 27 | <path d="M490 345 c0 -33 -2 -35 -35 -35 l-35 0 0 -135 0 -135 35 0 35 0 0 70 28 | 0 70 65 0 65 0 0 -70 0 -70 35 0 35 0 0 135 0 135 -30 0 c-28 0 -30 3 -30 35 29 | l0 35 -70 0 -70 0 0 -35z m130 -65 l0 -30 -65 0 -65 0 0 30 0 30 65 0 65 0 0 30 | -30z"/> 31 | <path d="M830 345 c0 -32 -2 -35 -30 -35 l-30 0 0 -100 0 -100 30 0 c28 0 30 32 | -3 30 -35 l0 -35 70 0 70 0 0 35 c0 33 2 35 35 35 l35 0 0 70 0 71 -67 -3 -68 33 | -3 -3 -32 c-3 -32 -2 -33 32 -33 34 0 36 -2 36 -35 l0 -35 -65 0 -65 0 0 100 34 | 0 100 100 0 100 0 0 35 0 35 -105 0 -105 0 0 -35z"/> 35 | <path d="M1112 348 l3 -33 103 -3 102 -3 0 -29 c0 -29 0 -29 -67 -32 l-68 -3 36 | -3 -32 c-3 -28 -7 -32 -35 -35 l-32 -3 -3 -67 -3 -68 141 0 140 0 0 35 0 35 37 | -105 0 -105 0 0 35 0 35 70 0 70 0 0 29 c0 26 4 30 33 33 28 3 32 7 35 36 3 38 | 31 2 32 -32 32 -34 0 -36 2 -36 35 l0 35 -106 0 -105 0 3 -32z"/> 39 | </g> 40 | </svg> 41 | -------------------------------------------------------------------------------- /docs/assets/langgraph-color.svg: -------------------------------------------------------------------------------- 1 | <svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>LangGraph</title><path clip-rule="evenodd" d="M6.099 6H17.9C21.264 6 24 8.692 24 12s-2.736 6-6.099 6H6.1C2.736 18 0 15.308 0 12s2.736-6 6.099-6zm5.419 9.3c.148.154.367.146.561.106l.002.001c.09-.072-.038-.163-.16-.25-.074-.052-.145-.102-.166-.147.068-.08-.133-.265-.289-.408a1.52 1.52 0 01-.15-.148c-.11-.119-.155-.268-.2-.418-.03-.1-.06-.2-.11-.292-.304-.694-.653-1.383-1.143-1.97-.315-.39-.674-.74-1.033-1.09a19.384 19.384 0 01-.683-.688c-.226-.229-.362-.511-.499-.794-.114-.236-.228-.473-.396-.68-.507-.735-2.107-.936-2.342.104 0 .032-.01.052-.039.073-.13.094-.245.2-.342.327-.238.326-.274.877.022 1.17l.001-.019c.01-.147.02-.286.139-.391.228.193.576.262.841.117.32.45.422.995.525 1.54.085.456.17.912.382 1.316l.014.022c.124.203.25.41.41.587.059.089.178.184.297.279.157.125.314.25.329.359v.143c-.001.285-.002.58.184.813.103.205-.15.41-.352.385-.112.015-.233-.014-.354-.042-.165-.04-.329-.078-.462-.003-.038.04-.091.04-.145.042-.064.002-.129.004-.167.07-.008.019-.026.04-.045.063-.042.05-.087.105-.033.146l.015-.01c.082-.062.16-.12.27-.084-.014.08.039.102.092.123l.027.012a.344.344 0 01-.008.056c-.009.045-.017.088.018.127a.598.598 0 00.046-.054c.037-.046.073-.092.139-.11.144.19.289.111.471.013.206-.111.459-.248.81-.055-.135-.006-.255.01-.345.12-.023.024-.042.052-.002.084.207-.132.294-.085.375-.04.06.032.115.063.212.024l.07-.036c.155-.083.314-.166.499-.137-.139.039-.188.125-.242.218-.026.047-.054.095-.094.14-.021.021-.03.046-.007.08.29-.023.4-.095.548-.192.07-.046.15-.099.261-.154.124-.075.248-.027.368.02.13.05.255.098.371-.014.037-.033.083-.034.129-.034.016 0 .033 0 .05-.002-.037-.19-.24-.188-.448-.186-.24.003-.483.006-.475-.289.222-.149.224-.407.226-.651 0-.06 0-.117.005-.173.163.09.336.16.508.229.162.065.323.13.474.21.158.25.404.58.732.558.008-.026.016-.047.026-.073.019.004.039.008.059.014.086.02.178.044.223-.056zm6.429-2.829c.19.186.447.29.716.29.269 0 .526-.104.716-.29a.98.98 0 00.297-.7.98.98 0 00-.297-.7 1.024 1.024 0 00-1.08-.224l-.58-.831-.405.272.583.835a.978.978 0 00.05 1.348zm-1.817-2.69a1.03 1.03 0 001.056-.095.991.991 0 00.363-.507.97.97 0 00-.016-.62.994.994 0 00-.39-.488 1.028 1.028 0 00-1.298.14.987.987 0 00-.263.856.98.98 0 00.187.42c.095.125.218.225.36.294zm0 5.752a1.032 1.032 0 001.056-.095.991.991 0 00.363-.507.97.97 0 00-.016-.62.994.994 0 00-.39-.488 1.027 1.027 0 00-1.298.14.986.986 0 00-.263.856.98.98 0 00.187.42c.095.125.218.225.36.294zm.93-3.516v-.492h-1.55a.977.977 0 00-.217-.404l.584-.847-.425-.276-.583.847a1.023 1.023 0 00-1.047.23.973.973 0 00-.296.696c0 .261.107.512.296.696a1.023 1.023 0 001.047.23l.583.847.42-.276-.579-.847a.977.977 0 00.217-.404h1.55z" fill="#1C3C3C" fill-rule="evenodd"></path></svg> -------------------------------------------------------------------------------- /docs/community.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - navigation 4 | --- 5 | 6 | # Welcome to the A2A Community 7 | 8 | The **Agent2Agent (A2A) protocol** is generating significant buzz across the 9 | tech world, and for good reason! This open interoperability protocol is designed 10 | to enable **seamless collaboration between AI agents across diverse frameworks 11 | and vendors**. By standardizing communication, A2A aims to unlock complex 12 | workflows, enhance productivity, and foster a new era of **"Agent 13 | Interoperability"**. Don't just take our word for it – see what the community is 14 | saying! 15 | 16 | ## The Word on the Street: Social Highlights 17 | 18 | The launch of A2A has sparked lively discussions and positive reactions on various social platforms. Here's a glimpse of the excitement: 19 | 20 | - **Rapid Interest and Adoption:** The A2A [GitHub repository](https://github.com/a2aproject/A2A) has seen an **explosive surge in popularity**. This rapid interest underscores the industry's eagerness for a standardized agent communication protocol, with many companies collaborating and contributing. 21 | 22 | - **Microsoft's interest via Semantic Kernel:** [Asha Sharma](https://www.linkedin.com/in/aboutasha/), Head of AI Platform Product at Microsoft, [announced on LinkedIn](https://www.linkedin.com/posts/aboutasha_a2a-ugcPost-7318649411704602624-0C_8) that "**Semantic Kernel now speaks A2A: a lightweight JSON-RPC protocol that lets agents swap context, not code or credentials, over plain HTTP. Drop it into your Foundry stack for instant, secure, async interoperability with any A2A-compliant agent, regardless of modality**". The post received numerous positive reactions, including "**A2A support in Semantic Kernel is a key unlock — context-level interoperability without sharing code or creds is how agent ecosystems scale securely across clouds**". 23 | 24 | - **Matt Pocock's Diagramming Intent:** [Matt Pocock](https://x.com/mattpocockuk), a well-known developer educator, [shared on X](https://x.com/mattpocockuk/status/1910002033018421400) "**I've just been reading the Agent2Agent technical docs - Google's new protocol for agent to agent communication. You know what that means. Let's diagram them:**". This tweet, liked and reposted hundreds of times, includes some great diagrams explaining the A2A protocol. 25 | 26 | - **Craig McLuckie's "Hot Take":** [Craig McLuckie](https://www.linkedin.com/in/craigmcluckie/) shared his initial thoughts on [LinkedIn](https://www.linkedin.com/posts/craigmcluckie_hot-take-on-agent2agent-vs-mcp-google-just-activity-7315939233792176128-4rGQ) "**Hot take on Agent2Agent vs MCP**". His post highlighted Google's careful positioning of A2A as focused on interactions _between_ agentic systems, rather than agents interacting with resources (the focus of MCP). This distinction is crucial for improving models' ability to understand expectations from other agents. McLuckie also pointed out the potential for A2A to enable systems to **advertise specific capabilities and specialities**, which is seen as "**sensible**". 27 | 28 | ## Community deep dive videos 29 | 30 | - [Zachary Huang](https://www.youtube.com/@ZacharyLLM) explains in his [YouTube video](https://www.youtube.com/watch?v=wrCF8MoXC_I), A2A "**complements**" MCP. While MCP acts as a "**USB-C port for AI applications**" connecting agents to tools, A2A acts as a communication standard **between the intelligent agents themselves**. This layered approach allows for building powerful systems where agents use A2A to coordinate and MCP to access necessary tools. 31 | - [Jack Herrington](https://www.youtube.com/@jherr) on his [YouTube video](https://www.youtube.com/watch?v=voaKr_JHvF4) walks through some of the provided examples and closes with his opinion that **"Having a specific protocol for agents to talk to other agents is valuable"** and reiterates, **"LLM plus tools are agents. MCP gives agents those tools. So that's why A2A and MCP play really nicely together**". 32 | - [Cole Medin](https://www.youtube.com/@ColeMedin) suggested on his [YouTube video](https://www.youtube.com/watch?v=ywMWpmOOaSo) that "**A2A was released very recently but it's already looking like it's going to follow a similar path**" to MCP in terms of growing interest. He also demonstrates the samples step by step and provides a summary of core concepts. 33 | - [Sam Witteveen](https://www.youtube.com/@samwitteveenai) covered A2A on his [YouTube video](https://www.youtube.com/watch?v=rAeqTaYj_aI) immediately after Google Cloud Next, discussing the value of making protocols open and not ending up with conflicting protocols. 34 | 35 | ## Community Contributions to A2A 36 | 37 | - Python Quickstart Tutorial [PR\#202](https://github.com/a2aproject/A2A/pull/202) 38 | - LlamaIndex submitted a sample implementation [PR\#179](https://github.com/a2aproject/A2A/pull/179) 39 | - Autogen sample server [PR\#232](https://github.com/a2aproject/A2A/pull/232) 40 | - AG2 \+ MCP example [PR\#230](https://github.com/a2aproject/A2A/pull/230) 41 | - PydanticAI example [PR\#127](https://github.com/a2aproject/A2A/pull/127) 42 | - Go example [PR\#52](https://github.com/a2aproject/A2A/pull/52) 43 | - Daytona sandbox running agent [PR\#170](https://github.com/a2aproject/A2A/pull/170) 44 | 45 | ## What is Driving This Excitement? 46 | 47 | The enthusiasm surrounding A2A stems from its potential to address key challenges in building sophisticated AI applications: 48 | 49 | - **Breaking Down Silos:** A2A aims to overcome the limitations of siloed AI systems by providing a **universal framework for agents built on different platforms to communicate and collaborate securely**. 50 | 51 | - **Enabling Complex Collaboration:** For tasks that require the expertise of multiple specialized agents, A2A provides a standardized way for them to **delegate tasks, exchange information, and coordinate actions**. This mirrors how human teams work together, distributing responsibilities for greater efficiency. 52 | 53 | - **Dynamic Agent Discovery:** A key feature of A2A is the ability for agents to **discover the capabilities of other agents** through standardized "**Agent Cards**". This dynamic discovery allows for more flexible and adaptable multi-agent systems. 54 | 55 | - **Complementary to MCP:** As stated on our [A2A ❤️ MCP topic page](topics/a2a-and-mcp.md) and affirmed by many community, A2A "**complements**" MCP. MCP acts as a communication standard between models and resources, providing tools for agents. A2A acts as a communication standard **between the intelligent agents themselves**. This layered approach allows for building powerful systems where agents use A2A to coordinate and MCP to access necessary tools. 56 | 57 | - **Open and Community-Driven:** Google has released A2A as **open source**, inviting contributions from the broader community to refine and expand its functionality. This commitment to open collaboration fosters innovation and broad adoption. 58 | 59 | ## The Future is Interoperable 60 | 61 | The social media buzz surrounding Google's A2A protocol clearly indicates a strong interest and belief in its potential to revolutionize the development of multi-agent AI systems. By providing a standardized way for AI agents to communicate and collaborate, A2A is poised to unlock new levels of automation, efficiency, and innovation. As enterprises increasingly adopt AI agents for a wide range of tasks, A2A represents a crucial step towards realizing the full power of interconnected AI ecosystems. 62 | 63 | Stay tuned for more updates and join the growing community building the future of AI interoperability with A2A! 64 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - navigation 4 | - toc 5 | --- 6 | 7 | # Agent2Agent (A2A) Protocol 8 | 9 | <figure class="hero" markdown> 10 | ![A2A Banner](assets/a2a-banner.png){width="70%"} 11 | <figcaption> 12 | The <strong>Agent2Agent (A2A) Protocol</strong> is an open standard 13 | designed to enable seamless communication and collaboration between AI agents.<br> 14 | In a world where agents are built using diverse frameworks and by different vendors, 15 | A2A provides a common language, breaking down silos and fostering interoperability. 16 | </figcaption> 17 | </figure> 18 | 19 | !!! abstract "" 20 | Build with 21 | **[![ADK Logo](./assets/adk.svg){class="twemoji lg middle"} ADK](https://google.github.io/adk-docs/)** _(or any framework)_, 22 | equip with **MCP** _(or any tool)_, 23 | and communicate with 24 | **![A2A Logo](./assets/a2a-logo-black.svg){class="twemoji sm middle"} A2A**, 25 | to remote agents, local agents, and humans. 26 | 27 | <div class="grid cards" markdown> 28 | 29 | - :material-lightbulb-outline:{ .lg .middle } **A2A** Announcements 30 | 31 | Ramp up quickly 32 | 33 | [:octicons-arrow-right-24: Announcing the A2A Protocol (Apr)](https://developers.googleblog.com/en/a2a-a-new-era-of-agent-interoperability/) 34 | our initial blog 35 | 36 | [:octicons-arrow-right-24: Agents are not tools (Jun)](https://www.googlecloudcommunity.com/gc/Community-Blogs/Agents-are-not-tools/ba-p/922716) 37 | our TL thought piece 38 | 39 | [:octicons-arrow-right-24: Google Cloud donates A2A to Linux Foundation (Jun)](https://developers.googleblog.com/en/google-cloud-donates-a2a-to-linux-foundation/) 40 | covered by [Forbes](https://www.forbes.com/sites/janakirammsv/2025/06/25/key-tech-firms-unite-as-google-donates-a2a-to-linux-foundation/) 41 | 42 | Dive deep with end to end examples 43 | 44 | [:octicons-arrow-right-24: Designing with A2A (O'Reilly)](https://www.oreilly.com/radar/designing-collaborative-multi-agent-systems-with-the-a2a-protocol/) 45 | 46 | [:octicons-arrow-right-24: Start the Python Tutorial](tutorials/python/1-introduction.md) 47 | 48 | - :material-play-circle:{ .lg .middle } **Video** Intro in <8 min 49 | 50 | <iframe width="560" height="315" src="https://www.youtube.com/embed/Fbr_Solax1w?si=QxPMEEiO5kLr5_0F" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> 51 | 52 | </div> 53 | 54 | ## Why A2A Matters 55 | 56 | ![A2A Main Graphic](assets/a2a-main.png){width="50%"} 57 | {style="text-align: center; margin-bottom:1em; margin-top:2em;"} 58 | 59 | <div class="grid cards" markdown> 60 | 61 | - :material-account-group-outline:{ .lg .middle } **Interoperability** 62 | 63 | Connect agents built on different platforms (LangGraph, CrewAI, Semantic Kernel, custom solutions) to create powerful, composite AI systems. 64 | 65 | - :material-lan-connect:{ .lg .middle } **Complex Workflows** 66 | 67 | Enable agents to delegate sub-tasks, exchange information, and coordinate actions to solve complex problems that a single agent cannot. 68 | 69 | - :material-shield-key-outline:{ .lg .middle } **Secure & Opaque** 70 | 71 | Agents interact without needing to share internal memory, tools, or proprietary logic, ensuring security and preserving intellectual property. 72 | 73 | </div> 74 | 75 | --- 76 | 77 | ## A2A and MCP: Complementary Protocols 78 | 79 | ![A2A MCP Graphic](assets/a2a-mcp-readme.png){width="60%"} 80 | {style="text-align: center; margin-bottom:1em; margin-top:1em;"} 81 | 82 | A2A and the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) are complementary standards for building robust agentic applications: 83 | 84 | - **MCP (Model Context Protocol):** Connects agents to **tools, APIs, and resources** with structured inputs/outputs. Think of it as the way agents access their capabilities. 85 | - **A2A (Agent2Agent Protocol):** Facilitates **dynamic, multimodal communication between different agents** as peers. It's how agents collaborate, delegate, and manage shared tasks. 86 | 87 | [Learn more about A2A and MCP](./topics/a2a-and-mcp.md) 88 | 89 | --- 90 | 91 | ## Get Started with A2A 92 | 93 | <div class="grid cards" markdown> 94 | 95 | - :material-book-open:{ .lg .middle } **Read the Introduction** 96 | 97 | Understand the core ideas behind A2A. 98 | 99 | [:octicons-arrow-right-24: What is A2A?](./topics/what-is-a2a.md) 100 | 101 | [:octicons-arrow-right-24: Key Concepts](./topics/key-concepts.md) 102 | 103 | - :material-file-document-outline:{ .lg .middle } **Dive into the Specification** 104 | 105 | Explore the detailed technical definition of the A2A protocol. 106 | 107 | [:octicons-arrow-right-24: Protocol Specification](./specification.md) 108 | 109 | - :material-application-cog-outline:{ .lg .middle } **Follow the Tutorials** 110 | 111 | Build your first A2A-compliant agent with our step-by-step Python quickstart. 112 | 113 | [:octicons-arrow-right-24: Python Tutorial](./tutorials/python/1-introduction.md) 114 | 115 | - :material-code-braces:{ .lg .middle } **Explore Code Samples** 116 | 117 | See A2A in action with sample clients, servers, and agent framework integrations. 118 | 119 | [:fontawesome-brands-github: GitHub Samples](https://github.com/a2aproject/a2a-samples) 120 | 121 | - :material-code-braces:{ .lg .middle } **Download a SDK** 122 | 123 | [:octicons-arrow-right-24: A2A Python SDK](https://github.com/a2aproject/a2a-python) 124 | [:octicons-arrow-right-24: A2A JS SDK](https://github.com/a2aproject/a2a-js) 125 | [:octicons-arrow-right-24: A2A Java SDK](https://github.com/a2aproject/a2a-java) 126 | 127 | 128 | </div> 129 | -------------------------------------------------------------------------------- /docs/partners.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - navigation 4 | --- 5 | 6 | # Partners 7 | 8 | Below is a list of partners (and a link to their A2A announcement or blog post, 9 | if available) who are part of the A2A community and are helping build, codify, 10 | and adopt A2A as the standard protocol for AI agents to communicate and 11 | collaborate effectively with each other and with users. 12 | 13 | !!! note 14 | 15 | If you're interested in becoming a partner of A2A and getting your listing added to or updated on this page, let us know by [submitting this form](https://goo.gle/a2a-partner-form), and we'll contact you soon! 16 | 17 | - [Accelirate Inc](https://www.accelirate.com) 18 | - [Accenture](https://www.accenture.com) 19 | - [Activeloop](https://www.activeloop.ai/) 20 | - [Adobe](https://www.adobe.com) 21 | - [AI21 Labs](https://www.ai21.com/) 22 | - [AI71](https://ai71.ai/) 23 | - [Aisera](https://aisera.com/) 24 | - [Almawave.it](http://www.almawave.it) 25 | - [AliCloud](http://www.alibabacloud.com) 26 | - [ArcBlock](http://www.arcblock.io) 27 | - [Arize](https://arize.com/blog/arize-ai-and-future-of-agent-interoperability-embracing-googles-a2a-protocol/) 28 | - [Articul8](https://www.articul8.ai/news/unleashing-the-next-frontier-of-enterprise-ai-introducing-model-mesh-dock-and-inter-lock-and-our-a2-a-partnership-with-google) 29 | - [ask-ai.com](https://ask-ai.com) 30 | - [Atlassian](https://www.atlassian.com) 31 | - [Auth0](https://auth0.com/blog/auth0-google-a2a/) 32 | - [Autodesk](https://www.autodesk.com) 33 | - [Beekeeper](http://beekeeper.io) 34 | - [BCG](https://www.bcg.com) 35 | - [Block Inc](https://block.xyz/) 36 | - [Bloomberg LP](http://techatbloomberg.com/) 37 | - [BLUEISH Inc](https://www.blueish.co.jp/) 38 | - [BMC Software Inc](https://www.bmc.com/it-solutions/bmc-helix.html) 39 | - [Boomi](https://boomi.com/) 40 | - [Box](https://www.box.com) 41 | - [Bridge2Things Automation Process GmbH](http://bridge2things.at) 42 | - [Cafe 24](https://www.cafe24corp.com/en/company/about) 43 | - [C3 AI](https://c3.ai) 44 | - [Capgemini](https://www.capgemini.com) 45 | - [Chronosphere](https://chronosphere.io) 46 | - [Codimite PTE LTD](https://codimite.ai/) 47 | - [Cognigy](https://www.cognigy.com/) 48 | - [Cognizant](https://www.cognizant.com) 49 | - [Cohere](https://cohere.com) 50 | - [Collibra](https://www.collibra.com) 51 | - [Confluent](https://developer.confluent.io) 52 | - [Contextual](https://contextual.ai) 53 | - [Cotality](https://cotality.com) (fka Corelogic) 54 | - [Crubyt](https://www.crubyt.com) 55 | - [Cyderes](http://www.cyderes.com) 56 | - [Datadog](https://www.datadoghq.com) 57 | - [DataRobot](https://www.datarobot.com) 58 | - [DataStax](https://www.datastax.com) 59 | - [Decagon.ai](https://decagon.ai) 60 | - [Deloitte](https://www.prnewswire.com/news-releases/deloitte-expands-alliances-with-google-cloud-and-servicenow-to-accelerate-agentic-ai-adoption-in-the-enterprise-302423941.html) 61 | - [Devnagri](https://devnagri.com) 62 | - [Deutsche Telekom](https://www.telekom.com/en) 63 | - [Dexter Tech Labs](http://www.dextertechlabs.com) 64 | - [Distyl.ai](https://distyl.ai) 65 | - [Elastic](https://www.elastic.co) 66 | - [Ema.co](https://ema.co) 67 | - [EPAM](https://www.epam.com) 68 | - [Eviden (Atos Group)](https://atos.net/) 69 | - [fractal.ai](https://fractal.ai/new) 70 | - [GenAI Nebula9.ai Solutions Pvt Ltd](http://nebula9.ai) 71 | - [Glean](https://www.glean.com) 72 | - [Global Logic](https://www.globallogic.com/) 73 | - [Gravitee](https://www.gravitee.io/) 74 | - [GrowthLoop](https://growthloop.com) 75 | - [Guru](http://www.getguru.com) 76 | - [Harness](https://harness.io) 77 | - [HCLTech](https://www.hcltech.com) 78 | - [Headwaters](https://www.headwaters.co.jp) 79 | - [Hellotars](https://hellotars.com) 80 | - [Hexaware](https://hexaware.com/) 81 | - [HUMAN](https://www.humansecurity.com/) 82 | - [Incorta](https://www.incorta.com) 83 | - [InfoSys](https://www.infosys.com) 84 | - [Intuit](https://www.intuit.com) 85 | - [Iron Mountain](https://www.ironmountain.com/) 86 | - [JetBrains](https://www.jetbrains.com) 87 | - [JFrog](https://jfrog.com) 88 | - [King's College London](https://www.kcl.ac.uk/informatics) 89 | - [KPMG](https://kpmg.com/us/en/media/news/kpmg-google-cloud-alliance-expansion-agentspace-adoption.html) 90 | - [Kyndryl](http://www.kyndryl.com) 91 | - [LabelBox](https://labelbox.com) 92 | - [LangChain](https://www.langchain.com) 93 | - [LG CNS](http://www.lgcns.com) 94 | - [Livex.ai](https://livex.ai) 95 | - [LlamaIndex](https://x.com/llama_index/status/1912949446322852185) 96 | - [LTIMindTtree](https://www.ltimindtree.com) 97 | - [Lumeris](https://www.lumeris.com/) 98 | - [Lyzr.ai](https://lyzr.ai) 99 | - [Magyar Telekom](https://www.telekom.hu/) 100 | - [Microsoft](https://www.microsoft.com/en-us/microsoft-cloud/blog/2025/05/07/empowering-multi-agent-apps-with-the-open-agent2agent-a2a-protocol/) 101 | - [McKinsey](https://www.mckinsey.com) 102 | - [MongoDB](https://www.mongodb.com) 103 | - [Neo4j](https://neo4j.com) 104 | - [New Relic](https://newrelic.com) 105 | - [Nisum](http://www.nisum.com) 106 | - [Noorle Inc](http://www.noorle.com) 107 | - [Optimizely Inc](https://www.optimizely.com/) 108 | - [Oracle / NetSuite](https://www.oracle.com/netsuite) 109 | - [PancakeAI](https://www.pancakeai.tech/) 110 | - [Pendo](https://www.pendo.io) 111 | - [PerfAI.ai](https://perfai.ai) 112 | - [Personal AI](https://personal.ai) 113 | - [Poppulo](https://www.poppulo.com/blog/poppulo-google-a2a-the-future-of-workplace-communication) 114 | - [Productive Edge](https://www.productiveedge.com/) 115 | - [Proofs](https://proofs.io) 116 | - [Publicis Sapient](https://www.publicissapient.com/) 117 | - [PWC](https://www.pwc.com) 118 | - [Quantiphi](https://www.quantiphi.com) 119 | - [Radix](https://radix.website/) 120 | - [RagaAI Inc](https://raga.ai/) 121 | - [Red Hat](https://www.redhat.com) 122 | - [Reltio Inc](http://www.reltio.com) 123 | - [S&P](https://www.spglobal.com) 124 | - [Sage](https://www.sage.com/en-us/) 125 | - [Salesforce](https://www.salesforce.com) 126 | - [SAP](https://news.sap.com/2025/04/sap-google-cloud-enterprise-ai-open-agent-collaboration-model-choice-multimodal-intelligence/) 127 | - [Sayone Technologies](https://www.sayonetech.com/) 128 | - [ServiceNow](https://www.servicenow.com) 129 | - [Siemens AG](https://siemens.com/) 130 | - [SoftBank Corp](https://www.softbank.jp/en//) 131 | - [Solace](https://solace.com/products/agent-mesh/) 132 | - [Stacklok, Inc](https://stacklok.com) 133 | - [Supertab](https://www.supertab.co/post/supertab-connect-partners-with-google-cloud-to-enable-ai-agents) 134 | - [Suzega](https://suzega.com/) 135 | - [TCS](https://www.tcs.com) 136 | - [Tech Mahindra](https://www.techmahindra.com/) 137 | - [Test Innovation Technology](https://www.test-it.com) 138 | - [the artinet project](https://artinet.io/) 139 | - [Think41](http://www.think41.com) 140 | - [Thoughtworks](https://www.thoughtworks.com/) 141 | - [Tredence](http://www.tredence.com) 142 | - [Two Tall Totems Ltd. DBA TTT Studios](https://ttt.studio) 143 | - [Typeface](https://typeface.ai) 144 | - [UKG](https://www.ukg.com) 145 | - [UiPath](https://www.uipath.com/newsroom/uipath-launches-first-enterprise-grade-platform-for-agentic-automation) 146 | - [Upwork, Inc.](https://www.upwork.com/) 147 | - [Ushur, Inc.](http://ushur.ai) 148 | - [Valle AI](http://www.valleai.com.br) 149 | - [Valtech](https://www.valtech.com/) 150 | - [Vervelo](https://www.vervelo.com/) 151 | - [VoltAgent](https://voltagent.dev/) 152 | - [Weights & Biases](https://wandb.ai/wandb_fc/product-announcements-fc/reports/Powering-Agent-Collaboration-Weights-Biases-Partners-with-Google-Cloud-on-Agent2Agent-Interoperability-Protocol---VmlldzoxMjE3NDg3OA) 153 | - [Wipro](https://www.wipro.com) 154 | - [Workday](https://www.workday.com) 155 | - [Writer](https://writer.com) 156 | - [Zenity](https://zenity.io) 157 | - [Zeotap](https://www.zeotap.com) 158 | - [Zocket Technologies , Inc.](https://zocket.ai) 159 | - [Zoom](https://www.zoom.us) 160 | - [zyprova](http://www.zyprova.com) 161 | -------------------------------------------------------------------------------- /docs/robots.txt: -------------------------------------------------------------------------------- 1 | # robots.txt for the A2A open-source project documentation site on Google GitHub Pages 2 | # This file guides web crawlers on which parts of the site to crawl and index. 3 | 4 | # Apply these rules to all web crawlers for maximum discoverability 5 | User-agent: * 6 | 7 | # Allow crawling of all public content by default. 8 | # We'll explicitly disallow specific paths below that aren't meant for public indexing. 9 | 10 | # Disallow common build, temporary, and configuration directories/files 11 | Disallow: /_site/ # Common Jekyll build directory 12 | Disallow: /_temp/ # General temporary directory 13 | Disallow: /build/ # General build output directory 14 | Disallow: /dist/ # Distribution/output directory 15 | Disallow: /.cache/ # Caching directory 16 | Disallow: /.git/ # Git repository files (if somehow exposed by accident) 17 | Disallow: /.github/ # GitHub Actions workflows and internal configuration files 18 | Disallow: /node_modules/ # Node.js dependencies (often large and irrelevant for indexing) 19 | Disallow: /vendor/ # Third-party libraries or assets 20 | 21 | # Disallow common configuration files that are not part of the public documentation 22 | Disallow: /_config.yml # Jekyll configuration file 23 | Disallow: /package.json # Node.js package configuration 24 | Disallow: /package-lock.json # Node.js package lock file 25 | Disallow: /yarn.lock # Yarn package lock file 26 | 27 | # Disallow specific file types that are often internal, temporary, or not meant for indexing 28 | Disallow: /*.bak$ # Backup files 29 | Disallow: /*.tmp$ # Temporary files 30 | Disallow: /*.log$ # Log files 31 | Disallow: /*.swp$ # Vim swap files 32 | 33 | # Disallow draft content if your static site generator supports it and these are not published 34 | Disallow: /_drafts/ 35 | 36 | # Specify the location of your XML sitemap. 37 | # This helps search engines discover all the pages on your site. 38 | Sitemap: https://a2aproject.github.io/A2A/v0.2.5/sitemap.xml 39 | -------------------------------------------------------------------------------- /docs/sdk/python/index.md: -------------------------------------------------------------------------------- 1 | # Python SDK Reference 2 | 3 | This page contains SDK documentation for the [`a2a-sdk`](https://github.com/a2aproject/a2a-python) Python package. 4 | 5 | ```sh 6 | pip install a2a-sdk 7 | ``` 8 | 9 | --- 10 | 11 | ## Client 12 | 13 | ::: a2a.client 14 | options: 15 | show_root_heading: false 16 | show_source: false 17 | members_order: alphabetical 18 | inherited_members: true 19 | 20 | --- 21 | 22 | ## Server 23 | 24 | ::: a2a.server 25 | options: 26 | show_root_heading: false 27 | show_source: false 28 | members_order: alphabetical 29 | inherited_members: true 30 | 31 | --- 32 | 33 | ## Types 34 | 35 | ::: a2a.types 36 | options: 37 | show_root_heading: false 38 | show_source: false 39 | members_order: alphabetical 40 | inherited_members: true 41 | 42 | <style> 43 | nav.md-nav--secondary > ul.md-nav__list { 44 | font-family: 'Roboto Mono', monospace 45 | } 46 | </style> 47 | -------------------------------------------------------------------------------- /docs/stylesheets/custom.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2025 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | /* Index page styling */ 18 | 19 | .md-grid { 20 | max-width: 80%; 21 | } 22 | 23 | .footer { 24 | padding-bottom: 30vh; 25 | } 26 | 27 | .centered-logo-text-group { 28 | display: inline-flex; 29 | align-items: center; 30 | gap: 1.5em; 31 | margin-bottom: 0.5em; 32 | vertical-align: middle; 33 | } 34 | 35 | .centered-logo-text-group img { 36 | height: auto; 37 | } 38 | 39 | .centered-logo-text-group h1 { 40 | margin: 0; 41 | text-align: left; 42 | } 43 | 44 | .install-command-container { 45 | max-width: 600px; 46 | margin: 2.5em auto; 47 | padding: 1.5em 2em; 48 | background-color: var(--md-code-bg-color, #f5f5f5); 49 | border-radius: 8px; 50 | text-align: center; 51 | box-shadow: 0 3px 6px rgb(0 0 0 / 5%); 52 | border-left: 5px solid var(--md-primary-fg-color, #526cfe); 53 | margin-top: 30px; 54 | } 55 | 56 | .install-command-container p { 57 | font-size: 1.1em; 58 | color: var(--md-default-fg-color); 59 | margin-bottom: -10px; 60 | margin-top: -10px; 61 | } 62 | 63 | .install-command-container p code { 64 | font-size: 1.1em; 65 | font-weight: 600; 66 | padding: 0.3em 0.6em; 67 | background-color: var(--md-code-fg-color--light); 68 | border-radius: 4px; 69 | display: inline-block; 70 | line-height: 1.4; 71 | } 72 | 73 | .announce .md-button { 74 | font-size: 0.8em; 75 | padding: 0.3em 1em; 76 | margin-left: 0.5em; 77 | } 78 | 79 | h1#agent2agent-a2a-protocol { 80 | display: none; 81 | } 82 | 83 | figure.hero { 84 | margin-top: 0; 85 | margin-bottom: 10px; 86 | } 87 | 88 | figure.hero figcaption { 89 | max-width: 100%; 90 | width: 100%; 91 | margin-bottom: 0; 92 | text-align: left; 93 | } 94 | -------------------------------------------------------------------------------- /docs/topics/a2a-and-mcp.md: -------------------------------------------------------------------------------- 1 | # A2A and MCP: Complementary Protocols for Agentic Systems 2 | 3 | ## A2A ❤️ MCP 4 | 5 | In the landscape of AI agent development, two key types of protocols are emerging to facilitate interoperability: those for connecting agents to **tools and resources**, and those for enabling **agent-to-agent collaboration**. The Agent2Agent (A2A) Protocol and the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) address these distinct but related needs. 6 | 7 | **TL;DR;** Agentic applications need both A2A and MCP. We recommend MCP for tools and A2A for agents. 8 | 9 | ## Why Different Protocols? 10 | 11 | The distinction arises from the nature of what an agent interacts with: 12 | 13 | - **Tools & Resources:** 14 | 15 | - These are typically primitives with well-defined, structured inputs and outputs. They perform specific, often stateless, functions (e.g., a calculator, a database query API, a weather lookup service). 16 | - Their behavior is generally predictable and transactional. 17 | - Interaction is often a single request-response cycle. 18 | 19 | - **Agents:** 20 | - These are more autonomous systems. They can reason, plan, use multiple tools, maintain state over longer interactions, and engage in complex, often multi-turn dialogues to achieve novel or evolving tasks. 21 | - Their behavior can be emergent and less predictable than a simple tool. 22 | - Interaction often involves ongoing tasks, context sharing, and negotiation. 23 | 24 | Agentic applications need to leverage both: agents use tools to gather information and perform actions, and agents collaborate with other agents to tackle broader, more complex goals. 25 | 26 | ## Model Context Protocol (MCP) 27 | 28 | - **Focus:** MCP standardizes how AI models and agents connect to and interact with **tools, APIs, data sources, and other external resources.** 29 | - **Mechanism:** It defines a structured way to describe tool capabilities (akin to function calling in Large Language Models), pass inputs to them, and receive structured outputs. 30 | - **Use Cases:** 31 | - Enabling an LLM to call an external API (e.g., fetch current stock prices). 32 | - Allowing an agent to query a database with specific parameters. 33 | - Connecting an agent to a set of predefined functions or services. 34 | - **Ecosystem:** MCP aims to create an ecosystem where tool providers can easily expose their services to various AI models and agent frameworks, and agent developers can easily consume these tools in a standardized way. 35 | 36 | ## Agent2Agent Protocol (A2A) 37 | 38 | - **Focus:** A2A standardizes how independent, often opaque, **AI agents communicate and collaborate with each other as peers.** 39 | - **Mechanism:** It provides an application-level protocol for agents to: 40 | - Discover each other's high-level skills and capabilities (via Agent Cards). 41 | - Negotiate interaction modalities (text, files, structured data). 42 | - Manage shared, stateful, and potentially long-running tasks. 43 | - Exchange conversational context, instructions, and complex, multi-part results. 44 | - **Use Cases:** 45 | - A customer service agent delegating a complex billing inquiry to a specialized billing agent, maintaining context of the customer interaction. 46 | - A travel planning agent coordinating with separate flight, hotel, and activity booking agents, managing a multi-stage booking process. 47 | - Agents exchanging information and status updates for a collaborative project that evolves over time. 48 | - **Key Difference from Tool Interaction:** A2A allows for more dynamic, stateful, and potentially multi-modal interactions than typically seen with simple tool calls. Agents using A2A communicate _as agents_ (or on behalf of users) rather than just invoking a discrete function. 49 | 50 | ## How A2A and MCP Complement Each Other 51 | 52 | A2A and MCP are not mutually exclusive; they are highly complementary and address different layers of an agentic system's interaction needs. 53 | 54 | <div style="text-align: center; margin: 20px;" markdown> 55 | 56 | ![Diagram showing A2A and MCP working together. A User interacts with Agent A via A2A. Agent A interacts with Agent B via A2A. Agent B uses MCP to interact with Tool 1 and Tool 2.](../assets/a2a-mcp.png){width="80%"} 57 | 58 | _An agentic application might use A2A to communicate with other agents, while each agent internally uses MCP to interact with its specific tools and resources._ 59 | 60 | </div> 61 | 62 | ### Example Scenario: The Auto Repair Shop 63 | 64 | > Consider an auto repair shop staffed by autonomous AI agent "mechanics" who use special-purpose tools (such as vehicle jacks, multimeters, and socket wrenches) to diagnose and repair problems. The workers often have to diagnose and repair problems they have not seen before. The repair process can involve extensive conversations with a customer, research, and working with part suppliers. 65 | 66 | 1. **Customer Interaction (User-to-Agent via A2A):** 67 | 68 | - A customer (or their primary assistant agent) uses A2A to communicate with the "Shop Manager" agent: _"My car is making a rattling noise."_ 69 | - The Shop Manager agent uses A2A for a multi-turn diagnostic conversation: _"Can you send a video of the noise?"_, _"I see some fluid leaking. How long has this been happening?"_ 70 | 71 | 2. **Internal Tool Usage (Agent-to-Tool via MCP):** 72 | 73 | - The Mechanic agent, assigned the task by the Shop Manager, needs to diagnose the issue. It uses MCP to interact with its specialized tools: 74 | - MCP call to a "Vehicle Diagnostic Scanner" tool: `scan_vehicle_for_error_codes(vehicle_id='XYZ123')`. 75 | - MCP call to a "Repair Manual Database" tool: `get_repair_procedure(error_code='P0300', vehicle_make='Toyota', vehicle_model='Camry')`. 76 | - MCP call to a "Platform Lift" tool: `raise_platform(height_meters=2)`. 77 | 78 | 3. **Supplier Interaction (Agent-to-Agent via A2A):** 79 | - The Mechanic agent determines a specific part is needed. It uses A2A to communicate with a "Parts Supplier" agent: _"Do you have part #12345 in stock for a Toyota Camry 2018?"_ 80 | - The Parts Supplier agent, also an A2A-compliant system, responds, potentially leading to an order. 81 | 82 | In this example: 83 | 84 | - **A2A** facilitates the higher-level, conversational, and task-oriented interactions between the customer and the shop, and between the shop's agents and external supplier agents. 85 | - **MCP** enables the mechanic agent to use its specific, structured tools to perform its diagnostic and repair functions. 86 | 87 | ## Representing A2A Agents as MCP Resources 88 | 89 | It's conceivable that an A2A Server (a remote agent) could also expose some of its skills as MCP-compatible resources, especially if those skills are well-defined and can be invoked in a more tool-like, stateless manner. In such a case, another agent might "discover" this A2A agent's specific skill via an MCP-style tool description (perhaps derived from its Agent Card). 90 | 91 | However, the primary strength of A2A lies in its support for more flexible, stateful, and collaborative interactions that go beyond typical tool invocation. A2A is about agents _partnering_ on tasks, while MCP is more about agents _using_ capabilities. 92 | 93 | By leveraging both A2A for inter-agent collaboration and MCP for tool integration, developers can build more powerful, flexible, and interoperable AI systems. 94 | -------------------------------------------------------------------------------- /docs/topics/agent-discovery.md: -------------------------------------------------------------------------------- 1 | # Agent Discovery in A2A 2 | 3 | For AI agents to collaborate using the Agent2Agent (A2A) protocol, they first need to find each other and understand what capabilities the other agents offer. A2A standardizes the format of an agent's self-description through the **[Agent Card](../specification.md#5-agent-discovery-the-agent-card)**. However, the methods for discovering these Agent Cards can vary depending on the environment and requirements. 4 | 5 | ## The Role of the Agent Card 6 | 7 | The Agent Card is a JSON document that serves as a digital "business card" for an A2A Server (the remote agent). It is crucial for discovery and initiating interaction. Key information typically included in an Agent Card: 8 | 9 | - **Identity:** `name`, `description`, `provider` information. 10 | - **Service Endpoint:** The `url` where the A2A service can be reached. 11 | - **A2A Capabilities:** Supported protocol features like `streaming` or `pushNotifications`. 12 | - **Authentication:** Required authentication `schemes` (e.g., "Bearer", "OAuth2") to interact with the agent. 13 | - **Skills:** A list of specific tasks or functions the agent can perform (`AgentSkill` objects), including their `id`, `name`, `description`, `inputModes`, `outputModes`, and `examples`. 14 | 15 | Client agents parse the Agent Card to determine if a remote agent is suitable for a given task, how to structure requests for its skills, and how to communicate with it securely. 16 | 17 | ## Discovery Strategies 18 | 19 | Here are common strategies for how a client agent might discover the Agent Card of a remote agent: 20 | 21 | ### 1. Well-Known URI 22 | 23 | This is a recommended approach for public agents or agents intended for broad discoverability within a specific domain. 24 | 25 | - **Mechanism:** A2A Servers host their Agent Card at a standardized, "well-known" path on their domain. 26 | - **Standard Path:** `https://{agent-server-domain}/.well-known/agent.json` (following the principles of [RFC 8615](https://www.ietf.org/rfc/rfc8615.txt) for well-known URIs). 27 | - **Process:** 28 | 1. A client agent knows or programmatically discovers the domain of a potential A2A Server (e.g., `smart-thermostat.example.com`). 29 | 2. The client performs an HTTP `GET` request to `https://smart-thermostat.example.com/.well-known/agent.json`. 30 | 3. If the Agent Card exists and is accessible, the server returns it as a JSON response. 31 | - **Advantages:** Simple, standardized, and enables automated discovery by crawlers or systems that can resolve domains. Effectively reduces the discovery problem to "find the agent's domain." 32 | - **Considerations:** Best suited for agents intended for open discovery or discovery within an organization that controls the domain. The endpoint serving the Agent Card may itself require authentication if the card contains sensitive information. 33 | 34 | ### 2. Curated Registries (Catalog-Based Discovery) 35 | 36 | For enterprise environments, marketplaces, or specialized ecosystems, Agent Cards can be published to and discovered via a central registry or catalog. 37 | 38 | - **Mechanism:** An intermediary service (the registry) maintains a collection of Agent Cards. Clients query this registry to find agents based on various criteria (e.g., skills offered, tags, provider name, desired capabilities). 39 | - **Process:** 40 | 1. A2A Servers (or their administrators) register their Agent Cards with the registry service. The mechanism for this registration is outside the scope of the A2A protocol itself. 41 | 2. Client agents query the registry's API (e.g., "find agents with 'image-generation' skill that support streaming"). 42 | 3. The registry returns a list of matching Agent Cards or references to them. 43 | - **Advantages:** 44 | - Centralized management, curation, and governance of available agents. 45 | - Facilitates discovery based on functional capabilities rather than just domain names. 46 | - Can implement access controls, policies, and trust mechanisms at the registry level. 47 | - Enables scenarios like company-specific or team-specific agent catalogs, or public marketplaces of A2A-compliant agents. 48 | - **Considerations:** Requires an additional registry service. The A2A protocol does not currently define a standard API for such registries, though this is an area of potential future exploration and community standardization. 49 | 50 | ### 3. Direct Configuration / Private Discovery 51 | 52 | In many scenarios, especially within tightly coupled systems, for private agents, or during development and testing, clients might be directly configured with Agent Card information or a URL to fetch it. 53 | 54 | - **Mechanism:** The client application has hardcoded Agent Card details, reads them from a local configuration file, receives them through an environment variable, or fetches them from a private, proprietary API endpoint known to the client. 55 | - **Process:** This is highly specific to the application's deployment and configuration strategy. 56 | - **Advantages:** Simple and effective for known, static relationships between agents or when dynamic discovery is not a requirement. 57 | - **Considerations:** Less flexible for discovering new or updated agents dynamically. Changes to the remote agent's card might require re-configuration of the client. Proprietary API-based discovery is not standardized by A2A. 58 | 59 | ## Securing Agent Cards 60 | 61 | Agent Cards themselves can sometimes contain information that should be protected, such as: 62 | 63 | - The `url` of an internal-only or restricted-access agent. 64 | - Details in the `authentication.credentials` field if it's used for scheme-specific, non-secret information (e.g., an OAuth token URL). Storing actual plaintext secrets in an Agent Card is **strongly discouraged**. 65 | - Descriptions of sensitive or internal skills. 66 | 67 | **Protection Mechanisms:** 68 | 69 | - **Access Control on the Endpoint:** The HTTP endpoint serving the Agent Card (whether it's the `/.well-known/agent.json` path, a registry API, or a custom URL) should be secured using standard web practices if the card is not intended for public, unauthenticated access. 70 | - **mTLS:** Require mutual TLS for client authentication if appropriate for the trust model. 71 | - **Network Restrictions:** Limit access to specific IP ranges, VPCs, or private networks. 72 | - **Authentication:** Require standard HTTP authentication (e.g., OAuth 2.0 Bearer token, API Key) to access the Agent Card itself. 73 | - **Selective Disclosure by Registries:** Agent registries can implement logic to return different Agent Cards or varying levels of detail based on the authenticated client's identity and permissions. For example, a public query might return a limited card, while an authenticated partner query might receive a card with more details. 74 | 75 | It's crucial to remember that if an Agent Card were to contain sensitive data (again, **not recommended** for secrets), the card itself **must never** be available without strong authentication and authorization. The A2A protocol encourages authentication schemes where the client obtains dynamic credentials out-of-band, rather than relying on static secrets embedded in the Agent Card. 76 | 77 | ## Future Considerations 78 | 79 | The A2A community may explore standardizing aspects of registry interactions or more advanced, semantic discovery protocols in the future. Feedback and contributions in this area are welcome to enhance the discoverability and interoperability of A2A agents. 80 | -------------------------------------------------------------------------------- /docs/topics/enterprise-ready.md: -------------------------------------------------------------------------------- 1 | # Enterprise-Ready Features for A2A Agents 2 | 3 | The Agent2Agent (A2A) protocol is designed with enterprise requirements at its core. Instead of inventing new, proprietary standards for security and operations, A2A aims to integrate seamlessly with existing enterprise infrastructure and widely adopted best practices. A2A treats remote agents as standard, HTTP-based enterprise applications. This approach allows organizations to leverage their existing investments and expertise in security, monitoring, governance, and identity management. 4 | 5 | A key principle of A2A is that agents are typically "opaque" – they do not share internal memory, tools, or direct resource access with each other. This opacity naturally aligns with standard client/server security paradigms. 6 | 7 | ## 1. Transport Level Security (TLS) 8 | 9 | Ensuring the confidentiality and integrity of data in transit is fundamental. 10 | 11 | - **HTTPS Mandate:** All A2A communication in production environments **MUST** occur over HTTPS. 12 | - **Modern TLS Standards:** Implementations **SHOULD** use modern TLS versions (TLS 1.2 or higher is recommended) with strong, industry-standard cipher suites to protect data from eavesdropping and tampering. 13 | - **Server Identity Verification:** A2A Clients **SHOULD** verify the A2A Server's identity by validating its TLS certificate against trusted certificate authorities (CAs) during the TLS handshake. This prevents man-in-the-middle attacks. 14 | 15 | ## 2. Authentication 16 | 17 | A2A delegates authentication to standard web mechanisms, primarily relying on HTTP headers and established standards like OAuth2 and OpenID Connect. Authentication requirements are advertised by the A2A Server in its [Agent Card](../specification.md#5-agent-discovery-the-agent-card). 18 | 19 | - **No In-Payload Identity:** A2A protocol payloads (JSON-RPC messages) do **not** carry user or client identity information. Identity is established at the transport/HTTP layer. 20 | - **Agent Card Declaration:** The A2A Server's `AgentCard` describes the authentication `schemes` it supports in its `security` field. Each named scheme in this field is an identifier specific to the card. The details for each named scheme, including the scheme type, can be provided in the `securitySchemes` field of the Agent Card. The supported names of the scheme types ("apiKey", "http", "oauth2", "openIdConnect") align with those defined in the [OpenAPI Specification for authentication](https://swagger.io/docs/specification/authentication/). 21 | - **Out-of-Band Credential Acquisition:** The A2A Client is responsible for obtaining the necessary credential materials (e.g., OAuth 2.0 tokens, either in JWT format or some other format; API keys; or other) through processes external to the A2A protocol itself. This could involve OAuth flows (authorization code, client credentials), secure key distribution, etc. 22 | - **HTTP Header Transmission:** Credentials **MUST** be transmitted in standard HTTP headers as per the requirements of the chosen authentication scheme (e.g., `Authorization: Bearer <token>`, `API-Key: <key_value>`). 23 | - **Server-Side Validation:** The A2A Server **MUST** authenticate **every** incoming request based on the credentials provided in the HTTP headers and its declared requirements. 24 | - If authentication fails or is missing, the server **SHOULD** respond with standard HTTP status codes such as `401 Unauthorized` or `403 Forbidden`. 25 | - A `401 Unauthorized` response **SHOULD** include a `WWW-Authenticate` header indicating the required scheme(s), guiding the client on how to authenticate correctly. 26 | - **In-Task Authentication (Secondary Credentials):** If an agent, during a task, requires additional credentials for a _different_ system (e.g., to access a specific tool on behalf of the user), A2A recommends: 27 | 1. The A2A Server transitions the A2A task to the `input-required` state. 28 | 2. The `TaskStatus.message` (often using a `DataPart`) should provide details about the required authentication for the secondary system, potentially using an `AuthenticationInfo`-like structure. 29 | 3. The A2A Client then obtains these new credentials out-of-band for the secondary system. These credentials might be provided back to the A2A Server (if it's proxying the request) or used by the client to interact directly with the secondary system. 30 | 31 | ## 3. Authorization 32 | 33 | Once a client is authenticated, the A2A Server is responsible for authorizing the request. Authorization logic is specific to the agent's implementation, the data it handles, and applicable enterprise policies. 34 | 35 | - **Granular Control:** Authorization **SHOULD** be applied based on the authenticated identity (which could represent an end user, a client application, or both). 36 | - **Skill-Based Authorization:** Access can be controlled on a per-skill basis, as advertised in the Agent Card. For example, specific OAuth scopes might grant an authenticated client access to invoke certain skills but not others. 37 | - **Data and Action-Level Authorization:** Agents that interact with backend systems, databases, or tools **MUST** enforce appropriate authorization before performing sensitive actions or accessing sensitive data through those underlying resources. The agent acts as a gatekeeper. 38 | - **Principle of Least Privilege:** Grant only the necessary permissions required for a client or user to perform their intended operations via the A2A interface. 39 | 40 | ## 4. Data Privacy and Confidentiality 41 | 42 | - **Sensitivity Awareness:** Implementers must be acutely aware of the sensitivity of data exchanged in `Message` and `Artifact` parts of A2A interactions. 43 | - **Compliance:** Ensure compliance with relevant data privacy regulations (e.g., GDPR, CCPA, HIPAA, depending on the domain and data). 44 | - **Data Minimization:** Avoid including or requesting unnecessarily sensitive information in A2A exchanges. 45 | - **Secure Handling:** Protect data both in transit (via TLS, as mandated) and at rest (if persisted by agents) according to enterprise data security policies and regulatory requirements. 46 | 47 | ## 5. Tracing, Observability, and Monitoring 48 | 49 | A2A's reliance on HTTP allows for straightforward integration with standard enterprise tracing, logging, and monitoring tools. 50 | 51 | - **Distributed Tracing:** 52 | - A2A Clients and Servers **SHOULD** participate in distributed tracing systems (e.g., OpenTelemetry, Jaeger, Zipkin). 53 | - Trace context (trace IDs, span IDs) **SHOULD** be propagated via standard HTTP headers (e.g., W3C Trace Context headers like `traceparent` and `tracestate`). 54 | - This enables end-to-end visibility of requests as they flow across multiple agents and underlying services, which is invaluable for debugging and performance analysis. 55 | - **Comprehensive Logging:** Implement detailed logging on both client and server sides. Logs should include relevant identifiers such as `taskId`, `sessionId`, correlation IDs, and trace context to facilitate troubleshooting and auditing. 56 | - **Metrics:** A2A Servers should expose key operational metrics (e.g., request rates, error rates, task processing latency, resource utilization) to enable performance monitoring, alerting, and capacity planning. These can be integrated with systems like Prometheus or Google Cloud Monitoring. 57 | - **Auditing:** Maintain audit trails for significant events, such as task creation, critical state changes, and actions performed by agents, especially those involving sensitive data access, modifications, or high-impact operations. 58 | 59 | ## 6. API Management and Governance 60 | 61 | For A2A Servers exposed externally, across organizational boundaries, or even within large enterprises, integration with API Management solutions is highly recommended. This can provide: 62 | 63 | - **Centralized Policy Enforcement:** Consistent application of security policies (authentication, authorization), rate limiting, and quotas. 64 | - **Traffic Management:** Load balancing, routing, and mediation. 65 | - **Analytics and Reporting:** Insights into agent usage, performance, and trends. 66 | - **Developer Portals:** Facilitate discovery of A2A-enabled agents, provide documentation (including Agent Cards), and streamline onboarding for client developers. 67 | 68 | By adhering to these enterprise-grade practices, A2A implementations can be deployed securely, reliably, and manageably within complex organizational environments, fostering trust and enabling scalable inter-agent collaboration. 69 | -------------------------------------------------------------------------------- /docs/topics/key-concepts.md: -------------------------------------------------------------------------------- 1 | # Key Concepts in A2A 2 | 3 | The Agent2Agent (A2A) protocol is built around a set of core concepts that define how agents interact. Understanding these concepts is crucial for developing or integrating with A2A-compliant systems. 4 | 5 | ![A2A Actors showing a User, A2A Client (Client Agent), and A2A Server (Remote Agent)](../assets/a2a-actors.png){ width="70%" style="margin:20px auto;display:block;" } 6 | 7 | ## Core Actors 8 | 9 | - **User:** The end user (human or automated service) who initiates a request or goal that requires agent assistance. 10 | - **A2A Client (Client Agent):** An application, service, or another AI agent that acts on behalf of the user to request actions or information from a remote agent. The client initiates communication using the A2A protocol. 11 | - **A2A Server (Remote Agent):** An AI agent or agentic system that exposes an HTTP endpoint implementing the A2A protocol. It receives requests from clients, processes tasks, and returns results or status updates. The remote agent operates as an "opaque" system from the client's perspective, meaning the client doesn't need to know its internal workings, memory, or tools. 12 | 13 | ## Fundamental Communication Elements 14 | 15 | - **Agent Card:** 16 | 17 | - A JSON metadata document, typically discoverable at a well-known URL (e.g., `/.well-known/agent.json`), that describes an A2A Server. 18 | - It details the agent's identity (name, description), service endpoint URL, version, supported A2A capabilities (like streaming or push notifications), specific skills it offers, default input/output modalities, and authentication requirements. 19 | - Clients use the Agent Card to discover agents and understand how to interact with them securely and effectively. 20 | - See details in the [Protocol Specification: Agent Card](../specification.md#5-agent-discovery-the-agent-card). 21 | 22 | - **Task:** 23 | 24 | - When a client sends a message to an agent, the agent might determine that fulfilling the request requires a stateful task to be completed (e.g., "generate a report," "book a flight," "answer a question"). 25 | - Each task has a unique ID defined by the agent and progresses through a defined lifecycle (e.g., `submitted`, `working`, `input-required`, `completed`, `failed`). 26 | - Tasks are stateful and can involve multiple exchanges (messages) between the client and the server. 27 | - See details in the [Life of a Task](./life-of-a-task.md). 28 | - Protocol specification: [Task Object](../specification.md#61-task-object). 29 | 30 | - **Message:** 31 | 32 | - Represents a single turn or unit of communication between a client and an agent. 33 | - Messages have a `role` (either `"user"` for client-sent messages or `"agent"` for server-sent messages) and contain one or more `Part` objects that carry the actual content. `messageId` part of the Message object is a unique identifier for each message set by the sender of the message. 34 | - Used for conveying instructions, context, questions, answers, or status updates that are not necessarily formal `Artifacts`. 35 | - See details in the [Protocol Specification: Message Object](../specification.md#64-message-object). 36 | 37 | - **Part:** 38 | 39 | - The fundamental unit of content within a `Message` or an `Artifact`. Each part has a specific `type` and can carry different kinds of data: 40 | - `TextPart`: Contains plain textual content. 41 | - `FilePart`: Represents a file, which can be transmitted as inline base64-encoded bytes or referenced via a URI. Includes metadata like filename and Media Type. 42 | - `DataPart`: Carries structured JSON data, useful for forms, parameters, or any machine-readable information. 43 | - See details in the [Protocol Specification: Part Union Type](../specification.md#65-part-union-type). 44 | 45 | - **Artifact:** 46 | - Represents a tangible output or result generated by the remote agent during the processing of a task. 47 | - Examples include generated documents, images, spreadsheets, structured data results, or any other self-contained piece of information that is a direct result of the task. 48 | - Artifacts are composed of one or more `Part` objects and can be streamed incrementally. 49 | - See details in the [Protocol Specification: Artifact Object](../specification.md#67-artifact-object). 50 | 51 | ## Interaction Mechanisms 52 | 53 | - **Request/Response (Polling):** 54 | 55 | - The client sends a request (e.g., using the `message/send` RPC method) and receives a response from the server. 56 | - If the interaction requires a stateful long-running task, the server might initially respond with a `working` status. The client would then periodically call `tasks/get` to poll for updates until the task reaches a terminal state (e.g., `completed`, `failed`). 57 | 58 | - **Streaming (Server-Sent Events - SSE):** 59 | 60 | - For tasks that produce results incrementally or provide real-time progress updates. 61 | - The client initiates an interaction with the server using `message/stream`. 62 | - The server responds with an HTTP connection that remains open, over which it sends a stream of Server-Sent Events (SSE). 63 | - These events can be `Task`, `Message`, or `TaskStatusUpdateEvent` (for status changes) or `TaskArtifactUpdateEvent` (for new or updated artifact chunks). 64 | - This requires the server to advertise the `streaming` capability in its Agent Card. 65 | - Learn more about [Streaming & Asynchronous Operations](./streaming-and-async.md). 66 | 67 | - **Push Notifications:** 68 | - For very long-running tasks or scenarios where maintaining a persistent connection (like SSE) is impractical. 69 | - The client can provide a webhook URL when initiating a task (or by calling `tasks/pushNotificationConfig/set`). 70 | - When the task status changes significantly (e.g., completes, fails, or requires input), the server can send an asynchronous notification (an HTTP POST request) to this client-provided webhook. 71 | - This requires the server to advertise the `pushNotifications` capability in its Agent Card. 72 | - Learn more about [Streaming & Asynchronous Operations](./streaming-and-async.md). 73 | 74 | ## Agent Response: Task or Message 75 | 76 | See details in the [Life of a Task](./life-of-a-task.md). 77 | 78 | ## Other Important Concepts 79 | 80 | - **Context (`contextId`):** A server-generated identifier that can be used to logically group multiple related `Task` objects, providing context across a series of interactions. 81 | - **Transport and Format:** A2A communication occurs over HTTP(S). JSON-RPC 2.0 is used as the payload format for all requests and responses. 82 | - **Authentication & Authorization:** A2A relies on standard web security practices. Authentication requirements are declared in the Agent Card, and credentials (e.g., OAuth tokens, API keys) are typically passed via HTTP headers, separate from the A2A protocol messages themselves. 83 | - Learn more about [Enterprise-Ready Features](./enterprise-ready.md). 84 | - **Agent Discovery:** The process by which clients find Agent Cards to learn about available A2A Servers and their capabilities. 85 | - Learn more about [Agent Discovery](./agent-discovery.md). 86 | - **Extensions:** A2A allows agents to declare custom protocol extensions as part of their AgentCard. 87 | - More documentation coming soon. 88 | 89 | By understanding these core components and mechanisms, developers can effectively design, implement, and utilize A2A for building interoperable and collaborative AI agent systems. 90 | -------------------------------------------------------------------------------- /docs/topics/life-of-a-task.md: -------------------------------------------------------------------------------- 1 | # Life of a Task 2 | 3 | When a message is sent to an agent, it can choose to reply with either: 4 | 5 | - A stateless `Message`. 6 | - A stateful `Task` followed by zero or more `TaskStatusUpdateEvent` or `TaskArtifactUpdateEvent`. 7 | 8 | If the response is a `Message`, the interaction is completed. On the other hand, if the response is a `Task`, then the task will be processed by the agent, until it is in a interrupted state (`input-required` or `auth-required`) or a terminal state (`completed`, `cancelled`, `rejected` or `failed`). 9 | 10 | ## Context 11 | 12 | A `contextId` logically composes many `Task` objects and independent `Message` objects. If the A2A agent uses an LLM internally, it can utilize the `contextId` to manage the LLM context. 13 | 14 | For the first time a message is sent, agent replies back with a `contextId`. If the agent responded with a task, then it will also have a `taskId`. Clients can send subsequent messages and attach the same `contextId` to indicate to the agent, that they are continuing their previous interaction within the same context. Client can optionally attach the `taskId` to a subsequent message to indicate that the message is in continuation of that specific task. 15 | 16 | `contextId` allows collaboration over a goal or share a single contextual session across multiple tasks. 17 | 18 | ## Agent: Message or a Task 19 | 20 | Messages can be used for trivial interactions which do not require long-running processing or collaboration. An agent can use messages to negotiate the acceptance of a task. Once an agent maps the intent of an incoming message to a supported capability, it can reply back with a `Task`. 21 | 22 | So conceptually there can be three levels of agents: 23 | 24 | 1. An agent which always responds with `Message` objects only. Doesn't do complex state management, no long running execution and uses contextID to tie messages together. Agent most probably directly wraps around an LLM invocation and simple tools. 25 | 2. Generates a `Task`, does more substantial work that can be tracked and runs over extended life time. 26 | 3. Generates both `Message` and `Task` objects. Uses messages to negotiate agent capability and scope of work for a task. Then sends `Task` object to track its execution and collaborate over task states like more input-needed, error handling, etc. 27 | 28 | An agent can choose to always reply back with `Task` objects and model simple responses as tasks in `completed` state. 29 | 30 | ## Task Refinements & Follow-ups 31 | 32 | Clients may want to follow up with new asks based on the results of a task, and/or refine upon the task results. This can be modeled by starting another interaction using the same `contextId` as the original task. Clients can further hint the agent by providing the reference to the original task using `referenceTaskIds` in `Message` object. Agent would then respond with either a new `Task` or a `Message`. 33 | 34 | Once a task has reached a terminal state (`completed`, `cancelled`, `rejected` or `failed`), it can't be restarted. There are some benefits to this: 35 | 36 | - **Task Immutability**: Clients can reliably reference tasks and their associated state, artifacts, and messages. 37 | - This provides a clean mapping of inputs to outputs. 38 | - Useful for mapping client orchestrator to task execution. 39 | - **Clear Unit of Work**: Every new request, refinement, or a follow-up becomes a distinct task, simplifying bookkeeping and allowing for granular tracking of an agent's work. 40 | - Each artifact can be traced to a unit task. 41 | - This unit of work can be referenced much more granularly by parent agents or other systems like agent optimizers. In case of restartable tasks, all the subsequent refinements are combined, and any reference to an interaction would need to resort to some kind of message index range. 42 | - **Easier Implementation**: No ambiguity for agent developers, whether to create a new task or restart an existing task. Once a task is in terminal state, any related subsequent interaction would need to be within a new task. 43 | 44 | ### Parallel Follow-ups 45 | 46 | Parallel work is supported by having agents create distinct, parallel tasks for each follow-up message sent within the same contextId. This allows clients to track individual tasks and create new dependent tasks as soon as a prerequisite task is complete. 47 | 48 | For example: 49 | 50 | ```none 51 | Task 1: Book a flight to Helsinki. 52 | (After Task 1 finishes) 53 | Task 2: Based on Task 1, book a hotel. 54 | Task 3: Based on Task 1, book a snowmobile activity. 55 | (After Task 2 finishes, while Task 3 is still in progress) 56 | Task 4: Based on Task 2, add a spa reservation to the hotel booking. 57 | ``` 58 | 59 | ### Referencing Previous Artifacts 60 | 61 | The serving agent is responsible for inferring the relevant artifact from the referenced task or from the `contextId`. The serving agent, as the domain expert, is best suited to resolve ambiguity or identify missing information because they are the ones who generated the artifacts. 62 | 63 | If there is ambiguity (e.g., multiple artifacts could fit the request), the agent will ask the client for clarification by returning an input-required state. The client can then specify the artifact in its response. Client can optionally populate artifact reference {artifactId, taskId} in part metadata. This allows for linkage between inputs for follow-up tasks and previously generated artifacts. 64 | 65 | This approach allows for the client implementation to be simple. 66 | 67 | ### Tracking Artifact Mutation 68 | 69 | A follow up or refinement can result in an older artifact being modified and newer artifacts being generated. It would be good to know this linkage and maybe track all mutations of the artifact to make sure only the latest copy is used for future context. Something like a linked list, with the head as the latest version of the task result. 70 | 71 | But the client is best suited, as well as is the real judge of what it considers as an acceptable result. And in fact can reject the mutation as well. Hence, the serving agent should not own this linkage and hence this linkage does not need to be part of A2A protocol spec. Clients can maintain the linkage on their end and show the latest version to the user. 72 | 73 | To help with the tracking, the serving agent should maintain the same artifact-name when generating a refinement on the original artifact. 74 | 75 | For follow-up or refinement tasks, the client is best suited to refer to the "latest" or what it considers to be the intended artifact to be refined upon. If the artifact reference is not explicitly specified, the serving agent can: 76 | 77 | - Use context to figure out the latest artifact. 78 | - Or in case of ambiguity or context not supported, agent can use `input-required` task state. 79 | 80 | ### Example Follow-up 81 | 82 | #### Client sends message to agent 83 | 84 | ```json 85 | { 86 | "jsonrpc": "2.0", 87 | "id": "req-001", 88 | "method": "message/send", 89 | "params": { 90 | "message": { 91 | "role": "user", 92 | "parts": [ 93 | { 94 | "kind": "text", 95 | "text": "Generate an image of a sailboat on the ocean." 96 | } 97 | ], 98 | "messageId": "msg-user-001" 99 | } 100 | } 101 | } 102 | ``` 103 | 104 | #### Agent responds with boat image 105 | 106 | ```json 107 | { 108 | "jsonrpc": "2.0", 109 | "id": "req-001", 110 | "result": { 111 | "id": "task-boat-gen-123", 112 | "contextId": "ctx-conversation-abc", 113 | "status": { 114 | "state": "completed", 115 | }, 116 | "artifacts": [ 117 | { 118 | "artifactId": "artifact-boat-v1-xyz", 119 | "name": "sailboat_image.png", 120 | "description": "A generated image of a sailboat on the ocean.", 121 | "parts": [ 122 | { 123 | "kind": "file", 124 | "file": { 125 | "name": "sailboat_image.png", 126 | "mimeType": "image/png", 127 | "bytes": "<base64_encoded_png_data_of_a_sailboat>" 128 | } 129 | } 130 | ] 131 | } 132 | ], 133 | "kind": "task" 134 | } 135 | } 136 | ``` 137 | 138 | #### Client asks for coloring the boat red 139 | 140 | Refers to previous taskID and uses same contextId. 141 | 142 | ```json 143 | { 144 | "jsonrpc": "2.0", 145 | "id": "req-002", 146 | "method": "message/send", 147 | "params": { 148 | "message": { 149 | "role": "user", 150 | "messageId": "msg-user-002", 151 | "contextId": "ctx-conversation-abc", // Same contextId 152 | "referenceTaskIds": ["task-boat-gen-123"] // Optional: Referencing the previous task 153 | "parts": [ 154 | { 155 | "kind": "text", 156 | "text": "That's great! Can you make the sailboat red?" 157 | // Optional: In case the agent asked for actual relevant artifact. 158 | // Client could provide the artifact data in parts. 159 | // Also it could add metadata to the part to 160 | // reference the specific artifact. 161 | // "metadata": { 162 | // "referenceArtifacts: [ 163 | // { 164 | // "artifactId": "artifact-boat-v1-xyz", 165 | // "taskId": "task-boat-gen-123" 166 | // } 167 | // ] 168 | // } 169 | } 170 | ], 171 | } 172 | } 173 | } 174 | ``` 175 | 176 | #### Agent responds with new image artifact 177 | 178 | - Creates new task in same contextId. 179 | - Boat image artifact has same name. but a new artifactId. 180 | 181 | ```json 182 | { 183 | "jsonrpc": "2.0", 184 | "id": "req-002", 185 | "result": { 186 | "id": "task-boat-color-456", // New task ID 187 | "contextId": "ctx-conversation-abc", // Same contextId 188 | "status": { 189 | "state": "completed", 190 | }, 191 | "artifacts": [ 192 | { 193 | "artifactId": "artifact-boat-v2-red-pqr", // New artifactId 194 | "name": "sailboat_image.png", // Same name as the original artifact 195 | "description": "A generated image of a red sailboat on the ocean.", 196 | "parts": [ 197 | { 198 | "kind": "file", 199 | "file": { 200 | "name": "sailboat_image.png", 201 | "mimeType": "image/png", 202 | "bytes": "<base64_encoded_png_data_of_a_RED_sailboat>" 203 | } 204 | } 205 | ] 206 | } 207 | ], 208 | "kind": "task" 209 | } 210 | } 211 | ``` 212 | -------------------------------------------------------------------------------- /docs/topics/what-is-a2a.md: -------------------------------------------------------------------------------- 1 | # What is A2A? 2 | 3 | The Agent2Agent (A2A) Protocol is an open standard designed to solve a fundamental challenge in the rapidly evolving landscape of artificial intelligence: **how do AI agents, built by different teams, using different technologies, and owned by different organizations, communicate and collaborate effectively?** 4 | 5 | As AI agents become more specialized and capable, the need for them to work together on complex tasks increases. Imagine a user asking their primary AI assistant to plan an international trip. This single request might involve coordinating the capabilities of several specialized agents: 6 | 7 | 1. An agent for flight bookings. 8 | 2. Another agent for hotel reservations. 9 | 3. A third for local tour recommendations and bookings. 10 | 4. A fourth to handle currency conversion and travel advisories. 11 | 12 | Without a common communication protocol, integrating these diverse agents into a cohesive user experience is a significant engineering hurdle. Each integration would likely be a custom, point-to-point solution, making the system difficult to scale, maintain, and extend. 13 | 14 | ## The A2A Solution 15 | 16 | A2A provides a standardized way for these independent, often "opaque" (black-box) agentic systems to interact. It defines: 17 | 18 | - **A common transport and format:** JSON-RPC 2.0 over HTTP(S) for how messages are structured and transmitted. 19 | - **Discovery mechanisms (Agent Cards):** How agents can advertise their capabilities and be found by other agents. 20 | - **Task management workflows:** How collaborative tasks are initiated, progressed, and completed. This includes support for tasks that may be long-running or require multiple turns of interaction. 21 | - **Support for various data modalities:** How agents exchange not just text, but also files, structured data (like forms), and potentially other rich media. 22 | - **Core principles for security and asynchronicity:** Guidelines for secure communication and handling tasks that might take significant time or involve human-in-the-loop processes. 23 | 24 | ## Key Design Principles of A2A 25 | 26 | The development of A2A is guided by several core principles: 27 | 28 | - **Simplicity:** Leverage existing, well-understood standards like HTTP, JSON-RPC, and Server-Sent Events (SSE) where possible, rather than reinventing the wheel. 29 | - **Enterprise Readiness:** Address critical enterprise needs such as authentication, authorization, security, privacy, tracing, and monitoring from the outset by aligning with standard web practices. 30 | - **Asynchronous First:** Natively support long-running tasks and scenarios where agents or users might not be continuously connected, through mechanisms like streaming and push notifications. 31 | - **Modality Agnostic:** Allow agents to communicate using a variety of content types, enabling rich and flexible interactions beyond plain text. 32 | - **Opaque Execution:** Enable collaboration without requiring agents to expose their internal logic, memory, or proprietary tools. Agents interact based on declared capabilities and exchanged context, preserving intellectual property and enhancing security. 33 | 34 | ## Benefits of Using A2A 35 | 36 | Adopting A2A can lead to significant advantages: 37 | 38 | - **Increased Interoperability:** Break down silos between different AI agent ecosystems, allowing agents from various vendors and frameworks to work together. 39 | - **Enhanced Agent Capabilities:** Allow developers to create more sophisticated applications by composing the strengths of multiple specialized agents. 40 | - **Reduced Integration Complexity:** Standardize the "how" of agent communication, allowing teams to focus on the "what" – the value their agents provide. 41 | - **Fostering Innovation:** Encourage the development of a richer ecosystem of specialized agents that can readily plug into larger collaborative workflows. 42 | - **Future-Proofing:** Provide a flexible framework that can adapt as agent technologies continue to evolve. 43 | 44 | By establishing common ground for agent-to-agent communication, A2A aims to accelerate the adoption and utility of AI agents across diverse industries and applications, paving the way for more powerful and collaborative AI systems. 45 | 46 | ## A2A Request Lifecycle 47 | 48 | ```mermaid 49 | sequenceDiagram 50 | participant Client 51 | participant A2A Server 52 | participant Auth Server 53 | 54 | rect rgb(240, 240, 240) 55 | Note over Client, A2A Server: 1. Agent Discovery 56 | Client->>A2A Server: GET agent card eg: (/.well-known/agent-card) 57 | A2A Server-->>Client: Returns Agent Card 58 | end 59 | 60 | rect rgb(240, 240, 240) 61 | Note over Client, Auth Server: 2. Authentication 62 | Client->>Client: Parse Agent Card for securitySchemes 63 | alt securityScheme is openIdConnect 64 | Client->>Auth Server: Request token based on "authorizationUrl" and "tokenUrl" 65 | Auth Server-->>Client: Returns JWT 66 | end 67 | end 68 | 69 | rect rgb(240, 240, 240) 70 | Note over Client, A2A Server: 3. sendMessage API 71 | Client->>Client: Parse Agent Card for "url" param to send API requests to. 72 | Client->>A2A Server: POST /sendMessage (with JWT) 73 | A2A Server->>A2A Server: Process message and create task 74 | A2A Server-->>Client: Returns Task Response 75 | end 76 | 77 | rect rgb(240, 240, 240) 78 | Note over Client, A2A Server: 4. sendMessageStream API 79 | Client->>A2A Server: POST /sendMessageStream (with JWT) 80 | A2A Server-->>Client: Stream: Task (Submitted) 81 | A2A Server-->>Client: Stream: TaskStatusUpdateEvent (Working) 82 | A2A Server-->>Client: Stream: TaskArtifactUpdateEvent (artifact A) 83 | A2A Server-->>Client: Stream: TaskArtifactUpdateEvent (artifact B) 84 | A2A Server-->>Client: Stream: TaskStatusUpdateEvent (Completed) 85 | end 86 | ``` 87 | 88 | Next, learn about the [Key Concepts](./key-concepts.md) that form the foundation of the A2A protocol. 89 | -------------------------------------------------------------------------------- /docs/tutorials/python/1-introduction.md: -------------------------------------------------------------------------------- 1 | # Python Quickstart Tutorial: Building an A2A Agent 2 | 3 | Welcome to the Agent2Agent (A2A) Python Quickstart Tutorial! 4 | 5 | In this tutorial, you will explore a simple "echo" A2A server using the Python SDK. This will introduce you to the fundamental concepts and components of an A2A server. You will then look at a more advanced example that integrates a Large Language Model (LLM). 6 | 7 | This hands-on guide will help you understand: 8 | 9 | - The basic concepts behind the A2A protocol. 10 | - How to set up a Python environment for A2A development using the SDK. 11 | - How Agent Skills and Agent Cards describe an agent. 12 | - How an A2A server handles tasks. 13 | - How to interact with an A2A server using a client. 14 | - How streaming capabilities and multi-turn interactions work. 15 | - How an LLM can be integrated into an A2A agent. 16 | 17 | By the end of this tutorial, you will have a functional understanding of A2A agents and a solid foundation for building or integrating A2A-compliant applications. 18 | 19 | ## Tutorial Sections 20 | 21 | The tutorial is broken down into the following steps: 22 | 23 | 1. **[Introduction (This Page)](./1-introduction.md)** 24 | 2. **[Setup](./2-setup.md)**: Prepare your Python environment and the A2A SDK. 25 | 3. **[Agent Skills & Agent Card](./3-agent-skills-and-card.md)**: Define what your agent can do and how it describes itself. 26 | 4. **[The Agent Executor](./4-agent-executor.md)**: Understand how the agent logic is implemented. 27 | 5. **[Starting the Server](./5-start-server.md)**: Run the Helloworld A2A server. 28 | 6. **[Interacting with the Server](./6-interact-with-server.md)**: Send requests to your agent. 29 | 7. **[Streaming & Multi-Turn Interactions](./7-streaming-and-multiturn.md)**: Explore advanced capabilities with the LangGraph example. 30 | 8. **[Next Steps](./8-next-steps.md)**: Explore further possibilities with A2A. 31 | 32 | Let's get started! 33 | -------------------------------------------------------------------------------- /docs/tutorials/python/2-setup.md: -------------------------------------------------------------------------------- 1 | # 2. Setup Your Environment 2 | 3 | ## Prerequisites 4 | 5 | - Python 3.10 or higher. 6 | - Access to a terminal or command prompt. 7 | - Git, for cloning the repository. 8 | - A code editor (e.g., Visual Studio Code) is recommended. 9 | 10 | ## Clone the Repository 11 | 12 | If you haven't already, clone the A2A Samples repository: 13 | 14 | ```bash 15 | git clone https://github.com/a2aproject/a2a-samples.git -b main --depth 1 16 | cd a2a-samples 17 | ``` 18 | 19 | ## Python Environment & SDK Installation 20 | 21 | We recommend using a virtual environment for Python projects. The A2A Python SDK uses `uv` for dependency management, but you can use `pip` with `venv` as well. 22 | 23 | 1. **Create and activate a virtual environment:** 24 | 25 | Using `venv` (standard library): 26 | 27 | === "Mac/Linux" 28 | 29 | ```sh 30 | python -m venv .venv 31 | source .venv/bin/activate 32 | ``` 33 | 34 | === "Windows" 35 | 36 | ```powershell 37 | python -m venv .venv 38 | .venv\Scripts\activate 39 | ``` 40 | 41 | 2. **Install needed Python dependencies along with the A2A SDK and its dependencies:** 42 | 43 | ```bash 44 | pip install -r samples/python/requirements.txt 45 | ``` 46 | 47 | ## Verify Installation 48 | 49 | After installation, you should be able to import the `a2a` package in a Python interpreter: 50 | 51 | ```bash 52 | python -c "import a2a; print('A2A SDK imported successfully')" 53 | ``` 54 | 55 | If this command runs without error and prints the success message, your environment is set up correctly. 56 | -------------------------------------------------------------------------------- /docs/tutorials/python/3-agent-skills-and-card.md: -------------------------------------------------------------------------------- 1 | # 3. Agent Skills & Agent Card 2 | 3 | Before an A2A agent can do anything, it needs to define what it _can_ do (its skills) and how other agents or clients can find out about these capabilities (its Agent Card). 4 | 5 | We'll use the `helloworld` example located in [`a2a-samples/samples/python/agents/helloworld/`](https://github.com/a2aproject/a2a-samples/tree/main/samples/python/agents/helloworld). 6 | 7 | ## Agent Skills 8 | 9 | An **Agent Skill** describes a specific capability or function the agent can perform. It's a building block that tells clients what kinds of tasks the agent is good for. 10 | 11 | Key attributes of an `AgentSkill` (defined in `a2a.types`): 12 | 13 | - `id`: A unique identifier for the skill. 14 | - `name`: A human-readable name. 15 | - `description`: A more detailed explanation of what the skill does. 16 | - `tags`: Keywords for categorization and discovery. 17 | - `examples`: Sample prompts or use cases. 18 | - `inputModes` / `outputModes`: Supported Media Types for input and output (e.g., "text/plain", "application/json"). 19 | 20 | In `__main__.py`, you can see how a skill for the Helloworld agent is defined: 21 | 22 | ```python { .no-copy } 23 | --8<-- "https://raw.githubusercontent.com/a2aproject/a2a-samples/refs/heads/main/samples/python/agents/helloworld/__main__.py:AgentSkill" 24 | ``` 25 | 26 | This skill is very simple: it's named "Returns hello world" and primarily deals with text. 27 | 28 | ## Agent Card 29 | 30 | The **Agent Card** is a JSON document that an A2A Server makes available, typically at a `.well-known/agent.json` endpoint. It's like a digital business card for the agent. 31 | 32 | Key attributes of an `AgentCard` (defined in `a2a.types`): 33 | 34 | - `name`, `description`, `version`: Basic identity information. 35 | - `url`: The endpoint where the A2A service can be reached. 36 | - `capabilities`: Specifies supported A2A features like `streaming` or `pushNotifications`. 37 | - `defaultInputModes` / `defaultOutputModes`: Default Media Types for the agent. 38 | - `skills`: A list of `AgentSkill` objects that the agent offers. 39 | 40 | The `helloworld` example defines its Agent Card like this: 41 | 42 | ```python { .no-copy } 43 | --8<-- "https://raw.githubusercontent.com/a2aproject/a2a-samples/refs/heads/main/samples/python/agents/helloworld/__main__.py:AgentCard" 44 | ``` 45 | 46 | This card tells us the agent is named "Hello World Agent", runs at `http://localhost:9999/`, supports text interactions, and has the `hello_world` skill. It also indicates public authentication, meaning no specific credentials are required. 47 | 48 | Understanding the Agent Card is crucial because it's how a client discovers an agent and learns how to interact with it. 49 | -------------------------------------------------------------------------------- /docs/tutorials/python/4-agent-executor.md: -------------------------------------------------------------------------------- 1 | # 4. The Agent Executor 2 | 3 | The core logic of how an A2A agent processes requests and generates responses/events is handled by an **Agent Executor**. The A2A Python SDK provides an abstract base class `a2a.server.agent_execution.AgentExecutor` that you implement. 4 | 5 | ## `AgentExecutor` Interface 6 | 7 | The `AgentExecutor` class defines two primary methods: 8 | 9 | - `async def execute(self, context: RequestContext, event_queue: EventQueue)`: Handles incoming requests that expect a response or a stream of events. It processes the user's input (available via `context`) and uses the `event_queue` to send back `Message`, `Task`, `TaskStatusUpdateEvent`, or `TaskArtifactUpdateEvent` objects. 10 | - `async def cancel(self, context: RequestContext, event_queue: EventQueue)`: Handles requests to cancel an ongoing task. 11 | 12 | The `RequestContext` provides information about the incoming request, such as the user's message and any existing task details. The `EventQueue` is used by the executor to send events back to the client. 13 | 14 | ## Helloworld Agent Executor 15 | 16 | Let's look at `agent_executor.py`. It defines `HelloWorldAgentExecutor`. 17 | 18 | 1. **The Agent (`HelloWorldAgent`)**: 19 | This is a simple helper class that encapsulates the actual "business logic". 20 | 21 | ```python { .no-copy } 22 | --8<-- "https://raw.githubusercontent.com/a2aproject/a2a-samples/refs/heads/main/samples/python/agents/helloworld/agent_executor.py:HelloWorldAgent" 23 | ``` 24 | 25 | It has a simple `invoke` method that returns the string "Hello World". 26 | 27 | 2. **The Executor (`HelloWorldAgentExecutor`)**: 28 | This class implements the `AgentExecutor` interface. 29 | 30 | - **`__init__`**: 31 | 32 | ```python { .no-copy } 33 | --8<-- "https://raw.githubusercontent.com/a2aproject/a2a-samples/refs/heads/main/samples/python/agents/helloworld/agent_executor.py:HelloWorldAgentExecutor_init" 34 | ``` 35 | 36 | It instantiates the `HelloWorldAgent`. 37 | 38 | - **`execute`**: 39 | 40 | ```python { .no-copy } 41 | --8<-- "https://raw.githubusercontent.com/a2aproject/a2a-samples/refs/heads/main/samples/python/agents/helloworld/agent_executor.py:HelloWorldAgentExecutor_execute" 42 | ``` 43 | 44 | When a `message/send` or `message/stream` request comes in (both are handled by `execute` in this simplified executor): 45 | 46 | 1. It calls `self.agent.invoke()` to get the "Hello World" string. 47 | 2. It creates an A2A `Message` object using the `new_agent_text_message` utility function. 48 | 3. It enqueues this message onto the `event_queue`. The underlying `DefaultRequestHandler` will then process this queue to send the response(s) to the client. For a single message like this, it will result in a single response for `message/send` or a single event for `message/stream` before the stream closes. 49 | 50 | - **`cancel`**: 51 | The Helloworld example's `cancel` method simply raises an exception, indicating that cancellation is not supported for this basic agent. 52 | 53 | ```python { .no-copy } 54 | --8<-- "https://raw.githubusercontent.com/a2aproject/a2a-samples/refs/heads/main/samples/python/agents/helloworld/agent_executor.py:HelloWorldAgentExecutor_cancel" 55 | ``` 56 | 57 | The `AgentExecutor` acts as the bridge between the A2A protocol (managed by the request handler and server application) and your agent's specific logic. It receives context about the request and uses an event queue to communicate results or updates back. 58 | -------------------------------------------------------------------------------- /docs/tutorials/python/5-start-server.md: -------------------------------------------------------------------------------- 1 | # 5. Starting the Server 2 | 3 | Now that we have an Agent Card and an Agent Executor, we can set up and start the A2A server. 4 | 5 | The A2A Python SDK provides an `A2AStarletteApplication` class that simplifies running an A2A-compliant HTTP server. It uses [Starlette](https://www.starlette.io/) for the web framework and is typically run with an ASGI server like [Uvicorn](https://www.uvicorn.org/). 6 | 7 | ## Server Setup in Helloworld 8 | 9 | Let's look at `__main__.py` again to see how the server is initialized and started. 10 | 11 | ```python { .no-copy } 12 | --8<-- "https://raw.githubusercontent.com/a2aproject/a2a-samples/refs/heads/main/samples/python/agents/helloworld/__main__.py" 13 | ``` 14 | 15 | Let's break this down: 16 | 17 | 1. **`DefaultRequestHandler`**: 18 | 19 | - The SDK provides `DefaultRequestHandler`. This handler takes your `AgentExecutor` implementation (here, `HelloWorldAgentExecutor`) and a `TaskStore` (here, `InMemoryTaskStore`). 20 | - It routes incoming A2A RPC calls to the appropriate methods on your executor (like `execute` or `cancel`). 21 | - The `TaskStore` is used by the `DefaultRequestHandler` to manage the lifecycle of tasks, especially for stateful interactions, streaming, and resubscription. Even if your agent executor is simple, the handler needs a task store. 22 | 23 | 2. **`A2AStarletteApplication`**: 24 | 25 | - The `A2AStarletteApplication` class is instantiated with the `agent_card` and the `request_handler` (referred to as `http_handler` in its constructor). 26 | - The `agent_card` is crucial because the server will expose it at the `/.well-known/agent.json` endpoint (by default). 27 | - The `request_handler` is responsible for processing all incoming A2A method calls by interacting with your `AgentExecutor`. 28 | 29 | 3. **`uvicorn.run(server_app_builder.build(), ...)`**: 30 | - The `A2AStarletteApplication` has a `build()` method that constructs the actual Starlette application. 31 | - This application is then run using `uvicorn.run()`, making your agent accessible over HTTP. 32 | - `host='0.0.0.0'` makes the server accessible on all network interfaces on your machine. 33 | - `port=9999` specifies the port to listen on. This matches the `url` in the `AgentCard`. 34 | 35 | ## Running the Helloworld Server 36 | 37 | Navigate to the `a2a-samples` directory in your terminal (if you're not already there) and ensure your virtual environment is activated. 38 | 39 | To run the Helloworld server: 40 | 41 | ```bash 42 | # from the a2a-samples directory 43 | python samples/python/agents/helloworld/__main__.py 44 | ``` 45 | 46 | You should see output similar to this, indicating the server is running: 47 | 48 | ```console { .no-copy } 49 | INFO: Started server process [xxxxx] 50 | INFO: Waiting for application startup. 51 | INFO: Application startup complete. 52 | INFO: Uvicorn running on http://0.0.0.0:9999 (Press CTRL+C to quit) 53 | ``` 54 | 55 | Your A2A Helloworld agent is now live and listening for requests! In the next step, we'll interact with it. 56 | -------------------------------------------------------------------------------- /docs/tutorials/python/6-interact-with-server.md: -------------------------------------------------------------------------------- 1 | # 6. Interacting with the Server 2 | 3 | With the Helloworld A2A server running, let's send some requests to it. The SDK includes a client (`A2AClient`) that simplifies these interactions. 4 | 5 | ## The Helloworld Test Client 6 | 7 | The `test_client.py` script demonstrates how to: 8 | 9 | 1. Fetch the Agent Card from the server. 10 | 2. Create an `A2AClient` instance. 11 | 3. Send both non-streaming (`message/send`) and streaming (`message/stream`) requests. 12 | 13 | Open a **new terminal window**, activate your virtual environment, and navigate to the `a2a-samples` directory. 14 | 15 | Activate virtual environment (Be sure to do this in the same directory where you created the virtual environment): 16 | 17 | === "Mac/Linux" 18 | 19 | ```sh 20 | source .venv/bin/activate 21 | ``` 22 | 23 | === "Windows" 24 | 25 | ```powershell 26 | .venv\Scripts\activate 27 | ``` 28 | 29 | Run the test client: 30 | 31 | ```bash 32 | # from the a2a-samples directory 33 | python samples/python/agents/helloworld/test_client.py 34 | ``` 35 | 36 | ## Understanding the Client Code 37 | 38 | Let's look at key parts of `test_client.py`: 39 | 40 | 1. **Fetching the Agent Card & Initializing the Client**: 41 | 42 | ```python { .no-copy } 43 | --8<-- "https://raw.githubusercontent.com/a2aproject/a2a-samples/refs/heads/main/samples/python/agents/helloworld/test_client.py:A2ACardResolver" 44 | ``` 45 | 46 | The `A2ACardResolver` class is a convenience. It first fetches the `AgentCard` from the server's `/.well-known/agent.json` endpoint (based on the provided base URL) and then initializes the client with it. 47 | 48 | 2. **Sending a Non-Streaming Message (`send_message`)**: 49 | 50 | ```python { .no-copy } 51 | --8<-- "https://raw.githubusercontent.com/a2aproject/a2a-samples/refs/heads/main/samples/python/agents/helloworld/test_client.py:send_message" 52 | ``` 53 | 54 | - The `send_message_payload` constructs the data for `MessageSendParams`. 55 | - This is wrapped in a `SendMessageRequest`. 56 | - It includes a `message` object with the `role` set to "user" and the content in `parts`. 57 | - The Helloworld agent's `execute` method will enqueue a single "Hello World" message. The `DefaultRequestHandler` will retrieve this and send it as the response. 58 | - The `response` will be a `SendMessageResponse` object, which contains either a `SendMessageSuccessResponse` (with the agent's `Message` as the result) or a `JSONRPCErrorResponse`. 59 | 60 | 3. **Handling Task IDs (Illustrative Note for Helloworld)**: 61 | 62 | The Helloworld client (`test_client.py`) doesn't attempt `get_task` or `cancel_task` directly because the simple Helloworld agent's `execute` method, when called via `message/send`, results in the `DefaultRequestHandler` returning a direct `Message` response rather than a `Task` object. More complex agents that explicitly manage tasks (like the LangGraph example) would return a `Task` object from `message/send`, and its `id` could then be used for `get_task` or `cancel_task`. 63 | 64 | 4. **Sending a Streaming Message (`send_message_streaming`)**: 65 | 66 | ```python { .no-copy } 67 | --8<-- "https://raw.githubusercontent.com/a2aproject/a2a-samples/refs/heads/main/samples/python/agents/helloworld/test_client.py:send_message_streaming" 68 | ``` 69 | 70 | - This method calls the agent's `message/stream` endpoint. The `DefaultRequestHandler` will invoke the `HelloWorldAgentExecutor.execute` method. 71 | - The `execute` method enqueues one "Hello World" message, and then the event queue is closed. 72 | - The client will receive this single message as one `SendStreamingMessageResponse` event, and then the stream will terminate. 73 | - The `stream_response` is an `AsyncGenerator`. 74 | 75 | ## Expected Output 76 | 77 | When you run `test_client.py`, you'll see JSON outputs for: 78 | 79 | - The non-streaming response (a single "Hello World" message). 80 | - The streaming response (a single "Hello World" message as one chunk, after which the stream ends). 81 | 82 | The `id` fields in the output will vary with each run. 83 | 84 | ```console { .no-copy } 85 | // Non-streaming response 86 | {"jsonrpc":"2.0","id":"xxxxxxxx","result":{"type":"message","role":"agent","parts":[{"type":"text","text":"Hello World"}],"messageId":"yyyyyyyy"}} 87 | // Streaming response (one chunk) 88 | {"jsonrpc":"2.0","id":"zzzzzzzz","result":{"type":"message","role":"agent","parts":[{"type":"text","text":"Hello World"}],"messageId":"wwwwwwww","final":true}} 89 | ``` 90 | 91 | _(Actual IDs like `xxxxxxxx`, `yyyyyyyy`, `zzzzzzzz`, `wwwwwwww` will be different UUIDs/request IDs)_ 92 | 93 | This confirms your server is correctly handling basic A2A interactions with the updated SDK structure! 94 | 95 | Now you can shut down the server by typing Ctrl+C in the terminal window where `__main__.py` is running. 96 | -------------------------------------------------------------------------------- /docs/tutorials/python/7-streaming-and-multiturn.md: -------------------------------------------------------------------------------- 1 | # 7. Streaming & Multi-Turn Interactions (LangGraph Example) 2 | 3 | The Helloworld example demonstrates the basic mechanics of A2A. For more advanced features like robust streaming, task state management, and multi-turn conversations powered by an LLM, we'll turn to the LangGraph example located in [`a2a-samples/samples/python/agents/langgraph/`](https://github.com/a2aproject/a2a-samples/tree/main/samples/python/agents/langgraph). 4 | 5 | This example features a "Currency Agent" that uses the Gemini model via LangChain and LangGraph to answer currency conversion questions. 6 | 7 | ## Setting up the LangGraph Example 8 | 9 | 1. Create a [Gemini API Key](https://ai.google.dev/gemini-api/docs/api-key), if you don't already have one. 10 | 11 | 2. **Environment Variable:** 12 | 13 | Create a `.env` file in the `a2a-samples/samples/python/agents/langgraph/` directory: 14 | 15 | ```bash 16 | echo "GOOGLE_API_KEY=YOUR_API_KEY_HERE" > .env 17 | ``` 18 | 19 | Replace `YOUR_API_KEY_HERE` with your actual Gemini API key. 20 | 21 | 3. **Install Dependencies (if not already covered):** 22 | 23 | The `langgraph` example has its own `pyproject.toml` which includes dependencies like `langchain-google-genai` and `langgraph`. When you installed the SDK from the `a2a-samples` root using `pip install -e .[dev]`, this should have also installed the dependencies for the workspace examples, including `langgraph-example`. If you encounter import errors, ensure your primary SDK installation from the root directory was successful. 24 | 25 | ## Running the LangGraph Server 26 | 27 | Navigate to the `a2a-samples/samples/python/agents/langgraph/app` directory in your terminal and ensure your virtual environment (from the SDK root) is activated. 28 | 29 | Start the LangGraph agent server: 30 | 31 | ```bash 32 | python __main__.py 33 | ``` 34 | 35 | This will start the server, usually on `http://localhost:10000`. 36 | 37 | ## Interacting with the LangGraph Agent 38 | 39 | Open a **new terminal window**, activate your virtual environment, and navigate to `a2a-samples/samples/python/agents/langgraph/app`. 40 | 41 | Run its test client: 42 | 43 | ```bash 44 | python test_client.py 45 | ``` 46 | 47 | Now, you can shut down the server by typing Ctrl+C in the terminal window where `__main__.py` is running. 48 | 49 | ## Key Features Demonstrated 50 | 51 | The `langgraph` example showcases several important A2A concepts: 52 | 53 | 1. **LLM Integration**: 54 | 55 | - `agent.py` defines `CurrencyAgent`. It uses `ChatGoogleGenerativeAI` and LangGraph's `create_react_agent` to process user queries. 56 | - This demonstrates how a real LLM can power the agent's logic. 57 | 58 | 2. **Task State Management**: 59 | 60 | - `samples/langgraph/__main__.py` initializes a `DefaultRequestHandler` with an `InMemoryTaskStore`. 61 | 62 | ```python { .no-copy } 63 | --8<-- "https://raw.githubusercontent.com/a2aproject/a2a-samples/refs/heads/main/samples/python/agents/langgraph/app/__main__.py:DefaultRequestHandler" 64 | ``` 65 | 66 | - The `CurrencyAgentExecutor` (in `samples/langgraph/agent_executor.py`), when its `execute` method is called by the `DefaultRequestHandler`, interacts with the `RequestContext` which contains the current task (if any). 67 | - For `message/send`, the `DefaultRequestHandler` uses the `TaskStore` to persist and retrieve task state across interactions. The response to `message/send` will be a full `Task` object if the agent's execution flow involves multiple steps or results in a persistent task. 68 | - The `test_client.py`'s `run_single_turn_test` demonstrates getting a `Task` object back and then querying it using `get_task`. 69 | 70 | 3. **Streaming with `TaskStatusUpdateEvent` and `TaskArtifactUpdateEvent`**: 71 | 72 | - The `execute` method in `CurrencyAgentExecutor` is responsible for handling both non-streaming and streaming requests, orchestrated by the `DefaultRequestHandler`. 73 | - As the LangGraph agent processes the request (which might involve calling tools like `get_exchange_rate`), the `CurrencyAgentExecutor` enqueues different types of events onto the `EventQueue`: 74 | - `TaskStatusUpdateEvent`: For intermediate updates (e.g., "Looking up exchange rates...", "Processing the exchange rates.."). The `final` flag on these events is `False`. 75 | - `TaskArtifactUpdateEvent`: When the final answer is ready, it's enqueued as an artifact. The `lastChunk` flag is `True`. 76 | - A final `TaskStatusUpdateEvent` with `state=TaskState.completed` and `final=True` is sent to signify the end of the task for streaming. 77 | - The `test_client.py`'s `run_streaming_test` function will print these individual event chunks as they are received from the server. 78 | 79 | 4. **Multi-Turn Conversation (`TaskState.input_required`)**: 80 | 81 | - The `CurrencyAgent` can ask for clarification if a query is ambiguous (e.g., user asks "how much is 100 USD?"). 82 | - When this happens, the `CurrencyAgentExecutor` will enqueue a `TaskStatusUpdateEvent` where `status.state` is `TaskState.input_required` and `status.message` contains the agent's question (e.g., "To which currency would you like to convert?"). This event will have `final=True` for the current interaction stream. 83 | - The `test_client.py`'s `run_multi_turn_test` function demonstrates this: 84 | - It sends an initial ambiguous query. 85 | - The agent responds (via the `DefaultRequestHandler` processing the enqueued events) with a `Task` whose status is `input_required`. 86 | - The client then sends a second message, including the `taskId` and `contextId` from the first turn's `Task` response, to provide the missing information ("in GBP"). This continues the same task. 87 | 88 | ## Exploring the Code 89 | 90 | Take some time to look through these files: 91 | 92 | - `__main__.py`: Server setup using `A2AStarletteApplication` and `DefaultRequestHandler`. Note the `AgentCard` definition includes `capabilities.streaming=True`. 93 | - `agent.py`: The `CurrencyAgent` with LangGraph, LLM model, and tool definitions. 94 | - `agent_executor.py`: The `CurrencyAgentExecutor` implementing the `execute` (and `cancel`) method. It uses the `RequestContext` to understand the ongoing task and the `EventQueue` to send back various events (`TaskStatusUpdateEvent`, `TaskArtifactUpdateEvent`, new `Task` object implicitly via the first event if no task exists). 95 | - `test_client.py`: Demonstrates various interaction patterns, including retrieving task IDs and using them for multi-turn conversations. 96 | 97 | This example provides a much richer illustration of how A2A facilitates complex, stateful, and asynchronous interactions between agents. 98 | -------------------------------------------------------------------------------- /docs/tutorials/python/8-next-steps.md: -------------------------------------------------------------------------------- 1 | # Next Steps 2 | 3 | Congratulations on completing the A2A Python SDK Tutorial! You've learned how to: 4 | 5 | - Set up your environment for A2A development. 6 | - Define Agent Skills and Agent Cards using the SDK's types. 7 | - Implement a basic HelloWorld A2A server and client. 8 | - Understand and implement streaming capabilities. 9 | - Integrate a more complex agent using LangGraph, demonstrating task state management and tool use. 10 | 11 | You now have a solid foundation for building and integrating your own A2A-compliant agents. 12 | 13 | ## Where to Go From Here? 14 | 15 | Here are some ideas and resources to continue your A2A journey: 16 | 17 | - **Explore Other Examples:** 18 | - Check out the other examples in the `a2a-samples/samples/` directory in the [A2A GitHub repository](https://github.com/a2aproject/a2a-samples/tree/main/samples) for more complex agent integrations and features. 19 | - The main A2A repository also has [samples for other languages and frameworks](https://github.com/a2aproject/A2A/tree/main/samples). 20 | - **Deepen Your Protocol Understanding:** 21 | - 📚 Read the complete [A2A Protocol Documentation site](https://google.github.io/A2A/) for a comprehensive overview. 22 | - 📝 Review the detailed [A2A Protocol Specification](../../specification.md) to understand the nuances of all data structures and RPC methods. 23 | - **Review Key A2A Topics:** 24 | - [A2A and MCP](../../topics/a2a-and-mcp.md): Understand how A2A complements the Model Context Protocol for tool usage. 25 | - [Enterprise-Ready Features](../../topics/enterprise-ready.md): Learn about security, observability, and other enterprise considerations. 26 | - [Streaming & Asynchronous Operations](../../topics/streaming-and-async.md): Get more details on SSE and push notifications. 27 | - [Agent Discovery](../../topics/agent-discovery.md): Explore different ways agents can find each other. 28 | - **Build Your Own Agent:** 29 | - Try creating a new A2A agent using your favorite Python agent framework (like LangChain, CrewAI, AutoGen, Semantic Kernel, or a custom solution). 30 | - Implement the `a2a.server.AgentExecutor` interface to bridge your agent's logic with the A2A protocol. 31 | - Think about what unique skills your agent could offer and how its Agent Card would represent them. 32 | - **Experiment with Advanced Features:** 33 | - Implement robust task management with a persistent `TaskStore` if your agent handles long-running or multi-session tasks. 34 | - Explore implementing push notifications if your agent's tasks are very long-lived. 35 | - Consider more complex input and output modalities (e.g., handling file uploads/downloads, or structured data via `DataPart`). 36 | - **Contribute to the A2A Community:** 37 | - Join the discussions on the [A2A GitHub Discussions page](https://github.com/a2aproject/A2A/discussions). 38 | - Report issues or suggest improvements via [GitHub Issues](https://github.com/a2aproject/A2A/issues). 39 | - Consider contributing code, examples, or documentation. See the [CONTRIBUTING.md](https://github.com/a2aproject/A2A/blob/main/CONTRIBUTING.md) guide. 40 | 41 | The A2A protocol aims to foster an ecosystem of interoperable AI agents. By building and sharing A2A-compliant agents, you can be a part of this exciting development! 42 | -------------------------------------------------------------------------------- /lychee.toml: -------------------------------------------------------------------------------- 1 | exclude = [ 2 | 'https://fonts.gstatic.com/', 3 | 'https://fonts.googleapis.com/', 4 | 'http://go/github', 5 | 'http://go/github-googlecloudplatform', 6 | 'https://medium.com/', 7 | 'https://x.com/', 8 | 'http://localhost:12000/', 9 | 'http://localhost:10020/', 10 | 'https://www.askmarvin.ai/', 11 | 'https://www.bcg.com/', 12 | 'https://www.oracle.com/netsuite', 13 | 'https://www.spglobal.com/', 14 | 'https://www.epam.com/', 15 | 'https://www.servicenow.com/', 16 | ] 17 | exclude_path = [ 18 | ".github/actions/spelling", 19 | ] 20 | 21 | max_retries = 0 22 | -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | # Project information 2 | site_name: Agent2Agent (A2A) Protocol 3 | site_url: https://a2aproject.github.io/A2A/ 4 | site_description: >- 5 | An open protocol enabling communication and interoperability between opaque agentic applications. 6 | site_dir: site 7 | 8 | extra: 9 | a2a_version: !ENV [MIKE_VERSION, 'dev'] 10 | 11 | # Navigation 12 | nav: 13 | - Home: index.md 14 | - Topics: 15 | - What is A2A?: topics/what-is-a2a.md 16 | - Key Concepts: topics/key-concepts.md 17 | - A2A and MCP: topics/a2a-and-mcp.md 18 | - Agent Discovery: topics/agent-discovery.md 19 | - Enterprise-Ready Features: topics/enterprise-ready.md 20 | - Streaming & Asynchronous Operations: topics/streaming-and-async.md 21 | - Extensions: topics/extensions.md 22 | - Life of a Task: topics/life-of-a-task.md 23 | - Specification: specification.md 24 | - Community: community.md 25 | - Partners: partners.md 26 | - SDK Reference: 27 | - Python: sdk/python/index.md 28 | - Tutorial (Python): 29 | - Introduction: tutorials/python/1-introduction.md 30 | - Setup: tutorials/python/2-setup.md 31 | - Agent Skills & Agent Card: tutorials/python/3-agent-skills-and-card.md 32 | - Agent Executor: tutorials/python/4-agent-executor.md 33 | - Start Server: tutorials/python/5-start-server.md 34 | - Interact with Server: tutorials/python/6-interact-with-server.md 35 | - Streaming & Multiturn: tutorials/python/7-streaming-and-multiturn.md 36 | - Next Steps: tutorials/python/8-next-steps.md 37 | 38 | # Repository 39 | repo_name: a2aproject/A2A 40 | repo_url: https://github.com/a2aproject/A2A 41 | 42 | # Copyright 43 | copyright: Copyright Google 2025 44 | 45 | # Custom CSS 46 | extra_css: 47 | - stylesheets/custom.css 48 | 49 | # Configuration 50 | theme: 51 | name: material 52 | custom_dir: .mkdocs/overrides 53 | font: 54 | text: Google Sans 55 | code: Roboto Mono 56 | logo: assets/a2a-logo-white.svg 57 | favicon: assets/a2a-logo-black.svg 58 | icon: 59 | repo: fontawesome/brands/github 60 | admonition: 61 | note: fontawesome/solid/note-sticky 62 | abstract: fontawesome/solid/book 63 | info: fontawesome/solid/circle-info 64 | tip: fontawesome/solid/bullhorn 65 | success: fontawesome/solid/check 66 | question: fontawesome/solid/circle-question 67 | warning: fontawesome/solid/triangle-exclamation 68 | failure: fontawesome/solid/bomb 69 | danger: fontawesome/solid/skull 70 | bug: fontawesome/solid/robot 71 | example: fontawesome/solid/flask 72 | quote: fontawesome/solid/quote-left 73 | palette: 74 | - scheme: default 75 | primary: indigo 76 | accent: white 77 | toggle: 78 | icon: material/brightness-7 79 | name: Switch to dark mode 80 | - scheme: slate 81 | primary: indigo 82 | accent: white 83 | toggle: 84 | icon: material/brightness-4 85 | name: Switch to light mode 86 | features: 87 | - announce.dismiss 88 | - content.code.annotate 89 | - content.code.copy 90 | - content.code.select 91 | - content.tabs.link 92 | - navigation.expand 93 | - navigation.footer 94 | - navigation.indexes 95 | - navigation.instant 96 | - navigation.instant.progress 97 | - navigation.path 98 | - navigation.tabs 99 | - navigation.top 100 | - navigation.tracking 101 | - toc.follow 102 | - versioning: 103 | provider: mike 104 | 105 | # Extensions 106 | markdown_extensions: 107 | - footnotes 108 | - admonition 109 | - attr_list 110 | - md_in_html 111 | - pymdownx.details 112 | - pymdownx.emoji: 113 | emoji_index: !!python/name:material.extensions.emoji.twemoji 114 | emoji_generator: !!python/name:material.extensions.emoji.to_svg 115 | - pymdownx.highlight: 116 | anchor_linenums: true 117 | line_spans: __span 118 | pygments_lang_class: true 119 | - pymdownx.inlinehilite 120 | - pymdownx.snippets: 121 | url_download: true 122 | dedent_subsections: true 123 | - pymdownx.superfences: 124 | custom_fences: 125 | - name: mermaid 126 | class: mermaid 127 | format: !!python/name:pymdownx.superfences.fence_code_format 128 | - pymdownx.tabbed: 129 | alternate_style: true 130 | slugify: !!python/object/apply:pymdownx.slugs.slugify 131 | kwds: 132 | case: lower 133 | - toc: 134 | permalink: true 135 | 136 | # Plugins 137 | plugins: 138 | - search 139 | - macros 140 | - redirects: 141 | redirect_maps: 142 | "spec-json.md": https://raw.githubusercontent.com/a2aproject/A2A/refs/heads/main/specification/json/a2a.json 143 | "specification/overview.md": "specification.md" 144 | "specification/agent-card.md": "specification.md#5-agent-discovery-the-agent-card" 145 | "specification/agent-to-agent-communication.md": "specification.md#6-protocol-data-objects" 146 | "specification/sample-messages.md": "specification.md#9-common-workflows-examples" 147 | "specification/details.md": "specification.md" 148 | "documentation.md": "topics/key-concepts.md" 149 | "resources.md": "index.md" 150 | "topics/push-notifications.md": "topics/streaming-and-async.md" 151 | "specification/topics/a2a_and_mcp.md": "topics/a2a-and-mcp.md" 152 | "specification/topics/agent_discovery.md": "topics/agent-discovery.md" 153 | "specification/topics/enterprise_ready.md": "topics/enterprise-ready.md" 154 | "specification/topics/push_notification.md": "topics/streaming-and-async.md" 155 | "specification/topics/push_notifications.md": "topics/streaming-and-async.md" 156 | "topics/index.md": "topics/what-is-a2a.md" 157 | # Tutorial 158 | "tutorials/index.md": "tutorials/python/1-introduction.md" 159 | "tutorials/python/index.md": "tutorials/python/1-introduction.md" 160 | "tutorials/python/1_introduction.md": "tutorials/python/1-introduction.md" 161 | "tutorials/python/3-create-project.md": "tutorials/python/2-setup.md" 162 | "tutorials/python/4-agent-skills.md": "tutorials/python/3-agent-skills-and-card.md" 163 | "tutorials/python/5-add-agent-card.md": "tutorials/python/3-agent-skills-and-card.md" 164 | "tutorials/python/6-start-server.md": "tutorials/python/5-start-server.md" 165 | "tutorials/python/7-interact-with-server.md": "tutorials/python/6-interact-with-server.md" 166 | "tutorials/python/8-agent-capabilities.md": "tutorials/python/7-streaming-and-multiturn.md" 167 | "tutorials/python/9-ollama-agent.md": "tutorials/python/7-streaming-and-multiturn.md" 168 | "tutorials/python/10-next-steps.md": "tutorials/python/8-next-steps.md" 169 | - mkdocstrings: 170 | handlers: 171 | python: 172 | options: 173 | show_root_heading: false 174 | show_object_full_path: false 175 | show_if_no_docstring: true 176 | filters: ["!^_"] 177 | exclude: 178 | - ".git" 179 | - ".idea" 180 | - ".vscode" 181 | - ".nox" 182 | - ".venv" 183 | - ".tmp" 184 | - ".gemini" 185 | - ".scripts" 186 | - "venv" 187 | - ".ruff_cache" 188 | - "node_modules" 189 | - "__pycache__" 190 | - ".DS_Store" 191 | extra: 192 | show_value: true 193 | show_qualifiers: false 194 | -------------------------------------------------------------------------------- /requirements-docs.txt: -------------------------------------------------------------------------------- 1 | mkdocs-material==9.6.14 2 | mkdocs-redirects==1.2.2 3 | mkdocstrings[python] 4 | a2a-sdk 5 | mike 6 | mkdocs-macros-plugin 7 | -------------------------------------------------------------------------------- /specification/grpc/README.md: -------------------------------------------------------------------------------- 1 | # Protocol Buffer Definitions 2 | 3 | This folder contains the a2a specification in Protocol Buffer (protobuf) format 4 | 5 | ## Prerequisites 6 | 7 | Before you can validate or generate code from these protobuf definitions, you need to install `buf`. 8 | 9 | Follow the installation instructions on the official `buf` GitHub repository: 10 | <https://github.com/bufbuild/buf/> 11 | 12 | ## Validation 13 | 14 | To validate your protobuf definitions and ensure they adhere to linting rules, run the following command from the root of this folder: 15 | 16 | ```sh 17 | buf lint 18 | ``` 19 | 20 | ## Code Generation 21 | 22 | `buf.gen.yaml` is configured to generate code for the following languages: 23 | 24 | - Go 25 | - Java 26 | - Python 27 | - TypeScript 28 | 29 | To generate code for all configured languages, run the following command from the root of this folder: 30 | 31 | ```sh 32 | buf generate 33 | ``` 34 | 35 | `buf.gen.yaml` uses remote plugins for generation, if you wish to use local plugins change remote to local 36 | 37 | ```yaml 38 | plugins: 39 | - local: protoc-gen-java 40 | out: src/java 41 | - local: protoc-gen-grpc-java 42 | out: src/java 43 | ``` 44 | 45 | Alternatively use `protoc` commandline for code generation 46 | 47 | ```bash 48 | protoc --java_out=./src/java --grpc-java_out=./src/java -I. a2a.proto 49 | ``` 50 | 51 | ### Generating for Specific Languages 52 | 53 | If you do not need to generate code for all the languages listed above, you can comment out the unwanted language sections in your `buf.gen.yaml` file. 54 | 55 | For example, if you only want to generate Java exclude the rest, your `buf.gen.yaml` might look something like this (ensure you adapt this to your actual `buf.gen.yaml` structure): 56 | 57 | ```yaml 58 | # buf.gen.yaml 59 | version: v2 60 | plugins: 61 | # - plugin: buf.build/protocolbuffers/go 62 | # out: src/go 63 | # - plugin: buf.build/protocolbuffers/python 64 | # out: src/python 65 | - plugin: buf.build/protocolbuffers/java 66 | out: src/java 67 | # - plugin: buf.build/grpc/typescript 68 | # out: src/ts 69 | ``` 70 | -------------------------------------------------------------------------------- /specification/grpc/buf.gen.yaml: -------------------------------------------------------------------------------- 1 | # buf generate 2 | # Configuration for the buf generate command 3 | # Uses remote plugins, no separate install required. 4 | # This config generates python, go and java (protobuf) source. 5 | version: v2 6 | plugins: 7 | # Python 8 | - remote: buf.build/protocolbuffers/python:v29.3 9 | out: src/python 10 | - remote: buf.build/grpc/python 11 | out: src/python 12 | 13 | # Go 14 | - remote: buf.build/protocolbuffers/go 15 | out: src/go 16 | 17 | - remote: buf.build/grpc/go 18 | out: src/go 19 | 20 | # Java 21 | - remote: buf.build/protocolbuffers/java 22 | out: src/java 23 | 24 | - remote: buf.build/grpc/java 25 | out: src/java 26 | 27 | # TypeScript 28 | - remote: buf.build/community/stephenh-ts-proto:v1.165.0 29 | out: src/typescript 30 | -------------------------------------------------------------------------------- /specification/grpc/buf.lock: -------------------------------------------------------------------------------- 1 | # Generated by buf. DO NOT EDIT. 2 | version: v2 3 | deps: 4 | - name: buf.build/googleapis/googleapis 5 | commit: 61b203b9a9164be9a834f58c37be6f62 6 | digest: b5:7811a98b35bd2e4ae5c3ac73c8b3d9ae429f3a790da15de188dc98fc2b77d6bb10e45711f14903af9553fa9821dff256054f2e4b7795789265bc476bec2f088c 7 | -------------------------------------------------------------------------------- /specification/grpc/buf.yaml: -------------------------------------------------------------------------------- 1 | version: v2 2 | deps: 3 | # Common Protobuf types. 4 | - buf.build/googleapis/googleapis 5 | lint: 6 | use: 7 | # Indicates that all the default rules should be used. 8 | # See https://buf.build/docs/lint/rules for more details. 9 | - STANDARD 10 | except: 11 | - PACKAGE_DIRECTORY_MATCH 12 | - RPC_REQUEST_RESPONSE_UNIQUE 13 | - RPC_REQUEST_STANDARD_NAME 14 | - RPC_RESPONSE_STANDARD_NAME 15 | breaking: 16 | use: 17 | # Indicates that breaking change detection should be done on a file level. 18 | # See https://buf.build/docs/breaking/rules for more details. 19 | - FILE 20 | -------------------------------------------------------------------------------- /specification/json/README.md: -------------------------------------------------------------------------------- 1 | # A2A Specification JSON 2 | 3 | DO NOT EDIT `a2a.json` directly. 4 | 5 | Make all edits in [`types/src/types.ts`](https://github.com/a2aproject/A2A/blob/main/types/src/types.ts) and follow the directions in [`types/README.md`](https://github.com/a2aproject/A2A/blob/main/types/README.md) 6 | -------------------------------------------------------------------------------- /types/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | -------------------------------------------------------------------------------- /types/README.md: -------------------------------------------------------------------------------- 1 | # A2A Types 2 | 3 | Core objects and method types for A2A Protocol 4 | 5 | ## Steps to update 6 | 7 | 1. Clone this repository. 8 | 2. Run `npm install` 9 | 3. Update `types.ts` with required changes 10 | 4. Run `npm run generate`, this will update `a2a.json`. 11 | 5. Verify the updates and push to the repository. 12 | 13 | **DO NOT DIRECTLY CHANGE `a2a.json` file. THIS MUST BE GENERATED USING `npm run generate`** 14 | -------------------------------------------------------------------------------- /types/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "types", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "generate": "./node_modules/.bin/typescript-json-schema tsconfig.json \"*\" --defaultNumberType integer --required --out ../specification/json/a2a.json", 7 | "prettier": "prettier src/types.ts --write" 8 | }, 9 | "author": "", 10 | "description": "A2A Types", 11 | "dependencies": { 12 | "typescript-json-schema": "^0.65.1" 13 | }, 14 | "devDependencies": { 15 | "prettier": "^3.5.3", 16 | "typescript": "^5.3.3" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /types/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "noEmit": true, 4 | "emitDecoratorMetadata": true, 5 | "experimentalDecorators": true, 6 | "target": "ES5", 7 | "module": "CommonJS", 8 | "strictNullChecks": false, 9 | "skipLibCheck": true 10 | }, 11 | "include": ["**/*.ts"], 12 | "exclude": ["node_modules"] 13 | } 14 | --------------------------------------------------------------------------------