@t0ken.ai/memoryx-openclaw-plugin 2.2.49 → 2.2.53
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/dist/index.d.ts.map +1 -1
- package/dist/index.js +118 -37
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAmDH,UAAU,YAAY;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,YAAY;IAClB,QAAQ,EAAE,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,eAAe,EAAE,KAAK,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAqDD,cAAM,aAAa;IACf,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,aAAa,CAAkB;gBAE3B,YAAY,CAAC,EAAE,YAAY;IAIjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAad,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUpC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B1D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAyC/D,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAYhC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc1C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAcvE,IAAI,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAiBxC,cAAc,IAAI,OAAO,CAAC;QACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,WAAW,EAAE,OAAO,CAAC;QACrB,KAAK,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;IAwBW,cAAc,IAAI,OAAO,CAAC;QACnC,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE;YACH,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC;YACnB,YAAY,EAAE,MAAM,CAAC;YACrB,iBAAiB,EAAE,MAAM,CAAC;YAC1B,gBAAgB,EAAE,MAAM,CAAC;YACzB,mBAAmB,EAAE,MAAM,CAAC;YAC5B,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CAcL;;;;;;kBAUiB,GAAG,iBAAiB,YAAY,GAAG,IAAI;;AANzD,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAmDH,UAAU,YAAY;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,YAAY;IAClB,QAAQ,EAAE,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,eAAe,EAAE,KAAK,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAqDD,cAAM,aAAa;IACf,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,aAAa,CAAkB;gBAE3B,YAAY,CAAC,EAAE,YAAY;IAIjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAad,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUpC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B1D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAyC/D,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAYhC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc1C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAcvE,IAAI,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAiBxC,cAAc,IAAI,OAAO,CAAC;QACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,WAAW,EAAE,OAAO,CAAC;QACrB,KAAK,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;IAwBW,cAAc,IAAI,OAAO,CAAC;QACnC,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE;YACH,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC;YACnB,YAAY,EAAE,MAAM,CAAC;YACrB,iBAAiB,EAAE,MAAM,CAAC;YAC1B,gBAAgB,EAAE,MAAM,CAAC;YACzB,mBAAmB,EAAE,MAAM,CAAC;YAC5B,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CAcL;;;;;;kBAUiB,GAAG,iBAAiB,YAAY,GAAG,IAAI;;AANzD,wBAmgCE;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -27,7 +27,7 @@ import * as path from "path";
|
|
|
27
27
|
import * as os from "os";
|
|
28
28
|
import * as http from "http";
|
|
29
29
|
// 插件版本号 - 由 prebuild 脚本自动从 package.json 同步
|
|
30
|
-
const PLUGIN_VERSION = "2.2.
|
|
30
|
+
const PLUGIN_VERSION = "2.2.53";
|
|
31
31
|
const DEFAULT_API_BASE = "https://t0ken.ai/api";
|
|
32
32
|
const PLUGIN_DIR = path.join(os.homedir(), ".openclaw", "extensions", "memoryx-openclaw-plugin");
|
|
33
33
|
let logStream = null;
|
|
@@ -661,6 +661,11 @@ export default {
|
|
|
661
661
|
// IMPORTANT: 对话流走的是 before_agent_start 事件,不是 message_received!
|
|
662
662
|
// message_received 只在 auto-reply 功能中触发
|
|
663
663
|
api.on("before_agent_start", async (event, ctx) => {
|
|
664
|
+
const keys = event && typeof event === 'object' ? Object.keys(event).join(', ') : 'n/a';
|
|
665
|
+
const model = event?.model ?? event?.resolvedModel ?? 'undefined';
|
|
666
|
+
const provider = event?.provider ?? event?.resolvedProvider ?? 'undefined';
|
|
667
|
+
api.logger.info(`[MemoryX] 📋 [after resolve? before_agent_start] event keys: ${keys} | model: ${model} | provider: ${provider}`);
|
|
668
|
+
log(`[before_agent_start] model=${model} provider=${provider}`);
|
|
664
669
|
const { prompt } = event;
|
|
665
670
|
if (!prompt || prompt.length < 2 || !plugin)
|
|
666
671
|
return;
|
|
@@ -748,27 +753,47 @@ export default {
|
|
|
748
753
|
}
|
|
749
754
|
return credentials;
|
|
750
755
|
}
|
|
751
|
-
// 获取所有可用的 provider
|
|
756
|
+
// 获取所有可用的 provider/model 列表(用于服务端回落与重试)
|
|
757
|
+
// 把所有配置了的 provider 及其所有 model 都传给服务端,服务端可按顺序 fallback
|
|
752
758
|
function getAvailableProviders(credentials) {
|
|
753
759
|
const result = [];
|
|
754
760
|
for (const [providerId, creds] of credentials) {
|
|
755
761
|
if (creds.models && creds.models.length > 0) {
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
762
|
+
for (const m of creds.models) {
|
|
763
|
+
const id = m.id || m.name;
|
|
764
|
+
if (id) {
|
|
765
|
+
result.push({ provider: providerId, model: id });
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
else {
|
|
770
|
+
// 无 models 列表时仍传该 provider,用空 model 占位,服务端可忽略或按 provider 默认处理
|
|
771
|
+
result.push({ provider: providerId, model: '' });
|
|
760
772
|
}
|
|
761
773
|
}
|
|
762
774
|
return result;
|
|
763
775
|
}
|
|
764
|
-
//
|
|
776
|
+
// 用于默认首选:每个 provider 只取第一个 model,保证 default 有效
|
|
777
|
+
function getDefaultProviderModelList(credentials) {
|
|
778
|
+
const result = [];
|
|
779
|
+
for (const [providerId, creds] of credentials) {
|
|
780
|
+
if (creds.models?.length) {
|
|
781
|
+
const id = creds.models[0].id || creds.models[0].name;
|
|
782
|
+
if (id)
|
|
783
|
+
result.push({ provider: providerId, model: id });
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
return result;
|
|
787
|
+
}
|
|
788
|
+
// 获取默认的 model 和 provider(第一个可用的),以及完整列表供服务端 fallback
|
|
765
789
|
const getDefaultModelAndProvider = (credentials) => {
|
|
766
|
-
const
|
|
767
|
-
|
|
790
|
+
const defaultList = getDefaultProviderModelList(credentials);
|
|
791
|
+
const availableAll = getAvailableProviders(credentials);
|
|
792
|
+
if (defaultList.length > 0) {
|
|
768
793
|
return {
|
|
769
|
-
model:
|
|
770
|
-
provider:
|
|
771
|
-
availableProviders:
|
|
794
|
+
model: defaultList[0].model,
|
|
795
|
+
provider: defaultList[0].provider,
|
|
796
|
+
availableProviders: availableAll // 全部可用的 provider/model 供服务端回落
|
|
772
797
|
};
|
|
773
798
|
}
|
|
774
799
|
// 回退到 agents.defaults
|
|
@@ -797,15 +822,10 @@ export default {
|
|
|
797
822
|
log(`[Proxy] Found ${providerCredentials.size} providers in config`);
|
|
798
823
|
const defaultProvider = getDefaultModelAndProvider(providerCredentials);
|
|
799
824
|
log(`[Proxy] Default: ${defaultProvider.provider}/${defaultProvider.model}`);
|
|
800
|
-
//
|
|
801
|
-
//
|
|
802
|
-
// OpenClaw 的 resolveModel 查找逻辑:
|
|
803
|
-
// inlineModels.find(entry => entry.provider === provider && entry.id === modelId)
|
|
804
|
-
//
|
|
805
|
-
// before_model_resolve 返回 { providerOverride: 'memoryx-proxy', modelOverride: 'auto' }
|
|
806
|
-
// 所以 modelId = 'auto',VIRTUAL_MODEL.id 必须是 'auto'!
|
|
825
|
+
// 虚拟模型定义(与 SlimClaw 一致:主 id 用完整 "provider/model" 字符串)
|
|
826
|
+
// OpenClaw 报错 "Unknown model: memoryx-proxy/auto" 说明按完整 id 查找,故主 id 为 memoryx-proxy/auto
|
|
807
827
|
const VIRTUAL_MODEL = {
|
|
808
|
-
id: 'auto',
|
|
828
|
+
id: 'memoryx-proxy/auto',
|
|
809
829
|
name: 'MemoryX Auto Router',
|
|
810
830
|
api: 'openai-completions',
|
|
811
831
|
reasoning: true,
|
|
@@ -814,6 +834,11 @@ export default {
|
|
|
814
834
|
contextWindow: 200000,
|
|
815
835
|
maxTokens: 16384,
|
|
816
836
|
};
|
|
837
|
+
// 兼容按 provider+model 拆开查找的版本:同时注册 id=auto,便于 entry.id === modelOverride 匹配
|
|
838
|
+
const VIRTUAL_MODELS = [
|
|
839
|
+
VIRTUAL_MODEL,
|
|
840
|
+
{ ...VIRTUAL_MODEL, id: 'auto' },
|
|
841
|
+
];
|
|
817
842
|
const SIDECAR_PORT = 3335;
|
|
818
843
|
const PROXY_URL = (pluginConfig?.apiBaseUrl || DEFAULT_API_BASE) + '/openclaw/proxy/chat/completions';
|
|
819
844
|
class SidecarServer {
|
|
@@ -834,12 +859,8 @@ export default {
|
|
|
834
859
|
});
|
|
835
860
|
this.server.on('error', (err) => {
|
|
836
861
|
if (err.code === 'EADDRINUSE') {
|
|
837
|
-
log(`[Sidecar] Port ${SIDECAR_PORT} already in use
|
|
838
|
-
|
|
839
|
-
this.server.listen(SIDECAR_PORT + 1, () => {
|
|
840
|
-
log(`[Sidecar] Started on port ${SIDECAR_PORT + 1}`);
|
|
841
|
-
resolve();
|
|
842
|
-
});
|
|
862
|
+
log(`[Sidecar] Port ${SIDECAR_PORT} already in use. MemoryX proxy baseUrl is fixed to this port - please free the port or disable another service.`);
|
|
863
|
+
reject(new Error(`Port ${SIDECAR_PORT} already in use. Free the port or set OpenClaw to use a different model.`));
|
|
843
864
|
}
|
|
844
865
|
else {
|
|
845
866
|
reject(err);
|
|
@@ -1025,20 +1046,36 @@ export default {
|
|
|
1025
1046
|
// =========================================================================
|
|
1026
1047
|
// 关键:动态注入 provider 配置到 api.config
|
|
1027
1048
|
//
|
|
1028
|
-
// resolveModel() 只从 cfg.models.providers
|
|
1029
|
-
//
|
|
1030
|
-
//
|
|
1049
|
+
// 部分 OpenClaw 版本中 resolveModel() 只从 cfg.models.providers 查找,
|
|
1050
|
+
// 不会使用 registerProvider() 注册的 providers,故此处注入 config。
|
|
1051
|
+
// 若虚拟厂商仍不可用,请在 OpenClaw 配置中显式添加:
|
|
1052
|
+
// models.providers["memoryx-proxy"]: { baseUrl: "http://localhost:3335/v1", api: "openai-completions", models: [{ id: "memoryx-proxy/auto", name: "MemoryX Auto", ... }] }
|
|
1031
1053
|
// =========================================================================
|
|
1054
|
+
// ---------- 日志:写 config 前 ----------
|
|
1055
|
+
api.logger.info(`[MemoryX] 📋 [1] Before config write - api.config exists: ${!!api.config}`);
|
|
1056
|
+
api.logger.info(`[MemoryX] 📋 [1] Before config write - api.config?.models?.providers keys: ${api.config?.models?.providers ? Object.keys(api.config.models.providers).join(', ') : 'N/A'}`);
|
|
1057
|
+
if (api.config?.models?.providers) {
|
|
1058
|
+
for (const [pid, p] of Object.entries(api.config.models.providers)) {
|
|
1059
|
+
const models = p?.models;
|
|
1060
|
+
const modelIds = models?.map((m) => m?.id ?? m?.name ?? '?').join(', ') ?? 'none';
|
|
1061
|
+
api.logger.info(`[MemoryX] 📋 [1] Before config write - provider "${pid}" models: [${modelIds}]`);
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1032
1064
|
if (api.config?.models?.providers) {
|
|
1033
1065
|
api.config.models.providers['memoryx-proxy'] = {
|
|
1034
1066
|
baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
|
|
1035
1067
|
api: 'openai-completions',
|
|
1036
|
-
models:
|
|
1068
|
+
models: VIRTUAL_MODELS
|
|
1037
1069
|
};
|
|
1038
1070
|
api.logger.info('[MemoryX] ✅ Injected memoryx-proxy into config.models.providers');
|
|
1071
|
+
api.logger.info(`[MemoryX] 📋 [2] After config write - providers keys: ${Object.keys(api.config.models.providers).join(', ')}`);
|
|
1072
|
+
const mx = api.config.models.providers['memoryx-proxy'];
|
|
1073
|
+
if (mx?.models) {
|
|
1074
|
+
const ids = mx.models.map((m) => m?.id ?? '?').join(', ');
|
|
1075
|
+
api.logger.info(`[MemoryX] 📋 [2] After config write - memoryx-proxy model ids: [${ids}]`);
|
|
1076
|
+
}
|
|
1039
1077
|
}
|
|
1040
1078
|
else if (api.config) {
|
|
1041
|
-
// 确保 models.providers 存在
|
|
1042
1079
|
if (!api.config.models) {
|
|
1043
1080
|
api.config.models = {};
|
|
1044
1081
|
}
|
|
@@ -1048,23 +1085,26 @@ export default {
|
|
|
1048
1085
|
api.config.models.providers['memoryx-proxy'] = {
|
|
1049
1086
|
baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
|
|
1050
1087
|
api: 'openai-completions',
|
|
1051
|
-
models:
|
|
1088
|
+
models: VIRTUAL_MODELS
|
|
1052
1089
|
};
|
|
1053
1090
|
api.logger.info('[MemoryX] ✅ Created and injected memoryx-proxy into config.models.providers');
|
|
1091
|
+
api.logger.info(`[MemoryX] 📋 [2] After config write - memoryx-proxy model ids: [${VIRTUAL_MODELS.map(m => m.id).join(', ')}]`);
|
|
1054
1092
|
}
|
|
1055
1093
|
else {
|
|
1056
1094
|
api.logger.warn('[MemoryX] ⚠️ api.config not available - resolveModel may fail to find memoryx-proxy');
|
|
1057
1095
|
}
|
|
1058
1096
|
// 注册 Provider - 完全对齐 SlimClaw 格式
|
|
1097
|
+
const registeredModelIds = VIRTUAL_MODELS.map(m => m.id).join(', ');
|
|
1098
|
+
api.logger.info(`[MemoryX] 📋 [3] Before registerProvider - will register id=memoryx-proxy, model ids: [${registeredModelIds}]`);
|
|
1059
1099
|
api.registerProvider({
|
|
1060
1100
|
id: 'memoryx-proxy',
|
|
1061
1101
|
label: 'MemoryX Proxy Provider',
|
|
1062
1102
|
aliases: ['mx'],
|
|
1063
|
-
envVars: [],
|
|
1103
|
+
envVars: [],
|
|
1064
1104
|
models: {
|
|
1065
1105
|
baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
|
|
1066
1106
|
api: 'openai-completions',
|
|
1067
|
-
models:
|
|
1107
|
+
models: VIRTUAL_MODELS,
|
|
1068
1108
|
},
|
|
1069
1109
|
auth: [{
|
|
1070
1110
|
id: 'none',
|
|
@@ -1076,17 +1116,58 @@ export default {
|
|
|
1076
1116
|
}),
|
|
1077
1117
|
}],
|
|
1078
1118
|
});
|
|
1079
|
-
api.logger.info(
|
|
1080
|
-
//
|
|
1081
|
-
|
|
1119
|
+
api.logger.info(`[MemoryX] 📋 [3] After registerProvider - registered memoryx-proxy with models: [${registeredModelIds}]`);
|
|
1120
|
+
// 延迟再读一次 config,检查是否被后续逻辑覆盖
|
|
1121
|
+
setImmediate(() => {
|
|
1122
|
+
api.logger.info(`[MemoryX] 📋 [4] setImmediate(after register) - api.config?.models?.providers keys: ${api.config?.models?.providers ? Object.keys(api.config.models.providers).join(', ') : 'N/A'}`);
|
|
1123
|
+
if (api.config?.models?.providers) {
|
|
1124
|
+
const mx = api.config.models.providers['memoryx-proxy'];
|
|
1125
|
+
if (mx) {
|
|
1126
|
+
const ids = mx.models?.map((m) => m?.id ?? '?').join(', ') ?? 'none';
|
|
1127
|
+
api.logger.info(`[MemoryX] 📋 [4] setImmediate - memoryx-proxy still present, model ids: [${ids}]`);
|
|
1128
|
+
}
|
|
1129
|
+
else {
|
|
1130
|
+
api.logger.warn('[MemoryX] 📋 [4] setImmediate - memoryx-proxy MISSING from config (may have been overwritten)');
|
|
1131
|
+
}
|
|
1132
|
+
for (const [pid, p] of Object.entries(api.config.models.providers)) {
|
|
1133
|
+
const models = p?.models;
|
|
1134
|
+
const modelIds = models?.map((m) => m?.id ?? '?').join(', ') ?? 'none';
|
|
1135
|
+
api.logger.info(`[MemoryX] 📋 [4] setImmediate - provider "${pid}" models: [${modelIds}]`);
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
});
|
|
1139
|
+
setTimeout(() => {
|
|
1140
|
+
api.logger.info(`[MemoryX] 📋 [5] setTimeout(500ms) - api.config?.models?.providers keys: ${api.config?.models?.providers ? Object.keys(api.config.models.providers).join(', ') : 'N/A'}`);
|
|
1141
|
+
if (api.config?.models?.providers) {
|
|
1142
|
+
const mx = api.config.models.providers['memoryx-proxy'];
|
|
1143
|
+
if (mx) {
|
|
1144
|
+
const ids = mx.models?.map((m) => m?.id ?? '?').join(', ') ?? 'none';
|
|
1145
|
+
api.logger.info(`[MemoryX] 📋 [5] setTimeout(500ms) - memoryx-proxy still present, model ids: [${ids}]`);
|
|
1146
|
+
}
|
|
1147
|
+
else {
|
|
1148
|
+
api.logger.warn('[MemoryX] 📋 [5] setTimeout(500ms) - memoryx-proxy MISSING (overwritten after load)');
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
}, 500);
|
|
1152
|
+
// before_model_resolve 钩子 - 自动拦截所有请求
|
|
1082
1153
|
api.on('before_model_resolve', (event, ctx) => {
|
|
1083
1154
|
const originalModel = event.model || 'unknown';
|
|
1155
|
+
const eventKeys = event && typeof event === 'object' ? Object.keys(event).join(', ') : 'n/a';
|
|
1156
|
+
api.logger.info(`[MemoryX] 📋 [before_model_resolve] event keys: ${eventKeys} | original model: ${originalModel} → returning providerOverride=memoryx-proxy, modelOverride=auto`);
|
|
1084
1157
|
log(`[before_model_resolve] Intercepting: ${originalModel} → memoryx-proxy/auto`);
|
|
1085
1158
|
return {
|
|
1086
1159
|
providerOverride: 'memoryx-proxy',
|
|
1087
1160
|
modelOverride: 'auto'
|
|
1088
1161
|
};
|
|
1089
1162
|
});
|
|
1163
|
+
// resolve 之后:在 llm_input 打日志(此处应有已解析的 model/provider)
|
|
1164
|
+
api.on('llm_input', (event, ctx) => {
|
|
1165
|
+
const keys = event && typeof event === 'object' ? Object.keys(event).join(', ') : 'n/a';
|
|
1166
|
+
const model = event?.model ?? event?.resolvedModel ?? 'undefined';
|
|
1167
|
+
const provider = event?.provider ?? event?.resolvedProvider ?? 'undefined';
|
|
1168
|
+
api.logger.info(`[MemoryX] 📋 [after resolve? llm_input] event keys: ${keys} | model: ${model} | provider: ${provider}`);
|
|
1169
|
+
log(`[llm_input] model=${model} provider=${provider}`);
|
|
1170
|
+
});
|
|
1090
1171
|
api.logger.info('[MemoryX] 🔄 Auto-intercept enabled - ALL requests go through MemoryX Proxy');
|
|
1091
1172
|
api.logger.info(`[MemoryX] ✅ Plugin v${PLUGIN_VERSION} ready! Your conversations will be remembered automatically.`);
|
|
1092
1173
|
// Async check and show portal link after SDK initializes
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED