以下の内容はhttps://usage-automate.hatenablog.com/entry/2024/09/14/154336より取得しました。


【Langchain】BaseGraphQLToolを使ってNetboxから情報取得をする

概要

前回、GraphQLを使ってNetBoxから情報取得を試しました。
今回は、LnagchainのToolであるBaseGraphQLToolを使って同じことを試してみます。

usage-automate.hatenablog.com

スクリプト

前回利用したクエリをそのまま利用します。

LangchainのToolはAgentで利用することを想定しているものですが、単体でも動かすことができます。

import json
from pprint import pprint
from langchain_community.tools.graphql.tool import BaseGraphQLTool
from langchain_community.utilities.graphql import GraphQLAPIWrapper

if __name__ == '__main__':
    # NOTE: URLとTokenを定義
    NETBOX_URL = "<NETBOX_URL>"
    NETBOX_TOKEN = "<NETBOX_TOKEN>"

    hostname = "NLAMS01-SW-1"
    query_string = 'query DeviceName {device_list(filters: {name: {exact: "'+ hostname +'"}}) {id}}'

    graphql_wrapper = GraphQLAPIWrapper(graphql_endpoint=NETBOX_URL, custom_headers={"Authorization": f"Token {NETBOX_TOKEN}"})
    bgt = BaseGraphQLTool(graphql_wrapper=graphql_wrapper)
    res = bgt.run(tool_input=query_string)

    res_json = json.loads(json.loads(res))
    id = res_json['device_list'][0]['id']

    query_string = 'query DeviceDetail {device(id: '+ id +') {id interfaces {name ip_addresses {address status}} primary_ip4 {address} name}}'
    res = bgt.run(tool_input=query_string)
    res_json = json.loads(json.loads(res))
    pprint(res_json)


BaseGraphQLToolのソースを確認したところ、graphql_wrapperがインプットとして必要になるようです。

graphql_wrapperは、endpointやheaderの定義GraphQLAPIWrapperクラスのインスタンスとして作成します。 内部的にはgqlのクライアントを作成しているようです。

res = bgt.run(tool_input=query_string)でクエリを実行(ツールを実行)します、戻り値はjson.dumps後になるためjsonっぽい文字列になります。
もっとスマートな方法がありそうですが、json.loadsを2度実行し文字列から辞書に変換をしています。

実行

$ uv run nbTool.py 
{'device': {'id': '2',
            'interfaces': [{'ip_addresses': [{'address': '192.168.2.65/30',
                                              'status': 'active'}],
                            'name': 'ge-0/0/0'},
                           {'ip_addresses': [], 'name': 'ge-0/0/1'},
                           {'ip_addresses': [], 'name': 'ge-0/0/2'},
                           {'ip_addresses': [], 'name': 'ge-0/0/3'},
                           {'ip_addresses': [], 'name': 'ge-0/0/4'},
                           {'ip_addresses': [], 'name': 'ge-0/0/5'},
                           {'ip_addresses': [], 'name': 'ge-0/0/6'},
                           {'ip_addresses': [], 'name': 'ge-0/0/7'},
                           {'ip_addresses': [], 'name': 'ge-0/0/8'},
                           {'ip_addresses': [], 'name': 'ge-0/0/9'},
                           {'ip_addresses': [], 'name': 'ge-0/0/10'},
                           {'ip_addresses': [], 'name': 'ge-0/0/11'},
                           {'ip_addresses': [], 'name': 'ge-0/0/12'},
                           {'ip_addresses': [], 'name': 'ge-0/0/13'},
                           {'ip_addresses': [], 'name': 'ge-0/0/14'},
                           {'ip_addresses': [], 'name': 'ge-0/0/15'},
                           {'ip_addresses': [], 'name': 'ge-0/0/16'},
                           {'ip_addresses': [], 'name': 'ge-0/0/17'},
                           {'ip_addresses': [], 'name': 'ge-0/0/18'},
                           {'ip_addresses': [], 'name': 'ge-0/0/19'},
                           {'ip_addresses': [], 'name': 'ge-0/0/20'},
                           {'ip_addresses': [], 'name': 'ge-0/0/21'},
                           {'ip_addresses': [], 'name': 'ge-0/0/22'},
                           {'ip_addresses': [], 'name': 'ge-0/0/23'},
                           {'ip_addresses': [], 'name': 'ge-0/0/24'},
                           {'ip_addresses': [], 'name': 'ge-0/0/25'},
                           {'ip_addresses': [], 'name': 'ge-0/0/26'},
                           {'ip_addresses': [], 'name': 'ge-0/0/27'},
                           {'ip_addresses': [], 'name': 'ge-0/0/28'},
                           {'ip_addresses': [], 'name': 'ge-0/0/29'},
                           {'ip_addresses': [], 'name': 'ge-0/0/30'},
                           {'ip_addresses': [], 'name': 'ge-0/0/31'},
                           {'ip_addresses': [], 'name': 'ge-0/0/32'},
                           {'ip_addresses': [], 'name': 'ge-0/0/33'},
                           {'ip_addresses': [], 'name': 'ge-0/0/34'},
                           {'ip_addresses': [], 'name': 'ge-0/0/35'},
                           {'ip_addresses': [], 'name': 'ge-0/0/36'},
                           {'ip_addresses': [], 'name': 'ge-0/0/37'},
                           {'ip_addresses': [], 'name': 'ge-0/0/38'},
                           {'ip_addresses': [], 'name': 'ge-0/0/39'},
                           {'ip_addresses': [], 'name': 'ge-0/0/40'},
                           {'ip_addresses': [], 'name': 'ge-0/0/41'},
                           {'ip_addresses': [], 'name': 'ge-0/0/42'},
                           {'ip_addresses': [], 'name': 'ge-0/0/43'},
                           {'ip_addresses': [], 'name': 'ge-0/0/44'},
                           {'ip_addresses': [], 'name': 'ge-0/0/45'},
                           {'ip_addresses': [], 'name': 'ge-0/0/46'},
                           {'ip_addresses': [], 'name': 'ge-0/0/47'},
                           {'ip_addresses': [], 'name': 'et-0/1/0'},
                           {'ip_addresses': [], 'name': 'et-0/1/1'},
                           {'ip_addresses': [], 'name': 'et-0/1/2'},
                           {'ip_addresses': [], 'name': 'et-0/1/3'},
                           {'ip_addresses': [], 'name': 'ae0'},
                           {'ip_addresses': [], 'name': 'ae1'},
                           {'ip_addresses': [{'address': '192.168.2.1/26',
                                              'status': 'active'}],
                            'name': 'me0'},
                           {'ip_addresses': [{'address': '192.168.0.1/25',
                                              'status': 'active'}],
                            'name': 'vlan.10'},
                           {'ip_addresses': [{'address': '192.168.0.129/25',
                                              'status': 'active'}],
                            'name': 'vlan.20'},
                           {'ip_addresses': [{'address': '192.168.1.1/25',
                                              'status': 'active'}],
                            'name': 'vlan.30'},
                           {'ip_addresses': [{'address': '192.168.1.129/25',
                                              'status': 'active'}],
                            'name': 'vlan.40'},
                           {'ip_addresses': [{'address': '192.168.2.2/26',
                                              'status': 'active'}],
                            'name': 'vlan.50'}],
            'name': 'NLAMS01-SW-1',
            'primary_ip4': {'address': '192.168.2.1/26'}}}

取得できました。
内部で前回利用したgqlを利用しているようなので、目新しさはないですがToolを動かせたのでAgentとして組み込めそうです。




以上の内容はhttps://usage-automate.hatenablog.com/entry/2024/09/14/154336より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14