API への要求を行うとき、一定の期間内に実行できる呼び出しの数を制限するレート制限が発生することがよくあります。 GitHub Copilot Chat は、レート制限の応答を検出して遅延後に要求を自動的に再試行するコードを提案して、これらの制限の処理を助けることができます。
サンプル シナリオ
次の Python コードは、外部 API から気象データをフェッチします。 API にレート制限がある場合、制限を超えると要求が失敗する可能性があり、再試行ロジックを実装してこれらの応答を適切に処理する方法がアプリに必要になる場合があります。
from flask import Flask, request
import requests
app = Flask(__name__)
WEATHER_API_URL = "https://api.example.com/weather"
@app.route('/get_weather', methods=['GET'])
def get_weather():
city = request.args.get('city')
# Simulate an API request to the external weather service
response = requests.get(WEATHER_API_URL, params={"city": city})
weather_data = response.json()
return weather_data
プロンプトの例
How can I handle API rate limits within get_weather().
応答の例
Note
次の応答は例です。 Copilot Chat の応答は非決定的であるため、ここで示したものとは異なる応答が返される可能性があります。
Copilot は、再試行の頻度を制限するために、エクスポネンシャル バックオフを使用する再試行メカニズムを実装するコードを提案する場合があります。
次に例を示します。
import requests
from flask import Flask, request
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
app = Flask(__name__)
WEATHER_API_URL = "https://api.example.com/weather"
def requests_retry_session(
retries=3,
backoff_factor=0.3,
status_forcelist=(500, 502, 504),
session=None,
):
session = session or requests.Session()
retry = Retry(
total=retries,
read=retries,
connect=retries,
backoff_factor=backoff_factor,
status_forcelist=status_forcelist,
)
adapter = HTTPAdapter(max_retries=retry)
session.mount("http://", adapter)
session.mount("https://", adapter)
return session
@app.route('/get_weather', methods=['GET'])
def get_weather():
city = request.args.get('city')
try:
response = requests_retry_session().get(WEATHER_API_URL, params={"city": city})
response.raise_for_status()
weather_data = response.json()
except requests.exceptions.RequestException as e:
return {"error": str(e)}, 500
return weather_data
この例の Copilot の提案には、特定の状態コード (500、502、504) が原因で失敗した場合にコードが要求を自動的に再試行できるようにする再試行セッションの設定が含まれます。 backoff_factor
によって再試行の間隔が徐々に長くなり、API のレート制限をそれ以上超えないようにするのに役立ちます。