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 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.
@@ -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,CAwEnC;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,QAAe,CAAC;AAEnC;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAQ9C"}
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)
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
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;AA2CxB;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDnC,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,iBAAiB,GAAG,iBAAiB,GAAG,MAAM,CAAC;CACxD;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,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,CAsRtC"}
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"}