domain-search-mcp 1.2.28 → 1.2.29
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/.env.example +14 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -1
- package/dist/services/qwen-inference.d.ts +163 -0
- package/dist/services/qwen-inference.d.ts.map +1 -0
- package/dist/services/qwen-inference.js +326 -0
- package/dist/services/qwen-inference.js.map +1 -0
- package/dist/tools/suggest_domains_smart.d.ts +2 -1
- package/dist/tools/suggest_domains_smart.d.ts.map +1 -1
- package/dist/tools/suggest_domains_smart.js +47 -5
- package/dist/tools/suggest_domains_smart.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/config.ts +9 -0
- package/src/services/qwen-inference.ts +420 -0
- package/src/tools/suggest_domains_smart.ts +52 -7
- package/src/types.ts +9 -0
package/.env.example
CHANGED
|
@@ -18,6 +18,20 @@ PRICING_API_MAX_QUOTES_SEARCH=5
|
|
|
18
18
|
PRICING_API_MAX_QUOTES_BULK=10
|
|
19
19
|
PRICING_API_CONCURRENCY=4
|
|
20
20
|
|
|
21
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
22
|
+
# AI-POWERED SUGGESTIONS (Optional - Self-Hosted Only)
|
|
23
|
+
# Deploy Qwen 2.5-7B inference server on your VPS for AI domain suggestions.
|
|
24
|
+
# Falls back to semantic engine + GoDaddy if not configured.
|
|
25
|
+
# Example: http://localhost:8000
|
|
26
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
27
|
+
QWEN_INFERENCE_ENDPOINT=
|
|
28
|
+
# Optional: API key if you secure your inference server
|
|
29
|
+
QWEN_API_KEY=
|
|
30
|
+
# Timeout for inference requests (15 seconds default for CPU inference)
|
|
31
|
+
QWEN_TIMEOUT_MS=15000
|
|
32
|
+
# Number of retries on 5xx errors or timeouts
|
|
33
|
+
QWEN_MAX_RETRIES=2
|
|
34
|
+
|
|
21
35
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
22
36
|
# OPTIONAL BYOK (Local) - not required for zero-config usage
|
|
23
37
|
# These are used only if PRICING_API_BASE_URL is not set.
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AA8CzC;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AA8CzC;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAgFnC;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,QAAe,CAAC;AAEnC;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAS9C"}
|
package/dist/config.js
CHANGED
|
@@ -57,6 +57,7 @@ function loadConfig() {
|
|
|
57
57
|
const hasPorkbun = !!(env.PORKBUN_API_KEY && env.PORKBUN_API_SECRET);
|
|
58
58
|
const hasNamecheap = !!(env.NAMECHEAP_API_KEY && env.NAMECHEAP_API_USER);
|
|
59
59
|
const hasPricingApi = !!env.PRICING_API_BASE_URL;
|
|
60
|
+
const hasQwen = !!env.QWEN_INFERENCE_ENDPOINT;
|
|
60
61
|
const config = {
|
|
61
62
|
porkbun: {
|
|
62
63
|
apiKey: env.PORKBUN_API_KEY,
|
|
@@ -78,6 +79,13 @@ function loadConfig() {
|
|
|
78
79
|
concurrency: parseIntWithDefault(env.PRICING_API_CONCURRENCY, 4),
|
|
79
80
|
token: env.PRICING_API_TOKEN,
|
|
80
81
|
},
|
|
82
|
+
qwenInference: {
|
|
83
|
+
endpoint: env.QWEN_INFERENCE_ENDPOINT,
|
|
84
|
+
apiKey: env.QWEN_API_KEY,
|
|
85
|
+
enabled: hasQwen,
|
|
86
|
+
timeoutMs: parseIntWithDefault(env.QWEN_TIMEOUT_MS, 15000),
|
|
87
|
+
maxRetries: parseIntWithDefault(env.QWEN_MAX_RETRIES, 2),
|
|
88
|
+
},
|
|
81
89
|
logLevel: env.LOG_LEVEL || 'info',
|
|
82
90
|
cache: {
|
|
83
91
|
availabilityTtl: parseIntWithDefault(env.CACHE_TTL_AVAILABILITY, 60),
|
|
@@ -133,6 +141,8 @@ function hasRegistrarApi() {
|
|
|
133
141
|
*/
|
|
134
142
|
function getAvailableSources() {
|
|
135
143
|
const sources = [];
|
|
144
|
+
if (exports.config.qwenInference?.enabled)
|
|
145
|
+
sources.push('qwen_inference');
|
|
136
146
|
if (exports.config.pricingApi.enabled)
|
|
137
147
|
sources.push('pricing_api');
|
|
138
148
|
if (exports.config.porkbun.enabled)
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAoDH,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qwen Inference API client.
|
|
3
|
+
*
|
|
4
|
+
* Optional AI-powered domain suggestions using fine-tuned Qwen 2.5-7B model.
|
|
5
|
+
* Falls back gracefully if endpoint is not configured or unavailable.
|
|
6
|
+
*
|
|
7
|
+
* This MCP does NOT require Qwen to function - it's an optional enhancement
|
|
8
|
+
* for self-hosted users who deploy the inference server on their VPS.
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
/**
|
|
12
|
+
* Domain suggestion from Qwen model.
|
|
13
|
+
*/
|
|
14
|
+
export declare const QwenDomainSchema: z.ZodObject<{
|
|
15
|
+
name: z.ZodString;
|
|
16
|
+
tld: z.ZodString;
|
|
17
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
18
|
+
}, "strip", z.ZodTypeAny, {
|
|
19
|
+
name: string;
|
|
20
|
+
tld: string;
|
|
21
|
+
reason?: string | undefined;
|
|
22
|
+
}, {
|
|
23
|
+
name: string;
|
|
24
|
+
tld: string;
|
|
25
|
+
reason?: string | undefined;
|
|
26
|
+
}>;
|
|
27
|
+
export type QwenDomain = z.infer<typeof QwenDomainSchema>;
|
|
28
|
+
/**
|
|
29
|
+
* Request payload to Qwen inference API.
|
|
30
|
+
*/
|
|
31
|
+
export declare const QwenRequestSchema: z.ZodObject<{
|
|
32
|
+
prompt: z.ZodString;
|
|
33
|
+
style: z.ZodOptional<z.ZodEnum<["brandable", "descriptive", "short", "creative"]>>;
|
|
34
|
+
max_tokens: z.ZodOptional<z.ZodNumber>;
|
|
35
|
+
temperature: z.ZodOptional<z.ZodNumber>;
|
|
36
|
+
}, "strip", z.ZodTypeAny, {
|
|
37
|
+
prompt: string;
|
|
38
|
+
style?: "creative" | "brandable" | "descriptive" | "short" | undefined;
|
|
39
|
+
max_tokens?: number | undefined;
|
|
40
|
+
temperature?: number | undefined;
|
|
41
|
+
}, {
|
|
42
|
+
prompt: string;
|
|
43
|
+
style?: "creative" | "brandable" | "descriptive" | "short" | undefined;
|
|
44
|
+
max_tokens?: number | undefined;
|
|
45
|
+
temperature?: number | undefined;
|
|
46
|
+
}>;
|
|
47
|
+
export type QwenRequest = z.infer<typeof QwenRequestSchema>;
|
|
48
|
+
/**
|
|
49
|
+
* Response from Qwen inference API.
|
|
50
|
+
*/
|
|
51
|
+
export declare const QwenResponseSchema: z.ZodObject<{
|
|
52
|
+
domains: z.ZodArray<z.ZodObject<{
|
|
53
|
+
name: z.ZodString;
|
|
54
|
+
tld: z.ZodString;
|
|
55
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
56
|
+
}, "strip", z.ZodTypeAny, {
|
|
57
|
+
name: string;
|
|
58
|
+
tld: string;
|
|
59
|
+
reason?: string | undefined;
|
|
60
|
+
}, {
|
|
61
|
+
name: string;
|
|
62
|
+
tld: string;
|
|
63
|
+
reason?: string | undefined;
|
|
64
|
+
}>, "many">;
|
|
65
|
+
raw_response: z.ZodString;
|
|
66
|
+
inference_time_ms: z.ZodNumber;
|
|
67
|
+
cached: z.ZodBoolean;
|
|
68
|
+
}, "strip", z.ZodTypeAny, {
|
|
69
|
+
domains: {
|
|
70
|
+
name: string;
|
|
71
|
+
tld: string;
|
|
72
|
+
reason?: string | undefined;
|
|
73
|
+
}[];
|
|
74
|
+
raw_response: string;
|
|
75
|
+
inference_time_ms: number;
|
|
76
|
+
cached: boolean;
|
|
77
|
+
}, {
|
|
78
|
+
domains: {
|
|
79
|
+
name: string;
|
|
80
|
+
tld: string;
|
|
81
|
+
reason?: string | undefined;
|
|
82
|
+
}[];
|
|
83
|
+
raw_response: string;
|
|
84
|
+
inference_time_ms: number;
|
|
85
|
+
cached: boolean;
|
|
86
|
+
}>;
|
|
87
|
+
export type QwenResponse = z.infer<typeof QwenResponseSchema>;
|
|
88
|
+
/**
|
|
89
|
+
* Options for Qwen suggestion request.
|
|
90
|
+
*/
|
|
91
|
+
export interface QwenSuggestOptions {
|
|
92
|
+
query: string;
|
|
93
|
+
style?: 'brandable' | 'descriptive' | 'short' | 'creative';
|
|
94
|
+
tld?: string;
|
|
95
|
+
max_suggestions?: number;
|
|
96
|
+
temperature?: number;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Custom error for Qwen inference failures.
|
|
100
|
+
*/
|
|
101
|
+
export declare class QwenInferenceError extends Error {
|
|
102
|
+
readonly code: 'TIMEOUT' | 'CONNECTION_REFUSED' | 'INVALID_RESPONSE' | 'SERVER_ERROR' | 'NOT_CONFIGURED';
|
|
103
|
+
readonly statusCode?: number | undefined;
|
|
104
|
+
constructor(message: string, code: 'TIMEOUT' | 'CONNECTION_REFUSED' | 'INVALID_RESPONSE' | 'SERVER_ERROR' | 'NOT_CONFIGURED', statusCode?: number | undefined);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Qwen Inference API client with retry logic and caching.
|
|
108
|
+
*/
|
|
109
|
+
export declare class QwenInferenceClient {
|
|
110
|
+
private readonly endpoint;
|
|
111
|
+
private readonly apiKey?;
|
|
112
|
+
private readonly timeoutMs;
|
|
113
|
+
private readonly maxRetries;
|
|
114
|
+
private readonly cache;
|
|
115
|
+
constructor(endpoint: string, options?: {
|
|
116
|
+
apiKey?: string;
|
|
117
|
+
timeoutMs?: number;
|
|
118
|
+
maxRetries?: number;
|
|
119
|
+
cacheTtl?: number;
|
|
120
|
+
});
|
|
121
|
+
/**
|
|
122
|
+
* Generate domain suggestions using Qwen model.
|
|
123
|
+
*
|
|
124
|
+
* Returns suggestions or null if Qwen is unavailable.
|
|
125
|
+
* Graceful degradation - caller should fall back to other sources.
|
|
126
|
+
*/
|
|
127
|
+
suggest(options: QwenSuggestOptions): Promise<QwenDomain[] | null>;
|
|
128
|
+
/**
|
|
129
|
+
* Build prompt for Qwen model based on style and context.
|
|
130
|
+
*
|
|
131
|
+
* Uses the structured format the model was fine-tuned on.
|
|
132
|
+
*/
|
|
133
|
+
private _buildPrompt;
|
|
134
|
+
/**
|
|
135
|
+
* Calculate max_tokens based on number of suggestions.
|
|
136
|
+
*/
|
|
137
|
+
private _calculateMaxTokens;
|
|
138
|
+
/**
|
|
139
|
+
* Parse domain names from model-generated text.
|
|
140
|
+
*
|
|
141
|
+
* Matches the fine-tuned model's output format:
|
|
142
|
+
* - domain.tld — Reason
|
|
143
|
+
* - domain.tld - Reason
|
|
144
|
+
*/
|
|
145
|
+
private _parseDomainsFromText;
|
|
146
|
+
/**
|
|
147
|
+
* Make HTTP request with timeout and error handling.
|
|
148
|
+
*/
|
|
149
|
+
private _makeRequest;
|
|
150
|
+
/**
|
|
151
|
+
* Make request with exponential backoff retry.
|
|
152
|
+
*
|
|
153
|
+
* Retries on 5xx errors and timeouts, no retry on 4xx errors.
|
|
154
|
+
*/
|
|
155
|
+
private _makeRequestWithRetry;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get Qwen client instance (singleton).
|
|
159
|
+
*
|
|
160
|
+
* Returns null if Qwen is not configured - caller should fall back to other sources.
|
|
161
|
+
*/
|
|
162
|
+
export declare function getQwenClient(): QwenInferenceClient | null;
|
|
163
|
+
//# sourceMappingURL=qwen-inference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen-inference.d.ts","sourceRoot":"","sources":["../../src/services/qwen-inference.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EAI3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;EAK5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,OAAO,GAAG,UAAU,CAAC;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,IAAI,EAChB,SAAS,GACT,oBAAoB,GACpB,kBAAkB,GAClB,cAAc,GACd,gBAAgB;aACJ,UAAU,CAAC,EAAE,MAAM;gBAPnC,OAAO,EAAE,MAAM,EACC,IAAI,EAChB,SAAS,GACT,oBAAoB,GACpB,kBAAkB,GAClB,cAAc,GACd,gBAAgB,EACJ,UAAU,CAAC,EAAE,MAAM,YAAA;CAKtC;AAMD;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;gBAG7C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACd;IASR;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC;IA4DxE;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAsB7B;;OAEG;YACW,YAAY;IAgG1B;;;;OAIG;YACW,qBAAqB;CAuCpC;AAQD;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,mBAAmB,GAAG,IAAI,CA2B1D"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Qwen Inference API client.
|
|
4
|
+
*
|
|
5
|
+
* Optional AI-powered domain suggestions using fine-tuned Qwen 2.5-7B model.
|
|
6
|
+
* Falls back gracefully if endpoint is not configured or unavailable.
|
|
7
|
+
*
|
|
8
|
+
* This MCP does NOT require Qwen to function - it's an optional enhancement
|
|
9
|
+
* for self-hosted users who deploy the inference server on their VPS.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.QwenInferenceClient = exports.QwenInferenceError = exports.QwenResponseSchema = exports.QwenRequestSchema = exports.QwenDomainSchema = void 0;
|
|
13
|
+
exports.getQwenClient = getQwenClient;
|
|
14
|
+
const zod_1 = require("zod");
|
|
15
|
+
const config_js_1 = require("../config.js");
|
|
16
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
17
|
+
const cache_js_1 = require("../utils/cache.js");
|
|
18
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
19
|
+
// TYPES & SCHEMAS
|
|
20
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
21
|
+
/**
|
|
22
|
+
* Domain suggestion from Qwen model.
|
|
23
|
+
*/
|
|
24
|
+
exports.QwenDomainSchema = zod_1.z.object({
|
|
25
|
+
name: zod_1.z.string().min(1),
|
|
26
|
+
tld: zod_1.z.string().min(1),
|
|
27
|
+
reason: zod_1.z.string().optional(),
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* Request payload to Qwen inference API.
|
|
31
|
+
*/
|
|
32
|
+
exports.QwenRequestSchema = zod_1.z.object({
|
|
33
|
+
prompt: zod_1.z.string().min(10).max(1000),
|
|
34
|
+
style: zod_1.z.enum(['brandable', 'descriptive', 'short', 'creative']).optional(),
|
|
35
|
+
max_tokens: zod_1.z.number().int().min(128).max(1024).optional(),
|
|
36
|
+
temperature: zod_1.z.number().min(0.1).max(1.5).optional(),
|
|
37
|
+
});
|
|
38
|
+
/**
|
|
39
|
+
* Response from Qwen inference API.
|
|
40
|
+
*/
|
|
41
|
+
exports.QwenResponseSchema = zod_1.z.object({
|
|
42
|
+
domains: zod_1.z.array(exports.QwenDomainSchema),
|
|
43
|
+
raw_response: zod_1.z.string(),
|
|
44
|
+
inference_time_ms: zod_1.z.number(),
|
|
45
|
+
cached: zod_1.z.boolean(),
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* Custom error for Qwen inference failures.
|
|
49
|
+
*/
|
|
50
|
+
class QwenInferenceError extends Error {
|
|
51
|
+
code;
|
|
52
|
+
statusCode;
|
|
53
|
+
constructor(message, code, statusCode) {
|
|
54
|
+
super(message);
|
|
55
|
+
this.code = code;
|
|
56
|
+
this.statusCode = statusCode;
|
|
57
|
+
this.name = 'QwenInferenceError';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.QwenInferenceError = QwenInferenceError;
|
|
61
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
62
|
+
// CLIENT IMPLEMENTATION
|
|
63
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
64
|
+
/**
|
|
65
|
+
* Qwen Inference API client with retry logic and caching.
|
|
66
|
+
*/
|
|
67
|
+
class QwenInferenceClient {
|
|
68
|
+
endpoint;
|
|
69
|
+
apiKey;
|
|
70
|
+
timeoutMs;
|
|
71
|
+
maxRetries;
|
|
72
|
+
cache;
|
|
73
|
+
constructor(endpoint, options = {}) {
|
|
74
|
+
this.endpoint = endpoint.replace(/\/+$/, ''); // Remove trailing slash
|
|
75
|
+
this.apiKey = options.apiKey;
|
|
76
|
+
this.timeoutMs = options.timeoutMs || 15000;
|
|
77
|
+
this.maxRetries = options.maxRetries || 2;
|
|
78
|
+
this.cache = new cache_js_1.TtlCache(options.cacheTtl || 3600, 100);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Generate domain suggestions using Qwen model.
|
|
82
|
+
*
|
|
83
|
+
* Returns suggestions or null if Qwen is unavailable.
|
|
84
|
+
* Graceful degradation - caller should fall back to other sources.
|
|
85
|
+
*/
|
|
86
|
+
async suggest(options) {
|
|
87
|
+
const { query, style = 'brandable', tld = 'com', max_suggestions = 10, temperature = 0.7 } = options;
|
|
88
|
+
// Build prompt
|
|
89
|
+
const prompt = this._buildPrompt(query, style, tld, max_suggestions);
|
|
90
|
+
// Check cache first
|
|
91
|
+
const cacheKey = `${prompt}:${temperature}`;
|
|
92
|
+
const cached = this.cache.get(cacheKey);
|
|
93
|
+
if (cached) {
|
|
94
|
+
logger_js_1.logger.debug('Qwen cache hit', { query, cached_domains: cached.domains.length });
|
|
95
|
+
return cached.domains;
|
|
96
|
+
}
|
|
97
|
+
// Make request with retry
|
|
98
|
+
try {
|
|
99
|
+
const response = await this._makeRequestWithRetry({
|
|
100
|
+
prompt,
|
|
101
|
+
style,
|
|
102
|
+
max_tokens: this._calculateMaxTokens(max_suggestions),
|
|
103
|
+
temperature,
|
|
104
|
+
});
|
|
105
|
+
// Validate response
|
|
106
|
+
const validated = exports.QwenResponseSchema.safeParse(response);
|
|
107
|
+
if (!validated.success) {
|
|
108
|
+
logger_js_1.logger.warn('Qwen returned invalid response format', {
|
|
109
|
+
error: validated.error.message,
|
|
110
|
+
});
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
// Cache successful response
|
|
114
|
+
this.cache.set(cacheKey, validated.data);
|
|
115
|
+
logger_js_1.logger.info('Qwen inference success', {
|
|
116
|
+
query,
|
|
117
|
+
domains: validated.data.domains.length,
|
|
118
|
+
inference_ms: validated.data.inference_time_ms,
|
|
119
|
+
cached: validated.data.cached,
|
|
120
|
+
});
|
|
121
|
+
return validated.data.domains;
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (error instanceof QwenInferenceError) {
|
|
125
|
+
logger_js_1.logger.warn('Qwen inference failed', {
|
|
126
|
+
code: error.code,
|
|
127
|
+
message: error.message,
|
|
128
|
+
statusCode: error.statusCode,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
logger_js_1.logger.warn('Qwen inference error', {
|
|
133
|
+
error: error instanceof Error ? error.message : String(error),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return null; // Graceful degradation
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Build prompt for Qwen model based on style and context.
|
|
141
|
+
*
|
|
142
|
+
* Uses the structured format the model was fine-tuned on.
|
|
143
|
+
*/
|
|
144
|
+
_buildPrompt(query, style, tld, maxSuggestions) {
|
|
145
|
+
return `Query: ${query}
|
|
146
|
+
Style: ${style}
|
|
147
|
+
TLD: ${tld}
|
|
148
|
+
Count: ${maxSuggestions}
|
|
149
|
+
|
|
150
|
+
Domains:`;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Calculate max_tokens based on number of suggestions.
|
|
154
|
+
*/
|
|
155
|
+
_calculateMaxTokens(maxSuggestions) {
|
|
156
|
+
// ~50 tokens per suggestion (name + tld + reason)
|
|
157
|
+
return Math.min(128 + maxSuggestions * 50, 1024);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Parse domain names from model-generated text.
|
|
161
|
+
*
|
|
162
|
+
* Matches the fine-tuned model's output format:
|
|
163
|
+
* - domain.tld — Reason
|
|
164
|
+
* - domain.tld - Reason
|
|
165
|
+
*/
|
|
166
|
+
_parseDomainsFromText(text) {
|
|
167
|
+
const domains = [];
|
|
168
|
+
const lines = text.split('\n').filter((l) => l.trim());
|
|
169
|
+
for (const line of lines) {
|
|
170
|
+
// Match: "- domain.tld — reason" or "- domain.tld - reason"
|
|
171
|
+
const match = line.match(/^[-*]\s*([a-z0-9-]+)\.([a-z]+)\s*[—\-:]\s*(.+)$/i);
|
|
172
|
+
if (match && match[1] && match[2]) {
|
|
173
|
+
const name = match[1];
|
|
174
|
+
const tld = match[2];
|
|
175
|
+
const reason = match[3];
|
|
176
|
+
domains.push({
|
|
177
|
+
name: name.toLowerCase(),
|
|
178
|
+
tld: tld.toLowerCase(),
|
|
179
|
+
reason: reason?.trim(),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return domains;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Make HTTP request with timeout and error handling.
|
|
187
|
+
*/
|
|
188
|
+
async _makeRequest(payload) {
|
|
189
|
+
const controller = new AbortController();
|
|
190
|
+
const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
191
|
+
try {
|
|
192
|
+
const headers = {
|
|
193
|
+
'Content-Type': 'application/json',
|
|
194
|
+
};
|
|
195
|
+
if (this.apiKey) {
|
|
196
|
+
headers['Authorization'] = `Bearer ${this.apiKey}`;
|
|
197
|
+
}
|
|
198
|
+
// llama.cpp uses OpenAI-compatible /v1/completions endpoint
|
|
199
|
+
const llamaPayload = {
|
|
200
|
+
prompt: payload.prompt,
|
|
201
|
+
max_tokens: payload.max_tokens || 512,
|
|
202
|
+
temperature: payload.temperature || 0.7,
|
|
203
|
+
stop: ['Query:', '\n\nQuery:'], // Stop when model starts new query
|
|
204
|
+
};
|
|
205
|
+
const response = await fetch(`${this.endpoint}/v1/completions`, {
|
|
206
|
+
method: 'POST',
|
|
207
|
+
headers,
|
|
208
|
+
body: JSON.stringify(llamaPayload),
|
|
209
|
+
signal: controller.signal,
|
|
210
|
+
});
|
|
211
|
+
// Handle non-200 responses
|
|
212
|
+
if (!response.ok) {
|
|
213
|
+
const text = await response.text().catch(() => 'Unknown error');
|
|
214
|
+
throw new QwenInferenceError(`HTTP ${response.status}: ${text}`, response.status >= 500 ? 'SERVER_ERROR' : 'INVALID_RESPONSE', response.status);
|
|
215
|
+
}
|
|
216
|
+
// Parse llama.cpp OpenAI-compatible response
|
|
217
|
+
const json = (await response.json());
|
|
218
|
+
// Extract generated text from llama.cpp response
|
|
219
|
+
if (!json.choices || !Array.isArray(json.choices) || json.choices.length === 0) {
|
|
220
|
+
throw new QwenInferenceError('Invalid llama.cpp response: no choices', 'INVALID_RESPONSE');
|
|
221
|
+
}
|
|
222
|
+
const generatedText = json.choices[0]?.text || '';
|
|
223
|
+
const inferenceTimeMs = json.timings?.predicted_ms || 0;
|
|
224
|
+
// Parse domains from generated text
|
|
225
|
+
const domains = this._parseDomainsFromText(generatedText);
|
|
226
|
+
// Return in expected QwenResponse format
|
|
227
|
+
return {
|
|
228
|
+
domains,
|
|
229
|
+
raw_response: generatedText,
|
|
230
|
+
inference_time_ms: inferenceTimeMs,
|
|
231
|
+
cached: false,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
if (error instanceof QwenInferenceError) {
|
|
236
|
+
throw error;
|
|
237
|
+
}
|
|
238
|
+
// Handle timeout
|
|
239
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
240
|
+
throw new QwenInferenceError(`Request timeout after ${this.timeoutMs}ms`, 'TIMEOUT');
|
|
241
|
+
}
|
|
242
|
+
// Handle connection refused
|
|
243
|
+
if (error instanceof Error && error.message.includes('ECONNREFUSED')) {
|
|
244
|
+
throw new QwenInferenceError('Connection refused - inference server may be down', 'CONNECTION_REFUSED');
|
|
245
|
+
}
|
|
246
|
+
// Generic error
|
|
247
|
+
throw new QwenInferenceError(error instanceof Error ? error.message : String(error), 'SERVER_ERROR');
|
|
248
|
+
}
|
|
249
|
+
finally {
|
|
250
|
+
clearTimeout(timeout);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Make request with exponential backoff retry.
|
|
255
|
+
*
|
|
256
|
+
* Retries on 5xx errors and timeouts, no retry on 4xx errors.
|
|
257
|
+
*/
|
|
258
|
+
async _makeRequestWithRetry(payload) {
|
|
259
|
+
let lastError = null;
|
|
260
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
261
|
+
try {
|
|
262
|
+
return await this._makeRequest(payload);
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
if (!(error instanceof QwenInferenceError)) {
|
|
266
|
+
throw error;
|
|
267
|
+
}
|
|
268
|
+
lastError = error;
|
|
269
|
+
// Don't retry on 4xx errors (bad request)
|
|
270
|
+
if (error.statusCode && error.statusCode >= 400 && error.statusCode < 500) {
|
|
271
|
+
throw error;
|
|
272
|
+
}
|
|
273
|
+
// Don't retry on last attempt
|
|
274
|
+
if (attempt === this.maxRetries) {
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
// Exponential backoff: 500ms, 1000ms, 2000ms
|
|
278
|
+
const backoffMs = 500 * Math.pow(2, attempt);
|
|
279
|
+
logger_js_1.logger.debug('Qwen request failed, retrying', {
|
|
280
|
+
attempt: attempt + 1,
|
|
281
|
+
maxRetries: this.maxRetries,
|
|
282
|
+
backoffMs,
|
|
283
|
+
error: error.message,
|
|
284
|
+
});
|
|
285
|
+
await new Promise((resolve) => setTimeout(resolve, backoffMs));
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// All retries exhausted
|
|
289
|
+
throw lastError;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
exports.QwenInferenceClient = QwenInferenceClient;
|
|
293
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
294
|
+
// SINGLETON INSTANCE
|
|
295
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
296
|
+
let qwenClient = undefined;
|
|
297
|
+
/**
|
|
298
|
+
* Get Qwen client instance (singleton).
|
|
299
|
+
*
|
|
300
|
+
* Returns null if Qwen is not configured - caller should fall back to other sources.
|
|
301
|
+
*/
|
|
302
|
+
function getQwenClient() {
|
|
303
|
+
// Return cached instance
|
|
304
|
+
if (qwenClient !== undefined) {
|
|
305
|
+
return qwenClient;
|
|
306
|
+
}
|
|
307
|
+
// Check if Qwen is configured
|
|
308
|
+
if (!config_js_1.config.qwenInference?.enabled || !config_js_1.config.qwenInference.endpoint) {
|
|
309
|
+
qwenClient = null;
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
// Create new instance
|
|
313
|
+
qwenClient = new QwenInferenceClient(config_js_1.config.qwenInference.endpoint, {
|
|
314
|
+
apiKey: config_js_1.config.qwenInference.apiKey,
|
|
315
|
+
timeoutMs: config_js_1.config.qwenInference.timeoutMs,
|
|
316
|
+
maxRetries: config_js_1.config.qwenInference.maxRetries,
|
|
317
|
+
cacheTtl: 3600, // 1 hour cache
|
|
318
|
+
});
|
|
319
|
+
logger_js_1.logger.info('Qwen inference client initialized', {
|
|
320
|
+
endpoint: config_js_1.config.qwenInference.endpoint,
|
|
321
|
+
timeoutMs: config_js_1.config.qwenInference.timeoutMs,
|
|
322
|
+
maxRetries: config_js_1.config.qwenInference.maxRetries,
|
|
323
|
+
});
|
|
324
|
+
return qwenClient;
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=qwen-inference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen-inference.js","sourceRoot":"","sources":["../../src/services/qwen-inference.ts"],"names":[],"mappings":"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"}
|
|
@@ -85,7 +85,7 @@ interface SmartSuggestion {
|
|
|
85
85
|
privacy_included: boolean;
|
|
86
86
|
score: number;
|
|
87
87
|
category: 'standard' | 'premium' | 'auction' | 'unavailable';
|
|
88
|
-
source: 'semantic_engine' | 'godaddy_suggest' | 'both';
|
|
88
|
+
source: 'qwen_inference' | 'semantic_engine' | 'godaddy_suggest' | 'both';
|
|
89
89
|
}
|
|
90
90
|
/**
|
|
91
91
|
* Response format for smart suggestions.
|
|
@@ -97,6 +97,7 @@ interface SuggestDomainsSmartResponse {
|
|
|
97
97
|
tld: string;
|
|
98
98
|
style: string;
|
|
99
99
|
sources: {
|
|
100
|
+
qwen_inference: number;
|
|
100
101
|
semantic_engine: number;
|
|
101
102
|
godaddy_suggest: number;
|
|
102
103
|
merged: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggest_domains_smart.d.ts","sourceRoot":"","sources":["../../src/tools/suggest_domains_smart.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"suggest_domains_smart.d.ts","sourceRoot":"","sources":["../../src/tools/suggest_domains_smart.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA4CxB;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;EAuCpC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDnC,CAAC;AA8CF;;GAEG;AACH,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;IAC7D,MAAM,EAAE,gBAAgB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,MAAM,CAAC;CAC3E;AAED;;GAEG;AACH,UAAU,2BAA2B;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE;QACP,SAAS,EAAE,eAAe,EAAE,CAAC;QAC7B,OAAO,EAAE,eAAe,EAAE,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,2BAA2B,CAAC,CAgUtC"}
|