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