Euen Hinweis: Dieses Projekt ist nicht mehr aufrechterhalten und wurde ab dem 6. Juni 2024 archiviert. Vielen Dank an alle, die dieses Projekt beigetragen und unterstützt haben. Während das Repository in seinem aktuellen Zustand verfügbar bleibt, werden keine weiteren Aktualisierungen oder Unterstützung bereitgestellt. Bitte zögern Sie nicht, den Code nach Bedarf zu forkieren und zu ändern.
Euen OpenAI hat alle motorbasierten APIs veraltet. Weitere Informationen finden Sie weiter unten veraltete Endpunkte.
Java -Bibliotheken für die Verwendung von OpenAIs GPT -APIs. Unterstützt GPT-3, Chatgpt und GPT-4.
Enthält die folgenden Artefakte:
api : Anfrage/Antwort -Pojos für die GPT -APIs.client : Ein grundlegender Nachrüst -Client für die GPT -Endpunkte enthält das api -Modulservice : Eine grundlegende Dienstklasse, die den Kunden erstellt und anruft. Dies ist der einfachste Weg, um loszulegen.sowie ein Beispielprojekt mit dem Dienst.
implementation 'com.theokanning.openai-gpt3-java:<api|client|service>:<version>'
< dependency >
< groupId >com.theokanning.openai-gpt3-java</ groupId >
< artifactId >{api|client|service}</ artifactId >
< version >version</ version >
</ dependency > Wenn Sie Ihren eigenen Kunden machen möchten, importieren Sie einfach die Pojos aus dem api -Modul. Ihr Kunde muss Snake Case verwenden, um mit der OpenAI -API zu arbeiten.
Wenn Sie Nachrüstungen verwenden, können Sie das client -Modul importieren und die OpenAiapi verwenden.
Sie müssen Ihr Auth-Token als Header hinzufügen (siehe AuthenticationInterceptor) und Ihre Konverterfabrik so einstellen, dass sie Snake Case verwenden und nur Nicht-Null-Felder einbeziehen.
Wenn Sie nach der schnellsten Lösung suchen, importieren Sie das service und verwenden Sie Openaiservice.
Euen Das Openaiservice im Client -Modul ist veraltet. Wechseln Sie bitte zur neuen Version im Service -Modul wechseln.
OpenAiService service = new OpenAiService ( "your_token" );
CompletionRequest completionRequest = CompletionRequest . builder ()
. prompt ( "Somebody once told me the world is gonna roll me" )
. model ( "babbage-002" ")
. echo ( true )
. build ();
service . createCompletion ( completionRequest ). getChoices (). forEach ( System . out :: println );Wenn Sie Openaiservice anpassen müssen, erstellen Sie Ihren eigenen Nachrüstkunden und geben Sie ihn an den Konstruktor weiter. Fügen Sie beispielsweise Folgendes durch, um Anforderungsprotokollierung hinzuzufügen (nach dem Hinzufügen der Abhängigkeit von der Protokollierung Gradle):
ObjectMapper mapper = defaultObjectMapper ();
OkHttpClient client = defaultClient ( token , timeout )
. newBuilder ()
. interceptor ( HttpLoggingInterceptor ())
. build ();
Retrofit retrofit = defaultRetrofit ( client , mapper );
OpenAiApi api = retrofit . create ( OpenAiApi . class );
OpenAiService service = new OpenAiService ( api );Um einen Proxy zu verwenden, ändern Sie den OKHTTP -Client wie unten gezeigt:
ObjectMapper mapper = defaultObjectMapper ();
Proxy proxy = new Proxy ( Proxy . Type . HTTP , new InetSocketAddress ( host , port ));
OkHttpClient client = defaultClient ( token , timeout )
. newBuilder ()
. proxy ( proxy )
. build ();
Retrofit retrofit = defaultRetrofit ( client , mapper );
OpenAiApi api = retrofit . create ( OpenAiApi . class );
OpenAiService service = new OpenAiService ( api );Sie können Ihre Funktionen erstellen und ihre Ausführenden einfach mithilfe der Chatfunction -Klasse zusammen mit allen Ihrer benutzerdefinierten Klassen definieren, in denen die verfügbaren Parameter definiert werden können. Sie können die Funktionen auch mit Hilfe eines Testamentsversorgungsfunktionen mit FunktionsExecutor auch verarbeiten.
Zuerst deklarieren wir unsere Funktionsparameter:
public class Weather {
@ JsonPropertyDescription ( "City and state, for example: León, Guanajuato" )
public String location ;
@ JsonPropertyDescription ( "The temperature unit, can be 'celsius' or 'fahrenheit'" )
@ JsonProperty ( required = true )
public WeatherUnit unit ;
}
public enum WeatherUnit {
CELSIUS , FAHRENHEIT ;
}
public static class WeatherResponse {
public String location ;
public WeatherUnit unit ;
public int temperature ;
public String description ;
// constructor
}Als nächstes deklarieren wir die Funktion selbst und assoziieren sie mit einem Testamentsvollstrecker. In diesem Beispiel werden wir eine Antwort von einer API fälschen:
ChatFunction . builder ()
. name ( "get_weather" )
. description ( "Get the current weather of a location" )
. executor ( Weather . class , w -> new WeatherResponse ( w . location , w . unit , new Random (). nextInt ( 50 ), "sunny" ))
. build ()Anschließend verwenden wir das FunctionExecutor -Objekt aus dem "Service" -Modul, um die Ausführung und Umwandlung in ein Objekt zu unterstützen, das für die Konversation bereit ist:
List < ChatFunction > functionList = // list with functions
FunctionExecutor functionExecutor = new FunctionExecutor ( functionList );
List < ChatMessage > messages = new ArrayList <>();
ChatMessage userMessage = new ChatMessage ( ChatMessageRole . USER . value (), "Tell me the weather in Barcelona." );
messages . add ( userMessage );
ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest
. builder ()
. model ( "gpt-3.5-turbo-0613" )
. messages ( messages )
. functions ( functionExecutor . getFunctions ())
. functionCall ( new ChatCompletionRequestFunctionCall ( "auto" ))
. maxTokens ( 256 )
. build ();
ChatMessage responseMessage = service . createChatCompletion ( chatCompletionRequest ). getChoices (). get ( 0 ). getMessage ();
ChatFunctionCall functionCall = responseMessage . getFunctionCall (); // might be null, but in this case it is certainly a call to our 'get_weather' function.
ChatMessage functionResponseMessage = functionExecutor . executeAndConvertToMessageHandlingExceptions ( functionCall );
messages . add ( response );HINWEIS: Die Funktion
FunctionExecutorist Teil des "Service" -Moduls.
Sie können auch Ihren eigenen Funktionsprüfter erstellen. Das Rückgabeobjekt von ChatFunctionCall.getArguments() ist der Einfachheit halber ein JSONNODE und sollte Ihnen dabei helfen können.
Für ein ausführlicheres Aussehen finden Sie in einem Konversationsbeispiel, das Funktionen verwendet in: openAiapifUctionSexample.java. Oder für ein Beispiel unter Verwendung von Funktionen und Stream: openAiapifunktionswithStreamExample.java
Wenn Sie Ihren Prozess sofort nach dem Streaming -Antworten abschalten möchten, rufen Sie OpenAiService.shutdownExecutor() an.
Dies ist für nicht streaming Anrufe nicht erforderlich.
Alles, was ein Beispiel für ein Beispiel erfordert, ist Ihr OpenAI -API -Token
export OPENAI_TOKEN= " sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX "Sie können alle Funktionen dieses Projekts verwenden, indem Sie:
./gradlew runExampleOneUnd Sie können auch die neue Fähigkeit der Verwendung von Funktionen ausprobieren:
./gradlew runExampleTwoOder Funktionen mit aktiviertem Stream -Modus:
./gradlew runExampleThree Ja! GPT-4 verwendet die ChatCompletion-API und Sie können hier die neuesten Modelloptionen sehen.
GPT-4 befindet sich derzeit in einer begrenzten Beta (zum 01.04.23). Stellen Sie daher sicher, dass Sie Zugriff haben, bevor Sie versuchen, ihn zu verwenden.
Absolut! Es ist sehr einfach, Ihre eigenen Funktionen zu verwenden, ohne sich Gedanken darüber zu machen, die schmutzige Arbeit zu erledigen. Wie oben erwähnt, können Sie sich auf OpenAiapifUnctionSexample.java oder OpenAiapifunktionswithStreamExample.java -Projekte beziehen.
Stellen Sie sicher, dass Openai in Ihrem Land erhältlich ist.
Viele Projekte verwenden Openaiservice, und um sie am besten zu unterstützen, habe ich es extrem einfach gehalten.
Sie können Ihre eigene OpenAiapi -Instanz erstellen, um Header, Zeitüberschreitungen, Basis -URLs usw. anzupassen, usw.
Wenn Sie Funktionen wie Wiederholungslogik und asynchronisierte Anrufe wünschen, müssen Sie eine OpenAiApi -Instanz tätigen und sie direkt anrufen, anstatt OpenAiService zu verwenden
OpenAI hat motorbasierte Endpunkte zugunsten modellbasierter Endpunkte veraltet. Wenn beispielsweise v1/engines/{engine_id}/completions verwendet wird, wechseln Sie zu v1/completions und geben Sie das Modell im CompletionRequest an. Der Code enthält Upgrade -Anweisungen für alle veralteten Endpunkte.
Ich werde die alten Endpunkte aus dieser Bibliothek erst entfernen, wenn OpenAI sie schließt.
Veröffentlicht unter der MIT -Lizenz