Function calling

note.com

!pip install openai
import openai
import json
import requests
openai.api_key = "自分のAPIキー"

def get_weather_info(latitude, longitude):
    base_url = "https://api.open-meteo.com/v1/forecast"
    parameters = {
        "latitude": latitude,
        "longitude": longitude,
        "current_weather": "true"
    }
    response = requests.get(base_url, params=parameters)
    if response.status_code == 200:
        data = response.json()
        return json.dumps(data["current_weather"])
    else:
        return None

weather_function =  {
    "name": "get_weather_info",
      "description": "経度緯度の情報から現在の天気を取得",
      "parameters": {
          "type": "object",
          "properties": {
              "latitude": {
                  "type": "string",
                  "description": "経度の情報",
              },
              "longitude": {
                  "type": "string",
                  "description": "緯度の情報",
              },
          },
          "required": ["latitude", "longitude"],
      },
}

def main(text):
    response = openai.ChatCompletion.create(
        model="gpt-4-0613",
        messages=[{"role": "user", "content": text}],
        functions=[weather_function],
        function_call="auto",
    )
    message = response["choices"][0]["message"]
    if message.get("function_call"):
        function_name = message["function_call"]["name"]
        arguments=json.loads(message["function_call"]["arguments"])
        function_response = get_weather_info(
            latitude=arguments.get("latitude"),
            longitude=arguments.get("longitude"),
        )
        second_response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo-0613",
            messages=[
                {"role": "user", "content": text},
                message,
                {
                    "role": "function",
                    "name": function_name,
                    "content": function_response,
                },
            ],
        )
        return second_response.choices[0]["message"]["content"].strip()