Skip to content

Commit a478d2e

Browse files
committed
2 parents d94c99c + ac0f674 commit a478d2e

13 files changed

+60
-55
lines changed

QUICK_START.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
```bash
88
# 克隆仓库
9-
git clone https://github.com/Mem4j/mem4j.git
9+
git clone https://github.com/mem4j/mem4j.git
1010
cd mem4j
1111

1212
# 安装到本地Maven仓库

pom.xml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<name>Mem4j</name>
1414
<description>Long-term memory for AI Agents - Java Implementation</description>
15-
<url>https://github.com/Mem4j/mem4j</url>
15+
<url>https://github.com/mem4j/mem4j</url>
1616

1717
<licenses>
1818
<license>
@@ -23,18 +23,18 @@
2323
</licenses>
2424

2525
<scm>
26-
<connection>scm:git:https://github.com/Mem4j/mem4j.git</connection>
27-
<developerConnection>scm:git:https://github.com/Mem4j/mem4j.git</developerConnection>
28-
<url>https://github.com/Mem4j/mem4j</url>
26+
<connection>scm:git:https://github.com/mem4j/mem4j.git</connection>
27+
<developerConnection>scm:git:https://github.com/mem4j/mem4j.git</developerConnection>
28+
<url>https://github.com/mem4j/mem4j</url>
2929
</scm>
3030

3131
<issueManagement>
3232
<system>Github Issues</system>
33-
<url>https://github.com/Mem4j/mem4j/issues</url>
33+
<url>https://github.com/mem4j/mem4j/issues</url>
3434
</issueManagement>
3535
<ciManagement>
3636
<system>Github Actions</system>
37-
<url>https://github.com/Mem4j/mem4j/actions</url>
37+
<url>https://github.com/mem4j/mem4j/actions</url>
3838
</ciManagement>
3939

4040
<developers>

src/main/java/com/langmem/mem4j/Mem4jApplication.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
/**
2323
* Main Spring Boot application class for Mem4j
2424
*/
25+
2526
@SpringBootApplication
2627
public class Mem4jApplication {
2728

src/main/java/com/langmem/mem4j/embeddings/DashScopeEmbeddingService.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.langmem.mem4j.configs.MemoryConfig;
2222
import org.slf4j.Logger;
2323
import org.slf4j.LoggerFactory;
24+
import org.springframework.context.annotation.Primary;
2425
import org.springframework.http.HttpEntity;
2526
import org.springframework.http.HttpHeaders;
2627
import org.springframework.http.MediaType;
@@ -39,6 +40,7 @@
3940
*/
4041

4142
@Service
43+
@Primary
4244
public class DashScopeEmbeddingService implements EmbeddingService {
4345

4446
private static final Logger logger = LoggerFactory.getLogger(DashScopeEmbeddingService.class);
@@ -64,7 +66,7 @@ public DashScopeEmbeddingService(MemoryConfig config) {
6466
}
6567

6668
@Override
67-
public double[] embed(String text) {
69+
public Double[] embed(String text) {
6870
try {
6971
Map<String, Object> requestBody = new HashMap<>();
7072
requestBody.put("model", model);
@@ -88,7 +90,7 @@ public double[] embed(String text) {
8890
JsonNode firstEmbedding = embeddings.get(0);
8991
JsonNode embeddingArray = firstEmbedding.path("embedding");
9092

91-
double[] result = new double[embeddingArray.size()];
93+
Double[] result = new Double[embeddingArray.size()];
9294
for (int i = 0; i < embeddingArray.size(); i++) {
9395
result[i] = embeddingArray.get(i).asDouble();
9496
}
@@ -104,7 +106,7 @@ public double[] embed(String text) {
104106
}
105107

106108
@Override
107-
public double[][] embed(String[] texts) {
109+
public Double[][] embed(String[] texts) {
108110
try {
109111
Map<String, Object> requestBody = new HashMap<>();
110112
requestBody.put("model", model);
@@ -124,10 +126,10 @@ public double[][] embed(String[] texts) {
124126
JsonNode responseJson = objectMapper.readTree(response.getBody());
125127
JsonNode embeddings = responseJson.path("output").path("embeddings");
126128

127-
double[][] result = new double[embeddings.size()][];
129+
Double[][] result = new Double[embeddings.size()][];
128130
for (int i = 0; i < embeddings.size(); i++) {
129131
JsonNode embeddingArray = embeddings.get(i).path("embedding");
130-
result[i] = new double[embeddingArray.size()];
132+
result[i] = new Double[embeddingArray.size()];
131133
for (int j = 0; j < embeddingArray.size(); j++) {
132134
result[i][j] = embeddingArray.get(j).asDouble();
133135
}
@@ -142,12 +144,12 @@ public double[][] embed(String[] texts) {
142144
}
143145

144146
@Override
145-
public int getDimension() {
147+
public Integer getDimension() {
146148
return dimension;
147149
}
148150

149151
@Override
150-
public boolean isAvailable() {
152+
public Boolean isAvailable() {
151153
try {
152154
// Simple test to check if service is available
153155
embed("test");

src/main/java/com/langmem/mem4j/embeddings/EmbeddingService.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,23 @@
2323
public interface EmbeddingService {
2424

2525
/**
26-
* Generate embedding for a text
27-
*/
28-
double[] embed(String text);
26+
* Generate embedding for a text
27+
*/
28+
Double[] embed(String text);
2929

3030
/**
31-
* Generate embeddings for multiple texts
32-
*/
33-
double[][] embed(String[] texts);
31+
* Generate embeddings for multiple texts
32+
*/
33+
Double[][] embed(String[] texts);
3434

3535
/**
3636
* Get the dimension of embeddings
3737
*/
38-
int getDimension();
38+
Integer getDimension();
3939

4040
/**
4141
* Check if the service is available
4242
*/
43-
boolean isAvailable();
43+
Boolean isAvailable();
4444

4545
}

src/main/java/com/langmem/mem4j/embeddings/OpenAIEmbeddingService.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,16 @@ public OpenAIEmbeddingService(MemoryConfig config) {
5454
}
5555

5656
@Override
57-
public double[] embed(String text) {
57+
public Double[] embed(String text) {
5858

5959
try {
6060
EmbeddingRequest request = EmbeddingRequest.builder().model(model).input(List.of(text)).build();
6161

6262
EmbeddingResult result = openAiService.createEmbeddings(request);
6363

6464
if (!result.getData().isEmpty()) {
65-
List<Double> embedding = result.getData().get(0).getEmbedding();
66-
return embedding.stream().mapToDouble(Double::doubleValue).toArray();
65+
List<Double> embedding = result.getData().get(0).getEmbedding();
66+
return embedding.toArray(new Double[0]);
6767
}
6868

6969
throw new RuntimeException("No embedding generated");
@@ -76,7 +76,7 @@ public double[] embed(String text) {
7676
}
7777

7878
@Override
79-
public double[][] embed(String[] texts) {
79+
public Double[][] embed(String[] texts) {
8080

8181
try {
8282
EmbeddingRequest request = EmbeddingRequest.builder().model(model).input(Arrays.asList(texts)).build();
@@ -86,7 +86,7 @@ public double[][] embed(String[] texts) {
8686
return result.getData()
8787
.stream()
8888
.map(data -> data.getEmbedding().stream().mapToDouble(Double::doubleValue).toArray())
89-
.toArray(double[][]::new);
89+
.toArray(Double[][]::new);
9090
}
9191
catch (Exception e) {
9292

@@ -96,12 +96,12 @@ public double[][] embed(String[] texts) {
9696
}
9797

9898
@Override
99-
public int getDimension() {
99+
public Integer getDimension() {
100100
return dimension;
101101
}
102102

103103
@Override
104-
public boolean isAvailable() {
104+
public Boolean isAvailable() {
105105

106106
try {
107107
// Simple test to check if service is available

src/main/java/com/langmem/mem4j/llms/DashScopeLLMService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.langmem.mem4j.memory.Message;
2323
import org.slf4j.Logger;
2424
import org.slf4j.LoggerFactory;
25+
import org.springframework.context.annotation.Primary;
2526
import org.springframework.http.HttpEntity;
2627
import org.springframework.http.HttpHeaders;
2728
import org.springframework.http.MediaType;
@@ -40,6 +41,7 @@
4041
*/
4142

4243
@Service
44+
@Primary
4345
public class DashScopeLLMService implements LLMService {
4446

4547
private static final Logger logger = LoggerFactory.getLogger(DashScopeLLMService.class);

src/main/java/com/langmem/mem4j/memory/Memory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public void add(List<Message> messages, String userId, Map<String, Object> metad
7878

7979
// Generate embeddings and store
8080
for (MemoryItem item : memoryItems) {
81-
double[] embedding = embeddingService.embed(item.getContent());
81+
Double[] embedding = embeddingService.embed(item.getContent());
8282
item.setEmbedding(embedding);
8383
vectorStoreService.add(item);
8484
}
@@ -107,7 +107,7 @@ public List<MemoryItem> search(String query, String userId, Map<String, Object>
107107

108108
try {
109109
// Generate embedding for query
110-
double[] queryEmbedding = embeddingService.embed(query);
110+
Double[] queryEmbedding = embeddingService.embed(query);
111111

112112
// Build search filters
113113
Map<String, Object> searchFilters = buildSearchFilters(userId, filters);
@@ -155,7 +155,7 @@ public void update(String memoryId, Map<String, Object> data) {
155155
if (data.containsKey("content")) {
156156
item.setContent((String) data.get("content"));
157157
// Re-embed if content changed
158-
double[] embedding = embeddingService.embed(item.getContent());
158+
Double[] embedding = embeddingService.embed(item.getContent());
159159
item.setEmbedding(embedding);
160160
}
161161
if (data.containsKey("metadata")) {

src/main/java/com/langmem/mem4j/memory/MemoryItem.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public class MemoryItem {
5656
private Instant updatedAt;
5757

5858
@JsonProperty("embedding")
59-
private double[] embedding;
59+
private Double[] embedding;
6060

6161
public MemoryItem() {
6262
this.createdAt = Instant.now();
@@ -159,11 +159,11 @@ public void setUpdatedAt(Instant updatedAt) {
159159
this.updatedAt = updatedAt;
160160
}
161161

162-
public double[] getEmbedding() {
162+
public Double[] getEmbedding() {
163163
return embedding;
164164
}
165165

166-
public void setEmbedding(double[] embedding) {
166+
public void setEmbedding(Double[] embedding) {
167167
this.embedding = embedding;
168168
}
169169

src/main/java/com/langmem/mem4j/vectorstores/InMemoryVectorStoreService.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class InMemoryVectorStoreService implements VectorStoreService {
3737

3838
private final Map<String, MemoryItem> memoryStore = new ConcurrentHashMap<>();
3939

40-
private final Map<String, double[]> embeddings = new ConcurrentHashMap<>();
40+
private final Map<String, Double[]> embeddings = new ConcurrentHashMap<>();
4141

4242
@Override
4343
public void add(MemoryItem item) {
@@ -58,7 +58,7 @@ public void add(MemoryItem item) {
5858
}
5959

6060
@Override
61-
public List<MemoryItem> search(double[] queryEmbedding, Map<String, Object> filters, int limit, double threshold) {
61+
public List<MemoryItem> search(Double[] queryEmbedding, Map<String, Object> filters, Integer limit, Double threshold) {
6262

6363
try {
6464
return memoryStore.values().stream().filter(item -> matchesFilters(item, filters)).map(item -> {
@@ -73,7 +73,7 @@ public List<MemoryItem> search(double[] queryEmbedding, Map<String, Object> filt
7373
result.setUpdatedAt(item.getUpdatedAt());
7474

7575
// Calculate similarity score
76-
double[] itemEmbedding = embeddings.get(item.getId());
76+
Double[] itemEmbedding = embeddings.get(item.getId());
7777
if (itemEmbedding != null) {
7878
double similarity = cosineSimilarity(queryEmbedding, itemEmbedding);
7979
result.setScore(similarity);
@@ -94,7 +94,7 @@ public List<MemoryItem> search(double[] queryEmbedding, Map<String, Object> filt
9494
}
9595

9696
@Override
97-
public List<MemoryItem> getAll(Map<String, Object> filters, int limit) {
97+
public List<MemoryItem> getAll(Map<String, Object> filters, Integer limit) {
9898

9999
try {
100100
return memoryStore.values()
@@ -216,7 +216,7 @@ private boolean matchesFilters(MemoryItem item, Map<String, Object> filters) {
216216
});
217217
}
218218

219-
private double cosineSimilarity(double[] a, double[] b) {
219+
private Double cosineSimilarity(Double[] a, Double[] b) {
220220

221221
if (a.length != b.length) {
222222
return 0.0;

0 commit comments

Comments
 (0)