

# 도구 간접 호출
<a name="tool-use-invocation"></a>

Amazon Nova가 도구를 직접적으로 호출하기로 결정하면 도구 사용 블록이 어시스턴트 메시지의 일부로 반환되며 중지 이유는 ‘tool\$1use’가 됩니다. 도구 블록에는 도구의 이름과 입력 내용이 포함됩니다.

**참고**  
도구 직접 호출의 정확도를 높이기 위해 Amazon Nova 모델의 기본 동작은 도구 직접 호출에 생각의 사슬 추론을 사용하는 것입니다. 생각 프로세스는 어시스턴트 메시지를 통해 제공되며 <thinking> 태그에 포함됩니다. 응답에 여러 도구 직접 호출과 생각 블록이 있을 수 있으므로 애플리케이션에서 이를 고려해야 합니다.  
도구 선택이 `any` 또는 `tool`로 구성된 경우 이는 생각의 사슬 동작을 재정의하고 응답에는 필요한 도구 직접 호출만 포함됩니다.

```
{
   "toolUse": 
    {
        "toolUseId": "tooluse_20Z9zl0BQWSXjFuLKdTJcA", 
        "name": "top_song", 
        "input": {
            "sign": "WZPZ"
        }
    }
}
```

실제로 도구를 직접적으로 호출하려면 메시지에서 도구 이름과 인수를 추출한 다음 애플리케이션에서 도구를 간접적으로 호출합니다.

다음은 도구 직접 호출을 처리하는 방법의 예제입니다.

```
def get_top_song(sign):
    print(f"Getting the top song at {sign}")
    return ("Espresso", "Sabrina Carpenter")

stop_reason = response["stopReason"]

tool, song, artist = None, None, None
if stop_reason == "tool_use":
    thought_process = next(
        block["text"]
        for block in response["output"]["message"]["content"]
        if "text" in block
    )

    print(thought_process)

    tool = next(
        block["toolUse"]
        for block in response["output"]["message"]["content"]
        if "toolUse" in block
    )

    if tool["name"] == "top_song":
        song, artist = get_top_song(tool["input"]["sign"])
```

도구를 정의하고 간접적으로 호출할 때 보안을 염두에 두는 것이 중요합니다. Amazon Nova와 같은 LLM은 세션 세부 정보에 액세스할 수 없으므로 도구를 간접적으로 호출하기 전에 필요한 경우 권한을 검증해야 합니다. 프롬프트를 보강하고 Amazon Nova가 도구 직접 호출에 주입하도록 허용하는 대신 세션의 사용자 세부 정보를 사용합니다.