-
-
Notifications
You must be signed in to change notification settings - Fork 2.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add options to auto generate embeddings and summaries #11833
Merged
+282
−133
Merged
Changes from 2 commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
b4a9c94
Add options to auto generate embeddings and summaries. Unfortunately,…
InAnYan 57717fa
GC ate my listeners
InAnYan 2f1990e
Fix checkers
InAnYan 51a693e
Merge branch 'upstream-main' into generate-ai-for-new
InAnYan 519a8fd
Fix architecture issues
InAnYan 386c5ac
Move ChatHistoryService to logic layer
InAnYan 8466e83
Move ChatHistoryService to logic layer
InAnYan File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,18 +4,28 @@ | |
import java.util.HashMap; | ||
import java.util.List; | ||
import java.util.Map; | ||
import java.util.TreeMap; | ||
|
||
import javafx.beans.property.ReadOnlyBooleanProperty; | ||
import javafx.beans.property.StringProperty; | ||
import javafx.collections.ListChangeListener; | ||
|
||
import org.jabref.gui.StateManager; | ||
import org.jabref.logic.FilePreferences; | ||
import org.jabref.logic.ai.AiPreferences; | ||
import org.jabref.logic.ai.processingstatus.ProcessingInfo; | ||
import org.jabref.logic.ai.processingstatus.ProcessingState; | ||
import org.jabref.logic.util.TaskExecutor; | ||
import org.jabref.model.database.BibDatabaseContext; | ||
import org.jabref.model.database.event.EntriesAddedEvent; | ||
import org.jabref.model.entry.BibEntry; | ||
import org.jabref.model.entry.LinkedFile; | ||
import org.jabref.model.entry.event.FieldAddedOrRemovedEvent; | ||
import org.jabref.model.entry.event.FieldChangedEvent; | ||
import org.jabref.model.entry.field.SpecialField; | ||
import org.jabref.model.entry.field.StandardField; | ||
|
||
import com.google.common.eventbus.Subscribe; | ||
import dev.langchain4j.data.segment.TextSegment; | ||
import dev.langchain4j.model.embedding.EmbeddingModel; | ||
import dev.langchain4j.store.embedding.EmbeddingStore; | ||
|
@@ -25,25 +35,29 @@ | |
* Use this class in the logic and UI. | ||
*/ | ||
public class IngestionService { | ||
private final Map<LinkedFile, ProcessingInfo<LinkedFile, Void>> ingestionStatusMap = new HashMap<>(); | ||
// We use a {@link TreeMap} here for the same reasons we use it in {@link ChatHistoryService}. | ||
private final TreeMap<LinkedFile, ProcessingInfo<LinkedFile, Void>> ingestionStatusMap = new TreeMap<>((o1, o2) -> o1 == o2 ? 0 : o1.getLink().compareTo(o2.getLink())); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You can use the more easier way with Compartor.comparing( ... ) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @InAnYan Please adress, too. |
||
|
||
private final List<List<LinkedFile>> listsUnderIngestion = new ArrayList<>(); | ||
|
||
private final AiPreferences aiPreferences; | ||
private final FilePreferences filePreferences; | ||
private final TaskExecutor taskExecutor; | ||
|
||
private final FileEmbeddingsManager fileEmbeddingsManager; | ||
|
||
private final ReadOnlyBooleanProperty shutdownSignal; | ||
|
||
public IngestionService(AiPreferences aiPreferences, | ||
public IngestionService(StateManager stateManager, | ||
AiPreferences aiPreferences, | ||
ReadOnlyBooleanProperty shutdownSignal, | ||
EmbeddingModel embeddingModel, | ||
EmbeddingStore<TextSegment> embeddingStore, | ||
FullyIngestedDocumentsTracker fullyIngestedDocumentsTracker, | ||
FilePreferences filePreferences, | ||
TaskExecutor taskExecutor | ||
) { | ||
this.aiPreferences = aiPreferences; | ||
this.filePreferences = filePreferences; | ||
this.taskExecutor = taskExecutor; | ||
|
||
|
@@ -56,6 +70,49 @@ public IngestionService(AiPreferences aiPreferences, | |
); | ||
|
||
this.shutdownSignal = shutdownSignal; | ||
|
||
configureDatabaseListeners(stateManager); | ||
} | ||
|
||
private void configureDatabaseListeners(StateManager stateManager) { | ||
stateManager.getOpenDatabases().addListener((ListChangeListener<BibDatabaseContext>) change -> { | ||
while (change.next()) { | ||
if (change.wasAdded()) { | ||
change.getAddedSubList().forEach(this::configureDatabaseListeners); | ||
} | ||
} | ||
}); | ||
} | ||
|
||
private void configureDatabaseListeners(BibDatabaseContext bibDatabaseContext) { | ||
// GC was eating the listeners, so we have to fall back to the event bus. | ||
bibDatabaseContext.getDatabase().registerListener(new EntriesChangedListener(bibDatabaseContext)); | ||
} | ||
|
||
private class EntriesChangedListener { | ||
private final BibDatabaseContext bibDatabaseContext; | ||
|
||
public EntriesChangedListener(BibDatabaseContext bibDatabaseContext) { | ||
this.bibDatabaseContext = bibDatabaseContext; | ||
} | ||
|
||
@Subscribe | ||
public void listen(EntriesAddedEvent e) { | ||
e.getBibEntries().forEach(entry -> { | ||
if (aiPreferences.getAutoGenerateEmbeddings()) { | ||
entry.getFiles().forEach(linkedFile -> ingest(linkedFile, bibDatabaseContext)); | ||
} | ||
|
||
entry.registerListener(this); | ||
}); | ||
} | ||
|
||
@Subscribe | ||
public void listen(FieldChangedEvent e) { | ||
if (e.getField() == StandardField.FILE && aiPreferences.getAutoGenerateEmbeddings()) { | ||
e.getBibEntry().getFiles().forEach(linkedFile -> ingest(linkedFile, bibDatabaseContext)); | ||
} | ||
} | ||
} | ||
|
||
/** | ||
|
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think, you can move the class to
logic
. No gui dependency as far as I can see.Also the JavaDoc can be updated --> no more use of StateManager.