@mcpmake/core 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/dist/analyzer/dom-parser.d.ts +35 -0
  2. package/dist/analyzer/dom-parser.d.ts.map +1 -1
  3. package/dist/analyzer/dom-parser.js +107 -6
  4. package/dist/analyzer/dom-parser.js.map +1 -1
  5. package/dist/analyzer/goal-crawler.d.ts +2 -1
  6. package/dist/analyzer/goal-crawler.d.ts.map +1 -1
  7. package/dist/analyzer/goal-crawler.js +66 -17
  8. package/dist/analyzer/goal-crawler.js.map +1 -1
  9. package/dist/analyzer/semantic-analyzer.d.ts +1 -1
  10. package/dist/analyzer/semantic-analyzer.d.ts.map +1 -1
  11. package/dist/analyzer/semantic-analyzer.js +15 -16
  12. package/dist/analyzer/semantic-analyzer.js.map +1 -1
  13. package/dist/analyzer/site-crawler.d.ts.map +1 -1
  14. package/dist/analyzer/site-crawler.js +122 -16
  15. package/dist/analyzer/site-crawler.js.map +1 -1
  16. package/dist/config/mcpmake-config.d.ts.map +1 -1
  17. package/dist/config/mcpmake-config.js +5 -0
  18. package/dist/config/mcpmake-config.js.map +1 -1
  19. package/dist/emitter/code-writer.d.ts +1 -0
  20. package/dist/emitter/code-writer.d.ts.map +1 -1
  21. package/dist/emitter/code-writer.js +79 -12
  22. package/dist/emitter/code-writer.js.map +1 -1
  23. package/dist/emitter/index.d.ts +8 -0
  24. package/dist/emitter/index.d.ts.map +1 -1
  25. package/dist/emitter/index.js +113 -6
  26. package/dist/emitter/index.js.map +1 -1
  27. package/dist/emitter/project-scaffolder.d.ts +13 -0
  28. package/dist/emitter/project-scaffolder.d.ts.map +1 -1
  29. package/dist/emitter/project-scaffolder.js +29 -0
  30. package/dist/emitter/project-scaffolder.js.map +1 -1
  31. package/dist/emitter/python-template-loader.d.ts.map +1 -1
  32. package/dist/emitter/python-template-loader.js +10 -0
  33. package/dist/emitter/python-template-loader.js.map +1 -1
  34. package/dist/emitter/python-templates/dockerfile.hbs +4 -1
  35. package/dist/emitter/python-templates/server.py.hbs +82 -8
  36. package/dist/emitter/site-scaffolder.d.ts.map +1 -1
  37. package/dist/emitter/site-scaffolder.js +28 -1
  38. package/dist/emitter/site-scaffolder.js.map +1 -1
  39. package/dist/emitter/site-templates/browser-manager.ts.hbs +104 -34
  40. package/dist/emitter/site-templates/dockerfile.hbs +13 -4
  41. package/dist/emitter/site-templates/env.example.hbs +8 -0
  42. package/dist/emitter/site-templates/server-main-http.ts.hbs +77 -6
  43. package/dist/emitter/site-templates/telemetry.ts.hbs +117 -0
  44. package/dist/emitter/site-templates/tool-handler-form.ts.hbs +10 -8
  45. package/dist/emitter/template-loader.d.ts.map +1 -1
  46. package/dist/emitter/template-loader.js +9 -0
  47. package/dist/emitter/template-loader.js.map +1 -1
  48. package/dist/emitter/templates/auth-provider.ts.hbs +86 -21
  49. package/dist/emitter/templates/config.ts.hbs +29 -0
  50. package/dist/emitter/templates/dockerfile.hbs +12 -4
  51. package/dist/emitter/templates/env.example.hbs +6 -0
  52. package/dist/emitter/templates/http-executor.ts.hbs +150 -7
  53. package/dist/emitter/templates/oauth.ts.hbs +19 -65
  54. package/dist/emitter/templates/server-main-http.ts.hbs +93 -12
  55. package/dist/emitter/templates/task-handlers.ts.hbs +40 -1
  56. package/dist/emitter/templates/tool-handler.ts.hbs +37 -2
  57. package/dist/emitter/templates/tool-test.ts.hbs +9 -1
  58. package/dist/emitter/worker-templates/config.ts.hbs +7 -0
  59. package/dist/emitter/worker-templates/tool-handler.ts.hbs +37 -2
  60. package/dist/emitter/worker-templates/worker.ts.hbs +119 -25
  61. package/dist/generator/spec-generator.d.ts.map +1 -1
  62. package/dist/generator/spec-generator.js +9 -54
  63. package/dist/generator/spec-generator.js.map +1 -1
  64. package/dist/index.d.ts +1 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +1 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/llm/anthropic-provider.d.ts +14 -0
  69. package/dist/llm/anthropic-provider.d.ts.map +1 -0
  70. package/dist/llm/anthropic-provider.js +50 -0
  71. package/dist/llm/anthropic-provider.js.map +1 -0
  72. package/dist/llm/index.d.ts +19 -0
  73. package/dist/llm/index.d.ts.map +1 -0
  74. package/dist/llm/index.js +73 -0
  75. package/dist/llm/index.js.map +1 -0
  76. package/dist/llm/openai-provider.d.ts +46 -0
  77. package/dist/llm/openai-provider.d.ts.map +1 -0
  78. package/dist/llm/openai-provider.js +221 -0
  79. package/dist/llm/openai-provider.js.map +1 -0
  80. package/dist/llm/types.d.ts +61 -0
  81. package/dist/llm/types.d.ts.map +1 -0
  82. package/dist/llm/types.js +16 -0
  83. package/dist/llm/types.js.map +1 -0
  84. package/dist/parser/har-filter.d.ts +7 -0
  85. package/dist/parser/har-filter.d.ts.map +1 -1
  86. package/dist/parser/har-filter.js +107 -1
  87. package/dist/parser/har-filter.js.map +1 -1
  88. package/dist/parser/index.d.ts +1 -1
  89. package/dist/parser/index.d.ts.map +1 -1
  90. package/dist/parser/index.js +1 -1
  91. package/dist/parser/index.js.map +1 -1
  92. package/dist/parser/openapi-loader.d.ts.map +1 -1
  93. package/dist/parser/openapi-loader.js +36 -2
  94. package/dist/parser/openapi-loader.js.map +1 -1
  95. package/dist/parser/operation-extractor.d.ts.map +1 -1
  96. package/dist/parser/operation-extractor.js +12 -1
  97. package/dist/parser/operation-extractor.js.map +1 -1
  98. package/dist/parser/overlay-loader.d.ts.map +1 -1
  99. package/dist/parser/overlay-loader.js +11 -2
  100. package/dist/parser/overlay-loader.js.map +1 -1
  101. package/dist/parser/postman-loader.d.ts.map +1 -1
  102. package/dist/parser/postman-loader.js +6 -1
  103. package/dist/parser/postman-loader.js.map +1 -1
  104. package/dist/parser/schema-converter.d.ts +13 -2
  105. package/dist/parser/schema-converter.d.ts.map +1 -1
  106. package/dist/parser/schema-converter.js +64 -42
  107. package/dist/parser/schema-converter.js.map +1 -1
  108. package/dist/plugins/loader.d.ts +5 -1
  109. package/dist/plugins/loader.d.ts.map +1 -1
  110. package/dist/plugins/loader.js +39 -10
  111. package/dist/plugins/loader.js.map +1 -1
  112. package/dist/pricing.d.ts +5 -1
  113. package/dist/pricing.d.ts.map +1 -1
  114. package/dist/pricing.js +7 -3
  115. package/dist/pricing.js.map +1 -1
  116. package/dist/providers/index.d.ts.map +1 -1
  117. package/dist/providers/index.js +6 -21
  118. package/dist/providers/index.js.map +1 -1
  119. package/dist/recorder/browser-recorder.d.ts.map +1 -1
  120. package/dist/recorder/browser-recorder.js +89 -12
  121. package/dist/recorder/browser-recorder.js.map +1 -1
  122. package/dist/rescan/rescan-scheduler.d.ts.map +1 -1
  123. package/dist/rescan/rescan-scheduler.js +22 -7
  124. package/dist/rescan/rescan-scheduler.js.map +1 -1
  125. package/dist/site-transformer/selector-healer.d.ts +1 -1
  126. package/dist/site-transformer/selector-healer.d.ts.map +1 -1
  127. package/dist/site-transformer/selector-healer.js +17 -18
  128. package/dist/site-transformer/selector-healer.js.map +1 -1
  129. package/dist/site-transformer/tool-generator.d.ts.map +1 -1
  130. package/dist/site-transformer/tool-generator.js +90 -22
  131. package/dist/site-transformer/tool-generator.js.map +1 -1
  132. package/dist/transformer/auth-detector.d.ts.map +1 -1
  133. package/dist/transformer/auth-detector.js +24 -5
  134. package/dist/transformer/auth-detector.js.map +1 -1
  135. package/dist/transformer/har-schema-inferrer.d.ts.map +1 -1
  136. package/dist/transformer/har-schema-inferrer.js +2 -0
  137. package/dist/transformer/har-schema-inferrer.js.map +1 -1
  138. package/dist/transformer/har-to-operations.d.ts +1 -0
  139. package/dist/transformer/har-to-operations.d.ts.map +1 -1
  140. package/dist/transformer/har-to-operations.js +42 -10
  141. package/dist/transformer/har-to-operations.js.map +1 -1
  142. package/dist/transformer/llm-namer.d.ts.map +1 -1
  143. package/dist/transformer/llm-namer.js +10 -13
  144. package/dist/transformer/llm-namer.js.map +1 -1
  145. package/dist/transformer/naming.d.ts.map +1 -1
  146. package/dist/transformer/naming.js +16 -8
  147. package/dist/transformer/naming.js.map +1 -1
  148. package/dist/transformer/resource-builder.d.ts.map +1 -1
  149. package/dist/transformer/resource-builder.js +13 -6
  150. package/dist/transformer/resource-builder.js.map +1 -1
  151. package/dist/transformer/stainless-translator.d.ts +6 -0
  152. package/dist/transformer/stainless-translator.d.ts.map +1 -1
  153. package/dist/transformer/stainless-translator.js +18 -1
  154. package/dist/transformer/stainless-translator.js.map +1 -1
  155. package/dist/transformer/tool-builder.d.ts.map +1 -1
  156. package/dist/transformer/tool-builder.js +141 -14
  157. package/dist/transformer/tool-builder.js.map +1 -1
  158. package/dist/types/index.d.ts +79 -0
  159. package/dist/types/index.d.ts.map +1 -1
  160. package/dist/types/site.d.ts +19 -1
  161. package/dist/types/site.d.ts.map +1 -1
  162. package/dist/utils/fail.d.ts.map +1 -1
  163. package/dist/utils/fail.js +22 -4
  164. package/dist/utils/fail.js.map +1 -1
  165. package/dist/utils/json-extract.d.ts +21 -0
  166. package/dist/utils/json-extract.d.ts.map +1 -0
  167. package/dist/utils/json-extract.js +67 -0
  168. package/dist/utils/json-extract.js.map +1 -0
  169. package/dist/utils/model-resolver.d.ts.map +1 -1
  170. package/dist/utils/model-resolver.js +6 -0
  171. package/dist/utils/model-resolver.js.map +1 -1
  172. package/dist/utils/sanitize.d.ts +63 -1
  173. package/dist/utils/sanitize.d.ts.map +1 -1
  174. package/dist/utils/sanitize.js +147 -2
  175. package/dist/utils/sanitize.js.map +1 -1
  176. package/dist/utils/ssrf-guard.d.ts +10 -0
  177. package/dist/utils/ssrf-guard.d.ts.map +1 -0
  178. package/dist/utils/ssrf-guard.js +130 -0
  179. package/dist/utils/ssrf-guard.js.map +1 -0
  180. package/dist/utils/watcher.d.ts +17 -1
  181. package/dist/utils/watcher.d.ts.map +1 -1
  182. package/dist/utils/watcher.js +53 -21
  183. package/dist/utils/watcher.js.map +1 -1
  184. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"spec-generator.d.ts","sourceRoot":"","sources":["../../src/generator/spec-generator.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAcD,wBAAsB,2BAA2B,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+C/F"}
1
+ {"version":3,"file":"spec-generator.d.ts","sourceRoot":"","sources":["../../src/generator/spec-generator.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAcD,wBAAsB,2BAA2B,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkC/F"}
@@ -1,6 +1,6 @@
1
- import Anthropic from '@anthropic-ai/sdk';
1
+ import { extractJsonObject } from '../utils/json-extract.js';
2
2
  import { logger } from '../utils/logger.js';
3
- import { resolveModel } from '../utils/model-resolver.js';
3
+ import { requireLlmProvider } from '../llm/index.js';
4
4
  const SYSTEM_PROMPT = `You are an API architect. Given a description of an API or service, generate a valid OpenAPI 3.0 specification in JSON format.
5
5
 
6
6
  Rules:
@@ -13,32 +13,23 @@ Rules:
13
13
  - Include a servers array with a base URL
14
14
  - Keep it practical — 3-10 operations is typical`;
15
15
  export async function generateSpecFromDescription(options) {
16
- const apiKey = process.env.ANTHROPIC_API_KEY;
17
- if (!apiKey) {
18
- throw new Error('ANTHROPIC_API_KEY environment variable is required for describe mode.\n' +
19
- 'Set it with: export ANTHROPIC_API_KEY=your-key-here');
20
- }
21
- const client = new Anthropic({ apiKey });
22
- const model = await resolveModel(client, 'balanced', options.model);
16
+ const provider = requireLlmProvider('describe mode');
23
17
  let userPrompt = `Generate an OpenAPI 3.0 spec for: ${options.description}`;
24
18
  if (options.baseUrl) {
25
19
  userPrompt += `\n\nUse this base URL: ${options.baseUrl}`;
26
20
  }
27
21
  logger.info('Generating OpenAPI spec from description...');
28
- const message = await client.messages.create({
29
- model,
30
- max_tokens: 4096,
22
+ const responseText = await provider.completeText({
31
23
  system: SYSTEM_PROMPT,
32
- messages: [{ role: 'user', content: userPrompt }],
24
+ prompt: userPrompt,
25
+ tier: 'balanced',
26
+ model: options.model,
27
+ maxTokens: 4096,
33
28
  });
34
- const content = message.content[0];
35
- if (content.type !== 'text') {
36
- throw new Error('Unexpected response format from Claude');
37
- }
38
29
  // OpenAPI specs are recursive, so structured outputs can't enforce the shape.
39
30
  // Instead, extract the first balanced JSON object — robust to markdown fences,
40
31
  // leading/trailing prose, and braces that appear inside string values.
41
- const json = extractJsonObject(content.text);
32
+ const json = extractJsonObject(responseText);
42
33
  if (json === null) {
43
34
  throw new Error('Claude did not return a JSON object. Try again or refine your description.');
44
35
  }
@@ -51,40 +42,4 @@ export async function generateSpecFromDescription(options) {
51
42
  }
52
43
  return json;
53
44
  }
54
- /**
55
- * Return the substring spanning the first balanced top-level `{...}` object in
56
- * `text`, or null if none. String-aware (ignores braces inside quoted strings)
57
- * and linear-time — no regex, so no catastrophic-backtracking risk.
58
- */
59
- function extractJsonObject(text) {
60
- const start = text.indexOf('{');
61
- if (start === -1)
62
- return null;
63
- let depth = 0;
64
- let inString = false;
65
- let escaped = false;
66
- for (let i = start; i < text.length; i++) {
67
- const ch = text[i];
68
- if (inString) {
69
- if (escaped)
70
- escaped = false;
71
- else if (ch === '\\')
72
- escaped = true;
73
- else if (ch === '"')
74
- inString = false;
75
- }
76
- else if (ch === '"') {
77
- inString = true;
78
- }
79
- else if (ch === '{') {
80
- depth++;
81
- }
82
- else if (ch === '}') {
83
- depth--;
84
- if (depth === 0)
85
- return text.slice(start, i + 1);
86
- }
87
- }
88
- return null;
89
- }
90
45
  //# sourceMappingURL=spec-generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spec-generator.js","sourceRoot":"","sources":["../../src/generator/spec-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spec-generator.js","sourceRoot":"","sources":["../../src/generator/spec-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAQrD,MAAM,aAAa,GAAG;;;;;;;;;;iDAU2B,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAA4B;IAC5E,MAAM,QAAQ,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;IAErD,IAAI,UAAU,GAAG,qCAAqC,OAAO,CAAC,WAAW,EAAE,CAAC;IAC5E,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,UAAU,IAAI,0BAA0B,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAE3D,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC;QAC/C,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,8EAA8E;IAC9E,+EAA+E;IAC/E,uEAAuE;IACvE,MAAM,IAAI,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC7C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAChG,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ export { renderTemplate } from './emitter/template-loader.js';
12
12
  export { scaffoldSharedModules } from './emitter/project-scaffolder.js';
13
13
  export { loadOpenApiSpec } from './parser/openapi-loader.js';
14
14
  export type { LoadResult } from './parser/openapi-loader.js';
15
+ export { assertPublicUrl, isPrivateOrReservedIp, privateHostsAllowed } from './utils/ssrf-guard.js';
15
16
  export { applyOverlay } from './parser/overlay-loader.js';
16
17
  export { extractOperations } from './parser/operation-extractor.js';
17
18
  export type { ExtractionResult } from './parser/operation-extractor.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -16,6 +16,7 @@ export { scaffoldSharedModules } from './emitter/project-scaffolder.js';
16
16
  // Parser (OpenAPI / HAR / Postman ingestion)
17
17
  // ---------------------------------------------------------------------------
18
18
  export { loadOpenApiSpec } from './parser/openapi-loader.js';
19
+ export { assertPublicUrl, isPrivateOrReservedIp, privateHostsAllowed } from './utils/ssrf-guard.js';
19
20
  export { applyOverlay } from './parser/overlay-loader.js';
20
21
  export { extractOperations } from './parser/operation-extractor.js';
21
22
  export { jsonSchemaToZodCode, buildOperationInputSchema } from './parser/schema-converter.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { CompleteJsonOptions, CompleteOptions, LlmProvider } from './types.js';
2
+ export interface AnthropicProviderOptions {
3
+ apiKey: string;
4
+ baseURL?: string;
5
+ }
6
+ export declare class AnthropicProvider implements LlmProvider {
7
+ readonly name = "anthropic";
8
+ readonly supportsVision = true;
9
+ private readonly client;
10
+ constructor(opts: AnthropicProviderOptions);
11
+ completeText({ system, prompt, tier, model, maxTokens }: CompleteOptions): Promise<string>;
12
+ completeJson<T = unknown>({ system, prompt, schema, tier, model, maxTokens, }: CompleteJsonOptions): Promise<T>;
13
+ }
14
+ //# sourceMappingURL=anthropic-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../../src/llm/anthropic-provider.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpF,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,cAAc,QAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBAEvB,IAAI,EAAE,wBAAwB;IAIpC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAc1F,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,EAC9B,MAAM,EACN,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,SAAS,GACV,EAAE,mBAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;CAoBpC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Anthropic-backed {@link LlmProvider}. Wraps `@anthropic-ai/sdk`, hiding its
3
+ * wire-format details behind the provider-agnostic interface: text completion
4
+ * via `messages.create` and schema-constrained completion via the native
5
+ * structured-output path (`messages.parse` + `jsonSchemaOutputFormat`). Model
6
+ * ids are resolved against the live Models API (see {@link resolveModel}) so a
7
+ * retired snapshot can't silently 404.
8
+ */
9
+ import Anthropic from '@anthropic-ai/sdk';
10
+ import { jsonSchemaOutputFormat } from '@anthropic-ai/sdk/helpers/json-schema';
11
+ import { resolveModel } from '../utils/model-resolver.js';
12
+ export class AnthropicProvider {
13
+ name = 'anthropic';
14
+ supportsVision = true;
15
+ client;
16
+ constructor(opts) {
17
+ this.client = new Anthropic({ apiKey: opts.apiKey, baseURL: opts.baseURL });
18
+ }
19
+ async completeText({ system, prompt, tier, model, maxTokens }) {
20
+ const resolved = await resolveModel(this.client, tier, model);
21
+ const message = await this.client.messages.create({
22
+ model: resolved,
23
+ max_tokens: maxTokens,
24
+ ...(system ? { system } : {}),
25
+ messages: [{ role: 'user', content: prompt }],
26
+ });
27
+ const block = message.content[0];
28
+ return block?.type === 'text' ? block.text : '';
29
+ }
30
+ async completeJson({ system, prompt, schema, tier, model, maxTokens, }) {
31
+ const resolved = await resolveModel(this.client, tier, model);
32
+ const message = await this.client.messages.parse({
33
+ model: resolved,
34
+ max_tokens: maxTokens,
35
+ ...(system ? { system } : {}),
36
+ messages: [{ role: 'user', content: prompt }],
37
+ output_config: {
38
+ // `schema` is the interface's `Record<string, unknown>`; the helper wants
39
+ // a stricter JSON-schema type, so cast minimally to keep the public
40
+ // signature intact.
41
+ format: jsonSchemaOutputFormat(schema),
42
+ },
43
+ });
44
+ const out = message.parsed_output;
45
+ if (out == null)
46
+ throw new Error('Anthropic returned no structured output');
47
+ return out;
48
+ }
49
+ }
50
+ //# sourceMappingURL=anthropic-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-provider.js","sourceRoot":"","sources":["../../src/llm/anthropic-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAQ1D,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,WAAW,CAAC;IACnB,cAAc,GAAG,IAAI,CAAC;IACd,MAAM,CAAY;IAEnC,YAAY,IAA8B;QACxC,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAmB;QAC5E,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAChD,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,SAAS;YACrB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SAC9C,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjC,OAAO,KAAK,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,YAAY,CAAc,EAC9B,MAAM,EACN,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,SAAS,GACW;QACpB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC/C,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,SAAS;YACrB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC7C,aAAa,EAAE;gBACb,0EAA0E;gBAC1E,oEAAoE;gBACpE,oBAAoB;gBACpB,MAAM,EAAE,sBAAsB,CAAC,MAAsD,CAAC;aACvF;SACF,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC;QAClC,IAAI,GAAG,IAAI,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC5E,OAAO,GAAQ,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import { type LlmProvider, type ProviderKind } from './types.js';
2
+ export * from './types.js';
3
+ /** Resolve the configured provider kind from `MCPMAKE_LLM_PROVIDER` (default: anthropic). */
4
+ export declare function resolveProviderKind(): ProviderKind;
5
+ /**
6
+ * Build the active LLM provider from the environment, or return `null` when it
7
+ * is not usable (missing key, or an `openai-compatible` setup with no base
8
+ * URL). Optional AI steps treat `null` as "warn and skip", exactly as the old
9
+ * direct `ANTHROPIC_API_KEY` checks did. Required features should call
10
+ * {@link requireLlmProvider} instead so they fail with a clear message.
11
+ */
12
+ export declare function getLlmProvider(): LlmProvider | null;
13
+ /**
14
+ * Like {@link getLlmProvider} but throws a provider-aware error instead of
15
+ * returning null — for features that cannot degrade (spec generation, goal
16
+ * crawl).
17
+ */
18
+ export declare function requireLlmProvider(feature: string): LlmProvider;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAkB,MAAM,YAAY,CAAC;AAIjF,cAAc,YAAY,CAAC;AAE3B,6FAA6F;AAC7F,wBAAgB,mBAAmB,IAAI,YAAY,CAMlD;AAOD;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CA8BnD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAO/D"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * LLM provider selection. Reads the environment and builds the active
3
+ * {@link LlmProvider}; CLI flags populate that environment (see the CLI's
4
+ * provider options) so core code never needs a provider parameter threaded
5
+ * through every call.
6
+ */
7
+ import { logger } from '../utils/logger.js';
8
+ import { PROVIDER_KINDS } from './types.js';
9
+ import { AnthropicProvider } from './anthropic-provider.js';
10
+ import { OpenAiProvider } from './openai-provider.js';
11
+ export * from './types.js';
12
+ /** Resolve the configured provider kind from `MCPMAKE_LLM_PROVIDER` (default: anthropic). */
13
+ export function resolveProviderKind() {
14
+ const raw = process.env.MCPMAKE_LLM_PROVIDER?.trim().toLowerCase();
15
+ if (!raw)
16
+ return 'anthropic';
17
+ if (PROVIDER_KINDS.includes(raw))
18
+ return raw;
19
+ logger.warn(`Unknown MCPMAKE_LLM_PROVIDER "${raw}" — falling back to "anthropic"`);
20
+ return 'anthropic';
21
+ }
22
+ /** The env var that holds the API key for a given provider kind. */
23
+ function keyVarFor(kind) {
24
+ return kind === 'anthropic' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';
25
+ }
26
+ /**
27
+ * Build the active LLM provider from the environment, or return `null` when it
28
+ * is not usable (missing key, or an `openai-compatible` setup with no base
29
+ * URL). Optional AI steps treat `null` as "warn and skip", exactly as the old
30
+ * direct `ANTHROPIC_API_KEY` checks did. Required features should call
31
+ * {@link requireLlmProvider} instead so they fail with a clear message.
32
+ */
33
+ export function getLlmProvider() {
34
+ const kind = resolveProviderKind();
35
+ if (kind === 'anthropic') {
36
+ const apiKey = process.env.ANTHROPIC_API_KEY?.trim();
37
+ if (!apiKey)
38
+ return null;
39
+ return new AnthropicProvider({
40
+ apiKey,
41
+ baseURL: process.env.ANTHROPIC_BASE_URL?.trim() || undefined,
42
+ });
43
+ }
44
+ // openai / openai-compatible
45
+ const apiKey = process.env.OPENAI_API_KEY?.trim();
46
+ const baseURL = process.env.OPENAI_BASE_URL?.trim() || undefined;
47
+ if (kind === 'openai') {
48
+ if (!apiKey)
49
+ return null;
50
+ return new OpenAiProvider({ apiKey, baseURL, kind });
51
+ }
52
+ // openai-compatible: self-hosted servers (Ollama, vLLM, …) frequently need no
53
+ // key, but they do need an explicit endpoint.
54
+ if (!baseURL) {
55
+ logger.warn('MCPMAKE_LLM_PROVIDER=openai-compatible requires OPENAI_BASE_URL — skipping AI step');
56
+ return null;
57
+ }
58
+ return new OpenAiProvider({ apiKey: apiKey || 'not-needed', baseURL, kind });
59
+ }
60
+ /**
61
+ * Like {@link getLlmProvider} but throws a provider-aware error instead of
62
+ * returning null — for features that cannot degrade (spec generation, goal
63
+ * crawl).
64
+ */
65
+ export function requireLlmProvider(feature) {
66
+ const provider = getLlmProvider();
67
+ if (provider)
68
+ return provider;
69
+ const kind = resolveProviderKind();
70
+ const needs = keyVarFor(kind) + (kind === 'openai-compatible' ? ' and OPENAI_BASE_URL' : '');
71
+ throw new Error(`${feature} requires an LLM provider. Set ${needs} (active provider: ${kind}).`);
72
+ }
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAuC,cAAc,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,cAAc,YAAY,CAAC;AAE3B,6FAA6F;AAC7F,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnE,IAAI,CAAC,GAAG;QAAE,OAAO,WAAW,CAAC;IAC7B,IAAK,cAAoC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,GAAmB,CAAC;IACpF,MAAM,CAAC,IAAI,CAAC,iCAAiC,GAAG,iCAAiC,CAAC,CAAC;IACnF,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,oEAAoE;AACpE,SAAS,SAAS,CAAC,IAAkB;IACnC,OAAO,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,gBAAgB,CAAC;AACvE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC;IAEnC,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,IAAI,iBAAiB,CAAC;YAC3B,MAAM;YACN,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,SAAS;SAC7D,CAAC,CAAC;IACL,CAAC;IAED,6BAA6B;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAEjE,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,8EAA8E;IAC9E,8CAA8C;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CACT,oFAAoF,CACrF,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7F,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,kCAAkC,KAAK,sBAAsB,IAAI,IAAI,CAAC,CAAC;AACnG,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { CompleteJsonOptions, CompleteOptions, LlmProvider } from './types.js';
2
+ export interface OpenAiProviderOptions {
3
+ apiKey: string;
4
+ baseURL?: string;
5
+ kind: 'openai' | 'openai-compatible';
6
+ }
7
+ export declare class OpenAiProvider implements LlmProvider {
8
+ readonly name: string;
9
+ readonly supportsVision = true;
10
+ private readonly client;
11
+ private readonly kind;
12
+ private readonly modelCache;
13
+ private readonly baseURL;
14
+ private jsonDowngradeWarned;
15
+ constructor(opts: OpenAiProviderOptions);
16
+ /**
17
+ * Resolve a usable model id for a tier against the live `/v1/models` listing,
18
+ * so a retired id can never silently 404 the way a hardcoded snapshot does.
19
+ *
20
+ * Resolution order:
21
+ * 1. An explicit `override` (e.g. a `--model` flag) wins, unchecked — the
22
+ * caller knows what they want, and a bad id surfaces as a clear API error.
23
+ * 2. The tier's preferred id, **if** the listing contains it.
24
+ * 3. Otherwise the newest served model whose id matches the tier pattern.
25
+ * 4. No match: hosted OpenAI falls back to the preferred id; an
26
+ * openai-compatible server falls back to its first listed model (or throws
27
+ * if it lists nothing).
28
+ * 5. Listing throws (server has no `/v1/models`): hosted OpenAI returns the
29
+ * preferred id WITHOUT caching (so a later call retries); an
30
+ * openai-compatible server throws — there's nothing safe to guess.
31
+ */
32
+ private resolveModel;
33
+ /**
34
+ * Output-token parameter, keyed by provider kind: newer hosted OpenAI models
35
+ * reject `max_tokens` and require `max_completion_tokens`, while many
36
+ * openai-compatible servers only understand the older `max_tokens`.
37
+ */
38
+ private tokenParam;
39
+ /** Build the message list: a leading system message only when `system` is set. */
40
+ private buildMessages;
41
+ completeText({ system, prompt, tier, model, maxTokens }: CompleteOptions): Promise<string>;
42
+ completeJson<T = unknown>({ system, prompt, schema, tier, model, maxTokens, }: CompleteJsonOptions): Promise<T>;
43
+ /** Warn once when structured output is downgraded, so the loss is visible. */
44
+ private warnJsonDowngrade;
45
+ }
46
+ //# sourceMappingURL=openai-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../src/llm/openai-provider.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EACf,WAAW,EAGZ,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,GAAG,mBAAmB,CAAC;CACtC;AAkBD,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,QAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;IAGtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAG3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAGjC,OAAO,CAAC,mBAAmB,CAAS;gBAExB,IAAI,EAAE,qBAAqB;IAOvC;;;;;;;;;;;;;;;OAeG;YACW,YAAY;IA2D1B;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAQlB,kFAAkF;IAClF,OAAO,CAAC,aAAa;IAOf,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAa1F,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,EAC9B,MAAM,EACN,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,SAAS,GACV,EAAE,mBAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;IAkEnC,8EAA8E;IAC9E,OAAO,CAAC,iBAAiB;CAO1B"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * OpenAI-family provider. One class serves BOTH:
3
+ * - `openai` — the hosted api.openai.com endpoint, and
4
+ * - `openai-compatible` — any self-hosted server speaking the OpenAI wire
5
+ * format (Ollama, vLLM, LM Studio, Groq, Together, …).
6
+ *
7
+ * The two differ in three places, all handled here:
8
+ * 1. Model resolution against `/v1/models` — hosted OpenAI always lists models,
9
+ * compatible servers may not implement the endpoint at all.
10
+ * 2. The output-token parameter name (`max_completion_tokens` vs `max_tokens`).
11
+ * 3. Structured-output support (`response_format: json_schema`), which many
12
+ * compatible servers don't honor — so `completeJson` degrades gracefully.
13
+ */
14
+ import OpenAI from 'openai';
15
+ import { extractJsonObject } from '../utils/json-extract.js';
16
+ import { logger } from '../utils/logger.js';
17
+ /**
18
+ * Preferred (undated) model id per tier. Model ids rot — a whole family can be
19
+ * retired and a hardcoded snapshot then silently 404s — so the preferred id is
20
+ * only trusted when the live `/v1/models` listing confirms it (mirrors the
21
+ * Anthropic resolver in {@link ../utils/model-resolver}).
22
+ */
23
+ const PREFERRED = {
24
+ balanced: 'gpt-4o',
25
+ fast: 'gpt-4o-mini',
26
+ };
27
+ const TIER_PATTERN = {
28
+ balanced: /gpt-(5|4\.1|4o|4)/i,
29
+ fast: /mini|nano|small|flash|haiku/i,
30
+ };
31
+ export class OpenAiProvider {
32
+ name;
33
+ supportsVision = true;
34
+ client;
35
+ kind;
36
+ // Resolved once per tier per process: the served-model list rarely changes
37
+ // mid-run, and we don't want a Models API round-trip before every call.
38
+ modelCache = new Map();
39
+ // The endpoint we talk to, used in error messages so a misconfigured
40
+ // openai-compatible server is obvious from the thrown error alone.
41
+ baseURL;
42
+ // Whether we've already warned about a structured-output downgrade. Warning
43
+ // once per process keeps the log readable when many JSON calls degrade.
44
+ jsonDowngradeWarned = false;
45
+ constructor(opts) {
46
+ this.kind = opts.kind;
47
+ this.name = opts.kind;
48
+ this.baseURL = opts.baseURL ?? 'https://api.openai.com/v1';
49
+ this.client = new OpenAI({ apiKey: opts.apiKey, baseURL: opts.baseURL });
50
+ }
51
+ /**
52
+ * Resolve a usable model id for a tier against the live `/v1/models` listing,
53
+ * so a retired id can never silently 404 the way a hardcoded snapshot does.
54
+ *
55
+ * Resolution order:
56
+ * 1. An explicit `override` (e.g. a `--model` flag) wins, unchecked — the
57
+ * caller knows what they want, and a bad id surfaces as a clear API error.
58
+ * 2. The tier's preferred id, **if** the listing contains it.
59
+ * 3. Otherwise the newest served model whose id matches the tier pattern.
60
+ * 4. No match: hosted OpenAI falls back to the preferred id; an
61
+ * openai-compatible server falls back to its first listed model (or throws
62
+ * if it lists nothing).
63
+ * 5. Listing throws (server has no `/v1/models`): hosted OpenAI returns the
64
+ * preferred id WITHOUT caching (so a later call retries); an
65
+ * openai-compatible server throws — there's nothing safe to guess.
66
+ */
67
+ async resolveModel(tier, override) {
68
+ if (override)
69
+ return override;
70
+ const cached = this.modelCache.get(tier);
71
+ if (cached)
72
+ return cached;
73
+ const preferred = PREFERRED[tier];
74
+ let choice;
75
+ let models;
76
+ try {
77
+ const page = await this.client.models.list();
78
+ models = page.data;
79
+ }
80
+ catch (err) {
81
+ // Transient or unimplemented Models API.
82
+ if (this.kind === 'openai') {
83
+ // Return the fallback for this call WITHOUT caching it, so a later call
84
+ // retries once the API recovers (a poisoned cache would pin the whole
85
+ // process to the fallback id).
86
+ logger.warn(`Could not list models (${err instanceof Error ? err.message : err}); using "${preferred}"`);
87
+ return preferred;
88
+ }
89
+ throw new Error('Could not list models; pass --model for openai-compatible providers');
90
+ }
91
+ if (models.some((m) => m.id === preferred)) {
92
+ choice = preferred;
93
+ }
94
+ else {
95
+ const pattern = TIER_PATTERN[tier];
96
+ const newest = models
97
+ .filter((m) => pattern.test(m.id))
98
+ // `created` is an epoch number (seconds); missing values sort oldest.
99
+ .sort((a, b) => (b.created ?? 0) - (a.created ?? 0))[0];
100
+ if (newest) {
101
+ logger.warn(`Preferred model "${preferred}" unavailable; using "${newest.id}"`);
102
+ choice = newest.id;
103
+ }
104
+ else if (this.kind === 'openai') {
105
+ logger.warn(`Preferred model "${preferred}" unavailable and no ${tier} model found; trying it anyway`);
106
+ choice = preferred;
107
+ }
108
+ else if (models[0]) {
109
+ // openai-compatible: no tiered match, but the server lists *something* —
110
+ // use the first model rather than guessing an OpenAI id it won't have.
111
+ logger.warn(`No ${tier} model matched on ${this.baseURL}; using "${models[0].id}"`);
112
+ choice = models[0].id;
113
+ }
114
+ else {
115
+ throw new Error(`No model available from ${this.baseURL}; pass --model`);
116
+ }
117
+ }
118
+ // Only successful resolutions are cached.
119
+ this.modelCache.set(tier, choice);
120
+ return choice;
121
+ }
122
+ /**
123
+ * Output-token parameter, keyed by provider kind: newer hosted OpenAI models
124
+ * reject `max_tokens` and require `max_completion_tokens`, while many
125
+ * openai-compatible servers only understand the older `max_tokens`.
126
+ */
127
+ tokenParam(maxTokens) {
128
+ return this.kind === 'openai'
129
+ ? { max_completion_tokens: maxTokens }
130
+ : { max_tokens: maxTokens };
131
+ }
132
+ /** Build the message list: a leading system message only when `system` is set. */
133
+ buildMessages(prompt, system) {
134
+ const messages = [];
135
+ if (system)
136
+ messages.push({ role: 'system', content: system });
137
+ messages.push({ role: 'user', content: prompt });
138
+ return messages;
139
+ }
140
+ async completeText({ system, prompt, tier, model, maxTokens }) {
141
+ const resolved = await this.resolveModel(tier, model);
142
+ const messages = this.buildMessages(prompt, system);
143
+ const res = await this.client.chat.completions.create({
144
+ model: resolved,
145
+ messages,
146
+ ...this.tokenParam(maxTokens),
147
+ });
148
+ return res.choices[0]?.message?.content ?? '';
149
+ }
150
+ async completeJson({ system, prompt, schema, tier, model, maxTokens, }) {
151
+ const resolved = await this.resolveModel(tier, model);
152
+ const tokenParam = this.tokenParam(maxTokens);
153
+ // Nudge appended to the prompt for the non-native fallbacks, so the model
154
+ // still aims at the schema even without enforced structured output.
155
+ const schemaNudge = `Respond with JSON only that conforms to this JSON Schema:\n${JSON.stringify(schema)}`;
156
+ // 1) Native structured output (`json_schema`). Best fidelity when supported.
157
+ let content;
158
+ try {
159
+ const res = await this.client.chat.completions.create({
160
+ model: resolved,
161
+ messages: this.buildMessages(prompt, system),
162
+ response_format: {
163
+ type: 'json_schema',
164
+ json_schema: { name: 'response', strict: true, schema },
165
+ },
166
+ ...tokenParam,
167
+ });
168
+ content = res.choices[0]?.message?.content ?? '';
169
+ }
170
+ catch {
171
+ this.warnJsonDowngrade();
172
+ try {
173
+ // 2) `json_object` mode + schema-in-prompt: forces valid JSON without
174
+ // enforcing the schema, which most compatible servers support.
175
+ const messages = this.buildMessages(prompt, system);
176
+ messages.push({ role: 'user', content: schemaNudge });
177
+ const res = await this.client.chat.completions.create({
178
+ model: resolved,
179
+ messages,
180
+ response_format: { type: 'json_object' },
181
+ ...tokenParam,
182
+ });
183
+ content = res.choices[0]?.message?.content ?? '';
184
+ }
185
+ catch {
186
+ // 3) Plain completion + schema-in-prompt: last resort for servers that
187
+ // reject `response_format` entirely. Rely on the JSON extractor.
188
+ const messages = this.buildMessages(prompt, system);
189
+ messages.push({ role: 'user', content: schemaNudge });
190
+ const res = await this.client.chat.completions.create({
191
+ model: resolved,
192
+ messages,
193
+ ...tokenParam,
194
+ });
195
+ content = res.choices[0]?.message?.content ?? '';
196
+ }
197
+ }
198
+ const json = extractJsonObject(content);
199
+ if (json === null)
200
+ throw new Error('OpenAI provider returned unparseable JSON');
201
+ let parsed;
202
+ try {
203
+ parsed = JSON.parse(json);
204
+ }
205
+ catch {
206
+ throw new Error('OpenAI provider returned unparseable JSON');
207
+ }
208
+ if (typeof parsed !== 'object' || parsed === null) {
209
+ throw new Error('OpenAI provider returned unparseable JSON');
210
+ }
211
+ return parsed;
212
+ }
213
+ /** Warn once when structured output is downgraded, so the loss is visible. */
214
+ warnJsonDowngrade() {
215
+ if (this.jsonDowngradeWarned)
216
+ return;
217
+ this.jsonDowngradeWarned = true;
218
+ logger.warn(`${this.name}: native JSON-schema output not supported on ${this.baseURL}; falling back to best-effort JSON parsing`);
219
+ }
220
+ }
221
+ //# sourceMappingURL=openai-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../../src/llm/openai-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAe5C;;;;;GAKG;AACH,MAAM,SAAS,GAA8B;IAC3C,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,aAAa;CACpB,CAAC;AAEF,MAAM,YAAY,GAA8B;IAC9C,QAAQ,EAAE,oBAAoB;IAC9B,IAAI,EAAE,8BAA8B;CACrC,CAAC;AAEF,MAAM,OAAO,cAAc;IAChB,IAAI,CAAS;IACb,cAAc,GAAG,IAAI,CAAC;IACd,MAAM,CAAS;IACf,IAAI,CAAiC;IACtD,2EAA2E;IAC3E,wEAAwE;IACvD,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC3D,qEAAqE;IACrE,mEAAmE;IAClD,OAAO,CAAS;IACjC,4EAA4E;IAC5E,wEAAwE;IAChE,mBAAmB,GAAG,KAAK,CAAC;IAEpC,YAAY,IAA2B;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,2BAA2B,CAAC;QAC3D,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACK,KAAK,CAAC,YAAY,CAAC,IAAe,EAAE,QAAiB;QAC3D,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAc,CAAC;QAEnB,IAAI,MAA0C,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,yCAAyC;YACzC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,wEAAwE;gBACxE,sEAAsE;gBACtE,+BAA+B;gBAC/B,MAAM,CAAC,IAAI,CACT,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,aAAa,SAAS,GAAG,CAC5F,CAAC;gBACF,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC;YAC3C,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM;iBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClC,sEAAsE;iBACrE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAE1D,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,CAAC,oBAAoB,SAAS,yBAAyB,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;gBAChF,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;YACrB,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,CAAC,IAAI,CACT,oBAAoB,SAAS,wBAAwB,IAAI,gCAAgC,CAC1F,CAAC;gBACF,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;iBAAM,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrB,yEAAyE;gBACzE,uEAAuE;gBACvE,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,qBAAqB,IAAI,CAAC,OAAO,YAAY,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACpF,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,OAAO,gBAAgB,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACK,UAAU,CAChB,SAAiB;QAEjB,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAC3B,CAAC,CAAC,EAAE,qBAAqB,EAAE,SAAS,EAAE;YACtC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAChC,CAAC;IAED,kFAAkF;IAC1E,aAAa,CAAC,MAAc,EAAE,MAAe;QACnD,MAAM,QAAQ,GAAiC,EAAE,CAAC;QAClD,IAAI,MAAM;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/D,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAmB;QAC5E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAEpD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACpD,KAAK,EAAE,QAAQ;YACf,QAAQ;YACR,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;SAC9B,CAAC,CAAC;QAEH,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,YAAY,CAAc,EAC9B,MAAM,EACN,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,SAAS,GACW;QACpB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAE9C,0EAA0E;QAC1E,oEAAoE;QACpE,MAAM,WAAW,GAAG,8DAA8D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAE3G,6EAA6E;QAC7E,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACpD,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC;gBAC5C,eAAe,EAAE;oBACf,IAAI,EAAE,aAAa;oBACnB,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;iBACxD;gBACD,GAAG,UAAU;aACd,CAAC,CAAC;YACH,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,sEAAsE;gBACtE,kEAAkE;gBAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;gBACtD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;oBACpD,KAAK,EAAE,QAAQ;oBACf,QAAQ;oBACR,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;oBACxC,GAAG,UAAU;iBACd,CAAC,CAAC;gBACH,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,uEAAuE;gBACvE,oEAAoE;gBACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;gBACtD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;oBACpD,KAAK,EAAE,QAAQ;oBACf,QAAQ;oBACR,GAAG,UAAU;iBACd,CAAC,CAAC;gBACH,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;YACnD,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAEhF,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,MAAW,CAAC;IACrB,CAAC;IAED,8EAA8E;IACtE,iBAAiB;QACvB,IAAI,IAAI,CAAC,mBAAmB;YAAE,OAAO;QACrC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,MAAM,CAAC,IAAI,CACT,GAAG,IAAI,CAAC,IAAI,gDAAgD,IAAI,CAAC,OAAO,4CAA4C,CACrH,CAAC;IACJ,CAAC;CACF"}