Giter VIP home page Giter VIP logo

chatgpt-java-api's Introduction

ChatGPT Java API

Maven Central License

An unofficial, easy-to-use Java/Kotlin OpenAI API for ChatGPT, Assistants, and more!

Features

Installation

For Kotlin DSL (build.gradle.kts), add this to your dependencies block:

dependencies {
    implementation("com.cjcrafter:openai:2.1.0")
}

For Maven projects, add this to your pom.xml file in the <dependencies> block:

<dependency>
    <groupId>com.cjcrafter</groupId>
    <artifactId>openai</artifactId>
    <version>2.1.0</version>
</dependency>

See the maven repository for gradle/ant/etc.

Working Example

This is a simple working example of the ChatGPT API in Java:

import com.cjcrafter.openai.OpenAI;
import com.cjcrafter.openai.chat.ChatMessage;
import com.cjcrafter.openai.chat.ChatRequest;
import com.cjcrafter.openai.chat.ChatResponse;
import io.github.cdimascio.dotenv.Dotenv;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * In this Java example, we will be using the Chat API to create a simple chatbot.
 */
public class ChatCompletion {

  public static void main(String[] args) {

    // To use dotenv, you need to add the "io.github.cdimascio:dotenv-kotlin:version"
    // dependency. Then you can add a .env file in your project directory.
    String key = Dotenv.load().get("OPENAI_TOKEN");
    OpenAI openai = OpenAI.builder()
            .apiKey(key)
            .build();

    List<ChatMessage> messages = new ArrayList<>();
    messages.add(ChatMessage.toSystemMessage("Help the user with their problem."));

    // Here you can change the model's settings, add tools, and more.
    ChatRequest request = ChatRequest.builder()
            .model("gpt-3.5-turbo")
            .messages(messages)
            .build();

    Scanner scan = new Scanner(System.in);
    while (true) {
      System.out.println("What are you having trouble with?");
      String input = scan.nextLine();

      messages.add(ChatMessage.toUserMessage(input));
      ChatResponse response = openai.createChatCompletion(request);

      System.out.println("Generating Response...");
      System.out.println(response.get(0).getMessage().getContent());

      // Make sure to add the response to the messages list!
      messages.add(response.get(0).getMessage());
    }
  }
}

For more examples, check out examples.

Note: OpenAI recommends using environment variables for your API token (Read more).

Logging

We use SLF4J for logging. To enable logging, add a logging implementation to your project. If you encounter an issue with the JSON parsing, we will ask that you enable logging and send us the logs.

Adding a logging implementation:

implementation("ch.qos.logback:logback-classic:$version")

Add a logback.xml file to your resources folder:

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>debug.log</file>
        <append>false</append>
        <encoder>
            <pattern>%date %level [%thread] %logger{10} %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.cjcrafter.openai" level="DEBUG"/> <!-- Change to OFF to disable our logging -->

    <root level="DEBUG">
        <appender-ref ref="FILE"/>
    </root>
</configuration>

Support

If I have saved you time, please consider sponsoring me.

License

ChatGPT-Java-API is an open-sourced software licensed under the MIT License. This is an unofficial library, and is not affiliated with OpenAI.

chatgpt-java-api's People

Contributors

cjcrafter avatar ugwun avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

chatgpt-java-api's Issues

Automatically Update README.md for Updates

In the below text, the 1.0.0 quickly falls out of date. It needs to be updated every release.


For Gradle projects, add this to your build.gradle file in the dependencies block:

dependencies {
    implementation 'com.cjcrafter:openai:1.0.0'
}

Or, if you are using Kotlin DSL (build.gradle.kts), add this to your dependencies block:

dependencies {
    implementation("com.cjcrafter:openai:1.0.0")
}

For Maven projects, add this to your pom.xml file in the <dependencies> block:

<dependency>
    <groupId>com.cjcrafter</groupId>
    <artifactId>openai</artifactId>
    <version>1.0.0</version>
</dependency>

See the maven repository for gradle/ant/etc.


Use a GitHub action like this:

name: Update README Version

on:
  release:
    types:
      - published

jobs:
  update-version:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Update version in README
        run: |
          VERSION=$(echo $GITHUB_REF | sed 's/refs\/tags\///g')
          sed -i "s/com.cjcrafter:openai:[0-9]*\.[0-9]*\.[0-9]*/com.cjcrafter:openai:$VERSION/g" README.md

      - name: Commit and push changes
        run: |
          git config --global user.name "GitHub Actions Bot"
          git config --global user.email "<your-email>"
          git add README.md
          git commit -m "Update version in README.md"
          git push

Files inconsistancy

When using other libraries, like the js or python openai libraries, file operations are in their own "files" object.

For example, openai.files.retrieve(...). Instead of polluting the OpenAI interface with each object's methods, each object should get their own handler class.

How to cancel request ?

I'm using your API in kotlin's coroutines, but the async API doesn't return any cancellable to cancel the HTTP request. What's the recommended way cancel pending requests?

Maven Repository

Create a maven repository so people can shade the jar without copy-pasting.

Helps with #1

Streaming for assistants

Discussed in #47

Originally posted by Nicodm13 March 16, 2024
Hello!

Do you have any plans on adding stream support for assistants?

Thanks in advance.

Exponential Backoff

OpenAI's API fails a lot. Randomly. Between timeouts, rate limits, funds, etc., it can be hard to handle all of these errors. Of course, for most of these errors, you can simply send the request again. Maybe it'll work on the second or third try.

OpenAI recommends adding exponential backoff, described below (by ChatGPT of course):

Exponential backoff is an algorithm that's used to space out repeated re-attempts (also known as "retries") in the face of failure. This is commonly used in computer networks and APIs to manage load under failure scenarios.

The core idea of exponential backoff is to increase the wait time between retries exponentially, up to a maximum number of retries or a maximum delay time. For example, you might start with a delay of 1 second, then if that attempt still fails, wait 2 seconds, then 4 seconds, and so on, doubling each time.

The primary purpose of this approach is to reduce the load on the system that is being called, giving it time to recover and complete its outstanding tasks before more requests arrive.

It's especially useful when a large number of entities are trying to access a single resource that may have a rate limit or some other kind of congestion problem. It's a way to automatically adapt the retry rate to the rate at which the resource can handle requests.

Often, exponential backoff is combined with a "jitter" strategy, which adds some random variation to the delays to avoid synchronization of retries. Without jitter, a surge of requests that all fail at the same time will also retry at the same time. With jitter, the retries are more spread out, which is generally more efficient.

In context of OpenAI or any other API, if you receive errors suggesting the service is unavailable or you are being rate limited, using exponential backoff for retries can be an effective strategy to handle those errors.

Every method should have an optional argument in addition to the request for exponential backoff. This way developers can control the number of retries, the delay, etc.

EOFException and MalformedJsonException

I have this simple code:

val request = ChatRequest(model = "gpt-3.5-turbo", messages = mutableListOf("Hi. How are you?".toUserMessage()))
val openai = OpenAI(getOpenAIToken(), null, OkHttpClient.Builder().readTimeout(120, TimeUnit.SECONDS).build())
// This line will block
val response = openai.createChatCompletion(request)

but I get the following exceptions:

com.google.gson.JsonSyntaxException: java.io.EOFException: End of input at line 1 column 2 path $.
	at com.google.gson.internal.Streams.parse(Streams.java:59)
	at com.google.gson.JsonParser.parseReader(JsonParser.java:102)
	at com.google.gson.JsonParser.parseReader(JsonParser.java:70)
	at com.google.gson.JsonParser.parseString(JsonParser.java:51)
	at com.cjcrafter.openai.OpenAICallback.handleStream(OpenAICallback.kt:66)
	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:30)
	at com.cjcrafter.openai.OpenAI.createChatCompletion(OpenAI.kt:252)
...
Caused by: java.io.EOFException: End of input at line 1 column 2 path $.
	at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1457)
	at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:503)
	at com.google.gson.stream.JsonReader.hasNext(JsonReader.java:422)
	at com.google.gson.internal.bind.TypeAdapters$28.read(TypeAdapters.java:779)
	at com.google.gson.internal.bind.TypeAdapters$28.read(TypeAdapters.java:725)
	at com.google.gson.internal.Streams.parse(Streams.java:49)

and then lots of this exceptions:

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 8 path $
	at com.google.gson.JsonParser.parseReader(JsonParser.java:76)
	at com.google.gson.JsonParser.parseString(JsonParser.java:51)
	at com.cjcrafter.openai.OpenAICallback.handleStream(OpenAICallback.kt:66)
	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:30)
	at com.cjcrafter.openai.OpenAI.createChatCompletion(OpenAI.kt:252)

and finally this:

lateinit property response has not been initialized
kotlin.UninitializedPropertyAccessException: lateinit property response has not been initialized
	at com.cjcrafter.openai.OpenAI.createChatCompletion(OpenAI.kt:254)

Completions inconsistency

Every object gets their own handler accessible from the OpenAI class except for completions (both completions and chat completions). They each should get their own handler. This will also help the API match up better with the official APIs provided by OpenAI

Allow user to capture error message from OpenAI API if rate limit exceed

Thank you for this library. I have this one little issue.

When rate limit is exceeded, following error message is shown in logcat. I want to catch this error message and show it to end user.

com.google.gson.JsonSyntaxException: java.io.EOFException: End of input at line 1 column 2 path $.
                           W  	at com.google.gson.internal.Streams.parse(Streams.java:59)
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:102)
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:70)
                           W  	at com.google.gson.JsonParser.parseString(JsonParser.java:51)
                           W  	at com.cjcrafter.openai.OpenAICallback.handleStream(OpenAICallback.kt:66)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:30)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:25)
                           W  	at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
                           W  	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
                           W  	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
                           W  	at java.lang.Thread.run(Thread.java:1012)
                           W  Caused by: java.io.EOFException: End of input at line 1 column 2 path $.
                           W  	at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1457)
                           W  	at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:503)
                           W  	at com.google.gson.stream.JsonReader.hasNext(JsonReader.java:422)
                           W  	at com.google.gson.internal.bind.TypeAdapters$28.read(TypeAdapters.java:779)
                           W  	at com.google.gson.internal.bind.TypeAdapters$28.read(TypeAdapters.java:725)
                           W  	at com.google.gson.internal.Streams.parse(Streams.java:49)
                           W  	... 10 more
System.out                 I      "error": {
System.err                 W  com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 13 path $
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:76)
                           W  	at com.google.gson.JsonParser.parseString(JsonParser.java:51)
                           W  	at com.cjcrafter.openai.OpenAICallback.handleStream(OpenAICallback.kt:66)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:30)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:25)
                           W  	at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
                           W  	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
                           W  	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
                           W  	at java.lang.Thread.run(Thread.java:1012)
                           W  Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 13 path $
                           W  	at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1659)
                           W  	at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1465)
                           W  	at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:551)
                           W  	at com.google.gson.stream.JsonReader.peek(JsonReader.java:433)
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:71)
                           W  	... 8 more
System.out                 I          "message": "Rate limit reached for default-gpt-3.5-turbo in organization on requests per min. Limit: 3 / min. Please try again in 20s. Contact us through our help center at help.openai.com if you continue to have issues. Please add a payment method to your account to increase your rate limit. Visit https://platform.openai.com/account/billing to add a payment method.",
System.err                 W  com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 19 path $
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:76)
                           W  	at com.google.gson.JsonParser.parseString(JsonParser.java:51)
                           W  	at com.cjcrafter.openai.OpenAICallback.handleStream(OpenAICallback.kt:66)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:30)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:25)
                           W  	at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
                           W  	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
                           W  	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
                           W  	at java.lang.Thread.run(Thread.java:1012)
                           W  Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 19 path $
                           W  	at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1659)
                           W  	at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1465)
                           W  	at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:551)
                           W  	at com.google.gson.stream.JsonReader.peek(JsonReader.java:433)
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:71)
                           W  	... 8 more
System.out                 I          "type": "requests",
System.err                 W  com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 16 path $
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:76)
                           W  	at com.google.gson.JsonParser.parseString(JsonParser.java:51)
                           W  	at com.cjcrafter.openai.OpenAICallback.handleStream(OpenAICallback.kt:66)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:30)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:25)
                           W  	at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
                           W  	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
                           W  	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
                           W  	at java.lang.Thread.run(Thread.java:1012)
                           W  Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 16 path $
                           W  	at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1659)
                           W  	at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1465)
                           W  	at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:551)
                           W  	at com.google.gson.stream.JsonReader.peek(JsonReader.java:433)
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:71)
                           W  	... 8 more
System.out                 I          "param": null,
System.err                 W  com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 17 path $
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:76)
                           W  	at com.google.gson.JsonParser.parseString(JsonParser.java:51)
                           W  	at com.cjcrafter.openai.OpenAICallback.handleStream(OpenAICallback.kt:66)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:30)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:25)
                           W  	at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
                           W  	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
                           W  	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
                           W  	at java.lang.Thread.run(Thread.java:1012)
                           W  Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 17 path $
                           W  	at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1659)
                           W  	at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1465)
                           W  	at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:551)
                           W  	at com.google.gson.stream.JsonReader.peek(JsonReader.java:433)
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:71)
                           W  	... 8 more
System.out                 I          "code": "rate_limit_exceeded"
System.err                 W  com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 16 path $
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:76)
                           W  	at com.google.gson.JsonParser.parseString(JsonParser.java:51)
                           W  	at com.cjcrafter.openai.OpenAICallback.handleStream(OpenAICallback.kt:66)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:30)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:25)
                           W  	at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
                           W  	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
                           W  	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
                           W  	at java.lang.Thread.run(Thread.java:1012)
                           W  Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 16 path $
                           W  	at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1659)
                           W  	at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1465)
                           W  	at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:551)
                           W  	at com.google.gson.stream.JsonReader.peek(JsonReader.java:433)
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:71)
                           W  	... 8 more
System.out                 I      }
System.err                 W  com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected value at line 1 column 5 path $
                           W  	at com.google.gson.internal.Streams.parse(Streams.java:61)
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:102)
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:70)
                           W  	at com.google.gson.JsonParser.parseString(JsonParser.java:51)
                           W  	at com.cjcrafter.openai.OpenAICallback.handleStream(OpenAICallback.kt:66)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:30)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:25)
                           W  	at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
                           W  	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
                           W  	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
                           W  	at java.lang.Thread.run(Thread.java:1012)
                           W  Caused by: com.google.gson.stream.MalformedJsonException: Expected value at line 1 column 5 path $
                           W  	at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1659)
                           W  	at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:599)
                           W  	at com.google.gson.stream.JsonReader.peek(JsonReader.java:433)
                           W  	at com.google.gson.internal.Streams.parse(Streams.java:47)
                           W  	... 10 more
System.out                 I  }
System.err                 W  com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected value at line 1 column 1 path $
                           W  	at com.google.gson.internal.Streams.parse(Streams.java:61)
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:102)
                           W  	at com.google.gson.JsonParser.parseReader(JsonParser.java:70)
                           W  	at com.google.gson.JsonParser.parseString(JsonParser.java:51)
                           W  	at com.cjcrafter.openai.OpenAICallback.handleStream(OpenAICallback.kt:66)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:30)
                           W  	at com.cjcrafter.openai.OpenAICallback.onResponse(OpenAICallback.kt:25)
                           W  	at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
                           W  	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
                           W  	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
                           W  	at java.lang.Thread.run(Thread.java:1012)
                           W  Caused by: com.google.gson.stream.MalformedJsonException: Expected value at line 1 column 1 path $
                           W  	at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1659)
                           W  	at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:599)
                           W  	at com.google.gson.stream.JsonReader.peek(JsonReader.java:433)
                           W  	at com.google.gson.internal.Streams.parse(Streams.java:47)
                           W  	... 10 more

Add Model Enum

Add model enum for different endpoints

For example, Model.GPT_4 or Model.GPT_3_5_TURBO so we can easily see models without spelling mistakes.

Also gives the opportunity to deprecate models as OpenAI deprecates them, so the end-user can receive warnings in editor.

AzureOpenAI builder class

Problem

#18 added Azure support

Here is the signature for AzureOpenAI

class AzureOpenAI @JvmOverloads constructor(
    apiKey: String,
    organization: String? = null,
    client: OkHttpClient = OkHttpClient(),
    private val azureBaseUrl: String = "",
    private val apiVersion: String = "2023-03-15-preview",
    private val modelName: String = ""
) : OpenAI(apiKey, organization, client) {

With 5 default variables, it can be difficult for Java developers (not Kotlin developers) to instantiate an AzureOpenAI easily. For example, they may want to change the 3 Azure arguments without setting organization or client.

Solution

Create a Java-friendly builder class AzureOpenAI.builder()

Allow HTTPS parameter modification

Give people access to the OkHttpsClient.Builder class so people can modify values, especially:

  • connectTimeout
  • readTimeout

This should be done using kotlin's constructor with default values set.

class ChatBot(private val apiKey: String, private val client: OkHttpClient = Builder()
    .connectTimeout(0, TimeUnit.SECONDS)
    .readTimeout(0, TimeUnit.SECONDS).build()) {
// ...
}

Extract OpenAI interface

Define an interface (perhaps with named OpenAI). The interface can then be used for vanilla OpenAI implementation, Azure OpenAI implementation and other possible implementations in the future.

Website for Javadocs

Use Dokka to generate a pretty website for documentation (use github pages to host)

Fix JavaTestAzure

Fix AzureOpenAI instance creation in JavaTestAzure. For Azure we also need to define at least modelName and azureBaseUrl

lateinit initialization error when using createChatCompletion()

When I attempt to use createChatCompletion(), I always receive this error:

lateinit property response has not been initialized

Here the function I am using

fun chat(text: String): String {
        messages.add(text.toUserMessage())
        val response = openai.createChatCompletion(request)
        messages.add(response[0].message)
        return response[0].message.content
}

I checked out OpenAI.createChatCompletion() and I can see that response is the lateinit variable that apparently isn't being initialized.

val httpResponse = client.newCall(httpRequest).execute()
lateinit var response: ChatResponse
OpenAICallback(true, { throw it }) {
    response = gson.fromJson(it, ChatResponse::class.java)
}.onResponse(httpResponse)

return response

Add GitHub issue templates

There are some error types that we might except to happen, and we should have forums that request log information for those specific errors.

For example, an uncaught JsonSyntaxException implies that the OpenAI api changed, and now the data classes are out of date. We should have an error specifically for that case.

Possible issue types:

  • JsonSyntaxException
  • Bug Report
  • Feature Request

Configurable timeout

Hi, great API, thanks! The timeout is pretty short. Can we configure it somehow?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.