# 03. Tutoriel : un agent dans un AUTRE projet, utilisable dans le chat Gemini Enterprise **Pour qui :** toute personne qui veut le faire une première fois à la main, dans la console Google Cloud. **Résultat :** un agent déployé dans un projet B apparaît dans l'app Gemini Enterprise du projet A, et répond normalement dans le chat. On utilise uniquement la **console** et **Cloud Shell**. **Faites d'abord le [tutoriel 02 (même projet)](02-tuto-meme-projet.md)** : ce document ne décrit que **ce qui change** quand l'agent vit dans un autre projet, et les deux méthodes en plus (Cloud Run + A2A, Agent Registry + Agent Gateway). ``` PROJET A : "acme-ge-demo" PROJET B : "acme-agents-demo" ┌──────────────────────────────────┐ ┌────────────────────────────────────────────┐ │ App Gemini Enterprise (eu) │ │ Méthode 1 : Agent Runtime (Vertex AI) │ │ ├─ chat des utilisateurs │──── appelle ─▶│ Méthode 2 : Cloud Run + A2A │ │ └─ Agents : stock (x3 méthodes) │ │ Méthode 3 : via Agent Registry + Gateway │ │ Compte de service GE : │ │ IAM : droits donnés AU compte GE du projet A│ │ service-NUM_A@gcp-sa-discovery… │ └────────────────────────────────────────────┘ └──────────────────────────────────┘ ``` | Méthode | Héberge l'agent | Ajout dans GE | Droit dans le projet B | Difficulté | Quand la choisir | |---|---|---|---|---|---| | **1. Agent Runtime** (Vertex AI / Agent Platform) | Google, géré | *Agent personnalisé via Agent Runtime* | `Discovery Engine Service Agent` sur le projet B | ★☆☆ | **Par défaut** pour un agent ADK | | **2. Cloud Run + A2A** | Cloud Run (conteneur) | *Agent personnalisé via A2A* | `Cloud Run Invoker` sur le service | ★★☆ | Agent existant sur Cloud Run, autre framework | | **3. Agent Registry + Agent Gateway** | Agent Runtime ou Cloud Run | Import depuis le registre | Comme 1 ou 2, + autorisation de la passerelle | ★★★ | Gouvernance centrale, trafic contrôlé | --- ## Sommaire 0. [Prérequis](#étape-0--prérequis) 1. [Projet A : l'app Gemini Enterprise et son compte de service](#étape-1--projet-a--lapp-et-son-compte-de-service) 2. [Projet B : créer le projet et écrire l'agent](#étape-2--projet-b--le-projet-et-lagent) 3. [Méthode 1 : Agent Runtime](#méthode-1--agent-runtime-vertex-ai) 4. [Méthode 2 : Cloud Run + A2A](#méthode-2--cloud-run--a2a) 5. [Méthode 3 : Agent Registry + Agent Gateway](#méthode-3--agent-registry--agent-gateway) 6. [Donner l'accès aux utilisateurs et tester dans le chat](#étape-6--donner-laccès-et-tester-dans-le-chat) 7. [Dépannage](#étape-7--dépannage) 8. [Avant la production](#étape-8--avant-la-production) --- ## Étape 0 : prérequis | Besoin | Pourquoi | |---|---| | Un compte **Google d'entreprise** (Workspace ou Cloud Identity), pas un Gmail | Gemini Enterprise est réservé aux organisations | | Une **organisation** Google Cloud et un **compte de facturation** | Les deux projets doivent être rattachés à l'organisation et facturés | | Rôles : *Project Creator*, *Billing Account User* ; puis *Owner* sur les deux projets (en démo) | Créer les projets, activer les services, poser les droits | | Des **licences** Gemini Enterprise (ou un essai) | Pour utiliser le chat | Dans tout le guide, remplacez : - `acme-ge-demo` par l'ID de votre projet A, et `NUM_A` par son **numéro** (page d'accueil du projet, carte *Informations sur le projet*) ; - `acme-agents-demo` par l'ID du projet B, et `NUM_B` par son numéro. --- ## Étape 1 : projet A : l'app et son compte de service 1. Créer (si besoin) le projet A et l'app Gemini Enterprise en `eu`, l'identité et les testeurs : **[tutoriel 02, étape 1](02-tuto-meme-projet.md#1-prérequis--lapp-gemini-enterprise)**. 2. Noter le **compte de service de Gemini Enterprise** du projet A. C'est **lui** qui appellera l'agent du projet B, et c'est **à lui** que le projet B donnera des droits : ``` service-NUM_A@gcp-sa-discoveryengine.iam.gserviceaccount.com ``` (Visible dans 🔎 « IAM » du projet A, en cochant *Inclure les attributions de rôles fournies par Google*.) --- ## Étape 2 : projet B : le projet et l'agent ### 2.1 Créer le projet B et activer les API 1. **Nouveau projet** → `acme-agents-demo`, même organisation, même facturation. 2. 🔎 « API et services » → **Bibliothèque** → activer : - **Agent Platform API** (ex-Vertex AI, `aiplatform.googleapis.com`) : modèle Gemini et Agent Runtime ; - **Cloud Run Admin API**, **Cloud Build API**, **Artifact Registry API** : méthode 2 ; - **Agent Registry API** : méthode 3. ### 2.2 Écrire et tester l'agent Exactement comme dans le **[tutoriel 02, étapes 3 et 4](02-tuto-meme-projet.md#3-écrire-lagent)**, avec deux différences : - dans Cloud Shell : `gcloud config set project acme-agents-demo` (projet **B**) ; - les exemples ci-dessous utilisent un agent `stock_agent` (code dans le dépôt : `agents/specialist/stock_agent`). L'agent `conges_agent` du tutoriel 02 convient tout aussi bien : remplacez simplement le nom du dossier. --- ## Méthode 1 : Agent Runtime (Vertex AI) **Le principe :** Google héberge l'agent (pas de serveur à gérer), avec des sessions et des journaux. Gemini Enterprise l'appelle par son **nom de ressource**. ### M1.1 Déployer l'agent (projet B) ```bash cd ~/agents adk deploy agent_engine --project=acme-agents-demo --region=europe-west1 \ --display_name="stock-agent" --description="Stock d'un article par magasin" stock_agent ``` Durée : 5 à 10 minutes. À la fin, la commande affiche le nom de ressource : `projects/NUM_B/locations/europe-west1/reasoningEngines/1234567890`. **Dans la console :** 🔎 « Agent Runtime » (menu *Agent Platform* → **Déploiements**) → `stock-agent` apparaît. Cliquer dessus : onglets *Playground* (pour tester), *Journaux*, *Sessions*. Copier le **nom de la ressource**. **Pourquoi `europe-west1` :** l'app est en `eu`. Google n'accepte que des agents en `europe-*` pour une app `eu`. ### M1.2 Autoriser Gemini Enterprise (projet A) dans le projet B C'est l'étape qu'on oublie. Sans elle, l'agent s'ajoute, mais ne répond pas dans le chat. 1. Sélectionner le **projet B** → 🔎 « IAM » → **Accorder l'accès**. 2. *Nouveaux comptes principaux* : `service-NUM_A@gcp-sa-discoveryengine.iam.gserviceaccount.com` (le compte de l'**app**, donc du projet **A**). 3. Rôle : **Discovery Engine Service Agent** (`roles/discoveryengine.serviceAgent`). 4. **Enregistrer**. > Si la console refuse de sélectionner un rôle d'« agent de service », utiliser Cloud Shell : > ```bash > gcloud projects add-iam-policy-binding acme-agents-demo --condition=None \ > --role=roles/discoveryengine.serviceAgent \ > --member=serviceAccount:service-NUM_A@gcp-sa-discoveryengine.iam.gserviceaccount.com > ``` ### M1.3 Ajouter l'agent dans l'app (projet A) Identique au **[tutoriel 02, étape 6](02-tuto-meme-projet.md#6-lajouter-dans-lapp)**, dans le **projet A**, avec le nom de ressource de l'agent du **projet B** (`projects/NUM_B/locations/europe-west1/reasoningEngines/…`). → [Étape 6](#étape-6--donner-laccès-et-tester-dans-le-chat) pour le tester dans le chat. --- ## Méthode 2 : Cloud Run + A2A **Le principe :** l'agent tourne dans un conteneur Cloud Run et parle le protocole ouvert **A2A**. Il publie une **carte d'agent** (JSON), que l'on colle dans Gemini Enterprise. Gemini Enterprise appelle le service avec un jeton de **son** compte de service : le service reste **privé**. ### M2.1 Préparer la carte d'agent (projet B) L'adresse d'un service Cloud Run est prévisible : `https://NOM-NUM_B.REGION.run.app`. ADK expose l'agent A2A sous `/a2a/`. ```bash cd ~/agents NUM_B=$(gcloud projects describe acme-agents-demo --format='value(projectNumber)') URL="https://stock-agent-a2a-$NUM_B.europe-west1.run.app/a2a/stock_agent" cat > stock_agent/agent.json < Les agents Agent Runtime du projet B sont déjà dans le registre **du projet B**, automatiquement. Les importer > directement depuis ce registre dans une app du projet A dépend de la liaison passerelle ↔ registre d'un autre projet : > point à valider. La déclaration dans le registre du projet A fonctionne dans tous les cas. ### M3.3 Créer l'Agent Gateway (projet A) Cloud Shell, **projet A** : ```bash gcloud config set project acme-ge-demo cat > ge-egress.yaml <