@t0ken.ai/memoryx-openclaw-plugin 2.2.56 → 2.2.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -163
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -168,6 +168,10 @@ Memories are categorized by the server:
|
|
|
168
168
|
- Minimum 2 characters per message
|
|
169
169
|
- Short messages like "ok", "thanks" are skipped
|
|
170
170
|
|
|
171
|
+
## How the proxy works (no virtual model)
|
|
172
|
+
|
|
173
|
+
The plugin does **not** add a virtual model. It redirects your existing provider's request URL to a local Sidecar (port 3335). You keep using your configured model (e.g. `zai/glm-5`); the request is sent to the Sidecar with a header identifying the real provider, then the Sidecar forwards to the MemoryX server with your credentials. No need to add `memoryx-proxy` to config or auth.
|
|
174
|
+
|
|
171
175
|
## License
|
|
172
176
|
|
|
173
177
|
MIT
|
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,wBA44BE;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.57";
|
|
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;
|
|
@@ -822,19 +822,6 @@ export default {
|
|
|
822
822
|
log(`[Proxy] Found ${providerCredentials.size} providers in config`);
|
|
823
823
|
const defaultProvider = getDefaultModelAndProvider(providerCredentials);
|
|
824
824
|
log(`[Proxy] Default: ${defaultProvider.provider}/${defaultProvider.model}`);
|
|
825
|
-
// 虚拟模型定义:只使用 id='auto',让 OpenClaw 用 provider+'/'+model.id 得到 fullId 'memoryx-proxy/auto'
|
|
826
|
-
// (若用 id='memoryx-proxy/auto',部分实现会拼成 'memoryx-proxy/memoryx-proxy/auto' 导致找不到)
|
|
827
|
-
const VIRTUAL_MODEL = {
|
|
828
|
-
id: 'auto',
|
|
829
|
-
name: 'MemoryX Auto Router',
|
|
830
|
-
api: 'openai-completions',
|
|
831
|
-
reasoning: true,
|
|
832
|
-
input: ['text', 'image'],
|
|
833
|
-
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
834
|
-
contextWindow: 200000,
|
|
835
|
-
maxTokens: 16384,
|
|
836
|
-
};
|
|
837
|
-
const VIRTUAL_MODELS = [VIRTUAL_MODEL];
|
|
838
825
|
const SIDECAR_PORT = 3335;
|
|
839
826
|
const PROXY_URL = (pluginConfig?.apiBaseUrl || DEFAULT_API_BASE) + '/openclaw/proxy/chat/completions';
|
|
840
827
|
class SidecarServer {
|
|
@@ -922,13 +909,24 @@ export default {
|
|
|
922
909
|
res.end('Invalid JSON');
|
|
923
910
|
return;
|
|
924
911
|
}
|
|
925
|
-
//
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
if (
|
|
930
|
-
|
|
912
|
+
// 真实 provider:来自请求头(插件把用户配置的 baseUrl 改成了 Sidecar 并带上此头)
|
|
913
|
+
const rawProvider = req.headers['x-memoryx-real-provider'];
|
|
914
|
+
let provider = rawProvider?.trim() || '';
|
|
915
|
+
let model = openaiRequest.model || this.defaultProvider.model;
|
|
916
|
+
if (!provider && model && model.includes('/')) {
|
|
917
|
+
const idx = model.indexOf('/');
|
|
918
|
+
provider = model.slice(0, idx);
|
|
919
|
+
model = model.slice(idx + 1);
|
|
920
|
+
}
|
|
921
|
+
if (!provider || !this.credentials.has(provider)) {
|
|
922
|
+
provider = this.defaultProvider.provider;
|
|
923
|
+
model = model || this.defaultProvider.model;
|
|
924
|
+
}
|
|
925
|
+
if (!model && this.credentials.has(provider)) {
|
|
926
|
+
const creds = this.credentials.get(provider);
|
|
927
|
+
model = creds.models?.[0]?.id || creds.models?.[0]?.name || this.defaultProvider.model;
|
|
931
928
|
}
|
|
929
|
+
log(`[${requestId}] Model: ${openaiRequest.model}, Stream: ${openaiRequest.stream} → proxy provider=${provider}, model=${model}`);
|
|
932
930
|
// 获取 SDK 信息(API Key 和 agent_id)
|
|
933
931
|
const sdk = await getSDK(pluginConfig);
|
|
934
932
|
const accountInfo = await sdk.getAccountInfo();
|
|
@@ -940,7 +938,7 @@ export default {
|
|
|
940
938
|
res.end(JSON.stringify({ error: 'MemoryX not initialized' }));
|
|
941
939
|
return;
|
|
942
940
|
}
|
|
943
|
-
//
|
|
941
|
+
// 构建发送到服务端的请求(使用请求对应的真实 provider/model)
|
|
944
942
|
const credentialsObj = {};
|
|
945
943
|
for (const [id, creds] of this.credentials) {
|
|
946
944
|
credentialsObj[id] = {
|
|
@@ -949,23 +947,21 @@ export default {
|
|
|
949
947
|
models: creds.models
|
|
950
948
|
};
|
|
951
949
|
}
|
|
952
|
-
// 提取搜索 query(最后一条用户消息)
|
|
953
950
|
const messages = openaiRequest.messages || [];
|
|
954
951
|
const lastUserMsg = [...messages].reverse().find((m) => m.role === 'user');
|
|
955
952
|
const searchQuery = typeof lastUserMsg?.content === 'string'
|
|
956
953
|
? lastUserMsg.content
|
|
957
954
|
: '';
|
|
958
955
|
const proxyRequestBody = {
|
|
959
|
-
provider
|
|
960
|
-
model
|
|
961
|
-
availableProviders: this.availableProviders,
|
|
956
|
+
provider,
|
|
957
|
+
model,
|
|
958
|
+
availableProviders: this.availableProviders,
|
|
962
959
|
credentials: credentialsObj,
|
|
963
960
|
body: openaiRequest,
|
|
964
|
-
searchQuery
|
|
961
|
+
searchQuery,
|
|
965
962
|
agent_id: agentId
|
|
966
963
|
};
|
|
967
|
-
log(`[${requestId}] Forwarding to ${PROXY_URL}`);
|
|
968
|
-
log(`[${requestId}] Default: ${this.defaultProvider.provider}/${this.defaultProvider.model}, Available: ${this.availableProviders.map(p => p.provider).join(', ')}`);
|
|
964
|
+
log(`[${requestId}] Forwarding to ${PROXY_URL} (${provider}/${model})`);
|
|
969
965
|
// 发送到 MemoryX 服务端代理
|
|
970
966
|
const proxyResponse = await fetch(PROXY_URL, {
|
|
971
967
|
method: 'POST',
|
|
@@ -1040,145 +1036,28 @@ export default {
|
|
|
1040
1036
|
}
|
|
1041
1037
|
});
|
|
1042
1038
|
// =========================================================================
|
|
1043
|
-
//
|
|
1044
|
-
//
|
|
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", ... }] }
|
|
1039
|
+
// 不改虚拟模型:把用户已配置的 provider 的 baseUrl 改成本地 Sidecar,请求头带上真实 provider
|
|
1040
|
+
// 用户继续用 zai/glm-5 等,请求会发到 Sidecar,Sidecar 根据 X-MemoryX-Real-Provider 转发
|
|
1049
1041
|
// =========================================================================
|
|
1050
|
-
|
|
1051
|
-
|
|
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'}`);
|
|
1042
|
+
const sidecarBase = `http://localhost:${SIDECAR_PORT}/v1`;
|
|
1043
|
+
const realProviderHeader = 'X-MemoryX-Real-Provider';
|
|
1053
1044
|
if (api.config?.models?.providers) {
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
api.logger.info('[MemoryX] ✅ Injected memoryx-proxy into config.models.providers');
|
|
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
|
-
}
|
|
1073
|
-
}
|
|
1074
|
-
else if (api.config) {
|
|
1075
|
-
if (!api.config.models) {
|
|
1076
|
-
api.config.models = {};
|
|
1077
|
-
}
|
|
1078
|
-
if (!api.config.models.providers) {
|
|
1079
|
-
api.config.models.providers = {};
|
|
1045
|
+
const providers = api.config.models.providers;
|
|
1046
|
+
for (const providerId of providerCredentials.keys()) {
|
|
1047
|
+
if (providerId === 'memoryx-proxy')
|
|
1048
|
+
continue;
|
|
1049
|
+
const p = providers[providerId];
|
|
1050
|
+
if (!p || typeof p !== 'object')
|
|
1051
|
+
continue;
|
|
1052
|
+
p.baseUrl = sidecarBase;
|
|
1053
|
+
if (!p.headers)
|
|
1054
|
+
p.headers = {};
|
|
1055
|
+
p.headers[realProviderHeader] = providerId;
|
|
1056
|
+
log(`[Proxy] Redirected provider "${providerId}" baseUrl → Sidecar, header ${realProviderHeader}=${providerId}`);
|
|
1080
1057
|
}
|
|
1081
|
-
api.
|
|
1082
|
-
baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
|
|
1083
|
-
api: 'openai-completions',
|
|
1084
|
-
models: VIRTUAL_MODELS
|
|
1085
|
-
};
|
|
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(', ')}]`);
|
|
1058
|
+
api.logger.info(`[MemoryX] ✅ Redirected ${providerCredentials.size} provider(s) to Sidecar (no virtual model). Use your configured model as usual.`);
|
|
1088
1059
|
}
|
|
1089
|
-
|
|
1090
|
-
api.logger.warn('[MemoryX] ⚠️ api.config not available - resolveModel may fail to find memoryx-proxy');
|
|
1091
|
-
}
|
|
1092
|
-
// 注入 agents.defaults:必须用完整 model id "provider/model",否则 model-selection 会把 "auto" 当成无 provider 并回退到 anthropic/auto
|
|
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.model = 'memoryx-proxy/auto';
|
|
1102
|
-
agents.defaults.provider = 'memoryx-proxy';
|
|
1103
|
-
api.logger.info('[MemoryX] 📋 Injected agents.defaults: model=memoryx-proxy/auto, provider=memoryx-proxy');
|
|
1104
|
-
}
|
|
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}]`);
|
|
1108
|
-
api.registerProvider({
|
|
1109
|
-
id: 'memoryx-proxy',
|
|
1110
|
-
label: 'MemoryX Proxy Provider',
|
|
1111
|
-
aliases: ['mx'],
|
|
1112
|
-
envVars: [],
|
|
1113
|
-
models: {
|
|
1114
|
-
baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
|
|
1115
|
-
api: 'openai-completions',
|
|
1116
|
-
models: VIRTUAL_MODELS,
|
|
1117
|
-
},
|
|
1118
|
-
auth: [{
|
|
1119
|
-
id: 'none',
|
|
1120
|
-
label: 'No authentication needed (proxy)',
|
|
1121
|
-
kind: 'custom',
|
|
1122
|
-
run: async () => ({
|
|
1123
|
-
profiles: [],
|
|
1124
|
-
notes: ['MemoryX proxies through configured providers']
|
|
1125
|
-
}),
|
|
1126
|
-
}],
|
|
1127
|
-
});
|
|
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 钩子 - 自动拦截所有请求
|
|
1162
|
-
api.on('before_model_resolve', (event, ctx) => {
|
|
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`);
|
|
1166
|
-
log(`[before_model_resolve] Intercepting: ${originalModel} → memoryx-proxy/auto`);
|
|
1167
|
-
return {
|
|
1168
|
-
providerOverride: 'memoryx-proxy',
|
|
1169
|
-
modelOverride: 'auto'
|
|
1170
|
-
};
|
|
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
|
-
});
|
|
1180
|
-
api.logger.info('[MemoryX] 🔄 Auto-intercept enabled - ALL requests go through MemoryX Proxy');
|
|
1181
|
-
api.logger.info(`[MemoryX] ✅ Plugin v${PLUGIN_VERSION} ready! Your conversations will be remembered automatically.`);
|
|
1060
|
+
api.logger.info(`[MemoryX] ✅ Plugin v${PLUGIN_VERSION} ready! Requests go through MemoryX proxy with your configured model.`);
|
|
1182
1061
|
// Async check and show portal link after SDK initializes
|
|
1183
1062
|
setImmediate(async () => {
|
|
1184
1063
|
try {
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED