新しい「sk-proj」タイプのOpenAIキーが途中で切れる?WebRequestが常に「APIキーが提供されていません」と返してしまう

 

かなり困っております・・・

MQL5(MetaTrader 5)で WebRequest() を使い、ChatGPT(gpt-3.5-turbo) に接続しようとしています。具体的には、 https://api.openai.com/v1/chat/completions にアクセスしているのですが、常に 401 エラーが返ってきて、以下のメッセージが表示されます。

「APIキーが提供されていません。Bearer認証ヘッダでAPIキーを渡す必要があります…」

つまり、 Authorization: Bearer ヘッダが、OpenAI側で認識されていないようなのです。

ポイント:

  1. 新しい “sk-proj” APIキーの長さ

    • OpenAIのプロジェクトキーは 100文字以上になる場合があり、MQL5 で長すぎて途中で切られてしまっているのかと疑っています。
  2. WebRequest の許可設定

    • MetaTraderの [ツール] → [オプション] → [エキスパートアドバイザ] 画面で、 https://api.openai.com を “Allow WebRequest” に登録済みです。
  3. 複数のMT5ビルドを試した

    • ブローカー版だけでなく、MetaQuotes公式の最新ビルドも試しました。しかし、結果は同じく WebRequest が 401 を返し、「APIキーを提供していない」と言われます。
  4. Fiddler / Wireshark を使った解析

    • HTTPSトラフィックを傍受して、 Authorization: Bearer sk-xxx が送られているか確認したいのですが、MetaTrader側がMITM証明書を受け付けないのか、CONNECTトンネルだけ見えて内容がわかりません。

一方で、同じキーを curl や Pythonスクリプト で使うと、問題なくChatGPTにアクセスできます。
つまり、キー自体は有効なのに、MQL5 の WebRequest() では常に「APIキーが無い」とOpenAIに言われる状態です。

質問:

  • 新しい「sk-proj-...」形式の長いキー(100文字以上)を、MQL5の  WebRequest()  で正常に利用できた方はいますか?
  • Authorization  ヘッダが長すぎる or カスタムヘッダが落ちるなどの制限が  WebRequest()  に存在するのでしょうか?
  • あるいは、MetaTrader のアップデートによる対応を待つしかないのでしょうか?
  • 何か回避策をご存じの方がいれば、ぜひ教えていただきたいです。

以下サンプルコード

//+------------------------------------------------------------------+
//| ChatGPTRequest.mq5                                              |
//| MQL5のエキスパート(Utility用途): 401エラーの最小例            |
//+------------------------------------------------------------------
#property script_show_inputs

void OnStart()
{
   // 1) 新しい “sk-proj-...” キー(100文字以上の例)
   string openai_api_key = "sk-proj-EXAMPLE_KEY_which_is_quite_long...";

   // 2) 簡単なJSONボディ
   string json_body = 
      "{\"model\":\"gpt-3.5-turbo\","
      "\"messages\":[{\"role\":\"user\",\"content\":\"Hello!\"}],"
      "\"max_tokens\":50}";

   // JSONをUTF-8のchar配列に変換
   char data[];
   int size = StringToCharArray(json_body, data, 0, StringLen(json_body), CP_UTF8);
   ArrayResize(data, size + 1);
   data[size] = 0; // null終端

   // 3) ヘッダ(Authorizationを含む)
   string headers =
      "Content-Type: application/json\r\n"
      "Authorization: Bearer " + openai_api_key + "\r\n"
      "\r\n";

   // 4) WebRequest呼び出し
   char resultBuf[];
   string cookie;
   int timeoutMs = 10000;
   string openai_url = "https://api.openai.com/v1/chat/completions";

   int res = WebRequest(
      "POST",
      openai_url,
      headers,
      "",  // params は空
      timeoutMs,
      data,
      size,
      resultBuf,
      cookie
   );

   Print("WebRequest return=", res);
   if(res == -1)
   {
      Print("Error code: ", GetLastError());
   }
   else
   {
      string response = CharArrayToString(resultBuf, 0, -1);
      Print("OpenAI response: ", response);
   }
}

結果:

  • 常に 401 エラーが返り、

    "You didn't provide an API key..."

  • と表示されてしまいます。

もし何か解決策や、 Authorization: Bearer ヘッダを長いキーでも正常に送る方法が分かる方がいれば、ぜひアドバイスをいただきたいです。
よろしくお願いいたします。

 

ChaGPT APIを使っているんですか?

それならAPIをインポートして、それを通じて接続しないと無理なのと違いますか?

 
Shino Unada #:

ChaGPT APIを使っているんですか?

それならAPIをインポートして、それを通じて接続しないと無理なのと違いますか?

コメントありがとうございます。自前でwebrequest解決しようとしましたが無理筋でした。


OpenAI Library MT5 by StormWave のようなものを入れても、ヘッダ落ちが解決するかわからず、もし他に安定したやり方やライブラリがありましたら、ぜひ教えていただけると助かりますm(__)m

 

私は ChaGPTを使ってないし、通信用のAPIをMT5で使った経験もないので分かりません。

英語フォーラムで質問したほうが回答を得やすいと思います。

 
こちらライブラリを自作することで解決いたしました。ありがとうございました。