mirror of
https://github.com/carlrobertoh/ProxyAI.git
synced 2026-05-13 15:32:25 +00:00
You.com service updates (#246)
* Free GPT4 for a month to try * Free GPT4 for a month to try * Better tooltip * Replace toggle component with checkbox and other minor ui improvements * Add UTM and userId params to You.com completion request * Fix #145 - web serach results not being displayed despite the flag --------- Co-authored-by: siilats <keith@siilats.com>
This commit is contained in:
parent
4519b2ade6
commit
3f67be5f78
7 changed files with 99 additions and 49 deletions
|
|
@ -17,6 +17,10 @@ public final class CodeGPTPlugin {
|
|||
private CodeGPTPlugin() {
|
||||
}
|
||||
|
||||
public static @NotNull String getVersion() {
|
||||
return requireNonNull(PluginManagerCore.getPlugin(CODEGPT_ID)).getVersion();
|
||||
}
|
||||
|
||||
public static @NotNull Path getPluginBasePath() {
|
||||
return requireNonNull(PluginManagerCore.getPlugin(CODEGPT_ID)).getPluginPath();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package ee.carlrobert.codegpt.completions;
|
||||
|
||||
import ee.carlrobert.codegpt.CodeGPTPlugin;
|
||||
import ee.carlrobert.codegpt.credentials.AzureCredentialsManager;
|
||||
import ee.carlrobert.codegpt.credentials.OpenAICredentialsManager;
|
||||
import ee.carlrobert.codegpt.settings.advanced.AdvancedSettingsState;
|
||||
|
|
@ -10,6 +11,7 @@ import ee.carlrobert.llm.client.ProxyAuthenticator;
|
|||
import ee.carlrobert.llm.client.azure.AzureClient;
|
||||
import ee.carlrobert.llm.client.azure.AzureCompletionRequestParams;
|
||||
import ee.carlrobert.llm.client.openai.OpenAIClient;
|
||||
import ee.carlrobert.llm.client.you.UTMParameters;
|
||||
import ee.carlrobert.llm.client.you.YouClient;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Proxy;
|
||||
|
|
@ -26,7 +28,14 @@ public class CompletionClientProvider {
|
|||
}
|
||||
|
||||
public static YouClient getYouClient(String sessionId, String accessToken) {
|
||||
return new YouClient.Builder(sessionId, accessToken).build();
|
||||
var utmParameters = new UTMParameters();
|
||||
utmParameters.setSource("ide");
|
||||
utmParameters.setMedium("jetbrains");
|
||||
utmParameters.setCampaign(CodeGPTPlugin.getVersion());
|
||||
utmParameters.setContent("CodeGPT");
|
||||
return new YouClient.Builder(sessionId, accessToken)
|
||||
.setUTMParameters(utmParameters)
|
||||
.build();
|
||||
}
|
||||
|
||||
private static OpenAIClient.Builder getOpenAIClientBuilder() {
|
||||
|
|
@ -39,20 +48,15 @@ public class CompletionClientProvider {
|
|||
|
||||
private static AzureClient.Builder getAzureClientBuilder() {
|
||||
var settings = AzureSettingsState.getInstance();
|
||||
var params = new AzureCompletionRequestParams(settings.getResourceName(), settings.getDeploymentId(), settings.getApiVersion());
|
||||
var params = new AzureCompletionRequestParams(
|
||||
settings.getResourceName(),
|
||||
settings.getDeploymentId(),
|
||||
settings.getApiVersion());
|
||||
var builder = new AzureClient.Builder(AzureCredentialsManager.getInstance().getSecret(), params)
|
||||
.setActiveDirectoryAuthentication(settings.isUseAzureActiveDirectoryAuthentication());
|
||||
return (AzureClient.Builder) addDefaultClientParams(builder).setHost(settings.getBaseHost());
|
||||
}
|
||||
|
||||
private static YouClient.Builder getYouClientBuilder() {
|
||||
var settings = OpenAISettingsState.getInstance();
|
||||
var builder = new OpenAIClient
|
||||
.Builder(OpenAICredentialsManager.getInstance().getApiKey())
|
||||
.setOrganization(settings.getOrganization());
|
||||
return (YouClient.Builder) addDefaultClientParams(builder).setHost(settings.getBaseHost());
|
||||
}
|
||||
|
||||
private static Client.Builder addDefaultClientParams(Client.Builder builder) {
|
||||
var advancedSettings = AdvancedSettingsState.getInstance();
|
||||
var proxyHost = advancedSettings.getProxyHost();
|
||||
|
|
@ -62,7 +66,9 @@ public class CompletionClientProvider {
|
|||
new Proxy(advancedSettings.getProxyType(), new InetSocketAddress(proxyHost, proxyPort)));
|
||||
if (advancedSettings.isProxyAuthSelected()) {
|
||||
builder.setProxyAuthenticator(
|
||||
new ProxyAuthenticator(advancedSettings.getProxyUsername(), advancedSettings.getProxyPassword()));
|
||||
new ProxyAuthenticator(
|
||||
advancedSettings.getProxyUsername(),
|
||||
advancedSettings.getProxyPassword()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -147,8 +147,8 @@ public class CompletionRequestHandler {
|
|||
message,
|
||||
isRetry,
|
||||
settings.isUseYouService() ?
|
||||
new BaseCompletionEventListener() :
|
||||
new YouRequestCompletionEventListener());
|
||||
new YouRequestCompletionEventListener() :
|
||||
new BaseCompletionEventListener());
|
||||
} catch (TotalUsageExceededException e) {
|
||||
if (tokensExceededListener != null) {
|
||||
tokensExceededListener.run();
|
||||
|
|
|
|||
|
|
@ -11,6 +11,9 @@ import ee.carlrobert.codegpt.conversations.message.Message;
|
|||
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
|
||||
import ee.carlrobert.codegpt.settings.state.SettingsState;
|
||||
import ee.carlrobert.codegpt.settings.state.YouSettingsState;
|
||||
import ee.carlrobert.codegpt.telemetry.core.configuration.TelemetryConfiguration;
|
||||
import ee.carlrobert.codegpt.telemetry.core.service.TelemetryService;
|
||||
import ee.carlrobert.codegpt.telemetry.core.service.UserId;
|
||||
import ee.carlrobert.embedding.EmbeddingsService;
|
||||
import ee.carlrobert.llm.client.openai.completion.chat.OpenAIChatCompletionModel;
|
||||
import ee.carlrobert.llm.client.openai.completion.chat.request.OpenAIChatCompletionMessage;
|
||||
|
|
@ -21,6 +24,7 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class CompletionRequestProvider {
|
||||
|
|
@ -50,20 +54,30 @@ public class CompletionRequestProvider {
|
|||
private final Conversation conversation;
|
||||
|
||||
public CompletionRequestProvider(Conversation conversation) {
|
||||
this.embeddingsService = new EmbeddingsService(CompletionClientProvider.getOpenAIClient(), CodeGPTPlugin.getPluginBasePath());
|
||||
this.embeddingsService = new EmbeddingsService(
|
||||
CompletionClientProvider.getOpenAIClient(),
|
||||
CodeGPTPlugin.getPluginBasePath());
|
||||
this.conversation = conversation;
|
||||
}
|
||||
|
||||
public YouCompletionRequest buildYouCompletionRequest(Message message) {
|
||||
return new YouCompletionRequest.Builder(message.getPrompt())
|
||||
var requestBuilder = new YouCompletionRequest.Builder(message.getPrompt())
|
||||
.setUseGPT4Model(YouSettingsState.getInstance().isUseGPT4Model())
|
||||
.setChatHistory(conversation.getMessages().stream()
|
||||
.map(prevMessage -> new YouCompletionRequestMessage(prevMessage.getPrompt(), prevMessage.getResponse()))
|
||||
.collect(toList()))
|
||||
.build();
|
||||
.map(prevMessage -> new YouCompletionRequestMessage(
|
||||
prevMessage.getPrompt(),
|
||||
prevMessage.getResponse()))
|
||||
.collect(toList()));
|
||||
if (TelemetryConfiguration.getInstance().isEnabled()) {
|
||||
requestBuilder.setUserId(UUID.fromString(UserId.INSTANCE.get()));
|
||||
}
|
||||
return requestBuilder.build();
|
||||
}
|
||||
|
||||
public OpenAIChatCompletionRequest buildOpenAIChatCompletionRequest(String model, Message message, boolean isRetry) {
|
||||
public OpenAIChatCompletionRequest buildOpenAIChatCompletionRequest(
|
||||
String model,
|
||||
Message message,
|
||||
boolean isRetry) {
|
||||
return buildOpenAIChatCompletionRequest(model, message, isRetry, false, null);
|
||||
}
|
||||
|
||||
|
|
@ -73,7 +87,8 @@ public class CompletionRequestProvider {
|
|||
boolean isRetry,
|
||||
boolean useContextualSearch,
|
||||
@Nullable String overriddenPath) {
|
||||
var builder = new OpenAIChatCompletionRequest.Builder(buildMessages(model, message, isRetry, useContextualSearch))
|
||||
var builder = new OpenAIChatCompletionRequest.Builder(
|
||||
buildMessages(model, message, isRetry, useContextualSearch))
|
||||
.setModel(model)
|
||||
.setMaxTokens(ConfigurationState.getInstance().getMaxTokens())
|
||||
.setTemperature(ConfigurationState.getInstance().getTemperature());
|
||||
|
|
@ -85,7 +100,11 @@ public class CompletionRequestProvider {
|
|||
return (OpenAIChatCompletionRequest) builder.build();
|
||||
}
|
||||
|
||||
private List<OpenAIChatCompletionMessage> buildMessages(String model, Message message, boolean isRetry, boolean useContextualSearch) {
|
||||
private List<OpenAIChatCompletionMessage> buildMessages(
|
||||
String model,
|
||||
Message message,
|
||||
boolean isRetry,
|
||||
boolean useContextualSearch) {
|
||||
var messages = new ArrayList<OpenAIChatCompletionMessage>();
|
||||
if (useContextualSearch) {
|
||||
var prompt = embeddingsService.buildPromptWithContext(message.getPrompt());
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ public class YouServiceSelectionPanel extends JPanel {
|
|||
|
||||
private JTextPane createSignUpTextPane() {
|
||||
var textPane = createTextPane(
|
||||
"<html><a href=\"https://you.com/code\">Don't have an account? Sign up</a></html>");
|
||||
"<html><a href=\"https://you.com/code\" style=\"padding:0;\">Don't have an account?<br/>Sign up with 'CodeGPT' coupon for free GPT-4</a></html>");
|
||||
textPane.setBorder(JBUI.Borders.emptyLeft(4));
|
||||
return textPane;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,17 +6,20 @@ import static java.lang.String.format;
|
|||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
import com.intellij.ide.HelpTooltip;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.editor.impl.EditorImpl;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.ui.componentsList.components.ScrollablePanel;
|
||||
import com.intellij.ui.JBColor;
|
||||
import com.intellij.ui.components.JBCheckBox;
|
||||
import com.intellij.ui.components.JBScrollPane;
|
||||
import com.intellij.ui.components.OnOffButton;
|
||||
import com.intellij.util.ui.JBUI;
|
||||
import com.intellij.util.ui.JBUI.Borders;
|
||||
import ee.carlrobert.codegpt.actions.ActionType;
|
||||
import ee.carlrobert.codegpt.completions.CompletionRequestHandler;
|
||||
import ee.carlrobert.codegpt.completions.you.YouSerpResult;
|
||||
import ee.carlrobert.codegpt.completions.you.YouUserManager;
|
||||
import ee.carlrobert.codegpt.completions.you.auth.AuthenticationNotifier;
|
||||
import ee.carlrobert.codegpt.conversations.Conversation;
|
||||
import ee.carlrobert.codegpt.conversations.ConversationService;
|
||||
import ee.carlrobert.codegpt.conversations.message.Message;
|
||||
|
|
@ -59,6 +62,7 @@ public abstract class BaseChatToolWindowTabPanel implements ChatToolWindowTabPan
|
|||
private final ScrollablePanel scrollablePanel;
|
||||
private final Map<UUID, JPanel> visibleMessagePanels = new HashMap<>();
|
||||
private final Map<UUID, List<YouSerpResult>> serpResultsMapping = new HashMap<>();
|
||||
private final JBCheckBox gpt4CheckBox;
|
||||
|
||||
protected final Project project;
|
||||
protected final UserPromptTextArea userPromptTextArea;
|
||||
|
|
@ -74,6 +78,7 @@ public abstract class BaseChatToolWindowTabPanel implements ChatToolWindowTabPan
|
|||
this.rootPanel = new JPanel(new GridBagLayout());
|
||||
this.scrollablePanel = new ScrollablePanel();
|
||||
this.userPromptTextArea = new UserPromptTextArea(this::handleSubmit);
|
||||
this.gpt4CheckBox = createGPT4ModelCheckBox();
|
||||
init();
|
||||
}
|
||||
|
||||
|
|
@ -354,27 +359,9 @@ public abstract class BaseChatToolWindowTabPanel implements ChatToolWindowTabPan
|
|||
header.setBackground(getPanelBackgroundColor());
|
||||
header.setBorder(JBUI.Borders.emptyBottom(8));
|
||||
if ("YouCode".equals(model)) {
|
||||
var gpt4ToggleButton = new OnOffButton();
|
||||
var useGPT4Model = YouSettingsState.getInstance().isUseGPT4Model();
|
||||
gpt4ToggleButton.setSelected(useGPT4Model);
|
||||
gpt4ToggleButton.setOnText("GPT-4");
|
||||
gpt4ToggleButton.setOffText("GPT-4");
|
||||
gpt4ToggleButton.addActionListener(
|
||||
actionEvent -> {
|
||||
project.getMessageBus()
|
||||
.syncPublisher(YouModelChangeNotifier.YOU_MODEL_CHANGE_NOTIFIER_TOPIC)
|
||||
.modelChanged(gpt4ToggleButton.isSelected());
|
||||
YouSettingsState.getInstance().setUseGPT4Model(gpt4ToggleButton.isSelected());
|
||||
installHelpTooltip(gpt4ToggleButton.isSelected(), gpt4ToggleButton);
|
||||
});
|
||||
project.getMessageBus()
|
||||
.connect()
|
||||
.subscribe(
|
||||
YouModelChangeNotifier.YOU_MODEL_CHANGE_NOTIFIER_TOPIC,
|
||||
(YouModelChangeNotifier) gpt4ToggleButton::setSelected);
|
||||
|
||||
installHelpTooltip(useGPT4Model, gpt4ToggleButton);
|
||||
header.add(gpt4ToggleButton, BorderLayout.LINE_START);
|
||||
subscribeToYouModelChangeTopic();
|
||||
subscribeToYouAuthTopic();
|
||||
header.add(gpt4CheckBox, BorderLayout.LINE_START);
|
||||
}
|
||||
header.add(modelIconWrapper, BorderLayout.LINE_END);
|
||||
wrapper.add(header);
|
||||
|
|
@ -384,10 +371,44 @@ public abstract class BaseChatToolWindowTabPanel implements ChatToolWindowTabPan
|
|||
userPromptTextArea.requestFocus();
|
||||
}
|
||||
|
||||
private void installHelpTooltip(boolean selected, JComponent component) {
|
||||
new HelpTooltip()
|
||||
.setDescription(selected ? "Turn off for faster responses" : "Turn on for complex queries")
|
||||
.installOn(component);
|
||||
private void subscribeToYouModelChangeTopic() {
|
||||
project.getMessageBus()
|
||||
.connect()
|
||||
.subscribe(
|
||||
YouModelChangeNotifier.YOU_MODEL_CHANGE_NOTIFIER_TOPIC,
|
||||
(YouModelChangeNotifier) gpt4CheckBox::setSelected);
|
||||
}
|
||||
|
||||
private void subscribeToYouAuthTopic() {
|
||||
ApplicationManager.getApplication()
|
||||
.getMessageBus()
|
||||
.connect()
|
||||
.subscribe(AuthenticationNotifier.AUTHENTICATION_TOPIC,
|
||||
(AuthenticationNotifier) () -> gpt4CheckBox.setEnabled(true));
|
||||
}
|
||||
|
||||
private JBCheckBox createGPT4ModelCheckBox() {
|
||||
var gpt4CheckBox = new JBCheckBox("Use GPT-4 model");
|
||||
gpt4CheckBox.setOpaque(false);
|
||||
gpt4CheckBox.setEnabled(YouUserManager.getInstance().isAuthenticated());
|
||||
gpt4CheckBox.setSelected(YouSettingsState.getInstance().isUseGPT4Model());
|
||||
gpt4CheckBox.setToolTipText(getTooltipText(gpt4CheckBox.isSelected()));
|
||||
gpt4CheckBox.addChangeListener(e -> {
|
||||
var selected = ((JBCheckBox) e.getSource()).isSelected();
|
||||
var tooltipText = getTooltipText(selected);
|
||||
gpt4CheckBox.setToolTipText(tooltipText);
|
||||
project.getMessageBus()
|
||||
.syncPublisher(YouModelChangeNotifier.YOU_MODEL_CHANGE_NOTIFIER_TOPIC)
|
||||
.modelChanged(selected);
|
||||
YouSettingsState.getInstance().setUseGPT4Model(selected);
|
||||
});
|
||||
return gpt4CheckBox;
|
||||
}
|
||||
|
||||
private String getTooltipText(boolean selected) {
|
||||
return selected ?
|
||||
"Turn off for faster responses" :
|
||||
"<html>Turn on for complex queries, enable by creating an account on you.com<br />and signing in from plugin settings.<br />Use CodeGPT coupon for free month of GPT-4.</html>";
|
||||
}
|
||||
|
||||
private String getClientCode() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue