Spaces:
Sleeping
A newer version of the Gradio SDK is available: 6.11.0
Google ADK ํต์ฌ ๊ฐ๋ ์์ ๊ฐ์ด๋
์ด ๋ฌธ์๋ Google Agent Development Kit (ADK)์ ํต์ฌ ๊ฐ๋ ๋ค์ ์ฒด๊ณ์ ์ผ๋ก ์ค๋ช ํฉ๋๋ค. ์ํ ์ฝ๋์์ ์ฌ์ฉ๋ ๋ชจ๋ ์ค์ ์์๋ค์ ์ดํดํ ์ ์๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
๐ ๋ชฉ์ฐจ
- ์ ์ฒด ์ํคํ ์ฒ ๊ฐ์
- Session (์ธ์ )
- State (์ํ)
- Event (์ด๋ฒคํธ)
- Context (์ปจํ ์คํธ)
- Runner (๋ฌ๋)
- Memory (๋ฉ๋ชจ๋ฆฌ)
- Callbacks (์ฝ๋ฐฑ)
- Tools (๋๊ตฌ)
- ํต์ฌ ๊ฐ๋ ๊ฐ์ ๊ด๊ณ
1. ์ ์ฒด ์ํคํ ์ฒ ๊ฐ์
ADK์ ํต์ฌ ์ฒ ํ
ADK๋ "์์ด์ ํธ ๊ฐ๋ฐ์ ์ํํธ์จ์ด ๊ฐ๋ฐ์ฒ๋ผ" ๋ง๋๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ๋ณต์กํ AI ์์ด์ ํธ ์์คํ ์ ๋ชจ๋ํํ๊ณ , ํ ์คํธ ๊ฐ๋ฅํ๋ฉฐ, ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
ํต์ฌ ์ปดํฌ๋ํธ ๋ค์ด์ด๊ทธ๋จ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ์ฌ์ฉ์ (User) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Runner (๋ฌ๋/์ค์ผ์คํธ๋ ์ดํฐ) โ
โ - ์คํ ๋ฃจํ ๊ด๋ฆฌ โ
โ - ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐ ๋ผ์ฐํ
โ
โ - ์๋น์ค ์กฐ์จ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โ
โผ โผ โผ
โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ SessionService โ โ MemoryService โ โ ArtifactService โ
โ (์ธ์
๊ด๋ฆฌ) โ โ (์ฅ๊ธฐ ๊ธฐ์ต) โ โ (ํ์ผ/๋ฐ์ดํฐ) โ
โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Session (์ธ์
) โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ State โ โ Events โ โ Metadata (ID, User) โ โ
โ โ (์ํ) โ โ (์ด๋ฒคํธ๋ค) โ โ โ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Agent (์์ด์ ํธ) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ InvocationContext (ํธ์ถ ์ปจํ
์คํธ) โ โ
โ โ - session, state, services ์ ๊ทผ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโ โ
โ โผ โผ โผ โ
โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โ
โ โ Tools โ โ LLM โ โCallbacksโ โ
โ โ (๋๊ตฌ) โ โ (๋ชจ๋ธ) โ โ (์ฝ๋ฐฑ) โ โ
โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
2. Session (์ธ์ )
๊ฐ๋
Session์ ์ฌ์ฉ์์ ์์ด์ ํธ ๊ฐ์ ๋จ์ผ ๋ํ ์ค๋ ๋๋ฅผ ๋ํ๋ ๋๋ค. ์ ํ ํตํ์ ๋น์ ํ๋ฉด, ํ๋์ ํตํ๊ฐ ํ๋์ ์ธ์ ์ ๋๋ค.
์ฃผ์ ์์ฑ
from google.adk.sessions import Session
# Session์ ์ฃผ์ ์์ฑ
session.id # ์ธ์
๊ณ ์ ID
session.app_name # ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฆ
session.user_id # ์ฌ์ฉ์ ID
session.state # ์ํ ๋์
๋๋ฆฌ (State)
session.events # ์ด๋ฒคํธ ํ์คํ ๋ฆฌ ๋ฆฌ์คํธ
session.last_update_time # ๋ง์ง๋ง ์
๋ฐ์ดํธ ์๊ฐ
SessionService
์ธ์ ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ ์๋น์ค์ ๋๋ค.
from google.adk.sessions import InMemorySessionService
# ์ธ์
์๋น์ค ์์ฑ
session_service = InMemorySessionService()
# ์ ์ธ์
์์ฑ
session = await session_service.create_session(
app_name="my_app",
user_id="user_123",
state={"initial_key": "initial_value"} # ์ด๊ธฐ ์ํ ์ค์ ๊ฐ๋ฅ
)
# ๊ธฐ์กด ์ธ์
์กฐํ
session = await session_service.get_session(
app_name="my_app",
user_id="user_123",
session_id="session_abc"
)
# ์ธ์
๋ชฉ๋ก ์กฐํ
sessions = await session_service.list_sessions(
app_name="my_app",
user_id="user_123"
)
# ์ธ์
์ญ์
await session_service.delete_session(
app_name="my_app",
user_id="user_123",
session_id="session_abc"
)
SessionService ๊ตฌํ์ฒด ์ข ๋ฅ
| ๊ตฌํ์ฒด | ์ ์ฅ ์์น | ์์์ฑ | ์ฉ๋ |
|---|---|---|---|
InMemorySessionService |
๋ฉ๋ชจ๋ฆฌ | โ (์ฑ ์ฌ์์ ์ ์๋ฉธ) | ๊ฐ๋ฐ/ํ ์คํธ |
DatabaseSessionService |
SQL DB | โ | ํ๋ก๋์ |
VertexAISessionService |
Google Cloud | โ | ํด๋ผ์ฐ๋ ๋ฐฐํฌ |
์ธ์ ์๋ช ์ฃผ๊ธฐ
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
โ CREATE โ โโโถ โ UPDATE โ โโโถ โ DELETE โ
โ (์์ฑ) โ โ (์ด๋ฒคํธ ์ถ๊ฐ)โ โ (์ข
๋ฃ) โ
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโ
โ State โ
โ ๋ณ๊ฒฝ โ
โโโโโโโโโโโโโโโ
3. State (์ํ)
๊ฐ๋
State๋ ์ธ์ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํค-๊ฐ ์ ์ฅ์์ ๋๋ค. ์์ด์ ํธ์ "๋ฉ๋ชจ์ฅ" ์ญํ ์ ํ๋ฉฐ, ๋ํ ์ค ํ์ํ ์ ๋ณด๋ฅผ ๊ธฐ์ตํฉ๋๋ค.
State์ ๋ฒ์ (Prefix)
ADK์์ State๋ prefix๋ก ๋ฒ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค:
| Prefix | ๋ฒ์ | ์ค๋ช |
|---|---|---|
| (์์) | ์ธ์ ์ ์ฒด | ๊ธฐ๋ณธ๊ฐ, ์ธ์ ๋์ ์ ์ง |
app: |
์ ํ๋ฆฌ์ผ์ด์ | ๊ฐ์ ์ฑ์ ๋ชจ๋ ์ธ์ ์์ ๊ณต์ |
user: |
์ฌ์ฉ์ | ๊ฐ์ ์ฌ์ฉ์์ ๋ชจ๋ ์ธ์ ์์ ๊ณต์ |
temp: |
ํ์ฌ ํธ์ถ | ํ์ฌ invocation์์๋ง ์ ์ง, ํธ์ถ ์ข ๋ฃ ์ ์ญ์ |
# State ์ฌ์ฉ ์์
ctx.session.state["user_name"] = "ํ๊ธธ๋" # ์ธ์
๋ฒ์
ctx.session.state["app:settings"] = {"theme": "dark"} # ์ฑ ์ ์ฒด ๊ณต์
ctx.session.state["user:preferences"] = {"lang": "ko"} # ์ฌ์ฉ์ ๊ณต์
ctx.session.state["temp:current_step"] = 3 # ํ์ฌ ํธ์ถ๋ง
State ์ฝ๊ธฐ/์ฐ๊ธฐ
1. output_key๋ฅผ ํตํ ์๋ ์ ์ฅ (LlmAgent)
from google.adk.agents import LlmAgent
# ์์ด์ ํธ ์๋ต์ด ์๋์ผ๋ก state['analysis_result']์ ์ ์ฅ๋จ
agent = LlmAgent(
name="Analyzer",
instruction="๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ์ธ์.",
output_key="analysis_result" # โ ์๋ ์ ์ฅ
)
2. Instruction ํ ํ๋ฆฟ์์ ์ฝ๊ธฐ
agent = LlmAgent(
name="Reporter",
instruction="""
์ด์ ๋ถ์ ๊ฒฐ๊ณผ: {analysis_result}
์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ๋ณด๊ณ ์๋ฅผ ์์ฑํ์ธ์.
""" # โ {key} ํ์์ผ๋ก ์๋ ์ฃผ์
)
3. Tool/Callback์์ ์ง์ ์ ๊ทผ
from google.adk.tools import ToolContext
def my_tool(context: ToolContext, query: str) -> dict:
# ์ฝ๊ธฐ
user_name = context.state.get("user_name", "Unknown")
# ์ฐ๊ธฐ (์๋์ผ๋ก state_delta์ ์ถ์ ๋จ)
context.state["last_query"] = query
context.state["query_count"] = context.state.get("query_count", 0) + 1
return {"result": f"Hello {user_name}, processed: {query}"}
โ ๏ธ State ์์ ์ ์ฃผ์์ฌํญ
# โ ์๋ชป๋ ๋ฐฉ๋ฒ: ์ธ์
๊ฐ์ฒด ์ง์ ์์
session = await session_service.get_session(...)
session.state["key"] = "value" # ์ถ์ ๋์ง ์์!
# โ
์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ: Context๋ฅผ ํตํด ์์
def my_callback(context: CallbackContext):
context.state["key"] = "value" # ์๋ ์ถ์ ๋จ
4. Event (์ด๋ฒคํธ)
๊ฐ๋
Event๋ ์ธ์ ๋ด์์ ๋ฐ์ํ๋ ๋ชจ๋ ํ๋์ ๊ธฐ๋ก ๋จ์์ ๋๋ค. ์ฌ์ฉ์ ๋ฉ์์ง, ์์ด์ ํธ ์๋ต, ๋๊ตฌ ํธ์ถ, ์ํ ๋ณ๊ฒฝ ๋ฑ ๋ชจ๋ ๊ฒ์ด ์ด๋ฒคํธ์ ๋๋ค.
Event ๊ตฌ์กฐ
from google.adk.events import Event, EventActions
event = Event(
# ์๋ณ ์ ๋ณด
id="event_123", # ๊ณ ์ ID
invocation_id="inv_456", # ์์ invocation ID
author="MyAgent", # ์์ฑ์ (์์ด์ ํธ๋ช
)
# ๋ด์ฉ
content=types.Content( # ์ค์ ๋ฉ์์ง/๋ฐ์ดํฐ
parts=[types.Part(text="์๋
ํ์ธ์!")]
),
# ์ก์
/๋ณ๊ฒฝ์ฌํญ
actions=EventActions(
state_delta={"key": "value"}, # ์ํ ๋ณ๊ฒฝ
artifact_delta={}, # ์ํฐํฉํธ ๋ณ๊ฒฝ
escalate=False, # ๋ฃจํ ์ข
๋ฃ ์ ํธ
transfer_to_agent="OtherAgent", # ์์ด์ ํธ ์ ํ
),
# ๋ฉํ๋ฐ์ดํฐ
timestamp=1234567890.0,
partial=False, # ์คํธ๋ฆฌ๋ฐ ์ค๊ฐ ๊ฒฐ๊ณผ ์ฌ๋ถ
)
Event ์ ํ
| ์ ํ | ์ค๋ช | ์๋ณ ๋ฐฉ๋ฒ |
|---|---|---|
| ์ฌ์ฉ์ ๋ฉ์์ง | ์ฌ์ฉ์ ์ ๋ ฅ | event.content.role == "user" |
| ํ ์คํธ ์๋ต | ์์ด์ ํธ ํ ์คํธ ์๋ต | event.content.parts[0].text |
| ๋๊ตฌ ํธ์ถ | LLM์ด ๋๊ตฌ ํธ์ถ ์์ฒญ | event.get_function_calls() |
| ๋๊ตฌ ๊ฒฐ๊ณผ | ๋๊ตฌ ์คํ ๊ฒฐ๊ณผ | event.get_function_responses() |
| ์ํ ๋ณ๊ฒฝ | State ์ ๋ฐ์ดํธ | event.actions.state_delta |
| ์คํธ๋ฆฌ๋ฐ ์ฒญํฌ | ๋ถ๋ถ ์๋ต | event.partial == True |
EventActions
์ด๋ฒคํธ์ ์ฐ๊ฒฐ๋ **๋ถ์ ํจ๊ณผ(side effects)**๋ฅผ ์ ์ํฉ๋๋ค:
from google.adk.events import EventActions
actions = EventActions(
# ์ํ ๋ณ๊ฒฝ
state_delta={"new_key": "new_value"},
# ๋ฃจํ ์ข
๋ฃ ์ ํธ (LoopAgent์์ ์ฌ์ฉ)
escalate=True,
# ์์ด์ ํธ ์ ํ (LLM Transfer)
transfer_to_agent="TargetAgentName",
# ์ํฐํฉํธ(ํ์ผ) ๋ณ๊ฒฝ
artifact_delta={"file.txt": "content"},
)
Event ์ฒ๋ฆฌ ํ๋ฆ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Event ์์ฑ ๋ฐ ์ฒ๋ฆฌ ํ๋ฆ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1. Event ์์ฑ
Agent/Tool/Callback โ yield Event(...)
2. Runner ์์
Runner๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์
3. SessionService ์ฒ๋ฆฌ
- state_delta๋ฅผ session.state์ ๋ณํฉ
- artifact_delta ์ฒ๋ฆฌ
- events ํ์คํ ๋ฆฌ์ ์ถ๊ฐ
4. ํด๋ผ์ด์ธํธ ์ ๋ฌ
- UI/API๋ก ์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ
5. Context (์ปจํ ์คํธ)
๊ฐ๋
Context๋ ํ์ฌ ์คํ ์ํฉ์ ๋ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ด์ ์ปจํ ์ด๋์ ๋๋ค. ์์ด์ ํธ, ๋๊ตฌ, ์ฝ๋ฐฑ์ด ์คํ๋ ๋ ํ์ํ ๋ชจ๋ ์ ๋ณด์ ์ ๊ทผํ ์ ์๊ฒ ํฉ๋๋ค.
Context ์ ํ
1. InvocationContext (ํธ์ถ ์ปจํ ์คํธ)
๊ฐ์ฅ ์์ ๋ ๋ฒจ์ ์ปจํ ์คํธ๋ก, ํ๋์ ์ฌ์ฉ์ ์์ฒญ ์ฒ๋ฆฌ ์ ์ฒด๋ฅผ ๊ด์ฅํฉ๋๋ค.
from google.adk.agents import BaseAgent
from google.adk.agents.invocation_context import InvocationContext
class MyAgent(BaseAgent):
async def _run_async_impl(self, ctx: InvocationContext):
# ์ธ์
์ ๋ณด ์ ๊ทผ
session_id = ctx.session.id
user_id = ctx.session.user_id
# ์ํ ์ ๊ทผ
state_value = ctx.session.state.get("key")
# ์๋น์ค ์ ๊ทผ
memory_service = ctx.memory_service
artifact_service = ctx.artifact_service
# ํ์ฌ ์์ด์ ํธ ์ ๋ณด
agent_name = ctx.agent.name
# ํธ์ถ ์ ์ด
ctx.end_invocation = True # ํธ์ถ ์ข
๋ฃ ์ ํธ
yield Event(author=self.name, content=...)
2. CallbackContext (์ฝ๋ฐฑ ์ปจํ ์คํธ)
์ฝ๋ฐฑ ํจ์์์ ์ฌ์ฉ๋๋ฉฐ, InvocationContext์ ์๋ธ์ ์ ๋๋ค.
from google.adk.agents.callback_context import CallbackContext
def my_before_agent_callback(ctx: CallbackContext):
# ์์ด์ ํธ ์ ๋ณด
agent_name = ctx.agent_name
invocation_id = ctx.invocation_id
# ์ํ ์ฝ๊ธฐ/์ฐ๊ธฐ
ctx.state["processed"] = True
# ์ฌ์ฉ์ ์
๋ ฅ ํ์ธ
user_content = ctx.user_content
return None # ๊ณ์ ์งํ (๋๋ Content ๋ฐํ ์ ์์ด์ ํธ ๊ฑด๋๋)
3. ToolContext (๋๊ตฌ ์ปจํ ์คํธ)
๋๊ตฌ(Tool) ํจ์์์ ์ฌ์ฉ๋๋ฉฐ, ๋๊ตฌ ์คํ์ ํ์ํ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
from google.adk.tools import ToolContext
def my_tool(context: ToolContext, query: str) -> dict:
# ์ํ ์ ๊ทผ (CallbackContext์ ๋์ผ)
context.state["last_query"] = query
# ๋๊ตฌ ์ ์ฉ ๊ธฐ๋ฅ
function_call_id = context.function_call_id # ํ์ฌ ํจ์ ํธ์ถ ID
# ๋ฉ๋ชจ๋ฆฌ ๊ฒ์
results = await context.search_memory("๊ฒ์์ด")
# ์ํฐํฉํธ ๋ชฉ๋ก
artifacts = context.list_artifacts()
# ์ธ์ฆ ์์ฒญ (OAuth ๋ฑ)
credential = await context.get_auth_response(auth_config)
return {"result": "success"}
Context ๊ณ์ธต ๊ตฌ์กฐ
InvocationContext (์ต์์)
โโโ session
โ โโโ state
โ โโโ events
โโโ agent (ํ์ฌ ์์ด์ ํธ)
โโโ services (memory, artifact, session)
โโโ invocation_id
โผ ํ์
CallbackContext (์ฝ๋ฐฑ์ฉ)
โโโ state (์ฝ๊ธฐ/์ฐ๊ธฐ)
โโโ agent_name
โโโ user_content
โโโ invocation_id
โผ ํ์ฅ
ToolContext (๋๊ตฌ์ฉ)
โโโ (CallbackContext์ ๋ชจ๋ ๊ฒ)
โโโ function_call_id
โโโ search_memory()
โโโ list_artifacts()
โโโ request_credential()
6. Runner (๋ฌ๋)
๊ฐ๋
Runner๋ ์์ด์ ํธ ์คํ์ ์ค์ ์ค์ผ์คํธ๋ ์ดํฐ์ ๋๋ค. ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ์ ์์ด์ ํธ๋ฅผ ์คํํ๊ณ , ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ, ์๋น์ค๋ค์ ์กฐ์จํฉ๋๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
from google.adk.runners import InMemoryRunner, Runner
from google.adk.sessions import InMemorySessionService
# ๋ฐฉ๋ฒ 1: InMemoryRunner (๊ฐ๋จํ ํ
์คํธ์ฉ)
runner = InMemoryRunner(
agent=my_agent,
app_name="my_app"
)
# ๋ฐฉ๋ฒ 2: Runner (์ปค์คํฐ๋ง์ด์ง ํ์ ์)
session_service = InMemorySessionService()
runner = Runner(
agent=my_agent,
app_name="my_app",
session_service=session_service,
# memory_service=my_memory_service, # ์ต์
# artifact_service=my_artifact_service, # ์ต์
)
์์ด์ ํธ ์คํ
# ๋น๋๊ธฐ ์คํ (์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ)
async for event in runner.run_async(
user_id="user_123",
session_id="session_456", # ์ ์ธ์
์ด๋ฉด ์๋ ์์ฑ
new_message="์๋
ํ์ธ์!"
):
if event.content and event.content.parts:
for part in event.content.parts:
if hasattr(part, 'text') and part.text:
print(f"[{event.author}]: {part.text}")
# ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ (์์ฑ/์์)
async for event in runner.run_live(...):
...
Runner ์คํ ํ๋ฆ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Runner.run_async() ํ๋ฆ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1. ์ธ์
์ค๋น
โโโโโโโโโโโโโโโโโโโ
โ get/create โ โ ์ธ์
์กฐํ ๋๋ ์์ฑ
โ Session โ
โโโโโโโโโโโโโโโโโโโ
โ
โผ
2. ์ฌ์ฉ์ ๋ฉ์์ง๋ฅผ ์ด๋ฒคํธ๋ก ์ถ๊ฐ
โโโโโโโโโโโโโโโโโโโ
โ append_event โ โ ์ฌ์ฉ์ ์
๋ ฅ์ ์ธ์
ํ์คํ ๋ฆฌ์ ์ถ๊ฐ
โ (user message) โ
โโโโโโโโโโโโโโโโโโโ
โ
โผ
3. InvocationContext ์์ฑ
โโโโโโโโโโโโโโโโโโโ
โ Create โ โ ์คํ์ ํ์ํ ๋ชจ๋ ์ ๋ณด ์ค๋น
โ InvocationContextโ
โโโโโโโโโโโโโโโโโโโ
โ
โผ
4. ์์ด์ ํธ ์คํ ๋ฃจํ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ Agent.run() โ โ ์์ด์ ํธ ์คํ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ yield Event โ โ ์ด๋ฒคํธ ์์ฑ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ Process Event โ โ ์ด๋ฒคํธ ์ฒ๋ฆฌ โ
โ โ - state_delta โ (์ํ ์
๋ฐ์ดํธ ๋ฑ) โ
โ โ - append to โ โ
โ โ session โ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ yield to caller โ โ ํธ์ถ์์๊ฒ ์ ๋ฌ โ
โ โโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โผ โ
โ [๋ ๋ง์ ์ด๋ฒคํธ?] โโYesโโโถ (๋ฐ๋ณต) โ
โ โ โ
โ No โ
โ โ โ
โโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
5. ์คํ ์๋ฃ
Invocation vs Agent Call vs Step
Invocation (ํธ์ถ)
โ ์ฌ์ฉ์ ๋ฉ์์ง โ ์ต์ข
์๋ต๊น์ง์ ์ ์ฒด ์ฌ์ดํด
โ
โโโ Agent Call 1 (์์ด์ ํธ ํธ์ถ)
โ โ ํ๋์ ์์ด์ ํธ๊ฐ ์คํ๋๋ ๋จ์
โ โ
โ โโโ Step 1 (์คํ
)
โ โ โโโ LLM ํธ์ถ 1ํ + ๋๊ตฌ ์คํ
โ โ
โ โโโ Step 2
โ โ โโโ LLM ํธ์ถ 1ํ + ๋๊ตฌ ์คํ
โ โ
โ โโโ (transfer_to_agent ๋ฐ์)
โ
โโโ Agent Call 2 (๋ค๋ฅธ ์์ด์ ํธ๋ก ์ ํ)
โ โ
โ โโโ Step 1
โ โ โโโ LLM ํธ์ถ + ์ต์ข
์๋ต
โ โ
โ โโโ (์๋ฃ)
โ
โโโ Invocation ์ข
๋ฃ
7. Memory (๋ฉ๋ชจ๋ฆฌ)
๊ฐ๋
Memory๋ ์ฅ๊ธฐ ๊ธฐ์ต ์ ์ฅ์์ ๋๋ค. ์ธ์ ์ด ์ข ๋ฃ๋ ํ์๋ ์ ์ง๋๋ฉฐ, ์ฌ๋ฌ ์ธ์ ์ ๊ฑธ์ณ ์ ๋ณด๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
Session State vs Memory ๋น๊ต
| ํน์ฑ | Session State | Memory |
|---|---|---|
| ๋ฒ์ | ํ์ฌ ์ธ์ ๋ด | ์ฌ๋ฌ ์ธ์ ๊ฑธ์ณ |
| ์๋ช | ์ธ์ ์ข ๋ฃ ์ (๋ณดํต) ์ญ์ | ์๊ตฌ ์ ์ฅ |
| ์ ๊ทผ ๋ฐฉ์ | Key-Value ์ง์ ์ ๊ทผ | ๊ฒ์ ์ฟผ๋ฆฌ |
| ์ฉ๋ | ๋ํ ์ค ์์ ๋ฐ์ดํฐ | ๊ณผ๊ฑฐ ์ ๋ณด ์ฐธ์กฐ |
| ๋น์ | ๋ํ ์ค ๋ฉ๋ชจ์ฅ | ๋์๊ด ์์นด์ด๋ธ |
MemoryService ์ฌ์ฉ
from google.adk.memory import InMemoryMemoryService
# ๋ฉ๋ชจ๋ฆฌ ์๋น์ค ์์ฑ
memory_service = InMemoryMemoryService()
# ์ธ์
์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ (๋ํ ์ข
๋ฃ ํ)
await memory_service.add_session_to_memory(session)
# ๋ฉ๋ชจ๋ฆฌ ๊ฒ์
results = await memory_service.search_memory(
app_name="my_app",
user_id="user_123",
query="์ด์ ์ ์ถ์ฒ๋ฐ์ ์์์ "
)
for result in results.memories:
print(result.content)
MemoryService ๊ตฌํ์ฒด
| ๊ตฌํ์ฒด | ์ ์ฅ ๋ฐฉ์ | ๊ฒ์ ๋ฐฉ์ | ์ฉ๋ |
|---|---|---|---|
InMemoryMemoryService |
๋ฉ๋ชจ๋ฆฌ | ํค์๋ ๋งค์นญ | ๊ฐ๋ฐ/ํ ์คํธ |
VertexAIMemoryBankService |
Vertex AI | ์๋งจํฑ ๊ฒ์ | ํ๋ก๋์ |
๋ฉ๋ชจ๋ฆฌ ์ํฌํ๋ก์ฐ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Memory ์ํฌํ๋ก์ฐ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1. ์ธ์
๋ํ ์งํ
User โ Agent (Session์ Events ์ถ์ )
2. ์ธ์
์ข
๋ฃ ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ
memory_service.add_session_to_memory(session)
โโโ ์ธ์
์ ์ฃผ์ ์ ๋ณด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ
3. ์ดํ ์ธ์
์์ ๋ฉ๋ชจ๋ฆฌ ๊ฒ์
results = memory_service.search_memory(query)
โโโ ๊ณผ๊ฑฐ ๋ํ์์ ๊ด๋ จ ์ ๋ณด ๊ฒ์
4. ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ฌ ๋ํ์ ํ์ฉ
Agent๊ฐ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์๋ต
์์ด์ ํธ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
from google.adk.tools import preload_memory_tool
# ๋ฉ๋ชจ๋ฆฌ ๊ฒ์ ๋๊ตฌ ์ถ๊ฐ
agent = LlmAgent(
name="MemoryAgent",
instruction="์ฌ์ฉ์์ ๊ณผ๊ฑฐ ๋ํ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋ต๋ณํ์ธ์.",
tools=[preload_memory_tool.PreloadMemoryTool()]
)
# ์ธ์
์ข
๋ฃ ์ ์๋ ์ ์ฅ ์ฝ๋ฐฑ
async def auto_save_to_memory(callback_context):
await callback_context._invocation_context.memory_service.add_session_to_memory(
callback_context._invocation_context.session
)
agent = LlmAgent(
name="AutoSaveAgent",
after_agent_callback=auto_save_to_memory
)
8. Callbacks (์ฝ๋ฐฑ)
๊ฐ๋
Callback์ ์์ด์ ํธ ์คํ ์ค ํน์ ์์ ์ ๊ฐ์ ํ ์ ์๋ ํ (hook)์ ๋๋ค. ๊ฐ๋๋ ์ผ, ๋ก๊น , ์์ ๋ฑ ๋ค์ํ ์ฉ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์ฝ๋ฐฑ ์ข ๋ฅ ๋ฐ ์คํ ์์
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ์ฝ๋ฐฑ ์คํ ์์ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
์ฌ์ฉ์ ์
๋ ฅ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ before_agent_callback โ โ ์์ด์ ํธ ์คํ ์
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ before_model_callback โ โ LLM ํธ์ถ ์
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
[LLM ํธ์ถ]
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ after_model_callback โ โ LLM ์๋ต ํ
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ before_tool_callback โ โ ๋๊ตฌ ์คํ ์
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
[๋๊ตฌ ์คํ]
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ after_tool_callback โ โ ๋๊ตฌ ์คํ ํ
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ after_agent_callback โ โ ์์ด์ ํธ ์คํ ํ
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
์ต์ข
์๋ต
์ฝ๋ฐฑ ์ ์ ๋ฐ ์ฌ์ฉ
before_agent_callback
from google.adk.agents import LlmAgent
from google.adk.agents.callback_context import CallbackContext
from google.genai import types
def check_access(ctx: CallbackContext) -> types.Content | None:
"""์์ด์ ํธ ์คํ ์ ์ ๊ทผ ์ ์ด"""
user_id = ctx.session.user_id
# ์ฐจ๋จํ ์ฌ์ฉ์ ์ฒดํฌ
if user_id in BLOCKED_USERS:
# Content ๋ฐํ ์ ์์ด์ ํธ ์คํ ๊ฑด๋๋
return types.Content(
parts=[types.Part(text="์ ๊ทผ์ด ๊ฑฐ๋ถ๋์์ต๋๋ค.")]
)
# None ๋ฐํ ์ ์ ์ ์งํ
return None
agent = LlmAgent(
name="SecureAgent",
before_agent_callback=check_access
)
before_model_callback (๊ฐ๋๋ ์ผ)
from google.adk.models import LlmRequest, LlmResponse
def content_guardrail(ctx: CallbackContext, request: LlmRequest) -> LlmResponse | None:
"""LLM ํธ์ถ ์ ์
๋ ฅ ๊ฒ์ฌ"""
user_text = ctx.user_content.parts[0].text
# ๊ธ์ง์ด ์ฒดํฌ
if any(word in user_text for word in FORBIDDEN_WORDS):
return LlmResponse(
content=types.Content(
parts=[types.Part(text="๋ถ์ ์ ํ ๋ด์ฉ์ด ๊ฐ์ง๋์์ต๋๋ค.")]
)
)
# ํ๋กฌํํธ ์์
# request.contents๋ฅผ ์์ ํ์ฌ ์์คํ
์ง์ ์ถ๊ฐ ๊ฐ๋ฅ
return None # ์ ์ ์งํ
agent = LlmAgent(
name="GuardedAgent",
before_model_callback=content_guardrail
)
after_model_callback
def post_process_response(ctx: CallbackContext, response: LlmResponse) -> LlmResponse | None:
"""LLM ์๋ต ํ์ฒ๋ฆฌ"""
# ์๋ต ๋ก๊น
print(f"LLM Response: {response.content}")
# ์๋ต ์์ (ํ์์)
# return modified_response
return None # ์๋ณธ ์๋ต ์ ์ง
agent = LlmAgent(
name="LoggingAgent",
after_model_callback=post_process_response
)
before_tool_callback / after_tool_callback
def tool_guardrail(ctx: ToolContext, tool_name: str, args: dict) -> dict | None:
"""๋๊ตฌ ์คํ ์ ๊ฒ์ฌ"""
if tool_name == "delete_file" and not ctx.state.get("admin"):
return {"error": "๊ถํ์ด ์์ต๋๋ค."} # ๋๊ตฌ ์คํ ๊ฑด๋๋
return None
def log_tool_result(ctx: ToolContext, tool_name: str, result: dict) -> dict | None:
"""๋๊ตฌ ์คํ ํ ๋ก๊น
"""
print(f"Tool {tool_name} returned: {result}")
return None # ๊ฒฐ๊ณผ ์ ์ง
agent = LlmAgent(
name="ToolAuditAgent",
before_tool_callback=tool_guardrail,
after_tool_callback=log_tool_result
)
์ฝ๋ฐฑ ๋ฐํ๊ฐ์ ์๋ฏธ
| ์ฝ๋ฐฑ | ๋ฐํ๊ฐ | ํจ๊ณผ |
|---|---|---|
| before_agent | None |
์์ด์ ํธ ์ ์ ์คํ |
| before_agent | Content |
์์ด์ ํธ ๊ฑด๋๋, ๋ฐํ๋ Content ์ฌ์ฉ |
| before_model | None |
LLM ์ ์ ํธ์ถ |
| before_model | LlmResponse |
LLM ํธ์ถ ๊ฑด๋๋, ๋ฐํ๋ ์๋ต ์ฌ์ฉ |
| before_tool | None |
๋๊ตฌ ์ ์ ์คํ |
| before_tool | dict |
๋๊ตฌ ์คํ ๊ฑด๋๋, ๋ฐํ๋ ๊ฒฐ๊ณผ ์ฌ์ฉ |
9. Tools (๋๊ตฌ)
๊ฐ๋
Tool์ ์์ด์ ํธ์๊ฒ ์ธ๋ถ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ปดํฌ๋ํธ์ ๋๋ค. API ํธ์ถ, ๊ณ์ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ ๋ฑ์ ์ํํ ์ ์์ต๋๋ค.
Tool ์ ํ
1. FunctionTool (ํจ์ ๋๊ตฌ)
Python ํจ์๋ฅผ ๋๊ตฌ๋ก ๋ณํํฉ๋๋ค.
from google.adk.tools import FunctionTool
def get_weather(city: str, unit: str = "celsius") -> dict:
"""
ํน์ ๋์์ ๋ ์จ๋ฅผ ์กฐํํฉ๋๋ค.
Args:
city: ์กฐํํ ๋์ ์ด๋ฆ
unit: ์จ๋ ๋จ์ (celsius ๋๋ fahrenheit)
Returns:
๋ ์จ ์ ๋ณด ๋์
๋๋ฆฌ
"""
# ์ค์ API ํธ์ถ ๋๋ ์๋ฎฌ๋ ์ด์
return {"city": city, "temp": 20, "unit": unit}
# ํจ์๋ฅผ ๋๊ตฌ๋ก ๋ณํ
weather_tool = FunctionTool(func=get_weather)
# ์์ด์ ํธ์ ๋๊ตฌ ์ถ๊ฐ
agent = LlmAgent(
name="WeatherAgent",
tools=[weather_tool]
)
2. AgentTool (์์ด์ ํธ๋ฅผ ๋๊ตฌ๋ก)
๋ค๋ฅธ ์์ด์ ํธ๋ฅผ ๋๊ตฌ์ฒ๋ผ ํธ์ถํ ์ ์์ต๋๋ค.
from google.adk.tools import agent_tool
# ์ ๋ฌธ ์์ด์ ํธ ์ ์
translator = LlmAgent(
name="Translator",
description="ํ
์คํธ๋ฅผ ๋ฒ์ญํฉ๋๋ค."
)
# ์์ด์ ํธ๋ฅผ ๋๊ตฌ๋ก ๋ํ
translator_tool = agent_tool.AgentTool(agent=translator)
# ๋ค๋ฅธ ์์ด์ ํธ์์ ๋๊ตฌ๋ก ์ฌ์ฉ
main_agent = LlmAgent(
name="MainAgent",
tools=[translator_tool]
)
ToolContext ํ์ฉ
๋๊ตฌ ํจ์ ๋ด์์ Context์ ์ ๊ทผํ์ฌ ๋ค์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
from google.adk.tools import ToolContext
def advanced_tool(context: ToolContext, query: str) -> dict:
# 1. ์ํ ์ฝ๊ธฐ/์ฐ๊ธฐ
context.state["last_query"] = query
previous = context.state.get("history", [])
# 2. ๋ฉ๋ชจ๋ฆฌ ๊ฒ์
memory_results = await context.search_memory(query)
# 3. ์ํฐํฉํธ ๋ชฉ๋ก ์กฐํ
artifacts = context.list_artifacts()
# 4. ์ธ์ฆ ์ฒ๋ฆฌ
if needs_auth:
cred = await context.get_auth_response(oauth_config)
return {"result": "processed"}
๋๊ตฌ ์คํ ํ๋ฆ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๋๊ตฌ ์คํ ํ๋ฆ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1. LLM์ด ๋๊ตฌ ํธ์ถ ๊ฒฐ์
LLM Response: FunctionCall(name="get_weather", args={"city": "์์ธ"})
2. ADK๊ฐ ๋๊ตฌ ์ฐพ๊ธฐ
tools ๋ชฉ๋ก์์ "get_weather" ์ฐพ์
3. before_tool_callback ์คํ (์์ผ๋ฉด)
๊ฐ๋๋ ์ผ, ๋ก๊น
๋ฑ
4. ๋๊ตฌ ํจ์ ์คํ
result = get_weather(city="์์ธ")
5. after_tool_callback ์คํ (์์ผ๋ฉด)
๊ฒฐ๊ณผ ํ์ฒ๋ฆฌ, ๋ก๊น
๋ฑ
6. FunctionResponse ์ด๋ฒคํธ ์์ฑ
Event(content=FunctionResponse(name="get_weather", response=result))
7. LLM์๊ฒ ๊ฒฐ๊ณผ ์ ๋ฌ
LLM์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ๋ค์ ์๋ต ์์ฑ
10. ํต์ฌ ๊ฐ๋ ๊ฐ์ ๊ด๊ณ
์ ์ฒด ๊ด๊ณ๋
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ADK ํต์ฌ ๊ฐ๋
๊ด๊ณ๋ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโ
โ Runner โ
โ (์ค์ผ์คํธ๋ ์ดํฐ) โ
โโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโ
โผ โผ โผ
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
โ SessionSvc โ โ MemorySvc โ โ ArtifactSvc โ
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
โ โ
โผ โ
โโโโโโโโโโโโโโโโโโโ โ
โ Session โ โ
โ โโโโโโโโโโโโโ โ โ
โ โ State โโโโผโโโโโโโผโโโโ ์์ด์ ํธ๊ฐ ์ฝ๊ณ /์
โ โโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโ โ โ
โ โ Events โ โ โ
โ โโโโโโโโโโโโโ โ โ
โโโโโโโโโโโโโโโโโโโ โ
โ โ
โผ โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ InvocationContext โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ session, state, services, agent โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโ
โผ โผ โผ
โโโโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ
โ Callbacks โ โ Agent โ โ Tools โ
โ โ โ โ โ โ
โ Callback โ โ โ โ Tool โ
โ Context โ โ โ โ Context โ
โโโโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ
โ โ โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโ
โ Event โ
โ โโโโโโโโ โ
โ โActionsโ โโโถ state_delta
โ โโโโโโโโ โ escalate
โโโโโโโโโโโโโโ transfer
๋ฐ์ดํฐ ํ๋ฆ ์์ฝ
1. ์ฌ์ฉ์ ์
๋ ฅ
โโโโถ Runner.run_async(message)
2. ์ธ์
์ค๋น
โโโโถ SessionService.get_session() โ Session
3. ์ปจํ
์คํธ ์์ฑ
โโโโถ InvocationContext(session, services, ...)
4. ์ฝ๋ฐฑ ์คํ
โโโโถ before_agent_callback(CallbackContext)
5. ์์ด์ ํธ ์คํ
โโโโถ Agent.run(InvocationContext)
โ
โโโโถ before_model_callback
โโโโถ LLM ํธ์ถ
โโโโถ after_model_callback
โ
โโโโถ [๋๊ตฌ ํธ์ถ ์]
โ โโโโถ before_tool_callback
โ โโโโถ Tool ์คํ(ToolContext)
โ โโโโถ after_tool_callback
โ
โโโโถ yield Event
6. ์ด๋ฒคํธ ์ฒ๋ฆฌ
โโโโถ SessionService.append_event(event)
โโโโถ state_delta ์ ์ฉ
โโโโถ events ํ์คํ ๋ฆฌ ์ถ๊ฐ
7. ์ฝ๋ฐฑ ์คํ
โโโโถ after_agent_callback(CallbackContext)
8. ๊ฒฐ๊ณผ ๋ฐํ
โโโโถ yield event to caller
ํต์ฌ ํฌ์ธํธ ์ ๋ฆฌ
| ๊ฐ๋ | ์ญํ | ๋น์ |
|---|---|---|
| Session | ๋ํ ์ปจํ ์ด๋ | ์ ํ ํตํ ํ ๊ฑด |
| State | ๋ํ ์ค ๋ฉ๋ชจ | ๋ฉ๋ชจ์ฅ/์คํฌ๋์นํจ๋ |
| Event | ํ๋ ๊ธฐ๋ก ๋จ์ | ๋ํ ๊ธฐ๋ก์ ํ ์ค |
| Context | ์คํ ์ ๋ณด ๋ฌถ์ | ์ ๋ฌด ๋ฌธ๋งฅ/๋ฐฐ๊ฒฝ ์ ๋ณด |
| Runner | ์คํ ์กฐ์จ์ | ์งํ์ |
| Memory | ์ฅ๊ธฐ ๊ธฐ์ต | ๋์๊ด ์์นด์ด๋ธ |
| Callback | ์คํ ์ค ๊ฐ์ ์ | ์ฒดํฌํฌ์ธํธ/๊ด๋ฌธ |
| Tool | ์ธ๋ถ ๊ธฐ๋ฅ | ๋๊ตฌ ์์ |
๋ถ๋ก: ์์ฃผ ๋ฌป๋ ์ง๋ฌธ (FAQ)
Q1: State์ Memory์ ์ฐจ์ด๋?
- State: ํ์ฌ ์ธ์ ๋ด์์๋ง ์ ํจ, ํค-๊ฐ ์ง์ ์ ๊ทผ
- Memory: ์ฌ๋ฌ ์ธ์ ์ ๊ฑธ์ณ ์ ์ง, ๊ฒ์ ์ฟผ๋ฆฌ๋ก ์ ๊ทผ
Q2: output_key๊ฐ ์์ผ๋ฉด ์ด๋ป๊ฒ ๋๋์?
์์ด์ ํธ์ ์๋ต์ด state์ ์๋ ์ ์ฅ๋์ง ์์ต๋๋ค. ๋ค์ ์์ด์ ํธ์์ ์ด์ ์๋ต์ ์ฐธ์กฐํ๋ ค๋ฉด output_key๋ฅผ ์ค์ ํ๊ฑฐ๋, ์ง์ ์ฝ๋ฐฑ/๋๊ตฌ์์ state๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
Q3: InMemorySessionService๋ ํ๋ก๋์ ์์ ์ธ ์ ์๋์?
๊ถ์ฅํ์ง ์์ต๋๋ค. ์ฑ ์ฌ์์ ์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์์ค๋ฉ๋๋ค. ํ๋ก๋์ ์์๋ Database-backed ๋๋ Cloud-based ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ์ธ์.
Q4: ์ฝ๋ฐฑ์์ Content๋ฅผ ๋ฐํํ๋ฉด ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์?
before_agent_callback์์ Content๋ฅผ ๋ฐํํ๋ฉด ์์ด์ ํธ ์คํ์ด ๊ฑด๋๋ฐ์ด์ง๊ณ , ๋ฐํ๋ Content๊ฐ ์์ด์ ํธ์ ์๋ต์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์กฐ๊ฑด๋ถ ๋จ์ถ(short-circuit)์ ๊ตฌํํ ์ ์์ต๋๋ค.
Q5: LoopAgent์ escalate๋ ์ด๋ป๊ฒ ๋์ํ๋์?
sub_agent๊ฐ Event๋ฅผ ์์ฑํ ๋ actions=EventActions(escalate=True)๋ฅผ ์ค์ ํ๋ฉด,
LoopAgent๊ฐ ์ด๋ฅผ ๊ฐ์งํ๊ณ ์ฆ์ ๋ฃจํ๋ฅผ ์ข
๋ฃํฉ๋๋ค.
max_iterations์ ๋๋ฌํ๊ธฐ ์ ์ ์กฐ๊ฑด๋ถ๋ก ์ข
๋ฃํ ๋ ์ฌ์ฉํฉ๋๋ค.