Qui parle à qui
Gemini Enterprise est l'assistant d'entreprise de Google : un chat, des connecteurs (Drive, Gmail…) et des agents. Nos agents vivent dans un projet à part. L'app les appelle, avec son compte de service, et, s'il le faut, avec le jeton de l'utilisateur.
Le chat
{{PROJET_APP}}
{{APP_ID}} ({{GE_LOCATION}}){{GE_SA}}ou Agent Runtime
{{PROJET_AGENTS}}
{{K}}-a2a-shell (A2A){{K}}-shellL'utilisateur
Son compte Acme. Il voit un agent seulement s'il a le rôle Agent User. Avec OAuth, l'agent agit avec ses droits à lui.
Le compte de l'app
{{GE_SA}} appelle l'agent. Il lui faut ① run.invoker sur chaque service Cloud Run, ② discoveryengine.serviceAgent sur le projet des agents (Agent Runtime).
Le compte de l'agent
{{K}}-a2a-shell-sa : appelle Gemini, écrit ses journaux, passe par Model Armor. Rien d'autre.
Deux façons d'héberger un agent
| A2A sur Cloud Run | Agent Runtime (Vertex AI) | |
|---|---|---|
| Ce qu'on donne à l'app | La carte de l'agent (JSON) | Le chemin projects/…/reasoningEngines/… |
| Droit de l'app | ① roles/run.invoker sur le service | ② roles/discoveryengine.serviceAgent sur le projet |
| OAuth | Une autorisation par agent | Plusieurs (une par fournisseur) |
| Mise à jour | Nouvelle révision, même adresse | Nouvelle ressource : nouveau chemin à rajouter dans l'app |
| Quand le choisir | Par défaut ; protocole ouvert, réutilisable | Plusieurs fournisseurs OAuth ; sessions gérées par Google |
Le catalogue des agents
Un dossier par agent dans agents/trio/, décrit dans catalogue.json (nom, description, questions d'exemple, et le bloc oauth). Scripts et Terraform lisent ce fichier.
L'API de Gemini Enterprise (streamAssist) ne sait pas appeler un agent A2A ou ADK ajouté à l'app (documentation Google). Un agent personnalisé se teste dans le chat, ou en appelant l'agent directement comme le fait l'app (onglet Dépannage).
Déployer un agent
Tout se fait depuis un terminal Mac ou Linux. Il n'y a pas de Docker : l'image est construite par Cloud Build, dans Google Cloud. L'app n'a pas besoin d'exister à cette étape.
Le poste
gcloudconnecté :gcloud auth loginetgcloud auth application-default login- Python 3.12 à 3.14
- Mac sans droits d'installation :
pip install --no-deps -r agents/trio/requirements-poste.txt
Vos droits
Vérification en lecture seule, groupes compris :
./scripts/verifier_droits.sh
La configuration
Un fichier config/12-1-agents-dans-projet-exp.env. Les champs de l'app peuvent rester vides tant qu'on ne publie pas.
Charger la configuration
source scripts/config.sh config/12-1-agents-dans-projet-exp.env
Affiche un résumé : projets, agents, et « (pas encore : agents seuls) » si l'app est vide.
Préparer (une fois par projet)
./scripts/deployer_shell.sh preparer # filtres Model Armor, dépôt d'images, compte de constructionDéployer l'agent
./scripts/deployer_shell.sh cloudrun {{K}} # A2A : image (Cloud Build), compte, service privé
./scripts/deployer_shell.sh runtime {{K}} # et/ou Agent Runtime== {{K}} (Cloud Run) adresse {{URL}}
-- 1/3 l'image, construite par Cloud Build (environ 1 min 20 s) … SUCCESS
-- 2/3 son compte de service et ses 3 rôles
-- 3/3 le service Cloud Run (privé)
Service URL: {{URL}}Tester (3 à 5 minutes après)
./scripts/deployer_shell.sh tester {{K}}« OK : les agents répondent en A2A v0.3, avec mémoire de conversation ». Pour un agent OAuth, la réponse « cliquez sur Autoriser » est normale : le test n'envoie pas de jeton utilisateur.
La fiche pour Gemini Enterprise
./scripts/deployer_shell.sh carte {{K}}Écrit carte-{{K}}.json et affiche tout ce qu'il faut coller dans l'app : nom, description, carte sur une ligne, chemin Agent Runtime, étape Authentification, questions proposées, droits.
La carte vient de carte_a2a.py, au format attendu par Google. Pas celle de /.well-known/agent-card.json : elle a des champs en plus, et Gemini Enterprise la refuse.
Relancer est sans danger : ce qui existe est gardé. cloudrun reconstruit l'image : nouvelle révision, même adresse. Supprimer : python scripts/nettoyer.py --agent {{K}} --supprimer (affiche d'abord l'inventaire).
Choisir les agents dans la configuration
AGENTS="{{K}}" # ce qui doit EXISTER (vide = tout le catalogue)
AGENTS_OAUTH="{{K}}={{AUTH}}" # seulement pour un agent OAuthAppliquer
source scripts/config.sh config/12-1-agents-dans-projet-exp.env cd 01-bis-cloud-run-a2a/terraform # Agent Runtime : 02-bis-agent-runtime/terraform terraform init && terraform plan # 1 agent sans app : 22 to add ; +7 par agent terraform apply
for_each sur le catalogue : une image par agent, et ajouter un agent n'en touche aucun autre. Les agents OAuth ont aussi leurs API Google activées.
Lire ce qu'il faut pour l'app
terraform output cards # la carte de chaque agent A2A terraform output oauth # autorisations attendues + portées terraform output agents # (02-bis) le chemin de chaque agent Agent Runtime
Avec PUBLIER=oui et les valeurs de l'app, Terraform ajoute aussi les agents à l'app, autorisation comprise.
L'image
Cloud Build se lance depuis le terminal (aucun bouton console ne prend notre dossier) : gcloud builds submit … --config=01-bis-cloud-run-a2a/cloudbuild.yaml. Le guide 12-1-3 donne la commande complète.
Le service Cloud Run
🔎 Cloud Run → Déployer un conteneur → l'image → nom {{K}}-a2a-shell → région {{REGION}} → Exiger l'authentification → compte de service de l'agent → variables (fichier env-{{K}}.yaml).
Vérifier
L'URL du service doit être exactement {{URL}} : elle est écrite dans la carte.
Détail clic par clic : docs/12-1-3-deployer-agents-console.md.
Brancher l'agent sur l'app
Trois choses : les droits du compte de l'app (dans le projet des agents), l'ajout de l'agent (dans l'app), l'accès des utilisateurs. Attendez 2 à 3 minutes après les droits.
Cloud Run Invoker sur le service
🔎 Cloud Run → {{K}}-a2a-shell → Sécurité → Ajouter un compte principal → {{GE_SA}} → rôle Cloud Run Invoker (Demandeur Cloud Run) → Enregistrer.
gcloud run services add-iam-policy-binding {{K}}-a2a-shell \
--region={{REGION}} --project={{PROJET_AGENTS}} \
--role=roles/run.invoker --member=serviceAccount:{{GE_SA}}Discovery Engine Service Agent sur le projet
🔎 IAM → Accorder l'accès → {{GE_SA}} → rôle Discovery Engine Service Agent. Une fois pour tous les agents.
gcloud projects add-iam-policy-binding {{PROJET_AGENTS}} --condition=None \
--role=roles/discoveryengine.serviceAgent --member=serviceAccount:{{GE_SA}}Voir les droits (lecture seule) : IAM → cocher « Include Google-provided role grants » → filtre gcp-sa-discoveryengine. Ou ./scripts/connecter_app.sh verifier. Les deux droits en une commande, avec confirmation : ./scripts/connecter_app.sh droits {{K}}.
La carte, sur une ligne
./scripts/deployer_shell.sh carte {{K}} # ou : cat carte-{{K}}.jsonDans l'app
🔎 Gemini Enterprise → l'app → Agents → + Add agent → Custom agent via A2A → collez toute la ligne, du premier { au dernier } → Preview agent details → Next.
Authentication
Agent sans OAuth : Skip & Finish. Agent OAuth : ne pas cliquer Skip, voir l'onglet 3.
Le nom
L'agent → Edit → {{NOM}} (A2A). Ou en une commande, avec les questions proposées : onglet 5.
Le chemin de l'agent
./scripts/deployer_shell.sh carte {{K}} # « [Agent Runtime] projects/{{NUM_AGENTS}}/locations/{{REGION}}/reasoningEngines/… »Dans l'app
+ Add agent → Custom agent via Agent Runtime → Authorizations : rien (sans OAuth) → Next → Agent name {{NOM}}, description du catalogue, Agent Runtime resource path → Create.
Nouvelle version ?
Agent Runtime crée une nouvelle ressource. Retirez l'ancienne entrée de l'app et ajoutez le nouveau chemin.
L'accès des utilisateurs
L'agent → User permissions → Add → un groupe (recommandé) ou une adresse → rôle Agent User → Save. Sans ce rôle, l'agent n'apparaît pas dans le chat.
Le test
Overview → lien de l'app web → Agents → {{NOM}} → « {{EX}} ». 20 à 40 s la 1re fois (démarrage).
Ce qu'on envoie aux équipes qui ont leurs propres agents
Leur agent est dans leur projet. Elles donnent le droit, puis nous envoient la carte ou le chemin :
Pour brancher votre agent sur l'app Gemini Enterprise ({{PROJET_APP}}), merci de :
1. donner au compte {{GE_SA}}
- roles/run.invoker sur votre service Cloud Run (agent A2A), ou
- roles/discoveryengine.serviceAgent sur votre projet (agent Agent Runtime) ;
2. nous envoyer la carte A2A (JSON, une ligne) ou le chemin projects/…/reasoningEngines/… ;
3. si l'agent agit avec le compte de l'utilisateur (OAuth) : l'ID client, et les portées voulues (le secret par un canal sûr).
Région de l'agent : europe-* (app en {{GE_LOCATION}}).Un agent qui agit avec l'accord de l'utilisateur
Exemples : Rapport e-mails (courriels, Gmail en lecture) et Espace de travail (workspace : Gmail, Agenda, Drive en lecture, Google Sheets en lecture et modification, sans suppression). L'utilisateur clique une fois sur « Autoriser ». Ensuite, l'agent reçoit son jeton à chaque question.
Le flux, étape par étape
Google ne publie pas d'API pour créer un client OAuth : 2 minutes dans la console, et le script affiche le lien. Tout le reste passe par les scripts et Terraform : API Google, déploiement, fiche, autorisation, ajout, personnalisation.
Activer les API de l'agent, voir ses portées
source scripts/config.sh config/12-1-agents-dans-projet-exp.env
./scripts/deployer_shell.sh oauth {{K}}== courriels
▶ gcloud services enable gmail.googleapis.com --project={{PROJET_AGENTS}}
portées (A2A) : https://www.googleapis.com/auth/gmail.readonly
portées (Agent Runtime) : … + https://www.googleapis.com/auth/cloud-platform
Client OAuth (une fois, console, 2 min) : https://console.cloud.google.com/auth/clients?project={{PROJET_AGENTS}}Les API et les portées viennent du bloc "oauth" de l'agent dans catalogue.json.
Le client OAuth
- 🔎 Google Auth Platform → si besoin Commencer : nom de l'application, e-mail, audience Interne.
- Clients → + Créer un client → Application Web → nom
ge-{{K}}. - URI de redirection autorisés, ces deux-là exactement :
https://vertexaisearch.cloud.google.com/oauth-redirect https://vertexaisearch.cloud.google.com/static/oauth/oauth.html
→ Créer → notez l'ID client (à mettre dans « Vos valeurs ») et le secret. Ne les mettez jamais dans le dépôt.
Déployer l'agent avec son autorisation
AGENTS_OAUTH="{{K}}={{AUTH}}" ./scripts/deployer_shell.sh cloudrun {{K}}
./scripts/deployer_shell.sh tester {{K}} # 3 à 5 min après : « cliquez sur Autoriser » = normalL'agent reçoit AUTH_ID={{AUTH}}. En A2A, le nom de l'autorisation dans l'app peut être différent ; sur Agent Runtime, il doit être identique.
La fiche, avec l'URL d'autorisation complète
AGENTS_OAUTH="{{K}}={{AUTH}}" CLIENT_ID={{CLIENT_ID}} ./scripts/deployer_shell.sh carte {{K}} 3. Authentication (ne PAS cliquer Skip) :
Nom de l'autorisation : {{AUTH}}
Authorization URL : {{AUTH_URL}}
Token URL : https://oauth2.googleapis.com/token
Scopes : {{SCOPES}}
PKCE / HTTP Basic : décochésLe droit de l'app sur le service
Droit ① sur {{K}}-a2a-shell, comme pour tout agent A2A (onglet 2).
Ajouter l'agent avec l'autorisation
Console : Custom agent via A2A → la carte → Authentication : remplissez les champs de la fiche. Ne cliquez pas sur Skip.
| Champ | Valeur |
|---|---|
| Nom de l'autorisation | {{AUTH}} (lisible : il s'affiche à l'utilisateur) |
| Client ID / secret | Ceux du client OAuth |
| Authorization URL | Celle de la fiche (avec access_type=offline et prompt=consent, obligatoires) |
| Token URL | https://oauth2.googleapis.com/token |
| Scopes | {{SCOPES}} |
| PKCE / HTTP Basic | Décochés pour Google |
Ou par script, avec les valeurs de l'app données devant les commandes (le fichier de config n'est pas touché) :
export PROJET_APP={{PROJET_APP}} NUM_APP={{NUM_APP}} GE_LOCATION={{GE_LOCATION}}
export GE_PROJECT={{PROJET_APP}} GE_APP={{APP_ID}}
./scripts/autorisation_oauth.sh create {{AUTH}} ~/Downloads/client_secret_XXX.json "{{SCOPES}}" "{{NOM}}"
AUTH_ID={{AUTH}} ./scripts/add_agent_to_ge.sh a2a carte-{{K}}.json "{{NOM}} (A2A)" # + droit run.invoker
./scripts/personnaliser_agent.sh "{{NOM}} (A2A)" {{K}} # questions proposées, langueLe test
Agent User pour vous → ouvrez l'agent → « {{EX}} » → encadré Authorize → fenêtre Google → Autoriser → la réponse, avec vos données. Ensuite, plus d'encadré : l'accès est gardé.
Ce que l'agent « Espace de travail » peut faire, et ne fera jamais
| Service | Portée | Peut | Ne peut pas |
|---|---|---|---|
| Gmail | gmail.readonly | Chercher, lire, résumer | Envoyer, supprimer (Google refuse) |
| Agenda | calendar.events.readonly | Voir les réunions | Créer, modifier, supprimer |
| Drive | drive.readonly | Chercher, lire Docs et Slides | Modifier, supprimer un fichier |
| Sheets | spreadsheets | Lire, écrire, formules, ajouter des lignes, onglets, mise en forme, tri, graphiques, créer un classeur | Rien supprimer ni vider : bloqué par le code, avant tout appel à Google |
Google n'a pas de portée « Sheets sans suppression ». Les outils n'acceptent donc qu'une liste de modifications sans perte, et sheets_ecrire refuse de vider une cellule remplie. Testé : à « Supprime l'onglet Archives », l'agent refuse et propose de le masquer.
Plusieurs fournisseurs d'identifiants
Une autorisation = un fournisseur. Une seule autorisation Google couvre Gmail, Agenda, Drive, Sheets et BigQuery : les portées s'additionnent dans un seul consentement. Un autre fournisseur, comme Atlassian, Airtable ou Databricks, demande une autre autorisation.
Une seule autorisation par agent
L'app envoie un jeton (agentAuthorization). Plusieurs fournisseurs ? Un agent par fournisseur : « Espace Google (A2A) » et « Jira (A2A) ». Le chat passe de l'un à l'autre.
Une liste d'autorisations
L'app envoie un jeton par autorisation (toolAuthorizations). Chaque outil prend le sien. L'utilisateur clique « Autoriser » une fois par fournisseur.
AUTH_ID="acces-google,acces-atlassian" : les outils Google prennent le jeton de la 1re autorisation, les outils Atlassian celle dont l'ID contient « atlassian ». Donc : Google en premier, et le mot du fournisseur dans l'ID.
L'application OAuth Atlassian
- developer.atlassian.com/console/myapps → Create → OAuth 2.0 integration.
- Permissions : Jira API (
read:jira-work,read:jira-user), Confluence API (search:confluence,read:confluence-content.summary). - Authorization → Callback URL :
https://vertexaisearch.cloud.google.com/static/oauth/oauth.html. - Settings : Client ID et Secret. Distribution → Sharing : sinon, vous seul pouvez autoriser.
Déployer sur Agent Runtime avec les deux autorisations
AGENTS_OAUTH="workspace=acces-google,acces-atlassian" ./scripts/deployer_shell.sh runtime workspace
AGENTS_OAUTH="workspace=acces-google,acces-atlassian" CLIENT_ID={{CLIENT_ID}} ./scripts/deployer_shell.sh carte workspaceDans l'app : deux autorisations
Custom agent via Agent Runtime → Authorizations → Add authorization deux fois. Les noms doivent être identiques à AGENTS_OAUTH.
| acces-google | acces-atlassian | |
|---|---|---|
| Authorization URL | Celle de la fiche (Google, + cloud-platform, exigé sur Agent Runtime) | https://auth.atlassian.com/authorize?audience=api.atlassian.com&client_id=…&scope=read%3Ajira-work%20read%3Ajira-user%20search%3Aconfluence%20read%3Aconfluence-content.summary%20offline_access&redirect_uri=…&response_type=code&prompt=consent |
| Token URL | https://oauth2.googleapis.com/token | https://auth.atlassian.com/oauth/token |
Par script : AUTH_ID=acces-google,acces-atlassian ./scripts/add_agent_to_ge.sh adk <chemin> "Espace de travail". En A2A, le script refuse : « UNE seule autorisation par agent ».
Dans le chat
« Mes tickets Jira en cours ? » → un 2e bouton Authorize (Atlassian) → Accept → la liste. « Prépare ma semaine avec réunions, e-mails et tickets » → les trois sources dans une seule réponse.
Autres fournisseurs : les champs
| Fournisseur | Authorization URL | Token URL | PKCE | HTTP Basic |
|---|---|---|---|---|
accounts.google.com/o/oauth2/auth?…&access_type=offline&prompt=consent | oauth2.googleapis.com/token | non | non | |
| Atlassian | auth.atlassian.com/authorize?audience=api.atlassian.com&… | auth.atlassian.com/oauth/token | non | non |
| Airtable | airtable.com/oauth2/v1/authorize | airtable.com/oauth2/v1/token | oui | oui |
| Databricks | <espace>/oidc/v1/authorize | <espace>/oidc/v1/token | oui | si secret |
Partout : déclarer chez le fournisseur les deux adresses de redirection de Gemini Enterprise. Atlassian, Airtable et Databricks n'ont pas encore été testés en vrai.
Soigner l'expérience
L'encadré « The agent requires additional authorization for: … » et son bouton Authorize sont l'interface de Google : leur forme ne se change pas. En revanche, ce qui est écrit autour se règle.
| Élément | Comment | |
|---|---|---|
| Couleur, forme, place du bouton | non | Interface Google, la même pour tous |
| Langue (« Authorize » ou « Autoriser ») | indirect | Gemini Enterprise en français ; pas de hl=en_US dans l'URL |
| Le nom après « authorization for: » | oui | Nom affiché de l'autorisation (displayName), ou un ID lisible (pas l'ID généré par la console) |
| Nom et icône de l'agent | oui | displayName, icon |
| Questions proposées, texte de la zone de saisie | oui | starterPrompts, customPlaceholderText (pris dans le catalogue) |
| Fenêtre Google : nom de l'app, logo, e-mail d'assistance | oui | Google Auth Platform → Branding, dans le projet du client OAuth |
| Message de l'agent si le jeton manque ou est refusé | oui | L'instruction de l'agent (déjà en français, avec la marche à suivre) |
La fenêtre Google (sans risque)
Projet du client OAuth → 🔎 Google Auth Platform → Branding : nom (« Assistant Acme »), logo PNG 120×120, e-mail d'équipe. Puis Accès aux données → déclarer les portées : elles s'affichent en clair.
Le nom de l'autorisation
export PROJET_APP={{PROJET_APP}} NUM_APP={{NUM_APP}} GE_LOCATION={{GE_LOCATION}}
./scripts/autorisation_oauth.sh list # ID | nom affiché
./scripts/autorisation_oauth.sh renommer {{AUTH}} "{{NOM}}"Si l'encadré montre encore l'ID après renommage, recréez l'autorisation avec un ID lisible, puis rattachez l'agent.
L'agent : nom, questions, texte de saisie, langue, icône
GE_PROJECT={{PROJET_APP}} GE_APP={{APP_ID}} GE_LOCATION={{GE_LOCATION}} \
./scripts/personnaliser_agent.sh "<nom actuel dans l'app>" {{K}} --icone icone.pngAVANT : {"displayName": "test gmail remote agent with auth"}
APRÈS : {"displayName": "{{NOM}} (A2A)", "starterPrompts": [{"text": "{{EX}}"}, …], "languageCode": "fr"}
Modifier cet agent dans l'app {{APP_ID}} (projet {{PROJET_APP}}) ? Tapez « oui » : oui
modifié : … (retour arrière : ./scripts/personnaliser_agent.sh --annuler avant-<ID>.json)Seuls ces champs changent (updateMask) : ni la carte, ni l'autorisation.
Ce qui protège, à chaque étage
Services privés
Cloud Run sans accès public : seuls les comptes qui ont run.invoker appellent l'agent, c'est-à-dire l'app et vous.
Droits minimaux
Chaque agent a son compte, avec 3 rôles : Gemini, journaux, Model Armor. Le compte de l'app n'a que ① et ②.
Model Armor
Questions et réponses filtrées : injection de consignes, jailbreak, URL malveillantes, données sensibles, contenus dangereux.
Les droits de l'utilisateur
Avec OAuth, l'agent ne voit que ce que l'utilisateur voit. Le jeton n'est jamais enregistré (état temp:) ni écrit dans les journaux.
Portées minimales
Lecture seule partout, sauf Sheets. Aucun outil de suppression. Consentement Interne : comptes Acme uniquement.
Injection par le contenu
Un e-mail peut contenir « ignore tes règles ». L'agent traite ce contenu comme une donnée. Même trompé, il ne peut rien supprimer ni envoyer : les portées et le code l'en empêchent.
Le client OAuth : dans quel projet ?
| Projet des agents (recommandé) | Projet de l'app | |
|---|---|---|
| API Gmail, Drive… à activer | projet des agents (script, Terraform) | projet de prod de l'app |
| Quotas, suivi | projet des agents | projet de l'app |
| Fenêtre Google | nom et logo de l'équipe | un seul nom pour tous |
| Secret et rotation | équipe agents | équipe Gemini Enterprise |
| Changement en prod pour un agent | aucun, à part l'ajout de l'agent | API + client dans la prod |
Les deux marchent. Projet des agents : un client par équipe ou par famille d'agents. Projet de l'app : seulement pour un client commun, géré par l'équipe Gemini Enterprise. Dans les deux cas, l'admin Google Workspace peut devoir approuver l'ID client (Sécurité → Contrôles des API).
Lecture d'abord (connecter_app.sh verifier, autorisation_oauth.sh list, nettoyer.py sans --supprimer). Toute modification de l'app demande une confirmation (taper l'ID du projet, ou « oui »). personnaliser_agent.sh garde l'avant pour revenir en arrière.
Dépannage
| Ce que vous voyez | Cause | Que faire |
|---|---|---|
| La carte est refusée à l'ajout | Carte de /.well-known/agent-card.json, ou ligne coupée | ./scripts/deployer_shell.sh carte {{K}}, puis copier toute la ligne |
KeyError: '{{K}}' | catalogue.json pas à jour sur le poste | Recopier tout le fichier |
| « The agent couldn't respond » | Droits pas encore actifs, ou manquants | Attendre 3 min ; vérifier ① et ② avec {{GE_SA}} |
part_metadata parameter is only supported in Gemini Developer API mode | Ancien commun.py | Mettre à jour commun.py, puis deployer_shell.sh cloudrun {{K}} |
| Agent absent du chat | Pas de rôle Agent User, ou pas de licence | L'agent → User permissions → Agent User |
redirect_uri_mismatch | URI de redirection du client OAuth | Les 2 URI, au caractère près |
| « Accès bloqué : votre administrateur… » | L'admin Workspace bloque l'app | Faire approuver l'ID client (Contrôles des API) |
refus (403) … has not been used in project | API Google non activée | ./scripts/deployer_shell.sh oauth {{K}} (projet du client OAuth) |
refus (403) … insufficient authentication scopes | Portée absente de l'Authorization URL | Reprendre l'URL de la fiche ; retirer l'accès, puis réautoriser |
refus (401) | Jeton expiré | Redemander ; sinon retirer l'accès sur myaccount.google.com/permissions |
| Pas de bouton Authorize | Agent ajouté sans autorisation (Skip) | Retirer l'agent de l'app, le rajouter avec l'étape Authentication |
| Agent Runtime : toujours « cliquez sur Autoriser » | Nom de l'autorisation ≠ AGENTS_OAUTH | Même ID des deux côtés |
A2A : UNE seule autorisation par agent | Deux fournisseurs en A2A | Agent Runtime, ou un agent par fournisseur |
| « Pas de jeton Atlassian » | ID sans le mot « atlassian », ou A2A | Onglet 4 : règle de nommage |
| Réponse bloquée par Model Armor | Droits du compte de l'agent pas encore actifs, ou données sensibles | Attendre 2 à 5 min ; restreindre la demande |
does not have storage.objects.get access | Compte de construction absent | ./scripts/deployer_shell.sh preparer |
Service account … does not exist | Compte tout neuf, pas encore visible | Le script réessaie ; sinon relancer |
Échec de pip install (watchdog) sur Mac | Pas de paquet compilé pour Python 3.14 | pip install --no-deps -r agents/trio/requirements-poste.txt ; adk run au lieu de adk web |
Appeler l'agent comme le fait l'app
curl -s -X POST "{{URL}}/" \
-H "Authorization: Bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" -H "A2A-Version: 0.3" \
-d '{"jsonrpc":"2.0","id":"1","method":"message/send","params":{"message":{"kind":"message","role":"user","messageId":"t1","parts":[{"kind":"text","text":"{{EX}}","metadata":{"source":"curl"}}]}}}' \
| python3 -m json.tool« completed » et une réponse : l'agent marche. Pour simuler l'app de bout en bout, avec son compte de service : ./scripts/simuler_gemini_enterprise.sh tout (guide 12-1-5).
De zéro à un agent OAuth dans le chat
Chaque case reste cochée dans votre navigateur. L'ordre est celui qui a marché sur l'instance Acme.
Pour aller plus loin : les guides
docs/12-1-1-deployer-agents-shell.md: déployer par script, pas à pasdocs/12-1-2-deployer-agents-terraform.md·12-1-3(console)docs/12-1-4-connecter-agents-app-gemini-enterprise.md: les droits, les messages aux équipesdocs/12-1-5-simuler-appel-gemini-enterprise.md: simuler l'app, sans l'appdocs/12-1-6-ajouter-agent-console-gemini-enterprise.md: la console de l'app, clic par clicdocs/12-1-7-agents-oauth-identite-outils.md: OAuth, identitédocs/12-1-8-agent-espace-de-travail-multi-oauth.md: Gmail, Agenda, Drive, Sheets ; plusieurs fournisseurs ; expériencescripts/README.md: la carte de tous les scripts