agentx-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +561 -0
- package/dist/agent.d.ts +105 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +690 -0
- package/dist/agent.js.map +1 -0
- package/dist/config/config.d.ts +346 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +93 -0
- package/dist/config/config.js.map +1 -0
- package/dist/contracts/entities/agent-event.d.ts +97 -0
- package/dist/contracts/entities/agent-event.d.ts.map +1 -0
- package/dist/contracts/entities/agent-event.js +2 -0
- package/dist/contracts/entities/agent-event.js.map +1 -0
- package/dist/contracts/entities/agent-skill.d.ts +59 -0
- package/dist/contracts/entities/agent-skill.d.ts.map +1 -0
- package/dist/contracts/entities/agent-skill.js +2 -0
- package/dist/contracts/entities/agent-skill.js.map +1 -0
- package/dist/contracts/entities/agent-tool.d.ts +42 -0
- package/dist/contracts/entities/agent-tool.d.ts.map +1 -0
- package/dist/contracts/entities/agent-tool.js +2 -0
- package/dist/contracts/entities/agent-tool.js.map +1 -0
- package/dist/contracts/entities/chat-message.d.ts +13 -0
- package/dist/contracts/entities/chat-message.d.ts.map +1 -0
- package/dist/contracts/entities/chat-message.js +2 -0
- package/dist/contracts/entities/chat-message.js.map +1 -0
- package/dist/contracts/entities/content-part.d.ts +16 -0
- package/dist/contracts/entities/content-part.d.ts.map +1 -0
- package/dist/contracts/entities/content-part.js +2 -0
- package/dist/contracts/entities/content-part.js.map +1 -0
- package/dist/contracts/entities/execution-context.d.ts +9 -0
- package/dist/contracts/entities/execution-context.d.ts.map +1 -0
- package/dist/contracts/entities/execution-context.js +2 -0
- package/dist/contracts/entities/execution-context.js.map +1 -0
- package/dist/contracts/entities/index.d.ts +11 -0
- package/dist/contracts/entities/index.d.ts.map +1 -0
- package/dist/contracts/entities/index.js +2 -0
- package/dist/contracts/entities/index.js.map +1 -0
- package/dist/contracts/entities/knowledge.d.ts +21 -0
- package/dist/contracts/entities/knowledge.d.ts.map +1 -0
- package/dist/contracts/entities/knowledge.js +2 -0
- package/dist/contracts/entities/knowledge.js.map +1 -0
- package/dist/contracts/entities/stores.d.ts +18 -0
- package/dist/contracts/entities/stores.d.ts.map +1 -0
- package/dist/contracts/entities/stores.js +2 -0
- package/dist/contracts/entities/stores.js.map +1 -0
- package/dist/contracts/entities/token-usage.d.ts +7 -0
- package/dist/contracts/entities/token-usage.d.ts.map +1 -0
- package/dist/contracts/entities/token-usage.js +2 -0
- package/dist/contracts/entities/token-usage.js.map +1 -0
- package/dist/contracts/entities/tool-call.d.ts +16 -0
- package/dist/contracts/entities/tool-call.d.ts.map +1 -0
- package/dist/contracts/entities/tool-call.js +2 -0
- package/dist/contracts/entities/tool-call.js.map +1 -0
- package/dist/contracts/enums/index.d.ts +21 -0
- package/dist/contracts/enums/index.d.ts.map +1 -0
- package/dist/contracts/enums/index.js +8 -0
- package/dist/contracts/enums/index.js.map +1 -0
- package/dist/contracts/index.d.ts +3 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +3 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/core/compaction/autocompact.d.ts +18 -0
- package/dist/core/compaction/autocompact.d.ts.map +1 -0
- package/dist/core/compaction/autocompact.js +68 -0
- package/dist/core/compaction/autocompact.js.map +1 -0
- package/dist/core/compaction/microcompact.d.ts +20 -0
- package/dist/core/compaction/microcompact.d.ts.map +1 -0
- package/dist/core/compaction/microcompact.js +38 -0
- package/dist/core/compaction/microcompact.js.map +1 -0
- package/dist/core/compaction/snip-compact.d.ts +22 -0
- package/dist/core/compaction/snip-compact.d.ts.map +1 -0
- package/dist/core/compaction/snip-compact.js +61 -0
- package/dist/core/compaction/snip-compact.js.map +1 -0
- package/dist/core/compaction/tool-result-budget.d.ts +24 -0
- package/dist/core/compaction/tool-result-budget.d.ts.map +1 -0
- package/dist/core/compaction/tool-result-budget.js +67 -0
- package/dist/core/compaction/tool-result-budget.js.map +1 -0
- package/dist/core/context-analysis.d.ts +24 -0
- package/dist/core/context-analysis.d.ts.map +1 -0
- package/dist/core/context-analysis.js +37 -0
- package/dist/core/context-analysis.js.map +1 -0
- package/dist/core/context-builder.d.ts +25 -0
- package/dist/core/context-builder.d.ts.map +1 -0
- package/dist/core/context-builder.js +108 -0
- package/dist/core/context-builder.js.map +1 -0
- package/dist/core/conversation-manager.d.ts +19 -0
- package/dist/core/conversation-manager.d.ts.map +1 -0
- package/dist/core/conversation-manager.js +62 -0
- package/dist/core/conversation-manager.js.map +1 -0
- package/dist/core/execution-context.d.ts +6 -0
- package/dist/core/execution-context.d.ts.map +1 -0
- package/dist/core/execution-context.js +14 -0
- package/dist/core/execution-context.js.map +1 -0
- package/dist/core/loop-deps.d.ts +15 -0
- package/dist/core/loop-deps.d.ts.map +1 -0
- package/dist/core/loop-deps.js +8 -0
- package/dist/core/loop-deps.js.map +1 -0
- package/dist/core/loop-types.d.ts +34 -0
- package/dist/core/loop-types.d.ts.map +1 -0
- package/dist/core/loop-types.js +15 -0
- package/dist/core/loop-types.js.map +1 -0
- package/dist/core/message-normalize.d.ts +18 -0
- package/dist/core/message-normalize.d.ts.map +1 -0
- package/dist/core/message-normalize.js +69 -0
- package/dist/core/message-normalize.js.map +1 -0
- package/dist/core/prompt-builders.d.ts +36 -0
- package/dist/core/prompt-builders.d.ts.map +1 -0
- package/dist/core/prompt-builders.js +89 -0
- package/dist/core/prompt-builders.js.map +1 -0
- package/dist/core/prompt-cache.d.ts +25 -0
- package/dist/core/prompt-cache.d.ts.map +1 -0
- package/dist/core/prompt-cache.js +34 -0
- package/dist/core/prompt-cache.js.map +1 -0
- package/dist/core/react-loop.d.ts +43 -0
- package/dist/core/react-loop.d.ts.map +1 -0
- package/dist/core/react-loop.js +403 -0
- package/dist/core/react-loop.js.map +1 -0
- package/dist/core/stop-hooks.d.ts +18 -0
- package/dist/core/stop-hooks.d.ts.map +1 -0
- package/dist/core/stop-hooks.js +18 -0
- package/dist/core/stop-hooks.js.map +1 -0
- package/dist/core/stream-emitter.d.ts +24 -0
- package/dist/core/stream-emitter.d.ts.map +1 -0
- package/dist/core/stream-emitter.js +65 -0
- package/dist/core/stream-emitter.js.map +1 -0
- package/dist/core/streaming-tool-executor.d.ts +54 -0
- package/dist/core/streaming-tool-executor.d.ts.map +1 -0
- package/dist/core/streaming-tool-executor.js +164 -0
- package/dist/core/streaming-tool-executor.js.map +1 -0
- package/dist/core/turn-end-hooks.d.ts +39 -0
- package/dist/core/turn-end-hooks.d.ts.map +1 -0
- package/dist/core/turn-end-hooks.js +36 -0
- package/dist/core/turn-end-hooks.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/chunking.d.ts +9 -0
- package/dist/knowledge/chunking.d.ts.map +1 -0
- package/dist/knowledge/chunking.js +49 -0
- package/dist/knowledge/chunking.js.map +1 -0
- package/dist/knowledge/embedding-service.d.ts +16 -0
- package/dist/knowledge/embedding-service.d.ts.map +1 -0
- package/dist/knowledge/embedding-service.js +43 -0
- package/dist/knowledge/embedding-service.js.map +1 -0
- package/dist/knowledge/knowledge-manager.d.ts +33 -0
- package/dist/knowledge/knowledge-manager.d.ts.map +1 -0
- package/dist/knowledge/knowledge-manager.js +62 -0
- package/dist/knowledge/knowledge-manager.js.map +1 -0
- package/dist/knowledge/sqlite-vector-store.d.ts +16 -0
- package/dist/knowledge/sqlite-vector-store.d.ts.map +1 -0
- package/dist/knowledge/sqlite-vector-store.js +56 -0
- package/dist/knowledge/sqlite-vector-store.js.map +1 -0
- package/dist/knowledge/vector-store.d.ts +2 -0
- package/dist/knowledge/vector-store.d.ts.map +1 -0
- package/dist/knowledge/vector-store.js +2 -0
- package/dist/knowledge/vector-store.js.map +1 -0
- package/dist/llm/errors.d.ts +15 -0
- package/dist/llm/errors.d.ts.map +1 -0
- package/dist/llm/errors.js +39 -0
- package/dist/llm/errors.js.map +1 -0
- package/dist/llm/message-types.d.ts +80 -0
- package/dist/llm/message-types.d.ts.map +1 -0
- package/dist/llm/message-types.js +2 -0
- package/dist/llm/message-types.js.map +1 -0
- package/dist/llm/openrouter-client.d.ts +18 -0
- package/dist/llm/openrouter-client.d.ts.map +1 -0
- package/dist/llm/openrouter-client.js +215 -0
- package/dist/llm/openrouter-client.js.map +1 -0
- package/dist/llm/reasoning.d.ts +10 -0
- package/dist/llm/reasoning.d.ts.map +1 -0
- package/dist/llm/reasoning.js +18 -0
- package/dist/llm/reasoning.js.map +1 -0
- package/dist/memory/file-memory-system.d.ts +98 -0
- package/dist/memory/file-memory-system.d.ts.map +1 -0
- package/dist/memory/file-memory-system.js +310 -0
- package/dist/memory/file-memory-system.js.map +1 -0
- package/dist/memory/memory-age.d.ts +22 -0
- package/dist/memory/memory-age.d.ts.map +1 -0
- package/dist/memory/memory-age.js +44 -0
- package/dist/memory/memory-age.js.map +1 -0
- package/dist/memory/memory-extractor.d.ts +56 -0
- package/dist/memory/memory-extractor.d.ts.map +1 -0
- package/dist/memory/memory-extractor.js +91 -0
- package/dist/memory/memory-extractor.js.map +1 -0
- package/dist/memory/memory-paths.d.ts +45 -0
- package/dist/memory/memory-paths.d.ts.map +1 -0
- package/dist/memory/memory-paths.js +121 -0
- package/dist/memory/memory-paths.js.map +1 -0
- package/dist/memory/memory-prompts.d.ts +41 -0
- package/dist/memory/memory-prompts.d.ts.map +1 -0
- package/dist/memory/memory-prompts.js +279 -0
- package/dist/memory/memory-prompts.js.map +1 -0
- package/dist/memory/memory-relevance.d.ts +16 -0
- package/dist/memory/memory-relevance.d.ts.map +1 -0
- package/dist/memory/memory-relevance.js +46 -0
- package/dist/memory/memory-relevance.js.map +1 -0
- package/dist/memory/memory-scanner.d.ts +22 -0
- package/dist/memory/memory-scanner.d.ts.map +1 -0
- package/dist/memory/memory-scanner.js +99 -0
- package/dist/memory/memory-scanner.js.map +1 -0
- package/dist/memory/memory-tools.d.ts +16 -0
- package/dist/memory/memory-tools.d.ts.map +1 -0
- package/dist/memory/memory-tools.js +196 -0
- package/dist/memory/memory-tools.js.map +1 -0
- package/dist/memory/memory-types.d.ts +47 -0
- package/dist/memory/memory-types.d.ts.map +1 -0
- package/dist/memory/memory-types.js +24 -0
- package/dist/memory/memory-types.js.map +1 -0
- package/dist/skills/skill-args.d.ts +23 -0
- package/dist/skills/skill-args.d.ts.map +1 -0
- package/dist/skills/skill-args.js +77 -0
- package/dist/skills/skill-args.js.map +1 -0
- package/dist/skills/skill-glob.d.ts +24 -0
- package/dist/skills/skill-glob.d.ts.map +1 -0
- package/dist/skills/skill-glob.js +60 -0
- package/dist/skills/skill-glob.js.map +1 -0
- package/dist/skills/skill-loader.d.ts +49 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-loader.js +197 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/skills/skill-manager.d.ts +83 -0
- package/dist/skills/skill-manager.d.ts.map +1 -0
- package/dist/skills/skill-manager.js +338 -0
- package/dist/skills/skill-manager.js.map +1 -0
- package/dist/storage/sqlite-conversation-store.d.ts +15 -0
- package/dist/storage/sqlite-conversation-store.d.ts.map +1 -0
- package/dist/storage/sqlite-conversation-store.js +45 -0
- package/dist/storage/sqlite-conversation-store.js.map +1 -0
- package/dist/storage/sqlite-database.d.ts +14 -0
- package/dist/storage/sqlite-database.d.ts.map +1 -0
- package/dist/storage/sqlite-database.js +95 -0
- package/dist/storage/sqlite-database.js.map +1 -0
- package/dist/tools/builtin/ask-user.d.ts +7 -0
- package/dist/tools/builtin/ask-user.d.ts.map +1 -0
- package/dist/tools/builtin/ask-user.js +23 -0
- package/dist/tools/builtin/ask-user.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts +3 -0
- package/dist/tools/builtin/bash.d.ts.map +1 -0
- package/dist/tools/builtin/bash.js +54 -0
- package/dist/tools/builtin/bash.js.map +1 -0
- package/dist/tools/builtin/file-edit.d.ts +3 -0
- package/dist/tools/builtin/file-edit.d.ts.map +1 -0
- package/dist/tools/builtin/file-edit.js +50 -0
- package/dist/tools/builtin/file-edit.js.map +1 -0
- package/dist/tools/builtin/file-read.d.ts +3 -0
- package/dist/tools/builtin/file-read.d.ts.map +1 -0
- package/dist/tools/builtin/file-read.js +47 -0
- package/dist/tools/builtin/file-read.js.map +1 -0
- package/dist/tools/builtin/file-write.d.ts +3 -0
- package/dist/tools/builtin/file-write.d.ts.map +1 -0
- package/dist/tools/builtin/file-write.js +29 -0
- package/dist/tools/builtin/file-write.js.map +1 -0
- package/dist/tools/builtin/glob.d.ts +3 -0
- package/dist/tools/builtin/glob.d.ts.map +1 -0
- package/dist/tools/builtin/glob.js +67 -0
- package/dist/tools/builtin/glob.js.map +1 -0
- package/dist/tools/builtin/grep.d.ts +3 -0
- package/dist/tools/builtin/grep.d.ts.map +1 -0
- package/dist/tools/builtin/grep.js +94 -0
- package/dist/tools/builtin/grep.js.map +1 -0
- package/dist/tools/builtin/index.d.ts +49 -0
- package/dist/tools/builtin/index.d.ts.map +1 -0
- package/dist/tools/builtin/index.js +65 -0
- package/dist/tools/builtin/index.js.map +1 -0
- package/dist/tools/builtin/web-fetch.d.ts +3 -0
- package/dist/tools/builtin/web-fetch.d.ts.map +1 -0
- package/dist/tools/builtin/web-fetch.js +56 -0
- package/dist/tools/builtin/web-fetch.js.map +1 -0
- package/dist/tools/json-schema-to-zod.d.ts +30 -0
- package/dist/tools/json-schema-to-zod.d.ts.map +1 -0
- package/dist/tools/json-schema-to-zod.js +123 -0
- package/dist/tools/json-schema-to-zod.js.map +1 -0
- package/dist/tools/mcp-adapter.d.ts +80 -0
- package/dist/tools/mcp-adapter.d.ts.map +1 -0
- package/dist/tools/mcp-adapter.js +326 -0
- package/dist/tools/mcp-adapter.js.map +1 -0
- package/dist/tools/skill-tool.d.ts +41 -0
- package/dist/tools/skill-tool.d.ts.map +1 -0
- package/dist/tools/skill-tool.js +149 -0
- package/dist/tools/skill-tool.js.map +1 -0
- package/dist/tools/sql/index.d.ts +4 -0
- package/dist/tools/sql/index.d.ts.map +1 -0
- package/dist/tools/sql/index.js +2 -0
- package/dist/tools/sql/index.js.map +1 -0
- package/dist/tools/sql/sql-query-def.d.ts +22 -0
- package/dist/tools/sql/sql-query-def.d.ts.map +1 -0
- package/dist/tools/sql/sql-query-def.js +2 -0
- package/dist/tools/sql/sql-query-def.js.map +1 -0
- package/dist/tools/sql/sql-tool-factory.d.ts +28 -0
- package/dist/tools/sql/sql-tool-factory.d.ts.map +1 -0
- package/dist/tools/sql/sql-tool-factory.js +136 -0
- package/dist/tools/sql/sql-tool-factory.js.map +1 -0
- package/dist/tools/tool-executor.d.ts +67 -0
- package/dist/tools/tool-executor.d.ts.map +1 -0
- package/dist/tools/tool-executor.js +232 -0
- package/dist/tools/tool-executor.js.map +1 -0
- package/dist/utils/cache.d.ts +22 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +61 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +46 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/model-context.d.ts +14 -0
- package/dist/utils/model-context.d.ts.map +1 -0
- package/dist/utils/model-context.js +52 -0
- package/dist/utils/model-context.js.map +1 -0
- package/dist/utils/retry.d.ts +13 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +41 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/token-counter.d.ts +6 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +19 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite implementation of VectorStore with brute-force cosine similarity.
|
|
3
|
+
*/
|
|
4
|
+
export class SQLiteVectorStore {
|
|
5
|
+
database;
|
|
6
|
+
constructor(database) {
|
|
7
|
+
this.database = database;
|
|
8
|
+
}
|
|
9
|
+
upsert(chunk) {
|
|
10
|
+
this.database.db.prepare(`
|
|
11
|
+
INSERT OR REPLACE INTO vectors (id, content, embedding, metadata, created_at)
|
|
12
|
+
VALUES (?, ?, ?, ?, ?)
|
|
13
|
+
`).run(chunk.id, chunk.content, Buffer.from(chunk.embedding.buffer), chunk.metadata ? JSON.stringify(chunk.metadata) : null, chunk.createdAt);
|
|
14
|
+
}
|
|
15
|
+
search(queryEmbedding, topK) {
|
|
16
|
+
const rows = this.database.db.prepare('SELECT * FROM vectors').all();
|
|
17
|
+
const scored = rows.map(row => {
|
|
18
|
+
const embedding = new Float32Array(row.embedding.buffer, row.embedding.byteOffset, row.embedding.byteLength / 4);
|
|
19
|
+
return {
|
|
20
|
+
id: row.id,
|
|
21
|
+
content: row.content,
|
|
22
|
+
score: cosineSimilarity(queryEmbedding, embedding),
|
|
23
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
scored.sort((a, b) => b.score - a.score);
|
|
27
|
+
return scored.slice(0, topK);
|
|
28
|
+
}
|
|
29
|
+
delete(id) {
|
|
30
|
+
this.database.db.prepare('DELETE FROM vectors WHERE id = ?').run(id);
|
|
31
|
+
}
|
|
32
|
+
listAll() {
|
|
33
|
+
const rows = this.database.db.prepare('SELECT * FROM vectors').all();
|
|
34
|
+
return rows.map(row => ({
|
|
35
|
+
id: row.id,
|
|
36
|
+
content: row.content,
|
|
37
|
+
embedding: new Float32Array(row.embedding.buffer, row.embedding.byteOffset, row.embedding.byteLength / 4),
|
|
38
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
39
|
+
createdAt: row.created_at,
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
deleteBySource(sourceId) {
|
|
43
|
+
this.database.db.prepare("DELETE FROM vectors WHERE json_extract(metadata, '$.sourceId') = ?").run(sourceId);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function cosineSimilarity(a, b) {
|
|
47
|
+
let dot = 0, normA = 0, normB = 0;
|
|
48
|
+
for (let i = 0; i < a.length; i++) {
|
|
49
|
+
dot += a[i] * b[i];
|
|
50
|
+
normA += a[i] * a[i];
|
|
51
|
+
normB += b[i] * b[i];
|
|
52
|
+
}
|
|
53
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
54
|
+
return denom === 0 ? 0 : dot / denom;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=sqlite-vector-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-vector-store.js","sourceRoot":"","sources":["../../src/knowledge/sqlite-vector-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../../src/knowledge/vector-store.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../../src/knowledge/vector-store.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Thrown when the API returns 413 — prompt exceeds context window */
|
|
2
|
+
export declare class PromptTooLongError extends Error {
|
|
3
|
+
constructor(message?: string);
|
|
4
|
+
}
|
|
5
|
+
/** Thrown when the API returns 529 or 503 — model overloaded */
|
|
6
|
+
export declare class OverloadedError extends Error {
|
|
7
|
+
constructor(message?: string);
|
|
8
|
+
}
|
|
9
|
+
/** Thrown when the API returns 402 — insufficient credits/billing */
|
|
10
|
+
export declare class InsufficientCreditsError extends Error {
|
|
11
|
+
constructor(message?: string);
|
|
12
|
+
}
|
|
13
|
+
/** Classify an API error thrown from fetchAPI */
|
|
14
|
+
export declare function classifyAPIError(error: unknown): unknown;
|
|
15
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/llm/errors.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,SAAoB;CAIxC;AAED,gEAAgE;AAChE,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,SAAqB;CAIzC;AAED,qEAAqE;AACrE,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,SAAyB;CAI7C;AAED,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAaxD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Thrown when the API returns 413 — prompt exceeds context window */
|
|
2
|
+
export class PromptTooLongError extends Error {
|
|
3
|
+
constructor(message = 'Prompt too long') {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'PromptTooLongError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
/** Thrown when the API returns 529 or 503 — model overloaded */
|
|
9
|
+
export class OverloadedError extends Error {
|
|
10
|
+
constructor(message = 'Model overloaded') {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'OverloadedError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Thrown when the API returns 402 — insufficient credits/billing */
|
|
16
|
+
export class InsufficientCreditsError extends Error {
|
|
17
|
+
constructor(message = 'Insufficient credits') {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = 'InsufficientCreditsError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Classify an API error thrown from fetchAPI */
|
|
23
|
+
export function classifyAPIError(error) {
|
|
24
|
+
if (error instanceof PromptTooLongError || error instanceof OverloadedError || error instanceof InsufficientCreditsError) {
|
|
25
|
+
return error;
|
|
26
|
+
}
|
|
27
|
+
if (error instanceof Error) {
|
|
28
|
+
const msg = error.message;
|
|
29
|
+
if (msg.includes('402'))
|
|
30
|
+
return new InsufficientCreditsError(msg);
|
|
31
|
+
if (msg.includes('413'))
|
|
32
|
+
return new PromptTooLongError(msg);
|
|
33
|
+
if (msg.includes('529') || (msg.includes('503') && msg.toLowerCase().includes('overload'))) {
|
|
34
|
+
return new OverloadedError(msg);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return error;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/llm/errors.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAO,GAAG,iBAAiB;QACrC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,gEAAgE;AAChE,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAO,GAAG,kBAAkB;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,qEAAqE;AACrE,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,OAAO,GAAG,sBAAsB;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,iDAAiD;AACjD,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,KAAK,YAAY,kBAAkB,IAAI,KAAK,YAAY,eAAe,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;QACzH,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;QAC1B,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC;QAClE,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC5D,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAC3F,OAAO,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { TokenUsage } from '../contracts/entities/token-usage.js';
|
|
2
|
+
/** Message format for OpenRouter API */
|
|
3
|
+
export interface OpenRouterMessage {
|
|
4
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
5
|
+
content: string | OpenRouterContentPart[];
|
|
6
|
+
tool_calls?: OpenRouterToolCall[];
|
|
7
|
+
tool_call_id?: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface OpenRouterContentPart {
|
|
11
|
+
type: 'text' | 'image_url';
|
|
12
|
+
text?: string;
|
|
13
|
+
image_url?: {
|
|
14
|
+
url: string;
|
|
15
|
+
detail?: 'auto' | 'low' | 'high';
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface OpenRouterToolCall {
|
|
19
|
+
id: string;
|
|
20
|
+
type: 'function';
|
|
21
|
+
function: {
|
|
22
|
+
name: string;
|
|
23
|
+
arguments: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/** Tool definition for OpenRouter function calling */
|
|
27
|
+
export interface ToolDefinition {
|
|
28
|
+
type: 'function';
|
|
29
|
+
function: {
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
parameters: Record<string, unknown>;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Response format for structured output */
|
|
36
|
+
export interface ResponseFormat {
|
|
37
|
+
type: 'text' | 'json_object' | 'json_schema';
|
|
38
|
+
json_schema?: {
|
|
39
|
+
name: string;
|
|
40
|
+
schema: Record<string, unknown>;
|
|
41
|
+
strict?: boolean;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Parameters for streamChat/chat */
|
|
45
|
+
export interface StreamChatParams {
|
|
46
|
+
messages: OpenRouterMessage[];
|
|
47
|
+
tools?: ToolDefinition[];
|
|
48
|
+
temperature?: number;
|
|
49
|
+
responseFormat?: ResponseFormat;
|
|
50
|
+
signal?: AbortSignal;
|
|
51
|
+
seed?: number;
|
|
52
|
+
maxTokens?: number;
|
|
53
|
+
model?: string;
|
|
54
|
+
}
|
|
55
|
+
export type ChatParams = StreamChatParams;
|
|
56
|
+
/** Chunk types emitted during SSE streaming */
|
|
57
|
+
export type StreamChunk = {
|
|
58
|
+
type: 'content';
|
|
59
|
+
data: string;
|
|
60
|
+
} | {
|
|
61
|
+
type: 'tool_call';
|
|
62
|
+
id: string;
|
|
63
|
+
name: string;
|
|
64
|
+
arguments: string;
|
|
65
|
+
} | {
|
|
66
|
+
type: 'reasoning';
|
|
67
|
+
data: string;
|
|
68
|
+
} | {
|
|
69
|
+
type: 'done';
|
|
70
|
+
finishReason: string;
|
|
71
|
+
usage?: TokenUsage;
|
|
72
|
+
};
|
|
73
|
+
/** Non-streaming chat response */
|
|
74
|
+
export interface ChatResponse {
|
|
75
|
+
content: string;
|
|
76
|
+
toolCalls?: OpenRouterToolCall[];
|
|
77
|
+
finishReason: string;
|
|
78
|
+
usage: TokenUsage;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=message-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-types.d.ts","sourceRoot":"","sources":["../../src/llm/message-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAEvE,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,GAAG,qBAAqB,EAAE,CAAC;IAC1C,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;KAAE,CAAC;CAC/D;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,sDAAsD;AACtD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;CACH;AAED,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,aAAa,CAAC;IAC7C,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACnF;AAED,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,UAAU,GAAG,gBAAgB,CAAC;AAE1C,+CAA+C;AAC/C,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,UAAU,CAAA;CAAE,CAAC;AAE/D,kCAAkC;AAClC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,UAAU,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-types.js","sourceRoot":"","sources":["../../src/llm/message-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { StreamChatParams, ChatParams, StreamChunk, ChatResponse } from './message-types.js';
|
|
2
|
+
export interface OpenRouterClientConfig {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
model: string;
|
|
5
|
+
baseUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class OpenRouterClient {
|
|
8
|
+
private readonly apiKey;
|
|
9
|
+
private readonly model;
|
|
10
|
+
private readonly baseUrl;
|
|
11
|
+
constructor(config: OpenRouterClientConfig);
|
|
12
|
+
streamChat(params: StreamChatParams): AsyncIterableIterator<StreamChunk>;
|
|
13
|
+
chat(params: ChatParams): Promise<ChatResponse>;
|
|
14
|
+
embed(texts: string[], model?: string): Promise<number[][]>;
|
|
15
|
+
private fetchAPI;
|
|
16
|
+
private parseSSEStream;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=openrouter-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter-client.d.ts","sourceRoot":"","sources":["../../src/llm/openrouter-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,YAAY,EAEb,MAAM,oBAAoB,CAAC;AAK5B,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,sBAAsB;IAMnC,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,qBAAqB,CAAC,WAAW,CAAC;IAgCzE,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAoD/C,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAgBnD,QAAQ;YA+BP,cAAc;CAgG9B"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { retry } from '../utils/retry.js';
|
|
2
|
+
import { buildReasoningArgs, requiresNoSystemRole } from './reasoning.js';
|
|
3
|
+
function isRetryableStatus(status) {
|
|
4
|
+
return status === 429 || status >= 500;
|
|
5
|
+
}
|
|
6
|
+
export class OpenRouterClient {
|
|
7
|
+
apiKey;
|
|
8
|
+
model;
|
|
9
|
+
baseUrl;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.apiKey = config.apiKey;
|
|
12
|
+
this.model = config.model;
|
|
13
|
+
this.baseUrl = (config.baseUrl ?? 'https://openrouter.ai/api/v1').replace(/\/$/, '');
|
|
14
|
+
}
|
|
15
|
+
async *streamChat(params) {
|
|
16
|
+
const model = params.model ?? this.model;
|
|
17
|
+
const reasoningArgs = buildReasoningArgs(model);
|
|
18
|
+
let messages = params.messages;
|
|
19
|
+
if (requiresNoSystemRole(model)) {
|
|
20
|
+
messages = messages.map(m => m.role === 'system' ? { ...m, role: 'user' } : m);
|
|
21
|
+
}
|
|
22
|
+
const body = {
|
|
23
|
+
model,
|
|
24
|
+
messages,
|
|
25
|
+
stream: true,
|
|
26
|
+
...reasoningArgs,
|
|
27
|
+
};
|
|
28
|
+
if (params.tools?.length)
|
|
29
|
+
body.tools = params.tools;
|
|
30
|
+
if (params.temperature !== undefined)
|
|
31
|
+
body.temperature = params.temperature;
|
|
32
|
+
if (params.responseFormat)
|
|
33
|
+
body.response_format = params.responseFormat;
|
|
34
|
+
if (params.seed !== undefined)
|
|
35
|
+
body.seed = params.seed;
|
|
36
|
+
if (params.maxTokens !== undefined)
|
|
37
|
+
body.max_tokens = params.maxTokens;
|
|
38
|
+
const response = await retry(() => this.fetchAPI('/chat/completions', body, params.signal), { maxRetries: 3, initialDelay: 1000, isRetryable: (e) => e instanceof RetryableError });
|
|
39
|
+
yield* this.parseSSEStream(response, params.signal);
|
|
40
|
+
}
|
|
41
|
+
async chat(params) {
|
|
42
|
+
const model = params.model ?? this.model;
|
|
43
|
+
const reasoningArgs = buildReasoningArgs(model);
|
|
44
|
+
let messages = params.messages;
|
|
45
|
+
if (requiresNoSystemRole(model)) {
|
|
46
|
+
messages = messages.map(m => m.role === 'system' ? { ...m, role: 'user' } : m);
|
|
47
|
+
}
|
|
48
|
+
const body = {
|
|
49
|
+
model,
|
|
50
|
+
messages,
|
|
51
|
+
stream: false,
|
|
52
|
+
...reasoningArgs,
|
|
53
|
+
};
|
|
54
|
+
if (params.tools?.length)
|
|
55
|
+
body.tools = params.tools;
|
|
56
|
+
if (params.temperature !== undefined)
|
|
57
|
+
body.temperature = params.temperature;
|
|
58
|
+
if (params.responseFormat)
|
|
59
|
+
body.response_format = params.responseFormat;
|
|
60
|
+
if (params.seed !== undefined)
|
|
61
|
+
body.seed = params.seed;
|
|
62
|
+
if (params.maxTokens !== undefined)
|
|
63
|
+
body.max_tokens = params.maxTokens;
|
|
64
|
+
const response = await retry(() => this.fetchAPI('/chat/completions', body, params.signal), { maxRetries: 3, initialDelay: 1000, isRetryable: (e) => e instanceof RetryableError });
|
|
65
|
+
const json = await response.json();
|
|
66
|
+
const choice = json.choices[0];
|
|
67
|
+
const usage = {
|
|
68
|
+
inputTokens: json.usage?.prompt_tokens ?? 0,
|
|
69
|
+
outputTokens: json.usage?.completion_tokens ?? 0,
|
|
70
|
+
totalTokens: json.usage?.total_tokens ?? 0,
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
content: choice.message.content ?? '',
|
|
74
|
+
toolCalls: choice.message.tool_calls,
|
|
75
|
+
finishReason: choice.finish_reason,
|
|
76
|
+
usage,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
async embed(texts, model) {
|
|
80
|
+
const response = await retry(() => this.fetchAPI('/embeddings', {
|
|
81
|
+
model: model ?? 'openai/text-embedding-3-small',
|
|
82
|
+
input: texts,
|
|
83
|
+
}), { maxRetries: 3, initialDelay: 1000, isRetryable: (e) => e instanceof RetryableError });
|
|
84
|
+
const json = await response.json();
|
|
85
|
+
return json.data.map(d => d.embedding);
|
|
86
|
+
}
|
|
87
|
+
async fetchAPI(path, body, signal) {
|
|
88
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
89
|
+
method: 'POST',
|
|
90
|
+
headers: {
|
|
91
|
+
'Content-Type': 'application/json',
|
|
92
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
93
|
+
},
|
|
94
|
+
body: JSON.stringify(body),
|
|
95
|
+
signal,
|
|
96
|
+
});
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
if (isRetryableStatus(response.status)) {
|
|
99
|
+
// Parse Retry-After header (seconds or HTTP-date)
|
|
100
|
+
let retryAfterMs;
|
|
101
|
+
const retryAfter = response.headers.get('retry-after');
|
|
102
|
+
if (retryAfter) {
|
|
103
|
+
const seconds = Number(retryAfter);
|
|
104
|
+
retryAfterMs = Number.isNaN(seconds)
|
|
105
|
+
? Math.max(0, new Date(retryAfter).getTime() - Date.now())
|
|
106
|
+
: seconds * 1000;
|
|
107
|
+
}
|
|
108
|
+
throw new RetryableError(`OpenRouter API error: ${response.status}`, retryAfterMs);
|
|
109
|
+
}
|
|
110
|
+
const text = await response.text().catch(() => '');
|
|
111
|
+
throw new Error(`OpenRouter API error ${response.status}: ${text}`);
|
|
112
|
+
}
|
|
113
|
+
return response;
|
|
114
|
+
}
|
|
115
|
+
async *parseSSEStream(response, signal) {
|
|
116
|
+
const body = response.body;
|
|
117
|
+
if (!body)
|
|
118
|
+
throw new Error('Response body is null');
|
|
119
|
+
const reader = body.getReader();
|
|
120
|
+
const decoder = new TextDecoder();
|
|
121
|
+
let buffer = '';
|
|
122
|
+
// Accumulate tool calls incrementally
|
|
123
|
+
const toolCalls = new Map();
|
|
124
|
+
try {
|
|
125
|
+
while (true) {
|
|
126
|
+
if (signal?.aborted)
|
|
127
|
+
break;
|
|
128
|
+
const { done, value } = await reader.read();
|
|
129
|
+
if (done)
|
|
130
|
+
break;
|
|
131
|
+
buffer += decoder.decode(value, { stream: true });
|
|
132
|
+
const lines = buffer.split('\n');
|
|
133
|
+
buffer = lines.pop() ?? '';
|
|
134
|
+
for (const line of lines) {
|
|
135
|
+
const trimmed = line.trim();
|
|
136
|
+
if (!trimmed || trimmed.startsWith(':'))
|
|
137
|
+
continue;
|
|
138
|
+
if (!trimmed.startsWith('data: '))
|
|
139
|
+
continue;
|
|
140
|
+
const data = trimmed.slice(6);
|
|
141
|
+
if (data === '[DONE]') {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
let parsed;
|
|
145
|
+
try {
|
|
146
|
+
parsed = JSON.parse(data);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const choice = parsed.choices?.[0];
|
|
152
|
+
if (!choice)
|
|
153
|
+
continue;
|
|
154
|
+
const delta = choice.delta;
|
|
155
|
+
// Text content
|
|
156
|
+
if (delta?.content) {
|
|
157
|
+
yield { type: 'content', data: delta.content };
|
|
158
|
+
}
|
|
159
|
+
// Reasoning content
|
|
160
|
+
if (delta?.reasoning) {
|
|
161
|
+
yield { type: 'reasoning', data: delta.reasoning };
|
|
162
|
+
}
|
|
163
|
+
// Tool calls (accumulated incrementally)
|
|
164
|
+
if (delta?.tool_calls) {
|
|
165
|
+
for (const tc of delta.tool_calls) {
|
|
166
|
+
const existing = toolCalls.get(tc.index);
|
|
167
|
+
if (!existing) {
|
|
168
|
+
const entry = {
|
|
169
|
+
id: tc.id ?? '',
|
|
170
|
+
name: tc.function?.name ?? '',
|
|
171
|
+
arguments: tc.function?.arguments ?? '',
|
|
172
|
+
};
|
|
173
|
+
toolCalls.set(tc.index, entry);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
if (tc.id)
|
|
177
|
+
existing.id = tc.id;
|
|
178
|
+
if (tc.function?.name)
|
|
179
|
+
existing.name += tc.function.name;
|
|
180
|
+
if (tc.function?.arguments)
|
|
181
|
+
existing.arguments += tc.function.arguments;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Done
|
|
186
|
+
if (choice.finish_reason) {
|
|
187
|
+
// Emit accumulated tool calls
|
|
188
|
+
for (const tc of toolCalls.values()) {
|
|
189
|
+
yield { type: 'tool_call', id: tc.id, name: tc.name, arguments: tc.arguments };
|
|
190
|
+
}
|
|
191
|
+
const usage = parsed.usage ? {
|
|
192
|
+
inputTokens: parsed.usage.prompt_tokens,
|
|
193
|
+
outputTokens: parsed.usage.completion_tokens,
|
|
194
|
+
totalTokens: parsed.usage.total_tokens,
|
|
195
|
+
} : undefined;
|
|
196
|
+
yield { type: 'done', finishReason: choice.finish_reason, usage };
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
reader.releaseLock();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
class RetryableError extends Error {
|
|
208
|
+
retryAfterMs;
|
|
209
|
+
constructor(message, retryAfterMs) {
|
|
210
|
+
super(message);
|
|
211
|
+
this.name = 'RetryableError';
|
|
212
|
+
this.retryAfterMs = retryAfterMs;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=openrouter-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter-client.js","sourceRoot":"","sources":["../../src/llm/openrouter-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { StreamChatParams } from './message-types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Adjusts chat parameters based on model family for reasoning support.
|
|
4
|
+
*/
|
|
5
|
+
export declare function buildReasoningArgs(model: string): Partial<StreamChatParams>;
|
|
6
|
+
/**
|
|
7
|
+
* Checks if a model requires removing system messages (e.g. o1).
|
|
8
|
+
*/
|
|
9
|
+
export declare function requiresNoSystemRole(model: string): boolean;
|
|
10
|
+
//# sourceMappingURL=reasoning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning.d.ts","sourceRoot":"","sources":["../../src/llm/reasoning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQ3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE3D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adjusts chat parameters based on model family for reasoning support.
|
|
3
|
+
*/
|
|
4
|
+
export function buildReasoningArgs(model) {
|
|
5
|
+
if (model.startsWith('openai/o1') || model.startsWith('openai/o3')) {
|
|
6
|
+
// o1/o3 models: no temperature, no system role
|
|
7
|
+
return { temperature: undefined };
|
|
8
|
+
}
|
|
9
|
+
// Default: no special adjustments
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Checks if a model requires removing system messages (e.g. o1).
|
|
14
|
+
*/
|
|
15
|
+
export function requiresNoSystemRole(model) {
|
|
16
|
+
return model.startsWith('openai/o1') || model.startsWith('openai/o3');
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=reasoning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning.js","sourceRoot":"","sources":["../../src/llm/reasoning.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACnE,+CAA+C;QAC/C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IACpC,CAAC;IAED,kCAAkC;IAClC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-based memory system — main orchestrator.
|
|
3
|
+
*
|
|
4
|
+
* Manages Markdown memory files with YAML frontmatter and a MEMORY.md index.
|
|
5
|
+
* Supports thread-isolated memory: each threadId gets its own subdirectory.
|
|
6
|
+
* Global memories (no threadId) live in the root memoryDir.
|
|
7
|
+
*
|
|
8
|
+
* Layout:
|
|
9
|
+
* memoryDir/
|
|
10
|
+
* MEMORY.md ← global index
|
|
11
|
+
* project-info.md ← global memory
|
|
12
|
+
* threads/
|
|
13
|
+
* telegram-123/
|
|
14
|
+
* MEMORY.md ← thread index
|
|
15
|
+
* user-name.md ← thread-scoped memory
|
|
16
|
+
* teams-456/
|
|
17
|
+
* MEMORY.md
|
|
18
|
+
* ...
|
|
19
|
+
*/
|
|
20
|
+
import type { OpenRouterClient } from '../llm/openrouter-client.js';
|
|
21
|
+
import type { Logger } from '../utils/logger.js';
|
|
22
|
+
import type { MemoryFile, MemoryHeader, SaveMemoryInput } from './memory-types.js';
|
|
23
|
+
export interface FileMemoryConfig {
|
|
24
|
+
enabled?: boolean;
|
|
25
|
+
memoryDir?: string;
|
|
26
|
+
relevanceModel?: string;
|
|
27
|
+
maxMemoryFiles?: number;
|
|
28
|
+
extractionEnabled?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare class FileMemorySystem {
|
|
31
|
+
private readonly memoryDir;
|
|
32
|
+
private readonly client;
|
|
33
|
+
private readonly logger;
|
|
34
|
+
private readonly relevanceModel?;
|
|
35
|
+
private writeLock;
|
|
36
|
+
constructor(config: FileMemoryConfig, client: OpenRouterClient, logger: Logger);
|
|
37
|
+
/** Ensure the memory directory exists (idempotent). */
|
|
38
|
+
ensureDir(): Promise<void>;
|
|
39
|
+
/** Get the resolved memory directory path. */
|
|
40
|
+
getMemoryDir(): string;
|
|
41
|
+
/**
|
|
42
|
+
* Resolve the effective directory for a threadId.
|
|
43
|
+
* No threadId → root memoryDir (global).
|
|
44
|
+
* With threadId → memoryDir/threads/{threadId}/
|
|
45
|
+
*/
|
|
46
|
+
private resolveDir;
|
|
47
|
+
/** Ensure a thread directory exists. */
|
|
48
|
+
private ensureThreadDir;
|
|
49
|
+
/**
|
|
50
|
+
* Save a new memory file and update the MEMORY.md index.
|
|
51
|
+
* When threadId is provided, saves to the thread subdirectory.
|
|
52
|
+
*/
|
|
53
|
+
saveMemory(input: SaveMemoryInput, threadId?: string): Promise<string>;
|
|
54
|
+
/**
|
|
55
|
+
* Read and parse a memory file.
|
|
56
|
+
* When threadId is provided, reads from thread subdirectory.
|
|
57
|
+
*/
|
|
58
|
+
readMemory(filename: string, threadId?: string): Promise<MemoryFile | null>;
|
|
59
|
+
/**
|
|
60
|
+
* Delete a memory file and remove its entry from the index.
|
|
61
|
+
*/
|
|
62
|
+
deleteMemory(filename: string, threadId?: string): Promise<boolean>;
|
|
63
|
+
/**
|
|
64
|
+
* Scan memory files. When threadId is provided, scans thread dir + global dir (merged).
|
|
65
|
+
*/
|
|
66
|
+
scanMemories(signal?: AbortSignal, threadId?: string): Promise<MemoryHeader[]>;
|
|
67
|
+
/**
|
|
68
|
+
* Find relevant memories for a query using LLM selection.
|
|
69
|
+
* Scans thread + global memories when threadId is provided.
|
|
70
|
+
*/
|
|
71
|
+
findRelevant(query: string, signal?: AbortSignal, excludeFilenames?: ReadonlySet<string>, threadId?: string): Promise<MemoryFile[]>;
|
|
72
|
+
/**
|
|
73
|
+
* Build the context prompt from MEMORY.md.
|
|
74
|
+
* When threadId is provided, merges global + thread MEMORY.md.
|
|
75
|
+
*/
|
|
76
|
+
buildContextPrompt(threadId?: string): Promise<string>;
|
|
77
|
+
/**
|
|
78
|
+
* Build the behavioral instructions prompt for the memory system.
|
|
79
|
+
*/
|
|
80
|
+
getMemoryInstructions(): string;
|
|
81
|
+
/**
|
|
82
|
+
* Build the full memory context for injection (MEMORY.md + relevant memories).
|
|
83
|
+
*/
|
|
84
|
+
buildFullContext(query: string, signal?: AbortSignal, threadId?: string): Promise<string>;
|
|
85
|
+
/**
|
|
86
|
+
* Check if any memory files were created or modified since the given timestamp.
|
|
87
|
+
* When threadId is provided, checks only the thread directory.
|
|
88
|
+
*/
|
|
89
|
+
hasWritesSince(sinceMs: number, threadId?: string): Promise<boolean>;
|
|
90
|
+
private addToIndex;
|
|
91
|
+
private removeFromIndex;
|
|
92
|
+
private withWriteLock;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Truncate MEMORY.md content to limits: 200 lines, 25KB.
|
|
96
|
+
*/
|
|
97
|
+
export declare function truncateEntrypointContent(content: string): string;
|
|
98
|
+
//# sourceMappingURL=file-memory-system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-memory-system.d.ts","sourceRoot":"","sources":["../../src/memory/file-memory-system.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAanF,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAID,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAS;IACzC,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM;IAO9E,uDAAuD;IACjD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,8CAA8C;IAC9C,YAAY,IAAI,MAAM;IAItB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAKlB,wCAAwC;YAC1B,eAAe;IAK7B;;;OAGG;IACG,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB5E;;;OAGG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAyBjF;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAazE;;OAEG;IACG,YAAY,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAepF;;;OAGG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,EACpB,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,EACtC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,EAAE,CAAC;IAgCxB;;;OAGG;IACG,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB5D;;OAEG;IACH,qBAAqB,IAAI,MAAM;IAI/B;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB/F;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAiB5D,UAAU;YAiBV,eAAe;YAYf,aAAa;CAW5B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoBjE"}
|