anasfik / openai

Dart/Flutter SDK for ChatGPT and all OpenAI APIs (GPT, Dall-e..)
https://pub.dev/packages/dart_openai
MIT License
593 stars 186 forks source link

Compatibility with Older APIs (with `String` content) #189

Open EluvK opened 3 months ago

EluvK commented 3 months ago

Description

In the recent update to the dart_openai library (version 5.0.0), the content field in the request body has been changed from String to List<Object>. While this change aligns with OpenAI's latest API updates, it causes compatibility issues with other large model APIs that still expect content to be a String.

Impact

This change prevents users from easily migrating to or using other large model APIs that follow the original OpenAI API format. As a result, users who rely on these APIs are facing difficulties in integrating with the updated dart_openai library. Specifically, the following error is encountered:

Failed to deserialize the JSON body into the target type: messages[1]: invalid type: sequence, expected a string at line 6 column 9

Suggested Solution

To maintain compatibility and ease of migration, I suggest the following:

  1. Provide an option to use either String field.
  2. Introduce a compatibility mode or a configuration setting that allows users to specify the format of the content field.

Example Code

Here is an example of how the library could support both formats: (something like this, I'm a newbie in Dart)

final dynamic content; // Can be either String or List<Object>

// When sending the request
if (content is List<Object>) {
  // Handle List<Object> format
} else if (content is String) {
  // Handle String format
}

This approach would ensure that users can continue to use the library with other large model APIs without any issues.

Additional Context

I sinicerely hope you can consider this suggestion.

Thank you!

franboladoruiz commented 3 months ago

openai_dart supports both:

String:

ChatCompletionMessage.user(
  content: ChatCompletionUserMessageContent.string('Hello!'),
),

Or parts for multi-modal:

ChatCompletionMessage.user(
  content: ChatCompletionUserMessageContent.parts(
    [
      ChatCompletionMessageContentPart.text(
        text: 'What fruit is this?',
      ),
      ChatCompletionMessageContentPart.image(
        imageUrl: ChatCompletionMessageImageUrl(
          url: 'https://upload.wikimedia.org/wikipedia/commons/9/92/95apple.jpeg',
        ),
      ),
    ],
  ),
),