text: wikibase instance, we use http://wikidata.org for testing.If you are interested in wikibases and sparql, please consider helping to improve this agent. Look here for more details and open questions.Preliminariesâ€‹API keys and other secratsâ€‹We use an .ini file, like this: [OPENAI]OPENAI_API_KEY=xyzzy[WIKIDATA]WIKIDATA_USER_AGENT_HEADER=argle-bargleimport configparserconfig = configparser.ConfigParser()config.read("./secrets.ini")    ['./secrets.ini']OpenAI API Keyâ€‹An OpenAI API key is required unless you modify the code below to use another LLM provider.openai_api_key = config["OPENAI"]["OPENAI_API_KEY"]import osos.environ.update({"OPENAI_API_KEY": openai_api_key})Wikidata user-agent headerâ€‹Wikidata policy requires a user-agent header. See https://meta.wikimedia.org/wiki/User-Agent_policy. However, at present this policy is not strictly enforced.wikidata_user_agent_header = (    None    if not config.has_section("WIKIDATA")    else config["WIKIDATA"]["WIKIDAtA_USER_AGENT_HEADER"])Enable tracing if desiredâ€‹# import os# os.environ["LANGCHAIN_HANDLER"] = "langchain"# os.environ["LANGCHAIN_SESSION"] = "default" # Make sure this session actually exists.ToolsThree tools are provided for this simple agent:ItemLookup: for finding the q-number of an itemPropertyLookup: for finding the p-number of a propertySparqlQueryRunner: for running a sparql queryItem and Property lookupâ€‹Item and Property lookup are implemented in a single method, using an elastic search endpoint. Not all wikibase instances have it, but wikidata does, and that's where we'll start.def