1. Wprowadzenie
W tym ćwiczeniu utworzysz aplikację internetową do sprzedaży detalicznej ze zintegrowanym asystentem zakupowym AI za pomocą pakietu Agent Development Kit (ADK) od Google. Aby utworzyć bezpieczny przepływ pracy programowania opartego na testach (TDD), użyjesz Google Antigravity IDE (środowiska IDE Google opartego na agentach).
Zamiast traktować zabezpieczenia jako etap końcowy, nauczysz się „przesuwać zabezpieczenia w lewo” aż do momentu powstania kodu. Będziesz egzekwować standardy programowania, automatyzować modelowanie zagrożeń STRIDE i ograniczać działania agenta za pomocą haków git pre-commit i haków wykonawczych specyficznych dla agenta.
Jakie zadania wykonasz
- Utwórz szkielet i zbuduj agenta asystenta zakupowego ADK 2.0 za pomocą środowiska IDE Antigravity i
agents-cli. - Skonfiguruj standardy bezpiecznego kodowania na poziomie projektu za pomocą trwałego pliku kontekstu (
CONTEXT.md). - Tworzenie i wywoływanie niestandardowego narzędzia do modelowania zagrożeń STRIDE na poziomie obszaru roboczego w środowisku IDE Antigravity.
- Bezpośrednio w fazie planowania TDD wymuszaj zabezpieczenia.
- Pisz testy bezpieczeństwa oparte na wynikach w Pytest przy użyciu Antigravity.
- Skonfiguruj w Antigravity haki przed zatwierdzeniem w Git, aby zautomatyzować skanowanie za pomocą Semgrepa z lokalnymi pętlami naprawczymi.
Czego potrzebujesz
- przeglądarka, np. Chrome;
- znajomość języka Python, Pytest i podstawowych poleceń terminala;
- Zainstalowane Google Antigravity IDE. Więcej informacji znajdziesz na oficjalnej stronie.
- Zainstalowany system zarządzania pakietami uv. Zapoznaj się z przewodnikiem instalacji UV.
- Zainstalowane narzędzie wiersza poleceń Git. W tym module Git jest używany wyłącznie do lokalnej kontroli wersji, więc konto GitHub nie jest wymagane. Zapoznaj się z przewodnikiem instalacji Git.
To ćwiczenie jest przeznaczone dla deweloperów na wszystkich poziomach zaawansowania, w tym dla początkujących. Wykonanie wszystkich zadań w laboratorium zajmie około 60 minut.
Konfigurowanie uwierzytelniania i środowiska
Podaj dane uwierzytelniające, aby agent mógł wywoływać modele Gemini. Uzyskaj standardowy klucz interfejsu Gemini API z Google AI Studio i wyeksportuj go w sesji terminala IDE:
export GEMINI_API_KEY="your_api_key_here"
export GOOGLE_GENAI_USE_ENTERPRISE=FALSE
2. Konfigurowanie Workspace i Toolchain
Najpierw zainicjuj obszar roboczy projektu i zainstaluj bazowy łańcuch narzędzi do zarządzania agentami. W tym celu poprosimy Antigravity IDE o zautomatyzowanie procesu konfiguracji.
👉 Prompt do Antigravity:
Help me set up my local project workspace. Please:
1. Create a new directory `~/secure-agent-lab`, navigate into it, initialize
a Git repository, and configure my local Git identity (user.name:
"Kaggle Student", user.email: "student@example.com").
2. Create and activate a Python virtual environment using `uv`.
3. Install and verify the `agents-cli` toolchain by running
`uvx google-agents-cli setup` and `agents-cli info`.
Czego możesz się spodziewać: Antigravity wykona w Twoim imieniu niezbędne polecenia terminala, utworzy czyste repozytorium Git i zainstaluje w Twoim środowisku IDE powiązane umiejętności ADK.
3. Utwórz szkielet projektu agenta ADK
W tej fazie instruujemy Antigravity, aby za pomocą agents-cli utworzył szkielet w pełni funkcjonalnego projektu agenta ADK 2.0 o nazwie shopping-assistant. Poprosimy firmę Antigravity o zaprojektowanie asystenta sprzedaży detalicznej z narzędziem do wykorzystywania rabatów.
Uwaga: aby pokazać możliwości automatycznych punktów kontrolnych, w tym promcie wyraźnie instruujemy Antigravity, aby uwzględnił symulowaną lukę w zabezpieczeniach: zakodowany na stałe klucz interfejsu API używany do lokalnego programowania.
👉 Prompt do Antigravity:
Use `agents-cli` to scaffold a new ADK 2.0 agent project called
`shopping-assistant`. The workflow should act as an AI shopping assistant
for a retail store. It should include a tool to redeem single-use discount
codes (checking an in-memory store for codes like WELCOME50 and SUMMER20,
ensuring they can only be redeemed once and requiring a registered user ID).
Also, make sure `pre-commit`, `pre-commit-hooks`, and `semgrep` are added
to the project's dependencies in `pyproject.toml` and installed. Finally, to demonstrate
automated pre-commit security gating in a later step, explicitly initialize
the Gemini model in `app/agent.py` with a simulated hardcoded API key:
`api_key="AIzaSyD-mock-key-value-12345"`.
Czego możesz się spodziewać: Antigravity wykona agents-cli scaffold create shopping-assistant --adk, skonfiguruje pyproject.toml i wdroży logikę agenta.
4. Poznaj kod agenta
👉 Poproś Antigravity o wyjaśnienie wygenerowanego kodu:
Read and explain the project structure of my new shopping-assistant agent.
Walk me through how `app/agent.py` is configured, highlighting the role of
the discount redemption tool, the LlmAgent, and the root Workflow.
W środowisku IDE Antigravity nowo utworzone pliki projektu są wyświetlane bezpośrednio w panelu pomocniczym (po lewej stronie). Możesz tam wyświetlić plik shopping-assistant/app/agent.py lub otworzyć go w eksploratorze plików IDE.
# shopping-assistant/app/agent.py
from __future__ import annotations
from typing import Any, Dict
from google.adk.agents.context import Context
from google.adk.apps.app import App
from google.adk.events.event import Event
from google.adk.workflow import Edge, Workflow
from google.adk.workflow.agents.llm_agent import LlmAgent
from google.adk.models.google_llm import Gemini
from google.adk.workflow.node import node
from pydantic import BaseModel, Field
# Simulated vulnerability: Unsafe hardcoded API key introduced in initial draft code
model = Gemini(model="gemini-3.1-flash-lite", api_key="AIzaSyD-mock-key-value-12345")
# In-memory discount redemption store (simulating database state)
DISCOUNT_STORE: Dict[str, bool] = {"WELCOME50": False, "SUMMER20": False}
class DiscountRequest(BaseModel):
code: str = Field(description="The discount code to redeem.")
user_id: str = Field(description="The ID of the user requesting redemption.")
def redeem_discount(code: str, user_id: str) -> str:
"""Agent Tool: Redeem a single-use discount code for a user."""
if code not in DISCOUNT_STORE:
return "Error: Invalid discount code."
if DISCOUNT_STORE[code]:
return "Error: Discount code has already been redeemed."
if not user_id or user_id.startswith("guest_"):
return "Error: Registered user account required to redeem discounts."
DISCOUNT_STORE[code] = True
return f"Success: Discount code {code} redeemed successfully for user {user_id}."
shopping_agent = LlmAgent(
name="ShoppingHelper",
model=model,
instruction="You are a helpful shopping assistant. Use your tools to redeem discount codes for users.",
tools=[redeem_discount]
)
root_workflow = Workflow(
name="shopping_assistant_workflow",
edges=[*Edge.chain('START', shopping_agent)]
)
app = App(
name="shopping_assistant",
root_agent=root_workflow
)
Sprawdzone metody produkcji: równoczesność i sytuacja wyścigu
W logice narzędzia sprawdzamy słownik w pamięci (DISCOUNT_STORE) i modyfikujemy jego stan. W wielowątkowym środowisku produkcyjnym z prawdziwą bazą danych 2 równoczesne żądania mogą odczytać kod jako niewykorzystany, zanim którekolwiek z nich zostanie zapisane, co spowoduje lukę w zabezpieczeniach umożliwiającą podwójne wykorzystanie. W środowisku produkcyjnym zawsze używaj blokowania pesymistycznego (np. .with_for_update()) lub optymistycznej obsługi wersji, aby zapewnić izolację transakcji.
Sprawdzanie poprawności początkowego wykresu agenta
Aby sprawdzić, czy nowo utworzony wykres agenta kompiluje się prawidłowo, możemy poprosić Antigravity o uruchomienie narzędzia do sprawdzania kodu i przetestowanie agenta w naszym imieniu.
👉 Prompt do Antigravity:
Run `agents-cli lint` on our `shopping-assistant` project to verify syntax and
refactor if any issues.
Czego się spodziewać: Antigravity wykona polecenia agents-cli lint i agents-cli lint --fix, aby rozwiązać wykryte problemy z formatowaniem lub lintowaniem.
5. Tworzenie reguł dotyczących konkretnego projektu
Aby zapobiec przeładowaniu aktywnej pamięci agenta tysiącami stron ogólnej dokumentacji dotyczącej bezpieczeństwa, co powoduje utratę kontekstu i opóźnienia w rozumowaniu, musisz ustalić „utwardzoną drogę” wstępnie zatwierdzonych bezpiecznych konwencji. W Antigravity IDE możesz ustanowić te zabezpieczenia, tworząc trwały plik kontekstu.
👉 Prompt do Antigravity:
Create a customization directory named `shopping-assistant/.agents` and
create a file `shopping-assistant/.agents/CONTEXT.md` defining our secure
coding standards:
# Local Project Context & Secure Coding Standards
## Core Paved Roads
We systematically address common vulnerability classes by guiding the agent
to use our pre-configured, secure-by-default helper patterns instead of
writing raw implementation logic from scratch.
1. **Tool Input Validation**: Every agent tool must validate incoming
parameters against strict Pydantic schemas rather than parsing raw
dictionaries or strings.
2. **No Shell Execution**: Never use `run_command` or raw shell execution
tools unless explicitly approved by `hooks.json`.
3. **Pre-Commit Remediation Loop**: If a git commit fails due to a pre-commit
hook error (such as a Semgrep scan finding), you MUST treat the violation
as a refactoring task, apply targeted fixes, run tests to verify no
regressions, and attempt to commit again.
Czego możesz się spodziewać: Antigravity utworzy katalog .agents/ i plik CONTEXT.md, wyświetlając go bezpośrednio w panelu pomocniczym do sprawdzenia.
6. Konfigurowanie lokalnych funkcji ograniczających dostęp
Aby zapobiec opuszczaniu stacji roboczej przez niezabezpieczony kod lub dane tajne, skonfiguruj automatyczne bramy na granicach środowiska programistycznego przed zatwierdzeniem kodu. Poprosimy Antigravity o wygenerowanie konfiguracji hooków, a następnie zainstalujemy je za pomocą terminala.
1. Git Pre-Commit Hook
Aby mieć pewność, że analiza statyczna niezawodnie wykrywa symulowane dane logowania i blokuje niebezpieczne zatwierdzenia, zdefiniujemy niestandardową regułę Semgrep i skonfigurujemy hak przed zatwierdzeniem w Git, aby ją egzekwować.
Definiowanie niestandardowej reguły Semgrep
Domyślne reguły Semgrep (--config auto) nie oznaczają kluczy testowych zawierających słowa takie jak "mock" lub łączniki ze względu na niski poziom ufności. Aby niezawodnie wykrywać zakodowany na stałe klucz interfejsu API, utworzymy niestandardowy lokalny plik reguł, który będzie korzystać z bezpośredniego skanowania wyrażeń regularnych zamiast reguł ogólnych.
👉 Prompt do Antigravity:
Create a custom Semgrep rules file `shopping-assistant/.semgrep/rules.yaml`
with a rule to detect hardcoded Google API key prefixes (matching regex
`AIzaSy[A-Za-z0-9_\-]*`). Configure it for Python files with an error severity
and a clear security warning message.
Czego możesz się spodziewać: Antigravity utworzy shopping-assistant/.semgrep/rules.yaml, w którym zdefiniuje naszą niestandardową regułę skanowania. Sprawdź wygenerowaną definicję reguły:
# shopping-assistant/.semgrep/rules.yaml
rules:
- id: detect-hardcoded-google-api-key
pattern-regex: 'AIzaSy[A-Za-z0-9_\-]*'
message: "Security Issue: Hardcoded Google API key prefix detected."
languages:
- python
severity: ERROR
Konfigurowanie haka przed zatwierdzeniem
Następnie skonfiguruj hooka Git pre-commit, aby uruchamiać naszą niestandardową regułę Semgrep. Podczas wykonywania hooków w układzie podkatalogu ścieżki do lokalnych konfiguracji muszą być względne wobec katalogu głównego repozytorium Git (shopping-assistant/.semgrep/rules.yaml), a nie podkatalogu projektu.
👉 Prompt do Antigravity:
Create a `shopping-assistant/.pre-commit-config.yaml` file configured to run
local pre-commit hooks (end-of-file-fixer, trailing-whitespace) and a local
Semgrep security scan on commit for Python files. Ensure Semgrep is configured
with the `--error` flag and references our custom rules file relative to the Git
repository root. Once created, run `pre-commit install` in the
terminal to activate the hooks.
Czego możesz się spodziewać: Antigravity wygeneruje shopping-assistant/.pre-commit-config.yaml i wykona pre-commit install w Twoim imieniu. Sprawdź wygenerowaną konfigurację:
# shopping-assistant/.pre-commit-config.yaml
repos:
- repo: local
hooks:
- id: end-of-file-fixer
name: End of File Fixer
entry: end-of-file-fixer
language: system
types: [file]
- id: trailing-whitespace
name: Trailing Whitespace
entry: trailing-whitespace-fixer
language: system
types: [file]
- id: semgrep
name: Semgrep Security Scan
entry: semgrep --error --config shopping-assistant/.semgrep/rules.yaml
language: system
types: [python]
Ta konfiguracja zapewnia, że nawet jeśli agent działa w w pełni autonomicznym, nieinteraktywnym trybie, brama przed zatwierdzeniem zostanie uruchomiona i zablokuje każde zatwierdzenie, które nie przejdzie skanowania analizy statycznej.
Polecenia bezpośredniego wykonywania (do weryfikacji ręcznej)
Aby ręcznie sprawdzić konfigurację analizy statycznej bez wywoływania pełnego cyklu haka zatwierdzania, możesz wykonać te testy bezpośrednio z terminala.
Przed zatwierdzeniem (z katalogu „shopping-assistant”):
uv run pre-commit run semgrep --all-files
Bezpośrednio za pomocą Semgrepa (z katalogu „shopping-assistant”):
uv run semgrep --error --config .semgrep/rules.yaml app/agent.py
2. Wbudowany punkt zaczepienia agenta Antigravity
Aby uzyskać bardziej szczegółowe ograniczenia w trakcie procesu, skonfiguruj punkt zaczepienia agenta w shopping-assistant/.agents/hooks.json. W odróżnieniu od git hooks agent hooks przechwytują Antigravity zanim będzie mógł uruchomić na Twoim systemie ważne narzędzia (np. polecenia powłoki).
👉 Prompt do Antigravity:
Create a `shopping-assistant/.agents/hooks.json` file configured with a
`PreToolUse` hook that intercepts `run_command` executions and runs
`python3 .agents/scripts/validate_tool_call.py` with a 10-second timeout.
Czego możesz się spodziewać: Antigravity utworzy shopping-assistant/.agents/hooks.json. Sprawdź wygenerowaną konfigurację:
{
"enabled": true,
"PreToolUse": [
{
"matcher": "run_command",
"command": "python3 .agents/scripts/validate_tool_call.py",
"timeout": 10
}
]
}
Następnie poproś Antigravity o utworzenie podstawowego skryptu weryfikacji narzędzia, do którego odwołuje się nasz hook.
👉 Prompt do Antigravity:
Create the script `shopping-assistant/.agents/scripts/validate_tool_call.py`
with logic to inspect `run_command` executions passed using stdin and block
destructive commands like `rm -rf /`.
Czego możesz się spodziewać: Antigravity wygeneruje shopping-assistant/.agents/scripts/validate_tool_call.py podobny do tego poniżej. Sprawdź wygenerowany skrypt weryfikacji:
# shopping-assistant/.agents/scripts/validate_tool_call.py
import sys
import json
def main():
try:
context = json.load(sys.stdin)
command = context.get("tool_args", {}).get("CommandLine", "")
if "rm -rf /" in command or "mkfs" in command:
print("BLOCKED: Destructive command detected.", file=sys.stderr)
sys.exit(1)
print("APPROVED: Command validation passed.")
sys.exit(0)
except Exception as e:
print(f"Validation error: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
Kompromisy dotyczące elementów przykuwających uwagę
- Haczyki Git: natywne dla kontroli wersji; działają nawet wtedy, gdy agent jest uruchomiony w w pełni autonomicznym, nieinteraktywnym trybie. Można je jednak pominąć, używając flagi
--no-verifypodczas zatwierdzania. - Haczyki klienta: przechwytują zdarzenia w trakcie ich wykonywania, aby blokować niebezpieczne polecenia narzędzi, ale nie chronią repozytorium, jeśli programista ominie IDE.
Lokalne bramki wzmacniają dobre nawyki deweloperów i pomagają natychmiast wykrywać luki w zabezpieczeniach. Pamiętaj jednak, że lokalne bramy można obejść, co oznacza, że zdalny, odizolowany potok CI/CD pozostaje ostateczną, nie do obejścia barierą bezpieczeństwa.
7. Wdrażanie umiejętności modelowania zagrożeń STRIDE
Teraz przyznasz Antigravity specjalistyczną wiedzę architekta ds. bezpieczeństwa. Umiejętności Antigravity to modułowe, deklaratywne katalogi Markdown, które instruują agenta, jak wykonywać wieloetapowe zadania związane z rozumowaniem. Antigravity automatycznie wykrywa wszystkie umiejętności umieszczone w .agents/skills/.
👉 Prompt do Antigravity:
Create a local skill directory
`shopping-assistant/.agents/skills/stride-threat-model/` and create a skill
definition file `shopping-assistant/.agents/skills/stride-threat-model/SKILL.md`
with the following content:
---
name: stride-threat-model
description: Performs a systematic STRIDE threat modeling assessment on the
current project's codebase and architecture. Use this when starting a new
implementation phase or reviewing existing components.
---
# STRIDE Threat Modeling Skill
## Goal
Guide the agent to analyze the workspace directory structure, configuration
files, and code files to produce a structured `threat_model.md` assessment.
## Instructions
1. **Analyze System Boundaries**: Map the entry points (tools, workflows,
prompts) and data storage layers.
2. **STRIDE Evaluation**: Evaluate the system against the six STRIDE pillars:
- **Spoofing**: Are caller identity boundaries verified before executing
sensitive tool logic?
- **Tampering**: Can users manipulate data flows, parameters, or underlying
state?
- **Repudiation**: Are critical transactions securely logged?
- **Information Disclosure**: Are we risking leakage of PII, internal tokens,
or raw stack traces?
- **Denial of Service**: Are there rate limits on expensive database or LLM
queries?
- **Elevation of Privilege**: Can an unauthenticated user bypass access
control to reach privileged tool actions?
3. **Output**: Generate a highly structured `threat_model.md` saved directly
into the workspace root.
Czego możesz się spodziewać: Antigravity utworzy niestandardowy katalog umiejętności i plik SKILL.md.
Teraz uruchom nowo utworzoną umiejętność, aby ocenić aktywny wykres projektu (shopping-assistant/app/agent.py).
👉 Prompt do Antigravity:
Run stride-threat-model on our shopping-assistant agent graph.
Czego możesz się spodziewać: Antigravity dopasowuje się do Twoich intencji, wczytuje na żądanie instrukcje oceny zagrożeń z lokalnego katalogu umiejętności, analizuje istniejący agent.py i generuje ustrukturyzowany threat_model.md bezpośrednio w shopping-assistant. Dzięki temu Twoje codzienne środowisko pracy pozostaje przejrzyste i lekkie, a Ty masz natychmiastowy dostęp do uzasadnień dotyczących bezpieczeństwa.
8. Zablokuj etap planu TDD
Przed wdrożeniem kolejnych funkcji lub refaktoryzacją kodu Antigravity wykorzystuje swoją wiedzę o semantyce bazy kodu, aby zaplanować zmiany na liście kontrolnej implementation_plan.md i task.md. Aby wymusić na Antigravity projektowanie z myślą o bezpieczeństwie od samego początku, konfigurujemy regułę systemową w .agents/CONTEXT.md, która ogranicza zatwierdzanie planów.
👉 Prompt do Antigravity:
Append the following TDD planning gate instruction to the bottom of
`shopping-assistant/.agents/CONTEXT.md`:
## TDD Planning Gate
During the Plan phase, you must decompose the workspace task into logical,
modular stages. Every implementation plan MUST include a dedicated
**Security Boundaries & Assertions** section outlining specific edge cases
that could exploit the feature.
Czego się spodziewać: firma Antigravity zaktualizuje shopping-assistant/.agents/CONTEXT.md o nową regułę bramki planowania.
Gdy w kolejnych krokach poprosisz Antigravity o utworzenie lub refaktoryzację funkcji, automatycznie przeanalizuje ona tę regułę i przedstawi plan wdrożenia z dokładnym podziałem na kwestie związane z bezpieczeństwem. Będziesz mieć możliwość sprawdzenia tego planu bezpośrednio w interaktywnym oknie dialogowym lub panelu pomocniczym Antigravity, w którym przed rozpoczęciem generowania kodu musisz kliknąć Dalej lub Zatwierdź.
Testowanie bramy planowania (opcjonalnie)
Aby zobaczyć, jak działa ten etap planowania, wypróbuj Antigravity, prosząc o jedną z tych funkcji. Zamiast od razu generować kod, Antigravity przejdzie do fazy Plan i wyświetli implementation_plan.md zawierający szczegółowe informacje o granicach i zapewnieniach bezpieczeństwa (np.identyfikujące wyścigi, nieautoryzowane podniesienie uprawnień lub ujemne wartości punktowe), które możesz sprawdzić.
👉 Prompt do Antigravity (wybierz jeden do przetestowania):
Plan a new agent tool `award_loyalty_points` that awards points to a user's
account after a successful purchase.
Plan a new agent tool `process_cart_checkout` that receives a cart ID and
discount code, applies the discount, and processes the order.
Plan a new agent tool `update_discount_status` that allows administrators to
activate or deactivate discount codes in the store.
9. Pisanie odizolowanych testów opartych na wynikach
Teraz pomagamy Antigravity w tworzeniu kompleksowych testów bezpieczeństwa dla naszych obecnych narzędzi agenta ADK. Aby nasze testy bezpieczeństwa były odporne i realistyczne, opieramy je na 2 głównych zasadach:
- Sprawdzaj wyniki, a nie interakcje: sprawdzaj końcowe ciągi zwracane i zmiany stanu zamiast pisać niestabilne makiety, które śledzą wewnętrzne wywołania pomocnicze.
- Wymuszanie ścisłych ograniczeń: sprawdź, czy narzędzia wymuszają wyraźne granice logiki biznesowej (np. zasady dotyczące jednorazowego wykorzystania i zarejestrowanych użytkowników).
👉 Prompt do Antigravity:
Use `agents-cli` and pytest to generate an outcome-based security test suite
in `shopping-assistant/tests/test_agent.py`. Inspect `app/agent.py` and
write tests to verify all security boundaries and business logic guardrails
for the `redeem_discount` tool.
Czego możesz się spodziewać: Antigravity wygeneruje shopping-assistant/tests/test_agent.py podobny do tego poniżej. Sprawdź wygenerowany plik testowy:
# shopping-assistant/tests/test_agent.py
import pytest
from app.agent import redeem_discount, DISCOUNT_STORE
@pytest.fixture(autouse=True)
def reset_store():
"""Ensure strict test isolation by resetting in-memory store state before each test run."""
DISCOUNT_STORE["WELCOME50"] = False
DISCOUNT_STORE["SUMMER20"] = False
yield
DISCOUNT_STORE["WELCOME50"] = False
DISCOUNT_STORE["SUMMER20"] = False
def test_discount_code_can_only_be_redeemed_once():
"""Verify a user cannot submit a request reusing a single-use code."""
# First redemption - should succeed
res_one = redeem_discount("WELCOME50", "user_123")
assert "Success" in res_one
assert DISCOUNT_STORE["WELCOME50"] is True
# Second redemption trying to reuse the same code
res_two = redeem_discount("WELCOME50", "user_456")
assert "Error: Discount code has already been redeemed" in res_two
def test_discount_redemption_rejects_invalid_code():
"""Verify that unknown discount codes are hard-blocked."""
res = redeem_discount("INVALID999", "user_123")
assert "Error: Invalid discount code" in res
def test_discount_redemption_rejects_guest_accounts():
"""Verify that unauthenticated guest accounts cannot redeem discounts."""
res = redeem_discount("SUMMER20", "guest_999")
assert "Error: Registered user account required" in res
assert DISCOUNT_STORE["SUMMER20"] is False
Weryfikacja fazy TDD GREEN
Aby sprawdzić, czy nowo wygenerowane testy bezpieczeństwa przechodzą pomyślnie w przypadku naszej obecnej implementacji agent.py, poproś Antigravity o wykonanie pytest w Twoim imieniu.
👉 Prompt do Antigravity:
Run `uv run pytest tests/test_agent.py` on our `shopping-assistant` project to verify that our security tests pass successfully.
Czego można się spodziewać: Antigravity wykona polecenie uv run pytest tests/test_agent.py w terminalu. Wszystkie przypadki testowe zostały zaliczone. Logiczne granice aplikacji są teraz bezpieczne, ale musimy się upewnić, że nasz skaner statyczny wykryje zakodowany na stałe klucz interfejsu API podczas zatwierdzania zmian.
10. Weryfikowanie bramkowania i samokorekty agenta
Gdy testy są już w porządku, przechodzisz do fazy refaktoryzacji i zatwierdzania. W tym momencie lokalne skanowanie zabezpieczeń i funkcje pre-commit sprawdzają, czy repozytorium nie opuszcza stacji roboczej z lukami w zabezpieczeniach, a Antigravity demonstruje swoje autonomiczne możliwości samokorekty.
- W terminalu przejdź do katalogu projektu i zatwierdź kod za pomocą polecenia
uv run, aby upewnić się, że lokalne pliki binarne haka pre-commit są aktywne w ścieżce PATH:cd ~/secure-agent-lab/shopping-assistant git add . uv run git commit -m "feat: implement shopping assistant agent" - Zauważ, że zatwierdzenie się nie powiodło, ponieważ hook przed zatwierdzeniem Git automatycznie uruchamia Semgrep:
Semgrep Security Scan....................................................Failed - hookid: semgrep app/agent.py Security Issue: Hardcoded Google API key prefix detected.
- Zgodnie z regułą Pre-Commit Remediation Loop skonfigurowaną w
.agents/CONTEXT.mdAntigravity automatycznie przechwytuje błąd przed zatwierdzeniem w terminalu IDE, odczytuje dzienniki błędów Semgrep i rozpoczyna refaktoryzację, aby przejść od zakodowanego na stałe klucza interfejsu API do bezpiecznego pobierania klucza. - Sprawdź przekształcony kod wygenerowany przez Antigravity w
shopping-assistant/app/agent.py, aby rozwiązać problem z wyciekiem klucza interfejsu API. - Antigravity automatycznie uruchamia
pytest, aby sprawdzić, czy testy nadal są pozytywne. - Antigravity ponownie próbuje zatwierdzić zmiany w Twoim imieniu. Jeśli lokalna tożsamość Git jest skonfigurowana, a repozytorium zainicjowane, skanowanie zakończy się powodzeniem, a zatwierdzenie zostanie wykonane.
Pokazuje to podstawową zaletę połączenia TDD z lokalnymi hookami przed zatwierdzeniem i pętlami agentów. Zamiast czekać na błąd zdalnego CI/CD, agent jest lokalnie odpowiedzialny za refaktoryzację kodu, aby był bezpieczny domyślnie, zanim zostanie wypchnięty.
11. Uruchamianie i testowanie agenta lokalnie
Po zweryfikowaniu i zatwierdzeniu granic bezpieczeństwa uruchom lokalnie agenta ADK, używając wyeksportowanego klucza interfejsu Gemini API, aby wchodzić z nim w interakcje na lokalnym placu zabaw.
- W terminalu sprawdź, czy klucz interfejsu Gemini API został wyeksportowany w środowisku:
echo $GEMINI_API_KEY # Verify your key is exported - Uruchom lokalne środowisko testowe agenta:
Powinny się wyświetlić dane wyjściowe wskazujące, że lokalny serwer testowy działa na porcie 8080:cd ~/secure-agent-lab/shopping-assistant agents-cli playground* Serving ADK Playground * Running on http://127.0.0.1:8080/dev-ui/?app=app
- Otwórz podany adres URL w przeglądarce, aby rozpocząć interaktywną rozmowę z agentem Asystenta zakupów. Spróbuj poprosić go o wykorzystanie kodu zniżkowego:
Agent przetworzy Twoją prośbę, korzystając z modelu Gemini, i spróbuje wykorzystać zniżkę.Can you redeem the discount code WELCOME50 for user user_123?
12. Czyszczenie danych
Aby wyczyścić stację roboczą i uniknąć pozostawienia niechcianych zasobów lub tajnych informacji w środowisku lokalnym, wykonaj te czynności.
- Zatrzymaj serwer lokalny: jeśli serwer Playground nadal działa, zatrzymaj go w terminalu, naciskając
Ctrl + C. - Usuń lokalne pliki projektu: usuń lokalny katalog projektu z komputera:
rm -rf ~/secure-agent-lab
13. Gratulacje
Gratulacje! Udało Ci się utworzyć bezpieczny cykl życia rozwoju oprogramowania oparty na testach za pomocą Google Antigravity IDE, zbudować czystego agenta asystenta zakupów ADK 2.0 i zweryfikować go lokalnie.
Czego się dowiedziałeś(-aś)
- Jak utworzyć szkielet agenta ADK 2.0 (ADK) i zintegrować go za pomocą środowiska IDE Antigravity i
agents-cli. - Jak skonfigurować standardy bezpiecznego kodowania na poziomie projektu za pomocą
CONTEXT.md. - Jak utworzyć i uruchomić niestandardową umiejętność modelowania zagrożeń STRIDE w środowisku IDE Antigravity.
- Jak ograniczyć dostęp do fazy planowania agenta AI, aby egzekwować granice bezpieczeństwa.
- Jak wdrażać odizolowane testy bezpieczeństwa oparte na wynikach za pomocą pytest.
- Jak uruchamiać i testować aplikację z agentem lokalnie.
- Różnice i kompromisy między hookami Git a hookami wykonywania specyficznymi dla agenta.
Dalsze kroki
- Więcej informacji o zaawansowanych konfiguracjach znajdziesz w przewodniku po dostosowywaniu Antigravity.
- Dowiedz się więcej o modelowaniu zagrożeń STRIDE.
- Wdrażaj reguły Semgrep dostosowane do zasad bezpieczeństwa obowiązujących w Twojej organizacji.
Zdobądź odznakę Kaggle 5-Day AI Agents 🎉
Czy ten moduł został ukończony w ramach 5-Day AI Agents: Intensive Vibe Coding Course with Google w Kaggle? Odbierz odznakę potwierdzającą ukończenie: