Skip to content

Commit

Permalink
You API integration (carlrobertoh#203)
Browse files Browse the repository at this point in the history
* Ability to configure custom service

* Add example preset templates, rename module

* Custom service client impl

* Add YOU API integration

* Remove/ignore generated antlr classes

* Remove text completion models(deprecated)

* Remove unused code, fix settings state sync

* Display model name/icon in the tool window

* Update chat history UI

* Fix model/service sync

* Clear plugin state

* Fix minor bugs, add settings sync tests

* UI changes

* Separate model configuration

* Add support for overriding the completion path

* Update Find Bugs prompt
  • Loading branch information
carlrobertoh authored Sep 14, 2023
1 parent a860054 commit 37af74e
Show file tree
Hide file tree
Showing 125 changed files with 1,663 additions and 1,527 deletions.
2 changes: 1 addition & 1 deletion .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ updates:
interval: "daily"

- package-ecosystem: "gradle"
directory: "/embeddings"
directory: "/codegpt-core"
schedule:
interval: "daily"
12 changes: 6 additions & 6 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
embeddings/src/main/java/grammar/*
!embeddings/src/main/java/grammar/PythonLexerBase.java
!embeddings/src/main/java/grammar/PythonParserBase.java
!embeddings/src/main/java/grammar/PythonVersion.java
!embeddings/src/main/java/grammar/TypeScriptLexerBase.java
!embeddings/src/main/java/grammar/TypeScriptParserBase.java
codegpt-core/src/main/java/grammar/*
!codegpt-core/src/main/java/grammar/PythonLexerBase.java
!codegpt-core/src/main/java/grammar/PythonParserBase.java
!codegpt-core/src/main/java/grammar/PythonVersion.java
!codegpt-core/src/main/java/grammar/TypeScriptLexerBase.java
!codegpt-core/src/main/java/grammar/TypeScriptParserBase.java

.gradle
build/
Expand Down
24 changes: 24 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Changelog

All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
Expand All @@ -8,21 +9,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [2.0.6] - 2023-08-29

### Removed

- Functionality to fetch/use OpenAI account name

### Fixed

- Rendering user input's newlines

### Added

- Support for closing other tabs (#172)
- Support for configuring custom hosts for OpenAI and Azure services

## [2.0.5] - 2023-06-12

### Fixed

- Tool window not opening on editor actions (#157)

### Added

- Support for changing the editor action behaviour (#157)
- Support for overriding completions request parameters (#152)
- User text area autofocus on creating a new chat (#155)
Expand All @@ -31,67 +37,85 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [2.0.4] - 2023-05-27

### Fixed

- TypeScript and C# code highlighting

- ToolWindow usability when virtual space option turned ON (#125)

### Added

- ToolWindow code editor copy/replace header actions
- Custom prompt main editor action (#144)
- Support for 2023.2 EAP builds (#149)

## [2.0.3] - 2023-05-18

### Fixed

- Empty editor context menu item text (#137)
- Temp file path resolving (#130)

### Improved

- Response streaming

### Added

- Reset chat window toolbar action (#138)

## [2.0.2] - 2023-05-16

### Fixed

- Settings deserialization error

### Improved

- Memory consumption by disposing unused editors which are no longer needed

### Removed

- Main editor focus stealing on response streaming

## [2.0.1] - 2023-05-14

### Added

- New GPT-3.5-16k model

### Fixed

- NPE when `displayName` couldn't be fetched

### Improved

- Proxy support by disabling the default trustmanager

### Removed

- Off-screen rendering setting option
- Automatic textarea focus on stream completion (#126)

## [2.0.0] - 2023-05-03

### Added

- Automatic retry logic on stream timeouts

### Improved

- Input prompt text field UI/UX (height grows with the content)

### Removed

- Custom prompt editor action (users can now provide custom actions within the chat window itself)

### Replaced

- ToolWindow HTML content with native Swing components

### Secured

- `OPENAI_API_KEY` persistence, key is saved in the OS password safe from now on

[Unreleased]: https://github.com/carlrobertoh/CodeGPT/compare/v2.0.6...HEAD
Expand Down
4 changes: 2 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ changelog {
}

dependencies {
implementation(project("embeddings", "instrumentedJar"))
implementation(project(mapOf("path" to ":embeddings")))
implementation(project(":codegpt-core"))

implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.15.2")
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.2")
Expand All @@ -47,6 +46,7 @@ dependencies {

testImplementation("org.assertj:assertj-core:3.24.2")
testImplementation("org.awaitility:awaitility:4.2.0")
testImplementation("org.junit.jupiter:junit-jupiter-params:5.9.2")
testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.10.0")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.0")
testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.10.0")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ intellij {
}

dependencies {
implementation("ee.carlrobert:openai-client:1.2.1")
implementation("ee.carlrobert:llm-client:0.0.3")
}

tasks {
Expand Down
19 changes: 19 additions & 0 deletions codegpt-core/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
plugins {
id("codegpt.java-conventions")
id("antlr")
}

dependencies {
antlr("org.antlr:antlr4:4.13.1")
api("com.github.jelmerk:hnswlib-core:1.0.1")
api("com.github.jelmerk:hnswlib-utils:1.0.1")
implementation("org.antlr:antlr4-runtime:4.13.1")
implementation("org.json:json:20230618")
}

tasks {
generateGrammarSource {
outputDirectory = file("src/main/java/grammar")
arguments = arguments + listOf("-package", "grammar")
}
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ee.carlrobert.codegpt.embeddings;
package ee.carlrobert.embedding;

import java.io.File;
import java.io.IOException;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,24 @@
package ee.carlrobert.codegpt.embeddings;
package ee.carlrobert.embedding;

import static com.github.jelmerk.knn.util.VectorUtils.normalize;
import static java.util.stream.Collectors.toList;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.jelmerk.knn.Item;
import com.github.jelmerk.knn.SearchResult;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProgressIndicator;
import ee.carlrobert.codegpt.embeddings.splitter.SplitterFactory;
import ee.carlrobert.openai.client.completion.CompletionClient;
import ee.carlrobert.openai.client.completion.chat.ChatCompletionModel;
import ee.carlrobert.openai.client.completion.chat.request.ChatCompletionMessage;
import ee.carlrobert.openai.client.completion.chat.request.ChatCompletionRequest;
import ee.carlrobert.openai.client.completion.chat.response.ChatCompletionResponse;
import ee.carlrobert.openai.client.embeddings.EmbeddingsClient;
import ee.carlrobert.llm.client.openai.OpenAIClient;
import ee.carlrobert.llm.client.openai.completion.chat.OpenAIChatCompletionModel;
import ee.carlrobert.llm.client.openai.completion.chat.request.OpenAIChatCompletionMessage;
import ee.carlrobert.llm.client.openai.completion.chat.request.OpenAIChatCompletionRequest;
import ee.carlrobert.splitter.SplitterFactory;
import ee.carlrobert.vector.VectorStore;
import ee.carlrobert.vector.Word;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
Expand All @@ -32,22 +30,20 @@ public class EmbeddingsService {
private static final Logger LOG = Logger.getInstance(EmbeddingsService.class);

private final VectorStore vectorStore;
private final EmbeddingsClient embeddingsClient;
private final CompletionClient completionClient;
private final OpenAIClient openAIClient;

public EmbeddingsService(EmbeddingsClient embeddingsClient, CompletionClient completionClient, Path pluginBasePath) {
this.embeddingsClient = embeddingsClient;
this.completionClient = completionClient;
public EmbeddingsService(OpenAIClient openAIClient, Path pluginBasePath) {
this.openAIClient = openAIClient;
this.vectorStore = VectorStore.getInstance(pluginBasePath);
}

public List<double[]> getEmbeddings(List<String> chunks) {
return embeddingsClient.getEmbeddings(chunks);
return openAIClient.getEmbeddings(chunks);
}

public GeneratedContextDetails buildRelevantContext(String prompt) {
public String buildPromptWithContext(String prompt) {
try {
var inputEmbedding = embeddingsClient.getEmbedding(getSearchQuery(prompt));
var inputEmbedding = openAIClient.getEmbedding(getSearchQuery(prompt));
var sortedResult = vectorStore.loadIndex()
.findNearest(normalize(inputEmbedding), 10)
.stream()
Expand All @@ -58,10 +54,12 @@ public GeneratedContextDetails buildRelevantContext(String prompt) {
var context = sortedResult.stream().map(Word::id).collect(Collectors.joining());
var fileNames = sortedResult.stream().map(Word::getMeta).collect(Collectors.toSet());

return new GeneratedContextDetails(context, fileNames);
return getResourceContent("/prompts/prompt-with-context.txt")
.replace("{prompt}", prompt)
.replace("{context}", new GeneratedContextDetails(context, fileNames).getContext());
} catch (IOException e) {
LOG.error("Unable to load vector index", e);
return new GeneratedContextDetails(prompt, Collections.emptySet());
return prompt;
}
}

Expand All @@ -83,16 +81,15 @@ public List<Item<Object, double[]>> createEmbeddings(List<CheckedFile> checkedFi
}

private String getSearchQuery(String userPrompt) throws JsonProcessingException {
var message = new ChatCompletionMessage("user", getResourceContent("/prompts/text-generator.txt").replace("{prompt}", userPrompt));
var request = new ChatCompletionRequest.Builder(List.of(message))
.setModel(ChatCompletionModel.GPT_4)
var message = new OpenAIChatCompletionMessage("user", getResourceContent("/prompts/text-generator.txt").replace("{prompt}", userPrompt));
var request = new OpenAIChatCompletionRequest.Builder(List.of(message))
.setModel(OpenAIChatCompletionModel.GPT_4)
.setMaxTokens(400)
.setTemperature(0.1)
.setStream(false)
.build();

return new ObjectMapper()
.readValue(completionClient.call(request), ChatCompletionResponse.class)
return openAIClient.getChatCompletion(request)
.getChoices()
.get(0)
.getMessage()
Expand All @@ -104,7 +101,7 @@ private void addEmbeddings(CheckedFile checkedFile, List<Item<Object, double[]>>
var codeSplitter = SplitterFactory.getCodeSplitter(fileExtension);
if (codeSplitter != null) {
var chunks = codeSplitter.split(checkedFile.getFileName(), checkedFile.getFileContent());
var embeddings = embeddingsClient.getEmbeddings(chunks);
var embeddings = openAIClient.getEmbeddings(chunks);
for (int i = 0; i < chunks.size(); i++) {
prevEmbeddings.add(new Word(chunks.get(i), checkedFile.getFileName(), normalize(embeddings.get(i))));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ee.carlrobert.codegpt.embeddings;
package ee.carlrobert.embedding;

import java.util.Set;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ee.carlrobert.codegpt.embeddings.splitter;
package ee.carlrobert.splitter;

import java.util.ArrayList;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ee.carlrobert.codegpt.embeddings.splitter;
package ee.carlrobert.splitter;

import grammar.JavaLexer;
import grammar.JavaParser;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ee.carlrobert.codegpt.embeddings.splitter;
package ee.carlrobert.splitter;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ee.carlrobert.codegpt.embeddings.splitter;
package ee.carlrobert.splitter;

import grammar.PythonLexer;
import grammar.PythonParser;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ee.carlrobert.codegpt.embeddings.splitter;
package ee.carlrobert.splitter;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ee.carlrobert.codegpt.embeddings.splitter;
package ee.carlrobert.splitter;

import org.jetbrains.annotations.Nullable;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ee.carlrobert.codegpt.embeddings.splitter;
package ee.carlrobert.splitter;

import grammar.TypeScriptLexer;
import grammar.TypeScriptParser;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ee.carlrobert.codegpt.embeddings;
package ee.carlrobert.vector;

import com.github.jelmerk.knn.DistanceFunctions;
import com.github.jelmerk.knn.Item;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ee.carlrobert.codegpt.embeddings;
package ee.carlrobert.vector;

import com.github.jelmerk.knn.Item;
import java.util.Arrays;
Expand Down
Binary file not shown.
19 changes: 0 additions & 19 deletions embeddings/build.gradle.kts

This file was deleted.

2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ pluginGroup = ee.carlrobert
pluginName = CodeGPT
pluginRepositoryUrl = https://github.com/carlrobertoh/CodeGPT
# SemVer format -> https://semver.org
pluginVersion = 2.0.6
pluginVersion = 2.1.0

# Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
pluginSinceBuild = 213
Expand Down
Loading

0 comments on commit 37af74e

Please sign in to comment.