見出し画像

[maven]OpenAI モデルを取得する

 maven (ビルドツール)でゼロからプロジェクトを構築する備忘録です。流行りの OpenAI API で java ライブラリを使って モデル一覧取得する例です。


前提

AlmaLinux 8.8~8.9

参考 https://note.com/remix_asia/n/n420b747b4f35

javac 11.0.22

参考 https://note.com/remix_asia/n/ne9eda8e8da53

Apache Maven 3.9.6

参考 https://note.com/remix_asia/n/nbce4cab65b66

sashirestela/simple-openai

参考 https://github.com/sashirestela/simple-openai

APIキー

参考 https://note.com/remix_asia/n/n6756b23d161e
シェルの環境変数「OPENAI_API_KEY」に取得したキーを設定しておきます。

$ export OPENAI_API_KEY="sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

maven プロジェクト構築

新規プロジェクト生成

 フォルダ・ファイルのひな形を生成するコマンド

$ mvn archetype:generate

と、入力値(★箇所)

[INFO] Scanning for projects...
...
3409: remote -> za.co.absa.hyperdrive:component-archetype_2.11 (-)
3410: remote -> za.co.absa.hyperdrive:component-archetype_2.12 (-)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 2133: ★エンター
Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
7: 1.3
8: 1.4
Choose a number: 8: ★エンター

...

Define value for property 'groupId': jp.example	★デフォルトパッケージ名
Define value for property 'artifactId': test	★ディレクトリ名
Define value for property 'version' 1.0-SNAPSHOT: : ★エンター
Define value for property 'package' jp.example: : ★エンター
Confirm properties configuration:
groupId: jp.example
artifactId: test
version: 1.0-SNAPSHOT
package: jp.example
 Y: : y ★

...

[INFO] BUILD SUCCESS

...

で生成されるパス名は次の関係になります。ビルド情報が記載された Project Object Model (pom.xml)ファイルも生成されています。

/home/wanko/test
|-- pom.xml ★
`-- src
    |-- main
    |   `-- java
    |       `-- jp
    |           `-- example
    |               `-- App.java ★
    `-- test
        `-- java
            `-- jp
                `-- example
                    `-- AppTest.java ★

コンパイル

 プロジェクトフォルダに移動し

$ cd ~/test

 コンパイルします。

$ mvn clean compile

 target フォルダ以下に class ファイルなどが生成されます。

/home/wanko/test
|-- pom.xml
|-- src
|   |-- main
|   |   `-- java
|   |       `-- jp
|   |           `-- example
|   |               `-- App.java
|   `-- test
|       `-- java
|           `-- jp
|               `-- example
|                   `-- AppTest.java
`-- target
    |-- classes
    |   `-- jp
    |       `-- example
    |           `-- App.class ★
    |-- generated-sources
    |   `-- annotations
    `-- maven-status
        `-- maven-compiler-plugin
            `-- compile
                `-- default-compile
                    |-- createdFiles.lst
                    `-- inputFiles.lst

実行

 実行すると Hello World! が表示されます。

$ java -cp target/classes jp.example.App

 このプロジェクトは github へアップしたのでリソース変更点を見ていただけます。

の 2024-04-28 コミット a966f9f5e359d7e10d742e9e11af86ed133146bb に該当します。

実装

pom.xml

 pom.xml ファイルの <dependencies>~</dependencies> に、OpenAI API javaライブラリの1つ「sashirestela/simple-openai」についての

	<dependency>
		<groupId>io.github.sashirestela</groupId>
		<artifactId>simple-openai</artifactId>
		<version>2.3.3</version>
	</dependency>

を追加することで利用可能になります。

main/java/jp/example/App.java

 App.java ファイルを次のように編集します。「sashirestela/simple-openai」では最新の java記法 var や ラムダ式を使ったデモソースが紹介されていますが、型を理解したい為 maven プロジェクトデフォルトの java1.7 のままでビルド出来るように実装しています。

package jp.example;

import io.github.sashirestela.openai.BaseSimpleOpenAI;
import io.github.sashirestela.openai.domain.model.ModelResponse;
import io.github.sashirestela.openai.SimpleOpenAI;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.concurrent.CompletableFuture;
import java.util.Iterator;
import java.util.List;

/**
 * list of model in OpenAI.
 *
 */
public class App{
	public static void main( String[] a ){
		SimpleDateFormat sdf= new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss" );
		BaseSimpleOpenAI openAI;

		try{
			openAI= SimpleOpenAI.builder()
			.apiKey( System.getenv( "OPENAI_API_KEY" ) )
			.build();

			CompletableFuture futureModels= (CompletableFuture)( openAI.models().getList() );
			List models= (List)( futureModels.join() );
			for( Iterator it= models.iterator(); it.hasNext(); ){
				ModelResponse m= (ModelResponse)( it.next() );
				Timestamp t= new Timestamp( 1000 * m.getCreated() );
				System.out.println( String.format(
					"%s,%s,%-15s,%s", sdf.format( t ), m.getObject(), m.getOwnedBy(), m.getId() ) );
			}
		}catch( Exception e ){
			e.printStackTrace();
		}
	}
}

2024-05-05 コミット c3eac9af985b9cf1f14d87bf1b77572eb6de3ed8 に該当します。https://github.com/remixgrjp/openai_model/commit/c3eac9af985b9cf1f14d87bf1b77572eb6de3ed8

コンパイル

$ mvn clean compile

実行

 ここで maven が威力を発揮します。モデル一覧が表示されれば成功です。

$ mvn exec:java -Dexec.mainClass=jp.example.App

 javaコマンドで実行する場合 クラスパスに依存ライブラリを指定しなければなりません。

$ mvn dependency:copy-dependencies -DoutputDirectory=lib

で、依存する全ての jarファイルをlibフォルダにダウンロードできます。

$ java -cp target/classes:lib/* jp.example.App

で実行できます。

終わり

https://github.com/remixgrjp/openai_model

の 2024-05-06 コミット 43efe9ecfc4b79dd0fcd360358102c9d6d809237 では 取得したモデル一覧を ID昇順ソートを追加実装しています。
 ちなみに、モデル一覧の問い合わせは何度実行しても支払いは消費されていませんでした。

速報

2024-05-15 AM07:00 現在
 ニュースで報じられている gpt-4o が、モデル一覧に追加されています。

...
2024-05-11 03:50:49,model,system         ,gpt-4o
2024-05-11 04:08:52,model,system         ,gpt-4o-2024-05-13
...

 投げ銭も出来るんですね。

ここから先は

0字

¥ 100

この記事が気に入ったらサポートをしてみませんか?