1. рдкрд░рд┐рдЪрдп

1. рдЪреБрдиреМрддреА
рдЖрдкрджрд╛ рдХреЗ рдмрд╛рдж рд░рд╛рд╣рдд рдкрд╣реБрдВрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдЧрд╣реЛрдВ рдкрд░ рдореМрдЬреВрдж рдкреАрдбрд╝рд┐рддреЛрдВ рдХреА рдЬрд╝рд░реВрд░рддреЛрдВ, рд╕рдВрд╕рд╛рдзрдиреЛрдВ, рдФрд░ рдЙрдирдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдореИрдиреЗрдЬ рдХрд░рдиреЗ рдФрд░ рдЦреЛрдЬрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ. рдЗрд╕ рд╡рд░реНрдХрд╢реЙрдк рдореЗрдВ, рдЖрдкрдХреЛ рдкреНрд░реЛрдбрдХреНрд╢рди рдПрдЖрдИ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕рд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛. рдЗрд╕рдореЗрдВ рдЗрди рдЪреАрдЬрд╝реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- ЁЯЧДя╕П рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛рдмреЗрд╕ (Spanner): рд╕рд░реНрд╡рд╛рдЗрд╡рд░, рдХреМрд╢рд▓, рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдмреАрдЪ рдЬрдЯрд┐рд▓ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рд╕реЗрд╡ рдХрд░рдирд╛
- ЁЯФН рдПрдЖрдИ рдХреА рдорджрдж рд╕реЗ рдЦреЛрдЬ: рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рд╕рд┐рдореИрдВрдЯрд┐рдХ рдФрд░ рдХреАрд╡рд░реНрдб рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ
- ЁЯУ╕ рдорд▓реНрдЯреАрдореЙрдбрд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ: рдЗрдореЗрдЬ, рдЯреЗрдХреНрд╕реНрдЯ, рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╕реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдирд╛
- ЁЯдЦ рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди: рдореБрд╢реНрдХрд┐рд▓ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП, рдЦрд╛рд╕ рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд╛рдо рдХрд░рдирд╛
- ЁЯза рд▓реЙрдиреНрдЧ-рдЯрд░реНрдо рдореЗрдореЛрд░реА: Vertex AI Memory Bank рдХреА рдорджрдж рд╕реЗ, рд▓реЛрдЧреЛрдВ рдХреА рджрд┐рд▓рдЪрд╕реНрдкреА рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдирд╛

2. рдЖрдкрдХреЛ рдХреНрдпрд╛ рдмрдирд╛рдирд╛ рд╣реИ
рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдиреЗрдЯрд╡рд░реНрдХ рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛рдмреЗрд╕, рдЬрд┐рд╕рдореЗрдВ рдпреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- ЁЯЧ║я╕П рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдХреЗ рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ 3D рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЧреНрд░рд╛рдлрд╝ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди
- ЁЯФН рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрдЯ рд╕рд░реНрдЪ (рдХреАрд╡рд░реНрдб, рд╕рд┐рдореИрдВрдЯрд┐рдХ, рдФрд░ рд╣рд╛рдЗрдмреНрд░рд┐рдб)
- ЁЯУ╕ рдорд▓реНрдЯреАрдореЙрдбрд▓ рдЕрдкрд▓реЛрдб рдкрд╛рдЗрдкрд▓рд╛рдЗрди (рдЗрдореЗрдЬ/рд╡реАрдбрд┐рдпреЛ рд╕реЗ рдЗрдХрд╛рдЗрдпрд╛рдВ рдирд┐рдХрд╛рд▓рдирд╛)
- ЁЯдЦ рдореБрд╢реНрдХрд┐рд▓ рдЯрд╛рд╕реНрдХ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо
- ЁЯза рдореЗрдореЛрд░реА рдмреИрдВрдХ рдЗрдВрдЯрд┐рдЧреНрд░реЗрд╢рди рдХреА рдорджрдж рд╕реЗ, рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХрд░реЗрдВ
3. рдореБрдЦреНрдп рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреА
рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ | рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреА | рдордХрд╕рдж |
рдбреЗрдЯрд╛рдмреЗрд╕ | Cloud Spanner Graph | рдиреЛрдб (рд╕рд░реНрд╡рд╛рдЗрд╡рд░, рд╕реНрдХрд┐рд▓) рдФрд░ рдПрдЬ (рд░рд┐рд╢реНрддреЗ) рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ |
рдПрдЖрдИ рдХреА рдорджрдж рд╕реЗ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ | Gemini + Embeddings | рд╕рд┐рдореИрдВрдЯрд┐рдХ рдЕрдВрдбрд░рд╕реНрдЯреИрдВрдбрд┐рдВрдЧ + рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рдХреЙрдиреНрдЯреЗрдВрдЯ рдХреА рдЦреЛрдЬ |
рдПрдЬреЗрдВрдЯ рдлрд╝реНрд░реЗрдорд╡рд░реНрдХ | ADK (рдПрдЬреЗрдВрдЯ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрд┐рдЯ) | рдПрдЖрдИ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ |
рдореЗрдореЛрд░реА | Vertex AI Memory Bank | рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реЗрд╡ рдХрд░рдирд╛ |
Frontend | React + Three.js | рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ 3D рдЧреНрд░рд╛рдлрд╝ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди |
2. рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ рддреИрдпрд╛рд░ рдХрд░рдирд╛ (рдЕрдЧрд░ рдЖрдкрдиреЗ рд╡рд░реНрдХрд╢реЙрдк рдореЗрдВ рд╣рд┐рд╕реНрд╕рд╛ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдВ)
рдкрд╣рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛: рдмрд┐рд▓рд┐рдВрдЧ рдЦрд╛рддрд╛ рдЪрд╛рд▓реВ рдХрд░рдирд╛
- рдкрд╛рдВрдЪ рдбреЙрд▓рд░ рдХреЗ рдХреНрд░реЗрдбрд┐рдЯ рдХреЗ рд╕рд╛рде рдмрд┐рд▓рд┐рдВрдЧ рдЦрд╛рддреЗ рдкрд░ рджрд╛рд╡рд╛ рдХрд░реЗрдВ. рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЬрд╝рд░реВрд░рдд рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдкрдбрд╝реЗрдЧреА. рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреЗ gmail рдЦрд╛рддреЗ рд╕реЗ рд╕рд╛рдЗрди рдЗрди рдХрд┐рдпрд╛ рд╣реЛ.
рджреВрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛: рдУрдкрди рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ
- ЁЯСЙ рд╕реАрдзреЗ Cloud Shell Editor рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
- ЁЯСЙ рдЕрдЧрд░ рдЖрдЬ рдХрд┐рд╕реА рднреА рд╕рдордп рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.

- ЁЯСЙ рдЕрдЧрд░ рдЯрд░реНрдорд┐рдирд▓ рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рдмрд╕реЗ рдиреАрдЪреЗ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЦреЛрд▓реЗрдВ:
- рджреЗрдЦреЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
- рдЯрд░реНрдорд┐рдирд▓
рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
- ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд▓реА рд╣реИ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрдорд╛рдВрдб рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:
gcloud auth list - ЁЯСЙЁЯТ╗ GitHub рд╕реЗ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдХреНрд▓реЛрди рдмрдирд╛рдПрдВ:
git clone https://github.com/google-americas/way-back-home.git
3. рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ рд╕реЗрдЯрдЕрдк рдХрд░рдирд╛
1. рд╢реБрд░реВ рдХрд░реЗрдВ
рдЕрдЧрд░ Cloud Shell Editor рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, рд╕реНрдХреНрд░реАрди рдХреЗ рд╕рдмрд╕реЗ рдиреАрдЪреЗ рдЯрд░реНрдорд┐рдирд▓ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЦреЛрд▓реЗрдВ:
- рджреЗрдЦреЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
- рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, init рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯреЗрдмрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдЪрд▓рд╛рдПрдВ:
cd ~/way-back-home/level_2
./init.sh
2. рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
ЁЯСЙЁЯТ╗ рдЕрдкрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рд╕реЗрдЯ рдХрд░реЗрдВ:
gcloud config set project $(cat ~/project_id.txt) --quiet
ЁЯСЙЁЯТ╗ рдЬрд╝рд░реВрд░реА рдПрдкреАрдЖрдИ рдЪрд╛рд▓реВ рдХрд░реЗрдВ. рдЗрд╕рдореЗрдВ рдХрд░реАрдм рджреЛ рд╕реЗ рддреАрди рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВ:
gcloud services enable compute.googleapis.com \
aiplatform.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
spanner.googleapis.com \
storage.googleapis.com
3. рд╕реЗрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдирд╛
ЁЯСЙЁЯТ╗ рд╕реЗрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
cd ~/way-back-home/level_2
./setup.sh
рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП .env рдмрди рдЬрд╛рдПрдЧрд╛. рдЕрдкрдиреЗ Cloud Shell рдореЗрдВ, way_back_homeproject рдЦреЛрд▓реЗрдВ. level_2 рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдЖрдкрдХреЛ .env рдлрд╝рд╛рдЗрд▓ рджрд┐рдЦреЗрдЧреА. рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП View -> Toggle Hidden File рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. 
4. рд╕реИрдВрдкрд▓ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░реЗрдВ
ЁЯСЙЁЯТ╗ рдмреИрдХрдПрдВрдб рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ:
cd ~/way-back-home/level_2/backend
uv sync
ЁЯСЙЁЯТ╗ рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдХрд╛ рд╢реБрд░реБрдЖрддреА рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░реЗрдВ:
uv run python ~/way-back-home/level_2/backend/setup_data.py
рдЗрд╕рд╕реЗ рдпреЗ рдЬрдирд░реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ:
- Spanner рдЗрдВрд╕реНрдЯреЗрдВрд╕ (
survivor-network) - рдбреЗрдЯрд╛рдмреЗрд╕ (
graph-db) - рд╕рднреА рдиреЛрдб рдФрд░ рдПрдЬ рдЯреЗрдмрд▓
- рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдкрд░реНрдЯреА рдЧреНрд░рд╛рдлрд╝ рдЕрдиреБрдорд╛рдирд┐рдд рдЖрдЙрдЯрдкреБрдЯ:
============================================================
SUCCESS! Database setup complete.
============================================================
Instance: survivor-network
Database: graph-db
Graph: SurvivorGraph
Access your database at:
https://console.cloud.google.com/spanner/instances/survivor-network/databases/graph-db?project=waybackhome
рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ Access your database at рдХреЗ рдмрд╛рдж рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, Google Cloud Console Spanner рдЦреЛрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ Google Cloud Console рдореЗрдВ Spanner рджрд┐рдЦреЗрдЧрд╛!

4. Spanner Studio рдореЗрдВ рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛ рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛
рдЗрд╕ рдЧрд╛рдЗрдб рдХреА рдорджрдж рд╕реЗ, Spanner Studio рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, Google Cloud Console рдореЗрдВ рд╕реАрдзреЗ рддреМрд░ рдкрд░ рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛ рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдпрд╣ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдФрд░ рдПрдЖрдИ рдПрдЬреЗрдВрдЯ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рд╕рдордЭрдиреЗ рдХрд╛ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИ.
1. Spanner Studio рдХреЛ рдРрдХреНрд╕реЗрд╕ рдХрд░рдирд╛
- рдЖрдЦрд┐рд░реА рдЪрд░рдг рдореЗрдВ, рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ Spanner Studio рдЦреЛрд▓рд╛ рд╣реЛ.

2. рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рд╕рдордЭрдирд╛ ("рдмрдбрд╝реА рддрд╕реНрд╡реАрд░")
Survivor Network рдХреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рд▓реЙрдЬрд┐рдХ рдкрдЬрд╝рд▓ рдпрд╛ рдЧреЗрдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рддреМрд░ рдкрд░ рд╕рдордЭреЗрдВ:
рдЗрдХрд╛рдИ | рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рднреВрдорд┐рдХрд╛ | рдЙрдкрдорд╛ |
Survivors | рдПрдЬреЗрдВрдЯ/рдЦрд┐рд▓рд╛рдбрд╝реА | рдЦрд┐рд▓рд╛рдбрд╝реА |
рдмрд╛рдпреЛрдо | рд╡реЗ рдХрд╣рд╛рдВ рдореМрдЬреВрдж рд╣реИрдВ | рдореИрдк рдЬрд╝реЛрди |
рд╕реНрдХрд┐рд▓ | рд╡реЗ рдХреНрдпрд╛-рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ | рдХреНрд╖рдорддрд╛рдПрдВ |
рдЬрд╝рд░реВрд░реА рд╣реИ | рдЙрдирдореЗрдВ рдХреНрдпрд╛ рдХрдореА рд╣реИ (рд╕рдВрдХрдЯ) | рдХреНрд╡реЗрд╕реНрдЯ/рдорд┐рд╢рди |
рд╕рдВрд╕рд╛рдзрди | рджреБрдирд┐рдпрд╛ рднрд░ рдореЗрдВ рдорд┐рд▓реЗ рдЖрдЗрдЯрдо | рд▓реВрдЯ |
рд▓рдХреНрд╖реНрдп: рдПрдЖрдИ рдПрдЬреЗрдВрдЯ рдХрд╛ рдХрд╛рдо, рдмрд╛рдпреЛрдо (рдЬрдЧрд╣ рдХреА рдкрд╛рдмрдВрджрд┐рдпрд╛рдВ) рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЬрд╝рд░реВрд░рддреЛрдВ (рд╕рдорд╕реНрдпрд╛рдУрдВ) рдХреЛ рд╕реНрдХрд┐рд▓ (рд╕рдорд╛рдзрд╛рди) рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реИ.
ЁЯФЧ рдПрдЬ (рд╕рдВрдмрдВрдз):
SurvivorInBiome: рдЬрдЧрд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЯреНрд░реИрдХ рдХрд░рдирд╛SurvivorHasSkill: рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдЗрдиреНрд╡реЗрдВрдЯреНрд░реАSurvivorHasNeed: рдЪрд╛рд▓реВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рд╕реВрдЪреАSurvivorFoundResource: рдЖрдЗрдЯрдо рдХреА рдЗрдиреНрд╡реЗрдВрдЯреНрд░реАSurvivorCanHelp: рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдВрдмрдВрдз (рдПрдЖрдИ рдЗрд╕рдХрд╛ рд╣рд┐рд╕рд╛рдм рд▓рдЧрд╛рддрд╛ рд╣реИ!)
3. рдЧреНрд░рд╛рдлрд╝ рд╕реЗ рдХреНрд╡реЗрд░реА рдХрд░рдирд╛
рдЖрдЗрдП, рдХреБрдЫ рдХреНрд╡реЗрд░реА рдЪрд▓рд╛рдХрд░ рдбреЗрдЯрд╛ рдореЗрдВ "рд╕реНрдЯреЛрд░реА" рджреЗрдЦрддреЗ рд╣реИрдВ.
Spanner Graph, GQL (рдЧреНрд░рд╛рдлрд╝ рдХреНрд╡реЗрд░реА рд▓реИрдВрдЧреНрд╡реЗрдЬ) рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ. рдХреНрд╡реЗрд░реА рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, GRAPH SurvivorNetwork рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдореИрдЪ рдкреИрдЯрд░реНрди рдбрд╛рд▓реЗрдВ.
ЁЯСЙ рдкрд╣рд▓реА рдХреНрд╡реЗрд░реА: рдЧреНрд▓реЛрдмрд▓ рд░реЛрд╕реНрдЯрд░ (рдХреМрди рдХрд╣рд╛рдВ рд╣реИ?) рдпрд╣ рдЖрдкрдХреА рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ. рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдордЭрдирд╛ рдЬрд╝рд░реВрд░реА рд╣реИ.
GRAPH SurvivorNetwork
MATCH result = (s:Survivors)-[:SurvivorInBiome]->(b:Biomes)
RETURN TO_JSON(result) AS json_result
рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдирддреАрдЬрд╛ рджрд┐рдЦреЗрдЧрд╛: 
ЁЯСЙ рджреВрд╕рд░реА рдХреНрд╡реЗрд░реА: рд╕реНрдХрд┐рд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ (рдХреНрд╖рдорддрд╛рдПрдВ) рдЕрдм рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рд░ рд╡реНрдпрдХреНрддрд┐ рдХрд╣рд╛рдВ рд╣реИ. рдЕрдм рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ.
GRAPH SurvivorNetwork
MATCH result = (s:Survivors)-[h:SurvivorHasSkill]->(k:Skills)
RETURN TO_JSON(result) AS json_result
рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдирддреАрдЬрд╛ рджрд┐рдЦреЗрдЧрд╛: 
ЁЯСЙ рддреАрд╕рд░реА рдХреНрд╡реЗрд░реА: рд╕рдВрдХрдЯ рдореЗрдВ рдХреМрди рд╣реИ? (The "Mission Board") рджреЗрдЦреЗрдВ рдХрд┐ рдХрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдорджрдж рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕ рддрд░рд╣ рдХреА рдорджрдж рдЪрд╛рд╣рд┐рдП.
GRAPH SurvivorNetwork
MATCH result = (s:Survivors)-[h:SurvivorHasNeed]->(n:Needs)
RETURN TO_JSON(result) AS json_result
рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдирддреАрдЬрд╛ рджрд┐рдЦреЗрдЧрд╛: 
ЁЯФО рдРрдбрд╡рд╛рдВрд╕: рдореИрдЪрдореЗрдХрд┐рдВрдЧ - рдХреМрди рдХрд┐рд╕рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
рдЧреНрд░рд╛рдлрд╝ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рд╕реЗ, рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рдХрд╛рдлрд╝реА рдлрд╝рд╛рдпрджрд╛ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ! рдЗрд╕ рдХреНрд╡реЗрд░реА рд╕реЗ, рдРрд╕реЗ рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдРрд╕реА рд╕реНрдХрд┐рд▓ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рд╡реЗ рджреВрд╕рд░реЗ рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдХреА рдЬрд╝рд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ.
GRAPH SurvivorNetwork
MATCH result = (helper:Survivors)-[:SurvivorHasSkill]->(skill:Skills)-[:SkillTreatsNeed]->(need:Needs)<-[:SurvivorHasNeed]-(helpee:Survivors)
RETURN TO_JSON(result) AS json_result
рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдирддреАрдЬрд╛ рджрд┐рдЦреЗрдЧрд╛: 
aside positive рдЗрд╕ рдХреНрд╡реЗрд░реА рд╕реЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
рд╕рд┐рд░реНрдлрд╝ "рдлрд╝рд░реНрд╕реНрдЯ рдПрдб рд╕реЗ рдЬрд▓рдиреЗ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ" (рдЬреЛ рд╕реНрдХреАрдорд╛ рд╕реЗ рд╕рд╛рдлрд╝ рддреМрд░ рдкрд░ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ) рджрд┐рдЦрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдХреНрд╡реЗрд░реА рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдвреВрдВрдврддреА рд╣реИ:
- рдбреЙрдХреНрдЯрд░ рдПрд▓реАрдирд╛ рдлрд╝реНрд░реЙрд╕реНрдЯ (рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдореЗрдбрд┐рдХрд▓ рдЯреНрд░реЗрдирд┐рдВрдЧ рд▓реА рд╣реИ) тЖТ рдЗрд▓рд╛рдЬ рдХрд░ рд╕рдХрддреА рд╣реИрдВ тЖТ рдХреИрдкреНрдЯрди Tanaka (рдЬрд┐рдиреНрд╣реЗрдВ рдЬрд▓рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ)
- рдбреЗрд╡рд┐рдб рдЪреЗрди (рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдХрд┐рддреНрд╕рд╛ рдХрд╛ рд╕рд╛рдорд╛рди рд╣реИ) тЖТ рдЗрд▓рд╛рдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реИ тЖТ рд▓реЗрдлрд╝реНрдЯрд┐рдиреЗрдВрдЯ рдкрд╛рд░реНрдХ (рдЬрд┐рд╕рдХреЗ рдЯрдЦрдиреЗ рдореЗрдВ рдореЛрдЪ рдЖрдИ рд╣реИ)
рдпрд╣ рддрд░реАрдХрд╛ рдХреНрдпреЛрдВ рдХрд╛рд░рдЧрд░ рд╣реИ:
рдПрдЖрдИ рдПрдЬреЗрдВрдЯ рдХреНрдпрд╛ рдХрд░реЗрдЧрд╛:
рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "рдЬрд▓реЗ рд╣реБрдП рдШрд╛рд╡реЛрдВ рдХрд╛ рдЗрд▓рд╛рдЬ рдХреМрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ?" рдкреВрдЫрддрд╛ рд╣реИ, рддреЛ рдПрдЬреЗрдВрдЯ:
- рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рдЧреНрд░рд╛рдлрд╝ рдХреНрд╡реЗрд░реА рдЪрд▓рд╛рдирд╛
- рдЬрд╡рд╛рдм: "рдбреЙрдХреНрдЯрд░ рдлрд╝реНрд░реЙрд╕реНрдЯ рдХреЗ рдкрд╛рд╕ рдореЗрдбрд┐рдХрд▓ рдЯреНрд░реЗрдирд┐рдВрдЧ рд╣реИ рдФрд░ рд╡реЗ рдХреИрдкреНрдЯрди Tanaka рдХреА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ"
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдЯреЗрдмрд▓ рдпрд╛ рд░рд┐рд▓реЗрд╢рдирд╢рд┐рдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ!
5. Spanner рдореЗрдВ рдПрдЖрдИ рдХреА рдорджрдж рд╕реЗ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдПрдореНрдмреЗрдбрд┐рдВрдЧ
1. рдПрдВрдмреЗрдбрд┐рдВрдЧ рдХреНрдпреЛрдВ рдЬрд╝рд░реВрд░реА рд╣реИрдВ? (рдХреЛрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд╣реАрдВ, рд╕рд┐рд░реНрдлрд╝ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП)
рд╕рд░реНрд╡рд╛рдЗрд╡рд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдордп рдмрд╣реБрдд рдЕрд╣рдо рд╣реЛрддрд╛ рд╣реИ. рдЬрдм рдХреЛрдИ рдкреАрдбрд╝рд┐рдд рд╡реНрдпрдХреНрддрд┐ I need someone who can treat burns рдпрд╛ Looking for a medic рдЬреИрд╕реА рдЖрдкрд╛рддрдХрд╛рд▓реАрди рд╕реНрдерд┐рддрд┐ рдХреА рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдореМрдЬреВрдж рдХреМрд╢рд▓ рдХреЗ рд╕рдЯреАрдХ рдирд╛рдо рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛.
рдЕрд╕рд▓ рд╕реНрдерд┐рддрд┐: рд╕рд░реНрд╡рд╛рдЗрд╡рд░: Captain Tanaka has burnsтАФwe need medical help NOW!
"рдбреЙрдХреНрдЯрд░" рдХреЗ рд▓рд┐рдП, рдХреАрд╡рд░реНрдб рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЦреЛрдЬ рдХрд░рдиреЗ рдкрд░ тЖТ 0 рдирддреАрдЬреЗ рдорд┐рд▓реЗ тЭМ
рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рд┐рдореИрдВрдЯрд┐рдХ рд╕рд░реНрдЪ тЖТ "рдореЗрдбрд┐рдХрд▓ рдЯреНрд░реЗрдирд┐рдВрдЧ" рдФрд░ "рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдХрд┐рддреНрд╕рд╛" рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ тЬЕ
рдПрдЬреЗрдВрдЯ рдХреЛ рдареАрдХ рдЗрд╕реА рддрд░рд╣ рдХреА рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрдЯ, рдЗрдВрд╕рд╛рдиреЛрдВ рдЬреИрд╕реА рдЦреЛрдЬ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ. рдпрд╣ рдЦреЛрдЬ, рд╕рд┐рд░реНрдлрд╝ рдХреАрд╡рд░реНрдб рдХреЛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрдВрдЯреЗрдВрдЯ рдХреЛ рднреА рд╕рдордЭрддреА рд╣реИ.
2. рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЙрдбрд▓ рдмрдирд╛рдирд╛

рдЕрдм рд╣рдо рдПрдХ рдРрд╕рд╛ рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ Google рдХреЗ text-embedding-004 рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ.
ЁЯСЙ Spanner Studio рдореЗрдВ, рдЗрд╕ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЛ рдЪрд▓рд╛рдПрдВ ($YOUR_PROJECT_ID рдХреА рдЬрдЧрд╣ рдЕрдкрдирд╛ рдЕрд╕рд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдбрд╛рд▓реЗрдВ):
тА╝я╕П рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, Cloud Shell рдПрдбрд┐рдЯрд░ рдореЗрдВ File -> Open Folder -> way-back-home/level_2 рдЦреЛрд▓реЗрдВ.

ЁЯСЙ рдЗрд╕ рдХреНрд╡реЗрд░реА рдХреЛ Spanner Studio рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рджреА рдЧрдИ рдХреНрд╡реЗрд░реА рдХреЛ рдХреЙрдкреА рдХрд░рдХреЗ рдЪрд┐рдкрдХрд╛рдПрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, 'рдЪрд▓рд╛рдПрдВ' рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:
CREATE MODEL TextEmbeddings
INPUT(content STRING(MAX))
OUTPUT(embeddings STRUCT<values ARRAY<FLOAT32>>)
REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/$YOUR_PROJECT_ID/locations/us-central1/publishers/google/models/text-embedding-004'
);
рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ:
- Spanner рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдореЙрдбрд▓ рдмрдирд╛рддрд╛ рд╣реИ. рдЗрд╕рдореЗрдВ рдореЙрдбрд▓ рдХреЗ рд╡реЗрдЯ рдХреЛ рд▓реЛрдХрд▓ рддреМрд░ рдкрд░ рд╕реЗрд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
- Vertex AI рдкрд░ Google рдХреЗ
text-embedding-004рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ - рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рддрдп рдХрд░рддрд╛ рд╣реИ: рдЗрдирдкреБрдЯ рдЯреЗрдХреНрд╕реНрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ 768 рдбрд╛рдЗрдореЗрдВрд╢рди рд╡рд╛рд▓рд╛ рдлрд╝реНрд▓реЛрдЯ рдРрд░реЗ рд╣реЛрддрд╛ рд╣реИ
"REMOTE OPTIONS" рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
- Spanner, рдореЙрдбрд▓ рдХреЛ рдЦреБрдж рдирд╣реАрдВ рдЪрд▓рд╛рддрд╛ рд╣реИ
ML.PREDICTрдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдкрд░, рдпрд╣ рдПрдкреАрдЖрдИ рдХреЗ рдЬрд╝рд░рд┐рдП Vertex AI рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ- рдЬрд╝реАрд░реЛ-рдИрдЯреАрдПрд▓: рдбреЗрдЯрд╛ рдХреЛ Python рдореЗрдВ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд░рдиреЗ, рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ, рдФрд░ рдлрд┐рд░ рд╕реЗ рдЗрдВрдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА
рд╕рд░реНрдЯрд┐рдлрд╝рд┐рдХреЗрдЯ рдЬрдирд░реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, Run рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдирддреАрдЬрд╛ рджрд┐рдЦреЗрдЧрд╛:

3. Embedding Column рдЬреЛрдбрд╝реЗрдВ
ЁЯСЙ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдо рдЬреЛрдбрд╝реЗрдВ:
ALTER TABLE Skills ADD COLUMN skill_embedding ARRAY<FLOAT32>;
рд╕рд░реНрдЯрд┐рдлрд╝рд┐рдХреЗрдЯ рдЬрдирд░реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, Run рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдирддреАрдЬрд╛ рджрд┐рдЦреЗрдЧрд╛:

4. рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЬрдирд░реЗрдЯ рдХрд░рдирд╛
ЁЯСЙ рд╣рд░ рд╕реНрдХрд┐рд▓ рдХреЗ рд▓рд┐рдП рд╡реЗрдХреНрдЯрд░ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдЖрдИ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:
UPDATE Skills
SET skill_embedding = (
SELECT embeddings.values
FROM ML.PREDICT(
MODEL TextEmbeddings,
(SELECT name AS content)
)
)
WHERE skill_embedding IS NULL;
рд╕рд░реНрдЯрд┐рдлрд╝рд┐рдХреЗрдЯ рдЬрдирд░реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, Run рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдирддреАрдЬрд╛ рджрд┐рдЦреЗрдЧрд╛:

рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ: рд╣рд░ рд╕реНрдХрд┐рд▓ рдХрд╛ рдирд╛рдо (рдЬреИрд╕реЗ, "рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдХрд┐рддреНрд╕рд╛") рдХреЛ 768 рдбрд╛рдЗрдореЗрдВрд╢рди рд╡рд╛рд▓реЗ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ. рдпрд╣ рд╡реЗрдХреНрдЯрд░, рдЗрд╕рдХреЗ рд╕рд┐рдореИрдВрдЯрд┐рдХ рдорддрд▓рдм рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ.
5. рдПрдореНрдмреЗрдб рдХрд┐рдП рдЧрдП рдХреЙрдиреНрдЯреЗрдВрдЯ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛
ЁЯСЙ рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдПрдореНрдмреЗрдб рдХрд┐рдП рдЧрдП рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ:
SELECT
skill_id,
name,
ARRAY_LENGTH(skill_embedding) AS embedding_dimensions
FROM Skills
LIMIT 5;
рдЕрдиреБрдорд╛рдирд┐рдд рдЖрдЙрдЯрдкреБрдЯ:

6. рд╕рд┐рдореИрдВрдЯрд┐рдХ рд╕рд░реНрдЪ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдЖрдЬрд╝рдорд╛рдирд╛
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ, рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреЗ рд╕рдЯреАрдХ рдорд╛рдорд▓реЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ: "рдореЗрдбрд┐рдХ" рд╢рдмреНрдж рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдЪрд┐рдХрд┐рддреНрд╕рд╛ рд╕реЗ рдЬреБрдбрд╝реА рд╕реНрдХрд┐рд▓ рдвреВрдВрдврдирд╛.
ЁЯСЙ "рдбреЙрдХреНрдЯрд░" рд╕реЗ рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рд╕реНрдХрд┐рд▓ рдвреВрдВрдвреЗрдВ:
WITH query_embedding AS (
SELECT embeddings.values AS val
FROM ML.PREDICT(MODEL TextEmbeddings, (SELECT "medic" AS content))
)
SELECT
s.name AS skill_name,
s.category,
COSINE_DISTANCE(s.skill_embedding, (SELECT val FROM query_embedding)) AS distance
FROM Skills AS s
WHERE s.skill_embedding IS NOT NULL
ORDER BY distance ASC
LIMIT 10;
- рдпрд╣ рдХреБрдХреА, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЦреЛрдЬ рд╢рдмреНрдж "medic" рдХреЛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЗрдВ рдмрджрд▓рддреА рд╣реИ
- рдЗрд╕реЗ
query_embeddingрдЕрд╕реНрдерд╛рдпреА рдЯреЗрдмрд▓ рдореЗрдВ рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ
рдЕрдиреБрдорд╛рдирд┐рдд рдирддреАрдЬреЗ (рдХрдо рджреВрд░реА = рдЬрд╝реНрдпрд╛рджрд╛ рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ):

7. рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП Gemini рдореЙрдбрд▓ рдмрдирд╛рдирд╛

ЁЯСЙ рдЬрдирд░реЗрдЯрд┐рд╡ рдПрдЖрдИ рдореЙрдбрд▓ рдХрд╛ рд░реЗрдлрд╝рд░рдВрд╕ рдмрдирд╛рдПрдВ ($YOUR_PROJECT_ID рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рд╕реЗ рдмрджрд▓реЗрдВ):
CREATE MODEL GeminiPro
INPUT(prompt STRING(MAX))
OUTPUT(content STRING(MAX))
REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/$YOUR_PROJECT_ID/locations/us-central1/publishers/google/models/gemini-2.5-pro',
default_batch_size = 1
);
рдПрдореНрдмреЗрдб рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдореЙрдбрд▓ рд╕реЗ рдЕрдВрддрд░:
- рдПрдореНрдмреЗрдб рдХрд░рдирд╛: рдЯреЗрдХреНрд╕реНрдЯ тЖТ рд╡реЗрдХреНрдЯрд░ (рд╕рдорд╛рдирддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП)
- Gemini: рдЯреЗрдХреНрд╕реНрдЯ тЖТ рдЬрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЯреЗрдХреНрд╕реНрдЯ (рддрд░реНрдХ/рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП)

8. Gemini рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдХрдВрдкреИрдЯрд┐рдмрд┐рд▓рд┐рдЯреА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛
ЁЯСЙ рдорд┐рд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдХреЗ рдЬреЛрдбрд╝реЗ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:
WITH PairData AS (
SELECT
s1.name AS Name_A,
s2.name AS Name_B,
CONCAT(
"Assess compatibility of these two survivors for a resource-gathering mission. ",
"Survivor 1: ", s1.name, ". ",
"Survivor 2: ", s2.name, ". ",
"Give a score from 1-10 and a 1-sentence reason."
) AS prompt
FROM Survivors s1
JOIN Survivors s2 ON s1.survivor_id < s2.survivor_id
LIMIT 1
)
SELECT
Name_A,
Name_B,
content AS ai_assessment
FROM ML.PREDICT(
MODEL GeminiPro,
(SELECT Name_A, Name_B, prompt FROM PairData)
);
рдЕрдиреБрдорд╛рдирд┐рдд рдЖрдЙрдЯрдкреБрдЯ:
Name_A | Name_B | ai_assessment
----------------|-------------------|----------------
"David Chen" | "Dr. Elena Frost" | "**Score: 9/10** Their compatibility is extremely high as David's practical, hands-on scavenging skills are perfectly complemented by Dr. Frost's specialized knowledge to identify critical medical supplies and avoid biological hazards."
6. рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ рдХреА рдорджрдж рд╕реЗ, рдЕрдкрдирд╛ Graph RAG рдПрдЬреЗрдВрдЯ рдмрдирд╛рдирд╛
1. рд╕рд┐рд╕реНрдЯрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА
рдЗрд╕ рд╕реЗрдХреНрд╢рди рдореЗрдВ, рдПрдХ рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рддрд░реАрдХреЛрдВ рд╕реЗ рдЦреЛрдЬ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдЗрд╕рд╕реЗ рдЖрдкрдХрд╛ рдПрдЬреЗрдВрдЯ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░рд╣ рдХреА рдХреНрд╡реЗрд░реА рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░ рдкрд╛рддрд╛ рд╣реИ. рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рддреАрди рд▓реЗрдпрд░ рд╣реЛрддреА рд╣реИрдВ: рдПрдЬреЗрдВрдЯ рд▓реЗрдпрд░, рдЯреВрд▓ рд▓реЗрдпрд░, рд╕рд░реНрд╡рд┐рд╕ рд▓реЗрдпрд░.

рддреАрди рд▓реЗрдпрд░ рдХреНрдпреЛрдВ?
- рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдмрдВрдЯрд╡рд╛рд░рд╛: рдПрдЬреЗрдВрдЯ рдХрд╛ рдлрд╝реЛрдХрд╕ рдЗрдВрдЯреЗрдВрдЯ рдкрд░, рдЯреВрд▓ рдХрд╛ рдлрд╝реЛрдХрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░, рдФрд░ рд╕реЗрд╡рд╛ рдХрд╛ рдлрд╝реЛрдХрд╕ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рд╣реЛрддрд╛ рд╣реИ
- рд▓рдЪреАрд▓рд╛рдкрди: рдПрдЬреЗрдВрдЯ рдХреЗ рдкрд╛рд╕, рдХрд┐рд╕реА рдЦрд╛рд╕ рддрд░реАрдХреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдпрд╛ рдПрдЖрдИ рдХреЛ рдЕрдкрдиреЗ-рдЖрдк рд░реВрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИ
- рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди: рдЬрдм рддрд░реАрдХрд╛ рдкрддрд╛ рд╣реЛ, рддреЛ рдПрдЖрдИ рдХреА рдорджрдж рд╕реЗ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдорд╣рдВрдЧреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕реНрдХрд┐рдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдЗрд╕ рд╕реЗрдХреНрд╢рди рдореЗрдВ, рдЖрдкрдХреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╕рд░реНрдЪ (рдЖрд░рдПрдЬреА) рд▓рд╛рдЧреВ рдХрд░рдиреА рд╣реЛрдЧреА. рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рд┐рд░реНрдлрд╝ рдХреАрд╡рд░реНрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдорддрд▓рдм рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирддреАрдЬреЗ рдвреВрдВрдврдиреЗ рд╣реЛрдВрдЧреЗ. рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ рдореЗрдВ рдХрдИ рддрд░реАрдХреЛрдВ рдХреЛ рдХреИрд╕реЗ рдорд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ.
2. RAG рд╕реЗрд╡рд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛
ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
cloudshell edit ~/way-back-home/level_2/backend/services/hybrid_search_service.py
рдЯрд┐рдкреНрдкрдгреА рдвреВрдВрдврдирд╛ # TODO: REPLACE_SQL
рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
# This is your working query from the successful run!
sql = """
WITH query_embedding AS (
SELECT embeddings.values AS val
FROM ML.PREDICT(
MODEL TextEmbeddings,
(SELECT @query AS content)
)
)
SELECT
s.survivor_id,
s.name AS survivor_name,
s.biome,
sk.skill_id,
sk.name AS skill_name,
sk.category,
COSINE_DISTANCE(
sk.skill_embedding,
(SELECT val FROM query_embedding)
) AS distance
FROM Survivors s
JOIN SurvivorHasSkill shs ON s.survivor_id = shs.survivor_id
JOIN Skills sk ON shs.skill_id = sk.skill_id
WHERE sk.skill_embedding IS NOT NULL
ORDER BY distance ASC
LIMIT @limit
"""
3. рд╕рд┐рдореИрдВрдЯрд┐рдХ рд╕рд░реНрдЪ рдЯреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА
ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
cloudshell edit ~/way-back-home/level_2/backend/agent/tools/hybrid_search_tools.py
hybrid_search_tools.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_SEMANTIC_SEARCH_TOOL рдвреВрдВрдвреЗрдВ
ЁЯСЙрдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
async def semantic_search(query: str, limit: int = 10) -> str:
"""
Force semantic (RAG) search using embeddings.
Use this when you specifically want to find things by MEANING,
not just matching keywords. Great for:
- Finding conceptually similar items
- Handling vague or abstract queries
- When exact terms are unknown
Example: "healing abilities" will find "first aid", "surgery",
"herbalism" even though no keywords match exactly.
Args:
query: What you're looking for (describe the concept)
limit: Maximum results
Returns:
Semantically similar results ranked by relevance
"""
try:
service = _get_service()
result = service.smart_search(
query,
force_method=SearchMethod.RAG,
limit=limit
)
return _format_results(
result["results"],
result["analysis"],
show_analysis=True
)
except Exception as e:
return f"Error in semantic search: {str(e)}"
рдПрдЬреЗрдВрдЯ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрдм рдХрд░рддрд╛ рд╣реИ:
- рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рдЪреАрдЬрд╝реЗрдВ рдвреВрдВрдврдиреЗ рдХреЗ рд▓рд┐рдП рдХреА рдЧрдИ рдХреНрд╡реЗрд░реА ("X рд╕реЗ рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рдЪреАрдЬрд╝реЗрдВ рдвреВрдВрдвреЛ")
- рдХреЙрдиреНрд╕реЗрдкреНрдЯ рд╕реЗ рдЬреБрдбрд╝реА рдХреНрд╡реЗрд░реА ("рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛")
- рдЬрдм рдорддрд▓рдм рд╕рдордЭрдирд╛ рдЬрд╝рд░реВрд░реА рд╣реЛ
4. рдПрдЬреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдлрд╝реИрд╕рд▓реЗ рд▓реЗрдиреЗ рд╕реЗ рдЬреБрдбрд╝реА рдЧрд╛рдЗрдб (рдирд┐рд░реНрджреЗрд╢)
рдПрдЬреЗрдВрдЯ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ, рд╕рд┐рдореИрдВрдЯрд┐рдХ рд╕рд░реНрдЪ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдХреЙрдкреА рдХрд░рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдЪрд┐рдкрдХрд╛рдПрдВ.
ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
cloudshell edit ~/way-back-home/level_2/backend/agent/agent.py
рдПрдЬреЗрдВрдЯ, рд╕рд╣реА рдЯреВрд▓ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ:
ЁЯСЙagent.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, # TODO: REPLACE_SEARCH_LOGIC рдЯрд┐рдкреНрдкрдгреА рдвреВрдВрдвреЗрдВ рдФрд░ рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:
- `semantic_search`: Force RAG/embedding search
Use for: "Find similar to X", conceptual queries, unknown terminology
Example: "Find skills related to healing"
ЁЯСЙ# TODO: ADD_SEARCH_TOOLReplace this whole line рд╡рд╛рд▓реА рдЯрд┐рдкреНрдкрдгреА рдвреВрдВрдвреЗрдВ рдФрд░ рдЙрд╕рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
semantic_search, # Force RAG
5. рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕рдордЭрдирд╛ (рд╕рд┐рд░реНрдлрд╝ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ рд╣реИ)
рджреВрд╕рд░реЗ рд╕реЗ рдЪреМрдереЗ рдЪрд░рдг рдореЗрдВ, рдЖрдкрдиреЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╕рд░реНрдЪ (рдЖрд░рдПрдЬреА) рд▓рд╛рдЧреВ рдХреА. рдпрд╣ рдЦреЛрдЬ рдХрд╛ рдореБрдЦреНрдп рддрд░реАрдХрд╛ рд╣реИ. рдЗрд╕рд╕реЗ рдорддрд▓рдм рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдирддреАрдЬреЗ рдорд┐рд▓рддреЗ рд╣реИрдВ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдпрд╣ рджреЗрдЦрд╛ рд╣реЛ рдХрд┐ рдЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЛ "рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ. рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
рд╣рд╛рдЗрдмреНрд░рд┐рдб рдорд░реНрдЬ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ:
рдлрд╝рд╛рдЗрд▓ way-back-home/level_2/backend/services/hybrid_search_service.py рдореЗрдВ, hybrid_search() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░, рд╕реЗрд╡рд╛ рджреЛрдиреЛрдВ рдЦреЛрдЬреЗрдВ рдЪрд▓рд╛рддреА рд╣реИ рдФрд░ рдирддреАрдЬреЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рддреА рд╣реИ:
# Location: backend/services/hybrid_search_service.py
rank_kw = keyword_ranks.get(surv_id, float('inf'))
rank_rag = rag_ranks.get(surv_id, float('inf'))
rrf_score = 0.0
if rank_kw != float('inf'):
rrf_score += 1.0 / (K + rank_kw)
if rank_rag != float('inf'):
rrf_score += 1.0 / (K + rank_rag)
combined_score = rrf_score
рдЗрд╕ рдХреЛрдбрд▓реИрдм рдХреЗ рд▓рд┐рдП, рдЖрдкрдиреЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╕рд░реНрдЪ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ (рдЖрд░рдПрдЬреА) рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдмреБрдирд┐рдпрд╛рджреА рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рд╣реИ. рдХреАрд╡рд░реНрдб рдФрд░ рд╣рд╛рдЗрдмреНрд░рд┐рдб рддрд░реАрдХреЗ, рд╕реЗрд╡рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВ. рдЖрдкрдХрд╛ рдПрдЬреЗрдВрдЯ рдЗрди рддреАрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ!
рдмрдзрд╛рдИ рд╣реЛ! рдЖрдкрдиреЗ рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде Graph RAG рдПрдЬреЗрдВрдЯ рдХреЛ рд╕реЗрдЯ рдЕрдк рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ!
7. ADK Web рдХреА рдорджрдж рд╕реЗ рдПрдЬреЗрдВрдЯ рдХреЛ рдЯреЗрд╕реНрдЯ рдХрд░рдирд╛
рдЕрдкрдиреЗ рдПрдЬреЗрдВрдЯ рдХреЛ рдЯреЗрд╕реНрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛, adk web рдХрдорд╛рдВрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╣реИ. рдЗрд╕рд╕реЗ, рдЪреИрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЖрдкрдХрд╛ рдПрдЬреЗрдВрдЯ рд▓реЙрдиреНрдЪ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ.
1. рдПрдЬреЗрдВрдЯ рдХреЛ рдЪрд▓рд╛рдирд╛
ЁЯСЙЁЯТ╗ рдмреИрдХрдПрдВрдб рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА (рдЬрд╣рд╛рдВ рдЖрдкрдХрд╛ рдПрдЬреЗрдВрдЯ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ::
cd ~/way-back-home/level_2/backend
uv run adk web
рдЗрд╕ рдХрдорд╛рдВрдб рд╕реЗ,
agent/agent.py
рдФрд░ рдЗрд╕рд╕реЗ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЦреБрд▓рддрд╛ рд╣реИ.
ЁЯСЙ рдпрд╣ рдпреВрдЖрд░рдПрд▓ рдЦреЛрд▓реЗрдВ:
рдЗрд╕ рдХрдорд╛рдВрдб рд╕реЗ, рдПрдХ рд▓реЛрдХрд▓ рдпреВрдЖрд░рдПрд▓ (рдЖрдо рддреМрд░ рдкрд░ http://127.0.0.1:8000 рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдХреЛрдИ рдпреВрдЖрд░рдПрд▓) рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрдЧрд╛. рдЗрд╕реЗ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЦреЛрд▓реЗрдВ.

рдпреВрдЖрд░рдПрд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ ADK рдХрд╛ рд╡реЗрдм рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рджрд┐рдЦреЗрдЧрд╛. рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рд╕рдмрд╕реЗ рдКрдкрд░ рдмрд╛рдПрдВ рдХреЛрдиреЗ рд╕реЗ "рдПрдЬреЗрдВрдЯ" рдЪреБрдирд╛ рд╣реЛ.

2. рдЦреЛрдЬ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛
рдЗрд╕ рдПрдЬреЗрдВрдЯ рдХреЛ рдЖрдкрдХреА рдХреНрд╡реЗрд░реА рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд░реВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдЦреЛрдЬ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪреИрдЯ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рдЗрдирдкреБрдЯ рдЖрдЬрд╝рдорд╛рдПрдВ.
ЁЯзм A. рдЧреНрд░рд╛рдлрд╝ рдЖрд░рдПрдЬреА (рд╕рд┐рдореИрдВрдЯрд┐рдХ рд╕рд░реНрдЪ)
рдХреАрд╡рд░реНрдб рдХреЗ рдореЗрд▓ рди рдЦрд╛рдиреЗ рдкрд░ рднреА, рдорддрд▓рдм рдФрд░ рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдЗрдЯрдо рдвреВрдВрдврддрд╛ рд╣реИ.
рдЯреЗрд╕реНрдЯ рдХреНрд╡реЗрд░реА: (рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЪреБрдиреЗрдВ)
Who can help with injuries?
What abilities are related to survival?
рдЗрди рдмрд╛рддреЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ:
- рдЬрд╡рд╛рдм рдореЗрдВ, рд╕рд┐рдореИрдВрдЯрд┐рдХ рдпрд╛ рдЖрд░рдПрдЬреА рдЦреЛрдЬ рдХрд╛ рдЬрд╝рд┐рдХреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП.
- рдЖрдкрдХреЛ рдРрд╕реЗ рдирддреАрдЬреЗ рджрд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рд╣реЛрдВ. рдЬреИрд╕реЗ, "рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдХрд┐рддреНрд╕рд╛" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрддреЗ рд╕рдордп "рд╕рд░реНрдЬрд░реА" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рди рджреЗрдВ).
- рдирддреАрдЬреЛрдВ рдореЗрдВ ЁЯзм рдЖрдЗрдХреЙрди рджрд┐рдЦреЗрдЧрд╛.
ЁЯФА B. рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ
рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП, рдХреАрд╡рд░реНрдб рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рд╕рд┐рдореИрдВрдЯрд┐рдХ рдЕрдВрдбрд░рд╕реНрдЯреИрдВрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ.
рдЯреЗрд╕реНрдЯ рдХреНрд╡реЗрд░реА:(рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЪреБрдиреЗрдВ)
Find someone who can ply a plane in the volcanic area
Who has healing abilities in the FOSSILIZED?
Who has healing abilities in the mountains?
рдЗрди рдмрд╛рддреЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ:
- рд╡рдЬрд╣ рдореЗрдВ рд╣рд╛рдЗрдмреНрд░рд┐рдб рдЦреЛрдЬ рдХрд╛ рдЬрд╝рд┐рдХреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП.
- рдирддреАрдЬреЗ, рджреЛрдиреЛрдВ рд╢рд░реНрддреЛрдВ (рдХреЙрдиреНрд╕реЗрдкреНрдЯ + рдЬрдЧрд╣/рдХреИрдЯреЗрдЧрд░реА) рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП.
- рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рдорд┐рд▓реЗ рдирддреАрдЬреЛрдВ рдореЗрдВ ЁЯФА рдЖрдЗрдХреЙрди рд╣реЛрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдмрд╕реЗ рдКрдкрд░ рд░реИрдВрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛.
ЁЯСЙЁЯТ╗ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдореЗрдВ Ctrl+C рджрдмрд╛рдХрд░ рдкреНрд░реЛрд╕реЗрд╕ рдЦрддреНрдо рдХрд░реЗрдВ.
8. рдкреВрд░рд╛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдирд╛
рдлрд╝реБрд▓ рд╕реНрдЯреИрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА

SessionService рдФрд░ Runner рдЬреЛрдбрд╝реЗрдВ
ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ chat.py рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ. рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реА рдкреНрд░реЛрд╕реЗрд╕ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "ctrl+C" рджрдмрд╛рдпрд╛ рд╣реЛ:
cloudshell edit ~/way-back-home/level_2/backend/api/routes/chat.py
ЁЯСЙchat.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, # TODO: REPLACE_INMEMORY_SERVICES рдЯрд┐рдкреНрдкрдгреА рдвреВрдВрдвреЗрдВ рдФрд░ рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:
session_service = InMemorySessionService()
memory_service = InMemoryMemoryService()
ЁЯСЙchat.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, # TODO: REPLACE_RUNNER рдЯрд┐рдкреНрдкрдгреА рдвреВрдВрдвреЗрдВ рдФрд░ рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:
runner = Runner(
agent=root_agent,
session_service=session_service,
memory_service=memory_service,
app_name="survivor-network"
)
1. рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░реЗрдВ
рдЕрдЧрд░ рдкрд┐рдЫрд▓рд╛ рдЯрд░реНрдорд┐рдирд▓ рдЕрдм рднреА рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ Ctrl+C рджрдмрд╛рдХрд░ рдЙрд╕реЗ рдмрдВрдж рдХрд░реЗрдВ.
ЁЯСЙЁЯТ╗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ:
cd ~/way-back-home/level_2/
./start_app.sh
рдмреИрдХрдПрдВрдб рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░, рдЖрдкрдХреЛ Local: http://localhost:5173/" рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛: 
ЁЯСЙ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдЬрд╛рдХрд░, Local: http://localhost:5173/ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.

2. рд╕рд┐рдореИрдВрдЯрд┐рдХ рд╕рд░реНрдЪ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдЖрдЬрд╝рдорд╛рдирд╛
рдХреНрд╡реЗрд░реА:
Find skills similar to healing

рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
- рдПрдЬреЗрдВрдЯ, рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ
- "healing" рдХреЗ рд▓рд┐рдП рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ
- рдпрд╣ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рд╕реНрдХрд┐рд▓ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрд╕рд╛рдЗрди рджреВрд░реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ
- рдЬрд╡рд╛рдм: рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдХрд┐рддреНрд╕рд╛ (рднрд▓реЗ рд╣реА, рдирд╛рдо "рдареАрдХ рд╣реЛрдирд╛" рд╕реЗ рдореЗрд▓ рди рдЦрд╛рддреЗ рд╣реЛрдВ)
3. рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛
рдХреНрд╡реЗрд░реА:
Find medical skills in the mountains
рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
- рдХреАрд╡рд░реНрдб рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ:
category='medical'рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ - рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ: "рдореЗрдбрд┐рдХрд▓" рдХреЛ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ рдФрд░ рд╕рдорд╛рдирддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд░реИрдВрдХ рдХрд░реЗрдВ
- рдорд░реНрдЬ рдХрд░реЗрдВ: рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рдорд┐рд▓реЗ рдирддреАрдЬреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдорд┐рд▓рд╛рдПрдВ. рд╕рд╛рде рд╣реА, рдЙрди рдирддреАрдЬреЛрдВ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ рдЬреЛ рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рдорд┐рд▓реЗ рд╣реИрдВ ЁЯФА
рдХреНрд╡реЗрд░реА(рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ):
Who is good at survival and in the forest?
рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
- рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡:
biome='forest' - рд╕реЗрдореИрдЯрд┐рдХ рдиреЗ рдпреЗ рд╕реНрдХрд┐рд▓ рдвреВрдВрдврдХрд░ рдирд┐рдХрд╛рд▓реА рд╣реИрдВ: "рдЬреАрд╡рди рдмрдЪрд╛рдирд╛" рд╕реЗ рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рд╕реНрдХрд┐рд▓
- рд╣рд╛рдЗрдмреНрд░рд┐рдб, рджреЛрдиреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдХрд░ рдмреЗрд╣рддрд░ рдирддреАрдЬреЗ рджреЗрддрд╛ рд╣реИ
ЁЯСЙЁЯТ╗ рдЬрд╛рдВрдЪ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ Ctrl+C рджрдмрд╛рдХрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░реЗрдВ.
9. рдорд▓реНрдЯреАрдореЙрдбрд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди тАФ рдЯреВрд▓рд┐рдВрдЧ рд▓реЗрдпрд░
рд╣рдореЗрдВ рдорд▓реНрдЯреАрдореЙрдбрд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреА рдЬрд╝рд░реВрд░рдд рдХреНрдпреЛрдВ рд╣реЛрддреА рд╣реИ?
рд╕рд░реНрд╡рд╛рдЗрд╡рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд╕рд┐рд░реНрдлрд╝ рдЯреЗрдХреНрд╕реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛. рдкреАрдбрд╝рд┐рдд, рдЪреИрдЯ рдХреЗ рдЬрд╝рд░рд┐рдП рд╕реАрдзреЗ рддреМрд░ рдкрд░ рдЕрдирд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рд╣реИрдВ:
- ЁЯУ╕ рдЗрдореЗрдЬ: рд╕рдВрд╕рд╛рдзрдиреЛрдВ, рдЦрддрд░реЛрдВ рдпрд╛ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдлрд╝реЛрдЯреЛ
- ЁЯОе рд╡реАрдбрд┐рдпреЛ: рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рджреЗрдиреЗ рд╡рд╛рд▓реА рд░рд┐рдкреЛрд░реНрдЯ рдпрд╛ рдПрд╕рдУрдПрд╕ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯ
- ЁЯУД рдЯреЗрдХреНрд╕реНрдЯ: рдлрд╝реАрд▓реНрдб рдиреЛрдЯ рдпрд╛ рд▓реЙрдЧ
рд╣рдо рдХреМрдирд╕реА рдлрд╝рд╛рдЗрд▓реЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ?
рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдордиреЗ рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛ рдЦреЛрдЬрд╛ рдерд╛. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣рд╛рдВ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдУрд░ рд╕реЗ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ. chat.py рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдлрд╝рд╛рдЗрд▓ рдЕрдЯреИрдЪрдореЗрдВрдЯ рдХреЛ рдбрд╛рдЗрдиреИрдорд┐рдХ рддреМрд░ рдкрд░ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИ:
рд╕реНрд░реЛрдд | рд╕рд╛рдордЧреНрд░реА | рд▓рдХреНрд╖реНрдп |
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдЯреИрдЪрдореЗрдВрдЯ | рдЗрдореЗрдЬ/рд╡реАрдбрд┐рдпреЛ/рдЯреЗрдХреНрд╕реНрдЯ | рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА |
рдЪреИрдЯ рдХрд╛ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ | "рдпрд╣рд╛рдВ рд╕рд╛рдорд╛рди рдХреА рдлрд╝реЛрдЯреЛ рджреА рдЧрдИ рд╣реИ" | рдЗрд░рд╛рджрд╛ рдФрд░ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА |
рдкреНрд▓рд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рддрд░реАрдХрд╛: рд╕реАрдХреНрд╡реЗрдВрд╢рд┐рдпрд▓ рдПрдЬреЗрдВрдЯ рдкрд╛рдЗрдкрд▓рд╛рдЗрди
рд╣рдо рд╕реАрдХреНрд╡реЗрдВрд╢рд┐рдпрд▓ рдПрдЬреЗрдВрдЯ (multimedia_agent.py) рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ. рдпрд╣ рдЦрд╛рд╕ рдПрдЬреЗрдВрдЯ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ:

рдЗрд╕реЗ backend/agent/multimedia_agent.py рдореЗрдВ SequentialAgent рдХреЗ рддреМрд░ рдкрд░ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ.
рдЯреВрд▓рд┐рдВрдЧ рд▓реЗрдпрд░, рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдЬреЗрдВрдЯ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ. рдЯреВрд▓, "рдХреИрд╕реЗ" рдХреЛ рдореИрдиреЗрдЬ рдХрд░рддреЗ рд╣реИрдВ. рдЬреИрд╕реЗ, рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛, рдЗрдХрд╛рдЗрдпрд╛рдВ рдирд┐рдХрд╛рд▓рдирд╛, рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реЗрд╡ рдХрд░рдирд╛.
1. Tools рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ
ЁЯСЙЁЯТ╗ рдирдпрд╛ рдЯрд░реНрдорд┐рдирд▓ рдЦреЛрд▓реЗрдВ. рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ:
cloudshell edit ~/way-back-home/level_2/backend/agent/tools/extraction_tools.py
2. upload_media рдЯреВрд▓ рд▓рд╛рдЧреВ рдХрд░рдирд╛
рдпрд╣ рдЯреВрд▓, рд▓реЛрдХрд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ Google Cloud Storage рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИ.
ЁЯСЙ extraction_tools.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА pass # TODO: REPLACE_UPLOAD_MEDIA_FUNCTION рдвреВрдВрдвреЗрдВ.
рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
"""
Upload media file to GCS and detect its type.
Args:
file_path: Path to the local file
survivor_id: Optional survivor ID to associate with upload
Returns:
Dict with gcs_uri, media_type, and status
"""
try:
if not file_path:
return {"status": "error", "error": "No file path provided"}
# Strip quotes if present
file_path = file_path.strip().strip("'").strip('"')
if not os.path.exists(file_path):
return {"status": "error", "error": f"File not found: {file_path}"}
gcs_uri, media_type, signed_url = gcs_service.upload_file(file_path, survivor_id)
return {
"status": "success",
"gcs_uri": gcs_uri,
"signed_url": signed_url,
"media_type": media_type.value,
"file_name": os.path.basename(file_path),
"survivor_id": survivor_id
}
except Exception as e:
logger.error(f"Upload failed: {e}")
return {"status": "error", "error": str(e)}
3. extract_from_media рдЯреВрд▓ рд▓рд╛рдЧреВ рдХрд░рдирд╛
рдпрд╣ рдЯреВрд▓ рдПрдХ рд░рд╛рдЙрдЯрд░ рд╣реИ. рдпрд╣ media_type рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╣реА рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯрд░ (рдЯреЗрдХреНрд╕реНрдЯ, рдЗрдореЗрдЬ рдпрд╛ рд╡реАрдбрд┐рдпреЛ) рдХреЛ рднреЗрдЬрддрд╛ рд╣реИ.
ЁЯСЙextraction_tools.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА pass # TODO: REPLACE_EXTRACT_FROM_MEDIA рдвреВрдВрдвреЗрдВ.
рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
"""
Extract entities and relationships from uploaded media.
Args:
gcs_uri: GCS URI of the uploaded file
media_type: Type of media (text/image/video)
signed_url: Optional signed URL for public/temporary access
Returns:
Dict with extraction results
"""
try:
if not gcs_uri:
return {"status": "error", "error": "No GCS URI provided"}
# Select appropriate extractor
if media_type == MediaType.TEXT.value or media_type == "text":
result = await text_extractor.extract(gcs_uri)
elif media_type == MediaType.IMAGE.value or media_type == "image":
result = await image_extractor.extract(gcs_uri)
elif media_type == MediaType.VIDEO.value or media_type == "video":
result = await video_extractor.extract(gcs_uri)
else:
return {"status": "error", "error": f"Unsupported media type: {media_type}"}
# Inject signed URL into broadcast info if present
if signed_url:
if not result.broadcast_info:
result.broadcast_info = {}
result.broadcast_info['thumbnail_url'] = signed_url
return {
"status": "success",
"extraction_result": result.to_dict(), # Return valid JSON dict instead of object
"summary": result.summary,
"entities_count": len(result.entities),
"relationships_count": len(result.relationships),
"entities": [e.to_dict() for e in result.entities],
"relationships": [r.to_dict() for r in result.relationships]
}
except Exception as e:
logger.error(f"Extraction failed: {e}")
return {"status": "error", "error": str(e)}
рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдЬреБрдбрд╝реА рдореБрдЦреНрдп рдЬрд╛рдирдХрд╛рд░реА:
- рдЯреЗрдХреНрд╕реНрдЯ, рдЗрдореЗрдЬ, рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╡рдЧреИрд░рд╣ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рдЗрдирдкреБрдЯ рджреЗрдирд╛: рд╣рдо
generate_contentрдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░реЙрдореНрдкреНрдЯ (_get_extraction_prompt()) рдФрд░ рдЗрдореЗрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ, рджреЛрдиреЛрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ. - рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдЖрдЙрдЯрдкреБрдЯ:
response_mime_type="application/json"рдпрд╣ рдкрдХреНрдХрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрд▓рдПрд▓рдПрдо, рдорд╛рдиреНрдп JSON рдлрд╝реЙрд░реНрдореИрдЯ рдореЗрдВ рдЬрд╡рд╛рдм рджреЗ. рдпрд╣ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдЬрд╝рд░реВрд░реА рд╣реИ. - рд╡рд┐рдЬрд╝реБрдЕрд▓ рдПрдВрдЯрд┐рдЯреА рд▓рд┐рдВрдХрд┐рдВрдЧ: рдкреНрд░реЙрдореНрдкреНрдЯ рдореЗрдВ рдЬрд╛рдиреА-рдкрд╣рдЪрд╛рдиреА рдПрдВрдЯрд┐рдЯреА рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИрдВ, рддрд╛рдХрд┐ Gemini рдЦрд╛рд╕ рд╡рд░реНрдгреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рди рд╕рдХреЗ.
4. save_to_spanner рдЯреВрд▓ рд▓рд╛рдЧреВ рдХрд░рдирд╛
рдпрд╣ рдЯреВрд▓, рдирд┐рдХрд╛рд▓реА рдЧрдИ рдЗрдХрд╛рдЗрдпреЛрдВ рдФрд░ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ Spanner Graph DB рдореЗрдВ рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ.
ЁЯСЙextraction_tools.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА pass # TODO: REPLACE_SPANNER_AGENT рдвреВрдВрдвреЗрдВ.
рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
"""
Save extracted entities and relationships to Spanner Graph DB.
Args:
extraction_result: ExtractionResult object (or dict from previous step if passed as dict)
survivor_id: Optional survivor ID to associate with the broadcast
Returns:
Dict with save statistics
"""
try:
# Handle if extraction_result is passed as the wrapper dict from extract_from_media
result_obj = extraction_result
if isinstance(extraction_result, dict) and 'extraction_result' in extraction_result:
result_obj = extraction_result['extraction_result']
# If result_obj is a dict (from to_dict()), reconstruct it
if isinstance(result_obj, dict):
from extractors.base_extractor import ExtractionResult
result_obj = ExtractionResult.from_dict(result_obj)
if not result_obj:
return {"status": "error", "error": "No extraction result provided"}
stats = spanner_service.save_extraction_result(result_obj, survivor_id)
return {
"status": "success",
"entities_created": stats['entities_created'],
"entities_existing": stats['entities_found_existing'],
"relationships_created": stats['relationships_created'],
"broadcast_id": stats['broadcast_id'],
"errors": stats['errors'] if stats['errors'] else None
}
except Exception as e:
logger.error(f"Spanner save failed: {e}")
return {"status": "error", "error": str(e)}
рдПрдЬреЗрдВрдЯ рдХреЛ рдмреЗрд╣рддрд░ рдЯреВрд▓ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдХрд░, рд╣рдо рдбреЗрдЯрд╛ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдкрдХреНрдХрд╛ рдХрд░рддреЗ рд╣реИрдВ. рд╕рд╛рде рд╣реА, рдПрдЬреЗрдВрдЯ рдХреА рддрд░реНрдХ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ.
5. GCS рд╕реЗрд╡рд╛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ
GCSService, Google Cloud Storage рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ.
ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ:
cloudshell edit ~/way-back-home/level_2/backend/services/gcs_service.py
ЁЯСЙ рдлрд╝рд╛рдЗрд▓ gcs_service.py рдореЗрдВ, upload_file рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдореМрдЬреВрдж рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_SAVE_TO_GCS рдвреВрдВрдвреЗрдВ.
рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
blob = self.bucket.blob(blob_name)
blob.upload_from_filename(file_path)
рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реЗрд╡рд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╕реЗ, рдПрдЬреЗрдВрдЯ рдХреЛ GCS рдмрдХреЗрдЯ, blob рдХреЗ рдирд╛рдо рдпрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рдпреВрдЖрд░рдПрд▓ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА. рдЗрд╕рдореЗрдВ рд╕рд┐рд░реНрдлрд╝ "рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ" рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИ.
6. (рд╕рд┐рд░реНрдлрд╝ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП) рдПрдЬреЗрдВрдЯрд┐рдХ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ > рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХреЗ рдХреНрдпреЛрдВ?
рдПрдЬреЗрдВрдЯрд┐рдХ рдПрдЖрдИ рдХреЗ рдлрд╝рд╛рдпрджреЗ:
рд╕реБрд╡рд┐рдзрд╛ | рдмреИрдЪ рдкрд╛рдЗрдкрд▓рд╛рдЗрди | рдЗрд╡реЗрдВрдЯ-рдбреНрд░рд┐рд╡рди | рдПрдЬреЗрдВрдЯрд┐рдХ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ |
рдЬрдЯрд┐рд▓рддрд╛ | рдХрдо (рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ) | рдЬрд╝реНрдпрд╛рджрд╛ (рдкрд╛рдВрдЪ рдпрд╛ рдЙрд╕рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рд╕реЗрд╡рд╛рдПрдВ) | рдХрдо (1 Python рдлрд╝рд╛рдЗрд▓: |
рд╕реНрдЯреЗрдЯ рдореИрдиреЗрдЬрдореЗрдВрдЯ | рдЧреНрд▓реЛрдмрд▓ рд╡реИрд░рд┐рдПрдмрд▓ | рд╣рд╛рд░реНрдб (рдбреАрдХрдкрд▓реНрдб) | рдпреВрдирд┐рдлрд╝рд╛рдЗрдб (рдПрдЬреЗрдВрдЯ рдХреА рд╕реНрдерд┐рддрд┐) |
рдЧрдбрд╝рдмрдбрд╝реА рдареАрдХ рдХрд░рдирд╛ | рдХреНрд░реИрд╢ | рд╕рд╛рдЗрд▓реЗрдВрдЯ рд▓реЙрдЧ | рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ ("рдореБрдЭреЗ рд╡рд╣ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдорд┐рд▓реА") |
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реБрдЭрд╛рд╡/рд░рд╛рдп рдпрд╛ рд╢рд┐рдХрд╛рдпрдд | рдХрдВрд╕реЛрд▓ рдкреНрд░рд┐рдВрдЯ | рдкреЛрд▓рд┐рдВрдЧ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ | рддреБрд░рдВрдд (рдЪреИрдЯ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛) |
рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдврд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ | рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓реЙрдЬрд┐рдХ | рд░рд┐рдЬрд┐рдб рдлрд╝рдВрдХреНрд╢рди | рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрдЯ (рдПрд▓рдПрд▓рдПрдо рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓рд╛ рдЪрд░рдг рдХреНрдпрд╛ рд╣реЛрдЧрд╛) |
рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдЕрд╡реЗрдпрд░рдиреЗрд╕ | рдХреЛрдИ рдирд╣реАрдВ | рдХреЛрдИ рдирд╣реАрдВ | рдкреВрд░реА рдЬрд╛рдирдХрд╛рд░реА (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдордХрд╕рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ) |
рдпрд╣ рдХреНрдпреЛрдВ рдЬрд╝рд░реВрд░реА рд╣реИ: multimedia_agent.py (рдЪрд╛рд░ рд╕рдм-рдПрдЬреЗрдВрдЯ рд╡рд╛рд▓рд╛ SequentialAgent: рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ тЖТ рдирд┐рдХрд╛рд▓реЗрдВ тЖТ рд╕реЗрд╡ рдХрд░реЗрдВ тЖТ рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА) рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рд╣рдо рдЬрдЯрд┐рд▓ рдЗрдВрдлрд╝реНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдФрд░ рдХрдордЬрд╝реЛрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрдЯ, рдмрд╛рддрдЪреАрдд рд╡рд╛рд▓реЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ рд╕реЗ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ.
10. рдорд▓реНрдЯреАрдореЙрдбрд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди тАФ рдПрдЬреЗрдВрдЯ рд▓реЗрдпрд░
рдПрдЬреЗрдВрдЯ рд▓реЗрдпрд░, рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрд╕ рддрдп рдХрд░рддреА рд╣реИ. рдЗрд╕рдореЗрдВ рдРрд╕реЗ рдПрдЬреЗрдВрдЯ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЯрд╛рд╕реНрдХ рдкреВрд░реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреВрд▓ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ. рд╣рд░ рдПрдЬреЗрдВрдЯ рдХреА рдПрдХ рдЦрд╛рд╕ рднреВрдорд┐рдХрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рд╡рд╣ рдЕрдЧрд▓реЗ рдПрдЬреЗрдВрдЯ рдХреЛ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ. рдпрд╣рд╛рдВ рдорд▓реНрдЯреАрдПрдЬреЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдбрд╛рдпрдЧреНрд░рд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ.

1. рдПрдЬреЗрдВрдЯ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ
ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ:
cloudshell edit ~/way-back-home/level_2/backend/agent/multimedia_agent.py
2. рдЕрдкрд▓реЛрдб рдПрдЬреЗрдВрдЯ рддрдп рдХрд░рдирд╛
рдпрд╣ рдПрдЬреЗрдВрдЯ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдореИрд╕реЗрдЬ рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдкрд╛рде рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ GCS рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИ.
ЁЯСЙрдлрд╝рд╛рдЗрд▓ multimedia_agent.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_UPLOAD_AGENT рдвреВрдВрдвреЗрдВ.
рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
upload_agent = LlmAgent(
name="UploadAgent",
model="gemini-2.5-flash",
instruction="""Extract the file path from the user's message and upload it.
Use `upload_media(file_path, survivor_id)` to upload the file.
The survivor_id is optional - include it if the user mentions a specific survivor (e.g., "survivor Sarah" -> "Sarah").
If the user provides a path like "/path/to/file", use that.
Return the upload result with gcs_uri and media_type.""",
tools=[upload_media],
output_key="upload_result"
)
3. рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдЬреЗрдВрдЯ рдХреЛ рддрдп рдХрд░рдирд╛
рдпрд╣ рдПрдЬреЗрдВрдЯ, рдЕрдкрд▓реЛрдб рдХрд┐рдП рдЧрдП рдореАрдбрд┐рдпрд╛ рдХреЛ "рджреЗрдЦрддрд╛" рд╣реИ рдФрд░ Gemini Vision рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ.
ЁЯСЙрдлрд╝рд╛рдЗрд▓ multimedia_agent.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_EXTRACT_AGENT рдвреВрдВрдвреЗрдВ.
рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
extraction_agent = LlmAgent(
name="ExtractionAgent",
model="gemini-2.5-flash",
instruction="""Extract information from the uploaded media.
Previous step result: {upload_result}
Use `extract_from_media(gcs_uri, media_type, signed_url)` with the values from the upload result.
The gcs_uri is in upload_result['gcs_uri'], media_type in upload_result['media_type'], and signed_url in upload_result['signed_url'].
Return the extraction results including entities and relationships found.""",
tools=[extract_from_media],
output_key="extraction_result"
)
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ instruction рд░реЗрдлрд╝рд░рдВрд╕ {upload_result} рдХреИрд╕реЗ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ тАФ ADK рдореЗрдВ рдПрдЬреЗрдВрдЯ рдХреЗ рдмреАрдЪ рд╕реНрдЯреЗрдЯ рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ.
4. Spanner рдПрдЬреЗрдВрдЯ рдХреЛ рддрдп рдХрд░рдирд╛
рдпрд╣ рдПрдЬреЗрдВрдЯ, рдирд┐рдХрд╛рд▓реА рдЧрдИ рдЗрдХрд╛рдЗрдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ.
ЁЯСЙрдлрд╝рд╛рдЗрд▓ multimedia_agent.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_SPANNER_AGENT рдвреВрдВрдвреЗрдВ.
рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
spanner_agent = LlmAgent(
name="SpannerAgent",
model="gemini-2.5-flash",
instruction="""Save the extracted information to the database.
Upload result: {upload_result}
Extraction result: {extraction_result}
Use `save_to_spanner(extraction_result, survivor_id)` to save to Spanner.
Pass the WHOLE `extraction_result` object/dict from the previous step.
Include survivor_id if it was provided in the upload step.
Return the save statistics.""",
tools=[save_to_spanner],
output_key="spanner_result"
)
рдЗрд╕ рдПрдЬреЗрдВрдЯ рдХреЛ рдкрд┐рдЫрд▓реЗ рджреЛрдиреЛрдВ рдЪрд░рдгреЛрдВ (upload_result рдФрд░ extraction_result) рд╕реЗ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдорд┐рд▓рддрд╛ рд╣реИ.
5. рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдПрдЬреЗрдВрдЯ рдХреЛ рддрдп рдХрд░рдирд╛
рдпрд╣ рдПрдЬреЗрдВрдЯ, рдкрд┐рдЫрд▓реЗ рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЗ рдирддреАрдЬреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдХрд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдЬрд╡рд╛рдм рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ.
ЁЯСЙрдлрд╝рд╛рдЗрд▓ multimedia_agent.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА summary_instruction="" # TODO: REPLACE_SUMMARY_AGENT_PROMPT рдвреВрдВрдвреЗрдВ.
рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
USE_MEMORY_BANK = os.getenv("USE_MEMORY_BANK", "false").lower() == "true"
save_msg = "6. Mention that the data is also being synced to the memory bank." if USE_MEMORY_BANK else ""
summary_instruction = f"""Provide a user-friendly summary of the media processing.
Upload: {{upload_result}}
Extraction: {{extraction_result}}
Database: {{spanner_result}}
Summarize:
1. What file was processed (name and type)
2. Key information extracted (survivors, skills, needs, resources found) - list names and counts
3. Relationships identified
4. What was saved to the database (broadcast ID, number of entities)
5. Any issues encountered
{save_msg}
Be concise but informative."""
рдЗрд╕ рдПрдЬреЗрдВрдЯ рдХреЛ рдЯреВрд▓ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА. рдпрд╣ рд╕рд┐рд░реНрдлрд╝ рд╢реЗрдпрд░ рдХрд┐рдП рдЧрдП рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдлрд╝ рддреМрд░ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ.
ЁЯза рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА
рдкрд░рдд | рдлрд╝рд╛рдЗрд▓ | рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА |
рдЯреВрд▓рд┐рдВрдЧ |
| рдХреИрд╕реЗ тАФ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ, рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ рдХрд░реЗрдВ, рд╕реЗрд╡ рдХрд░реЗрдВ |
Agent |
| рдХреНрдпрд╛ тАФ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ |
11. рдорд▓реНрдЯреАрдореЙрдбрд▓ рдбреЗрдЯрд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди тАФ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди
рд╣рдорд╛рд░реЗ рдирдП рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдореБрдЦреНрдп рд╣рд┐рд╕реНрд╕рд╛, MultimediaExtractionPipeline рд╣реИ. рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ backend/agent/multimedia_agent.py рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдпрд╣ ADK (рдПрдЬреЗрдВрдЯ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрд┐рдЯ) рд╕реЗ рд╕реАрдХреНрд╡реЗрдВрд╢рд┐рдпрд▓ рдПрдЬреЗрдВрдЯ рдкреИрдЯрд░реНрди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ.
1. рд╕реАрдХреНрд╡реЗрдВрд╢рд┐рдпрд▓ рдЯрд╛рд░рдЧреЗрдЯрд┐рдВрдЧ рдХреНрдпреЛрдВ?
рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрди рдЪрд░рдгреЛрдВ рдХреЛ рдХреНрд░рдо рд╕реЗ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЬрд╝рд░реВрд░реА рд╣реИ:
- рдЬрдм рддрдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдлрд╝рд╛рдЗрд▓ (рдЕрдкрд▓реЛрдб) рдирд╣реАрдВ рд╣реЛрддреА, рддрдм рддрдХ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛.
- рдбреЗрдЯрд╛ рдХреЛ рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЙрд╕реЗ рд╕реЗрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.
- рдирддреАрдЬреЗ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА, рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА рдЬрдирд░реЗрдЯ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ.
рдЗрд╕рдХреЗ рд▓рд┐рдП, SequentialAgent рд╕рдмрд╕реЗ рд╕рд╣реА рд╣реИ. рдпрд╣ рдПрдХ рдПрдЬреЗрдВрдЯ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджреВрд╕рд░реЗ рдПрдЬреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ/рдЗрдирдкреБрдЯ рдХреЗ рддреМрд░ рдкрд░ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ.
2. рдПрдЬреЗрдВрдЯ рдХреА рдЬрд╛рдирдХрд╛рд░реА
рдЖрдЗрдП, рджреЗрдЦреЗрдВ рдХрд┐ multimedia_agent.py рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рдХреИрд╕реЗ рдЕрд╕реЗрдВрдмрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
cloudshell edit ~/way-back-home/level_2/backend/agent/multimedia_agent.py
рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рджреЛрдиреЛрдВ рдЪрд░рдгреЛрдВ рд╕реЗ рдЗрдирдкреБрдЯ рдорд┐рд▓рддреЗ рд╣реИрдВ. рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_ORCHESTRATION рдвреВрдВрдвреЗрдВ. рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
sub_agents=[upload_agent, extraction_agent, spanner_agent, summary_agent]
3. рд░реВрдЯ рдПрдЬреЗрдВрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
cloudshell edit ~/way-back-home/level_2/backend/agent/agent.py
рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_ADD_SUBAGENT рдвреВрдВрдвреЗрдВ. рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
sub_agents=[multimedia_agent],
рдЗрд╕ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ, рдЪрд╛рд░ "рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ" рдХреЛ рдПрдХ рдХреЙрд▓ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рдЗрдХрд╛рдИ рдореЗрдВ рдмрдВрдбрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ.
4. рдПрдЬреЗрдВрдЯ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдлрд╝реНрд▓реЛ
рд╣рд░ рдПрдЬреЗрдВрдЯ, рдЕрдкрдиреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╢реЗрдпрд░ рдХрд┐рдП рдЧрдП рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЕрдиреНрдп рдПрдЬреЗрдВрдЯ рдЗрд╕ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдРрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

5. рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЦреЛрд▓реЗрдВ (рдЕрдЧрд░ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдм рднреА рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЗрд╕ рдЪрд░рдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ)
ЁЯСЙЁЯТ╗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ:
cd ~/way-back-home/level_2/
./start_app.sh
ЁЯСЙ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдЬрд╛рдХрд░, Local: http://localhost:5173/ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
6. рдЯреЗрд╕реНрдЯ рдЗрдореЗрдЬ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ
ЁЯСЙ рдЪреИрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ, рдпрд╣рд╛рдВ рджреА рдЧрдИ рдХреЛрдИ рднреА рдлрд╝реЛрдЯреЛ рдЪреБрдиреЗрдВ рдФрд░ рдЙрд╕реЗ рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ:
рдЪреИрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ, рдПрдЬреЗрдВрдЯ рдХреЛ рдЕрдкрдиреЗ рдЦрд╛рд╕ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВ:
Here is the survivor note
рдЗрд╕рдХреЗ рдмрд╛рдж, рдпрд╣рд╛рдВ рдЗрдореЗрдЬ рдЕрдЯреИрдЪ рдХрд░реЗрдВ.


ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрд╕реЗрд╕ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "Ctrl+C" рджрдмрд╛рдПрдВ.
6. GCS рдмрдХреЗрдЯ рдореЗрдВ рдорд▓реНрдЯреАрдореЙрдбрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛
- Google Cloud Console Storage рдЦреЛрд▓реЗрдВ.
- Cloud Storage рдореЗрдВ "рдмрдХреЗрдЯ" рдЪреБрдиреЗрдВ

- рдЕрдкрдирд╛ рдмрдХреЗрдЯ рдЪреБрдиреЗрдВ рдФрд░
mediaрдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.

- рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдЗрдореЗрдЬ рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ.

7. Spanner рдореЗрдВ рдорд▓реНрдЯреАрдореЙрдбрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛ (рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ)
рдпрд╣рд╛рдВ test_photo1 рдХреЗ рд▓рд┐рдП, рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ.
- Google Cloud Console Spanner рдЦреЛрд▓реЗрдВ.
- рдЕрдкрдирд╛ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдЪреБрдиреЗрдВ:
Survivor Network - рдЕрдкрдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдЪреБрдиреЗрдВ:
graph-db - рдмрд╛рдИрдВ рдУрд░ рдореМрдЬреВрдж рд╕рд╛рдЗрдбрдмрд╛рд░ рдореЗрдВ, Spanner Studio рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
ЁЯСЙ Spanner Studio рдореЗрдВ, рдирдП рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдХрд░реЗрдВ:
SELECT
s.name AS Survivor,
s.role AS Role,
b.name AS Biome,
r.name AS FoundResource,
s.created_at
FROM Survivors s
LEFT JOIN SurvivorInBiome sib ON s.survivor_id = sib.survivor_id
LEFT JOIN Biomes b ON sib.biome_id = b.biome_id
LEFT JOIN SurvivorFoundResource sfr ON s.survivor_id = sfr.survivor_id
LEFT JOIN Resources r ON sfr.resource_id = r.resource_id
ORDER BY s.created_at DESC;
рд╣рдо рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рдирддреАрдЬреЗ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

12. рдПрдЬреЗрдВрдЯ рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рдореЗрдореЛрд░реА рдмреИрдВрдХ
1. рдореЗрдореЛрд░реА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ
рдпрд╣ рд╕рд┐рд╕реНрдЯрдо, рджреЛ рддрд░рд╣ рдХреА рдореЗрдореЛрд░реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ. рдЗрд╕рд╕реЗ, рдпрд╣ рддреБрд░рдВрдд рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд╕рдордЭ рдкрд╛рддрд╛ рд╣реИ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реАрдЦреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдпрд╛рдж рд░рдЦ рдкрд╛рддрд╛ рд╣реИ.

2. рдпрд╛рджреЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╖рдп рдХреНрдпрд╛ рд╣реЛрддреЗ рд╣реИрдВ?
рдпрд╛рдж рд░рдЦрдиреЗ рд▓рд╛рдпрдХ рд╡рд┐рд╖рдп, рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЙрди рдХреИрдЯрдЧрд░реА рдХреЛ рддрдп рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдЬреЗрдВрдЯ рдХреЛ рд╕рднреА рдмрд╛рддрдЪреАрдд рдореЗрдВ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП. рдЗрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░рд╣ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓рд┐рдВрдЧ рдХреИрдмрд┐рдиреЗрдЯ рдХреЗ рддреМрд░ рдкрд░ рд╕рдордЭреЗрдВ.
рд╣рдорд╛рд░реЗ рджреЛ рд╡рд┐рд╖рдп:
search_preferences: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЦреЛрдЬрдирд╛ рдкрд╕рдВрдж рд╣реИ- рдХреНрдпрд╛ рд╡реЗ рдХреАрд╡рд░реНрдб рдпрд╛ рд╕рд┐рдореИрдВрдЯрд┐рдХ рд╕рд░реНрдЪ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддреЗ рд╣реИрдВ?
- рд╡реЗ рдЕрдХреНрд╕рд░ рдХреМрдирд╕реА рд╕реНрдХрд┐рд▓/рдмрд╛рдпреЛрдо рдЦреЛрдЬрддреЗ рд╣реИрдВ?
- рдпрд╛рджрджрд╛рд╢реНрдд рдХрд╛ рдЙрджрд╛рд╣рд░рдг: "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЪрд┐рдХрд┐рддреНрд╕рд╛ рд╕реЗ рдЬреБрдбрд╝реА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рд╕рд┐рдореИрдВрдЯрд┐рдХ рд╕рд░реНрдЪ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдкрд╕рдВрдж рд╣реИ"
urgent_needs_context: рд╡реЗ рдХрд┐рди рд╕рдВрдХрдЯреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВ- рд╡реЗ рдХрд┐рди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
- рдЙрдиреНрд╣реЗрдВ рдХрд┐рди рдкреАрдбрд╝рд┐рддреЛрдВ рдХреА рдЪрд┐рдВрддрд╛ рд╣реИ?
- рдореЗрдореЛрд░реА рдХрд╛ рдЙрджрд╛рд╣рд░рдг: "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдЙрддреНрддрд░реА рдХреИрдВрдк рдореЗрдВ рджрд╡рд╛ рдХреА рдХрдореА рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд░рд╣рд╛ рд╣реИ"
3. рдкреБрд░рд╛рдиреА рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рд╡рд┐рд╖рдп рд╕реЗрдЯ рдЕрдк рдХрд░рдирд╛
рдХрд╕реНрдЯрдо рдореЗрдореЛрд░реА рдХреЗ рд╡рд┐рд╖рдпреЛрдВ рд╕реЗ рдпрд╣ рддрдп рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдПрдЬреЗрдВрдЯ рдХреЛ рдХреНрдпрд╛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП. рдЗрдиреНрд╣реЗрдВ рдПрдЬреЗрдВрдЯ рдЗрдВрдЬрди рдХреЛ рдбрд┐рдкреНрд▓реЙрдп рдХрд░рддреЗ рд╕рдордп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ.
ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
cloudshell edit ~/way-back-home/level_2/backend/deploy_agent.py
рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдПрдбрд┐рдЯрд░ рдореЗрдВ ~/way-back-home/level_2/backend/deploy_agent.py рдЦреБрд▓ рдЬрд╛рддрд╛ рд╣реИ.
рд╣рдо рд╕реНрдЯреНрд░рдХреНрдЪрд░ MemoryTopic рдСрдмреНрдЬреЗрдХреНрдЯ рддрдп рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдПрд▓рдПрд▓рдПрдо рдХреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ рдХреМрдирд╕реА рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдиреА рд╣реИ рдФрд░ рд╕реЗрд╡ рдХрд░рдиреА рд╣реИ.
ЁЯСЙрдлрд╝рд╛рдЗрд▓ deploy_agent.py рдореЗрдВ, # TODO: SET_UP_TOPIC рдХреА рдЬрдЧрд╣ рдпрд╣ рдбрд╛рд▓реЗрдВ:
# backend/deploy_agent.py
custom_topics = [
# Topic 1: Survivor Search Preferences
MemoryTopic(
custom_memory_topic=CustomMemoryTopic(
label="search_preferences",
description="""Extract the user's preferences for how they search for survivors. Include:
- Preferred search methods (keyword, semantic, direct lookup)
- Common filters used (biome, role, status)
- Specific skills they value or frequently look for
- Geographic areas of interest (e.g., "forest biome", "mountain outpost")
Example: "User prefers semantic search for finding similar skills."
Example: "User frequently checks for survivors in the Swamp Biome."
""",
)
),
# Topic 2: Urgent Needs Context
MemoryTopic(
custom_memory_topic=CustomMemoryTopic(
label="urgent_needs_context",
description="""Track the user's focus on urgent needs and resource shortages. Include:
- Specific resources they are monitoring (food, medicine, ammo)
- Critical situations they are tracking
- Survivors they are particularly concerned about
Example: "User is monitoring the medicine shortage in the Northern Camp."
Example: "User is looking for a doctor for the injured survivors."
""",
)
)
]
4. рдПрдЬреЗрдВрдЯ рдЗрдВрдЯрд┐рдЧреНрд░реЗрд╢рди
рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реЗрд╡ рдХрд░рдиреЗ рдФрд░ рд╡рд╛рдкрд╕ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдЬреЗрдВрдЯ рдХреЛрдб рдХреЛ рдореЗрдореЛрд░реА рдмреИрдВрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП.
ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
cloudshell edit ~/way-back-home/level_2/backend/agent/agent.py
рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдПрдбрд┐рдЯрд░ рдореЗрдВ ~/way-back-home/level_2/backend/agent/agent.py рдЦреБрд▓ рдЬрд╛рддрд╛ рд╣реИ.
рдПрдЬреЗрдВрдЯ рдмрдирд╛рдирд╛
рдПрдЬреЗрдВрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдо after_agent_callback рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ. рдЗрд╕рд╕реЗ рдпрд╣ рдкрдХреНрдХрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдмрд╛рддрдЪреАрдд рдХреЗ рдмрд╛рдж рд╕реЗрд╢рди рдореЗрдореЛрд░реА рдореЗрдВ рд╕реЗрд╡ рд╣реЛ рдЬрд╛рдПрдВ. add_session_to_memory рдлрд╝рдВрдХреНрд╢рди, рдЪреИрдЯ рдХреЗ рдЬрд╡рд╛рдм рдХреЛ рдзреАрдорд╛ рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ.
ЁЯСЙрдлрд╝рд╛рдЗрд▓ agent.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_ADD_SESSION_MEMORY рдвреВрдВрдвреЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗрдВ рдФрд░ рдЗрд╕рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
async def add_session_to_memory(
callback_context: CallbackContext
) -> Optional[types.Content]:
"""Automatically save completed sessions to memory bank in the background"""
if hasattr(callback_context, "_invocation_context"):
invocation_context = callback_context._invocation_context
if invocation_context.memory_service:
# Use create_task to run this in the background without blocking the response
asyncio.create_task(
invocation_context.memory_service.add_session_to_memory(
invocation_context.session
)
)
logger.info("Scheduled session save to memory bank in background")
рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛
ЁЯСЙрдлрд╝рд╛рдЗрд▓ agent.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_ADD_MEMORY_BANK_TOOL рдвреВрдВрдвреЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗрдВ рдФрд░ рдЗрд╕рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
if USE_MEMORY_BANK:
agent_tools.append(PreloadMemoryTool())
ЁЯСЙрдлрд╝рд╛рдЗрд▓ agent.py рдореЗрдВ, рдЯрд┐рдкреНрдкрдгреА # TODO: REPLACE_ADD_CALLBACK рдвреВрдВрдвреЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗрдВ рдФрд░ рдЗрд╕рдХреА рдЬрдЧрд╣ рдпрд╣ рдХреЛрдб рдбрд╛рд▓реЗрдВ:
after_agent_callback=add_session_to_memory if USE_MEMORY_BANK else None
Vertex AI Session Service рд╕реЗрдЯ рдЕрдк рдХрд░рдирд╛
ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, Cloud Shell Editor рдореЗрдВ рдлрд╝рд╛рдЗрд▓ chat.py рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
cloudshell edit ~/way-back-home/level_2/backend/api/routes/chat.py
ЁЯСЙchat.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, # TODO: REPLACE_VERTEXAI_SERVICES рдЯрд┐рдкреНрдкрдгреА рдвреВрдВрдвреЗрдВ рдФрд░ рдЗрд╕ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:
session_service = VertexAiSessionService(
project=project_id,
location=location,
agent_engine_id=agent_engine_id
)
memory_service = VertexAiMemoryBankService(
project=project_id,
location=location,
agent_engine_id=agent_engine_id
)
4. рд╕реЗрдЯрдЕрдк рдФрд░ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ
рдореЗрдореЛрд░реА рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдПрдЬреЗрдВрдЯ рдХреЛ рдореЗрдореЛрд░реА рдХреЗ рдирдП рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рд╕рд╛рде рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛. рд╕рд╛рде рд╣реА, рдпрд╣ рдкрдХреНрдХрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ.
рд╣рдордиреЗ рдЗрд╕ рдкреНрд░реЛрд╕реЗрд╕ рдХреЛ рдореИрдиреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдИ рд╣реИ.
рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдирд╛
ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдВ:
cd ~/way-back-home/level_2
./deploy_and_update_env.sh
рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпреЗ рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдВ рдХрд░рддреА рд╣реИ:
- рдпрд╣
backend/deploy_agent.pyрдХреЛ рдЪрд▓рд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдПрдЬреЗрдВрдЯ рдФрд░ рдореЗрдореЛрд░реА рдХреЗ рд╡рд┐рд╖рдпреЛрдВ рдХреЛ Vertex AI рдХреЗ рд╕рд╛рде рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ. - рдпрд╣ рдХреБрдХреА, рдирдП Agent Engine рдЖрдИрдбреА рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддреА рд╣реИ.
.envрдлрд╝рд╛рдЗрд▓ рдореЗрдВAGENT_ENGINE_IDрдХреА рдЬрд╛рдирдХрд╛рд░реА рдЕрдкрдиреЗ-рдЖрдк рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ.- рдпрд╣ рдХреБрдХреА рдкрдХреНрдХрд╛ рдХрд░рддреА рд╣реИ рдХрд┐ рдЖрдкрдХреА
.envрдлрд╝рд╛рдЗрд▓ рдореЗрдВUSE_MEMORY_BANK=TRUEрд╕реЗрдЯ рд╣реЛ.
[!IMPORTANT] рдЕрдЧрд░ рдЖрдкрдиреЗ deploy_agent.py рдореЗрдВ custom_topics рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдПрдЬреЗрдВрдЯ рдЗрдВрдЬрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛.
13. рдорд▓реНрдЯреАрдореЙрдбрд▓ рдбреЗрдЯрд╛ рдХреА рдорджрдж рд╕реЗ рдореЗрдореЛрд░реА рдмреИрдВрдХ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛
рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдмреИрдВрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдПрдЬреЗрдВрдЯ рдХреЛ рдХреЛрдИ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕рд┐рдЦрд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд╣ рд╕рднреА рд╕реЗрд╢рди рдореЗрдВ рдмрдиреА рд░рд╣рддреА рд╣реИ рдпрд╛ рдирд╣реАрдВ.
1. рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЦреЛрд▓реЗрдВ (рдЕрдЧрд░ рдЖрдкрдХрд╛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рдЪрд░рдг рдЫреЛрдбрд╝ рджреЗрдВ)
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ, рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ: рдЕрдЧрд░ рдкрд┐рдЫрд▓рд╛ рдЯрд░реНрдорд┐рдирд▓ рдЕрдм рднреА рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ Ctrls+C рджрдмрд╛рдХрд░ рдЙрд╕реЗ рдмрдВрдж рдХрд░реЗрдВ.
ЁЯСЙЁЯТ╗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВ:
cd ~/way-back-home/level_2/
./start_app.sh
ЁЯСЙ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдЬрд╛рдХрд░, Local: http://localhost:5173/ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
2. рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдореЗрдореЛрд░реА рдмреИрдВрдХ рдХреА рдЯреЗрд╕реНрдЯрд┐рдВрдЧ
рдЪреИрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ, рдПрдЬреЗрдВрдЯ рдХреЛ рдЕрдкрдиреЗ рдЦрд╛рд╕ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВ:
"I'm planning a medical rescue mission in the mountains. I need survivors with first aid and climbing skills."
ЁЯСЙ рд▓рдЧрднрдЧ 30 рд╕реЗрдХрдВрдб рддрдХ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░реЗрдВ, рддрд╛рдХрд┐ рдореЗрдореЛрд░реА рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рд╣реЛ рд╕рдХреЗ.
2. рдирдпрд╛ рд╕реЗрд╢рди рд╢реБрд░реВ рдХрд░рдирд╛
рдореМрдЬреВрджрд╛ рдмрд╛рддрдЪреАрдд рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ (рд╢реЙрд░реНрдЯ-рдЯрд░реНрдо рдореЗрдореЛрд░реА) рдХреЛ рдорд┐рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреЗрдЬ рдХреЛ рд░реАрдлрд╝реНрд░реЗрд╢ рдХрд░реЗрдВ.
рдРрд╕рд╛ рд╕рд╡рд╛рд▓ рдкреВрдЫреЗрдВ рдЬреЛ рдЖрдкрдХреЗ рдкрд╣рд▓реЗ рджрд┐рдП рдЧрдП рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛ:
"What kind of missions am I interested in?"
рдЕрдиреБрдорд╛рдирд┐рдд рдЬрд╡рд╛рдм:
"рдЖрдкрдХреА рдкрд┐рдЫрд▓реА рдмрд╛рддрдЪреАрдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рджрд┐рд▓рдЪрд╕реНрдкреА рдЗрди рд╡рд┐рд╖рдпреЛрдВ рдореЗрдВ рд╣реИ:
- рдореЗрдбрд┐рдХрд▓ рд░реЗрд╕реНрдХреНрдпреВ рдорд┐рд╢рди
- рдкрд╣рд╛рдбрд╝реА/рдКрдВрдЪрд╛рдИ рд╡рд╛рд▓реЗ рдЗрд▓рд╛рдХреЛрдВ рдореЗрдВ рдСрдкрд░реЗрд╢рди
- рдЬрд╝рд░реВрд░реА рд╕реНрдХрд┐рд▓: рдкреНрд░рд╛рдердорд┐рдХ рдЗрд▓рд╛рдЬ, рдЪрдврд╝рд╛рдИ
рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрди рд╢рд░реНрддреЛрдВ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рд╕рд░реНрд╡рд╛рдЗрд╡рд░ рдвреВрдБрдврдиреЗ рд╣реИрдВ?"
3. рдЗрдореЗрдЬ рдЕрдкрд▓реЛрдб рдХрд░рдХреЗ рдЯреЗрд╕реНрдЯ рдХрд░рдирд╛
рдХреЛрдИ рдЗрдореЗрдЬ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдкреВрдЫреЗрдВ:
remember this
рдпрд╣рд╛рдВ рджреА рдЧрдИ рдХрд┐рд╕реА рдлрд╝реЛрдЯреЛ рдХреЛ рдЪреБрдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЕрдкрдиреА рдХреЛрдИ рдлрд╝реЛрдЯреЛ рдЪреБрдиреА рдЬрд╛ рд╕рдХрддреА рд╣реИ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЙрд╕реЗ рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
4. Vertex AI Agent Engine рдореЗрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛
Google Cloud Console Agent Engine рдкрд░ рдЬрд╛рдПрдВ
- рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рд╕рдмрд╕реЗ рдКрдкрд░ рдмрд╛рдИрдВ рдУрд░ рдореМрдЬреВрдж рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рд┐рд▓реЗрдХреНрдЯрд░ рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪреБрдирд╛ рд╣реЛ:

- рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реА рдХрдорд╛рдВрдб рд╕реЗ рдЬреЛ рдПрдЬреЗрдВрдЯ рдЗрдВрдЬрди рдЕрднреА рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ
use_memory_bank.sh:
рдЖрдкрдиреЗ рдЕрднреА рдЬреЛ рдПрдЬреЗрдВрдЯ рдЗрдВрдЬрди рдмрдирд╛рдпрд╛ рд╣реИ рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. - рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдП рдЧрдП рдЗрд╕ рдПрдЬреЗрдВрдЯ рдореЗрдВ,
MemoriesрдЯреИрдм рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рд╕рднреА рдпрд╛рджреЗрдВ рджрд┐рдЦреЗрдВрдЧреА.
ЁЯСЙЁЯТ╗ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрд╕реЗрд╕ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ "Ctrl + C" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
ЁЯОЙ рдмрдзрд╛рдИ рд╣реЛ! рдЖрдкрдиреЗ рдЕрднреА-рдЕрднреА рдореЗрдореЛрд░реА рдмреИрдВрдХ рдХреЛ рдЕрдкрдиреЗ рдПрдЬреЗрдВрдЯ рд╕реЗ рдЬреЛрдбрд╝рд╛ рд╣реИ!
14. Cloud Run рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВ
1. рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдирд╛
ЁЯСЙЁЯТ╗ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдВ:
cd ~/way-back-home/level_2
./deploy_cloud_run.sh
рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдпреВрдЖрд░рдПрд▓ рдорд┐рд▓реЗрдЧрд╛. рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдпреВрдЖрд░рдПрд▓ рд╣реИ! 
ЁЯСЙЁЯТ╗ рдпреВрдЖрд░рдПрд▓ рдкрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдХрд░ рдЕрдиреБрдорддрд┐ рджреЗрдВ:
source .env && gcloud run services add-iam-policy-binding survivor-frontend --region $REGION --member=allUsers --role=roles/run.invoker && gcloud run services add-iam-policy-binding survivor-backend --region $REGION --member=allUsers --role=roles/run.invoker
рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдП рдЧрдП рдпреВрдЖрд░рдПрд▓ рдкрд░ рдЬрд╛рдПрдВ. рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд╛рдЗрд╡ рджрд┐рдЦреЗрдЧрд╛!
2. рдмрд┐рд▓реНрдб рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА
cloudbuild.yaml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдХреНрд░рдо рд╕реЗ рдЗрди рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- Backend Build:
backend/Dockerfileрд╕реЗ Docker рдЗрдореЗрдЬ рдмрдирд╛рддрд╛ рд╣реИ. - рдмреИрдХрдПрдВрдб рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВ: рдЗрд╕рд╕реЗ рдмреИрдХрдПрдВрдб рдХрдВрдЯреЗрдирд░ рдХреЛ Cloud Run рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ.
- рдпреВрдЖрд░рдПрд▓ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВ: рдЗрд╕рд╕реЗ рдирдпрд╛ рдмреИрдХрдПрдВрдб рдпреВрдЖрд░рдПрд▓ рдорд┐рд▓рддрд╛ рд╣реИ.
- рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдмрд┐рд▓реНрдб:
- рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддрд╛ рд╣реИ.
- рдпрд╣ React рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдореЗрдВ
VITE_API_URL=рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ.
- рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдЗрдореЗрдЬ: рдпрд╣
frontend/Dockerfileрд╕реЗ Docker рдЗрдореЗрдЬ рдмрдирд╛рддрд╛ рд╣реИ (рд╕реНрдЯреИрдЯрд┐рдХ рдРрд╕реЗрдЯ рдХреЛ рдкреИрдХреЗрдЬ рдХрд░рддрд╛ рд╣реИ). - рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВ: рдЗрд╕рд╕реЗ рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдХрдВрдЯреЗрдирд░ рдбрд┐рдкреНрд▓реЙрдп рд╣реЛрддрд╛ рд╣реИ.
3. рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛
рдмрд┐рд▓реНрдб рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж (рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдорд┐рд▓реЗ рд▓реЙрдЧ рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ), рдкреБрд╖реНрдЯрд┐ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
- Cloud Run Console рдкрд░ рдЬрд╛рдПрдВ.
survivor-frontendрд╕реЗрд╡рд╛ рдвреВрдВрдвреЗрдВ.- рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдпреВрдЖрд░рдПрд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
- рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рдЪрд▓рд╛рдПрдВ, рддрд╛рдХрд┐ рдпрд╣ рдкрдХреНрдХрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдлрд╝реНрд░рдВрдЯрдПрдВрдб, рдмреИрдХрдПрдВрдб рд╕реЗ рдХрдореНрдпреВрдирд┐рдХреЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ.
4. (!рд╕рд┐рд░реНрдлрд╝ рд╡рд░реНрдХрд╢реЙрдк рдореЗрдВ рд╣рд┐рд╕реНрд╕рд╛ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП) рдЕрдкрдиреА рдЬрдЧрд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛
ЁЯСЙЁЯТ╗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреВрд░реА рд╣реЛрдиреЗ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдПрдВ:
cd ~/way-back-home/level_2
./set_level_2.sh
рдЕрдм waybackhome.dev рдЦреЛрд▓реЗрдВ. рдЖрдкрдХреЛ рджрд┐рдЦреЗрдЧрд╛ рдХрд┐ рдЖрдкрдХреА рдЬрдЧрд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЕрдкрдбреЗрдЯ рд╣реЛ рдЧрдИ рд╣реИ. рд▓реЗрд╡рд▓ 2 рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдзрд╛рдИ!

(рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ) 5. рдореИрдиреНрдпреБрдЕрд▓ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ
рдЕрдЧрд░ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рддрд░реАрдХреЗ рд╕реЗ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рд╣реИрдВ рдпрд╛ рдкреНрд░реЛрд╕реЗрд╕ рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрдирд╛ рд╣реИ, рддреЛ cloudbuild.yaml рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ.
cloudbuild.yaml рд▓рд┐рдЦрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ
cloudbuild.yaml рдлрд╝рд╛рдЗрд▓ рд╕реЗ, Google Cloud Build рдХреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреМрдирд╕реЗ рдЪрд░рдг рдкреВрд░реЗ рдХрд░рдиреЗ рд╣реИрдВ.
- steps: рдХреНрд░рдо рд╕реЗ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ рдХреА рд╕реВрдЪреА. рд╣рд░ рдЪрд░рдг, рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ. рдЬреИрд╕реЗ,
docker,gcloud,node,bash). - substitutions: рдРрд╕реЗ рд╡реИрд░рд┐рдПрдмрд▓ рдЬрд┐рдиреНрд╣реЗрдВ рдмрд┐рд▓реНрдб рдЯрд╛рдЗрдо рдкрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
$_REGION). - workspace: рдпрд╣ рдПрдХ рд╢реЗрдпрд░ рдХреА рдЧрдИ рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рд╣реЛрддреА рд╣реИ. рдЗрд╕рдореЗрдВ рдЪрд░рдг, рдлрд╝рд╛рдЗрд▓реЗрдВ рд╢реЗрдпрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ. рдЬреИрд╕реЗ, рд╣рдо
backend_url.txtрд╢реЗрдпрд░ рдХрд░рддреЗ рд╣реИрдВ.
рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдЪрд▓рд╛рдирд╛
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрд┐рдирд╛ рдореИрдиреНрдпреБрдЕрд▓ рддрд░реАрдХреЗ рд╕реЗ рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, gcloud builds submit рдХрдорд╛рдВрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ. рдЖрдкрдХреЛ рдЬрд╝рд░реВрд░реА рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рд╡реИрд▓реНрдпреВ рдкрд╛рд╕ рдХрд░рдиреА рд╣реЛрдЧреА.
# Load your env vars first or replace these values manually
export PROJECT_ID=your-project-id
export REGION=us-central1
gcloud builds submit --config cloudbuild.yaml \
--project "$PROJECT_ID" \
--substitutions _REGION="us-central1",_GOOGLE_API_KEY="",_AGENT_ENGINE_ID="your-agent-id",_USE_MEMORY_BANK="TRUE",_GOOGLE_GENAI_USE_VERTEXAI="TRUE"
15. рдирддреАрдЬрд╛
1. рдЖрдкрдиреЗ рдХреНрдпрд╛ рдмрдирд╛рдпрд╛ рд╣реИ
тЬЕ рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛рдмреЗрд╕: рдиреЛрдб (рд╕рд░реНрд╡рд╛рдЗрд╡рд░, рдХреМрд╢рд▓) рдФрд░ рдХрд┐рдирд╛рд░реЛрдВ (рд╕рдВрдмрдВрдз) рдХреЗ рд╕рд╛рде Spanner
тЬЕ рдПрдЖрдИ рдХреА рдорджрдж рд╕реЗ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛: рдХреАрд╡рд░реНрдб, рд╕рд┐рдореИрдВрдЯрд┐рдХ, рдФрд░ рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рд░реНрдЪ рдХреЗ рд╕рд╛рде рдПрдореНрдмреЗрдбрд┐рдВрдЧ
тЬЕ рдорд▓реНрдЯреАрдореЙрдбрд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди: Gemini рдХреА рдорджрдж рд╕реЗ рдЗрдореЗрдЬ/рд╡реАрдбрд┐рдпреЛ рд╕реЗ рдЗрдХрд╛рдЗрдпрд╛рдВ рдирд┐рдХрд╛рд▓рдирд╛
тЬЕ рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо: ADK рдХреЗ рд╕рд╛рде рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ
тЬЕ рдореЗрдореЛрд░реА рдмреИрдВрдХ: Vertex AI рдХреА рдорджрдж рд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд┐рдЬреАрдХрд░рдг рдХрд░рдирд╛
тЬЕ рдкреНрд░реЛрдбрдХреНрд╢рди рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ: Cloud Run + Agent Engine
2. рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА

3. рдореБрдЦреНрдп рдмрд╛рддреЗрдВ
- рдЧреНрд░рд╛рдлрд╝ рдЖрд░рдПрдЬреА: рдпрд╣ рдЧреНрд░рд╛рдлрд╝ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рд╕рд┐рдореИрдВрдЯрд┐рдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЦреЛрдЬ рдХреА рдЬрд╛ рд╕рдХреЗ
- рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рдкреИрдЯрд░реНрди: рдЬрдЯрд┐рд▓ рдФрд░ рдХрдИ рдЪрд░рдгреЛрдВ рд╡рд╛рд▓реЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рд╕реАрдХреНрд╡реЗрдВрд╢рд┐рдпрд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди
- рдорд▓реНрдЯреАрдореЙрдбрд▓ рдПрдЖрдИ: рдЕрдирд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдореАрдбрд┐рдпрд╛ (рдЗрдореЗрдЬ/рд╡реАрдбрд┐рдпреЛ) рд╕реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдирд╛
- рд╕реНрдЯреЗрдЯрдлрд╝реБрд▓ рдПрдЬреЗрдВрдЯ: Memory Bank рдХреА рдорджрдж рд╕реЗ, рд╕рднреА рд╕реЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЕрдиреБрднрд╡ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
4. рд╡рд░реНрдХрд╢реЙрдк рдХрд╛ рдХреЙрдиреНрдЯреЗрдВрдЯ
- Level0: рдЕрдкрдиреА рдкрд╣рдЪрд╛рди рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ
- Level1: Pinpoint Location
- Level2 This One: Graph RAG, ADK, рдФрд░ Memory Bank рдХреА рдорджрдж рд╕реЗ рдорд▓реНрдЯреАрдореЙрдбрд▓ рдПрдЖрдИ рдПрдЬреЗрдВрдЯ рдмрдирд╛рдирд╛
- Level3: Building an ADK Bi-Directional Streaming Agent
- Level4: рд▓рд╛рдЗрд╡ рдмрд╛рдЗ-рдбрд╛рдпрд░реЗрдХреНрд╢рдирд▓ рдорд▓реНрдЯреА-рдПрдЬреЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо
- Level5: Google ADK, A2A, рдФрд░ Kafka рдХреЗ рд╕рд╛рде рдЗрд╡реЗрдВрдЯ-рдбреНрд░рд┐рд╡рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░