🤖

ChatGPT APIを使ってプロジェクト名を生成するCLIツールを作った

2023/03/04に公開1

ChatGPT APIこと Chat completion APIを使って、引数に入力した内容を元に要約したプロジェクト名を生成するCLIツールを作りました。

みなさんは、ローカルで色々コードを書いて実験するときにプロジェクト名(ディレクトリ)を考えるの面倒くさくないですか?ちゃんとした名前を与えた方が良いという考え方もありますが、ちょっとした実験をするために、検索ビリティが高くてオシャレでイケてるネーミングするとかやりますか?やりたくないですよね。

そこで内容を引数に指定してそれを元に要約したプロジェクト名生成ができればハッピーだと思ってサクッと作ってみました。

最近のGPT関連の記事:

Chat completion API を叩く

TypeScriptを使ってChatGPT APIをアクセスしてみる の記事でも使ってたのとほとんど同じコードです。

// llm.ts
export type Message = {
  role: "user" | "system" | "assistant";
  content: string;
};

/** prompt で与えた文章を補完する */
export const completeChat = async (
  apiKey: string,
  messages: Message[]
): Promise<Message | undefined> => {
  const body = JSON.stringify({
    messages,
    model: "gpt-3.5-turbo",
  });

  const res = await fetch("https://api.openai.com/v1/chat/completions", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${apiKey}`,
    },
    body,
  });
  const data = await res.json();

  const choice = 0;

  return data.choices[choice].message;
};

名前を生成する

// main.ts
import * as mod from 'https://deno.land/std/dotenv/mod.ts'
import { resolve } from 'https://deno.land/std/path/mod.ts'

// import { parse } from "https://deno.land/std@0.66.0/flags/mod.ts";

import { Message, completeChat } from './llm.ts'

const envPath = resolve(`${Deno.env.get('HOME')}/.gen.env`)

const { OPENAI_API_KEY: apiKey } = await mod.load({ envPath })

const usage = () => {
  console.log('Usage: gen <プログラムの簡単な説明>')
}

if (Deno.args.length === 0) {
  console.log('引数がありません')
  usage()
  Deno.exit(1)
}

const messages: Message[] = [
  {
    role: 'system',
    content:
      'プログラムの簡単な説明文を与えるので、そのプログラムに適した名前を、アルファベット小文字とハイフンのみで作成してください。ハイフンは3つまで使用しても構いません。',
  },
  {
    role: 'user',
    content: Deno.args.join(' '),
  },
]

const res = await completeChat(apiKey, messages)
if (!res?.content) {
  console.log('生成できませんでした')
  Deno.exit(1)
}

console.log(res.content)

これだけです。AIをCLIツールに簡単に組み込めるの、本当にパラダイムシフトが来たと思ってます。

$ deno run --allow-net --allow-env --allow-read main.ts プロジェクトの初期化をする
init-project
$ deno run --allow-net --allow-env --allow-read main.ts Reactで作ったなんかすごいチャット
amazing-react-chat
$ deno run --allow-net --allow-env --allow-read main.ts 被サークルチェック数をSlackに垂れ流すbot
circle-checker-slack-bot

すごくない?

ちなみに

$ deno compile --allow-net --allow-env --allow-read main.ts
$ ls -al gen
-rwxrwxrwx  1 erukiti  staff  76635871  3  4 17:36 gen

deno compile でバイナリファイルを生成できるので ~/bin あたりに置いておくと良いかもしれません。

Discussion