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
max tokens
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 | [](https://pypi.org/project/a2a-sdk)
4 | [](LICENSE)
5 |
6 | 
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 | [](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 | {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 | **[{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 | **{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 | {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 | {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 | {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 | { 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 |
--------------------------------------------------------------------------------