koishi-plugin-satori-ai 1.2.8 → 1.2.10
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/lib/database.d.ts +1 -0
- package/lib/game.d.ts +2 -1
- package/lib/gamegobang.d.ts +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +179 -133
- package/lib/types.d.ts +10 -4
- package/lib/utils.d.ts +3 -1
- package/package.json +1 -1
- package/wasm/gobang.cpp +3 -5
- package/wasm/gobang.js +21 -21
- package/wasm/gobang.wasm +0 -0
package/lib/database.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export declare function updateFavorability(ctx: Context, user: User, adjustment:
|
|
|
11
11
|
export declare function updateUserLevel(ctx: Context, user: User, level: number): Promise<void>;
|
|
12
12
|
export declare function updateUserUsage(ctx: Context, user: User, adjustment?: number): Promise<number | void>;
|
|
13
13
|
export declare function updateUserItems(ctx: Context, user: User): Promise<void>;
|
|
14
|
+
export declare function updateUserP(ctx: Context, user: User, adjustment: number): Promise<void>;
|
|
14
15
|
export declare function getUser(ctx: Context, userId: string): Promise<User | null>;
|
|
15
16
|
export declare function ensureUserExists(ctx: Context, userId: string, username: string): Promise<User>;
|
|
16
17
|
export declare function extendDatabase(ctx: Context): void;
|
package/lib/game.d.ts
CHANGED
|
@@ -9,7 +9,8 @@ export declare class Game {
|
|
|
9
9
|
private availableGames;
|
|
10
10
|
private context;
|
|
11
11
|
private config;
|
|
12
|
-
|
|
12
|
+
private sat;
|
|
13
|
+
constructor(ctx: Context, cfg: Sat.Config, sat: Sat);
|
|
13
14
|
private registerCommands;
|
|
14
15
|
startGame(session: Session, gameName: string, args: string[]): Promise<"当前频道已经有游戏在进行中" | "没有这个游戏哦">;
|
|
15
16
|
endGame(session: Session): Promise<string>;
|
package/lib/gamegobang.d.ts
CHANGED
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -52,6 +52,106 @@ var import_koishi2 = require("koishi");
|
|
|
52
52
|
|
|
53
53
|
// src/utils.ts
|
|
54
54
|
var import_koishi = require("koishi");
|
|
55
|
+
|
|
56
|
+
// src/database.ts
|
|
57
|
+
async function isTargetIdNotExists(ctx, userId) {
|
|
58
|
+
const users = await ctx.database.get("p_system", { userid: userId });
|
|
59
|
+
return users.length === 0;
|
|
60
|
+
}
|
|
61
|
+
__name(isTargetIdNotExists, "isTargetIdNotExists");
|
|
62
|
+
async function createUser(ctx, user) {
|
|
63
|
+
await ctx.database.create("p_system", {
|
|
64
|
+
userid: user.userid || "",
|
|
65
|
+
usersname: user.usersname || "",
|
|
66
|
+
p: user.p || 0,
|
|
67
|
+
favorability: user.favorability || 0,
|
|
68
|
+
userlevel: user.userlevel || 0,
|
|
69
|
+
usage: user.usage || 0,
|
|
70
|
+
lastChatTime: user.lastChatTime || (/* @__PURE__ */ new Date()).getDate(),
|
|
71
|
+
items: user.items || {}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
__name(createUser, "createUser");
|
|
75
|
+
async function updateFavorability(ctx, user, adjustment) {
|
|
76
|
+
if (!user)
|
|
77
|
+
return;
|
|
78
|
+
let newValue;
|
|
79
|
+
if (typeof adjustment === "number")
|
|
80
|
+
newValue = user.favorability + adjustment;
|
|
81
|
+
else
|
|
82
|
+
newValue = user.favorability;
|
|
83
|
+
await ctx.database.set("p_system", { userid: user.userid }, { favorability: newValue });
|
|
84
|
+
}
|
|
85
|
+
__name(updateFavorability, "updateFavorability");
|
|
86
|
+
async function updateUserLevel(ctx, user, level) {
|
|
87
|
+
if (!user)
|
|
88
|
+
return;
|
|
89
|
+
level = level < 5 ? level : 4;
|
|
90
|
+
await ctx.database.set("p_system", { userid: user.userid }, { userlevel: level });
|
|
91
|
+
}
|
|
92
|
+
__name(updateUserLevel, "updateUserLevel");
|
|
93
|
+
async function updateUserUsage(ctx, user, adjustment = 1) {
|
|
94
|
+
if (!user)
|
|
95
|
+
return;
|
|
96
|
+
if (user.lastChatTime && (/* @__PURE__ */ new Date()).getDate() !== user.lastChatTime)
|
|
97
|
+
user.usage = 0;
|
|
98
|
+
await ctx.database.set("p_system", { userid: user.userid }, { usage: user.usage + adjustment });
|
|
99
|
+
await ctx.database.set("p_system", { userid: user.userid }, { lastChatTime: (/* @__PURE__ */ new Date()).getDate() });
|
|
100
|
+
return user.usage + adjustment;
|
|
101
|
+
}
|
|
102
|
+
__name(updateUserUsage, "updateUserUsage");
|
|
103
|
+
async function updateUserItems(ctx, user) {
|
|
104
|
+
if (!user)
|
|
105
|
+
return;
|
|
106
|
+
await ctx.database.set("p_system", { userid: user.userid }, { items: user.items });
|
|
107
|
+
}
|
|
108
|
+
__name(updateUserItems, "updateUserItems");
|
|
109
|
+
async function updateUserP(ctx, user, adjustment) {
|
|
110
|
+
if (!user)
|
|
111
|
+
return;
|
|
112
|
+
if (user.p + adjustment < 0)
|
|
113
|
+
adjustment = -user.p;
|
|
114
|
+
await ctx.database.set("p_system", { userid: user.userid }, { p: user.p + adjustment });
|
|
115
|
+
}
|
|
116
|
+
__name(updateUserP, "updateUserP");
|
|
117
|
+
async function getUser(ctx, userId) {
|
|
118
|
+
const users = await ctx.database.get("p_system", { userid: userId });
|
|
119
|
+
return users[0] || null;
|
|
120
|
+
}
|
|
121
|
+
__name(getUser, "getUser");
|
|
122
|
+
async function ensureUserExists(ctx, userId, username) {
|
|
123
|
+
const notExists = await isTargetIdNotExists(ctx, userId);
|
|
124
|
+
if (notExists) {
|
|
125
|
+
await createUser(ctx, {
|
|
126
|
+
userid: userId,
|
|
127
|
+
usersname: username,
|
|
128
|
+
p: 0,
|
|
129
|
+
favorability: 0,
|
|
130
|
+
userlevel: 0,
|
|
131
|
+
usage: 0,
|
|
132
|
+
lastChatTime: (/* @__PURE__ */ new Date()).getDate(),
|
|
133
|
+
items: {}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return getUser(ctx, userId);
|
|
137
|
+
}
|
|
138
|
+
__name(ensureUserExists, "ensureUserExists");
|
|
139
|
+
function extendDatabase(ctx) {
|
|
140
|
+
ctx.model.extend("p_system", {
|
|
141
|
+
id: "unsigned",
|
|
142
|
+
userid: "string",
|
|
143
|
+
usersname: "string",
|
|
144
|
+
p: "integer",
|
|
145
|
+
favorability: "integer",
|
|
146
|
+
userlevel: "integer",
|
|
147
|
+
usage: "integer",
|
|
148
|
+
lastChatTime: "integer",
|
|
149
|
+
items: "object"
|
|
150
|
+
}, { autoInc: true });
|
|
151
|
+
}
|
|
152
|
+
__name(extendDatabase, "extendDatabase");
|
|
153
|
+
|
|
154
|
+
// src/utils.ts
|
|
55
155
|
var fs = __toESM(require("fs"));
|
|
56
156
|
var path = __toESM(require("path"));
|
|
57
157
|
var logger = new import_koishi.Logger("satori-utils");
|
|
@@ -135,8 +235,8 @@ function processPrompt(prompt) {
|
|
|
135
235
|
return "";
|
|
136
236
|
if (prompt.includes(":poke"))
|
|
137
237
|
return "戳戳";
|
|
238
|
+
prompt = prompt.replace(/<[^>]*?avatar[^>]*>/g, "。回复:");
|
|
138
239
|
prompt = prompt.replace(/<[^>]*?img[^>]*>/g, "[图片]");
|
|
139
|
-
prompt = prompt.replace(/<[^>]*?avatar[^>]*>/g, "");
|
|
140
240
|
prompt = prompt.replace(/<[^>]*?name="([^\"]*)"[^>]*>/g, (_, name) => `@${name}`);
|
|
141
241
|
return prompt;
|
|
142
242
|
}
|
|
@@ -169,6 +269,14 @@ function addOutputCensor(session, word, baseURL) {
|
|
|
169
269
|
session.send(`添加"${word}"成功`);
|
|
170
270
|
}
|
|
171
271
|
__name(addOutputCensor, "addOutputCensor");
|
|
272
|
+
async function updateUserPWithTicket(ctx, user, adjustment) {
|
|
273
|
+
if (!user)
|
|
274
|
+
return;
|
|
275
|
+
if (user?.items?.["地灵殿通行证"]?.description && user.items["地灵殿通行证"].description === "on") {
|
|
276
|
+
await updateUserP(ctx, user, adjustment);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
__name(updateUserPWithTicket, "updateUserPWithTicket");
|
|
172
280
|
|
|
173
281
|
// src/api.ts
|
|
174
282
|
var logger2 = new import_koishi2.Logger("satori-api");
|
|
@@ -191,14 +299,20 @@ var APIClient = class {
|
|
|
191
299
|
let modle;
|
|
192
300
|
let baseURL;
|
|
193
301
|
if (enableUserKey) {
|
|
194
|
-
const
|
|
195
|
-
keys = [key];
|
|
196
|
-
modle =
|
|
197
|
-
baseURL =
|
|
302
|
+
const ticket = user.items["地灵殿通行证"].metadata;
|
|
303
|
+
keys = [ticket?.key];
|
|
304
|
+
modle = ticket?.model;
|
|
305
|
+
baseURL = ticket?.baseURL;
|
|
306
|
+
const not_reasoner_model = ticket?.not_reasoner_model;
|
|
307
|
+
const length = ticket?.use_not_reasoner_LLM_length;
|
|
308
|
+
if (not_reasoner_model && length && messages[messages.length - 1].content.length <= length)
|
|
309
|
+
modle = not_reasoner_model;
|
|
198
310
|
} else {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
311
|
+
const config = this.config;
|
|
312
|
+
const useNotReasoner = messages[messages.length - 1].content.length <= config.use_not_reasoner_LLM_length;
|
|
313
|
+
keys = useNotReasoner ? config.not_reasoner_LLM_key : config.keys;
|
|
314
|
+
modle = useNotReasoner ? config.not_reasoner_LLM : config.appointModel;
|
|
315
|
+
baseURL = useNotReasoner ? config.not_reasoner_LLM_URL : config.baseURL;
|
|
202
316
|
}
|
|
203
317
|
const payload = this.createPayload(messages, modle);
|
|
204
318
|
for (let i = 0; i < keys.length; i++) {
|
|
@@ -276,7 +390,6 @@ var APIClient = class {
|
|
|
276
390
|
return {
|
|
277
391
|
model,
|
|
278
392
|
messages,
|
|
279
|
-
max_tokens: this.config.content_max_tokens,
|
|
280
393
|
temperature: this.config.temperature,
|
|
281
394
|
top_p: 1,
|
|
282
395
|
frequency_penalty: this.config.frequency_penalty,
|
|
@@ -300,19 +413,13 @@ var APIClient = class {
|
|
|
300
413
|
try {
|
|
301
414
|
const response = await this.ctx.http.post(url, payload, { headers, timeout: 36e5 });
|
|
302
415
|
content = response.choices[0].message.content;
|
|
303
|
-
const reasoning_content = response.choices[0].message.reasoning_content;
|
|
416
|
+
const reasoning_content = response.choices[0].message.reasoning_content || "无";
|
|
304
417
|
if (this.config.reasoning_content)
|
|
305
|
-
logger2.info(`思维链: ${reasoning_content
|
|
418
|
+
logger2.info(`思维链: ${reasoning_content}`);
|
|
306
419
|
if (!content && reasoning_content) {
|
|
307
420
|
logger2.warn("返回内容为空,但存在推理内容");
|
|
308
421
|
content = response.choices[0].message.reasoning_content;
|
|
309
422
|
}
|
|
310
|
-
if (content.length > this.config.content_max_length) {
|
|
311
|
-
logger2.warn(`返回内容超过最大长度(${content.length} > ${this.config.content_max_length})`);
|
|
312
|
-
if (i >= 2)
|
|
313
|
-
return { content: "返回内容超过最大长度", error: true };
|
|
314
|
-
continue;
|
|
315
|
-
}
|
|
316
423
|
const responseMsg = { role: "assistant", content };
|
|
317
424
|
if (payload.messages.some((msg) => msg === responseMsg) && content.length > 5) {
|
|
318
425
|
const lastMsg = payload.messages[payload.messages.length - 1];
|
|
@@ -388,98 +495,6 @@ var APIClient = class {
|
|
|
388
495
|
var import_koishi3 = require("koishi");
|
|
389
496
|
var fs2 = __toESM(require("fs"));
|
|
390
497
|
var path2 = __toESM(require("path"));
|
|
391
|
-
|
|
392
|
-
// src/database.ts
|
|
393
|
-
async function isTargetIdNotExists(ctx, userId) {
|
|
394
|
-
const users = await ctx.database.get("p_system", { userid: userId });
|
|
395
|
-
return users.length === 0;
|
|
396
|
-
}
|
|
397
|
-
__name(isTargetIdNotExists, "isTargetIdNotExists");
|
|
398
|
-
async function createUser(ctx, user) {
|
|
399
|
-
await ctx.database.create("p_system", {
|
|
400
|
-
userid: user.userid || "",
|
|
401
|
-
usersname: user.usersname || "",
|
|
402
|
-
p: user.p || 0,
|
|
403
|
-
favorability: user.favorability || 0,
|
|
404
|
-
userlevel: user.userlevel || 0,
|
|
405
|
-
usage: user.usage || 0,
|
|
406
|
-
lastChatTime: user.lastChatTime || (/* @__PURE__ */ new Date()).getDate(),
|
|
407
|
-
items: user.items || {}
|
|
408
|
-
});
|
|
409
|
-
}
|
|
410
|
-
__name(createUser, "createUser");
|
|
411
|
-
async function updateFavorability(ctx, user, adjustment) {
|
|
412
|
-
if (!user)
|
|
413
|
-
return;
|
|
414
|
-
let newValue;
|
|
415
|
-
if (typeof adjustment === "number")
|
|
416
|
-
newValue = user.favorability + adjustment;
|
|
417
|
-
else
|
|
418
|
-
newValue = user.favorability;
|
|
419
|
-
await ctx.database.set("p_system", { userid: user.userid }, { favorability: newValue });
|
|
420
|
-
}
|
|
421
|
-
__name(updateFavorability, "updateFavorability");
|
|
422
|
-
async function updateUserLevel(ctx, user, level) {
|
|
423
|
-
if (!user)
|
|
424
|
-
return;
|
|
425
|
-
level = level < 5 ? level : 4;
|
|
426
|
-
await ctx.database.set("p_system", { userid: user.userid }, { userlevel: level });
|
|
427
|
-
}
|
|
428
|
-
__name(updateUserLevel, "updateUserLevel");
|
|
429
|
-
async function updateUserUsage(ctx, user, adjustment = 1) {
|
|
430
|
-
if (!user)
|
|
431
|
-
return;
|
|
432
|
-
if (user.lastChatTime && (/* @__PURE__ */ new Date()).getDate() !== user.lastChatTime)
|
|
433
|
-
user.usage = 0;
|
|
434
|
-
await ctx.database.set("p_system", { userid: user.userid }, { usage: user.usage + adjustment });
|
|
435
|
-
await ctx.database.set("p_system", { userid: user.userid }, { lastChatTime: (/* @__PURE__ */ new Date()).getDate() });
|
|
436
|
-
return user.usage + adjustment;
|
|
437
|
-
}
|
|
438
|
-
__name(updateUserUsage, "updateUserUsage");
|
|
439
|
-
async function updateUserItems(ctx, user) {
|
|
440
|
-
if (!user)
|
|
441
|
-
return;
|
|
442
|
-
await ctx.database.set("p_system", { userid: user.userid }, { items: user.items });
|
|
443
|
-
}
|
|
444
|
-
__name(updateUserItems, "updateUserItems");
|
|
445
|
-
async function getUser(ctx, userId) {
|
|
446
|
-
const users = await ctx.database.get("p_system", { userid: userId });
|
|
447
|
-
return users[0] || null;
|
|
448
|
-
}
|
|
449
|
-
__name(getUser, "getUser");
|
|
450
|
-
async function ensureUserExists(ctx, userId, username) {
|
|
451
|
-
const notExists = await isTargetIdNotExists(ctx, userId);
|
|
452
|
-
if (notExists) {
|
|
453
|
-
await createUser(ctx, {
|
|
454
|
-
userid: userId,
|
|
455
|
-
usersname: username,
|
|
456
|
-
p: 0,
|
|
457
|
-
favorability: 0,
|
|
458
|
-
userlevel: 0,
|
|
459
|
-
usage: 0,
|
|
460
|
-
lastChatTime: (/* @__PURE__ */ new Date()).getDate(),
|
|
461
|
-
items: {}
|
|
462
|
-
});
|
|
463
|
-
}
|
|
464
|
-
return getUser(ctx, userId);
|
|
465
|
-
}
|
|
466
|
-
__name(ensureUserExists, "ensureUserExists");
|
|
467
|
-
function extendDatabase(ctx) {
|
|
468
|
-
ctx.model.extend("p_system", {
|
|
469
|
-
id: "unsigned",
|
|
470
|
-
userid: "string",
|
|
471
|
-
usersname: "string",
|
|
472
|
-
p: "integer",
|
|
473
|
-
favorability: "integer",
|
|
474
|
-
userlevel: "integer",
|
|
475
|
-
usage: "integer",
|
|
476
|
-
lastChatTime: "integer",
|
|
477
|
-
items: "object"
|
|
478
|
-
}, { autoInc: true });
|
|
479
|
-
}
|
|
480
|
-
__name(extendDatabase, "extendDatabase");
|
|
481
|
-
|
|
482
|
-
// src/memory.ts
|
|
483
498
|
var logger3 = new import_koishi3.Logger("satori-memory");
|
|
484
499
|
var MemoryManager = class {
|
|
485
500
|
constructor(ctx, config) {
|
|
@@ -498,7 +513,6 @@ var MemoryManager = class {
|
|
|
498
513
|
if (response.error)
|
|
499
514
|
return;
|
|
500
515
|
this.updateChannelMemory(session, prompt, config, response.content);
|
|
501
|
-
prompt = prompt.replace("我", session.username);
|
|
502
516
|
const date = ` (对话日期和时间:${(/* @__PURE__ */ new Date()).toLocaleString()})`;
|
|
503
517
|
const userFavourbility = (await getUser(this.ctx, session.userId)).favorability;
|
|
504
518
|
if (this.shouldRemember(prompt, userFavourbility)) {
|
|
@@ -1032,27 +1046,34 @@ var Sat = class extends import_koishi5.Service {
|
|
|
1032
1046
|
((Sat2) => {
|
|
1033
1047
|
Sat2.Config = import_koishi5.Schema.intersect([
|
|
1034
1048
|
import_koishi5.Schema.object({
|
|
1035
|
-
baseURL: import_koishi5.Schema.string().default("https://api.deepseek.com").description("
|
|
1049
|
+
baseURL: import_koishi5.Schema.string().default("https://api.deepseek.com").description("深度思考模型请求地址"),
|
|
1036
1050
|
key: import_koishi5.Schema.union([
|
|
1037
1051
|
import_koishi5.Schema.array(String).role("secret"),
|
|
1038
1052
|
import_koishi5.Schema.transform(String, (value) => [value])
|
|
1039
|
-
]).default([]).role("secret").description("api_key"),
|
|
1040
|
-
appointModel: import_koishi5.Schema.string().default("deepseek-reasoner").description("
|
|
1053
|
+
]).default([]).role("secret").description("深度思考模型api_key"),
|
|
1054
|
+
appointModel: import_koishi5.Schema.string().default("deepseek-reasoner").description("深度思考模型"),
|
|
1055
|
+
not_reasoner_LLM_URL: import_koishi5.Schema.string().default("https://api.deepseek.com").description("非深度思考模型请求地址"),
|
|
1056
|
+
not_reasoner_LLM: import_koishi5.Schema.string().default("deepseek-chat").description("非深度思考模型(用于节省成本"),
|
|
1057
|
+
not_reasoner_LLM_key: import_koishi5.Schema.union([
|
|
1058
|
+
import_koishi5.Schema.array(String).role("secret"),
|
|
1059
|
+
import_koishi5.Schema.transform(String, (value) => [value])
|
|
1060
|
+
]).default([]).role("secret").description("非深度思考模型api_key"),
|
|
1061
|
+
use_not_reasoner_LLM_length: import_koishi5.Schema.number().default(8).description("触发使用非深度思考模型的字数(输入少于此字数时),如果你希望始终使用非深度思考模型进行对话,请将此值设置成一个较大的值"),
|
|
1062
|
+
enable_reasoner_like: import_koishi5.Schema.boolean().default(true).description("是否启用非深度思考模型模仿思维链(可以在节省成本的同时提高效果)"),
|
|
1041
1063
|
auxiliary_LLM_URL: import_koishi5.Schema.string().default("https://api.deepseek.com").description("辅助模型请求地址"),
|
|
1042
1064
|
auxiliary_LLM: import_koishi5.Schema.string().default("deepseek-chat").description("辅助模型(用于好感度调整等功能,如不需要可不填,建议使用低成本模型"),
|
|
1043
1065
|
auxiliary_LLM_key: import_koishi5.Schema.union([
|
|
1044
1066
|
import_koishi5.Schema.array(String).role("secret"),
|
|
1045
1067
|
import_koishi5.Schema.transform(String, (value) => [value])
|
|
1046
1068
|
]).default([]).role("secret").description("辅助模型api_key"),
|
|
1047
|
-
prompt: import_koishi5.Schema.string().role("textarea").description("人格设定")
|
|
1069
|
+
prompt: import_koishi5.Schema.string().role("textarea").description("人格设定"),
|
|
1070
|
+
reasoner_prompt: import_koishi5.Schema.string().role("textarea").description("思考提示词(对于深度思考模型和非深度思考模型模仿思维链时生效)").default("你在思考时应当逐步分析以下内容:1.当前对话的禁止事项;2.是否与群聊中其他人的发言有关联;3.是否与当前用户之前说的话有关联;4.对话的具体要求;5.用户的意图如何;6.最终的发言的主要内容。")
|
|
1048
1071
|
}).description("基础设置"),
|
|
1049
1072
|
import_koishi5.Schema.object({
|
|
1050
1073
|
alias: import_koishi5.Schema.array(String).default(["ai"]).description("触发命令;别名"),
|
|
1051
1074
|
authority: import_koishi5.Schema.number().role("slider").min(0).max(5).step(1).description("允许使用的最低权限").default(1),
|
|
1052
|
-
no_system_prompt: import_koishi5.Schema.boolean().default(false).description("是否将系统提示的system替换为user
|
|
1075
|
+
no_system_prompt: import_koishi5.Schema.boolean().default(false).description("是否将系统提示的system替换为user(用于具有思维链的模型)"),
|
|
1053
1076
|
max_tokens: import_koishi5.Schema.number().description("最大请求长度(字符数)").default(100),
|
|
1054
|
-
content_max_tokens: import_koishi5.Schema.number().description("最大回答长度(思维链+输出token)").default(4096),
|
|
1055
|
-
content_max_length: import_koishi5.Schema.number().description("最大回答长度(仅输出,字符数)").default(100),
|
|
1056
1077
|
message_max_length: import_koishi5.Schema.number().description("最大频道上下文长度(条数)").default(10),
|
|
1057
1078
|
temperature: import_koishi5.Schema.number().role("slider").min(0).max(2).step(0.01).default(0.5).description("温度"),
|
|
1058
1079
|
frequency_penalty: import_koishi5.Schema.number().default(0).description("频率惩罚"),
|
|
@@ -1162,7 +1183,14 @@ var UserPortraitManager = class {
|
|
|
1162
1183
|
if (!fs5.existsSync(memoryPath))
|
|
1163
1184
|
return [];
|
|
1164
1185
|
const memoryContent = JSON.parse(fs5.readFileSync(memoryPath, "utf-8"));
|
|
1165
|
-
const
|
|
1186
|
+
const replacedContent = memoryContent.map((entry) => {
|
|
1187
|
+
return {
|
|
1188
|
+
...entry,
|
|
1189
|
+
content: entry.content.replace(user.usersname, "我")
|
|
1190
|
+
};
|
|
1191
|
+
});
|
|
1192
|
+
fs5.writeFileSync(memoryPath, JSON.stringify(replacedContent, null, 2));
|
|
1193
|
+
const validEntries = replacedContent.filter((entry) => entry.role !== "user").map((entry) => {
|
|
1166
1194
|
const timeMatch = entry.role.match(/对话日期和时间:(\d{4}\/\d{1,2}\/\d{1,2} \d{2}:\d{2}:\d{2})/);
|
|
1167
1195
|
if (!timeMatch)
|
|
1168
1196
|
return null;
|
|
@@ -1322,11 +1350,13 @@ var SAT = class extends Sat {
|
|
|
1322
1350
|
baseURL: this.config.baseURL,
|
|
1323
1351
|
keys: this.config.key,
|
|
1324
1352
|
appointModel: this.config.appointModel,
|
|
1353
|
+
not_reasoner_LLM_URL: this.config.not_reasoner_LLM_URL,
|
|
1354
|
+
not_reasoner_LLM: this.config.not_reasoner_LLM,
|
|
1355
|
+
not_reasoner_LLM_key: this.config.not_reasoner_LLM_key,
|
|
1356
|
+
use_not_reasoner_LLM_length: this.config.use_not_reasoner_LLM_length,
|
|
1325
1357
|
auxiliary_LLM_URL: this.config.auxiliary_LLM_URL,
|
|
1326
1358
|
auxiliary_LLM: this.config.auxiliary_LLM,
|
|
1327
1359
|
auxiliary_LLM_key: this.config.auxiliary_LLM_key,
|
|
1328
|
-
content_max_tokens: this.config.content_max_tokens,
|
|
1329
|
-
content_max_length: this.config.content_max_length,
|
|
1330
1360
|
maxRetryTimes: this.config.maxRetryTimes,
|
|
1331
1361
|
retry_delay_time: this.config.retry_delay_time,
|
|
1332
1362
|
temperature: this.config.temperature,
|
|
@@ -1417,12 +1447,12 @@ var SAT = class extends Sat {
|
|
|
1417
1447
|
const favorabilityBlock = await this.checkFavorabilityBlock(session);
|
|
1418
1448
|
if (favorabilityBlock)
|
|
1419
1449
|
return favorabilityBlock;
|
|
1420
|
-
const preCheckResult = this.performPreChecks(session,
|
|
1450
|
+
const preCheckResult = this.performPreChecks(session, processedPrompt);
|
|
1421
1451
|
if (preCheckResult)
|
|
1422
1452
|
return preCheckResult;
|
|
1423
1453
|
const channelId = this.config.enable_self_memory ? session.userId : session.channelId;
|
|
1424
1454
|
const recentDialogues = this.memoryManager.getChannelMemory(channelId).slice(-10);
|
|
1425
|
-
const duplicateCheck = await this.checkDuplicateDialogue(session,
|
|
1455
|
+
const duplicateCheck = await this.checkDuplicateDialogue(session, processedPrompt, recentDialogues, user);
|
|
1426
1456
|
if (duplicateCheck)
|
|
1427
1457
|
return duplicateCheck;
|
|
1428
1458
|
const fixedResponse = await this.handleFixedDialoguesCheck(session, user, processedPrompt);
|
|
@@ -1435,6 +1465,8 @@ var SAT = class extends Sat {
|
|
|
1435
1465
|
const response = await this.generateResponse(session, processedPrompt);
|
|
1436
1466
|
const auxiliaryResult = await this.handleAuxiliaryDialogue(session, processedPrompt, response);
|
|
1437
1467
|
await this.memoryManager.updateMemories(session, processedPrompt, this.getMemoryConfig(), response);
|
|
1468
|
+
if (!response.error)
|
|
1469
|
+
await updateUserPWithTicket(this.ctx, user, 10);
|
|
1438
1470
|
if (user.usage == this.config.portrait_usage - 1)
|
|
1439
1471
|
this.portraitManager.generatePortrait(session, user, this.apiClient);
|
|
1440
1472
|
return await this.formatResponse(session, response.content, auxiliaryResult);
|
|
@@ -1566,6 +1598,8 @@ var SAT = class extends Sat {
|
|
|
1566
1598
|
logger6.info(`Satori AI:${response.content}`);
|
|
1567
1599
|
if (this.config.reasoner_filter)
|
|
1568
1600
|
response.content = filterResponse(response.content, this.config.reasoner_filter_word.split("-"));
|
|
1601
|
+
if (response.error)
|
|
1602
|
+
updateUserUsage(this.ctx, user, -1);
|
|
1569
1603
|
return response;
|
|
1570
1604
|
}
|
|
1571
1605
|
// 构建消息
|
|
@@ -1579,7 +1613,7 @@ var SAT = class extends Sat {
|
|
|
1579
1613
|
}
|
|
1580
1614
|
const userMemory = this.memoryManager.getChannelContext(this.config.personal_memory ? session.userId : session.channelId);
|
|
1581
1615
|
messages.push(...userMemory);
|
|
1582
|
-
if (this.config.input_prompt && messages.length >
|
|
1616
|
+
if (this.config.input_prompt && messages.length > 1) {
|
|
1583
1617
|
messages.push({ role: "user", content: "system:" + this.config.input_prompt });
|
|
1584
1618
|
messages.push({ role: "assistant", content: "好的,我会按您的要求进行回复。" });
|
|
1585
1619
|
}
|
|
@@ -1597,28 +1631,40 @@ ${payload}`);
|
|
|
1597
1631
|
const channelDialogue = await this.memoryManager.getChannelDialogue(session);
|
|
1598
1632
|
const userMemory = await this.memoryManager.searchMemories(session, prompt);
|
|
1599
1633
|
const user = await getUser(this.ctx, session.userId);
|
|
1600
|
-
|
|
1601
|
-
const clothes = user?.items?.["觉的衣柜"]?.metadata?.clothes;
|
|
1602
|
-
if (clothes)
|
|
1603
|
-
systemPrompt += `
|
|
1604
|
-
你当前的穿着(根据穿着进行对应的行为):${clothes}
|
|
1605
|
-
`;
|
|
1606
|
-
}
|
|
1634
|
+
systemPrompt += this.getThinkingPrompt(user, prompt);
|
|
1607
1635
|
systemPrompt += commonSense;
|
|
1608
1636
|
systemPrompt += channelDialogue;
|
|
1609
1637
|
systemPrompt += userMemory;
|
|
1610
1638
|
systemPrompt += this.portraitManager.getUserPortrait(session);
|
|
1611
|
-
const nickName = user.items["情侣合照"]?.metadata?.userNickName;
|
|
1612
1639
|
systemPrompt += `用户的名字是:${session.username}, id是:${session.userId}`;
|
|
1640
|
+
const nickName = user.items["情侣合照"]?.metadata?.userNickName;
|
|
1613
1641
|
if (nickName)
|
|
1614
1642
|
systemPrompt += `, 昵称是:${nickName},称呼用户时请优先使用昵称`;
|
|
1615
|
-
if (this.config.enable_favorability)
|
|
1643
|
+
if (this.config.enable_favorability)
|
|
1616
1644
|
systemPrompt += generateLevelPrompt(getFavorabilityLevel(user, this.getFavorabilityConfig()), this.getFavorabilityConfig(), user);
|
|
1617
|
-
}
|
|
1618
1645
|
if (this.config.no_system_prompt)
|
|
1619
1646
|
systemPrompt += "如果你明白以上内容,请回复“已明确对话要求”";
|
|
1620
1647
|
return systemPrompt;
|
|
1621
1648
|
}
|
|
1649
|
+
// 思考提示
|
|
1650
|
+
getThinkingPrompt(user, prompt) {
|
|
1651
|
+
const reasonerPrompt = this.config.reasoner_prompt;
|
|
1652
|
+
const promptForNoReasoner = `请你在最终回复前先输出思考内容,所有思考内容使用<think>和</think>包裹输出,而后在最后输出正式的回复内容。${reasonerPrompt}
|
|
1653
|
+
`;
|
|
1654
|
+
const promptForReasoner = `你需要将所有思考内容使用<think>和</think>包裹输出在思维链中,注意不要在最终的输出内包含思考内容。${reasonerPrompt}
|
|
1655
|
+
`;
|
|
1656
|
+
const hasTicket = user?.items?.["地灵殿通行证"]?.description && user.items["地灵殿通行证"].description === "on";
|
|
1657
|
+
const maxLength = hasTicket ? user?.items?.["地灵殿通行证"]?.metadata?.use_not_reasoner_LLM_length : this.config.use_not_reasoner_LLM_length;
|
|
1658
|
+
const useNoReasoner = prompt.length <= maxLength;
|
|
1659
|
+
if (!this.config.enable_reasoner_like && useNoReasoner)
|
|
1660
|
+
return "";
|
|
1661
|
+
const reasonerText = `
|
|
1662
|
+
以下是你的【思考要求】:{
|
|
1663
|
+
${useNoReasoner ? promptForNoReasoner : promptForReasoner}
|
|
1664
|
+
}
|
|
1665
|
+
`;
|
|
1666
|
+
return reasonerText;
|
|
1667
|
+
}
|
|
1622
1668
|
// 处理回复
|
|
1623
1669
|
async formatResponse(session, response, auxiliaryResult) {
|
|
1624
1670
|
const user = await getUser(this.ctx, session.userId);
|
package/lib/types.d.ts
CHANGED
|
@@ -87,11 +87,13 @@ export interface APIConfig {
|
|
|
87
87
|
baseURL: string;
|
|
88
88
|
keys: string[];
|
|
89
89
|
appointModel: string;
|
|
90
|
+
not_reasoner_LLM_URL: string;
|
|
91
|
+
not_reasoner_LLM: string;
|
|
92
|
+
not_reasoner_LLM_key: string[];
|
|
93
|
+
use_not_reasoner_LLM_length: number;
|
|
90
94
|
auxiliary_LLM_URL: string;
|
|
91
95
|
auxiliary_LLM: string;
|
|
92
96
|
auxiliary_LLM_key: string[];
|
|
93
|
-
content_max_tokens: number;
|
|
94
|
-
content_max_length: number;
|
|
95
97
|
temperature: number;
|
|
96
98
|
frequency_penalty: number;
|
|
97
99
|
presence_penalty: number;
|
|
@@ -143,14 +145,17 @@ export declare namespace Sat {
|
|
|
143
145
|
baseURL: string;
|
|
144
146
|
key: string[];
|
|
145
147
|
appointModel: string;
|
|
148
|
+
not_reasoner_LLM_URL: string;
|
|
149
|
+
not_reasoner_LLM: string;
|
|
150
|
+
not_reasoner_LLM_key: string[];
|
|
151
|
+
use_not_reasoner_LLM_length: number;
|
|
146
152
|
auxiliary_LLM_URL: string;
|
|
147
153
|
auxiliary_LLM: string;
|
|
148
154
|
auxiliary_LLM_key: string[];
|
|
149
155
|
prompt: string;
|
|
156
|
+
reasoner_prompt: string;
|
|
150
157
|
no_system_prompt: boolean;
|
|
151
158
|
max_tokens: number;
|
|
152
|
-
content_max_tokens: number;
|
|
153
|
-
content_max_length: number;
|
|
154
159
|
message_max_length: number;
|
|
155
160
|
remember_min_length: number;
|
|
156
161
|
temperature: number;
|
|
@@ -172,6 +177,7 @@ export declare namespace Sat {
|
|
|
172
177
|
common_topN: number;
|
|
173
178
|
dailogues_topN: number;
|
|
174
179
|
enable_fixed_dialogues: boolean;
|
|
180
|
+
enable_reasoner_like: boolean;
|
|
175
181
|
max_usage: number[];
|
|
176
182
|
private: boolean;
|
|
177
183
|
nick_name: boolean;
|
package/lib/utils.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Session } from 'koishi';
|
|
1
|
+
import { Context, Session } from 'koishi';
|
|
2
|
+
import { User } from './types';
|
|
2
3
|
export declare function escapeRegExp(str: string): string;
|
|
3
4
|
export declare function parseTimeToMinutes(timeStr: string): number;
|
|
4
5
|
export declare function parseTime(timestamp: number): number;
|
|
@@ -24,3 +25,4 @@ export declare function processPrompt(prompt: string): string;
|
|
|
24
25
|
*/
|
|
25
26
|
export declare function filterResponse(prompt: string, words: string[]): string;
|
|
26
27
|
export declare function addOutputCensor(session: Session, word: string, baseURL: string): void;
|
|
28
|
+
export declare function updateUserPWithTicket(ctx: Context, user: User, adjustment: number): Promise<void>;
|
package/package.json
CHANGED
package/wasm/gobang.cpp
CHANGED
|
@@ -460,8 +460,7 @@ int wholeScore(int player, const Game &game) {
|
|
|
460
460
|
if (temp.score == 0)
|
|
461
461
|
continue;
|
|
462
462
|
if (temp.score == player) {
|
|
463
|
-
|
|
464
|
-
Score += singleScore(temp, player, game); // 己方落子的单点分相加
|
|
463
|
+
Score += singleScore(temp, player, game); // 己方落子的单点分相加
|
|
465
464
|
} else
|
|
466
465
|
Score -= singleScore(temp, 3 - player, game); // 对方落子的单点分相加
|
|
467
466
|
}
|
|
@@ -475,11 +474,10 @@ int inspireSearch(coordinate *scoreBoard, int player, Game &game) {
|
|
|
475
474
|
for (int j = 0; j < BOARD_SIZE; j++) {
|
|
476
475
|
if (game.MAP.board[i][j] == 0) {
|
|
477
476
|
coordinate temp = {i, j, 0};
|
|
478
|
-
if (hasNeighbor(temp,
|
|
477
|
+
if (hasNeighbor(temp, 3, game)) {
|
|
479
478
|
scoreBoard[length] = temp;
|
|
480
479
|
scoreBoard[length].score = singleScore(temp, 3 - player, game);
|
|
481
|
-
|
|
482
|
-
scoreBoard[length].score += singleScore(temp, player, game);
|
|
480
|
+
scoreBoard[length].score += singleScore(temp, player, game);
|
|
483
481
|
length++;
|
|
484
482
|
}
|
|
485
483
|
}
|
package/wasm/gobang.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
var Module = (() => {
|
|
2
|
-
var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined;
|
|
3
|
-
if (typeof __filename != 'undefined') _scriptName = _scriptName || __filename;
|
|
4
|
-
return (
|
|
5
|
-
async function(moduleArg = {}) {
|
|
6
|
-
var moduleRtn;
|
|
7
|
-
|
|
8
|
-
var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_NODE=true;if(ENVIRONMENT_IS_NODE){}var moduleOverrides={...Module};var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");scriptDirectory=__dirname+"/";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;var runtimeInitialized=false;var isFileURI=filename=>filename.startsWith("file://");function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["c"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("gobang.wasm")}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["b"];updateMemoryViews();removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(mod,inst)=>{receiveInstance(mod,inst);resolve(mod.exports)})})}wasmBinaryFile??=findWasmBinary();try{var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}catch(e){readyPromiseReject(e);return Promise.reject(e)}}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.unshift(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.unshift(cb);var noExitRuntime=Module["noExitRuntime"]||true;var abortOnCannotGrowMemory=requestedSize=>{abort("OOM")};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;abortOnCannotGrowMemory(requestedSize)};var wasmImports={a:_emscripten_resize_heap};var wasmExports=await createWasm();var ___wasm_call_ctors=wasmExports["c"];var _decideMove=Module["_decideMove"]=wasmExports["d"];var _malloc=Module["_malloc"]=wasmExports["f"];var _free=Module["_free"]=wasmExports["g"];function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();moduleRtn=readyPromise;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return moduleRtn;
|
|
12
|
-
}
|
|
13
|
-
);
|
|
14
|
-
})();
|
|
15
|
-
if (typeof exports === 'object' && typeof module === 'object') {
|
|
16
|
-
module.exports = Module;
|
|
17
|
-
// This default export looks redundant, but it allows TS to import this
|
|
18
|
-
// commonjs style module.
|
|
19
|
-
module.exports.default = Module;
|
|
20
|
-
} else if (typeof define === 'function' && define['amd'])
|
|
21
|
-
define([], () => Module);
|
|
1
|
+
var Module = (() => {
|
|
2
|
+
var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined;
|
|
3
|
+
if (typeof __filename != 'undefined') _scriptName = _scriptName || __filename;
|
|
4
|
+
return (
|
|
5
|
+
async function(moduleArg = {}) {
|
|
6
|
+
var moduleRtn;
|
|
7
|
+
|
|
8
|
+
var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_NODE=true;if(ENVIRONMENT_IS_NODE){}var moduleOverrides={...Module};var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");scriptDirectory=__dirname+"/";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;var runtimeInitialized=false;var isFileURI=filename=>filename.startsWith("file://");function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["c"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("gobang.wasm")}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["b"];updateMemoryViews();removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(mod,inst)=>{receiveInstance(mod,inst);resolve(mod.exports)})})}wasmBinaryFile??=findWasmBinary();try{var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}catch(e){readyPromiseReject(e);return Promise.reject(e)}}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.unshift(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.unshift(cb);var noExitRuntime=Module["noExitRuntime"]||true;var abortOnCannotGrowMemory=requestedSize=>{abort("OOM")};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;abortOnCannotGrowMemory(requestedSize)};var wasmImports={a:_emscripten_resize_heap};var wasmExports=await createWasm();var ___wasm_call_ctors=wasmExports["c"];var _decideMove=Module["_decideMove"]=wasmExports["d"];var _malloc=Module["_malloc"]=wasmExports["f"];var _free=Module["_free"]=wasmExports["g"];function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();moduleRtn=readyPromise;
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
return moduleRtn;
|
|
12
|
+
}
|
|
13
|
+
);
|
|
14
|
+
})();
|
|
15
|
+
if (typeof exports === 'object' && typeof module === 'object') {
|
|
16
|
+
module.exports = Module;
|
|
17
|
+
// This default export looks redundant, but it allows TS to import this
|
|
18
|
+
// commonjs style module.
|
|
19
|
+
module.exports.default = Module;
|
|
20
|
+
} else if (typeof define === 'function' && define['amd'])
|
|
21
|
+
define([], () => Module);
|
package/wasm/gobang.wasm
CHANGED
|
Binary file
|