@dofe/infra-clients 0.1.38 → 0.1.40

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.
Files changed (109) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/internal/mlflow/mlflow.client.d.ts +44 -0
  6. package/dist/internal/mlflow/mlflow.client.d.ts.map +1 -0
  7. package/dist/internal/mlflow/mlflow.client.js +184 -0
  8. package/dist/internal/mlflow/mlflow.client.js.map +1 -0
  9. package/dist/internal/mlflow/mlflow.module.d.ts +3 -0
  10. package/dist/internal/mlflow/mlflow.module.d.ts.map +1 -0
  11. package/dist/internal/mlflow/mlflow.module.js +23 -0
  12. package/dist/internal/mlflow/mlflow.module.js.map +1 -0
  13. package/dist/internal/model-research-proxy/anthropic-proxy-research.client.d.ts +52 -0
  14. package/dist/internal/model-research-proxy/anthropic-proxy-research.client.d.ts.map +1 -0
  15. package/dist/internal/model-research-proxy/anthropic-proxy-research.client.js +174 -0
  16. package/dist/internal/model-research-proxy/anthropic-proxy-research.client.js.map +1 -0
  17. package/dist/internal/model-research-proxy/anthropic-proxy-research.module.d.ts +3 -0
  18. package/dist/internal/model-research-proxy/anthropic-proxy-research.module.d.ts.map +1 -0
  19. package/dist/internal/model-research-proxy/anthropic-proxy-research.module.js +30 -0
  20. package/dist/internal/model-research-proxy/anthropic-proxy-research.module.js.map +1 -0
  21. package/dist/internal/model-research-proxy/index.d.ts +6 -0
  22. package/dist/internal/model-research-proxy/index.d.ts.map +1 -0
  23. package/dist/internal/model-research-proxy/index.js +24 -0
  24. package/dist/internal/model-research-proxy/index.js.map +1 -0
  25. package/dist/internal/model-verify/index.d.ts +4 -0
  26. package/dist/internal/model-verify/index.d.ts.map +1 -0
  27. package/dist/internal/model-verify/index.js +26 -0
  28. package/dist/internal/model-verify/index.js.map +1 -0
  29. package/dist/internal/model-verify/model-verify.client.d.ts +77 -0
  30. package/dist/internal/model-verify/model-verify.client.d.ts.map +1 -0
  31. package/dist/internal/model-verify/model-verify.client.js +324 -0
  32. package/dist/internal/model-verify/model-verify.client.js.map +1 -0
  33. package/dist/internal/openclaw/docker-exec.service.d.ts +132 -0
  34. package/dist/internal/openclaw/docker-exec.service.d.ts.map +1 -0
  35. package/dist/internal/openclaw/docker-exec.service.js +544 -0
  36. package/dist/internal/openclaw/docker-exec.service.js.map +1 -0
  37. package/dist/internal/openclaw/index.d.ts +14 -0
  38. package/dist/internal/openclaw/index.d.ts.map +1 -0
  39. package/dist/internal/openclaw/index.js +32 -0
  40. package/dist/internal/openclaw/index.js.map +1 -0
  41. package/dist/internal/openclaw/openclaw-agent-coordination.client.d.ts +73 -0
  42. package/dist/internal/openclaw/openclaw-agent-coordination.client.d.ts.map +1 -0
  43. package/dist/internal/openclaw/openclaw-agent-coordination.client.js +249 -0
  44. package/dist/internal/openclaw/openclaw-agent-coordination.client.js.map +1 -0
  45. package/dist/internal/openclaw/openclaw-context-status.client.d.ts +66 -0
  46. package/dist/internal/openclaw/openclaw-context-status.client.d.ts.map +1 -0
  47. package/dist/internal/openclaw/openclaw-context-status.client.js +164 -0
  48. package/dist/internal/openclaw/openclaw-context-status.client.js.map +1 -0
  49. package/dist/internal/openclaw/openclaw-cron.client.d.ts +61 -0
  50. package/dist/internal/openclaw/openclaw-cron.client.d.ts.map +1 -0
  51. package/dist/internal/openclaw/openclaw-cron.client.js +416 -0
  52. package/dist/internal/openclaw/openclaw-cron.client.js.map +1 -0
  53. package/dist/internal/openclaw/openclaw-gateway.client.d.ts +41 -0
  54. package/dist/internal/openclaw/openclaw-gateway.client.d.ts.map +1 -0
  55. package/dist/internal/openclaw/openclaw-gateway.client.js +175 -0
  56. package/dist/internal/openclaw/openclaw-gateway.client.js.map +1 -0
  57. package/dist/internal/openclaw/openclaw-skill-sync.client.d.ts +222 -0
  58. package/dist/internal/openclaw/openclaw-skill-sync.client.d.ts.map +1 -0
  59. package/dist/internal/openclaw/openclaw-skill-sync.client.js +720 -0
  60. package/dist/internal/openclaw/openclaw-skill-sync.client.js.map +1 -0
  61. package/dist/internal/openclaw/openclaw.client.d.ts +602 -0
  62. package/dist/internal/openclaw/openclaw.client.d.ts.map +1 -0
  63. package/dist/internal/openclaw/openclaw.client.js +3062 -0
  64. package/dist/internal/openclaw/openclaw.client.js.map +1 -0
  65. package/dist/internal/openclaw/openclaw.module.d.ts +3 -0
  66. package/dist/internal/openclaw/openclaw.module.d.ts.map +1 -0
  67. package/dist/internal/openclaw/openclaw.module.js +62 -0
  68. package/dist/internal/openclaw/openclaw.module.js.map +1 -0
  69. package/dist/internal/openclaw/skill-translation.service.d.ts +39 -0
  70. package/dist/internal/openclaw/skill-translation.service.d.ts.map +1 -0
  71. package/dist/internal/openclaw/skill-translation.service.js +217 -0
  72. package/dist/internal/openclaw/skill-translation.service.js.map +1 -0
  73. package/dist/internal/openclaw/types/cron.types.d.ts +112 -0
  74. package/dist/internal/openclaw/types/cron.types.d.ts.map +1 -0
  75. package/dist/internal/openclaw/types/cron.types.js +9 -0
  76. package/dist/internal/openclaw/types/cron.types.js.map +1 -0
  77. package/dist/internal/provider-verify/index.d.ts +6 -0
  78. package/dist/internal/provider-verify/index.d.ts.map +1 -0
  79. package/dist/internal/provider-verify/index.js +24 -0
  80. package/dist/internal/provider-verify/index.js.map +1 -0
  81. package/dist/internal/provider-verify/provider-verify.client.d.ts +55 -0
  82. package/dist/internal/provider-verify/provider-verify.client.d.ts.map +1 -0
  83. package/dist/internal/provider-verify/provider-verify.client.js +284 -0
  84. package/dist/internal/provider-verify/provider-verify.client.js.map +1 -0
  85. package/dist/internal/provider-verify/provider-verify.module.d.ts +3 -0
  86. package/dist/internal/provider-verify/provider-verify.module.d.ts.map +1 -0
  87. package/dist/internal/provider-verify/provider-verify.module.js +28 -0
  88. package/dist/internal/provider-verify/provider-verify.module.js.map +1 -0
  89. package/dist/internal/sso/index.d.ts +5 -0
  90. package/dist/internal/sso/index.d.ts.map +1 -0
  91. package/dist/internal/sso/index.js +12 -0
  92. package/dist/internal/sso/index.js.map +1 -0
  93. package/dist/internal/sso/sso-auth.client.d.ts +33 -0
  94. package/dist/internal/sso/sso-auth.client.d.ts.map +1 -0
  95. package/dist/internal/sso/sso-auth.client.js +89 -0
  96. package/dist/internal/sso/sso-auth.client.js.map +1 -0
  97. package/dist/internal/sso/sso-message-proxy.service.d.ts +11 -0
  98. package/dist/internal/sso/sso-message-proxy.service.d.ts.map +1 -0
  99. package/dist/internal/sso/sso-message-proxy.service.js +51 -0
  100. package/dist/internal/sso/sso-message-proxy.service.js.map +1 -0
  101. package/dist/internal/sso/sso-message.client.d.ts +12 -0
  102. package/dist/internal/sso/sso-message.client.d.ts.map +1 -0
  103. package/dist/internal/sso/sso-message.client.js +62 -0
  104. package/dist/internal/sso/sso-message.client.js.map +1 -0
  105. package/dist/internal/sso/sso.module.d.ts +3 -0
  106. package/dist/internal/sso/sso.module.d.ts.map +1 -0
  107. package/dist/internal/sso/sso.module.js +26 -0
  108. package/dist/internal/sso/sso.module.js.map +1 -0
  109. package/package.json +110 -6
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ModelVerifyClient = exports.ModelVerifyClientModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const axios_1 = require("@nestjs/axios");
12
+ const model_verify_client_1 = require("./model-verify.client");
13
+ let ModelVerifyClientModule = class ModelVerifyClientModule {
14
+ };
15
+ exports.ModelVerifyClientModule = ModelVerifyClientModule;
16
+ exports.ModelVerifyClientModule = ModelVerifyClientModule = __decorate([
17
+ (0, common_1.Module)({
18
+ imports: [axios_1.HttpModule.register({ timeout: 15000 })],
19
+ providers: [model_verify_client_1.ModelVerifyClient],
20
+ exports: [model_verify_client_1.ModelVerifyClient],
21
+ })
22
+ ], ModelVerifyClientModule);
23
+ // 导出 Client 类供直接使用
24
+ var model_verify_client_2 = require("./model-verify.client");
25
+ Object.defineProperty(exports, "ModelVerifyClient", { enumerable: true, get: function () { return model_verify_client_2.ModelVerifyClient; } });
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/model-verify/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,yCAA2C;AAC3C,+DAA0D;AAOnD,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CAAG,CAAA;AAA1B,0DAAuB;kCAAvB,uBAAuB;IALnC,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,kBAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,SAAS,EAAE,CAAC,uCAAiB,CAAC;QAC9B,OAAO,EAAE,CAAC,uCAAiB,CAAC;KAC7B,CAAC;GACW,uBAAuB,CAAG;AAEvC,mBAAmB;AACnB,6DAAqE;AAA5D,wHAAA,iBAAiB,OAAA"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Model Verification Client
3
+ * 封装模型 API 验证和模型列表获取
4
+ */
5
+ import { HttpService } from '@nestjs/axios';
6
+ /**
7
+ * 模型信息(包含 description)
8
+ */
9
+ export interface ModelInfo {
10
+ id: string;
11
+ description?: string;
12
+ }
13
+ export declare class ModelVerifyClient {
14
+ private readonly httpService;
15
+ private readonly TIMEOUT_MS;
16
+ constructor(httpService: HttpService);
17
+ /**
18
+ * 判断是否是 DMXAPI 等第三方聚合平台
19
+ * 基于 baseUrl 的域名进行匹配
20
+ */
21
+ private isAggregatorPlatform;
22
+ /**
23
+ * 获取 API 请求的 headers
24
+ * 根据平台类型动态调整:
25
+ * - DMXAPI 等聚合平台:Authorization 不需要 Bearer,需要 Rix-Api-User
26
+ * - 标准 OpenAI 兼容 API:Authorization 使用 Bearer 前缀
27
+ */
28
+ private getHeaders;
29
+ /**
30
+ * 从 OpenAI 兼容 API 获取模型列表
31
+ * 支持 DMXAPI 等第三方聚合平台的特殊 headers
32
+ */
33
+ fetchOpenAICompatibleModels(baseUrl: string, apiKey: string): Promise<ModelInfo[]>;
34
+ /**
35
+ * 从 Gemini API 获取模型列表
36
+ */
37
+ fetchGeminiModels(baseUrl: string, apiKey: string): Promise<ModelInfo[]>;
38
+ /**
39
+ * 验证 Chat 模型 (OpenAI/Anthropic)
40
+ * 支持 DMXAPI 等第三方聚合平台
41
+ */
42
+ verifyChatModel(apiHost: string, apiKey: string, model: string, apiType: 'openai' | 'anthropic'): Promise<boolean>;
43
+ /**
44
+ * 验证 Gemini 模型
45
+ */
46
+ verifyGeminiModel(apiHost: string, apiKey: string, model: string): Promise<boolean>;
47
+ /**
48
+ * 验证 Azure OpenAI 模型
49
+ */
50
+ verifyAzureOpenAIModel(apiHost: string, apiKey: string, model: string): Promise<boolean>;
51
+ /**
52
+ * 验证图像生成模型
53
+ * 支持 DMXAPI 等第三方聚合平台
54
+ */
55
+ verifyImageModel(apiHost: string, apiKey: string, model: string, apiType: string): Promise<boolean>;
56
+ /**
57
+ * 验证 Embedding 模型
58
+ * 支持 DMXAPI 等第三方聚合平台
59
+ */
60
+ verifyEmbeddingModel(apiHost: string, apiKey: string, model: string, apiType: string): Promise<boolean>;
61
+ /**
62
+ * 验证 TTS 模型
63
+ * 支持 DMXAPI 等第三方聚合平台
64
+ */
65
+ verifyTTSModel(apiHost: string, apiKey: string, model: string, apiType: string): Promise<boolean>;
66
+ /**
67
+ * 验证 Rerank 模型
68
+ * 支持 DMXAPI 等第三方聚合平台
69
+ */
70
+ verifyRerankModel(apiHost: string, apiKey: string, model: string, apiType: string): Promise<boolean>;
71
+ /**
72
+ * 验证 Moderation 模型
73
+ * 支持 DMXAPI 等第三方聚合平台
74
+ */
75
+ verifyModerationModel(apiHost: string, apiKey: string, model: string, apiType: string): Promise<boolean>;
76
+ }
77
+ //# sourceMappingURL=model-verify.client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-verify.client.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/model-verify/model-verify.client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA4B5C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAaD,qBACa,iBAAiB;IAGhB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAFxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAEP,WAAW,EAAE,WAAW;IAErD;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAiBlB;;;OAGG;IACG,2BAA2B,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,EAAE,CAAC;IA8BvB;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,EAAE,CAAC;IAkCvB;;;OAGG;IACG,eAAe,CACnB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,QAAQ,GAAG,WAAW,GAC9B,OAAO,CAAC,OAAO,CAAC;IA6CnB;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IA0BnB;;OAEG;IACG,sBAAsB,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IA+BnB;;;OAGG;IACG,gBAAgB,CACpB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IAqCnB;;;OAGG;IACG,oBAAoB,CACxB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IA2BnB;;;OAGG;IACG,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IAoCnB;;;OAGG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IAoCnB;;;OAGG;IACG,qBAAqB,CACzB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;CA0BpB"}
@@ -0,0 +1,324 @@
1
+ "use strict";
2
+ /**
3
+ * Model Verification Client
4
+ * 封装模型 API 验证和模型列表获取
5
+ */
6
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
7
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
8
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
10
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
11
+ };
12
+ var __metadata = (this && this.__metadata) || function (k, v) {
13
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.ModelVerifyClient = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const axios_1 = require("@nestjs/axios");
19
+ const rxjs_1 = require("rxjs");
20
+ /**
21
+ * DMXAPI 等第三方聚合平台的域名特征
22
+ * 这些平台需要特殊的 headers:
23
+ * - Authorization 不需要 Bearer 前缀
24
+ * - 需要 Rix-Api-User header
25
+ */
26
+ const AGGREGATOR_PLATFORM_DOMAINS = [
27
+ 'dmxapi.com',
28
+ 'dmxapi.cn',
29
+ 'api.dmxapi.com',
30
+ ];
31
+ let ModelVerifyClient = class ModelVerifyClient {
32
+ httpService;
33
+ TIMEOUT_MS = 15000;
34
+ constructor(httpService) {
35
+ this.httpService = httpService;
36
+ }
37
+ /**
38
+ * 判断是否是 DMXAPI 等第三方聚合平台
39
+ * 基于 baseUrl 的域名进行匹配
40
+ */
41
+ isAggregatorPlatform(baseUrl) {
42
+ try {
43
+ const url = new URL(baseUrl);
44
+ const hostname = url.hostname.toLowerCase();
45
+ return AGGREGATOR_PLATFORM_DOMAINS.some((domain) => hostname.includes(domain));
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ /**
52
+ * 获取 API 请求的 headers
53
+ * 根据平台类型动态调整:
54
+ * - DMXAPI 等聚合平台:Authorization 不需要 Bearer,需要 Rix-Api-User
55
+ * - 标准 OpenAI 兼容 API:Authorization 使用 Bearer 前缀
56
+ */
57
+ getHeaders(baseUrl, apiKey) {
58
+ if (this.isAggregatorPlatform(baseUrl)) {
59
+ // DMXAPI 等聚合平台的特殊 headers
60
+ const userId = process.env.DMXAPI_USER_ID || '20700';
61
+ return {
62
+ Authorization: apiKey, // 不需要 Bearer 前缀
63
+ Accept: 'application/json',
64
+ 'Rix-Api-User': userId,
65
+ };
66
+ }
67
+ // 标准 OpenAI 兼容 API
68
+ return {
69
+ Authorization: `Bearer ${apiKey}`,
70
+ };
71
+ }
72
+ /**
73
+ * 从 OpenAI 兼容 API 获取模型列表
74
+ * 支持 DMXAPI 等第三方聚合平台的特殊 headers
75
+ */
76
+ async fetchOpenAICompatibleModels(baseUrl, apiKey) {
77
+ try {
78
+ const headers = this.getHeaders(baseUrl, apiKey);
79
+ const response = await (0, rxjs_1.firstValueFrom)(this.httpService
80
+ .get(`${baseUrl}/models`, {
81
+ headers,
82
+ })
83
+ .pipe((0, rxjs_1.timeout)(10000), (0, rxjs_1.catchError)(() => (0, rxjs_1.of)({ status: 500, data: {} }))));
84
+ if (response.status === 200 &&
85
+ 'data' in response.data &&
86
+ response.data.data) {
87
+ return response.data.data.map((m) => ({
88
+ id: m.id,
89
+ description: m.description,
90
+ }));
91
+ }
92
+ return [];
93
+ }
94
+ catch {
95
+ return [];
96
+ }
97
+ }
98
+ /**
99
+ * 从 Gemini API 获取模型列表
100
+ */
101
+ async fetchGeminiModels(baseUrl, apiKey) {
102
+ try {
103
+ const response = await (0, rxjs_1.firstValueFrom)(this.httpService
104
+ .get(`${baseUrl}/v1beta/models?key=${apiKey}`)
105
+ .pipe((0, rxjs_1.timeout)(10000), (0, rxjs_1.catchError)(() => (0, rxjs_1.of)({ status: 500, data: {} }))));
106
+ if (response.status === 200 &&
107
+ 'models' in response.data &&
108
+ response.data.models) {
109
+ return response.data.models
110
+ .filter((m) => m.supportedGenerationMethods?.includes('generateContent'))
111
+ .map((m) => ({
112
+ id: m.name.replace('models/', ''),
113
+ description: m.description,
114
+ }))
115
+ .slice(0, 20);
116
+ }
117
+ return [];
118
+ }
119
+ catch {
120
+ return [];
121
+ }
122
+ }
123
+ /**
124
+ * 验证 Chat 模型 (OpenAI/Anthropic)
125
+ * 支持 DMXAPI 等第三方聚合平台
126
+ */
127
+ async verifyChatModel(apiHost, apiKey, model, apiType) {
128
+ const isAnthropic = apiType === 'anthropic';
129
+ const url = isAnthropic
130
+ ? `${apiHost}/v1/messages`
131
+ : `${apiHost}/chat/completions`;
132
+ // 判断是否是聚合平台,使用对应的 headers
133
+ const headers = isAnthropic
134
+ ? {
135
+ 'x-api-key': apiKey,
136
+ 'anthropic-version': '2023-06-01',
137
+ 'Content-Type': 'application/json',
138
+ }
139
+ : {
140
+ ...this.getHeaders(apiHost, apiKey),
141
+ 'Content-Type': 'application/json',
142
+ };
143
+ try {
144
+ const response = await (0, rxjs_1.firstValueFrom)(this.httpService
145
+ .post(url, {
146
+ model,
147
+ max_tokens: 1,
148
+ messages: [{ role: 'user', content: 'Hi' }],
149
+ }, { headers })
150
+ .pipe((0, rxjs_1.timeout)(this.TIMEOUT_MS), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
151
+ // 200 = 成功, 429 = 限流但有效
152
+ return response.status === 200 || response.status === 429;
153
+ }
154
+ catch {
155
+ return true; // 其他错误视为可用
156
+ }
157
+ }
158
+ /**
159
+ * 验证 Gemini 模型
160
+ */
161
+ async verifyGeminiModel(apiHost, apiKey, model) {
162
+ try {
163
+ const response = await (0, rxjs_1.firstValueFrom)(this.httpService
164
+ .post(`${apiHost}/v1beta/models/${model}:generateContent?key=${apiKey}`, {
165
+ contents: [{ parts: [{ text: 'Hi' }] }],
166
+ generationConfig: { maxOutputTokens: 1 },
167
+ }, { headers: { 'Content-Type': 'application/json' } })
168
+ .pipe((0, rxjs_1.timeout)(this.TIMEOUT_MS), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
169
+ return response.status === 200 || response.status === 429;
170
+ }
171
+ catch {
172
+ return true;
173
+ }
174
+ }
175
+ /**
176
+ * 验证 Azure OpenAI 模型
177
+ */
178
+ async verifyAzureOpenAIModel(apiHost, apiKey, model) {
179
+ try {
180
+ const response = await (0, rxjs_1.firstValueFrom)(this.httpService
181
+ .post(`${apiHost}/openai/deployments/${model}/chat/completions?api-version=2024-02-15-preview`, {
182
+ messages: [{ role: 'user', content: 'Hi' }],
183
+ max_tokens: 1,
184
+ }, {
185
+ headers: {
186
+ 'api-key': apiKey,
187
+ 'Content-Type': 'application/json',
188
+ },
189
+ })
190
+ .pipe((0, rxjs_1.timeout)(this.TIMEOUT_MS), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
191
+ return response.status === 200 || response.status === 429;
192
+ }
193
+ catch {
194
+ return true;
195
+ }
196
+ }
197
+ /**
198
+ * 验证图像生成模型
199
+ * 支持 DMXAPI 等第三方聚合平台
200
+ */
201
+ async verifyImageModel(apiHost, apiKey, model, apiType) {
202
+ const headers = apiType === 'anthropic'
203
+ ? { 'x-api-key': apiKey, 'Content-Type': 'application/json' }
204
+ : {
205
+ ...this.getHeaders(apiHost, apiKey),
206
+ 'Content-Type': 'application/json',
207
+ };
208
+ try {
209
+ const response = await (0, rxjs_1.firstValueFrom)(this.httpService
210
+ .post(`${apiHost}/images/generations`, {
211
+ model,
212
+ prompt: 'A dot',
213
+ n: 1,
214
+ size: '256x256',
215
+ response_format: 'url',
216
+ }, { headers })
217
+ .pipe((0, rxjs_1.timeout)(30000), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
218
+ return response.status === 200 || response.status === 429;
219
+ }
220
+ catch {
221
+ return true;
222
+ }
223
+ }
224
+ /**
225
+ * 验证 Embedding 模型
226
+ * 支持 DMXAPI 等第三方聚合平台
227
+ */
228
+ async verifyEmbeddingModel(apiHost, apiKey, model, apiType) {
229
+ const headers = apiType === 'anthropic'
230
+ ? { 'x-api-key': apiKey, 'Content-Type': 'application/json' }
231
+ : {
232
+ ...this.getHeaders(apiHost, apiKey),
233
+ 'Content-Type': 'application/json',
234
+ };
235
+ try {
236
+ const response = await (0, rxjs_1.firstValueFrom)(this.httpService
237
+ .post(`${apiHost}/embeddings`, { model, input: 'test' }, { headers })
238
+ .pipe((0, rxjs_1.timeout)(this.TIMEOUT_MS), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
239
+ return response.status === 200 || response.status === 429;
240
+ }
241
+ catch {
242
+ return true;
243
+ }
244
+ }
245
+ /**
246
+ * 验证 TTS 模型
247
+ * 支持 DMXAPI 等第三方聚合平台
248
+ */
249
+ async verifyTTSModel(apiHost, apiKey, model, apiType) {
250
+ const headers = apiType === 'anthropic'
251
+ ? { 'x-api-key': apiKey, 'Content-Type': 'application/json' }
252
+ : {
253
+ ...this.getHeaders(apiHost, apiKey),
254
+ 'Content-Type': 'application/json',
255
+ };
256
+ try {
257
+ const response = await (0, rxjs_1.firstValueFrom)(this.httpService
258
+ .post(`${apiHost}/audio/speech`, {
259
+ model,
260
+ input: 'Hi',
261
+ voice: 'alloy',
262
+ response_format: 'mp3',
263
+ }, { headers })
264
+ .pipe((0, rxjs_1.timeout)(this.TIMEOUT_MS), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
265
+ return response.status === 200 || response.status === 429;
266
+ }
267
+ catch {
268
+ return true;
269
+ }
270
+ }
271
+ /**
272
+ * 验证 Rerank 模型
273
+ * 支持 DMXAPI 等第三方聚合平台
274
+ */
275
+ async verifyRerankModel(apiHost, apiKey, model, apiType) {
276
+ const headers = apiType === 'anthropic'
277
+ ? { 'x-api-key': apiKey, 'Content-Type': 'application/json' }
278
+ : {
279
+ ...this.getHeaders(apiHost, apiKey),
280
+ 'Content-Type': 'application/json',
281
+ };
282
+ try {
283
+ const response = await (0, rxjs_1.firstValueFrom)(this.httpService
284
+ .post(`${apiHost}/rerank`, {
285
+ model,
286
+ query: 'test',
287
+ documents: ['test'],
288
+ top_n: 1,
289
+ }, { headers })
290
+ .pipe((0, rxjs_1.timeout)(this.TIMEOUT_MS), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
291
+ return response.status === 200 || response.status === 429;
292
+ }
293
+ catch {
294
+ return true;
295
+ }
296
+ }
297
+ /**
298
+ * 验证 Moderation 模型
299
+ * 支持 DMXAPI 等第三方聚合平台
300
+ */
301
+ async verifyModerationModel(apiHost, apiKey, model, apiType) {
302
+ const headers = apiType === 'anthropic'
303
+ ? { 'x-api-key': apiKey, 'Content-Type': 'application/json' }
304
+ : {
305
+ ...this.getHeaders(apiHost, apiKey),
306
+ 'Content-Type': 'application/json',
307
+ };
308
+ try {
309
+ const response = await (0, rxjs_1.firstValueFrom)(this.httpService
310
+ .post(`${apiHost}/moderations`, { model, input: 'test' }, { headers })
311
+ .pipe((0, rxjs_1.timeout)(this.TIMEOUT_MS), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
312
+ return response.status === 200 || response.status === 429;
313
+ }
314
+ catch {
315
+ return true;
316
+ }
317
+ }
318
+ };
319
+ exports.ModelVerifyClient = ModelVerifyClient;
320
+ exports.ModelVerifyClient = ModelVerifyClient = __decorate([
321
+ (0, common_1.Injectable)(),
322
+ __metadata("design:paramtypes", [axios_1.HttpService])
323
+ ], ModelVerifyClient);
324
+ //# sourceMappingURL=model-verify.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-verify.client.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/model-verify/model-verify.client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ import { HttpService } from '@nestjs/axios';
2
+ import { Logger } from 'winston';
3
+ import { DockerService } from '@dofe/infra-docker';
4
+ /**
5
+ * Docker exec 执行选项
6
+ */
7
+ export interface DockerExecOptions {
8
+ /** 执行超时(毫秒),默认 15000 */
9
+ timeout?: number;
10
+ /** 执行用户,默认容器默认用户 */
11
+ user?: string;
12
+ /** 是否在失败时抛出错误,默认 false */
13
+ throwOnError?: boolean;
14
+ /** 是否返回 stderr,默认 false */
15
+ includeStderr?: boolean;
16
+ /** 是否等待容器就绪(遇到 409 错误时自动重试),默认 false */
17
+ waitForReady?: boolean;
18
+ /** 等待容器就绪的最大时间(毫秒),默认 30000 */
19
+ maxWaitMs?: number;
20
+ }
21
+ /**
22
+ * Docker exec 执行结果
23
+ */
24
+ export interface DockerExecResult {
25
+ /** stdout 输出 */
26
+ stdout: string;
27
+ /** stderr 输出 */
28
+ stderr: string;
29
+ /** 是否执行成功(无错误抛出) */
30
+ success: boolean;
31
+ /** 执行耗时(毫秒) */
32
+ durationMs: number;
33
+ }
34
+ export declare class DockerExecService {
35
+ private readonly logger;
36
+ private readonly httpService;
37
+ private readonly dockerService;
38
+ private readonly defaultTimeout;
39
+ private readonly dockerSocketPath;
40
+ constructor(logger: Logger, httpService: HttpService, dockerService: DockerService);
41
+ /**
42
+ * 等待容器进入运行状态
43
+ * 解决 HTTP 409 错误:容器停止或重启时无法执行 exec
44
+ *
45
+ * @param containerId 容器 ID
46
+ * @param maxWaitMs 最大等待时间(毫秒)
47
+ * @param pollIntervalMs 轮询间隔(毫秒)
48
+ */
49
+ waitForContainerRunning(containerId: string, maxWaitMs?: number, pollIntervalMs?: number): Promise<boolean>;
50
+ /**
51
+ * 在容器内执行命令
52
+ *
53
+ * @param containerId 容器 ID
54
+ * @param cmd 命令数组,如 ['node', '-e', script]
55
+ * @param options 执行选项
56
+ * @returns 执行结果
57
+ */
58
+ executeCommand(containerId: string, cmd: string[], options?: DockerExecOptions): Promise<DockerExecResult>;
59
+ /**
60
+ * 执行 Node.js 脚本
61
+ *
62
+ * @param containerId 容器 ID
63
+ * @param script Node.js 脚本内容
64
+ * @param options 执行选项
65
+ */
66
+ executeNodeScript(containerId: string, script: string, options?: DockerExecOptions): Promise<DockerExecResult>;
67
+ /**
68
+ * 执行 Shell 命令
69
+ *
70
+ * @param containerId 容器 ID
71
+ * @param command Shell 命令
72
+ * @param options 执行选项
73
+ */
74
+ executeShellCommand(containerId: string, command: string, options?: DockerExecOptions): Promise<DockerExecResult>;
75
+ /**
76
+ * 验证名称是否安全(防止注入)
77
+ *
78
+ * @param name 要验证的名称
79
+ * @returns 是否安全
80
+ */
81
+ isValidName(name: string): boolean;
82
+ /**
83
+ * 复制文件到容器
84
+ * 使用 Dockerode putArchive API 替代 docker cp CLI
85
+ * 写入后自动修复文件权限为 node:node(OpenClaw 运行用户)
86
+ *
87
+ * @param containerId 容器 ID
88
+ * @param sourcePath 宿主机文件路径
89
+ * @param destPath 容器内目标路径(文件完整路径)
90
+ * @param owner 文件所有者(默认 'node:node',OpenClaw 运行用户)
91
+ */
92
+ copyFileToContainer(containerId: string, sourcePath: string, destPath: string, owner?: string): Promise<void>;
93
+ /**
94
+ * 复制目录到容器
95
+ * 使用 Dockerode putArchive API
96
+ *
97
+ * @param containerId 容器 ID
98
+ * @param sourceDir 宿主机目录路径
99
+ * @param destDir 容器内目标目录路径
100
+ */
101
+ copyDirectoryToContainer(containerId: string, sourceDir: string, destDir: string): Promise<void>;
102
+ /**
103
+ * 创建单个文件的 tar 包 Buffer
104
+ * tar 格式:512 字节 header + 文件内容(填充到 512 字节对齐)+ 两个 512 字节的空 block 作为结束
105
+ */
106
+ private createTarBuffer;
107
+ /**
108
+ * 创建目录的 tar 包 Buffer
109
+ *
110
+ * @param sourceDir 源目录路径
111
+ * @param dirPrefix tar 包中的目录前缀(可选,用于保留目录名)
112
+ */
113
+ private createTarBufferFromDirectory;
114
+ /**
115
+ * 递归列出目录下所有文件
116
+ * 忽略以 . 开头的文件和 node_modules 目录
117
+ */
118
+ private listFilesRecursively;
119
+ /**
120
+ * 将 Buffer 填充到 512 字节对齐
121
+ */
122
+ private padTo512;
123
+ private createExec;
124
+ private startExec;
125
+ /**
126
+ * 解析 Docker exec 多路复用流输出
127
+ * Docker exec 输出格式:每帧 8 字节头 + payload
128
+ * 头部:[stream_type(1), 0, 0, 0, size(4 bytes big-endian)]
129
+ */
130
+ private parseOutput;
131
+ }
132
+ //# sourceMappingURL=docker-exec.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-exec.service.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/openclaw/docker-exec.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAKjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wCAAwC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBACa,iBAAiB;IAKO,OAAO,CAAC,QAAQ,CAAC,MAAM;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa;IANhC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0B;gBAGP,MAAM,EAAE,MAAM,EAC/C,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa;IAG/C;;;;;;;OAOG;IACG,uBAAuB,CAC3B,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAc,EACzB,cAAc,GAAE,MAAa,GAC5B,OAAO,CAAC,OAAO,CAAC;IA2EnB;;;;;;;OAOG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EAAE,EACb,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,gBAAgB,CAAC;IA8G5B;;;;;;OAMG;IACG,iBAAiB,CACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,gBAAgB,CAAC;IAI5B;;;;;;OAMG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,gBAAgB,CAAC;IAI5B;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKlC;;;;;;;;;OASG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,MAAoB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAwChB;;;;;;;OAOG;IACG,wBAAwB,CAC5B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAmDhB;;;OAGG;YACW,eAAe;IA4D7B;;;;;OAKG;YACW,4BAA4B;IAmC1C;;;OAGG;YACW,oBAAoB;IA0BlC;;OAEG;IACH,OAAO,CAAC,QAAQ;YASF,UAAU;YAyCV,SAAS;IAgCvB;;;;OAIG;IACH,OAAO,CAAC,WAAW;CA6BpB"}