Google

Google (Gemini)

구글의 Gemini 모델을 쓰려면 GoogleModel을 쓰면 돼요. 이 모델은 내부적으로 google-genai 패키지를 사용해서, Gemini API와 Google Cloud(구 Vertex AI) 양쪽을 통해 Gemini 모델에 접근해요. 두 엔드포인트를 감싸는 provider가 따로 있어서, 목적에 맞게 골라 쓸 수 있어요.

출처: 공식문서

그 두 provider는 이렇게 나뉘어요.

  • GoogleProvider — Gemini API(Google AI Studio)이며 'google:' 프리픽스로 노출돼요.
  • GoogleCloudProvider — Google Cloud(구 Vertex AI)이며 'google-cloud:' 프리픽스로 노출돼요.

설치

GoogleModel을 쓰려면 pydantic-ai를 설치하거나 pydantic-ai-slimgoogle 옵션 그룹과 함께 설치해야 해요.

Terminal

pip install "pydantic-ai-slim[google]"

Terminal

uv add "pydantic-ai-slim[google]"

설정

GoogleModel은 구글의 Gemini 모델을 Gemini API(generativelanguage.googleapis.com)나 Google Cloud(*-aiplatform.googleapis.com, 구 Vertex AI)를 통해 쓸 수 있게 해줘요.

API 키 (Gemini API)

Gemini API로 Gemini를 쓰려면 aistudio.google.com에서 API 키를 만들어요.

API 키를 받았으면 환경 변수로 설정해요.

Terminal

export GOOGLE_API_KEY=your-api-key

이제 GoogleModel을 이름으로 쓸 수 있어요.

from pydantic_ai import Agent

agent = Agent('google:gemini-3.7-flash')
...

또는 provider를 명시적으로 만들 수도 있어요.

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel
from pydantic_ai.providers.google import GoogleProvider

provider = GoogleProvider(api_key='your-api-key')
model = GoogleModel('gemini-3.7-flash', provider=provider)
agent = Agent(model)
...

Google Cloud (Enterprise)

엔터프라이즈 사용자라면 GoogleModel로 Google Cloud(구 Vertex AI)를 통해 Gemini에 접근할 수도 있어요.

이 인터페이스는 Gemini API에 비해 몇 가지 장점이 있어요.

  1. Google Cloud API가 더 많은 엔터프라이즈 준비 보장을 제공해요.
  2. Google Cloud로 provisioned throughput을 구매해서 용량을 보장받을 수 있어요.
  3. Google Cloud 안에서 Pydantic AI를 실행하면 인증을 설정할 필요가 없고 "그냥 동작"해요.
  4. 쓸 리전을 직접 정할 수 있어요. 규제 관점에서 중요할 수 있고 지연 시간도 개선할 수 있죠.

application default credentials, 서비스 계정, 또는 API 키로 인증할 수 있어요.

어떤 방법으로 인증하든, Google Cloud 계정에서 Vertex AI API(현재는 Google Cloud AI로 브랜드 변경)가 활성화되어 있어야 해요.

Application Default Credentials

gcloud CLI가 설치되고 설정되어 있다면 GoogleCloudProvider를 이름으로 쓸 수 있어요.

from pydantic_ai import Agent

agent = Agent('google-cloud:gemini-3.7-flash')
...

또는 provider와 모델을 명시적으로 만들 수도 있어요.

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel
from pydantic_ai.providers.google_cloud import GoogleCloudProvider

provider = GoogleCloudProvider()
model = GoogleModel('gemini-3.7-flash', provider=provider)
agent = Agent(model)
...

서비스 계정

서비스 계정 JSON 파일을 쓰려면 provider와 모델을 명시적으로 만들어요.

from google.oauth2 import service_account

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel
from pydantic_ai.providers.google_cloud import GoogleCloudProvider

credentials = service_account.Credentials.from_service_account_file('path/to/service-account.json')
provider = GoogleCloudProvider(credentials=credentials, project='your-project-id')
model = GoogleModel('gemini-3.7-flash', provider=provider)
agent = Agent(model)
...

Credential 스코프: GoogleCloudProvider는 스코프가 필요한 자격 증명에 https://www.googleapis.com/auth/cloud-platform을 자동 적용해요. 기존 스코프는 보존돼요.

API 키

API 키로 Google Cloud를 쓰려면 키를 만들고 환경 변수로 설정해요.

Terminal

export GOOGLE_API_KEY=your-api-key

이제 GoogleCloudProvider를 통해 GoogleModel을 이름으로 쓸 수 있어요.

from pydantic_ai import Agent

agent = Agent('google-cloud:gemini-3.7-flash')
...

또는 provider와 모델을 명시적으로 만들 수도 있어요.

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel
from pydantic_ai.providers.google_cloud import GoogleCloudProvider

provider = GoogleCloudProvider(api_key='your-api-key')
model = GoogleModel('gemini-3.7-flash', provider=provider)
agent = Agent(model)
...

인증 우선순위: 명시적 credentials는 자격 증명 기반 인증을 선택해요. 명시적 projectlocationApplication Default Credentials를 선택해요. GOOGLE_APPLICATION_CREDENTIALS도 환경의 API 키보다 우선해요. GOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_LOCATION은 ADC 경로를 구성하지만 그 자체로는 환경 API 키를 덮어쓰지 않아요. 명시적 ADC 인자가 없으면 명시적 api_key가 Express Mode를 선택해요.

위치나 프로젝트 커스터마이즈

Google Cloud를 쓸 때 위치와/또는 프로젝트를 지정할 수 있어요.

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel
from pydantic_ai.providers.google_cloud import GoogleCloudProvider

provider = GoogleCloudProvider(location='global', project='your-google-cloud-project-id')
model = GoogleModel('gemini-3.7-flash', provider=provider)
agent = Agent(model)
...

GoogleCloudLocation에 나열된 단일 리전 값 외에도, GoogleCloudProvider'global' 위치와 'us'/'eu' 멀티 리전을 받아요. 멀티 리전 값은 aiplatform.{us,eu}.rep.googleapis.com 데이터 보존 엔드포인트로 라우팅돼요. 조직 정책이 데이터 보존 때문에 global 엔드포인트를 차단할 때, 또는 모델이 처음에 단일 리전이 아닌 global과 멀티 리전에서만 제공될 때 쓰세요. 단일 리전, 멀티 리전, global 사이에서 모델 가용성이 달라져요. Vertex AI 위치 문서를 보세요.

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel
from pydantic_ai.providers.google_cloud import GoogleCloudProvider

provider = GoogleCloudProvider(location='us', project='your-google-cloud-project-id')
model = GoogleModel('gemini-3.7-flash', provider=provider)
agent = Agent(model)
...

서비스 티어 (service_tier, google_cloud_service_tier)

통합된 service_tier 필드는 Google의 두 하위 시스템 모두에서 동작하고, google_cloud_service_tier로 Google Cloud 라우팅을 더 세밀하게 제어할 수 있어요. 둘 다 설정되면 provider별 필드가 이겨요.

Gemini API — 요청의 service_tier 필드로 보내져요.

service_tier Gemini API로 전송
'auto' (생략 — 서버 기본값)
'default' 'standard'
'flex' 'flex'
'priority' 'priority'

Google Cloud — HTTP 라우팅 헤더로 보내져요. 'flex''priority'는 항상 PT-with-spillover 변형을 선택해서, Provisioned Throughput(PT) 고객이 예약된 용량을 먼저 계속 쓰게 해요.

service_tier Google Cloud 라우팅 헤더 실제 동작
'auto' / 'default' (없음) PT 우선, 그다음 표준 on-demand spillover
'flex' X-Vertex-AI-LLM-Shared-Request-Type: flex PT 우선, 그다음 Flex PayGo spillover
'priority' X-Vertex-AI-LLM-Shared-Request-Type: priority PT 우선, 그다음 Priority PayGo spillover

PT를 완전히 우회하려면(또는 전적으로 사용하거나, 다른 Google Cloud 전용 라우팅 조합을 쓰려면) google_cloud_service_tier를 직접 설정하세요. 통합 필드는 의도적으로 안전한 PT-with-spillover 변형만으로 제한돼요.

Google Cloud — 라우팅 값 전체 집합

google_cloud_service_tier의 전체 값은 이 HTTP 헤더로 매핑돼요.

  • 'pt_only': PT만 (X-Vertex-AI-LLM-Request-Type: dedicated).
  • 'pt_then_flex': 할당량이 허락하면 PT, 그다음 Flex PayGo spillover (X-Vertex-AI-LLM-Shared-Request-Type: flex).
  • 'pt_then_priority': 할당량이 허락하면 PT, 그다음 Priority PayGo spillover (X-Vertex-AI-LLM-Shared-Request-Type: priority).
  • 'on_demand': 표준 on-demand만 (X-Vertex-AI-LLM-Request-Type: shared).
  • 'flex_only': Flex PayGo만 (X-Vertex-AI-LLM-Request-Type: sharedX-Vertex-AI-LLM-Shared-Request-Type: flex).
  • 'priority_only': Priority PayGo만 (X-Vertex-AI-LLM-Request-Type: sharedX-Vertex-AI-LLM-Shared-Request-Type: priority).

예시

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel, GoogleModelSettings
from pydantic_ai.providers.google_cloud import GoogleCloudProvider

provider = GoogleCloudProvider(location='global')
model = GoogleModel('gemini-3.7-flash', provider=provider)
agent = Agent(model)

result = agent.run_sync(
    'Hello!',
    model_settings=GoogleModelSettings(google_cloud_service_tier='pt_then_flex'),
)

'pt_then_flex'을 아무 GoogleCloudServiceTier 값으로 바꿔 보세요. 예를 들어 Priority PayGo spillover에 'pt_then_priority', PT를 완전히 우회할 때는 'flex_only'/'priority_only'를 쓰면 돼요.

요청 후에는 ModelResponse provider_details.get('traffic_type')(예: ON_DEMAND_FLEX, ON_DEMAND_PRIORITY)를 검사해서 어떤 티어가 서빙했는지 볼 수 있어요(API가 반환할 때).

Model Garden

generateContent API를 지원하고 Google Cloud 프로젝트 아래에서 제공되는 Model Garden 모델(Gemini 포함, 이에 국한되지 않음)을 다음 model_name 패턴 중 하나로 접근할 수 있어요.

  • {model_id} — Gemini 모델용
  • {publisher}/{model_id}
  • publishers/{publisher}/models/{model_id}
  • projects/{project}/locations/{location}/publishers/{publisher}/models/{model_id}
from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel
from pydantic_ai.providers.google_cloud import GoogleCloudProvider

provider = GoogleCloudProvider(
    project='your-google-cloud-project-id',
    location='us-central1',  # the region where the model is available
)
model = GoogleModel('meta/llama-3.3-70b-instruct-maas', provider=provider)
agent = Agent(model)
...

커스텀 HTTP 클라이언트

Google provider는 기본적으로 httpx2를 써요. transport 설정을 제어하려면 커스텀 httpx2.AsyncClient를 넘길 수 있어요.

from httpx2 import AsyncClient

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel
from pydantic_ai.providers.google import GoogleProvider

custom_http_client = AsyncClient(timeout=30)
model = GoogleModel(
    'gemini-3.7-flash',
    provider=GoogleProvider(api_key='your-api-key', http_client=custom_http_client),
)
agent = Agent(model)
...

Google provider는 Pydantic AI v2 동안 레거시 httpx.AsyncClient도 받지만 deprecation 경고를 내요. 새 코드에서는 httpx2.AsyncClient를 쓰고, 레거시 HTTPX 클라이언트 지원은 Pydantic AI v3에서 제거될 예정이에요.

HTTP 재시도

참고: 대부분의 사용 사례에서는 모델에 무관한 transport 재시도 접근이 더 좋아요. 모든 provider에서 같은 방식으로 동작하거든요. 아래 retry_options 인자는 Google 전용 대안으로, 재시도를 google-genai SDK 자체의 HTTP 레이어에 위임해요. 이 SDK 수준 재시도가 어디에 놓이는지는 재시도 가이드의 레이어를, 에이전트의 자체 재시도 예산과 어떻게 곱해지는지는 Retry multiplication을 보세요.

기본적으로 google-genai SDK는 일시적 HTTP 에러로 실패한 요청을 재시도하지 않아요. GoogleProviderGoogleCloudProviderretry_options 인자에 HttpRetryOptions 인스턴스를 넘기면 재시도를 켤 수 있어요.

from google.genai.types import HttpRetryOptions

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel
from pydantic_ai.providers.google import GoogleProvider

retry_options = HttpRetryOptions(
    attempts=4,
    initial_delay=1.0,
    max_delay=60.0,
    http_status_codes=[408, 429, 500, 502, 503, 504],
)
model = GoogleModel(
    'gemini-3.7-flash',
    provider=GoogleProvider(api_key='your-api-key', retry_options=retry_options),
)
agent = Agent(model)
...

이건 SDK의 HttpOptions.retry_options로 옵션을 통과시켜요. 값 선택 지침은 Vertex AI 재시도 전략 문서를 보세요.

문서, 이미지, 오디오, 비디오 입력

GoogleModel은 문서, 이미지, 오디오, 비디오를 포함한 멀티모달 입력을 지원해요.

YouTube 비디오 URL은 Google 모델에 직접 넘길 수 있어요.

from pydantic_ai import Agent, VideoUrl
from pydantic_ai.models.google import GoogleModel

agent = Agent(GoogleModel('gemini-3.7-flash'))
result = agent.run_sync(
    [
        'What is this video about?',
        VideoUrl(url='https://www.youtube.com/watch?v=dQw4w9WgXcQ'),
    ]
)
print(result.output)

파일은 Files API로 업로드해서 URL로 넘길 수 있어요.

from pydantic_ai import Agent, DocumentUrl
from pydantic_ai.models.google import GoogleModel
from pydantic_ai.providers.google import GoogleProvider

provider = GoogleProvider()
file = provider.client.files.upload(file='pydantic-ai-logo.png')
assert file.uri is not None

agent = Agent(GoogleModel('gemini-3.7-flash', provider=provider))
result = agent.run_sync(
    [
        'What company is this logo from?',
        DocumentUrl(url=file.uri, media_type=file.mime_type),
    ]
)
print(result.output)

더 많은 예시는 입력 문서를 참고하세요.

이미지 생성

ImageGeneratorgoogle: 이미지 모델과 함께 쓰면 Gemini API를 통한 직접 생성·참조 이미지 편집이 가능하고, google-cloud: 모델로는 같은 모델을 Vertex AI에서 돌릴 수 있어요.

from pydantic_ai import ImageGenerator
from pydantic_ai.images.google import GoogleImageGenerationSettings

settings = GoogleImageGenerationSettings(
    google_image_config={'aspect_ratio': '1:1', 'image_size': '1K'}
)

gemini_api_generator = ImageGenerator('google:gemini-3.1-flash-lite-image', settings=settings)
vertex_generator = ImageGenerator('google-cloud:gemini-3.1-flash-image', settings=settings)

GoogleCloudProviderGoogleImageGenerationModel을 만들면 Vertex 프로젝트와 위치를 명시적으로 설정할 수 있어요.

직접 어댑터는 두 API 모두에서 인라인 이미지와 다운로드 가능한 이미지 URL을 받아요. Google Files API URI로 표현된 UploadedFile은 Gemini Developer API에서만 받아요. Files API는 Vertex AI에 없고, 어댑터도 Vertex가 대신 쓰는 gs:// URI를 받지 않으므로 Vertex 클라이언트는 UserError를 일으키고 참조 이미지는 BinaryImageImageUrl로 넘겨야 해요. 모델이 어느 API에 대화하는지는 provider 이름이 아니라 클라이언트에서 읽혀요. 그래서 GoogleProvider에 넘긴 Vertex 지원 클라이언트는 Vertex로 취급되고, GoogleCloudProvider에 넘긴 Gemini Developer API 클라이언트는 Files API 지원을 유지해요. 공통 API와 지오메트리 동작은 image-generation 가이드를 보세요. 어댑터가 이미지만 응답하도록 요청하는 이유는 ImageGenerator가 Gemini의 선택적 대화 텍스트 대신 생성된 이미지를 반환하기 때문이에요.

생성된 모든 이미지는 무조건 SynthID 워터마크를 포함해요. Gemini 3 이미지 모델은 thinking 모델이에요. thinking이 항상 켜져 있고 청구되며, 그 토큰은 결과의 usage에 포함돼요.

모델 설정

GoogleModelSettings로 모델 동작을 커스터마이즈할 수 있어요.

from google.genai.types import HarmBlockThreshold, HarmCategory

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel, GoogleModelSettings

settings = GoogleModelSettings(
    temperature=0.2,
    max_tokens=1024,
    top_k=40,
    google_safety_settings=[
        {
            'category': HarmCategory.HARM_CATEGORY_HATE_SPEECH,
            'threshold': HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
        }
    ]
)
model = GoogleModel('gemini-3.7-flash')
agent = Agent(model, model_settings=settings)
...

Thinking 구성

provider에 무관한 Thinking capability로 thinking을 켤 수 있어요.

from pydantic_ai import Agent
from pydantic_ai.capabilities import Thinking

agent = Agent('google:gemini-3.7-flash', capabilities=[Thinking(effort='medium')])
...

고급 사용에서는 Google의 네이티브 thinking config를 GoogleModelSettings.google_thinking_config로 넘길 수 있어요.

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel, GoogleModelSettings

model = GoogleModel('gemini-3.7-flash')
model_settings = GoogleModelSettings(google_thinking_config={'include_thoughts': True, 'thinking_level': 'MEDIUM'})
agent = Agent(model, model_settings=model_settings)
...

PydanticAI는 Google의 문서화된 thinking 표에서 각 모델이 지원하는 수준을 해석하고, 요청된 노력을 가장 가까운 지원 수준에 맞춰요. 표가 다루지 않는 모델 id라면 GoogleModelProfile.google_thinking_levels로 수준을 선언하세요(기본값: 전체 척도). 지원되지 않는 노력은 가장 가까운 지원 수준으로 해석돼요.

통합 API는 Thinking, Google 네이티브 thinking 구성은 Gemini API 문서를 보세요.

안전 설정

google_safety_settings 필드를 설정해서 안전 설정을 커스터마이즈할 수 있어요.

from google.genai.types import HarmBlockThreshold, HarmCategory

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel, GoogleModelSettings

model_settings = GoogleModelSettings(
    google_safety_settings=[
        {
            'category': HarmCategory.HARM_CATEGORY_HATE_SPEECH,
            'threshold': HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
        }
    ]
)
model = GoogleModel('gemini-3.7-flash')
agent = Agent(model, model_settings=model_settings)
...

안전 설정에 대한 더 자세한 내용은 Gemini API 문서를 보세요.

Logprobs

GoogleModelSettings에서 google_logprobsgoogle_top_logprobs를 설정하면 응답에서 모델의 logprobs를 반환받을 수 있어요.

이 기능은 비스트리밍 요청과 Google Cloud에서만 지원돼요.

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel, GoogleModelSettings
from pydantic_ai.providers.google_cloud import GoogleCloudProvider

model_settings = GoogleModelSettings(
    google_logprobs=True, google_top_logprobs=2,
)

model = GoogleModel(
    model_name='gemini-3.7-flash',
    provider=GoogleCloudProvider(location='europe-west1'),
)
agent = Agent(model, model_settings=model_settings)

result = agent.run_sync('Your prompt here')
# Access logprobs from provider_details
logprobs = result.response.provider_details.get('logprobs')
avg_logprobs = result.response.provider_details.get('avg_logprobs')

Google Dev Blog에서 더 자세한 내용을 볼 수 있어요.

Model Armor (Google Cloud만)

Model Armor는 프롬프트 인젝션, 탈옥, 민감 데이터 유출 같은 위험에 대해 프롬프트와 응답을 검사하는 Google Cloud 보안 서비스예요.

GoogleModelSettingsgoogle_model_armor_config로 구성할 수 있어요.

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel, GoogleModelSettings
from pydantic_ai.providers.google_cloud import GoogleCloudProvider

model_settings = GoogleModelSettings(
    google_model_armor_config={
        'prompt_template_name': 'projects/my-project/locations/europe-west4/templates/prompt-template',
        'response_template_name': 'projects/my-project/locations/europe-west4/templates/response-template',
    }
)

model = GoogleModel(
    model_name='gemini-3.7-flash',
    provider=GoogleCloudProvider(location='europe-west4'),
)
agent = Agent(model, model_settings=model_settings)
...

템플릿은 Google Cloud Console에서 미리 만들어야 하고, 모델 엔드포인트와 같은 리전에 있어야 해요. 지원 위치는 Model Armor Vertex AI 통합 문서를 보세요.

프롬프트나 응답이 차단되면 ContentFilterError가 발생해요.

Model Armor 검사(프롬프트·응답 템플릿 모두)는 비스트리밍 요청(agent.run())에서만 동작해요. 스트리밍(agent.run_stream())에서는 Google Cloud가 Model Armor를 적용하지 않아요. 프롬프트가 검사되지 않고 응답 텍스트도 검사되지 않은 채 반환돼요. 스트리밍이 필요하면서 Model Armor 보호가 필요하다면, 에이전트를 호출하기 전에 google-cloud-modelarmor SDK로 프롬프트를 미리 검사하세요.

컨텍스트 캐싱 (google_cached_content)

Gemini cached content 리소스를 만들었다면 google_cached_content로 그 리소스 이름을 넘겨서 요청 간에 재사용할 수 있어요.

from pydantic_ai import Agent
from pydantic_ai.models.google import GoogleModel, GoogleModelSettings

model_settings = GoogleModelSettings(
    google_cached_content='projects/p/locations/global/cachedContents/your-cache-id',
)

agent = Agent(GoogleModel('gemini-3.7-flash'), model_settings=model_settings)
...

캐시된 필드는 캐시 리소스가 소유해요: 캐시 리소스가 system_instruction, tools, tool_config를 소유하고, PydanticAI는 google_cached_content가 설정되면 발신 요청에서 그것들을 제거해요. 그래서 에이전트 지시와 등록된 도구는 캐시된 요청에서 무시돼요. 제거가 필드를 버릴 때마다 UserWarning이 발생해서 불일치를 발견할 수 있어요.

cached content 리소스 만들기: PydanticAI는 캐시 관리 API를 감싸지 않아요. 기본 google-genai SDK로 리소스를 만든 뒤 그 이름을 google_cached_content로 넘기세요.

from google.genai.types import Content, CreateCachedContentConfig, Part

from pydantic_ai.providers.google import GoogleProvider

provider = GoogleProvider(api_key='your-api-key')

cache = provider.client.caches.create(
    model='gemini-3.7-flash',
    config=CreateCachedContentConfig(
        system_instruction='You are a geography expert. Be concise.',
        contents=[Content(role='user', parts=[Part(text='...long context to cache...')])],
        ttl='3600s',
    ),
)
print(cache.name)
#> cachedContents/abc123...

캐시에는 최소 크기(Gemini 2.5 시리즈 모델 약 ≈2048 토큰, Gemini 3 시리즈 모델 약 ≈4096 토큰)와 TTL이 있어요. 현재 임계값, 가격, list/update/delete 작업은 Gemini 캐싱 문서를 보세요.

스트리밍 취소

cancel()은 다른 작업에서 실행 중인 활성 로컬 스트림 pull을 포함해 안전하게 중단해요. google-genai SDK는 문서화된 스트림별 transport 핸들을 노출하지 않아서, 반환된 iterator를 닫아도 즉각적인 HTTP 철수가 보장되지 않고, 원격 생성이 언제 멈추고 청구가 언제 끝나는지도 알 수 없어요. googleapis/python-genai#2425를 보세요.

더 알아보기 (Learn more)