diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsIntegrations.java b/app/src/main/java/eu/faircode/email/FragmentOptionsIntegrations.java
index 30e0a26013..2f9f57d21f 100644
--- a/app/src/main/java/eu/faircode/email/FragmentOptionsIntegrations.java
+++ b/app/src/main/java/eu/faircode/email/FragmentOptionsIntegrations.java
@@ -80,6 +80,7 @@ public class FragmentOptionsIntegrations extends FragmentBase implements SharedP
private EditText etOpenAi;
private TextInputLayout tilOpenAi;
private EditText etOpenAiModel;
+ private EditText etOpenAiMaxTokens;
private SwitchCompat swOpenMultiModal;
private TextView tvOpenAiTemperature;
private SeekBar sbOpenAiTemperature;
@@ -156,6 +157,7 @@ public class FragmentOptionsIntegrations extends FragmentBase implements SharedP
etOpenAi = view.findViewById(R.id.etOpenAi);
tilOpenAi = view.findViewById(R.id.tilOpenAi);
etOpenAiModel = view.findViewById(R.id.etOpenAiModel);
+ etOpenAiMaxTokens = view.findViewById(R.id.etOpenAiMaxTokens);
swOpenMultiModal = view.findViewById(R.id.swOpenMultiModal);
tvOpenAiTemperature = view.findViewById(R.id.tvOpenAiTemperature);
sbOpenAiTemperature = view.findViewById(R.id.sbOpenAiTemperature);
@@ -427,6 +429,7 @@ public class FragmentOptionsIntegrations extends FragmentBase implements SharedP
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
prefs.edit().putBoolean("openai_enabled", checked).apply();
etOpenAiModel.setEnabled(checked);
+ etOpenAiMaxTokens.setEnabled(checked);
swOpenMultiModal.setEnabled(checked);
sbOpenAiTemperature.setEnabled(checked);
etOpenAiSummarize.setEnabled(checked);
@@ -510,6 +513,27 @@ public class FragmentOptionsIntegrations extends FragmentBase implements SharedP
}
});
+ etOpenAiMaxTokens.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void afterTextChanged(Editable s) {
+ // Do nothing
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ // Do nothing
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ Integer max_tokens = Helper.parseInt(s.toString().trim());
+ if (max_tokens == null)
+ prefs.edit().remove("openai_max_tokens").apply();
+ else
+ prefs.edit().putInt("openai_max_tokens", max_tokens).apply();
+ }
+ });
+
swOpenMultiModal.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean checked) {
@@ -864,6 +888,9 @@ public class FragmentOptionsIntegrations extends FragmentBase implements SharedP
etOpenAiModel.setText(prefs.getString("openai_model", null));
etOpenAiModel.setEnabled(swOpenAi.isChecked());
+ int max_tokens = prefs.getInt("openai_max_tokens", 0);
+ etOpenAiMaxTokens.setText(max_tokens > 0 ? Integer.toString(max_tokens) : "");
+
swOpenMultiModal.setChecked(prefs.getBoolean("openai_multimodal", false));
swOpenMultiModal.setEnabled(swOpenAi.isChecked());
diff --git a/app/src/main/java/eu/faircode/email/OpenAI.java b/app/src/main/java/eu/faircode/email/OpenAI.java
index c8cf8c088d..0f3aefa58c 100644
--- a/app/src/main/java/eu/faircode/email/OpenAI.java
+++ b/app/src/main/java/eu/faircode/email/OpenAI.java
@@ -116,6 +116,9 @@ public class OpenAI {
}
static Message[] completeChat(Context context, String model, Message[] messages, Float temperature, int n) throws JSONException, IOException {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ int max_tokens = prefs.getInt("openai_max_tokens", 0);
+
// https://platform.openai.com/docs/guides/chat/introduction
// https://platform.openai.com/docs/api-reference/chat/create
JSONArray jmessages = new JSONArray();
@@ -146,6 +149,8 @@ public class OpenAI {
JSONObject jquestion = new JSONObject();
jquestion.put("model", model);
+ if (max_tokens > 0)
+ jquestion.put("max_tokens", max_tokens);
jquestion.put("messages", jmessages);
if (temperature != null)
jquestion.put("temperature", temperature);
diff --git a/app/src/main/res/layout/fragment_options_integrations.xml b/app/src/main/res/layout/fragment_options_integrations.xml
index ebe2a95660..f11aa94e27 100644
--- a/app/src/main/res/layout/fragment_options_integrations.xml
+++ b/app/src/main/res/layout/fragment_options_integrations.xml
@@ -667,6 +667,28 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvOpenAiModel" />
+
+
+
+
\'Send\' integration
OpenAI (ChatGPT) integration
Model
+ Maximum tokens (leave blank for unlimited)
Temperature: %1$s
Content moderation
Gemini integration