1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

APIをたたいてみる②NodeJSサーバーからリクエストを投げる

1
Posted at

概要

こちらの続きになります.

APIを直に叩いて使う人はエンジニアだけです.
基本的には,ユーザーが保有するクライアントアプリケーションや,Webサーバーが外部連携(連携??)という形でたたきに行きます.

今回はNodeJSのサーバーからChatGPTのAPIにリクエストを投げます.
使用するのは以下で立てるReactのWebサーバーになります.

接続に必要な情報

APIを叩くには以下の3つが必要なことがあります.

  • エンドポイント
    • URLです,アクセスする先を指定します.
  • APIキー
    • 叩いていい権限があるかチェックするために用いります.
  • リクエスト文
    • 何をしたいか記述します.
    • 内容はAPIサーバーの中身に依存します.

ソースコード

色々な事情で不要な部分もありますが,APIを叩く部分についてちゃんと解説します.

今回使用しているソースコードをそのまま記載します.
// server/pages/azure_ai_connection_test.tsx

import { customLog } from "@/utils/customLog";

const API_KEY: string = process.env.AZURE_AI_API_KEY_CHATGPT35!;
const AZURE_AI_SERVER_URL: string = process.env.AZURE_AI_SERVER_URL!;

async function fetchData() {
  const headers = new Headers();
  headers.append("api-key", API_KEY);
  headers.append("Content-Type", "application/json");

  const body = JSON.stringify({
      "messages": [
        {
          "role": "system",
          "content": "You are an AI assistant that helps people find information."
        }
      ],
      "temperature": 0.7,
      "top_p": 0.95,
      "frequency_penalty": 0,
      "presence_penalty": 0,
      "max_tokens": 800,
      "stop": null
    }
  );

  const requestOptions = {
    method: "POST",
    headers: headers,
    body: body
  };

  // ビルドするたびにAPIが走るので,回避中
  customLog("実行にはソースの修正が必要です.","DEBUG");
  //return {context: "実行にはソースの修正が必要です."};
  const response = await fetch(AZURE_AI_SERVER_URL, requestOptions);
  let data = undefined;
  if (response.ok) {
    data = await response.json();
    customLog(data, "DEBUG");
  } else {
    console.log('Network response was not ok');
  }
  return { context: data };
}

// ページコンポーネント
function HelloAzureAI({ context }: any) {
  return (
    <div>
      <h1>TestJson!!</h1>
      <pre>{JSON.stringify(context, null, 2)}</pre>
    </div>
  );
}

// サーバーサイドでデータを取得する関数
export async function getServerSideProps() {
  const data = await fetchData();
  return { props: { ...data } };
}

export default HelloAzureAI;

ソース解説

リクエスト実行部分

APIを叩くときの根幹部分はこちらになります.

const response = await fetch(AZURE_AI_SERVER_URL, requestOptions);
  let data = undefined;
  if (response.ok) {
    data = await response.json();
    console.log('データ取得できました.');
  } else {
    console.log('レスポンスがありません.');
  }
  • AZURE_AI_SERVER_URL : エンドポイントが入ります.(string形式)
  • requestOptions : リクエストに必要な情報が入ります.
  • data : 取得したデータを入れます.

requestOptions

では,requestOptionsの中身を解説します.
また,下記のものが格納されていればいいので,requestOptionsという名前でなくてもいいです.

  const requestOptions = {
    method: "POST",
    headers: headers,
    body: body
  };

headers

ヘッダー情報にはAPI_KEYの情報と,「リクエストをJson形式で送る」というメタ情報を送る.

  const API_KEY: string = "abcd123abcd123abcd123abcd123";

  
  const headers = new Headers();
  headers.append("api-key", API_KEY);
  headers.append("Content-Type", "application/json");

body

ボディーには今回使用するChatGPTの公式リファレンスにのっとって必須の項目や,オプションで設定できる項目を記述する.
詳細は下記参照

  const body = JSON.stringify({
      "messages": [
        {
          "role": "system",
          "content": "You are an AI assistant that helps people find information."
        }
      ],
      "temperature": 0.7,
      "top_p": 0.95,
      "frequency_penalty": 0,
      "presence_penalty": 0,
      "max_tokens": 800,
      "stop": null
    }
  );

本来本家ChatGPTのAPIであれば,AIのmodel名の指定が必須条件になっているが,AzureOpenAIを指定しており,エンドポイントに対してモデルが決まっているため不要.
他条件については妥当なもの,標準設定を行っている.

出力結果

今回のソースでは,返ってきたレスポンスデータをすべてそのまま画面に出している.
これらの情報の内,使用したいものを厳選して使用する.

image.png

例えば,
data.choices[0].message.contentを指定すれば
Hello, I am an AI assistant designed to help you find information. How may I assist you today?というAIの返答のみを取得できます.

終わりに

今回はAPIを叩いてみた.
また,APIの枠組みを簡単に説明した.
何かわからないこと等あれば質問いただけると幸いです!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?