📌

ChatGPTのCLIアプリケーションを作成し、公開するまでの流れ

2023/03/27に公開

この記事は?

OpenAI社のChatAPIを使用し、ターミナル上にChatGPTを組み込むためのライブラリを公開するまでの流れを記述しています。
https://platform.openai.com/docs/introduction/overview
想定する動作環境は下記の通りになります。

  • 端末: Intel Mac
  • OS: MacOS (Monterey v12.6.1)
  • 言語: Ruby (v2.6.10p210)
  • ツール: Bundler (v2.4.9)

完成したもの

https://github.com/M01tyan/chat_cli
Github上に作成したものを公開しています。気になる方はコードを見てみてください。

雛形の作成

https://qiita.com/miminashi/items/229594ec3b85cffce33f
↑こちらの記事を参考にgemパッケージの雛形を作成します。
ただし、雛形を作成する前に自分が公開したい名前と同じ名前のパッケージが存在しないか確認したほうが、後々スムーズにことが進むと思います。
パッケージ名は下記コマンドかRubyGemsのサイトで確認できます。
$gem search YOUR_PACKAGE_NAME

依存パッケージのインストール

$bundle gem xxxx -bコマンドによって作成されたディレクトリ内のxxxx.gemspecファイルに依存関係を記述していきます。(パッケージ名がchat_cliの場合はchat_cli.gemspecというファイル名になります。以降は任意のパッケージ名の箇所をchat_cliとします。)
今回は、下記の3つのパッケージを記述します

  • thor
    CLIアプリケーションを作成するためのフレームワーク
  • ruby-openai
    OpenAIのAPIクライアント
  • dotenv
    APIキー管理用のパッケージ
chat_cli.gemspec
  Gem::Specification.new do |spec|
    ...
    
+   spec.add_dependency, 'thor', '~> 1.2'
+   spec.add_dependency, 'ruby-openai', '~> 3.6'
+   spec.add_dependency, 'dotenv', '~> 2.8'
  end

gemspecファイルの記載

chat_cli.gemspec
  Gem::Specification.new do |spec|
    spec.name = "chat_cli"
    ...
  
-   spec.summary = "TODO: Write a short summary, because RubyGems requires one."
-   spec.description = "TODO: Write a longer description or delete this line."
-   spec.homepage = "TODO: Put your gem's website or public repo URL here."
+   spec.summary = "print Hello."
+   spec.description = "print Hello."
+   spec.homepage = "https://rubygems.org/gems/chat_cli"
    spec.required_ruby_version = ">= 2.6.0"
    
-   spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
+   spec.metadata["allowed_push_host"] = "https://rubygems.org/gems/chat_cli"
  
    spec.metadata["homepage_uri"] = spec.homepage
-   spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
-   spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
+   spec.metadata["source_code_uri"] = "https://github.com/M01tyan/chat_cli"

    ...
  end

.gemspecのファイルの記述ができたら、$bundle installコマンドで依存関係をインストールしておきます。

パッケージの作成

実際にパッケージの中身を記載していきます。
今回はThorフレームワークを使った場合の記述をしていくため、フレームワークを使わない場合や、その他のフレームワークを使用した場合とは多少異なる可能性があります

1. CLIクラスの作成

CLIクラスの中身はコマンドを記述します。下記ではHelloというだけのコマンドを記載してあります。
実際に作成したコードをみたい方はGithubを参照してください。

lib/chat_cli.rb
+ require "thor"
  require_relative "chat_cli/version"
  
  module ChatCli
    class Error < StandardError; end
+   class CLI < Thor
+     desc "hello", "print Hello."
+     def hello
+       say "Hello"
+     end
+   end
  end

2. コマンド実行時にCLIクラスの起動

exe/chat_cli.rb
  #!/usr/bin/env ruby
  
  require "chat_cli"
  
+ ChatCli::CLI.start

作成したパッケージは、$bundle exec exe/chat_cli helloで実行することができます。
上記コマンドで実行できない場合は、事前に$bundle installコマンドを実行して、依存関係をインストールしておく必要があります。

パッケージのビルド

$bundle exec rake build
↑こちらのコマンドを実行して、.gemのパッケージを作成します。.gemファイルはプロジェクトディレクトリのpkg/chat_cli-0.1.0.gemとして作成されます。

公開前の動作確認

$gem install pkg/chat_cli-0.1.0.gem
↑こちらのコマンドで公開する前にローカルにgemをインストールして挙動を確認することができます。

また、アンインストールするには↓こちらのコマンドで行えます
$gem uninstall chat_cli

rubygemsにアカウントの作成

https://rubygems.org/sign_up
↑こちらのリンクからrubygemsにアカウントを作成します。

アカウント作成後は、ターミナルを認証させるために、下記コマンドを実行する必要があります

$curl -u ユーザの名前 https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials

(Homeディレクトリに.gemディレクトリが存在しない場合は、作成して上で実行してください)

公開🎉

$gem push pkg/chat_cli-0.1.0.gem
↑こちらのコマンドでビルドしたgemファイルを公開します。

公開されたかどうか確認するためにRubyGemsのサイトで検索してみてください。
https://rubygems.org/

参考記事

Discussion