概要
前回、GraphQLを使ってNetBoxから情報取得を試しました。
今回は、LnagchainのToolであるBaseGraphQLToolを使って同じことを試してみます。
スクリプト
前回利用したクエリをそのまま利用します。
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として組み込めそうです。