feat: OpenAI and Claude vision support (#430)

* feat: add OpenAI and Claude vision support

* refactor: replace awaitility with PlatformTestUtil.waitWithEventsDispatching

* feat: display error when image not found

* chore: bump llm-client

* feat: configurable file watcher and minor code cleanup

* fix: ensure image notifications are triggered only for image file types

* docs: update changelog

* fix: user textarea icon button behaviour

* refactor: minor cleanup
This commit is contained in:
Carl-Robert 2024-04-02 02:50:41 +03:00 committed by GitHub
parent 99b5f94dad
commit 8cf5720db9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
40 changed files with 793 additions and 309 deletions

View file

@ -9,7 +9,10 @@ import com.knuddels.jtokkit.api.EncodingRegistry;
import com.knuddels.jtokkit.api.EncodingType;
import com.knuddels.jtokkit.api.IntArrayList;
import ee.carlrobert.codegpt.conversations.Conversation;
import ee.carlrobert.llm.client.openai.completion.request.OpenAIChatCompletionDetailedMessage;
import ee.carlrobert.llm.client.openai.completion.request.OpenAIChatCompletionMessage;
import ee.carlrobert.llm.client.openai.completion.request.OpenAIChatCompletionStandardMessage;
import ee.carlrobert.llm.client.openai.completion.request.OpenAIMessageTextContent;
import java.util.List;
@Service
@ -38,7 +41,16 @@ public final class EncodingManager {
}
public int countMessageTokens(OpenAIChatCompletionMessage message) {
return countMessageTokens(message.getRole(), message.getContent());
if (message instanceof OpenAIChatCompletionStandardMessage standardMessage) {
return countMessageTokens(standardMessage.getRole(), standardMessage.getContent());
}
return ((OpenAIChatCompletionDetailedMessage) message).getContent().stream()
.filter(it -> it instanceof OpenAIMessageTextContent)
.map(it -> countMessageTokens(
((OpenAIChatCompletionDetailedMessage) message).getRole(),
((OpenAIMessageTextContent) it).getText()))
.reduce(0, Integer::sum);
}
public int countMessageTokens(String role, String content) {