️ Aviso: Este projeto não é mais mantido e foi arquivado em 6 de junho de 2024. Obrigado a todos que contribuíram e apoiaram este projeto. Embora o repositório permaneça disponível em seu estado atual, nenhuma atualização ou suporte adicional será fornecido. Sinta -se à vontade para bifurcar e modificar o código conforme necessário.
️ O OpenAI depreciou todas as APIs baseadas em motor. Veja pontos de extremidade depreciados abaixo para obter mais informações.
Bibliotecas Java para usar as APIs GPT do OpenAI. Suporta GPT-3, ChatGPT e GPT-4.
Inclui os seguintes artefatos:
api : Solicitar/Resposta Pojos para as APIs GPT.client : Um cliente de retrofit básico para os terminais GPT, inclui o módulo apiservice : uma classe de serviço básico que cria e chama o cliente. Esta é a maneira mais fácil de começar.bem como um exemplo de projeto usando o serviço.
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 > Se você deseja criar seu próprio cliente, basta importar os Pojos do módulo api . Seu cliente precisará usar o caso de cobra para trabalhar com a API OpenAI.
Se você estiver usando o Retrofit, poderá importar o módulo client e usar o OpenAIAPI.
Você precisará adicionar seu token de autenticação como cabeçalho (consulte AuthenticationInterceptor) e definir sua fábrica de conversor para usar o caso de cobra e incluir apenas campos não nulos.
Se você está procurando a solução mais rápida, importe o módulo service e use o OpenAiservice.
️ O OpenAiservice no módulo do cliente está descontinuado, mude para a nova versão no módulo de serviço.
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 );Se você precisar personalizar o OpeniserService, crie seu próprio cliente de modernização e passe -o para o construtor. Por exemplo, faça o seguinte para adicionar o registro de solicitação (depois de adicionar a dependência do registro 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 um proxy, modifique o cliente OKHTTP, como mostrado abaixo:
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 );Você pode criar suas funções e definir seus executores facilmente usando a classe ChatFunction, juntamente com qualquer uma das suas classes personalizadas que servirão para definir os parâmetros disponíveis. Você também pode processar as funções com facilidade, com a ajuda de um executor chamado FunctionExector.
Primeiro, declaramos nossos parâmetros de função:
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
}Em seguida, declaramos a própria função e a associamos a um executor; neste exemplo, fingiremos uma resposta de algumas 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 ()Em seguida, empregamos o objeto FunctionExecutor do módulo 'Serviço' para ajudar na execução e transformação em um objeto que está pronto para a conversa:
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: A classe
FunctionExecutorfaz parte do módulo 'Serviço'.
Você também pode criar seu próprio executor de funções. O objeto de retorno do ChatFunctionCall.getArguments() é um JSONNode para simplificar e deve poder ajudá -lo com isso.
Para uma aparência mais aprofundada, consulte um exemplo de conversação que emprega funções em: OpenAiapifunctionSexample.java. Ou para um exemplo usando funções e fluxo: OpenAiapifunctionSwithstreamExample.java
Se você deseja encerrar seu processo imediatamente após a transmissão de respostas, ligue para OpenAiService.shutdownExecutor() .
Isso não é necessário para chamadas não transmitidas.
Todo o projeto de exemplo requer é o seu token de API OpenAI
export OPENAI_TOKEN= " sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX "Você pode tentar todos os recursos deste projeto usando:
./gradlew runExampleOneE você também pode tentar a nova capacidade de usar funções:
./gradlew runExampleTwoOu funções com o modo 'stream' ativado:
./gradlew runExampleThree Sim! O GPT-4 usa a API do ChatCompletion e você pode ver as opções mais recentes do modelo aqui.
O GPT-4 está atualmente em uma versão beta limitada (a partir de 1/4/23), portanto, verifique se você tem acesso antes de tentar usá-lo.
Absolutamente! É muito fácil usar suas próprias funções sem se preocupar em fazer o trabalho sujo. Como mencionado acima, você pode consultar o OpenAIAPifunctionSexample.java ou o OpenAiapifunctionSwithstreamExample.java Projects para um exemplo.
Certifique -se de que o OpenAI esteja disponível em seu país.
Muitos projetos usam o OpeniserService e, para apoiá -los melhor, eu o mantive extremamente simples.
Você pode criar sua própria instância OpenAiapi para personalizar cabeçalhos, tempos limite, URLs base etc.
Se você deseja recursos como a lógica de repetição e as chamadas assíncronas, você terá que fazer uma instância OpenAiApi e chamá -la diretamente em vez de usar OpenAiService
O OpenAI depreciou os pontos finais baseados no motor em favor de pontos de extremidade baseados em modelo. Por exemplo, em vez de usar v1/engines/{engine_id}/completions , mude para v1/completions e especifique o modelo no CompletionRequest . O código inclui instruções de atualização para todos os pontos de extremidade depreciados.
Não vou remover os pontos de extremidade antigos desta biblioteca até que o OpenAI os feche.
Publicado sob a licença do MIT