1. Giới thiệu
Trong lớp học lập trình này, bạn sẽ xây dựng một ứng dụng web bán lẻ có tích hợp Trợ lý mua sắm AI bằng Bộ công cụ phát triển tác nhân (ADK) của Google. Bạn sẽ sử dụng Google Antigravity IDE (IDE dựa trên tác nhân của Google) để thiết lập một quy trình phát triển dựa trên kiểm thử (TDD) an toàn.
Thay vì coi bảo mật là một cổng ở giai đoạn cuối, bạn sẽ học cách "chuyển bảo mật sang trái" đến thời điểm bắt đầu mã. Bạn sẽ thực thi các tiêu chuẩn phát triển, tự động hoá mô hình hoá mối đe doạ STRIDE và kiểm soát các hành động của tác nhân bằng các lệnh gọi trước khi xác nhận git và các lệnh gọi thực thi dành riêng cho tác nhân.
Bạn sẽ thực hiện
- Tạo khung và xây dựng tác nhân trợ lý mua sắm ADK 2.0 bằng IDE Antigravity và
agents-cli. - Thiết lập các tiêu chuẩn mã hoá bảo mật ở cấp dự án bằng cách sử dụng tệp ngữ cảnh liên tục (
CONTEXT.md). - Xây dựng và gọi một Kỹ năng mô hình hoá mối đe doạ STRIDE ở cấp không gian làm việc tuỳ chỉnh trong Antigravity IDE.
- Thực thi các biện pháp bảo vệ an toàn ngay trong Giai đoạn lập kế hoạch TDD.
- Viết các bài kiểm thử bảo mật dựa trên kết quả trong Pytest bằng Antigravity.
- Định cấu hình các lệnh gọi trước khi xác nhận Git để tự động hoá các lượt quét Semgrep bằng các vòng lặp khắc phục cục bộ trong Antigravity.
Bạn cần có
- Một trình duyệt web như Chrome
- Làm quen với Python, Pytest và các lệnh cơ bản trên thiết bị đầu cuối
- Đã cài đặt Google Antigravity IDE. Hãy xem trang web chính thức.
- Đã cài đặt trình quản lý gói uv. Xem hướng dẫn cài đặt uv.
- Đã cài đặt công cụ dòng lệnh Git. Git chỉ được dùng để quản lý phiên bản cục bộ trong lớp học này, nên bạn không cần có tài khoản GitHub. Xem hướng dẫn cài đặt Git.
Lớp học lập trình này dành cho nhà phát triển ở mọi cấp độ, kể cả người mới bắt đầu. Bạn sẽ mất khoảng 60 phút để hoàn thành toàn bộ bài thực hành này.
Thiết lập tính năng xác thực và môi trường
Cung cấp thông tin xác thực để nhân viên hỗ trợ gọi các mô hình Gemini. Lấy khoá Gemini API tiêu chuẩn từ Google AI Studio rồi xuất khoá đó trong phiên thiết bị đầu cuối IDE:
export GEMINI_API_KEY="your_api_key_here"
export GOOGLE_GENAI_USE_ENTERPRISE=FALSE
2. Thiết lập Workspace và Toolchain
Trước tiên, hãy khởi tạo không gian làm việc của dự án và cài đặt chuỗi công cụ quản lý tác nhân cơ bản. Để làm việc đó, chúng ta sẽ nhắc Antigravity IDE tự động hoá quy trình thiết lập.
👉 Câu lệnh cho 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`.
Những điểm cần biết: Antigravity sẽ thay mặt bạn thực hiện các lệnh cần thiết trên thiết bị đầu cuối, thiết lập một kho lưu trữ Git không có sự cố và cài đặt các kỹ năng ADK đi kèm vào IDE của bạn.
3. Tạo khung cho Dự án tác nhân ADK
Trong giai đoạn này, chúng ta hướng dẫn Antigravity sử dụng agents-cli để tạo khung cho một dự án tác nhân ADK 2.0 có đầy đủ chức năng, được gọi là shopping-assistant. Chúng tôi sẽ yêu cầu Antigravity thiết kế một trợ lý bán lẻ có công cụ đổi chiết khấu.
Lưu ý: Để cho thấy sức mạnh của các lệnh gọi chặn tự động, trong lời nhắc này, chúng tôi hướng dẫn rõ ràng Antigravity đưa vào một lỗ hổng bảo mật mô phỏng: khoá API mô phỏng được mã hoá cứng dùng cho quá trình phát triển cục bộ.
👉 Câu lệnh cho 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"`.
Những điều cần biết: Antigravity sẽ thực thi agents-cli scaffold create shopping-assistant --adk, định cấu hình pyproject.toml và triển khai logic của tác nhân.
4. Khám phá mã tác nhân
👉 Yêu cầu Antigravity giải thích đoạn mã được tạo:
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.
Trong Antigravity IDE, các tệp dự án mới tạo sẽ xuất hiện ngay trong ngăn phụ (bên trái). Bạn có thể xem shopping-assistant/app/agent.py ở đó hoặc mở tệp này trong trình khám phá tệp 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
)
Phương pháp hay nhất về sản xuất: Tính đồng thời và điều kiện xung đột
Trong logic công cụ, chúng ta sẽ kiểm tra một từ điển trong bộ nhớ (DISCOUNT_STORE) và sửa đổi trạng thái của từ điển đó. Trong môi trường sản xuất đa luồng có cơ sở dữ liệu thực, cả hai yêu cầu đồng thời đều có thể đọc mã là chưa được sử dụng trước khi một trong hai yêu cầu ghi được thực hiện, gây ra lỗ hổng sử dụng hai lần. Trong quá trình sản xuất, hãy luôn sử dụng cơ chế khoá bi quan (ví dụ: .with_for_update()) hoặc lập phiên bản lạc quan để đảm bảo cô lập giao dịch.
Lint Biểu đồ tác nhân ban đầu
Để xác minh rằng biểu đồ tác nhân mới được giàn giáo của chúng ta biên dịch chính xác, chúng ta có thể nhắc Antigravity chạy trình kiểm tra cú pháp và kiểm thử tác nhân thay cho chúng ta.
👉 Câu lệnh cho Antigravity:
Run `agents-cli lint` on our `shopping-assistant` project to verify syntax and
refactor if any issues.
Điều gì sẽ xảy ra: Antigravity sẽ thực thi agents-cli lint và agents-cli lint --fix để khắc phục mọi vấn đề về định dạng hoặc lint được phát hiện.
5. Tạo quy tắc dành riêng cho dự án
Để tránh làm quá tải bộ nhớ đang hoạt động của trợ lý ảo với hàng nghìn trang tài liệu bảo mật chung (gây ra tình trạng suy giảm ngữ cảnh và độ trễ suy luận), bạn phải thiết lập một "con đường trải nhựa" gồm các quy ước bảo mật được phê duyệt trước. Trong Antigravity IDE, bạn có thể thiết lập các rào cản này bằng cách tạo một tệp ngữ cảnh liên tục.
👉 Câu lệnh cho 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.
Điều gì sẽ xảy ra: Antigravity sẽ tạo thư mục .agents/ và tệp CONTEXT.md, đồng thời hiển thị tệp đó ngay trong ngăn phụ để bạn xem xét.
6. Định cấu hình các hook kiểm soát cục bộ
Để ngăn mã hoặc khoá bí mật không an toàn rời khỏi máy trạm của bạn, hãy định cấu hình các cổng tự động ở ranh giới của môi trường phát triển trước khi xác nhận mã. Chúng ta sẽ nhắc Antigravity tạo cấu hình hook, sau đó cài đặt các cấu hình đó bằng thiết bị đầu cuối.
1. Git Pre-Commit Hook
Để đảm bảo quy trình phân tích tĩnh của chúng tôi phát hiện đáng tin cậy các thông tin đăng nhập mô phỏng và chặn các cam kết không an toàn, chúng tôi sẽ xác định một quy tắc Semgrep tuỳ chỉnh và định cấu hình một lệnh gọi trước khi cam kết Git để thực thi quy tắc đó.
Xác định quy tắc Semgrep tuỳ chỉnh
Các quy tắc Semgrep mặc định (--config auto) không gắn cờ các khoá mô phỏng có chứa những từ như "mock" hoặc dấu gạch ngang do điểm số có độ tin cậy thấp. Để phát hiện một cách đáng tin cậy khoá API được mã hoá cứng, chúng ta sẽ tạo một tệp quy tắc cục bộ tuỳ chỉnh bằng cách sử dụng tính năng quét biểu thức chính quy trực tiếp thay vì các quy tắc chung.
👉 Câu lệnh cho 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.
Điều cần lưu ý: Antigravity sẽ tạo shopping-assistant/.semgrep/rules.yaml để xác định quy tắc quét tuỳ chỉnh của chúng ta. Xem lại định nghĩa quy tắc đã tạo:
# 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
Định cấu hình Hook trước khi xác nhận
Tiếp theo, hãy định cấu hình hook tiền cam kết Git để chạy quy tắc Semgrep tuỳ chỉnh của chúng ta. Khi thực thi các lệnh gọi trong bố cục thư mục con, đường dẫn đến các cấu hình cục bộ phải tương ứng với thư mục gốc của kho lưu trữ Git (shopping-assistant/.semgrep/rules.yaml), chứ không phải thư mục con của dự án.
👉 Câu lệnh cho 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.
Những điều bạn cần biết: Antigravity sẽ tạo shopping-assistant/.pre-commit-config.yaml và thực thi pre-commit install thay cho bạn. Xem lại cấu hình đã tạo:
# 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]
Cấu hình này đảm bảo rằng ngay cả khi một tác nhân đang chạy ở chế độ hoàn toàn tự động, không tương tác, cổng tiền cam kết sẽ kích hoạt và chặn mọi cam kết không vượt qua được các lần quét phân tích tĩnh.
Lệnh thực thi trực tiếp (Để xác minh thủ công)
Để xác minh chế độ thiết lập phân tích tĩnh theo cách thủ công mà không cần kích hoạt một chu trình hook cam kết đầy đủ, bạn có thể thực thi các bước kiểm tra này ngay từ thiết bị đầu cuối.
Thông qua giai đoạn trước khi xác nhận (từ thư mục "shopping-assistant"):
uv run pre-commit run semgrep --all-files
Thông qua Semgrep (từ thư mục "shopping-assistant"):
uv run semgrep --error --config .semgrep/rules.yaml app/agent.py
2. Hook tác nhân Antigravity tích hợp sẵn
Để có cổng sâu hơn, giữa quỹ đạo, hãy định cấu hình một lệnh gọi tác nhân trong shopping-assistant/.agents/hooks.json. Không giống như git hook, agent hook chặn Antigravity trước khi nó có thể chạy các công cụ quan trọng (chẳng hạn như thực thi các lệnh shell) trên hệ thống của bạn.
👉 Câu lệnh cho 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.
Những điều cần biết: Antigravity sẽ tạo shopping-assistant/.agents/hooks.json. Xem lại cấu hình đã tạo:
{
"enabled": true,
"PreToolUse": [
{
"matcher": "run_command",
"command": "python3 .agents/scripts/validate_tool_call.py",
"timeout": 10
}
]
}
Tiếp theo, hãy nhắc Antigravity tạo tập lệnh xác thực công cụ cơ bản mà hook của chúng ta tham chiếu.
👉 Câu lệnh cho 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 /`.
Điều gì sẽ xảy ra: Antigravity sẽ tạo ra shopping-assistant/.agents/scripts/validate_tool_call.py, tương tự như hình bên dưới. Xem lại tập lệnh xác thực đã tạo:
# 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()
Lựa chọn đánh đổi về khoảnh khắc níu chân
- Git Hooks: Nguyên bản đối với hệ thống quản lý phiên bản; chạy ngay cả khi một tác nhân chạy ở chế độ hoàn toàn tự động, không tương tác. Tuy nhiên, bạn có thể bỏ qua các quy tắc này bằng cách sử dụng cờ
--no-verifytrong quá trình xác nhận. - Agent Hooks: Ghi lại các sự kiện trong quá trình thực hiện để chặn các lệnh công cụ nguy hiểm, nhưng chúng không bảo vệ kho lưu trữ nếu nhà phát triển bỏ qua IDE.
Các cổng cục bộ củng cố thói quen tốt của nhà phát triển và giúp phát hiện các lỗ hổng ngay lập tức. Tuy nhiên, hãy nhớ rằng các cổng cục bộ có thể bị bỏ qua, nghĩa là quy trình CI/CD từ xa, biệt lập vẫn là rào cản bảo mật tối thượng và không thể bỏ qua của bạn.
7. Triển khai kỹ năng Mô hình hoá mối đe doạ theo phương pháp STRIDE
Giờ đây, bạn sẽ cấp cho Antigravity kiến thức chuyên môn của một kiến trúc sư bảo mật. Các kỹ năng Antigravity là những thư mục Markdown khai báo, theo mô-đun, hướng dẫn cho tác nhân cách chạy các công việc suy luận đa bước. Antigravity tự động phát hiện mọi kỹ năng được đặt trong .agents/skills/.
👉 Câu lệnh cho 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.
Điều gì sẽ xảy ra: Antigravity sẽ tạo thư mục kỹ năng tuỳ chỉnh và tệp SKILL.md.
Bây giờ, hãy thực thi kỹ năng bạn vừa tạo để đánh giá biểu đồ dự án đang hoạt động (shopping-assistant/app/agent.py).
👉 Câu lệnh cho Antigravity:
Run stride-threat-model on our shopping-assistant agent graph.
Điều gì sẽ xảy ra: Antigravity sẽ khớp với ý định của bạn, tải hướng dẫn đánh giá mối đe doạ theo yêu cầu từ thư mục kỹ năng cục bộ, phân tích tệp agent.py hiện có và tạo threat_model.md có cấu trúc ngay trong thư mục gốc shopping-assistant. Phương pháp này giúp ngữ cảnh làm việc hằng ngày của bạn luôn gọn gàng và đơn giản, đồng thời cho phép bạn truy cập ngay vào lý do bảo mật của chuyên gia.
8. Giai đoạn lập kế hoạch TDD
Trước khi triển khai các tính năng khác hoặc cải tiến mã, Antigravity sẽ sử dụng kiến thức về toàn bộ mã nguồn ngữ nghĩa để lập bản đồ các thay đổi trong danh sách kiểm tra implementation_plan.md và task.md. Để buộc Antigravity thiết kế trước cho bảo mật, chúng ta sẽ định cấu hình một quy tắc hệ thống trong .agents/CONTEXT.md để hạn chế việc phê duyệt kế hoạch.
👉 Câu lệnh cho 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.
Điều gì sẽ xảy ra: Antigravity sẽ cập nhật shopping-assistant/.agents/CONTEXT.md bằng quy tắc mới về cổng lập kế hoạch.
Khi bạn nhắc Antigravity tạo hoặc tái cấu trúc một tính năng trong các bước tiếp theo, công cụ này sẽ tự động phân tích quy tắc này và trình bày một kế hoạch triển khai với thông tin chi tiết rõ ràng về bảo mật. Bạn sẽ có thể xem xét kế hoạch này ngay trong hộp thoại tương tác hoặc ngăn phụ trợ của Antigravity, nơi bạn phải nhấp vào Tiến hành hoặc Phê duyệt trước khi quá trình tạo mã bắt đầu.
Kiểm tra Cổng lập kế hoạch (Không bắt buộc)
Để quan sát cổng lập kế hoạch này đang hoạt động, hãy thử đưa ra một trong các yêu cầu về tính năng sau cho Antigravity. Thay vì tạo mã ngay lập tức, Antigravity sẽ chuyển sang giai đoạn Lập kế hoạch và trình bày một implementation_plan.md có Phân tích chi tiết về Ranh giới và khẳng định bảo mật (ví dụ: xác định các điều kiện xung đột, hành vi leo thang đặc quyền trái phép hoặc giá trị điểm âm) để bạn xem xét!
👉 Lời nhắc cho Antigravity (Chọn một lời nhắc để kiểm thử):
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. Viết các bài kiểm thử riêng biệt dựa trên kết quả
Giờ đây, chúng tôi hướng dẫn Antigravity viết các bài kiểm thử bảo mật toàn diện cho các công cụ tác nhân ADK hiện có của chúng tôi. Để đảm bảo các kiểm thử bảo mật của chúng tôi có khả năng phục hồi và tính thực tế, chúng tôi xây dựng các kiểm thử này dựa trên 2 nguyên tắc cốt lõi:
- Xác nhận về kết quả, không phải lượt tương tác: Xác nhận về các chuỗi trả về cuối cùng và các đột biến trạng thái thay vì viết các mô phỏng dễ bị lỗi theo dõi các lệnh gọi trợ giúp nội bộ.
- Thực thi các biện pháp bảo vệ nghiêm ngặt: Xác minh rằng các công cụ thực thi ranh giới logic kinh doanh rõ ràng (chẳng hạn như quy tắc sử dụng một lần và quy tắc người dùng đã đăng ký).
👉 Câu lệnh cho 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.
Điều gì sẽ xảy ra: Antigravity sẽ tạo ra shopping-assistant/tests/test_agent.py, tương tự như hình bên dưới. Xem lại tệp kiểm thử đã tạo:
# 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
Xác minh Giai đoạn XANH TDD
Để xác minh rằng các kiểm thử bảo mật mới được tạo của chúng tôi đã vượt qua thành công quy trình triển khai agent.py hiện có, hãy nhắc Antigravity thực thi pytest thay cho bạn.
👉 Câu lệnh cho Antigravity:
Run `uv run pytest tests/test_agent.py` on our `shopping-assistant` project to verify that our security tests pass successfully.
Điều gì sẽ xảy ra: Antigravity sẽ thực thi uv run pytest tests/test_agent.py trong thiết bị đầu cuối. Tất cả các trường hợp kiểm thử đều vượt qua thành công. Giờ đây, các ranh giới ứng dụng logic đã được bảo mật, nhưng chúng ta phải đảm bảo rằng trình quét tĩnh của mình sẽ phát hiện khoá API được mã hoá cứng trong quá trình xác nhận.
10. Xác minh tính năng sàng lọc và tự điều chỉnh của nhân viên hỗ trợ
Bây giờ, khi các kiểm thử đều có màu xanh lục, bạn sẽ chuyển sang Giai đoạn tái cấu trúc và cam kết. Đây là nơi các quy trình quét bảo mật cục bộ và các lệnh gọi trước khi xác nhận thay đổi của chúng tôi xác minh rằng không có kho lưu trữ nào rời khỏi máy trạm khi có lỗ hổng bảo mật, đồng thời Antigravity thể hiện khả năng tự sửa lỗi một cách tự động.
- Trong thiết bị đầu cuối, hãy chuyển đến thư mục dự án và xác nhận mã bằng cách sử dụng
uv runđể đảm bảo các tệp nhị phân hook cục bộ trước khi xác nhận đang hoạt động trên PATH:cd ~/secure-agent-lab/shopping-assistant git add . uv run git commit -m "feat: implement shopping assistant agent" - Lưu ý rằng lệnh cam kết không thành công vì Git pre-commit hook tự động chạy Semgrep:
Semgrep Security Scan....................................................Failed - hookid: semgrep app/agent.py Security Issue: Hardcoded Google API key prefix detected.
- Theo quy tắc Vòng lặp khắc phục trước khi xác nhận được định cấu hình trong
.agents/CONTEXT.md, Antigravity sẽ tự động chặn lỗi trước khi xác nhận trong thiết bị đầu cuối IDE, đọc nhật ký lỗi Semgrep và bắt đầu bước tái cấu trúc để chuyển từ khoá API được mã hoá cứng sang truy xuất khoá một cách an toàn. - Xem xét mã được tái cấu trúc do Antigravity tạo trong
shopping-assistant/app/agent.pyđể giải quyết vấn đề rò rỉ khoá API. - Antigravity tự động chạy
pytestđể xác minh rằng các kiểm thử vẫn hoạt động bình thường. - Antigravity sẽ thay mặt bạn thử xác nhận lại. Miễn là bạn đã định cấu hình danh tính Git cục bộ và khởi tạo một kho lưu trữ, quá trình quét sẽ diễn ra và việc xác nhận sẽ thành công!
Điều này minh hoạ sức mạnh cốt lõi của việc kết hợp TDD với các lệnh gọi trước khi xác nhận cục bộ và các vòng lặp tác nhân. Thay vì chờ lỗi CI/CD từ xa, tác nhân sẽ chịu trách nhiệm tại chỗ, tái cấu trúc mã để đảm bảo an toàn theo mặc định trước khi được đẩy.
11. Chạy và kiểm thử tác nhân cục bộ
Giờ đây, khi các ranh giới bảo mật đã được xác minh và cam kết, hãy chạy tác nhân ADK cục bộ bằng khoá Gemini API đã xuất để tương tác với tác nhân đó trong sân chơi cục bộ.
- Trong thiết bị đầu cuối, hãy đảm bảo Khoá Gemini API được xuất trong môi trường của bạn:
echo $GEMINI_API_KEY # Verify your key is exported - Khởi chạy sân chơi phát triển cục bộ cho tác nhân của bạn:
Bạn sẽ thấy đầu ra cho biết máy chủ mô phỏng cục bộ đang chạy trên cổng 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
- Mở URL được cung cấp trong trình duyệt web để bắt đầu trò chuyện tương tác với tác nhân Trợ lý mua sắm. Hãy thử yêu cầu Gemini sử dụng mã giảm giá:
Tác nhân sẽ xử lý yêu cầu của bạn bằng cách thực thi mô hình Gemini và cố gắng áp dụng chiết khấu.Can you redeem the discount code WELCOME50 for user user_123?
12. Dọn dẹp
Để dọn dẹp máy trạm và tránh để lại các tài nguyên hoặc khoá bí mật không mong muốn trong môi trường cục bộ, hãy làm theo các bước dọn dẹp này.
- Dừng máy chủ cục bộ: Nếu máy chủ Playground vẫn đang chạy, hãy dừng máy chủ này trong thiết bị đầu cuối bằng cách nhấn
Ctrl + C. - Xoá tệp dự án cục bộ: Xoá thư mục dự án cục bộ khỏi máy của bạn:
rm -rf ~/secure-agent-lab
13. Xin chúc mừng
Xin chúc mừng! Bạn đã thiết lập thành công một vòng đời phát triển an toàn, dựa trên thử nghiệm bằng cách sử dụng Google Antigravity IDE, xây dựng một tác nhân trợ lý mua sắm ADK 2.0 thuần tuý và xác minh tác nhân đó trên máy.
Kiến thức bạn học được
- Cách tạo khung và tích hợp tác nhân ADK 2.0 (ADK) bằng Antigravity IDE và
agents-cli. - Cách thiết lập các tiêu chuẩn mã hoá an toàn ở cấp dự án bằng
CONTEXT.md. - Cách tạo và chạy một Kỹ năng mô hình hoá mối đe doạ STRIDE tuỳ chỉnh trong Antigravity IDE.
- Cách kiểm soát giai đoạn lập kế hoạch của một tác nhân AI để thực thi các ranh giới bảo mật.
- Cách triển khai các bài kiểm thử bảo mật riêng biệt dựa trên kết quả bằng pytest.
- Cách chạy và kiểm thử ứng dụng dựa trên tác nhân cục bộ.
- Sự khác biệt và điểm đánh đổi giữa các lệnh gọi Git và lệnh gọi thực thi dành riêng cho tác nhân.
Các bước tiếp theo
- Khám phá Hướng dẫn tuỳ chỉnh Antigravity để biết các cấu hình nâng cao.
- Đọc thêm về Mô hình hoá mối đe doạ STRIDE.
- Triển khai các quy tắc Semgrep phù hợp với chính sách bảo mật của tổ chức bạn.
Nhận huy hiệu Tác nhân AI trong 5 ngày trên Kaggle 🎉
Bạn đã hoàn thành phòng thí nghiệm này trong khoá học 5-Day AI Agents: Intensive Vibe Coding Course with Google của Kaggle chưa? Nhận huy hiệu hoàn thành: