@t0ken.ai/memoryx-openclaw-plugin 2.2.50 → 2.2.55
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 +127 -43
- 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,wBA6gCE;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.55";
|
|
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: '' });
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
return result;
|
|
775
|
+
}
|
|
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 });
|
|
760
784
|
}
|
|
761
785
|
}
|
|
762
786
|
return result;
|
|
763
787
|
}
|
|
764
|
-
// 获取默认的 model 和 provider
|
|
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
|
+
// 虚拟模型定义:只使用 id='auto',让 OpenClaw 用 provider+'/'+model.id 得到 fullId 'memoryx-proxy/auto'
|
|
826
|
+
// (若用 id='memoryx-proxy/auto',部分实现会拼成 'memoryx-proxy/memoryx-proxy/auto' 导致找不到)
|
|
807
827
|
const VIRTUAL_MODEL = {
|
|
808
|
-
id: 'auto',
|
|
828
|
+
id: 'auto',
|
|
809
829
|
name: 'MemoryX Auto Router',
|
|
810
830
|
api: 'openai-completions',
|
|
811
831
|
reasoning: true,
|
|
@@ -814,6 +834,7 @@ export default {
|
|
|
814
834
|
contextWindow: 200000,
|
|
815
835
|
maxTokens: 16384,
|
|
816
836
|
};
|
|
837
|
+
const VIRTUAL_MODELS = [VIRTUAL_MODEL];
|
|
817
838
|
const SIDECAR_PORT = 3335;
|
|
818
839
|
const PROXY_URL = (pluginConfig?.apiBaseUrl || DEFAULT_API_BASE) + '/openclaw/proxy/chat/completions';
|
|
819
840
|
class SidecarServer {
|
|
@@ -834,12 +855,8 @@ export default {
|
|
|
834
855
|
});
|
|
835
856
|
this.server.on('error', (err) => {
|
|
836
857
|
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
|
-
});
|
|
858
|
+
log(`[Sidecar] Port ${SIDECAR_PORT} already in use. MemoryX proxy baseUrl is fixed to this port - please free the port or disable another service.`);
|
|
859
|
+
reject(new Error(`Port ${SIDECAR_PORT} already in use. Free the port or set OpenClaw to use a different model.`));
|
|
843
860
|
}
|
|
844
861
|
else {
|
|
845
862
|
reject(err);
|
|
@@ -1025,26 +1042,36 @@ export default {
|
|
|
1025
1042
|
// =========================================================================
|
|
1026
1043
|
// 关键:动态注入 provider 配置到 api.config
|
|
1027
1044
|
//
|
|
1028
|
-
// resolveModel() 只从 cfg.models.providers
|
|
1029
|
-
//
|
|
1030
|
-
//
|
|
1045
|
+
// 部分 OpenClaw 版本中 resolveModel() 只从 cfg.models.providers 查找,
|
|
1046
|
+
// 不会使用 registerProvider() 注册的 providers,故此处注入 config。
|
|
1047
|
+
// 若虚拟厂商仍不可用,请在 OpenClaw 配置中显式添加:
|
|
1048
|
+
// models.providers["memoryx-proxy"]: { baseUrl: "http://localhost:3335/v1", api: "openai-completions", models: [{ id: "auto", name: "MemoryX Auto", ... }] }
|
|
1031
1049
|
// =========================================================================
|
|
1032
|
-
//
|
|
1033
|
-
api.logger.info(`[MemoryX]
|
|
1034
|
-
api.logger.info(`[MemoryX]
|
|
1035
|
-
|
|
1036
|
-
|
|
1050
|
+
// ---------- 日志:写 config 前 ----------
|
|
1051
|
+
api.logger.info(`[MemoryX] 📋 [1] Before config write - api.config exists: ${!!api.config}`);
|
|
1052
|
+
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'}`);
|
|
1053
|
+
if (api.config?.models?.providers) {
|
|
1054
|
+
for (const [pid, p] of Object.entries(api.config.models.providers)) {
|
|
1055
|
+
const models = p?.models;
|
|
1056
|
+
const modelIds = models?.map((m) => m?.id ?? m?.name ?? '?').join(', ') ?? 'none';
|
|
1057
|
+
api.logger.info(`[MemoryX] 📋 [1] Before config write - provider "${pid}" models: [${modelIds}]`);
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1037
1060
|
if (api.config?.models?.providers) {
|
|
1038
1061
|
api.config.models.providers['memoryx-proxy'] = {
|
|
1039
1062
|
baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
|
|
1040
1063
|
api: 'openai-completions',
|
|
1041
|
-
models:
|
|
1064
|
+
models: VIRTUAL_MODELS
|
|
1042
1065
|
};
|
|
1043
1066
|
api.logger.info('[MemoryX] ✅ Injected memoryx-proxy into config.models.providers');
|
|
1044
|
-
api.logger.info(`[MemoryX]
|
|
1067
|
+
api.logger.info(`[MemoryX] 📋 [2] After config write - providers keys: ${Object.keys(api.config.models.providers).join(', ')}`);
|
|
1068
|
+
const mx = api.config.models.providers['memoryx-proxy'];
|
|
1069
|
+
if (mx?.models) {
|
|
1070
|
+
const ids = mx.models.map((m) => m?.id ?? '?').join(', ');
|
|
1071
|
+
api.logger.info(`[MemoryX] 📋 [2] After config write - memoryx-proxy model ids: [${ids}]`);
|
|
1072
|
+
}
|
|
1045
1073
|
}
|
|
1046
1074
|
else if (api.config) {
|
|
1047
|
-
// 确保 models.providers 存在
|
|
1048
1075
|
if (!api.config.models) {
|
|
1049
1076
|
api.config.models = {};
|
|
1050
1077
|
}
|
|
@@ -1054,23 +1081,39 @@ export default {
|
|
|
1054
1081
|
api.config.models.providers['memoryx-proxy'] = {
|
|
1055
1082
|
baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
|
|
1056
1083
|
api: 'openai-completions',
|
|
1057
|
-
models:
|
|
1084
|
+
models: VIRTUAL_MODELS
|
|
1058
1085
|
};
|
|
1059
1086
|
api.logger.info('[MemoryX] ✅ Created and injected memoryx-proxy into config.models.providers');
|
|
1087
|
+
api.logger.info(`[MemoryX] 📋 [2] After config write - memoryx-proxy model ids: [${VIRTUAL_MODELS.map(m => m.id).join(', ')}]`);
|
|
1060
1088
|
}
|
|
1061
1089
|
else {
|
|
1062
1090
|
api.logger.warn('[MemoryX] ⚠️ api.config not available - resolveModel may fail to find memoryx-proxy');
|
|
1063
1091
|
}
|
|
1092
|
+
// 注入 agents.defaults,使 agent 默认使用 memoryx-proxy/auto(部分实现用 agent 的 model 参与解析/白名单)
|
|
1093
|
+
if (api.config) {
|
|
1094
|
+
if (!api.config.agents) {
|
|
1095
|
+
api.config.agents = {};
|
|
1096
|
+
}
|
|
1097
|
+
const agents = api.config.agents;
|
|
1098
|
+
if (!agents.defaults) {
|
|
1099
|
+
agents.defaults = {};
|
|
1100
|
+
}
|
|
1101
|
+
agents.defaults.provider = 'memoryx-proxy';
|
|
1102
|
+
agents.defaults.model = 'auto';
|
|
1103
|
+
api.logger.info('[MemoryX] 📋 Injected agents.defaults: provider=memoryx-proxy, model=auto');
|
|
1104
|
+
}
|
|
1064
1105
|
// 注册 Provider - 完全对齐 SlimClaw 格式
|
|
1106
|
+
const registeredModelIds = VIRTUAL_MODELS.map(m => m.id).join(', ');
|
|
1107
|
+
api.logger.info(`[MemoryX] 📋 [3] Before registerProvider - will register id=memoryx-proxy, model ids: [${registeredModelIds}]`);
|
|
1065
1108
|
api.registerProvider({
|
|
1066
1109
|
id: 'memoryx-proxy',
|
|
1067
1110
|
label: 'MemoryX Proxy Provider',
|
|
1068
1111
|
aliases: ['mx'],
|
|
1069
|
-
envVars: [],
|
|
1112
|
+
envVars: [],
|
|
1070
1113
|
models: {
|
|
1071
1114
|
baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
|
|
1072
1115
|
api: 'openai-completions',
|
|
1073
|
-
models:
|
|
1116
|
+
models: VIRTUAL_MODELS,
|
|
1074
1117
|
},
|
|
1075
1118
|
auth: [{
|
|
1076
1119
|
id: 'none',
|
|
@@ -1082,17 +1125,58 @@ export default {
|
|
|
1082
1125
|
}),
|
|
1083
1126
|
}],
|
|
1084
1127
|
});
|
|
1085
|
-
api.logger.info(
|
|
1086
|
-
//
|
|
1087
|
-
|
|
1128
|
+
api.logger.info(`[MemoryX] 📋 [3] After registerProvider - registered memoryx-proxy with models: [${registeredModelIds}]`);
|
|
1129
|
+
// 延迟再读一次 config,检查是否被后续逻辑覆盖
|
|
1130
|
+
setImmediate(() => {
|
|
1131
|
+
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'}`);
|
|
1132
|
+
if (api.config?.models?.providers) {
|
|
1133
|
+
const mx = api.config.models.providers['memoryx-proxy'];
|
|
1134
|
+
if (mx) {
|
|
1135
|
+
const ids = mx.models?.map((m) => m?.id ?? '?').join(', ') ?? 'none';
|
|
1136
|
+
api.logger.info(`[MemoryX] 📋 [4] setImmediate - memoryx-proxy still present, model ids: [${ids}]`);
|
|
1137
|
+
}
|
|
1138
|
+
else {
|
|
1139
|
+
api.logger.warn('[MemoryX] 📋 [4] setImmediate - memoryx-proxy MISSING from config (may have been overwritten)');
|
|
1140
|
+
}
|
|
1141
|
+
for (const [pid, p] of Object.entries(api.config.models.providers)) {
|
|
1142
|
+
const models = p?.models;
|
|
1143
|
+
const modelIds = models?.map((m) => m?.id ?? '?').join(', ') ?? 'none';
|
|
1144
|
+
api.logger.info(`[MemoryX] 📋 [4] setImmediate - provider "${pid}" models: [${modelIds}]`);
|
|
1145
|
+
}
|
|
1146
|
+
}
|
|
1147
|
+
});
|
|
1148
|
+
setTimeout(() => {
|
|
1149
|
+
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'}`);
|
|
1150
|
+
if (api.config?.models?.providers) {
|
|
1151
|
+
const mx = api.config.models.providers['memoryx-proxy'];
|
|
1152
|
+
if (mx) {
|
|
1153
|
+
const ids = mx.models?.map((m) => m?.id ?? '?').join(', ') ?? 'none';
|
|
1154
|
+
api.logger.info(`[MemoryX] 📋 [5] setTimeout(500ms) - memoryx-proxy still present, model ids: [${ids}]`);
|
|
1155
|
+
}
|
|
1156
|
+
else {
|
|
1157
|
+
api.logger.warn('[MemoryX] 📋 [5] setTimeout(500ms) - memoryx-proxy MISSING (overwritten after load)');
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
}, 500);
|
|
1161
|
+
// before_model_resolve 钩子 - 自动拦截所有请求
|
|
1088
1162
|
api.on('before_model_resolve', (event, ctx) => {
|
|
1089
1163
|
const originalModel = event.model || 'unknown';
|
|
1164
|
+
const eventKeys = event && typeof event === 'object' ? Object.keys(event).join(', ') : 'n/a';
|
|
1165
|
+
api.logger.info(`[MemoryX] 📋 [before_model_resolve] event keys: ${eventKeys} | original model: ${originalModel} → returning providerOverride=memoryx-proxy, modelOverride=auto`);
|
|
1090
1166
|
log(`[before_model_resolve] Intercepting: ${originalModel} → memoryx-proxy/auto`);
|
|
1091
1167
|
return {
|
|
1092
1168
|
providerOverride: 'memoryx-proxy',
|
|
1093
1169
|
modelOverride: 'auto'
|
|
1094
1170
|
};
|
|
1095
1171
|
});
|
|
1172
|
+
// resolve 之后:在 llm_input 打日志(此处应有已解析的 model/provider)
|
|
1173
|
+
api.on('llm_input', (event, ctx) => {
|
|
1174
|
+
const keys = event && typeof event === 'object' ? Object.keys(event).join(', ') : 'n/a';
|
|
1175
|
+
const model = event?.model ?? event?.resolvedModel ?? 'undefined';
|
|
1176
|
+
const provider = event?.provider ?? event?.resolvedProvider ?? 'undefined';
|
|
1177
|
+
api.logger.info(`[MemoryX] 📋 [after resolve? llm_input] event keys: ${keys} | model: ${model} | provider: ${provider}`);
|
|
1178
|
+
log(`[llm_input] model=${model} provider=${provider}`);
|
|
1179
|
+
});
|
|
1096
1180
|
api.logger.info('[MemoryX] 🔄 Auto-intercept enabled - ALL requests go through MemoryX Proxy');
|
|
1097
1181
|
api.logger.info(`[MemoryX] ✅ Plugin v${PLUGIN_VERSION} ready! Your conversations will be remembered automatically.`);
|
|
1098
1182
|
// Async check and show portal link after SDK initializes
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED