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) 

пятница, 30 мая 2025 г.

WSL и VPN

Проблема

Есть Windows хост с поднятым корпоративным VPN. Есть гостевой Linux в WSL (конкретно, WSL2). На Windows весь трафик идет через VPN, трафик в обход VPN заблокирован, доступ в интернет только через корпоративный прокси.

В Linux недоступна ни корпоративная сеть, ни интернет (т.к. недоступен корпоративный прокси, расположенный в корпоративной сети), т.к. трафик не заворачивается в VPN.

Решение

https://github.com/sakai135/wsl-vpnkit?tab=readme-ov-file - скачиваем, устанавливаем, запускаем по инструкции. Трафик из WSL начинает заворачиваться в VPN, в результате чего в Linux появляется доступ к корпоративной сети и интернету (через корпоративную проксю).

четверг, 24 апреля 2025 г.

Logitech Options+ за прокси

Обычная версия Logitech Options+ отказывается корректно работать за корпоративным прокси: установка проходит успешно, однако проверка обновлений, а также загрузка информации о девайсах не работает, в итоге ни один девайс добавить не получаестя. Решение - использовать оффлайн-установщик, он не требует подключения к интернету для загрузки информации о девайсах: https://prosupport.logi.com/hc/en-us/articles/10991109278871-Logitech-Options-Offline-Installer

вторник, 29 октября 2024 г.

gitleaks ломает мердж в Idea

Проблема

Пытаюсь смерджить две ветки в IntelliJ Idea, после разрешения конфликтов появляется уведомление:


В итоге мердж можно только откатить. Причина ясна - gitleaks нашел какую-то уязвимость в коде, который мерджится. Но что если это false-positive и мы хотим все же смерджиться?

Решение

Идем в .git/hooks/pre-commit, там комментим вызов gitleaks:

#"C:\Program Files\Git\gitleaks.exe" protect -v --staged

После мерджа строчку можно раскомментить обратно. 



пятница, 20 сентября 2024 г.

Linux Mint: ноутбук засыпает при отключении внешнего монитора при закрытой крышке

Проблема

Ноутбук с Linux Mint работает с закрытой крышкой и внешним монитором. Стоит отключить внешний монитор (точнее, я просто переключаю монитор на другой ноутбук через KVM Switch), ноутбук уходит в сон, хотя в настройках питания стоит "ничего не делать" по закрытию крышки (собственно, по закрытию крышки он и не засыпает).

Решение

В файле /etc/systemd/logind.conf строчки:

#HandleLidSwitch=suspend
#HandleLidSwitchExternalPower=suspend

заменяем на 

HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignore

И делаем:

sudo service systemd-logind restart

четверг, 19 сентября 2024 г.

Spring Boot with Gradle in IntelliJ Idea: profiler cannot connect to the application

When I'm trying to profile my Spring Boot application, built with Gradle and run with :bootRun, in IntelliJ Idea, I face the following error:

"Cannot connect to target JVM. Exception creating connection to: 192.168.x.x; ..."

The reason is obviously in the fact, that IntelliJ tries to use my IP from the network card instead of localhost. 

To change that, in my build.gradle I configured the bootRun task in the following way:

bootRun {

    jvmArgs('-Djava.rmi.server.hostname=localhost')

}