@dofe/infra-clients 0.1.37 → 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.
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/mlflow/mlflow.client.d.ts +44 -0
- package/dist/internal/mlflow/mlflow.client.d.ts.map +1 -0
- package/dist/internal/mlflow/mlflow.client.js +184 -0
- package/dist/internal/mlflow/mlflow.client.js.map +1 -0
- package/dist/internal/mlflow/mlflow.module.d.ts +3 -0
- package/dist/internal/mlflow/mlflow.module.d.ts.map +1 -0
- package/dist/internal/mlflow/mlflow.module.js +23 -0
- package/dist/internal/mlflow/mlflow.module.js.map +1 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.client.d.ts +52 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.client.d.ts.map +1 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.client.js +174 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.client.js.map +1 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.module.d.ts +3 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.module.d.ts.map +1 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.module.js +30 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.module.js.map +1 -0
- package/dist/internal/model-research-proxy/index.d.ts +6 -0
- package/dist/internal/model-research-proxy/index.d.ts.map +1 -0
- package/dist/internal/model-research-proxy/index.js +24 -0
- package/dist/internal/model-research-proxy/index.js.map +1 -0
- package/dist/internal/model-verify/index.d.ts +4 -0
- package/dist/internal/model-verify/index.d.ts.map +1 -0
- package/dist/internal/model-verify/index.js +26 -0
- package/dist/internal/model-verify/index.js.map +1 -0
- package/dist/internal/model-verify/model-verify.client.d.ts +77 -0
- package/dist/internal/model-verify/model-verify.client.d.ts.map +1 -0
- package/dist/internal/model-verify/model-verify.client.js +324 -0
- package/dist/internal/model-verify/model-verify.client.js.map +1 -0
- package/dist/internal/openclaw/docker-exec.service.d.ts +132 -0
- package/dist/internal/openclaw/docker-exec.service.d.ts.map +1 -0
- package/dist/internal/openclaw/docker-exec.service.js +544 -0
- package/dist/internal/openclaw/docker-exec.service.js.map +1 -0
- package/dist/internal/openclaw/index.d.ts +14 -0
- package/dist/internal/openclaw/index.d.ts.map +1 -0
- package/dist/internal/openclaw/index.js +32 -0
- package/dist/internal/openclaw/index.js.map +1 -0
- package/dist/internal/openclaw/openclaw-agent-coordination.client.d.ts +73 -0
- package/dist/internal/openclaw/openclaw-agent-coordination.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-agent-coordination.client.js +249 -0
- package/dist/internal/openclaw/openclaw-agent-coordination.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw-context-status.client.d.ts +66 -0
- package/dist/internal/openclaw/openclaw-context-status.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-context-status.client.js +164 -0
- package/dist/internal/openclaw/openclaw-context-status.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw-cron.client.d.ts +61 -0
- package/dist/internal/openclaw/openclaw-cron.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-cron.client.js +416 -0
- package/dist/internal/openclaw/openclaw-cron.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw-gateway.client.d.ts +41 -0
- package/dist/internal/openclaw/openclaw-gateway.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-gateway.client.js +175 -0
- package/dist/internal/openclaw/openclaw-gateway.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw-skill-sync.client.d.ts +222 -0
- package/dist/internal/openclaw/openclaw-skill-sync.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-skill-sync.client.js +720 -0
- package/dist/internal/openclaw/openclaw-skill-sync.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw.client.d.ts +602 -0
- package/dist/internal/openclaw/openclaw.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw.client.js +3062 -0
- package/dist/internal/openclaw/openclaw.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw.module.d.ts +3 -0
- package/dist/internal/openclaw/openclaw.module.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw.module.js +62 -0
- package/dist/internal/openclaw/openclaw.module.js.map +1 -0
- package/dist/internal/openclaw/skill-translation.service.d.ts +39 -0
- package/dist/internal/openclaw/skill-translation.service.d.ts.map +1 -0
- package/dist/internal/openclaw/skill-translation.service.js +217 -0
- package/dist/internal/openclaw/skill-translation.service.js.map +1 -0
- package/dist/internal/openclaw/types/cron.types.d.ts +112 -0
- package/dist/internal/openclaw/types/cron.types.d.ts.map +1 -0
- package/dist/internal/openclaw/types/cron.types.js +9 -0
- package/dist/internal/openclaw/types/cron.types.js.map +1 -0
- package/dist/internal/provider-verify/index.d.ts +6 -0
- package/dist/internal/provider-verify/index.d.ts.map +1 -0
- package/dist/internal/provider-verify/index.js +24 -0
- package/dist/internal/provider-verify/index.js.map +1 -0
- package/dist/internal/provider-verify/provider-verify.client.d.ts +55 -0
- package/dist/internal/provider-verify/provider-verify.client.d.ts.map +1 -0
- package/dist/internal/provider-verify/provider-verify.client.js +284 -0
- package/dist/internal/provider-verify/provider-verify.client.js.map +1 -0
- package/dist/internal/provider-verify/provider-verify.module.d.ts +3 -0
- package/dist/internal/provider-verify/provider-verify.module.d.ts.map +1 -0
- package/dist/internal/provider-verify/provider-verify.module.js +28 -0
- package/dist/internal/provider-verify/provider-verify.module.js.map +1 -0
- package/dist/internal/sso/index.d.ts +5 -0
- package/dist/internal/sso/index.d.ts.map +1 -0
- package/dist/internal/sso/index.js +12 -0
- package/dist/internal/sso/index.js.map +1 -0
- package/dist/internal/sso/sso-auth.client.d.ts +33 -0
- package/dist/internal/sso/sso-auth.client.d.ts.map +1 -0
- package/dist/internal/sso/sso-auth.client.js +89 -0
- package/dist/internal/sso/sso-auth.client.js.map +1 -0
- package/dist/internal/sso/sso-message-proxy.service.d.ts +11 -0
- package/dist/internal/sso/sso-message-proxy.service.d.ts.map +1 -0
- package/dist/internal/sso/sso-message-proxy.service.js +51 -0
- package/dist/internal/sso/sso-message-proxy.service.js.map +1 -0
- package/dist/internal/sso/sso-message.client.d.ts +12 -0
- package/dist/internal/sso/sso-message.client.d.ts.map +1 -0
- package/dist/internal/sso/sso-message.client.js +62 -0
- package/dist/internal/sso/sso-message.client.js.map +1 -0
- package/dist/internal/sso/sso.module.d.ts +3 -0
- package/dist/internal/sso/sso.module.d.ts.map +1 -0
- package/dist/internal/sso/sso.module.js +26 -0
- package/dist/internal/sso/sso.module.js.map +1 -0
- package/package.json +110 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/provider-verify/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.ProviderVerifyModule = void 0;
|
|
18
|
+
/**
|
|
19
|
+
* Provider Verify 模块导出
|
|
20
|
+
*/
|
|
21
|
+
__exportStar(require("./provider-verify.client"), exports);
|
|
22
|
+
var provider_verify_module_1 = require("./provider-verify.module");
|
|
23
|
+
Object.defineProperty(exports, "ProviderVerifyModule", { enumerable: true, get: function () { return provider_verify_module_1.ProviderVerifyModule; } });
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/provider-verify/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;GAEG;AACH,2DAAyC;AACzC,mEAAgE;AAAvD,8HAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { HttpService } from '@nestjs/axios';
|
|
2
|
+
import { Logger } from 'winston';
|
|
3
|
+
import type { VerifyProviderKeyInput, VerifyProviderKeyResponse } from '@dofe/infra-contracts';
|
|
4
|
+
/**
|
|
5
|
+
* ProviderVerifyClient - Provider Key 验证客户端
|
|
6
|
+
*
|
|
7
|
+
* 负责调用各 AI 提供商的 API 验证密钥有效性并获取模型列表
|
|
8
|
+
* 支持 OpenAI 兼容 API 和 Anthropic API
|
|
9
|
+
*/
|
|
10
|
+
export declare class ProviderVerifyClient {
|
|
11
|
+
private readonly httpService;
|
|
12
|
+
private readonly logger;
|
|
13
|
+
constructor(httpService: HttpService, logger: Logger);
|
|
14
|
+
/**
|
|
15
|
+
* 判断是否是 DMXAPI 等第三方聚合平台
|
|
16
|
+
* 基于 effectiveHost 的域名进行匹配
|
|
17
|
+
*/
|
|
18
|
+
private isAggregatorPlatform;
|
|
19
|
+
/**
|
|
20
|
+
* 获取 API 请求的 headers
|
|
21
|
+
* 根据平台类型动态调整:
|
|
22
|
+
* - DMXAPI 等聚合平台:Authorization 不需要 Bearer,需要 Rix-Api-User
|
|
23
|
+
* - 标准 OpenAI 兼容 API:Authorization 使用 Bearer 前缀
|
|
24
|
+
*/
|
|
25
|
+
private getOpenAICompatibleHeaders;
|
|
26
|
+
/**
|
|
27
|
+
* Verify a provider key and get available models
|
|
28
|
+
*/
|
|
29
|
+
verify(input: VerifyProviderKeyInput): Promise<VerifyProviderKeyResponse>;
|
|
30
|
+
/**
|
|
31
|
+
* Verify Anthropic API key
|
|
32
|
+
* Anthropic doesn't have a models endpoint, so we verify by calling messages endpoint
|
|
33
|
+
*/
|
|
34
|
+
private verifyAnthropicKey;
|
|
35
|
+
/**
|
|
36
|
+
* Verify Google Gemini API key by calling /models endpoint
|
|
37
|
+
* Gemini API uses a different authentication method (API key in query param)
|
|
38
|
+
*/
|
|
39
|
+
private verifyGeminiKey;
|
|
40
|
+
/**
|
|
41
|
+
* Verify Ollama API key by calling /api/tags endpoint
|
|
42
|
+
* Ollama uses a different endpoint structure
|
|
43
|
+
*/
|
|
44
|
+
private verifyOllamaKey;
|
|
45
|
+
/**
|
|
46
|
+
* Verify OpenAI-compatible API key by calling /models endpoint
|
|
47
|
+
* 支持 DMXAPI 等第三方聚合平台的特殊 headers
|
|
48
|
+
*/
|
|
49
|
+
private verifyOpenAICompatibleKey;
|
|
50
|
+
/**
|
|
51
|
+
* Handle errors and return appropriate response
|
|
52
|
+
*/
|
|
53
|
+
private handleError;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=provider-verify.client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-verify.client.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/provider-verify/provider-verify.client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,KAAK,EACV,sBAAsB,EACtB,yBAAyB,EAG1B,MAAM,uBAAuB,CAAC;AAe/B;;;;;GAKG;AACH,qBACa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IACK,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADvC,WAAW,EAAE,WAAW,EACS,MAAM,EAAE,MAAM;IAGlE;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;;;;OAKG;IACH,OAAO,CAAC,0BAA0B;IAqBlC;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,yBAAyB,CAAC;IA4DrC;;;OAGG;YACW,kBAAkB;IA6BhC;;;OAGG;YACW,eAAe;IA6B7B;;;OAGG;YACW,eAAe;IA2B7B;;;OAGG;YACW,yBAAyB;IAwCvC;;OAEG;IACH,OAAO,CAAC,WAAW;CAuCpB"}
|
|
@@ -0,0 +1,284 @@
|
|
|
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
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ProviderVerifyClient = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const axios_1 = require("@nestjs/axios");
|
|
18
|
+
const nest_winston_1 = require("nest-winston");
|
|
19
|
+
const winston_1 = require("winston");
|
|
20
|
+
const rxjs_1 = require("rxjs");
|
|
21
|
+
const infra_contracts_1 = require("@dofe/infra-contracts");
|
|
22
|
+
/**
|
|
23
|
+
* DMXAPI 等第三方聚合平台的域名特征
|
|
24
|
+
* 这些平台需要特殊的 headers:
|
|
25
|
+
* - Authorization 不需要 Bearer 前缀
|
|
26
|
+
* - 需要 Rix-Api-User header
|
|
27
|
+
*/
|
|
28
|
+
const AGGREGATOR_PLATFORM_DOMAINS = [
|
|
29
|
+
'dmxapi.com',
|
|
30
|
+
'dmxapi.cn',
|
|
31
|
+
'api.dmxapi.com',
|
|
32
|
+
];
|
|
33
|
+
/**
|
|
34
|
+
* ProviderVerifyClient - Provider Key 验证客户端
|
|
35
|
+
*
|
|
36
|
+
* 负责调用各 AI 提供商的 API 验证密钥有效性并获取模型列表
|
|
37
|
+
* 支持 OpenAI 兼容 API 和 Anthropic API
|
|
38
|
+
*/
|
|
39
|
+
let ProviderVerifyClient = class ProviderVerifyClient {
|
|
40
|
+
httpService;
|
|
41
|
+
logger;
|
|
42
|
+
constructor(httpService, logger) {
|
|
43
|
+
this.httpService = httpService;
|
|
44
|
+
this.logger = logger;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 判断是否是 DMXAPI 等第三方聚合平台
|
|
48
|
+
* 基于 effectiveHost 的域名进行匹配
|
|
49
|
+
*/
|
|
50
|
+
isAggregatorPlatform(effectiveHost) {
|
|
51
|
+
try {
|
|
52
|
+
const url = new URL(effectiveHost);
|
|
53
|
+
const hostname = url.hostname.toLowerCase();
|
|
54
|
+
return AGGREGATOR_PLATFORM_DOMAINS.some((domain) => hostname.includes(domain));
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 获取 API 请求的 headers
|
|
62
|
+
* 根据平台类型动态调整:
|
|
63
|
+
* - DMXAPI 等聚合平台:Authorization 不需要 Bearer,需要 Rix-Api-User
|
|
64
|
+
* - 标准 OpenAI 兼容 API:Authorization 使用 Bearer 前缀
|
|
65
|
+
*/
|
|
66
|
+
getOpenAICompatibleHeaders(effectiveHost, secret) {
|
|
67
|
+
if (this.isAggregatorPlatform(effectiveHost)) {
|
|
68
|
+
// DMXAPI 等聚合平台的特殊 headers
|
|
69
|
+
const userId = process.env.DMXAPI_USER_ID || '20700';
|
|
70
|
+
return {
|
|
71
|
+
Authorization: secret, // 不需要 Bearer 前缀
|
|
72
|
+
Accept: 'application/json',
|
|
73
|
+
'Rix-Api-User': userId,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// 标准 OpenAI 兼容 API
|
|
77
|
+
return {
|
|
78
|
+
Authorization: `Bearer ${secret}`,
|
|
79
|
+
'Content-Type': 'application/json',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Verify a provider key and get available models
|
|
84
|
+
*/
|
|
85
|
+
async verify(input) {
|
|
86
|
+
const startTime = Date.now();
|
|
87
|
+
const { vendor, apiKey: secret, baseUrl, apiType: inputApiType, extraConfig: metadata } = input;
|
|
88
|
+
// Get effective API host
|
|
89
|
+
let effectiveHost = (0, infra_contracts_1.getEffectiveApiHost)(vendor, baseUrl);
|
|
90
|
+
if (!effectiveHost) {
|
|
91
|
+
return {
|
|
92
|
+
valid: false,
|
|
93
|
+
error: 'No API host configured for this provider',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// Get provider config to determine API type
|
|
97
|
+
// Use input apiType if provided, otherwise fall back to provider config
|
|
98
|
+
const providerConfig = infra_contracts_1.PROVIDER_CONFIGS[vendor];
|
|
99
|
+
const apiType = inputApiType || providerConfig?.apiType || 'openai';
|
|
100
|
+
// MiniMax: append GroupId to host if provided in metadata
|
|
101
|
+
if (vendor === 'minimax' && metadata?.group_id) {
|
|
102
|
+
const separator = effectiveHost.includes('?') ? '&' : '?';
|
|
103
|
+
effectiveHost += `${separator}GroupId=${encodeURIComponent(String(metadata.group_id))}`;
|
|
104
|
+
}
|
|
105
|
+
this.logger.info(`[ProviderVerify] Verifying key for vendor=${vendor}, apiType=${apiType}, effectiveHost=${effectiveHost}`);
|
|
106
|
+
try {
|
|
107
|
+
let models = [];
|
|
108
|
+
// Handle different API types
|
|
109
|
+
if (apiType === 'anthropic') {
|
|
110
|
+
models = await this.verifyAnthropicKey(effectiveHost, secret, startTime);
|
|
111
|
+
}
|
|
112
|
+
else if (apiType === 'gemini') {
|
|
113
|
+
models = await this.verifyGeminiKey(effectiveHost, secret);
|
|
114
|
+
}
|
|
115
|
+
else if (apiType === 'ollama') {
|
|
116
|
+
models = await this.verifyOllamaKey(effectiveHost, secret);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
models = await this.verifyOpenAICompatibleKey(effectiveHost, secret);
|
|
120
|
+
}
|
|
121
|
+
const latency = Date.now() - startTime;
|
|
122
|
+
this.logger.info(`[ProviderVerify] Success: ${models.length} models found for ${vendor}`);
|
|
123
|
+
return {
|
|
124
|
+
valid: true,
|
|
125
|
+
latency,
|
|
126
|
+
models,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
return this.handleError(error, vendor, startTime);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Verify Anthropic API key
|
|
135
|
+
* Anthropic doesn't have a models endpoint, so we verify by calling messages endpoint
|
|
136
|
+
*/
|
|
137
|
+
async verifyAnthropicKey(effectiveHost, secret, startTime) {
|
|
138
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(`${effectiveHost}/v1/messages`, {
|
|
139
|
+
headers: {
|
|
140
|
+
'x-api-key': secret,
|
|
141
|
+
'anthropic-version': '2023-06-01',
|
|
142
|
+
},
|
|
143
|
+
timeout: 10000,
|
|
144
|
+
validateStatus: (status) => status < 500,
|
|
145
|
+
}));
|
|
146
|
+
// 401 means invalid key
|
|
147
|
+
if (response.status === 401) {
|
|
148
|
+
throw { response: { status: 401 } };
|
|
149
|
+
}
|
|
150
|
+
// Return predefined Anthropic models (latest Claude 4 series)
|
|
151
|
+
return [
|
|
152
|
+
{ id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },
|
|
153
|
+
{ id: 'claude-sonnet-4-5-20250929', name: 'Claude Sonnet 4.5' },
|
|
154
|
+
{ id: 'claude-haiku-4-5-20251001', name: 'Claude Haiku 4.5' },
|
|
155
|
+
];
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Verify Google Gemini API key by calling /models endpoint
|
|
159
|
+
* Gemini API uses a different authentication method (API key in query param)
|
|
160
|
+
*/
|
|
161
|
+
async verifyGeminiKey(effectiveHost, secret) {
|
|
162
|
+
const modelsUrl = `${effectiveHost}/models?key=${secret}`;
|
|
163
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(modelsUrl, {
|
|
164
|
+
headers: {
|
|
165
|
+
'Content-Type': 'application/json',
|
|
166
|
+
},
|
|
167
|
+
timeout: 10000,
|
|
168
|
+
}));
|
|
169
|
+
const data = response.data;
|
|
170
|
+
let models = [];
|
|
171
|
+
if (data?.models && Array.isArray(data.models)) {
|
|
172
|
+
models = data.models
|
|
173
|
+
.filter((m) => m.name?.startsWith('models/gemini'))
|
|
174
|
+
.map((m) => ({
|
|
175
|
+
id: m.name?.replace('models/', '') || m.name,
|
|
176
|
+
name: m.displayName || m.name?.replace('models/', ''),
|
|
177
|
+
}));
|
|
178
|
+
}
|
|
179
|
+
return models;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Verify Ollama API key by calling /api/tags endpoint
|
|
183
|
+
* Ollama uses a different endpoint structure
|
|
184
|
+
*/
|
|
185
|
+
async verifyOllamaKey(effectiveHost, _secret) {
|
|
186
|
+
// Ollama doesn't require authentication, just check if the server is running
|
|
187
|
+
// The endpoint is /api/tags for listing models
|
|
188
|
+
const baseHost = effectiveHost.replace(/\/v1$/, '');
|
|
189
|
+
const modelsUrl = `${baseHost}/api/tags`;
|
|
190
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(modelsUrl, {
|
|
191
|
+
timeout: 10000,
|
|
192
|
+
}));
|
|
193
|
+
const data = response.data;
|
|
194
|
+
let models = [];
|
|
195
|
+
if (data?.models && Array.isArray(data.models)) {
|
|
196
|
+
models = data.models.map((m) => ({
|
|
197
|
+
id: m.name || m.model,
|
|
198
|
+
name: m.name || m.model,
|
|
199
|
+
}));
|
|
200
|
+
}
|
|
201
|
+
return models;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Verify OpenAI-compatible API key by calling /models endpoint
|
|
205
|
+
* 支持 DMXAPI 等第三方聚合平台的特殊 headers
|
|
206
|
+
*/
|
|
207
|
+
async verifyOpenAICompatibleKey(effectiveHost, secret) {
|
|
208
|
+
const modelsUrl = `${effectiveHost}/models`;
|
|
209
|
+
const headers = this.getOpenAICompatibleHeaders(effectiveHost, secret);
|
|
210
|
+
this.logger.debug(`[ProviderVerify] Calling ${modelsUrl} with headers keys: ${Object.keys(headers).join(', ')}`);
|
|
211
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(modelsUrl, {
|
|
212
|
+
headers,
|
|
213
|
+
timeout: 10000,
|
|
214
|
+
}));
|
|
215
|
+
const data = response.data;
|
|
216
|
+
let models = [];
|
|
217
|
+
if (data?.data && Array.isArray(data.data)) {
|
|
218
|
+
models = data.data.map((m) => ({
|
|
219
|
+
id: m.id,
|
|
220
|
+
name: m.name || m.id,
|
|
221
|
+
created: m.created,
|
|
222
|
+
owned_by: m.owned_by,
|
|
223
|
+
}));
|
|
224
|
+
}
|
|
225
|
+
else if (data?.models && Array.isArray(data.models)) {
|
|
226
|
+
// Some providers use 'models' instead of 'data'
|
|
227
|
+
models = data.models.map((m) => ({
|
|
228
|
+
id: m.id || m.name,
|
|
229
|
+
name: m.name || m.id,
|
|
230
|
+
created: m.created,
|
|
231
|
+
owned_by: m.owned_by,
|
|
232
|
+
}));
|
|
233
|
+
}
|
|
234
|
+
return models;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Handle errors and return appropriate response
|
|
238
|
+
*/
|
|
239
|
+
handleError(error, vendor, startTime) {
|
|
240
|
+
const latency = Date.now() - startTime;
|
|
241
|
+
let errorMessage = 'Connection failed';
|
|
242
|
+
if (error.response) {
|
|
243
|
+
const status = error.response.status;
|
|
244
|
+
if (status === 401) {
|
|
245
|
+
errorMessage = 'Invalid API key';
|
|
246
|
+
}
|
|
247
|
+
else if (status === 403) {
|
|
248
|
+
errorMessage = 'Access denied';
|
|
249
|
+
}
|
|
250
|
+
else if (status === 404) {
|
|
251
|
+
errorMessage = 'API endpoint not found';
|
|
252
|
+
}
|
|
253
|
+
else if (status === 429) {
|
|
254
|
+
errorMessage = 'Rate limit exceeded';
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
errorMessage = error.response.data?.error?.message || `HTTP ${status}`;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
else if (error.code === 'ECONNREFUSED') {
|
|
261
|
+
errorMessage = 'Connection refused';
|
|
262
|
+
}
|
|
263
|
+
else if (error.code === 'ETIMEDOUT' || error.code === 'ECONNABORTED') {
|
|
264
|
+
errorMessage = 'Connection timeout';
|
|
265
|
+
}
|
|
266
|
+
else if (error.message) {
|
|
267
|
+
errorMessage = error.message;
|
|
268
|
+
}
|
|
269
|
+
this.logger.warn(`Provider key verification failed for ${vendor}: ${errorMessage}`);
|
|
270
|
+
return {
|
|
271
|
+
valid: false,
|
|
272
|
+
latency,
|
|
273
|
+
error: errorMessage,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
exports.ProviderVerifyClient = ProviderVerifyClient;
|
|
278
|
+
exports.ProviderVerifyClient = ProviderVerifyClient = __decorate([
|
|
279
|
+
(0, common_1.Injectable)(),
|
|
280
|
+
__param(1, (0, common_1.Inject)(nest_winston_1.WINSTON_MODULE_PROVIDER)),
|
|
281
|
+
__metadata("design:paramtypes", [axios_1.HttpService,
|
|
282
|
+
winston_1.Logger])
|
|
283
|
+
], ProviderVerifyClient);
|
|
284
|
+
//# sourceMappingURL=provider-verify.client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-verify.client.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/provider-verify/provider-verify.client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,yCAA4C;AAC5C,+CAAuD;AACvD,qCAAiC;AACjC,+BAAsC;AAOtC,2DAA8E;AAE9E;;;;;GAKG;AACH,MAAM,2BAA2B,GAAG;IAClC,YAAY;IACZ,WAAW;IACX,gBAAgB;CACjB,CAAC;AAEF;;;;;GAKG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAEZ;IACiC;IAFpD,YACmB,WAAwB,EACS,MAAc;QAD/C,gBAAW,GAAX,WAAW,CAAa;QACS,WAAM,GAAN,MAAM,CAAQ;IAC/D,CAAC;IAEJ;;;OAGG;IACK,oBAAoB,CAAC,aAAqB;QAChD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC5C,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACjD,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC1B,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,0BAA0B,CAChC,aAAqB,EACrB,MAAc;QAEd,IAAI,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7C,0BAA0B;YAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC;YACrD,OAAO;gBACL,aAAa,EAAE,MAAM,EAAE,gBAAgB;gBACvC,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,MAAM;aACvB,CAAC;QACJ,CAAC;QAED,mBAAmB;QACnB,OAAO;YACL,aAAa,EAAE,UAAU,MAAM,EAAE;YACjC,cAAc,EAAE,kBAAkB;SACnC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACV,KAA6B;QAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;QAEhG,yBAAyB;QACzB,IAAI,aAAa,GAAG,IAAA,qCAAmB,EAAC,MAAwB,EAAE,OAAO,CAAC,CAAC;QAC3E,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,0CAA0C;aAClD,CAAC;QACJ,CAAC;QAED,4CAA4C;QAC5C,wEAAwE;QACxE,MAAM,cAAc,GAAG,kCAAgB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,YAAY,IAAI,cAAc,EAAE,OAAO,IAAI,QAAQ,CAAC;QAEpE,0DAA0D;QAC1D,IAAI,MAAM,KAAK,SAAS,IAAI,QAAQ,EAAE,QAAQ,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC1D,aAAa,IAAI,GAAG,SAAS,WAAW,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC1F,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,6CAA6C,MAAM,aAAa,OAAO,mBAAmB,aAAa,EAAE,CAC1G,CAAC;QAEF,IAAI,CAAC;YACH,IAAI,MAAM,GAAoB,EAAE,CAAC;YAEjC,6BAA6B;YAC7B,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;gBAC5B,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CACpC,aAAa,EACb,MAAM,EACN,SAAS,CACV,CAAC;YACJ,CAAC;iBAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YAC7D,CAAC;iBAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YACvE,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,6BAA6B,MAAM,CAAC,MAAM,qBAAqB,MAAM,EAAE,CACxE,CAAC;YACF,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,OAAO;gBACP,MAAM;aACP,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAwB,EAAE,SAAS,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,kBAAkB,CAC9B,aAAqB,EACrB,MAAc,EACd,SAAiB;QAEjB,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,aAAa,cAAc,EAAE;YACnD,OAAO,EAAE;gBACP,WAAW,EAAE,MAAM;gBACnB,mBAAmB,EAAE,YAAY;aAClC;YACD,OAAO,EAAE,KAAK;YACd,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,GAAG;SACzC,CAAC,CACH,CAAC;QAEF,wBAAwB;QACxB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QACtC,CAAC;QAED,8DAA8D;QAC9D,OAAO;YACL,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE;YAClD,EAAE,EAAE,EAAE,4BAA4B,EAAE,IAAI,EAAE,mBAAmB,EAAE;YAC/D,EAAE,EAAE,EAAE,2BAA2B,EAAE,IAAI,EAAE,kBAAkB,EAAE;SAC9D,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,eAAe,CAC3B,aAAqB,EACrB,MAAc;QAEd,MAAM,SAAS,GAAG,GAAG,aAAa,eAAe,MAAM,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE;YAC9B,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,OAAO,EAAE,KAAK;SACf,CAAC,CACH,CAAC;QAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,IAAI,MAAM,GAAoB,EAAE,CAAC;QAEjC,IAAI,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/C,MAAM,GAAG,IAAI,CAAC,MAAM;iBACjB,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;iBACvD,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBAChB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI;gBAC5C,IAAI,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;aACtD,CAAC,CAAC,CAAC;QACR,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,eAAe,CAC3B,aAAqB,EACrB,OAAe;QAEf,6EAA6E;QAC7E,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,GAAG,QAAQ,WAAW,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE;YAC9B,OAAO,EAAE,KAAK;SACf,CAAC,CACH,CAAC;QAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,IAAI,MAAM,GAAoB,EAAE,CAAC;QAEjC,IAAI,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/C,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBACpC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK;gBACrB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK;aACxB,CAAC,CAAC,CAAC;QACN,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,yBAAyB,CACrC,aAAqB,EACrB,MAAc;QAEd,MAAM,SAAS,GAAG,GAAG,aAAa,SAAS,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,0BAA0B,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAEvE,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,4BAA4B,SAAS,uBAAuB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9F,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE;YAC9B,OAAO;YACP,OAAO,EAAE,KAAK;SACf,CAAC,CACH,CAAC;QAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,IAAI,MAAM,GAAoB,EAAE,CAAC;QAEjC,IAAI,IAAI,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBAClC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE;gBACpB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC,CAAC,CAAC;QACN,CAAC;aAAM,IAAI,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtD,gDAAgD;YAChD,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBACpC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI;gBAClB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE;gBACpB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC,CAAC,CAAC;QACN,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,WAAW,CACjB,KAAU,EACV,MAAsB,EACtB,SAAiB;QAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACvC,IAAI,YAAY,GAAG,mBAAmB,CAAC;QAEvC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YACrC,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnB,YAAY,GAAG,iBAAiB,CAAC;YACnC,CAAC;iBAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1B,YAAY,GAAG,eAAe,CAAC;YACjC,CAAC;iBAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1B,YAAY,GAAG,wBAAwB,CAAC;YAC1C,CAAC;iBAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1B,YAAY,GAAG,qBAAqB,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,QAAQ,MAAM,EAAE,CAAC;YACzE,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACzC,YAAY,GAAG,oBAAoB,CAAC;QACtC,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACvE,YAAY,GAAG,oBAAoB,CAAC;QACtC,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACzB,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,wCAAwC,MAAM,KAAK,YAAY,EAAE,CAClE,CAAC;QAEF,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO;YACP,KAAK,EAAE,YAAY;SACpB,CAAC;IACJ,CAAC;CACF,CAAA;AAzSY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;IAIR,WAAA,IAAA,eAAM,EAAC,sCAAuB,CAAC,CAAA;qCADF,mBAAW;QACiB,gBAAM;GAHvD,oBAAoB,CAyShC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-verify.module.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/provider-verify/provider-verify.module.ts"],"names":[],"mappings":"AAIA,qBAUa,oBAAoB;CAAG"}
|
|
@@ -0,0 +1,28 @@
|
|
|
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.ProviderVerifyModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const axios_1 = require("@nestjs/axios");
|
|
12
|
+
const provider_verify_client_1 = require("./provider-verify.client");
|
|
13
|
+
let ProviderVerifyModule = class ProviderVerifyModule {
|
|
14
|
+
};
|
|
15
|
+
exports.ProviderVerifyModule = ProviderVerifyModule;
|
|
16
|
+
exports.ProviderVerifyModule = ProviderVerifyModule = __decorate([
|
|
17
|
+
(0, common_1.Module)({
|
|
18
|
+
imports: [
|
|
19
|
+
axios_1.HttpModule.register({
|
|
20
|
+
timeout: 15000,
|
|
21
|
+
maxRedirects: 5,
|
|
22
|
+
}),
|
|
23
|
+
],
|
|
24
|
+
providers: [provider_verify_client_1.ProviderVerifyClient],
|
|
25
|
+
exports: [provider_verify_client_1.ProviderVerifyClient],
|
|
26
|
+
})
|
|
27
|
+
], ProviderVerifyModule);
|
|
28
|
+
//# sourceMappingURL=provider-verify.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-verify.module.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/provider-verify/provider-verify.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,yCAA2C;AAC3C,qEAAgE;AAYzD,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAAG,CAAA;AAAvB,oDAAoB;+BAApB,oBAAoB;IAVhC,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,kBAAU,CAAC,QAAQ,CAAC;gBAClB,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,CAAC;aAChB,CAAC;SACH;QACD,SAAS,EAAE,CAAC,6CAAoB,CAAC;QACjC,OAAO,EAAE,CAAC,6CAAoB,CAAC;KAChC,CAAC;GACW,oBAAoB,CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SsoAuthClient = exports.SsoMessageProxyService = exports.SsoMessageClient = exports.SsoClientModule = void 0;
|
|
4
|
+
var sso_module_1 = require("./sso.module");
|
|
5
|
+
Object.defineProperty(exports, "SsoClientModule", { enumerable: true, get: function () { return sso_module_1.SsoClientModule; } });
|
|
6
|
+
var sso_message_client_1 = require("./sso-message.client");
|
|
7
|
+
Object.defineProperty(exports, "SsoMessageClient", { enumerable: true, get: function () { return sso_message_client_1.SsoMessageClient; } });
|
|
8
|
+
var sso_message_proxy_service_1 = require("./sso-message-proxy.service");
|
|
9
|
+
Object.defineProperty(exports, "SsoMessageProxyService", { enumerable: true, get: function () { return sso_message_proxy_service_1.SsoMessageProxyService; } });
|
|
10
|
+
var sso_auth_client_1 = require("./sso-auth.client");
|
|
11
|
+
Object.defineProperty(exports, "SsoAuthClient", { enumerable: true, get: function () { return sso_auth_client_1.SsoAuthClient; } });
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/index.ts"],"names":[],"mappings":";;;AAAA,2CAA+C;AAAtC,6GAAA,eAAe,OAAA;AACxB,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA;AACzB,yEAAqE;AAA5D,mIAAA,sBAAsB,OAAA;AAC/B,qDAAkD;AAAzC,gHAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { HttpService } from '@nestjs/axios';
|
|
2
|
+
import { ConfigService } from '@nestjs/config';
|
|
3
|
+
export declare class SsoAuthClient {
|
|
4
|
+
private readonly httpService;
|
|
5
|
+
private readonly configService;
|
|
6
|
+
constructor(httpService: HttpService, configService: ConfigService);
|
|
7
|
+
private get ssoInternalUrl();
|
|
8
|
+
private get ssoBaseUrl();
|
|
9
|
+
/**
|
|
10
|
+
* 验证 access token 有效性
|
|
11
|
+
*/
|
|
12
|
+
verifyToken(accessToken: string): Promise<{
|
|
13
|
+
valid: boolean;
|
|
14
|
+
userId?: string;
|
|
15
|
+
expiresAt?: number;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* 检查 SSO 会话状态(跨子域 cookie)
|
|
19
|
+
*/
|
|
20
|
+
getSession(cookieHeader?: string): Promise<unknown>;
|
|
21
|
+
/**
|
|
22
|
+
* 按 ID 获取用户信息
|
|
23
|
+
*/
|
|
24
|
+
getUser(userId: string): Promise<unknown>;
|
|
25
|
+
/**
|
|
26
|
+
* 获取 JWKS 公钥集合
|
|
27
|
+
*/
|
|
28
|
+
getJwks(): Promise<{
|
|
29
|
+
keys: Array<Record<string, unknown>>;
|
|
30
|
+
}>;
|
|
31
|
+
private getServiceToken;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=sso-auth.client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-auth.client.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/sso-auth.client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,qBACa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa;gBADb,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa;IAG/C,OAAO,KAAK,cAAc,GAKzB;IAED,OAAO,KAAK,UAAU,GAKrB;IAED;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAC9C,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IAiBF;;OAEG;IACG,UAAU,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAazD;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY/C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC;IASlE,OAAO,CAAC,eAAe;CAGxB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
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
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.SsoAuthClient = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const axios_1 = require("@nestjs/axios");
|
|
15
|
+
const config_1 = require("@nestjs/config");
|
|
16
|
+
const rxjs_1 = require("rxjs");
|
|
17
|
+
let SsoAuthClient = class SsoAuthClient {
|
|
18
|
+
httpService;
|
|
19
|
+
configService;
|
|
20
|
+
constructor(httpService, configService) {
|
|
21
|
+
this.httpService = httpService;
|
|
22
|
+
this.configService = configService;
|
|
23
|
+
}
|
|
24
|
+
get ssoInternalUrl() {
|
|
25
|
+
return (this.configService.get('SSO_INTERNAL_API_URL') ||
|
|
26
|
+
'http://localhost:3102/api');
|
|
27
|
+
}
|
|
28
|
+
get ssoBaseUrl() {
|
|
29
|
+
return (this.configService.get('SSO_API_URL') ||
|
|
30
|
+
'http://localhost:3102/api');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 验证 access token 有效性
|
|
34
|
+
*/
|
|
35
|
+
async verifyToken(accessToken) {
|
|
36
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.post(`${this.ssoInternalUrl}/internal/verify-token`, { token: accessToken }, {
|
|
37
|
+
headers: {
|
|
38
|
+
'Authorization': `Bearer ${this.getServiceToken()}`,
|
|
39
|
+
'Content-Type': 'application/json',
|
|
40
|
+
},
|
|
41
|
+
timeout: 5000,
|
|
42
|
+
}));
|
|
43
|
+
return response.data;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 检查 SSO 会话状态(跨子域 cookie)
|
|
47
|
+
*/
|
|
48
|
+
async getSession(cookieHeader) {
|
|
49
|
+
const headers = {};
|
|
50
|
+
if (cookieHeader)
|
|
51
|
+
headers['Cookie'] = cookieHeader;
|
|
52
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(`${this.ssoBaseUrl}/auth/session`, {
|
|
53
|
+
headers,
|
|
54
|
+
timeout: 5000,
|
|
55
|
+
}));
|
|
56
|
+
return response.data;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 按 ID 获取用户信息
|
|
60
|
+
*/
|
|
61
|
+
async getUser(userId) {
|
|
62
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(`${this.ssoInternalUrl}/internal/users/${userId}`, {
|
|
63
|
+
headers: {
|
|
64
|
+
'Authorization': `Bearer ${this.getServiceToken()}`,
|
|
65
|
+
},
|
|
66
|
+
timeout: 5000,
|
|
67
|
+
}));
|
|
68
|
+
return response.data;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 获取 JWKS 公钥集合
|
|
72
|
+
*/
|
|
73
|
+
async getJwks() {
|
|
74
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService.get(`${this.ssoBaseUrl}/.well-known/jwks.json`, {
|
|
75
|
+
timeout: 5000,
|
|
76
|
+
}));
|
|
77
|
+
return response.data;
|
|
78
|
+
}
|
|
79
|
+
getServiceToken() {
|
|
80
|
+
return this.configService.get('INTERNAL_API_SECRET') || '';
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
exports.SsoAuthClient = SsoAuthClient;
|
|
84
|
+
exports.SsoAuthClient = SsoAuthClient = __decorate([
|
|
85
|
+
(0, common_1.Injectable)(),
|
|
86
|
+
__metadata("design:paramtypes", [axios_1.HttpService,
|
|
87
|
+
config_1.ConfigService])
|
|
88
|
+
], SsoAuthClient);
|
|
89
|
+
//# sourceMappingURL=sso-auth.client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-auth.client.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/sso-auth.client.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,yCAA4C;AAC5C,2CAA+C;AAC/C,+BAAsC;AAG/B,IAAM,aAAa,GAAnB,MAAM,aAAa;IAEL;IACA;IAFnB,YACmB,WAAwB,EACxB,aAA4B;QAD5B,gBAAW,GAAX,WAAW,CAAa;QACxB,kBAAa,GAAb,aAAa,CAAe;IAC5C,CAAC;IAEJ,IAAY,cAAc;QACxB,OAAO,CACL,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,sBAAsB,CAAC;YACtD,2BAA2B,CAC5B,CAAC;IACJ,CAAC;IAED,IAAY,UAAU;QACpB,OAAO,CACL,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,aAAa,CAAC;YAC7C,2BAA2B,CAC5B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,WAAmB;QAKnC,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,GAAG,IAAI,CAAC,cAAc,wBAAwB,EAC9C,EAAE,KAAK,EAAE,WAAW,EAAE,EACtB;YACE,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,eAAe,EAAE,EAAE;gBACnD,cAAc,EAAE,kBAAkB;aACnC;YACD,OAAO,EAAE,IAAI;SACd,CACF,CACF,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,YAAqB;QACpC,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,YAAY;YAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC;QAEnD,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,eAAe,EAAE;YACtD,OAAO;YACP,OAAO,EAAE,IAAI;SACd,CAAC,CACH,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,mBAAmB,MAAM,EAAE,EAAE;YACtE,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,eAAe,EAAE,EAAE;aACpD;YACD,OAAO,EAAE,IAAI;SACd,CAAC,CACH,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAc,EACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,wBAAwB,EAAE;YAC/D,OAAO,EAAE,IAAI;SACd,CAAC,CACH,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAEO,eAAe;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,qBAAqB,CAAC,IAAI,EAAE,CAAC;IACrE,CAAC;CACF,CAAA;AA1FY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAGqB,mBAAW;QACT,sBAAa;GAHpC,aAAa,CA0FzB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { HttpService } from '@nestjs/axios';
|
|
2
|
+
import { ConfigService } from '@nestjs/config';
|
|
3
|
+
export declare class SsoMessageProxyService {
|
|
4
|
+
private readonly httpService;
|
|
5
|
+
private readonly configService;
|
|
6
|
+
constructor(httpService: HttpService, configService: ConfigService);
|
|
7
|
+
private get ssoBaseUrl();
|
|
8
|
+
forwardGet(path: string, params: Record<string, unknown>, authHeader?: string): Promise<any>;
|
|
9
|
+
forwardPatch(path: string, body: unknown, authHeader?: string): Promise<any>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=sso-message-proxy.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-message-proxy.service.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/sso/sso-message-proxy.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,qBACa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa;gBADb,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa;IAG/C,OAAO,KAAK,UAAU,GAKrB;IAEK,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,UAAU,CAAC,EAAE,MAAM;IAWf,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM;CAWpE"}
|