️ Aviso: Este proyecto ya no se mantiene y ha sido archivado a partir del 6 de junio de 2024. Gracias a todos los que han contribuido y apoyado este proyecto. Si bien el repositorio permanecerá disponible en su estado actual, no se proporcionarán más actualizaciones o soporte. No dude en bifurcar y modificar el código según sea necesario.
️ Operai ha desaprobado todas las API basadas en el motor. Consulte los puntos finales desapercibidos a continuación para obtener más información.
Bibliotecas Java para usar las API GPT de OpenAI. Admite GPT-3, CHATGPT y GPT-4.
Incluye los siguientes artefactos:
api : POJOS de solicitud/respuesta para las API GPT.client : un cliente de modernización básico para los puntos finales GPT, incluye el módulo apiservice : una clase de servicio básica que crea y llama al cliente. Esta es la forma más fácil de comenzar.así como un proyecto de ejemplo utilizando el servicio.
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 > Si desea hacer su propio cliente, solo importe los Pojos del módulo api . Su cliente deberá usar el estuche de serpiente para trabajar con la API de OpenAI.
Si está utilizando Retrofit, puede importar el módulo client y usar el OpenAIAPI.
Tendrá que agregar su token de autenticación como encabezado (ver Authentication Interceptor) y establecer su fábrica convertidor para usar la caja de serpiente e solo incluir campos no nulos.
Si está buscando la solución más rápida, importe el módulo service y use OpenAiservice.
️ OpenAiservice en el módulo Cliente está en desuso, cambie a la nueva versión en el módulo de servicio.
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 );Si necesita personalizar OpenaIservice, cree su propio cliente de modernización y transmitirlo al constructor. Por ejemplo, haga lo siguiente para agregar el registro de solicitudes (después de agregar la dependencia del gradle de registro):
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 );Para usar un proxy, modifique el cliente OKHTTP como se muestra a continuación:
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 );Puede crear sus funciones y definir sus ejecutores fácilmente utilizando la clase defunction de chat, junto con cualquiera de sus clases personalizadas que servirán para definir sus parámetros disponibles. También puede procesar las funciones con facilidad, con la ayuda de un ejecutor llamado FunctionExecutor.
Primero declaramos los parámetros de nuestra función:
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
}A continuación, declaramos la función en sí misma y la asociamos con un albacea, en este ejemplo fingiremos una respuesta de alguna API:
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 ()Luego, empleamos el objeto FunctionExecutor del módulo 'Servicio' para ayudar con la ejecución y la transformación en un objeto que está listo para la conversación:
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 );Nota: La clase
FunctionExecutores parte del módulo 'Servicio'.
También puede crear su propio ejecutor de funciones. El objeto de retorno de ChatFunctionCall.getArguments() es un JSONNODE para simplificar y debería poder ayudarlo con eso.
Para una apariencia más profunda, consulte un ejemplo de conversación que emplee funciones en: OpenAIApifunctionSexample.java. O para un ejemplo usando funciones y transmisión: OpenAIaApifunctionswithstreamExample.java
Si desea cerrar su proceso inmediatamente después de la transmisión de respuestas, llame a OpenAiService.shutdownExecutor() .
Esto no es necesario para las llamadas no corrientes.
Todo lo que el proyecto de ejemplo requiere es su token API de OpenAI
export OPENAI_TOKEN= " sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX "Puede probar todas las capacidades de este proyecto usando:
./gradlew runExampleOneY también puede probar la nueva capacidad de usar funciones:
./gradlew runExampleTwoO funciones con el modo 'stream' habilitado:
./gradlew runExampleThree ¡Sí! GPT-4 usa la API de Completion de chat, y puede ver las últimas opciones de modelo aquí.
GPT-4 se encuentra actualmente en una versión beta limitada (a partir del 4/1/23), así que asegúrese de tener acceso antes de intentar usarla.
¡Absolutamente! Es muy fácil usar sus propias funciones sin preocuparse por hacer el trabajo sucio. Como se mencionó anteriormente, puede referirse a OpenAIaPifunctionSexample.java o OpenAiapifunctionswithstreamExample.java proyectos para un ejemplo.
Asegúrese de que Operai esté disponible en su país.
Muchos proyectos usan OpenaIservice, y para apoyarlos mejor, lo he mantenido extremadamente simple.
Puede crear su propia instancia de OpenAiapi para personalizar encabezados, tiempos de espera, URL base, etc.
Si desea características como Retry Logic y Async Llamadas, tendrá que hacer una instancia OpenAiApi y llamarlo directamente en lugar de usar OpenAiService
OpenAI tiene puntos finales basados en el motor a favor de los puntos finales basados en modelos. Por ejemplo, en lugar de usar v1/engines/{engine_id}/completions , cambie a v1/completions y especifique el modelo en el CompletionRequest . El código incluye instrucciones de actualización para todos los puntos finales desaprobados.
No eliminaré los viejos puntos finales de esta biblioteca hasta que OpenAi los cierra.
Publicado bajo la licencia MIT