downcity 1.0.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/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/Hero.d.ts +64 -0
- package/dist/Hero.d.ts.map +1 -0
- package/dist/Hero.js +155 -0
- package/dist/Hero.js.map +1 -0
- package/dist/Knowledge.d.ts +139 -0
- package/dist/Knowledge.d.ts.map +1 -0
- package/dist/Knowledge.js +431 -0
- package/dist/Knowledge.js.map +1 -0
- package/dist/Memory.d.ts +61 -0
- package/dist/Memory.d.ts.map +1 -0
- package/dist/Memory.js +148 -0
- package/dist/Memory.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) [year] [fullname]
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# 🏰 DownCity
|
|
2
|
+
|
|
3
|
+
> _"在数字世界的城市中,每个 AI 都是一位英雄"_
|
|
4
|
+
|
|
5
|
+
一个基于游戏化思维设计的 AI 智能体框架,让 AI 开发变得像 RPG 冒险一样有趣!
|
|
6
|
+
|
|
7
|
+
## 🚀 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install downcity
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 🎮 快速开始
|
|
14
|
+
|
|
15
|
+
### 创造你的第一个英雄
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { Hero, Knowledge, Model } from "downcity";
|
|
19
|
+
|
|
20
|
+
const hero = Hero.create();
|
|
21
|
+
|
|
22
|
+
// system prompt
|
|
23
|
+
hero.avatar("我是一个新的英雄");
|
|
24
|
+
// 设置ai-sdk的tool
|
|
25
|
+
hero.model();
|
|
26
|
+
// 学习 ai-sdk的tool
|
|
27
|
+
hero.study();
|
|
28
|
+
|
|
29
|
+
// 准备好: 直接暴露一个端口
|
|
30
|
+
await hero.ready(5000);
|
|
31
|
+
|
|
32
|
+
const memory = new Memory();
|
|
33
|
+
hero.memory(memory);
|
|
34
|
+
hero.session(memory.lastSession());
|
|
35
|
+
const res = await hero.chat("你好");
|
|
36
|
+
console.log(res);
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { Knowledge, Memory } from "downcity";
|
|
41
|
+
|
|
42
|
+
const knowledge = Knowledge.create();
|
|
43
|
+
|
|
44
|
+
const tools = knowledge.tool();
|
|
45
|
+
|
|
46
|
+
const memory = new Memory();
|
|
47
|
+
|
|
48
|
+
hero.memory(memory);
|
|
49
|
+
|
|
50
|
+
// ai-sdk 的tool
|
|
51
|
+
const tool = createTool({});
|
|
52
|
+
|
|
53
|
+
hero.study(tools);
|
|
54
|
+
hero.study(tool);
|
|
55
|
+
|
|
56
|
+
const hero2 = new Hero();
|
|
57
|
+
hero2.memory(memory);
|
|
58
|
+
hero2.session(memory.newSession());
|
|
59
|
+
```
|
package/dist/Hero.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { LanguageModel, Tool } from "ai";
|
|
2
|
+
import { Memory } from "./Memory.js";
|
|
3
|
+
export interface Session {
|
|
4
|
+
id: string;
|
|
5
|
+
messages: Array<{
|
|
6
|
+
role: "user" | "assistant" | "system";
|
|
7
|
+
content: string;
|
|
8
|
+
timestamp: Date;
|
|
9
|
+
}>;
|
|
10
|
+
createdAt: Date;
|
|
11
|
+
updatedAt: Date;
|
|
12
|
+
}
|
|
13
|
+
export declare class Hero {
|
|
14
|
+
private _model;
|
|
15
|
+
private _system;
|
|
16
|
+
private _tools;
|
|
17
|
+
private _memory?;
|
|
18
|
+
private _currentSession?;
|
|
19
|
+
private constructor();
|
|
20
|
+
/**
|
|
21
|
+
* 创建一个新的英雄实例
|
|
22
|
+
*/
|
|
23
|
+
static create(): Hero;
|
|
24
|
+
/**
|
|
25
|
+
* 设置英雄的身份和系统提示词
|
|
26
|
+
*/
|
|
27
|
+
avatar(prompt: string): Hero;
|
|
28
|
+
/**
|
|
29
|
+
* 设置语言模型
|
|
30
|
+
*/
|
|
31
|
+
model(model: LanguageModel): Hero;
|
|
32
|
+
/**
|
|
33
|
+
* 学习工具
|
|
34
|
+
*/
|
|
35
|
+
study(tools: Record<string, Tool>): Hero;
|
|
36
|
+
/**
|
|
37
|
+
* 设置记忆系统
|
|
38
|
+
*/
|
|
39
|
+
memory(memory: Memory): Hero;
|
|
40
|
+
/**
|
|
41
|
+
* 设置当前会话
|
|
42
|
+
*/
|
|
43
|
+
session(session: Session): Hero;
|
|
44
|
+
/**
|
|
45
|
+
* 与英雄对话
|
|
46
|
+
*/
|
|
47
|
+
chat(message: string): Promise<string>;
|
|
48
|
+
/**
|
|
49
|
+
* 生成JSON对象
|
|
50
|
+
*/
|
|
51
|
+
json<T>(prompt: string, schema: any): Promise<T>;
|
|
52
|
+
/**
|
|
53
|
+
* 基于特定标准进行判断
|
|
54
|
+
*/
|
|
55
|
+
check(content: string, criteria: string): Promise<boolean>;
|
|
56
|
+
/**
|
|
57
|
+
* 启动服务器
|
|
58
|
+
*/
|
|
59
|
+
ready(port?: number): Promise<void>;
|
|
60
|
+
get systemPrompt(): string;
|
|
61
|
+
get tools(): string[];
|
|
62
|
+
get currentSession(): Session | undefined;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=Hero.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Hero.d.ts","sourceRoot":"","sources":["../src/Hero.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAgC,IAAI,EAAe,MAAM,IAAI,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;QACtC,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,IAAI,CAAC;KACjB,CAAC,CAAC;IACH,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,qBAAa,IAAI;IACf,OAAO,CAAC,MAAM,CAAgD;IAC9D,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,eAAe,CAAC,CAAU;IAElC,OAAO;IAEP;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,IAAI;IAIrB;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK5B;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAKjC;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI;IAKxC;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK5B;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAK/B;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0C5C;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAoBtD;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBhE;;OAEG;IACG,KAAK,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/C,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,KAAK,IAAI,MAAM,EAAE,CAEpB;IAED,IAAI,cAAc,IAAI,OAAO,GAAG,SAAS,CAExC;CACF"}
|
package/dist/Hero.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { generateText, generateObject, stepCountIs } from "ai";
|
|
2
|
+
import { createOpenAI } from "@ai-sdk/openai";
|
|
3
|
+
export class Hero {
|
|
4
|
+
_model = createOpenAI().chat("gpt-4o");
|
|
5
|
+
_system = "你是一个智能助手";
|
|
6
|
+
_tools = {};
|
|
7
|
+
_memory;
|
|
8
|
+
_currentSession;
|
|
9
|
+
constructor() { }
|
|
10
|
+
/**
|
|
11
|
+
* 创建一个新的英雄实例
|
|
12
|
+
*/
|
|
13
|
+
static create() {
|
|
14
|
+
return new Hero();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 设置英雄的身份和系统提示词
|
|
18
|
+
*/
|
|
19
|
+
avatar(prompt) {
|
|
20
|
+
this._system = prompt;
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 设置语言模型
|
|
25
|
+
*/
|
|
26
|
+
model(model) {
|
|
27
|
+
this._model = model;
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 学习工具
|
|
32
|
+
*/
|
|
33
|
+
study(tools) {
|
|
34
|
+
this._tools = { ...this._tools, ...tools };
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 设置记忆系统
|
|
39
|
+
*/
|
|
40
|
+
memory(memory) {
|
|
41
|
+
this._memory = memory;
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 设置当前会话
|
|
46
|
+
*/
|
|
47
|
+
session(session) {
|
|
48
|
+
this._currentSession = session;
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 与英雄对话
|
|
53
|
+
*/
|
|
54
|
+
async chat(message) {
|
|
55
|
+
if (!this._model) {
|
|
56
|
+
throw new Error("请先设置语言模型");
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
// 添加消息到当前会话
|
|
60
|
+
if (this._currentSession) {
|
|
61
|
+
this._currentSession.messages.push({
|
|
62
|
+
role: "user",
|
|
63
|
+
content: message,
|
|
64
|
+
timestamp: new Date(),
|
|
65
|
+
});
|
|
66
|
+
this._currentSession.updatedAt = new Date();
|
|
67
|
+
}
|
|
68
|
+
// 调用AI生成回复,启用多步调用来自动处理工具调用
|
|
69
|
+
const result = await generateText({
|
|
70
|
+
model: this._model,
|
|
71
|
+
system: this._system,
|
|
72
|
+
prompt: message,
|
|
73
|
+
tools: this._tools,
|
|
74
|
+
stopWhen: stepCountIs(5), // 允许最多5步的工具调用
|
|
75
|
+
});
|
|
76
|
+
// 添加回复到当前会话
|
|
77
|
+
if (this._currentSession) {
|
|
78
|
+
this._currentSession.messages.push({
|
|
79
|
+
role: "assistant",
|
|
80
|
+
content: result.text,
|
|
81
|
+
timestamp: new Date(),
|
|
82
|
+
});
|
|
83
|
+
this._currentSession.updatedAt = new Date();
|
|
84
|
+
}
|
|
85
|
+
return result.text;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error("Hero chat error:", error);
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 生成JSON对象
|
|
94
|
+
*/
|
|
95
|
+
async json(prompt, schema) {
|
|
96
|
+
if (!this._model) {
|
|
97
|
+
throw new Error("请先设置语言模型");
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const { object } = await generateObject({
|
|
101
|
+
model: this._model,
|
|
102
|
+
system: this._system,
|
|
103
|
+
prompt,
|
|
104
|
+
schema,
|
|
105
|
+
});
|
|
106
|
+
return object;
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
console.error("Hero json error:", error);
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 基于特定标准进行判断
|
|
115
|
+
*/
|
|
116
|
+
async check(content, criteria) {
|
|
117
|
+
if (!this._model) {
|
|
118
|
+
throw new Error("请先设置语言模型");
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
const prompt = `请根据以下标准判断内容是否符合要求:\n\n标准:${criteria}\n\n内容:${content}\n\n请回答:符合 或 不符合`;
|
|
122
|
+
const { text } = await generateText({
|
|
123
|
+
model: this._model,
|
|
124
|
+
system: "你是一个严格的内容审核员,只能回答'符合'或'不符合'。",
|
|
125
|
+
prompt,
|
|
126
|
+
});
|
|
127
|
+
return text.includes("符合") && !text.includes("不符合");
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.error("Hero check error:", error);
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 启动服务器
|
|
136
|
+
*/
|
|
137
|
+
async ready(port = 3000) {
|
|
138
|
+
// TODO: 实现HTTP服务器
|
|
139
|
+
console.log(`🏰 DownCity Hero is ready on port ${port}`);
|
|
140
|
+
console.log(`🦸 Avatar: ${this._system}`);
|
|
141
|
+
console.log(`🧠 Model: ${this._model ? "Configured" : "Not configured"}`);
|
|
142
|
+
console.log(`🛠️ Tools: ${this._tools.length} tools loaded`);
|
|
143
|
+
}
|
|
144
|
+
// Getters for debugging and inspection
|
|
145
|
+
get systemPrompt() {
|
|
146
|
+
return this._system;
|
|
147
|
+
}
|
|
148
|
+
get tools() {
|
|
149
|
+
return Object.keys(this._tools);
|
|
150
|
+
}
|
|
151
|
+
get currentSession() {
|
|
152
|
+
return this._currentSession;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=Hero.js.map
|
package/dist/Hero.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Hero.js","sourceRoot":"","sources":["../src/Hero.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { Tool } from "ai";
|
|
2
|
+
export interface VectorModelConfig {
|
|
3
|
+
model: any;
|
|
4
|
+
dimensions?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface ChromaConfig {
|
|
7
|
+
url?: string;
|
|
8
|
+
collection?: string;
|
|
9
|
+
persistPath?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface KnowledgeOptions {
|
|
12
|
+
autoLoad?: boolean;
|
|
13
|
+
categories?: string[];
|
|
14
|
+
vectorDimension?: number;
|
|
15
|
+
similarityThreshold?: number;
|
|
16
|
+
vectorModel?: VectorModelConfig;
|
|
17
|
+
chroma?: ChromaConfig;
|
|
18
|
+
localFile?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface KnowledgeItem {
|
|
21
|
+
id: string;
|
|
22
|
+
title: string;
|
|
23
|
+
content: string;
|
|
24
|
+
category: string;
|
|
25
|
+
tags: string[];
|
|
26
|
+
vector?: number[];
|
|
27
|
+
createdAt: Date;
|
|
28
|
+
updatedAt: Date;
|
|
29
|
+
}
|
|
30
|
+
export declare class Knowledge {
|
|
31
|
+
private knowledgeBase;
|
|
32
|
+
private categories;
|
|
33
|
+
private options;
|
|
34
|
+
private chromaClient?;
|
|
35
|
+
private collection?;
|
|
36
|
+
private embeddingModel?;
|
|
37
|
+
private embeddingFunction?;
|
|
38
|
+
constructor(options?: KnowledgeOptions);
|
|
39
|
+
/**
|
|
40
|
+
* 创建Knowledge实例
|
|
41
|
+
*/
|
|
42
|
+
static create(options?: KnowledgeOptions): Knowledge;
|
|
43
|
+
/**
|
|
44
|
+
* 初始化向量数据库
|
|
45
|
+
*/
|
|
46
|
+
private initializeVectorDB;
|
|
47
|
+
/**
|
|
48
|
+
* 配置向量模型
|
|
49
|
+
*/
|
|
50
|
+
model(config: VectorModelConfig): Knowledge;
|
|
51
|
+
/**
|
|
52
|
+
* 保存数据到本地文件
|
|
53
|
+
*/
|
|
54
|
+
private saveToFile;
|
|
55
|
+
/**
|
|
56
|
+
* 从本地文件加载数据
|
|
57
|
+
*/
|
|
58
|
+
private loadFromFile;
|
|
59
|
+
/**
|
|
60
|
+
* 获取知识库操作工具
|
|
61
|
+
* 将知识库的操作方法包装成工具供Hero调用
|
|
62
|
+
*/
|
|
63
|
+
tools(): Record<string, Tool>;
|
|
64
|
+
/**
|
|
65
|
+
* 添加知识条目
|
|
66
|
+
*/
|
|
67
|
+
addKnowledge(item: Omit<KnowledgeItem, "id" | "createdAt" | "updatedAt">): Promise<KnowledgeItem>;
|
|
68
|
+
/**
|
|
69
|
+
* 更新知识条目
|
|
70
|
+
*/
|
|
71
|
+
updateKnowledge(id: string, updates: Partial<Omit<KnowledgeItem, "id" | "createdAt">>): KnowledgeItem | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* 获取知识条目
|
|
74
|
+
*/
|
|
75
|
+
getKnowledge(id: string): KnowledgeItem | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* 搜索知识库(支持向量搜索和文本匹配)
|
|
78
|
+
*/
|
|
79
|
+
searchKnowledge(query: string, category?: string, useVector?: boolean): Promise<KnowledgeItem[]>;
|
|
80
|
+
/**
|
|
81
|
+
* 文本搜索知识库
|
|
82
|
+
*/
|
|
83
|
+
private textSearchKnowledge;
|
|
84
|
+
/**
|
|
85
|
+
* 向量相似度搜索
|
|
86
|
+
*/
|
|
87
|
+
searchByVector(queryVector: number[], category?: string, limit?: number): Array<KnowledgeItem & {
|
|
88
|
+
similarity: number;
|
|
89
|
+
}>;
|
|
90
|
+
/**
|
|
91
|
+
* 计算余弦相似度
|
|
92
|
+
*/
|
|
93
|
+
private cosineSimilarity;
|
|
94
|
+
/**
|
|
95
|
+
* 为知识条目生成向量
|
|
96
|
+
*/
|
|
97
|
+
generateEmbedding(text: string): Promise<number[]>;
|
|
98
|
+
/**
|
|
99
|
+
* 添加知识条目并生成向量
|
|
100
|
+
*/
|
|
101
|
+
addKnowledgeWithVector(item: Omit<KnowledgeItem, "id" | "createdAt" | "updatedAt" | "vector">): Promise<KnowledgeItem>;
|
|
102
|
+
/**
|
|
103
|
+
* 根据分类获取知识
|
|
104
|
+
*/
|
|
105
|
+
getKnowledgeByCategory(category: string): KnowledgeItem[];
|
|
106
|
+
/**
|
|
107
|
+
* 获取所有分类
|
|
108
|
+
*/
|
|
109
|
+
getCategories(): string[];
|
|
110
|
+
/**
|
|
111
|
+
* 删除知识条目
|
|
112
|
+
*/
|
|
113
|
+
removeKnowledge(id: string): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* 清空知识库
|
|
116
|
+
*/
|
|
117
|
+
clearKnowledge(): void;
|
|
118
|
+
/**
|
|
119
|
+
* 获取统计信息
|
|
120
|
+
*/
|
|
121
|
+
getStats(): {
|
|
122
|
+
totalKnowledge: number;
|
|
123
|
+
totalCategories: number;
|
|
124
|
+
knowledgeByCategory: Record<string, number>;
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* 导出数据
|
|
128
|
+
*/
|
|
129
|
+
export(): any;
|
|
130
|
+
/**
|
|
131
|
+
* 导入数据
|
|
132
|
+
*/
|
|
133
|
+
import(data: any): void;
|
|
134
|
+
/**
|
|
135
|
+
* 生成唯一ID
|
|
136
|
+
*/
|
|
137
|
+
private generateId;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=Knowledge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Knowledge.d.ts","sourceRoot":"","sources":["../src/Knowledge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
import { embed, tool } from "ai";
|
|
2
|
+
import z from "zod";
|
|
3
|
+
import * as fs from "fs/promises";
|
|
4
|
+
export class Knowledge {
|
|
5
|
+
knowledgeBase = new Map();
|
|
6
|
+
categories = new Set();
|
|
7
|
+
options;
|
|
8
|
+
chromaClient;
|
|
9
|
+
collection;
|
|
10
|
+
embeddingModel; // ai-sdk模型实例
|
|
11
|
+
embeddingFunction;
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
this.options = {
|
|
14
|
+
autoLoad: true,
|
|
15
|
+
categories: ["general", "programming", "api", "documentation"],
|
|
16
|
+
vectorDimension: 1536, // OpenAI embedding dimension
|
|
17
|
+
similarityThreshold: 0.7,
|
|
18
|
+
chroma: {
|
|
19
|
+
collection: "downcity_knowledge",
|
|
20
|
+
persistPath: "./chroma_db",
|
|
21
|
+
},
|
|
22
|
+
localFile: "./knowledge.json",
|
|
23
|
+
...options,
|
|
24
|
+
};
|
|
25
|
+
// 初始化默认分类
|
|
26
|
+
if (this.options.categories) {
|
|
27
|
+
this.options.categories.forEach((cat) => this.categories.add(cat));
|
|
28
|
+
}
|
|
29
|
+
// 初始化向量数据库和加载本地数据
|
|
30
|
+
this.initializeVectorDB();
|
|
31
|
+
if (this.options.autoLoad) {
|
|
32
|
+
this.loadFromFile();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 创建Knowledge实例
|
|
37
|
+
*/
|
|
38
|
+
static create(options) {
|
|
39
|
+
return new Knowledge(options);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 初始化向量数据库
|
|
43
|
+
*/
|
|
44
|
+
async initializeVectorDB() {
|
|
45
|
+
try {
|
|
46
|
+
// 动态导入chromadb
|
|
47
|
+
const { ChromaClient } = await import("chromadb");
|
|
48
|
+
if (this.options.chroma?.persistPath) {
|
|
49
|
+
this.chromaClient = new ChromaClient({
|
|
50
|
+
path: this.options.chroma.persistPath,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
this.chromaClient = new ChromaClient();
|
|
55
|
+
}
|
|
56
|
+
// 获取或创建集合
|
|
57
|
+
const collectionName = this.options.chroma?.collection || "downcity_knowledge";
|
|
58
|
+
try {
|
|
59
|
+
const getParams = { name: collectionName };
|
|
60
|
+
if (this.embeddingFunction) {
|
|
61
|
+
getParams.embeddingFunction = this.embeddingFunction;
|
|
62
|
+
}
|
|
63
|
+
this.collection = await this.chromaClient.getCollection(getParams);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// 集合不存在,创建新集合
|
|
67
|
+
const createParams = {
|
|
68
|
+
name: collectionName,
|
|
69
|
+
metadata: { description: "DownCity Knowledge Base" },
|
|
70
|
+
};
|
|
71
|
+
if (this.embeddingFunction) {
|
|
72
|
+
createParams.embeddingFunction = this.embeddingFunction;
|
|
73
|
+
}
|
|
74
|
+
this.collection = await this.chromaClient.createCollection(createParams);
|
|
75
|
+
}
|
|
76
|
+
// 初始化embedding模型
|
|
77
|
+
if (this.options.vectorModel?.model) {
|
|
78
|
+
this.embeddingModel = this.options.vectorModel.model;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
console.warn("Failed to initialize vector database:", error);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 配置向量模型
|
|
87
|
+
*/
|
|
88
|
+
model(config) {
|
|
89
|
+
this.options.vectorModel = { ...this.options.vectorModel, ...config };
|
|
90
|
+
// 设置embedding模型
|
|
91
|
+
if (config.model) {
|
|
92
|
+
this.embeddingModel = config.model;
|
|
93
|
+
}
|
|
94
|
+
return this;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 保存数据到本地文件
|
|
98
|
+
*/
|
|
99
|
+
async saveToFile() {
|
|
100
|
+
if (!this.options.localFile)
|
|
101
|
+
return;
|
|
102
|
+
try {
|
|
103
|
+
const data = this.export();
|
|
104
|
+
await fs.writeFile(this.options.localFile, JSON.stringify(data, null, 2));
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.warn("Failed to save to local file:", error);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 从本地文件加载数据
|
|
112
|
+
*/
|
|
113
|
+
async loadFromFile() {
|
|
114
|
+
if (!this.options.localFile)
|
|
115
|
+
return;
|
|
116
|
+
try {
|
|
117
|
+
const data = await fs.readFile(this.options.localFile, "utf-8");
|
|
118
|
+
this.import(JSON.parse(data));
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
// 文件不存在时忽略
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 获取知识库操作工具
|
|
126
|
+
* 将知识库的操作方法包装成工具供Hero调用
|
|
127
|
+
*/
|
|
128
|
+
tools() {
|
|
129
|
+
return {
|
|
130
|
+
search_knowledge: tool({
|
|
131
|
+
description: "在知识库中搜索相关信息",
|
|
132
|
+
inputSchema: z.object({
|
|
133
|
+
query: z.string().describe("The search query"),
|
|
134
|
+
category: z.string().optional().describe("The category to filter"),
|
|
135
|
+
}),
|
|
136
|
+
execute: async (params) => {
|
|
137
|
+
const results = await this.searchKnowledge(params.query, params.category);
|
|
138
|
+
return {
|
|
139
|
+
results: results.slice(0, 5), // 限制返回前5个结果
|
|
140
|
+
total: results.length,
|
|
141
|
+
};
|
|
142
|
+
},
|
|
143
|
+
}),
|
|
144
|
+
getKnowledgeCategories: tool({
|
|
145
|
+
description: "获取知识库中所有可用的分类",
|
|
146
|
+
inputSchema: z.object({}),
|
|
147
|
+
execute: async () => {
|
|
148
|
+
return {
|
|
149
|
+
categories: this.getCategories(),
|
|
150
|
+
};
|
|
151
|
+
},
|
|
152
|
+
}),
|
|
153
|
+
get_knowledge_stats: tool({
|
|
154
|
+
description: "获取知识库统计信息",
|
|
155
|
+
inputSchema: z.object({}),
|
|
156
|
+
execute: async () => {
|
|
157
|
+
return this.getStats();
|
|
158
|
+
},
|
|
159
|
+
}),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 添加知识条目
|
|
164
|
+
*/
|
|
165
|
+
async addKnowledge(item) {
|
|
166
|
+
const id = this.generateId();
|
|
167
|
+
const now = new Date();
|
|
168
|
+
const knowledgeItem = {
|
|
169
|
+
id,
|
|
170
|
+
...item,
|
|
171
|
+
createdAt: now,
|
|
172
|
+
updatedAt: now,
|
|
173
|
+
};
|
|
174
|
+
// 生成向量
|
|
175
|
+
if (!knowledgeItem.vector) {
|
|
176
|
+
knowledgeItem.vector = await this.generateEmbedding(`${item.title} ${item.content}`);
|
|
177
|
+
}
|
|
178
|
+
// 存储到本地缓存
|
|
179
|
+
this.knowledgeBase.set(id, knowledgeItem);
|
|
180
|
+
this.categories.add(item.category);
|
|
181
|
+
// 存储到Chroma数据库
|
|
182
|
+
if (this.collection) {
|
|
183
|
+
try {
|
|
184
|
+
await this.collection.add({
|
|
185
|
+
ids: [id],
|
|
186
|
+
embeddings: [knowledgeItem.vector],
|
|
187
|
+
metadatas: [
|
|
188
|
+
{
|
|
189
|
+
title: item.title,
|
|
190
|
+
category: item.category,
|
|
191
|
+
tags: item.tags.join(","),
|
|
192
|
+
createdAt: now.toISOString(),
|
|
193
|
+
updatedAt: now.toISOString(),
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
documents: [item.content],
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
console.warn("Failed to add to Chroma database:", error);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// 保存到本地文件
|
|
204
|
+
await this.saveToFile();
|
|
205
|
+
return knowledgeItem;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* 更新知识条目
|
|
209
|
+
*/
|
|
210
|
+
updateKnowledge(id, updates) {
|
|
211
|
+
const existing = this.knowledgeBase.get(id);
|
|
212
|
+
if (!existing)
|
|
213
|
+
return undefined;
|
|
214
|
+
const updated = {
|
|
215
|
+
...existing,
|
|
216
|
+
...updates,
|
|
217
|
+
updatedAt: new Date(),
|
|
218
|
+
};
|
|
219
|
+
this.knowledgeBase.set(id, updated);
|
|
220
|
+
if (updates.category) {
|
|
221
|
+
this.categories.add(updates.category);
|
|
222
|
+
}
|
|
223
|
+
return updated;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* 获取知识条目
|
|
227
|
+
*/
|
|
228
|
+
getKnowledge(id) {
|
|
229
|
+
return this.knowledgeBase.get(id);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* 搜索知识库(支持向量搜索和文本匹配)
|
|
233
|
+
*/
|
|
234
|
+
async searchKnowledge(query, category, useVector = true) {
|
|
235
|
+
// 优先使用向量搜索
|
|
236
|
+
if (useVector && this.collection) {
|
|
237
|
+
try {
|
|
238
|
+
const queryVector = await this.generateEmbedding(query);
|
|
239
|
+
const chromaResults = await this.collection.query({
|
|
240
|
+
queryEmbeddings: [queryVector],
|
|
241
|
+
nResults: 10,
|
|
242
|
+
where: category ? { category } : undefined,
|
|
243
|
+
});
|
|
244
|
+
// 将Chroma结果转换为KnowledgeItem
|
|
245
|
+
const results = [];
|
|
246
|
+
if (chromaResults.ids && chromaResults.ids[0]) {
|
|
247
|
+
for (let i = 0; i < chromaResults.ids[0].length; i++) {
|
|
248
|
+
const id = chromaResults.ids[0][i];
|
|
249
|
+
const item = this.knowledgeBase.get(id);
|
|
250
|
+
if (item) {
|
|
251
|
+
results.push(item);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (results.length > 0) {
|
|
256
|
+
return results;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
console.warn("Vector search failed, falling back to text search:", error);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// 降级到文本搜索
|
|
264
|
+
return this.textSearchKnowledge(query, category);
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* 文本搜索知识库
|
|
268
|
+
*/
|
|
269
|
+
textSearchKnowledge(query, category) {
|
|
270
|
+
const results = [];
|
|
271
|
+
const lowerQuery = query.toLowerCase();
|
|
272
|
+
for (const item of this.knowledgeBase.values()) {
|
|
273
|
+
// 分类过滤
|
|
274
|
+
if (category && item.category !== category)
|
|
275
|
+
continue;
|
|
276
|
+
// 文本匹配
|
|
277
|
+
const matchesTitle = item.title.toLowerCase().includes(lowerQuery);
|
|
278
|
+
const matchesContent = item.content.toLowerCase().includes(lowerQuery);
|
|
279
|
+
const matchesTags = item.tags.some((tag) => tag.toLowerCase().includes(lowerQuery));
|
|
280
|
+
if (matchesTitle || matchesContent || matchesTags) {
|
|
281
|
+
results.push(item);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// 按更新时间排序
|
|
285
|
+
return results.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* 向量相似度搜索
|
|
289
|
+
*/
|
|
290
|
+
searchByVector(queryVector, category, limit = 10) {
|
|
291
|
+
const results = [];
|
|
292
|
+
for (const item of this.knowledgeBase.values()) {
|
|
293
|
+
// 分类过滤
|
|
294
|
+
if (category && item.category !== category)
|
|
295
|
+
continue;
|
|
296
|
+
// 跳过没有向量的条目
|
|
297
|
+
if (!item.vector)
|
|
298
|
+
continue;
|
|
299
|
+
// 计算余弦相似度
|
|
300
|
+
const similarity = this.cosineSimilarity(queryVector, item.vector);
|
|
301
|
+
// 只保留超过阈值的结果
|
|
302
|
+
if (similarity >= (this.options.similarityThreshold || 0.7)) {
|
|
303
|
+
results.push({ ...item, similarity });
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// 按相似度排序并限制结果数量
|
|
307
|
+
return results.sort((a, b) => b.similarity - a.similarity).slice(0, limit);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* 计算余弦相似度
|
|
311
|
+
*/
|
|
312
|
+
cosineSimilarity(vecA, vecB) {
|
|
313
|
+
if (vecA.length !== vecB.length) {
|
|
314
|
+
throw new Error("向量维度不匹配");
|
|
315
|
+
}
|
|
316
|
+
let dotProduct = 0;
|
|
317
|
+
let normA = 0;
|
|
318
|
+
let normB = 0;
|
|
319
|
+
for (let i = 0; i < vecA.length; i++) {
|
|
320
|
+
dotProduct += vecA[i] * vecB[i];
|
|
321
|
+
normA += vecA[i] * vecA[i];
|
|
322
|
+
normB += vecB[i] * vecB[i];
|
|
323
|
+
}
|
|
324
|
+
normA = Math.sqrt(normA);
|
|
325
|
+
normB = Math.sqrt(normB);
|
|
326
|
+
if (normA === 0 || normB === 0) {
|
|
327
|
+
return 0;
|
|
328
|
+
}
|
|
329
|
+
return dotProduct / (normA * normB);
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* 为知识条目生成向量
|
|
333
|
+
*/
|
|
334
|
+
async generateEmbedding(text) {
|
|
335
|
+
if (this.embeddingModel) {
|
|
336
|
+
const { embedding } = await embed({
|
|
337
|
+
model: this.embeddingModel,
|
|
338
|
+
value: text,
|
|
339
|
+
});
|
|
340
|
+
return embedding;
|
|
341
|
+
}
|
|
342
|
+
throw new Error("Embedding model not set");
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* 添加知识条目并生成向量
|
|
346
|
+
*/
|
|
347
|
+
async addKnowledgeWithVector(item) {
|
|
348
|
+
const vector = await this.generateEmbedding(`${item.title} ${item.content}`);
|
|
349
|
+
return this.addKnowledge({ ...item, vector });
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* 根据分类获取知识
|
|
353
|
+
*/
|
|
354
|
+
getKnowledgeByCategory(category) {
|
|
355
|
+
return Array.from(this.knowledgeBase.values())
|
|
356
|
+
.filter((item) => item.category === category)
|
|
357
|
+
.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* 获取所有分类
|
|
361
|
+
*/
|
|
362
|
+
getCategories() {
|
|
363
|
+
return Array.from(this.categories);
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* 删除知识条目
|
|
367
|
+
*/
|
|
368
|
+
removeKnowledge(id) {
|
|
369
|
+
return this.knowledgeBase.delete(id);
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* 清空知识库
|
|
373
|
+
*/
|
|
374
|
+
clearKnowledge() {
|
|
375
|
+
this.knowledgeBase.clear();
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* 获取统计信息
|
|
379
|
+
*/
|
|
380
|
+
getStats() {
|
|
381
|
+
const knowledgeByCategory = {};
|
|
382
|
+
for (const item of this.knowledgeBase.values()) {
|
|
383
|
+
knowledgeByCategory[item.category] =
|
|
384
|
+
(knowledgeByCategory[item.category] || 0) + 1;
|
|
385
|
+
}
|
|
386
|
+
return {
|
|
387
|
+
totalKnowledge: this.knowledgeBase.size,
|
|
388
|
+
totalCategories: this.categories.size,
|
|
389
|
+
knowledgeByCategory,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* 导出数据
|
|
394
|
+
*/
|
|
395
|
+
export() {
|
|
396
|
+
return {
|
|
397
|
+
knowledgeBase: Array.from(this.knowledgeBase.entries()),
|
|
398
|
+
categories: Array.from(this.categories),
|
|
399
|
+
exportedAt: new Date().toISOString(),
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* 导入数据
|
|
404
|
+
*/
|
|
405
|
+
import(data) {
|
|
406
|
+
if (data.knowledgeBase && Array.isArray(data.knowledgeBase)) {
|
|
407
|
+
this.knowledgeBase.clear();
|
|
408
|
+
for (const [id, item] of data.knowledgeBase) {
|
|
409
|
+
// 确保日期对象正确转换
|
|
410
|
+
if (item.createdAt && typeof item.createdAt === "string") {
|
|
411
|
+
item.createdAt = new Date(item.createdAt);
|
|
412
|
+
}
|
|
413
|
+
if (item.updatedAt && typeof item.updatedAt === "string") {
|
|
414
|
+
item.updatedAt = new Date(item.updatedAt);
|
|
415
|
+
}
|
|
416
|
+
this.knowledgeBase.set(id, item);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
if (data.categories && Array.isArray(data.categories)) {
|
|
420
|
+
this.categories.clear();
|
|
421
|
+
data.categories.forEach((cat) => this.categories.add(cat));
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* 生成唯一ID
|
|
426
|
+
*/
|
|
427
|
+
generateId() {
|
|
428
|
+
return `knowledge_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=Knowledge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Knowledge.js","sourceRoot":"","sources":["../src/Knowledge.ts"],"names":[],"mappings":"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"}
|
package/dist/Memory.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Session } from "./Hero.js";
|
|
2
|
+
export interface MemoryOptions {
|
|
3
|
+
maxSessions?: number;
|
|
4
|
+
persistToFile?: boolean;
|
|
5
|
+
filePath?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class Memory {
|
|
8
|
+
private sessions;
|
|
9
|
+
private lastSessionId?;
|
|
10
|
+
private options;
|
|
11
|
+
constructor(options?: MemoryOptions);
|
|
12
|
+
/**
|
|
13
|
+
* 创建新的会话
|
|
14
|
+
*/
|
|
15
|
+
newSession(id?: string): Session;
|
|
16
|
+
/**
|
|
17
|
+
* 获取最后一个会话,如果不存在则创建新会话
|
|
18
|
+
*/
|
|
19
|
+
lastSession(): Session;
|
|
20
|
+
/**
|
|
21
|
+
* 根据ID获取会话
|
|
22
|
+
*/
|
|
23
|
+
getSession(id: string): Session | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* 获取所有会话
|
|
26
|
+
*/
|
|
27
|
+
getAllSessions(): Session[];
|
|
28
|
+
/**
|
|
29
|
+
* 删除会话
|
|
30
|
+
*/
|
|
31
|
+
deleteSession(id: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* 清空所有会话
|
|
34
|
+
*/
|
|
35
|
+
clear(): void;
|
|
36
|
+
/**
|
|
37
|
+
* 获取会话统计信息
|
|
38
|
+
*/
|
|
39
|
+
getStats(): {
|
|
40
|
+
totalSessions: number;
|
|
41
|
+
totalMessages: number;
|
|
42
|
+
lastActivity: Date | null;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* 生成唯一的会话ID
|
|
46
|
+
*/
|
|
47
|
+
private generateSessionId;
|
|
48
|
+
/**
|
|
49
|
+
* 清理旧会话
|
|
50
|
+
*/
|
|
51
|
+
private cleanupOldSessions;
|
|
52
|
+
/**
|
|
53
|
+
* 导出会话数据
|
|
54
|
+
*/
|
|
55
|
+
export(): any;
|
|
56
|
+
/**
|
|
57
|
+
* 导入会话数据
|
|
58
|
+
*/
|
|
59
|
+
import(data: any): void;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=Memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Memory.d.ts","sourceRoot":"","sources":["../src/Memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,OAAO,CAAgB;gBAEnB,OAAO,GAAE,aAAkB;IAQvC;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;IAoBhC;;OAEG;IACH,WAAW,IAAI,OAAO;IAOtB;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C;;OAEG;IACH,cAAc,IAAI,OAAO,EAAE;IAK3B;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAUlC;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,QAAQ,IAAI;QACV,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;KAC3B;IAmBD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,MAAM,IAAI,GAAG;IAQb;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;CAwBxB"}
|
package/dist/Memory.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
export class Memory {
|
|
2
|
+
sessions = new Map();
|
|
3
|
+
lastSessionId;
|
|
4
|
+
options;
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
this.options = {
|
|
7
|
+
maxSessions: 100,
|
|
8
|
+
persistToFile: false,
|
|
9
|
+
...options
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 创建新的会话
|
|
14
|
+
*/
|
|
15
|
+
newSession(id) {
|
|
16
|
+
const sessionId = id || this.generateSessionId();
|
|
17
|
+
const session = {
|
|
18
|
+
id: sessionId,
|
|
19
|
+
messages: [],
|
|
20
|
+
createdAt: new Date(),
|
|
21
|
+
updatedAt: new Date()
|
|
22
|
+
};
|
|
23
|
+
this.sessions.set(sessionId, session);
|
|
24
|
+
this.lastSessionId = sessionId;
|
|
25
|
+
// 如果会话数量超过限制,删除最旧的会话
|
|
26
|
+
if (this.sessions.size > (this.options.maxSessions || 100)) {
|
|
27
|
+
this.cleanupOldSessions();
|
|
28
|
+
}
|
|
29
|
+
return session;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 获取最后一个会话,如果不存在则创建新会话
|
|
33
|
+
*/
|
|
34
|
+
lastSession() {
|
|
35
|
+
if (this.lastSessionId && this.sessions.has(this.lastSessionId)) {
|
|
36
|
+
return this.sessions.get(this.lastSessionId);
|
|
37
|
+
}
|
|
38
|
+
return this.newSession();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 根据ID获取会话
|
|
42
|
+
*/
|
|
43
|
+
getSession(id) {
|
|
44
|
+
return this.sessions.get(id);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 获取所有会话
|
|
48
|
+
*/
|
|
49
|
+
getAllSessions() {
|
|
50
|
+
return Array.from(this.sessions.values())
|
|
51
|
+
.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 删除会话
|
|
55
|
+
*/
|
|
56
|
+
deleteSession(id) {
|
|
57
|
+
const deleted = this.sessions.delete(id);
|
|
58
|
+
if (deleted && this.lastSessionId === id) {
|
|
59
|
+
// 如果删除的是最后一个会话,更新lastSessionId
|
|
60
|
+
const allSessions = this.getAllSessions();
|
|
61
|
+
this.lastSessionId = allSessions.length > 0 ? allSessions[0].id : undefined;
|
|
62
|
+
}
|
|
63
|
+
return deleted;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 清空所有会话
|
|
67
|
+
*/
|
|
68
|
+
clear() {
|
|
69
|
+
this.sessions.clear();
|
|
70
|
+
this.lastSessionId = undefined;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 获取会话统计信息
|
|
74
|
+
*/
|
|
75
|
+
getStats() {
|
|
76
|
+
const totalSessions = this.sessions.size;
|
|
77
|
+
let totalMessages = 0;
|
|
78
|
+
let lastActivity = null;
|
|
79
|
+
for (const session of this.sessions.values()) {
|
|
80
|
+
totalMessages += session.messages.length;
|
|
81
|
+
if (!lastActivity || session.updatedAt > lastActivity) {
|
|
82
|
+
lastActivity = session.updatedAt;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
totalSessions,
|
|
87
|
+
totalMessages,
|
|
88
|
+
lastActivity
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 生成唯一的会话ID
|
|
93
|
+
*/
|
|
94
|
+
generateSessionId() {
|
|
95
|
+
return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 清理旧会话
|
|
99
|
+
*/
|
|
100
|
+
cleanupOldSessions() {
|
|
101
|
+
const sessions = this.getAllSessions();
|
|
102
|
+
const maxSessions = this.options.maxSessions || 100;
|
|
103
|
+
if (sessions.length > maxSessions) {
|
|
104
|
+
const sessionsToDelete = sessions.slice(maxSessions);
|
|
105
|
+
for (const session of sessionsToDelete) {
|
|
106
|
+
this.sessions.delete(session.id);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 导出会话数据
|
|
112
|
+
*/
|
|
113
|
+
export() {
|
|
114
|
+
return {
|
|
115
|
+
sessions: Array.from(this.sessions.entries()),
|
|
116
|
+
lastSessionId: this.lastSessionId,
|
|
117
|
+
exportedAt: new Date().toISOString()
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 导入会话数据
|
|
122
|
+
*/
|
|
123
|
+
import(data) {
|
|
124
|
+
if (data.sessions && Array.isArray(data.sessions)) {
|
|
125
|
+
this.sessions.clear();
|
|
126
|
+
for (const [id, session] of data.sessions) {
|
|
127
|
+
// 确保日期对象正确转换
|
|
128
|
+
if (session.createdAt && typeof session.createdAt === 'string') {
|
|
129
|
+
session.createdAt = new Date(session.createdAt);
|
|
130
|
+
}
|
|
131
|
+
if (session.updatedAt && typeof session.updatedAt === 'string') {
|
|
132
|
+
session.updatedAt = new Date(session.updatedAt);
|
|
133
|
+
}
|
|
134
|
+
// 转换消息中的时间戳
|
|
135
|
+
if (session.messages) {
|
|
136
|
+
session.messages.forEach((msg) => {
|
|
137
|
+
if (msg.timestamp && typeof msg.timestamp === 'string') {
|
|
138
|
+
msg.timestamp = new Date(msg.timestamp);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
this.sessions.set(id, session);
|
|
143
|
+
}
|
|
144
|
+
this.lastSessionId = data.lastSessionId;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=Memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Memory.js","sourceRoot":"","sources":["../src/Memory.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { Hero } from "./Hero.js";
|
|
2
|
+
export { Memory } from "./Memory.js";
|
|
3
|
+
export { Knowledge } from "./Knowledge.js";
|
|
4
|
+
export type { Session } from "./Hero.js";
|
|
5
|
+
export type { MemoryOptions } from "./Memory.js";
|
|
6
|
+
export type { KnowledgeOptions, KnowledgeItem } from "./Knowledge.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "downcity",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A npm package for downcity agent framework",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"README.md",
|
|
11
|
+
"LICENSE"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "tsc --watch",
|
|
16
|
+
"docs:dev": "vitepress dev docs",
|
|
17
|
+
"docs:build": "vitepress build docs",
|
|
18
|
+
"docs:preview": "vitepress preview docs",
|
|
19
|
+
"prepublishOnly": "npm run build",
|
|
20
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"agent framework",
|
|
24
|
+
"downcity",
|
|
25
|
+
"agent",
|
|
26
|
+
"typescript"
|
|
27
|
+
],
|
|
28
|
+
"author": "wangenius",
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "https://github.com/wangenius/downcity.git"
|
|
33
|
+
},
|
|
34
|
+
"bugs": {
|
|
35
|
+
"url": "https://github.com/wangenius/downcity/issues"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://github.com/wangenius/downcity#readme",
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@ai-sdk/openai": "^2.0.22",
|
|
40
|
+
"ai": "^5.0.24",
|
|
41
|
+
"chromadb": "^1.8.1",
|
|
42
|
+
"zod": "^4.1.3"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^20.0.0",
|
|
46
|
+
"typescript": "^5.0.0"
|
|
47
|
+
},
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">=16.0.0"
|
|
50
|
+
}
|
|
51
|
+
}
|