OpenClaw 검색 Gemini 로 설정하기

개요

OpenClaw 사용 시 검색을 이용하려고 하면 Brave Search API 키를 등록하라고 하는데 필자가 글을 쓰는 시점에는 무료 플랜이 없습니다. 공식 문서를 보니 Gemini 도 지원을 한다고 되어 있어 설정해 보기로 했습니다. 글을 쓰는 현재 OpenClaw 설정 글들 모두 Brave Search API 기준으로 되어 있었습니다.

현상 확인 및 Gemini 지원 확인

연결된 메신저(필자의 경우 텔레그램)에서 뉴스를 알려 달라고 하면 다음과 같은 메시지가 나타났었습니다.

Brave Search API 요구

분명히 Brave Search 만 지원하지는 않을 것 같아서 찾아보니 이곳에 Choosing a search provider 섹션에 Gemini 가 있는 것을 확인할 수 있었습니다.

설정

설정은 openclaw.json 파일을 수정하고 환경 변수를 추가한 후 재 시작하면 됩니다.

openclaw.json 파일에 다음과 같이 추가합니다. 모델은 적절하게 변경하시면 됩니다.

  "tools": {
    "allow": [
      "web_search", "web_fetch"
    ],
    "web": {
      "search": {
        "enabled": true,
        "provider": "gemini",
        "gemini": {
          "apiKey": "yourgeminikey",
          "model": "gemini-2.5-flash"
        }
      },
      "fetch": {
        "enabled": true
      }
    }
  },

현재 기준으로 3행의 “web_search”, “web_fetch” 부분이 없으면 아래쪽의 설정이 있어도 검색이 제대로 수행되지 않습니다. gemini API Key 는 aistudio.google.com 에서 발급하면 됩니다. 필자는 간단한 질문이나 뉴스 정도만 받아보는 용도로 설정했습니다. 무료도 충분히 사용 가능했습니다.

openclaw 디렉토리에 .env 파일을 만들고 다음 내용을 입력해서 환경변수를 추가합니다.

export GEMINI_API_KEY=”yourgeminikey”

바로 환경변수 변경 사항을 반영하거나 재 부팅 하면 됩니다.

이렇게 하면 다음과 같이 검색이 가능해 집니다.

gemini 설정으로 검색이 가능해진 상태

주의 사항

공식 문서에서는 자동으로 search provider 를 인식한다고 되어 있었습니다. 그런데 설정의 문제인지 연결된 메신저의 문제인지 제대로 되지 않았습니다. 그래서 위와 같이 직접 설정 파일에 추가해서 해결했습니다.

혹시 계속 Brave Search API 를 찾으면 설정파일 및 환경변수에 Brave Search 관련한 것을 모두 삭제하고 OpenClaw 를 다시 시작해 보시기 바랍니다. Brave Search 설정이 다른 것을 다 무시하고 우선한다는 정보가 있어 알려드렸습니다.

Brave Search API 무료 플랜이 없어져서 설정 못하고 검색이 안되셨던 분들께 도움이 되었으면 합니다.

Unreal 동적으로 생성된 액터의 스프라이트 overlap 이벤트가 발생하지 않는 문제 해결

개요

타일맵과 마찬가지로 각종 액터를 코드를 통해 동적으로 생성했습니다. 정상적으로 나타나는데 의도한 동작을 하지 않았습니다. 수동으로 추가한 같은 종류의 액터는 정상적으로 동작했습니다. 이전과 같이 뭔가 생성 타이밍의 문제가 아닐까 생각되었습니다.

문제 확인

해당 액터는 하나의 스프라이트가 추가 되어 있었습니다. 플레이어가 스프라이트와 겹치면 의도한 동작을 하도록 작업되어 있습니다. 동적으로 생성된 액터는 overlap 이벤트가 전혀 발생하지 않았습니다. 수동으로 배치한 액터에서는 로그가 정상적으로 출력되어 문제가 없었습니다.

액터에 추가된 스프라이트
액터에 추가된 스프라이트

해결

타일맵에서 Navigation Paths 가 동작하지 않는 문제와 비슷했습니다. 해당 액터의 BeginPlay 메소드에서 다음과 같이 시간 지연 후 등록해 주면 정상적으로 동작합니다.

FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(TimerHandle, FTimerDelegate::CreateLambda([&]() {
    GetWorld()->GetTimerManager().ClearTimer(TimerHandle);

    YourSpriteComponent = GetComponentByClass<UPaperSpriteComponent>();

    if (YourSpriteComponent != nullptr) {
        YourSpriteComponent->OnComponentBeginOverlap.AddDynamic(this, &AYourClass::OnBeginOverlap);
    }
}), 0.2f, false);

이 액터와 같은 형식의 다른 액터들도 동적으로 생성했을 경우 같은 문제가 있었습니다. 다른 액터들도 위의 코드를 추가해서 정상적으로 동작하도록 했습니다.

이 문제도 결과적으로 보면 간단한데 정확하게 문제를 식별하고 적절한 처리를 추가하는데 생각보다 시간이 많이 소요되었습니다. 필자와 같은 문제를 겪으신 분들께 도움이 되었으면 합니다.