barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

вторник, 10 июня 2025 г.

Google ADK + AWS Bedrock + Claude

Google ADK "из коробки" не поддерживает работу с AWS Bedrock. Можно его подключить через LiteLLM, но это может быть сопряжено с трудностями, например, из-за конфликта версий зависимостей. Есть вариант проще - подключить зависимость anthropic[bedrock], после чего отнаследоваться от класса модели Claude, входящего в ADK и использующего VertexAI, заменив клиента на Bedrock-клиента. Dirty, но работает:

import os
import httpx
from functools import cached_property
from typing_extensions import override
from google.adk.models.anthropic_llm import Claude
from google.adk.models.registry import LLMRegistry
from anthropic import AnthropicBedrock class ClaudeOnBedrock(Claude):
    @staticmethod
    @override
    def supported_models() -> list[str]:
        return [r".*anthropic.claude-3-.*", r".*anthropic.claude-.*-4.*"]
   
    @override
    @cached_property
    def _anthropic_client(self) -> AnthropicBedrock:
        proxy = os.getenv("HTTPS_PROXY")
        if proxy:
            return AnthropicBedrock(http_client=httpx.Client(proxy=proxy),
                aws_region="***")
        return AnthropicBedrock(aws_region="***")

# Register the custom model
LLMRegistry.register(ClaudeOnBedrock)

Google ADK + VertexAI + Claude: работа за HTTP прокси

Проблема

Пытаюсь запустить решение на Google ADK, использующее VertexAI и одну из моделей Claude, за HTTP прокси-сервером. Вызов идет мимо прокси, что приводит к ошибке, хотя прокси прописан в переменной окружения HTTPS_PROXY.

Решение

Вручную расширить класс ADK-модели Claude, добавив поддержку прокси:

from google.adk.agents import Agent
from google.adk.models.anthropic_llm import Claude
from google.adk.models.registry import LLMRegistry
from anthropic import AnthropicVertex
from functools import cached_property
import os
import httpx

class ClaudeWithProxySupport(Claude):
    @cached_property
    def _anthropic_client(self) -> AnthropicVertex:
        proxy = os.getenv("HTTPS_PROXY")
        if not proxy:
            return super()._anthropic_client

        if (
            "GOOGLE_CLOUD_PROJECT" not in os.environ
            or "GOOGLE_CLOUD_LOCATION" not in os.environ
        ):
            raise ValueError(
                "GOOGLE_CLOUD_PROJECT and GOOGLE_CLOUD_LOCATION must be set "
                "for using Anthropic on Vertex."
            )

        return AnthropicVertex(
            project_id=os.environ["GOOGLE_CLOUD_PROJECT"],
            region=os.environ["GOOGLE_CLOUD_LOCATION"],
            http_client=httpx.Client(proxy=proxy),
        )


# Register the custom model
LLMRegistry.register(ClaudeWithProxySupport)