AI Agent End to End - Workshop

1. Czego się nauczysz

AI Agent Vibe Full Stack

Witamy! Za chwilę poznasz kolejną kluczową umiejętność w zakresie tworzenia oprogramowania: jak skutecznie kierować sztuczną inteligencją, aby tworzyć, testować i wdrażać oprogramowanie klasy produkcyjnej. Generatywna AI nie jest „autopilotem”, ale potężnym kopilotem, który potrzebuje doświadczonego dyrektora.

Te warsztaty zapewniają ustrukturyzowaną, powtarzalną metodologię współpracy z AI na każdym etapie profesjonalnego cyklu życia oprogramowania (SDLC). Z osoby piszącej kod wiersz po wierszu staniesz się dyrektorem technicznym – architektem z wizją i generalnym wykonawcą, który wykorzystuje AI do precyzyjnego realizowania tej wizji. 🚀

demo

Po ukończeniu tego samouczka:

  • Przekształcanie ogólnego pomysłu w architekturę chmury za pomocą AI.
  • Wygenerowano kompletny backend w Pythonie z użyciem ukierunkowanych, szczegółowych promptów.
  • Używanie AI jako programisty do debugowania i poprawiania kodu.
  • Przekazaliśmy AI tworzenie testów jednostkowych, w tym atrap.

Wygenerowana gotowa do użytku produkcyjnego infrastruktura jako kod (IaC) za pomocą Terraform.

Utworzono pełny potok CI/CD w GitHub Actions za pomocą jednego prompta.

monitorować i zarządzać aplikacją w wersji produkcyjnej za pomocą narzędzi operacyjnych opartych na AI;

Po zakończeniu szkolenia będziesz mieć nie tylko działającą aplikację, ale też plan rozwoju z wykorzystaniem AI. Zaczynamy!

2. Wymagania wstępne i konfiguracja

Zanim zaczniemy, przygotujmy środowisko. To kluczowy krok, który zapewni płynny przebieg warsztatów.

Aby uruchomić naszych agentów AI, potrzebujemy dwóch rzeczy: projektu Google Cloud, który będzie stanowić podstawę, oraz klucza interfejsu Gemini API, który umożliwi dostęp do zaawansowanych modeli Google.

Krok 1. Włącz konto rozliczeniowe

  • Aby odebrać konto rozliczeniowe z 5-dolarowym kredytem, musisz je wykorzystać w procesie wdrażania. Zaloguj się na konto Gmail.

Krok 2. Utwórz nowy projekt GCP

  • Otwórz konsolę Google Cloud i utwórz nowy projekt.

utworzyć nowe konto GCP,

  • Otwórz konsolę Google Cloud i utwórz nowy projekt.
  • Otwórz panel po lewej stronie, kliknij Billing i sprawdź, czy konto rozliczeniowe jest połączone z tym kontem GCP.

Połącz konto rozliczeniowe z kontem GCP

Jeśli widzisz tę stronę, zaznacz manage billing account, wybierz Google Cloud Trial One i połącz się z nim.

Krok 3. Wygeneruj klucz interfejsu Gemini API

Zanim zabezpieczysz klucz, musisz go mieć.

  • Otwórz Google AI Studio : https://aistudio.google.com/
  • Zaloguj się na konto Gmail.
  • Kliknij przycisk „Uzyskaj klucz API”, który zwykle znajduje się w panelu nawigacyjnym po lewej stronie lub w prawym górnym rogu.
  • W oknie „Klucze interfejsu API” kliknij „Utwórz klucz interfejsu API w nowym projekcie”. Tworzenie klucza interfejsu API w nowym projekcie
  • Wybierz utworzony przez siebie nowy projekt, w którym skonfigurowano konto rozliczeniowe. Wybierz nowy projekt
  • Wygenerujemy dla Ciebie nowy klucz interfejsu API. Natychmiast skopiuj ten klucz i tymczasowo zapisz go w bezpiecznym miejscu (np. w menedżerze haseł lub bezpiecznej notatce). Tej wartości użyjesz w kolejnych krokach.

Uwierzytelnianie w GitHub

Otwórz Cloud Shell, przechodząc do konsoli Google Cloud i klikając przycisk „Aktywuj Cloud Shell” w prawym górnym rogu.

Krok 1. Otwórz Cloud Shell

👉 Kliknij Aktywuj Cloud Shell u góry konsoli Google Cloud (jest to ikona terminala u góry panelu Cloud Shell) cloud-shell.png

👉 Kliknij przycisk „Otwórz edytor” (wygląda jak otwarty folder z ołówkiem). W oknie otworzy się edytor kodu Cloud Shell. Po lewej stronie zobaczysz eksplorator plików. open-editor.png

👉Znajdź identyfikator projektu Google Cloud:

  • Otwórz konsolę Google Cloud: https://console.cloud.google.com
  • Wybierz projekt, którego chcesz użyć w tych warsztatach, z menu u góry strony.
  • Identyfikator projektu jest wyświetlany na karcie Informacje o projekcie w panelu.

03-04-project-id.png

👉Otwórz terminal w chmurowym IDE.

03-05-new-terminal.png

👉💻 W terminalu sprawdź, czy użytkownik jest już uwierzytelniony i czy projekt jest ustawiony na identyfikator projektu, używając tego polecenia:

gcloud auth list

Krok 2. Uwierzytelnij w usłudze GitHub i utwórz fork

Uwierzytelnianie w GitHub:

👉💻

gh auth login

git1.png

skopiować kod na stronę weryfikacji logowania,

git2.png

Utwórz fork i sklonuj repozytorium: 👉💻

gh repo fork cuppibla/storygen-learning --clone=true

3. Architektura: od pomysłu do projektu z pomocą Cloud Assist

Każdy wspaniały projekt zaczyna się od jasnej wizji. Do zaprojektowania architektury aplikacji użyjemy naszego asystenta AI, Cloud Assist.

architektura

Działania

  • Otwórz konsolę Google Cloud: https://console.cloud.google.com
  • W prawym górnym rogu kliknij „Otwórz czat Cloud Assist”.

cloud_assist_1

Włączanie Cloud Assist

  • Kliknij Get Gemini Assist, a potem Enable Cloud Assist at no cost.
  • i rozpocznij czat.

cloud_assist_3 Podaj Cloud Assist ten szczegółowy prompt:

Wpisz swój pomysł

Generate a Python web application that uses AI to generate children's stories and illustrations. It has Python backend and React frontend host separately on Cloudrun. They communicate through Websocket. It needs to use a generative model for text and another for images. The generated images must be used by Imagen from Vertex AI and stored in a Google Cloud Storage bucket so that frontend can fetch from the bucket to render images. I do not want any load balancer or a database for the story text. We need a solution to store the API key.

Uzyskaj plan aplikacji

  • Kliknij „Edytuj projekt aplikacji”, aby wyświetlić diagram. Aby pobrać kod Terraform, kliknij panel w prawym górnym rogu „<> Get Code” (Pobierz kod).
  • Cloud Assist wygeneruje diagram architektury. To nasz wizualny plan. cloud_assist_4

Kluczowy moment szkoleniowy: AI doskonale radzi sobie z projektowaniem systemów na wysokim poziomie. Może natychmiast przetłumaczyć wymagania sformułowane prostym językiem na profesjonalną architekturę wizualną.

4. Tworzenie: tworzenie ADK za pomocą interfejsu wiersza poleceń Gemini

SDLC

Konfiguracja początkowa

Upewnij się, że używasz interfejsu wiersza poleceń Gemini do rozwidlenia repozytorium i przygotowania obszaru roboczego:

Konfiguracja środowiska

Otwórz Cloud Shell i kliknij przycisk „Otwórz terminal”.

  1. Skopiuj szablon środowiska:
    cd ~/storygen-learning
    cp ~/storygen-learning/env.template ~/storygen-learning/.env
    

Wyświetlanie ukrytego pliku w edytorze, jeśli nie możesz znaleźć pliku .env

  • Na pasku menu u góry kliknij Wyświetl.
  • Kliknij Przełącz ukryte pliki.

Edytowanie pliku .env 2. Zastąp te wartości w pliku .env:

GOOGLE_API_KEY=[REPLACE YOUR API KEY HERE]
GOOGLE_CLOUD_PROJECT_ID=[REPLACE YOUR PROJECT ID]
GITHUB_USERNAME=[REPLACE YOUR USERNAME]
GENMEDIA_BUCKET=[REPLACE YOUR PROJECT ID]-bucket

Jeśli np.identyfikator projektu to testproject, wpisz GOOGLE_CLOUD_PROJECT_ID=testprojectGENMEDIA_BUCKET=testproject-bucket.

Skrypty konfiguracyjne

Otwórz 00_Starting_Here Otwórz nowy terminal (nie w interfejsie wiersza poleceń Gemini).

cd ~/storygen-learning/00_Starting_Here

Przeprowadź pełną konfigurację:

./setup-complete.sh

Wyniki konfiguracji powinny być widoczne w terminalu.

Tworzenie pierwszego agenta

Przejdź do 01a_First_Agent_Ready Użyjmy interfejsu wiersza poleceń Gemini, aby utworzyć agenta ADK:

cd ~/storygen-learning/01a_First_Agent_Ready

Otwórz interfejs wiersza poleceń Gemini

gemini

W oknie interfejsu wiersza poleceń Gemini wypróbuj prompt:

I need you to help me create a Google ADK (Agent Development Kit) agent for story generation. I'm working on a children's storybook app that generates creative stories with visual scenes.

Please create a complete `agent.py` file that implements an LlmAgent using Google's ADK framework. The agent should:

**Requirements:**
1. Use the `google.adk.agents.LlmAgent` class
2. Use the "gemini-2.5-flash" model (supports streaming)
3. Be named "story_agent"
4. Generate structured stories with exactly 4 scenes each
5. Output valid JSON with story text, main characters, and scene data
6. No tools needed (images are handled separately)

**Agent Specifications:**
- **Model:** gemini-2.5-flash
- **Name:** story_agent  
- **Description:** "Generates creative short stories and accompanying visual keyframes based on user-provided keywords and themes."
**Story Structure Required:**
- Exactly 4 scenes: Setup  Inciting Incident  Climax  Resolution
- 100-200 words total
- Simple, charming language for all audiences
- Natural keyword integration
**JSON Output Format:**

{
  "story": "Complete story text...",
  "main_characters": [
    {
      "name": "Character Name",
      "description": "VERY detailed visual description with specific colors, features, size, etc."
    }
  ],
  "scenes": [
    {
      "index": 1,
      "title": "The Setup",
      "description": "Scene action and setting WITHOUT character descriptions",
      "text": "Story text for this scene"
    }
    // ... 3 more scenes
  ]
}


**Key Instructions for the Agent:**
- Extract 1-2 main characters maximum
- Character descriptions should be extremely detailed and visual
- Scene descriptions focus on ACTION and SETTING only
- Do NOT repeat character appearance in scene descriptions
- Always respond with valid JSON

Please include a complete example in the instructions showing the exact format using keywords like "tiny robot", "lost kitten", "rainy city".

The file should start with necessary imports, define an empty tools list, include a print statement for initialization, and then create the LlmAgent with all the detailed instructions.

Can you create this agent in backend/story_agent/agent.py

Gdy skończysz, wyłącz terminal interfejsu wiersza poleceń Gemini za pomocą ikony Control+C.

—————————————— Opcjonalnie, możesz przejść do części Rozwiązanie——————————————–

Teraz zweryfikuj zmianę w ADK Web

cd ~/storygen-learning/01a_First_Agent_Ready/backend

source ../../.venv/bin/activate

adk web --port 8080

Uruchomienie witryny

cd ~/storygen-learning/01a_First_Agent_Ready

./start.sh

Jeśli zmiana nie działa, w interfejsie ADK i witrynie powinny pojawić się błędy.

——————————————– Rozwiązanie zaczyna się tutaj ——————————————–

Rozwiązanie

Zakończ poprzedni proces, klikając Control+C, lub otwórz inny terminal:

cd ~/storygen-learning/01b_First_Agent_Done

Uruchom stronę:

./start.sh

Zobaczysz witrynę:

witryna

Wypróbuj interfejs ADK: otwórz kolejny terminal:

cd ~/storygen-learning/01b_First_Agent_Done/backend
source ../../.venv/bin/activate

adk web --port 8080

Zobaczysz interfejs ADK, w którym możesz zadawać pytania agentowi.

adkweb

Zanim przejdziesz do następnej sekcji, naciśnij Ctrl+C, aby zakończyć proces.

5. Tworzenie własnego agenta za pomocą Imagen

2adk

Generowanie narzędzia Imagen (drugi agent)

cd ~/storygen-learning/02a_Image_Agent_Ready

Użyj interfejsu wiersza poleceń Gemini, aby utworzyć agenta do generowania obrazów:

gemini generate "I need you to help me create a custom Google ADK (Agent Development Kit) agent for image generation. This is different from the story agent - this one handles image generation directly using the BaseAgent pattern for full control over tool execution.

Please create a complete `agent.py` file that implements a custom image generation agent. The agent should:

**Requirements:**
1. Use the `google.adk.agents.BaseAgent` class (NOT LlmAgent)
2. Be named "custom_image_agent" 
3. Directly execute the ImagenTool without LLM intermediation
4. Handle JSON input with scene descriptions and character descriptions
5. Store results in session state for retrieval by main.py
6. Use async generators and yield Events

**Key Specifications:**
- **Class Name:** CustomImageAgent (inherits from BaseAgent)
- **Agent Name:** "custom_image_agent"
- **Tool:** Uses ImagenTool for direct image generation
- **Purpose:** Bypass LLM agent limitations and directly call ImagenTool

**Input Format:**
The agent should handle JSON input like:
{
  "scene_description": "Scene action and setting",
  "character_descriptions": {
    "CharacterName": "detailed visual description"
  }
}


**Core Method:** `async def _run_async_impl(self, ctx: InvocationContext) -> AsyncGenerator[Event, None]:`
   - Extract user message from `ctx.user_content.parts`
   - Parse JSON input or fallback to plain text
   - Extract scene_description and character_descriptions
   - Build image prompt with style prefix: "Children's book cartoon illustration with bright vibrant colors, simple shapes, friendly characters."
   - Include character descriptions for consistency
   - Call `await self.imagen_tool.run()` directly
   - Store results in `ctx.session.state["image_result"]`
   - Yield Event with results


 **Session State:**
   - Store JSON results in `ctx.session.state["image_result"]`
   - Include success/error status
   - Store actual image URLs or error messages

Expected Output Structure:
- Successful results stored as JSON with image URLs
- Error results stored as JSON with error messages
- Results accessible via session state in main.py

Can you create this agent in backend/story_image_agent/agent.py

"

—————————————— Opcjonalnie, możesz przejść do części Rozwiązanie——————————————–

Teraz zweryfikuj zmianę w ADK Web

cd ~/storygen-learning/02a_Image_Agent_Ready/backend

source ../../.venv/bin/activate

adk web --port 8080

Uruchomienie witryny

cd ~/storygen-learning/02a_Second_Agent_Ready

./start.sh

Jeśli zmiana nie działa, w interfejsie ADK i witrynie powinny pojawić się błędy.

—————————————— Rozwiązanie zaczyna się tutaj ——————————————–

Rozwiązanie

Zakończ poprzedni proces, klikając Control+C, lub otwórz inny terminal:

# Open new terminal
cd ~/storygen-learning/02b_Image_Agent_Done

Uruchom stronę:

./start.sh

Zobaczysz witrynę:

witryna

Wypróbuj interfejs ADK: otwórz kolejny terminal:

# Open new terminal
cd ~/storygen-learning/02b_Image_Agent_Done/backend

source ../../.venv/bin/activate

adk web --port 8080

Zobaczysz interfejs ADK, w którym możesz zadawać pytania agentowi:

adkweb

Zanim przejdziesz do następnej sekcji, naciśnij Ctrl+C, aby zakończyć proces.

6. Testowanie: ocena agenta

Nasza aplikacja działa, ale potrzebujemy automatycznej siatki bezpieczeństwa w postaci testów. To idealne zadanie do przekazania naszemu asystentowi AI.

Działania

cd ~/storygen-learning/03a_Agent_Evaluation_Ready/backend

Użyj interfejsu wiersza poleceń Gemini do pisania kompleksowych testów:

Otwórz interfejs wiersza poleceń Gemini

gemini

W oknie interfejsu wiersza poleceń Gemini wypróbuj prompt:

I need you to create comprehensive test files for my backend/story_agent in Google ADK. I need three specific JSON files that match the testing structure used in ADK evaluation.

**Context:** 
- The story agent generates structured JSON stories with exactly 4 scenes
- It uses LlmAgent with no tools, just direct LLM responses
- Input: Keywords
- Output: JSON with story, main_characters, and scenes arrays

**Files to Create:**

### 1. `story_agent_eval.evalset.json` (Comprehensive Integration Tests)
Create a comprehensive evaluation set with:
- **eval_set_id**: "story_agent_comprehensive_evalset"
- **name**: "Story Agent Comprehensive Evaluation Set" 
- **description**: "Comprehensive evaluation scenarios for story_agent covering various keyword combinations, edge cases, and story quality metrics"


Each eval_case should include:
- Full conversation arrays with invocation_id, user_content, final_response
- Complete expected JSON responses with detailed stories, characters, and 4 scenes
- session_input with app_name "story_agent"
- All fields: story (narrative text), main_characters (with detailed visual descriptions), scenes (with index, title, description, text)

### 2. `story_generation.test.json` (Unit Tests)
Create basic generation tests with:
- **eval_set_id**: "story_agent_basic_generation_tests"
- **name**: "Story Agent Basic Generation Tests"
- **description**: "Unit tests for story_agent focusing on JSON structure compliance, scene generation, and keyword integration"

### 3. `test_config.json` (Evaluation Configuration)
Create test configuration with:
- **criteria**: response_match_score: 0.7, tool_trajectory_avg_score: 1.0
- **custom_evaluators**: 
  - json_structure_validator (validates required fields, scene count, character fields)
  - story_quality_metrics (word count 80-250, keyword integration threshold 0.8)
- **evaluation_notes**: Story agent specifics and trajectory expectations

**Important Requirements:**
1. All responses must be valid, parseable JSON
2. Stories must have exactly 4 scenes with indices 1-4
3. Each scene must have: index, title, description, text
4. Main characters must have detailed visual descriptions
5. No tool_uses expected (empty arrays) since story agent uses direct LLM
6. Word count should be 100-200 words total
7. Keywords must be naturally integrated into the narrative

Please generate all three files with realistic example stories and comprehensive test coverage matching the ADK evaluation format.

—————————————— Opcjonalnie, możesz przejść do części Rozwiązanie——————————————–

Aby zobaczyć ocenę:

./run_adk_web_persistent.sh

Otwórz kartę eval w interfejsie ADK.

Powinien być widoczny interfejs ADK Web z możliwością ciągłego testowania.

Kluczowy moment: AI to potężne narzędzie do automatyzacji kontroli jakości. Może ona obsługiwać powtarzalne elementy pisania testów, dzięki czemu możesz skupić się na tworzeniu funkcji.

——————————————– Rozwiązanie zaczyna się tutaj ——————————————–

Rozwiązanie

  • Otwórz folder rozwiązania:
cd ~/storygen-learning/03b_Agent_Evaluation_Done/backend
  • Otwieranie interfejsu ADK w internecie
./run_adk_web_persistent.sh

Przypadki testowe możesz zobaczyć na karcie Eval:

eval1

Dostosuj dane tutaj:

eval2

Wynik uruchomienia oceny możesz wyświetlić tutaj:

eval3

7. Infrastruktura jako kod (IaC): budowanie domu w chmurze

Nasz kod jest przetestowany, ale potrzebuje środowiska produkcyjnego. Do zdefiniowania środowiska użyjemy infrastruktury jako kodu.

deployprocess

Działania

cd ~/storygen-learning/04a_Manual_Deployment_Ready

Użyj interfejsu wiersza poleceń Gemini, aby utworzyć plik Dockerfile dla backendu: otwórz interfejs wiersza poleceń Gemini.

Gemini

W interfejsie wiersza poleceń Gemini wypróbuj prompt:

Create a manual deployment plan for my StoryGen app with Google Cloud Platform. I have a Next.js frontend, Python backend, and Terraform infrastructure.

Generate these deployment files:
1. **01-setup.sh** - Environment setup and authentication
2. **02-build-images.sh** - Build and push Docker images to Google Container Registry
3. **03-deploy-infrastructure.sh** - Deploy with Terraform and configure services
4. **load-env.sh** - Load environment variables for deployment

**Requirements:**
- Use Google Cloud Run for both frontend and backend
- Configure Imagen API and storage buckets
- Set up proper IAM permissions
- Use environment variables from .env file
- Include error handling and status checks

Keep scripts simple, well-commented, and production-ready for manual execution.

Rozwiązanie:

cd ~/storygen-learning/04b_Manual_Deployment_Done

Uruchomienie:

source ../.venv/bin/activate
./01-setup.sh
./02-build-images.sh
./03-deploy-infrastructure.sh

Powinny się wyświetlić wyniki wdrożenia i tworzenie infrastruktury

8. Automatyzacja (CI/CD): cyfrowa linia montażowa

Ręczne wdrażanie aplikacji jest powolne i ryzykowne. Poprośmy AI o napisanie kompletnego potoku CI/CD z użyciem GitHub Actions.

Działania

cd ~/storygen-learning/05a_CICD_Pipeline_Ready

Użyj interfejsu wiersza poleceń Gemini, aby utworzyć potok CI/CD za pomocą GitHub:

Otwieranie interfejsu wiersza poleceń Gemini

Gemini

W interfejsie wiersza poleceń Gemini wypróbuj prompt:

Create a CI/CD pipeline for my StoryGen app using Google Cloud Build and GitHub integration.

Generate these automation files:
1. **cloudbuild.yaml** (for backend) - Automated build, test, and deploy pipeline
2. **GitHub Actions workflow** - Trigger builds on push/PR
3. **Deployment automation scripts** - Streamlined deployment process

**Requirements:**
- Auto-trigger on GitHub push to main branch
- Build and push Docker images
- Run automated tests if available
- Deploy to Google Cloud Run
- Environment-specific deployments (staging/prod)
- Notification on success/failure

Focus on fully automated deployment with minimal manual intervention. Include proper secret management and rollback capabilities.

——————————————– Rozwiązanie zaczyna się tutaj ——————————————–

Rozwiązanie:

cd ~/storygen-learning/06_Final_Solution/
# Copy the GitHub workflow to parent folder
cp -r 06_Final_Solution/.github ../../../.github

Wróć do folderu 06_Final_Solution i uruchom skrypt:

cd ~/storygen-learning/06_Final_Solution/

./setup-cicd-complete.sh

Powinno się wyświetlić zakończenie konfiguracji potoku CI/CD

Uruchom przepływ pracy: zatwierdź i wypchnij kod do głównej gałęzi. Pamiętaj, że aby zezwolić na dostęp, musisz skonfigurować adres e-mail i nazwę w GitHubie.

git add .
git commit -m "feat: Add backend, IaC, and CI/CD workflow"
git push origin main

Aby zobaczyć działanie automatycznego wdrażania, otwórz kartę „Actions” (Działania) w repozytorium GitHub.

Kluczowy moment: cały potok CI/CD, czyli złożony i kluczowy element DevOps, może być generowany przez AI.

9. Operacje: wieża kontrolna AI

Jesteśmy na żywo! Ale to jeszcze nie koniec. To „Dzień 2” – operacje. Wróćmy do Cloud Assist, aby zarządzać uruchomioną aplikacją.

Działania

  1. W konsoli Google Cloud otwórz usługę Cloud Run. Korzystaj z aplikacji na żywo, aby wygenerować ruch i logi.
  2. Otwórz panel Cloud Assist i używaj go jako pomocnika operacyjnego, korzystając z takich promptów jak te:

Analiza logów:

Summarize the errors in my Cloud Run logs for the service 'genai-backend' from the last 15 minutes.

Dostrajanie wydajności:

My Cloud Run service 'genai-backend' has high startup latency. What are common causes for a Python app and how can I investigate with Cloud Trace?

Optymalizacja kosztów:

Analyze the costs for my 'genai-backend' service and its GCS bucket. Are there any opportunities to save money?

Kluczowy moment: cykl życia AI to ciągła pętla. Ten sam kopilot AI, który pomógł w tworzeniu aplikacji, jest niezastąpionym partnerem w zakresie monitorowania, rozwiązywania problemów i optymalizowania jej w środowisku produkcyjnym.