ado-sync 0.1.55 → 0.1.57

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 (40) hide show
  1. package/README.md +39 -0
  2. package/dist/__tests__/regressions.test.d.ts +1 -0
  3. package/dist/__tests__/regressions.test.js +140 -0
  4. package/dist/__tests__/regressions.test.js.map +1 -0
  5. package/dist/ai/generate-spec.d.ts +11 -9
  6. package/dist/ai/generate-spec.js +116 -96
  7. package/dist/ai/generate-spec.js.map +1 -1
  8. package/dist/ai/summarizer.d.ts +5 -5
  9. package/dist/ai/summarizer.js +243 -135
  10. package/dist/ai/summarizer.js.map +1 -1
  11. package/dist/azure/test-cases.d.ts +10 -1
  12. package/dist/azure/test-cases.js +61 -25
  13. package/dist/azure/test-cases.js.map +1 -1
  14. package/dist/cli.js +1 -1
  15. package/dist/cli.js.map +1 -1
  16. package/dist/config.js +7 -2
  17. package/dist/config.js.map +1 -1
  18. package/dist/issues/ado-bugs.js +7 -3
  19. package/dist/issues/ado-bugs.js.map +1 -1
  20. package/dist/mcp-server.js +51 -27
  21. package/dist/mcp-server.js.map +1 -1
  22. package/dist/parsers/javascript.js +2 -1
  23. package/dist/parsers/javascript.js.map +1 -1
  24. package/dist/sync/cache.js +3 -1
  25. package/dist/sync/cache.js.map +1 -1
  26. package/dist/sync/engine.d.ts +12 -1
  27. package/dist/sync/engine.js +226 -165
  28. package/dist/sync/engine.js.map +1 -1
  29. package/dist/sync/publish-results.js +64 -21
  30. package/dist/sync/publish-results.js.map +1 -1
  31. package/dist/sync/writeback.js +22 -5
  32. package/dist/sync/writeback.js.map +1 -1
  33. package/dist/types.d.ts +3 -3
  34. package/docs/advanced.md +17 -18
  35. package/docs/cli.md +74 -4
  36. package/docs/publish-test-results.md +3 -3
  37. package/mkdocs.yml +39 -0
  38. package/package.json +23 -14
  39. package/requirements-docs.txt +4 -0
  40. package/scripts/build_site.sh +6 -0
package/README.md CHANGED
@@ -85,4 +85,43 @@ Minimum config:
85
85
  | VS Code Extension | [docs/vscode-extension.md](docs/vscode-extension.md) |
86
86
  | Troubleshooting | [docs/troubleshooting.md](docs/troubleshooting.md) |
87
87
 
88
+ ---
89
+
90
+ ## AI providers
91
+
92
+ ado-sync supports multiple AI providers for test-step summarisation (`push`/`pull`/`status`), spec generation (`generate`), and failure analysis (`publish-test-results`). All provider SDKs are **optional** — install only what you need.
93
+
94
+ | Provider | Commands | SDK (install separately) | Auth |
95
+ |---|---|---|---|
96
+ | `heuristic` | push / pull / status | none — built-in | none |
97
+ | `local` | push / pull / status | `node-llama-cpp` *(included)* | GGUF model file path |
98
+ | `ollama` | all AI commands | `npm i ollama` | local Ollama server |
99
+ | `openai` | all AI commands | `npm i openai` | `$OPENAI_API_KEY` |
100
+ | `anthropic` | all AI commands | `npm i @anthropic-ai/sdk` | `$ANTHROPIC_API_KEY` |
101
+ | `huggingface` | all AI commands | `npm i openai` | `$HF_TOKEN` |
102
+ | `bedrock` | all AI commands | `npm i @aws-sdk/client-bedrock-runtime` | AWS credential chain |
103
+ | `azureai` | all AI commands | `npm i openai` | `$AZURE_OPENAI_KEY` + `--ai-url` |
104
+ | `github` | all AI commands | `npm i openai` | `$GITHUB_TOKEN` (auto-detected) |
105
+ | `azureinference` | all AI commands | `npm i @azure-rest/ai-inference @azure/core-auth` | `$AZURE_AI_KEY` + `--ai-url` |
106
+
107
+ ```bash
108
+ # GitHub Models — free tier available, no billing setup needed
109
+ ado-sync push --ai-provider github --ai-model gpt-4o
110
+
111
+ # Anthropic
112
+ ado-sync push --ai-provider anthropic --ai-key $ANTHROPIC_API_KEY
113
+
114
+ # AWS Bedrock
115
+ ado-sync push --ai-provider bedrock --ai-model anthropic.claude-3-haiku-20240307-v1:0 --ai-region us-east-1
116
+
117
+ # Azure AI Inference (AI Foundry)
118
+ ado-sync generate --story-ids 1234 --ai-provider azureinference \
119
+ --ai-url https://myendpoint.inference.azure.com --ai-model gpt-4o --ai-key $AZURE_AI_KEY
120
+ ```
121
+
122
+ Set once in `ado-sync.json` to apply to all commands:
123
+ ```json
124
+ { "sync": { "ai": { "provider": "github", "model": "gpt-4o" } } }
125
+ ```
126
+
88
127
  > **LLM / AI crawlers:** [`llms.txt`](llms.txt) contains a single-file summary of the entire project — config schema, CLI flags, ID writeback formats, and the full doc index.
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const strict_1 = __importDefault(require("node:assert/strict"));
40
+ const fs = __importStar(require("node:fs"));
41
+ const os = __importStar(require("node:os"));
42
+ const path = __importStar(require("node:path"));
43
+ const node_test_1 = __importDefault(require("node:test"));
44
+ const test_cases_1 = require("../azure/test-cases");
45
+ const javascript_1 = require("../parsers/javascript");
46
+ const engine_1 = require("../sync/engine");
47
+ const writeback_1 = require("../sync/writeback");
48
+ function makeConfig(overrides = {}) {
49
+ return {
50
+ orgUrl: 'https://dev.azure.com/example',
51
+ project: 'ExampleProject',
52
+ auth: { type: 'pat', token: 'token' },
53
+ testPlan: { id: 1 },
54
+ local: { type: 'javascript', include: '**/*.test.ts' },
55
+ sync: { tagPrefix: 'tc' },
56
+ ...overrides,
57
+ };
58
+ }
59
+ function makeParsedTest(overrides = {}) {
60
+ return {
61
+ filePath: '/tmp/example.test.ts',
62
+ title: 'login works',
63
+ steps: [{ keyword: 'Then', text: 'the dashboard is shown', expected: 'dashboard is visible' }],
64
+ tags: [],
65
+ line: 1,
66
+ ...overrides,
67
+ };
68
+ }
69
+ (0, node_test_1.default)('buildPushDiff flags expected-result-only step changes', () => {
70
+ const config = makeConfig();
71
+ const local = makeParsedTest();
72
+ const remote = {
73
+ id: 42,
74
+ title: 'login works',
75
+ description: '',
76
+ tags: [],
77
+ steps: [{ action: 'Then the dashboard is shown', expected: 'different expected result' }],
78
+ };
79
+ const diff = (0, engine_1.buildPushDiff)(local, remote, config);
80
+ strict_1.default.deepEqual(diff.changedFields, ['steps', 'description']);
81
+ strict_1.default.equal(diff.diffDetail[0]?.field, 'steps');
82
+ strict_1.default.match(diff.diffDetail[0]?.local ?? '', /dashboard is visible/);
83
+ strict_1.default.match(diff.diffDetail[0]?.remote ?? '', /different expected result/);
84
+ });
85
+ (0, node_test_1.default)('failOnParseErrors aborts with file details', () => {
86
+ strict_1.default.throws(() => (0, engine_1.failOnParseErrors)('push', [{ filePath: '/tmp/bad.feature', message: 'unexpected token' }]), (err) => {
87
+ const msg = err instanceof Error ? err.message : String(err);
88
+ return msg.includes('Aborting push') &&
89
+ msg.includes('/tmp/bad.feature') &&
90
+ msg.includes('unexpected token');
91
+ });
92
+ });
93
+ (0, node_test_1.default)('updateTestCase removes stale outline parameter fields when scenario is no longer parametrized', async () => {
94
+ let updatePatch;
95
+ const wit = {
96
+ getWorkItem: async () => ({
97
+ fields: {
98
+ 'System.Tags': 'smoke',
99
+ 'Microsoft.VSTS.TCM.Parameters': '<parameters />',
100
+ 'Microsoft.VSTS.TCM.LocalDataSource': '<NewDataSet />',
101
+ },
102
+ }),
103
+ updateWorkItem: async (_doc, patch) => {
104
+ updatePatch = patch;
105
+ return {};
106
+ },
107
+ };
108
+ const client = {
109
+ getWitApi: async () => wit,
110
+ };
111
+ await (0, test_cases_1.updateTestCase)(client, 99, makeParsedTest(), makeConfig());
112
+ strict_1.default.ok(updatePatch, 'expected updateWorkItem to be called');
113
+ strict_1.default.ok(updatePatch.some((p) => p.op === 'remove' && p.path === '/fields/Microsoft.VSTS.TCM.Parameters'));
114
+ strict_1.default.ok(updatePatch.some((p) => p.op === 'remove' && p.path === '/fields/Microsoft.VSTS.TCM.LocalDataSource'));
115
+ });
116
+ (0, node_test_1.default)('writebackDocComment preserves user-authored JSDoc and parser ignores ado-sync marker', async () => {
117
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ado-sync-test-'));
118
+ const filePath = path.join(tempDir, 'sample.test.ts');
119
+ fs.writeFileSync(filePath, [
120
+ '/**',
121
+ ' * Existing user documentation',
122
+ ' */',
123
+ "test('user keeps docs', async () => {});",
124
+ '',
125
+ ].join('\n'));
126
+ const parsedBefore = (0, javascript_1.parseJavaScriptFile)(filePath, 'tc');
127
+ strict_1.default.equal(parsedBefore[0]?.title, 'Existing user documentation');
128
+ const steps = [
129
+ { keyword: 'Step', text: 'open the app' },
130
+ { keyword: 'Then', text: 'see the dashboard' },
131
+ ];
132
+ (0, writeback_1.writebackDocComment)({ ...makeParsedTest({ filePath, line: 4, title: 'user keeps docs', steps }), description: 'AI summary' }, 'user keeps docs', 'AI summary', steps);
133
+ const updated = fs.readFileSync(filePath, 'utf8');
134
+ strict_1.default.match(updated, /Existing user documentation/);
135
+ strict_1.default.equal((updated.match(/ado-sync:ai-summary/g) ?? []).length, 1);
136
+ const parsedAfter = (0, javascript_1.parseJavaScriptFile)(filePath, 'tc');
137
+ strict_1.default.equal(parsedAfter[0]?.title, 'user keeps docs');
138
+ strict_1.default.equal(parsedAfter[0]?.description, 'AI summary');
139
+ });
140
+ //# sourceMappingURL=regressions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regressions.test.js","sourceRoot":"","sources":["../../src/__tests__/regressions.test.ts"],"names":[],"mappings":"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"}
@@ -15,21 +15,23 @@
15
15
  * gherkin — BDD .feature file with Scenario and Scenario Outline
16
16
  */
17
17
  import { AdoStory } from '../azure/work-items';
18
- export type AiGenerateProvider = 'local' | 'ollama' | 'openai' | 'anthropic' | 'huggingface' | 'bedrock' | 'azureai';
18
+ export type AiGenerateProvider = 'local' | 'ollama' | 'openai' | 'anthropic' | 'huggingface' | 'bedrock' | 'azureai' | 'github' | 'azureinference';
19
19
  export interface AiGenerateOpts {
20
20
  provider: AiGenerateProvider;
21
21
  /**
22
22
  * Model identifier:
23
- * local: path to .gguf file
24
- * ollama: model tag (e.g. qwen2.5-coder:7b)
25
- * openai: model name (e.g. gpt-4o)
26
- * anthropic: model name (e.g. claude-sonnet-4-6)
27
- * huggingface: model id (e.g. mistralai/Mistral-7B-Instruct-v0.3)
28
- * bedrock: model id (e.g. anthropic.claude-3-haiku-20240307-v1:0)
29
- * azureai: deployment name (e.g. gpt-4o)
23
+ * local: path to .gguf file
24
+ * ollama: model tag (e.g. gemma-4-e4b-it)
25
+ * openai: model name (e.g. gpt-4o)
26
+ * anthropic: model name (e.g. claude-sonnet-4-6)
27
+ * huggingface: model id (e.g. google/gemma-4-e4b-it)
28
+ * bedrock: model id (e.g. anthropic.claude-3-haiku-20240307-v1:0)
29
+ * azureai: deployment name (e.g. gpt-4o)
30
+ * github: GitHub Models model name (e.g. gpt-4o, gemma-4-e4b-it)
31
+ * azureinference: model name deployed on Azure AI Inference endpoint
30
32
  */
31
33
  model?: string;
32
- /** Base URL override (ollama, openai-compatible, azureai full endpoint). */
34
+ /** Base URL override (ollama, openai-compatible, azureai/azureinference full endpoint). */
33
35
  baseUrl?: string;
34
36
  /** API key — or $ENV_VAR reference. */
35
37
  apiKey?: string;
@@ -99,27 +99,9 @@ function buildPrompt(story, format) {
99
99
  .replace('{DESCRIPTION}', story.description?.trim() || '(not provided)')
100
100
  .replace('{AC}', story.acceptanceCriteria?.trim() || '(not provided)');
101
101
  }
102
- // ─── Shared fetch helper ──────────────────────────────────────────────────────
103
- async function fetchWithRetry(url, init, provider, maxRetries = 3, baseDelayMs = 5_000) {
104
- let attempt = 0;
105
- while (true) {
106
- const res = await fetch(url, init);
107
- if (res.status === 503 || res.status === 429) {
108
- if (attempt >= maxRetries)
109
- return res;
110
- const retryAfter = res.headers.get('retry-after');
111
- const delayMs = retryAfter
112
- ? parseInt(retryAfter, 10) * 1_000
113
- : baseDelayMs * Math.pow(2, attempt);
114
- const reason = res.status === 503 ? 'model loading' : 'rate limited';
115
- process.stderr.write(` [ai-generate] ${provider} ${reason} — retrying in ${Math.round(delayMs / 1000)}s (${attempt + 1}/${maxRetries})\n`);
116
- await new Promise((r) => setTimeout(r, delayMs));
117
- attempt++;
118
- continue;
119
- }
120
- return res;
121
- }
122
- }
102
+ // ─── Shared helpers ───────────────────────────────────────────────────────────
103
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
104
+ const esmImport = new Function('m', 'return import(m)');
123
105
  function resolveEnvVar(value) {
124
106
  if (value.startsWith('$'))
125
107
  return process.env[value.slice(1)] ?? value;
@@ -138,6 +120,9 @@ async function getLlamaSession(modelPath) {
138
120
  const model = await llama.loadModel({ modelPath });
139
121
  return { LlamaChatSession, model };
140
122
  })();
123
+ promise.catch(() => {
124
+ llamaCache.delete(modelPath);
125
+ });
141
126
  llamaCache.set(modelPath, promise);
142
127
  return promise;
143
128
  }
@@ -154,65 +139,96 @@ async function localProvider(prompt, modelPath) {
154
139
  }
155
140
  }
156
141
  async function ollamaProvider(prompt, model, baseUrl) {
157
- const res = await fetchWithRetry(`${baseUrl}/api/generate`, {
158
- method: 'POST',
159
- headers: { 'Content-Type': 'application/json' },
160
- body: JSON.stringify({ model, prompt, stream: false }),
161
- signal: AbortSignal.timeout(120_000),
162
- }, 'ollama');
163
- if (!res.ok)
164
- throw new Error(`Ollama ${res.status}: ${await res.text()}`);
165
142
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
166
- return (await res.json()).response ?? '';
143
+ let Ollama;
144
+ try {
145
+ ({ Ollama } = await esmImport('ollama'));
146
+ }
147
+ catch {
148
+ throw new Error("'ollama' provider requires the ollama package. Install it with: npm install ollama");
149
+ }
150
+ const client = new Ollama({ host: baseUrl });
151
+ const response = await client.chat({
152
+ model,
153
+ messages: [{ role: 'user', content: prompt }],
154
+ });
155
+ return response.message?.content ?? '';
167
156
  }
168
- async function openaiProvider(prompt, model, apiKey, baseUrl, extraHeaders) {
169
- const headers = {
170
- 'Content-Type': 'application/json',
171
- ...extraHeaders,
172
- };
173
- if (!extraHeaders?.['api-key']) {
174
- headers['Authorization'] = `Bearer ${apiKey}`;
157
+ async function openaiProvider(prompt, model, apiKey, baseUrl) {
158
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
159
+ let OpenAI;
160
+ try {
161
+ ({ OpenAI } = await esmImport('openai'));
175
162
  }
176
- const res = await fetchWithRetry(`${baseUrl.replace(/\/$/, '')}/chat/completions`, {
177
- method: 'POST',
178
- headers,
179
- body: JSON.stringify({
163
+ catch {
164
+ throw new Error("'openai' provider requires the openai package. Install it with: npm install openai");
165
+ }
166
+ const client = new OpenAI({
167
+ apiKey,
168
+ ...(baseUrl ? { baseURL: baseUrl.replace(/\/$/, '') } : {}),
169
+ });
170
+ const msg = await client.chat.completions.create({
171
+ model,
172
+ messages: [{ role: 'user', content: prompt }],
173
+ temperature: 0.3,
174
+ max_tokens: 4096,
175
+ });
176
+ return msg.choices[0]?.message?.content ?? '';
177
+ }
178
+ async function anthropicProvider(prompt, model, apiKey, baseUrl) {
179
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
180
+ let Anthropic;
181
+ try {
182
+ ({ default: Anthropic } = await esmImport('@anthropic-ai/sdk'));
183
+ }
184
+ catch {
185
+ throw new Error("'anthropic' provider requires @anthropic-ai/sdk. Install it with: npm install @anthropic-ai/sdk");
186
+ }
187
+ const client = new Anthropic({
188
+ apiKey,
189
+ ...(baseUrl ? { baseURL: baseUrl.replace(/\/$/, '') } : {}),
190
+ });
191
+ const msg = await client.messages.create({
192
+ model,
193
+ max_tokens: 4096,
194
+ messages: [{ role: 'user', content: prompt }],
195
+ });
196
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
197
+ return msg.content[0]?.text ?? '';
198
+ }
199
+ async function huggingfaceProvider(prompt, model, apiKey) {
200
+ // Hugging Face exposes an OpenAI-compatible /v1 endpoint — use the openai SDK with a custom baseURL
201
+ return openaiProvider(prompt, model, apiKey, 'https://api-inference.huggingface.co/v1');
202
+ }
203
+ async function githubProvider(prompt, model, apiKey) {
204
+ // GitHub Models is OpenAI-compatible — use the openai SDK with the GitHub Models endpoint
205
+ return openaiProvider(prompt, model, apiKey, 'https://models.inference.ai.azure.com');
206
+ }
207
+ async function azureinferenceProvider(prompt, model, apiKey, endpoint) {
208
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
209
+ let ModelClient, AzureKeyCredential;
210
+ try {
211
+ ({ default: ModelClient } = await esmImport('@azure-rest/ai-inference'));
212
+ ({ AzureKeyCredential } = await esmImport('@azure/core-auth'));
213
+ }
214
+ catch {
215
+ throw new Error("'azureinference' provider requires @azure-rest/ai-inference and @azure/core-auth. " +
216
+ 'Install with: npm install @azure-rest/ai-inference @azure/core-auth');
217
+ }
218
+ const client = ModelClient(endpoint.replace(/\/$/, ''), new AzureKeyCredential(apiKey));
219
+ const response = await client.path('/chat/completions').post({
220
+ body: {
180
221
  model,
181
222
  messages: [{ role: 'user', content: prompt }],
182
223
  temperature: 0.3,
183
224
  max_tokens: 4096,
184
- }),
185
- signal: AbortSignal.timeout(120_000),
186
- }, 'openai-compatible');
187
- if (!res.ok)
188
- throw new Error(`openai-compatible ${res.status}: ${await res.text()}`);
189
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
190
- return (await res.json()).choices?.[0]?.message?.content ?? '';
191
- }
192
- async function anthropicProvider(prompt, model, apiKey, baseUrl) {
193
- const res = await fetchWithRetry(`${baseUrl.replace(/\/$/, '')}/messages`, {
194
- method: 'POST',
195
- headers: {
196
- 'Content-Type': 'application/json',
197
- 'x-api-key': apiKey,
198
- 'anthropic-version': '2023-06-01',
199
225
  },
200
- body: JSON.stringify({
201
- model,
202
- max_tokens: 4096,
203
- messages: [{ role: 'user', content: prompt }],
204
- }),
205
- signal: AbortSignal.timeout(120_000),
206
- }, 'anthropic');
207
- if (!res.ok)
208
- throw new Error(`anthropic ${res.status}: ${await res.text()}`);
226
+ });
227
+ if (response.status !== '200') {
228
+ throw new Error(`Azure AI Inference ${response.status}: ${JSON.stringify(response.body)}`);
229
+ }
209
230
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
210
- return (await res.json()).content?.[0]?.text ?? '';
211
- }
212
- async function huggingfaceProvider(prompt, model, apiKey) {
213
- // Use the OpenAI-compatible endpoint
214
- const baseUrl = 'https://api-inference.huggingface.co/v1';
215
- return openaiProvider(prompt, model, apiKey, baseUrl);
231
+ return response.body.choices?.[0]?.message?.content ?? '';
216
232
  }
217
233
  // ─── Bedrock credential pre-flight ───────────────────────────────────────────
218
234
  function warnIfNoBedrockCredentials() {
@@ -315,31 +331,27 @@ async function bedrockProvider(prompt, model, region) {
315
331
  '');
316
332
  }
317
333
  async function azureaiProvider(prompt, model, apiKey, baseUrl) {
318
- // Azure OpenAI uses api-key header instead of Authorization: Bearer
319
- // baseUrl should be the full endpoint:
320
- // https://{resource}.openai.azure.com/openai/deployments/{deployment}/chat/completions?api-version=2024-12-01-preview
321
- // OR just https://{resource}.openai.azure.com — we'll append the path if needed
322
- let url = baseUrl.replace(/\/$/, '');
323
- if (!url.includes('/chat/completions')) {
324
- url = `${url}/openai/deployments/${model}/chat/completions?api-version=2024-12-01-preview`;
325
- }
326
- const res = await fetchWithRetry(url, {
327
- method: 'POST',
328
- headers: {
329
- 'Content-Type': 'application/json',
330
- 'api-key': apiKey,
331
- },
332
- body: JSON.stringify({
333
- messages: [{ role: 'user', content: prompt }],
334
- temperature: 0.3,
335
- max_tokens: 4096,
336
- }),
337
- signal: AbortSignal.timeout(120_000),
338
- }, 'azureai');
339
- if (!res.ok)
340
- throw new Error(`Azure AI ${res.status}: ${await res.text()}`);
341
334
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
342
- return (await res.json()).choices?.[0]?.message?.content ?? '';
335
+ let AzureOpenAI;
336
+ try {
337
+ ({ AzureOpenAI } = await esmImport('openai'));
338
+ }
339
+ catch {
340
+ throw new Error("'azureai' provider requires the openai package. Install it with: npm install openai");
341
+ }
342
+ const client = new AzureOpenAI({
343
+ apiKey,
344
+ endpoint: baseUrl.replace(/\/$/, ''),
345
+ apiVersion: '2024-12-01-preview',
346
+ deployment: model,
347
+ });
348
+ const msg = await client.chat.completions.create({
349
+ model,
350
+ messages: [{ role: 'user', content: prompt }],
351
+ temperature: 0.3,
352
+ max_tokens: 4096,
353
+ });
354
+ return msg.choices[0]?.message?.content ?? '';
343
355
  }
344
356
  // ─── Main entry point ─────────────────────────────────────────────────────────
345
357
  /**
@@ -358,7 +370,7 @@ async function generateSpecFromStory(story, format, opts) {
358
370
  return localProvider(prompt, opts.model);
359
371
  }
360
372
  case 'ollama': {
361
- return ollamaProvider(prompt, opts.model ?? 'qwen2.5-coder:7b', opts.baseUrl ?? 'http://localhost:11434');
373
+ return ollamaProvider(prompt, opts.model ?? 'gemma-4-e4b-it', opts.baseUrl ?? 'http://localhost:11434');
362
374
  }
363
375
  case 'openai': {
364
376
  return openaiProvider(prompt, opts.model ?? 'gpt-4o', resolveEnvVar(opts.apiKey ?? ''), opts.baseUrl ?? 'https://api.openai.com/v1');
@@ -379,6 +391,14 @@ async function generateSpecFromStory(story, format, opts) {
379
391
  throw new Error('azureai provider requires --ai-url <azure-endpoint>');
380
392
  return azureaiProvider(prompt, opts.model ?? 'gpt-4o', resolveEnvVar(opts.apiKey ?? ''), opts.baseUrl);
381
393
  }
394
+ case 'github': {
395
+ return githubProvider(prompt, opts.model ?? 'gpt-4o', resolveEnvVar(opts.apiKey ?? process.env['GITHUB_TOKEN'] ?? ''));
396
+ }
397
+ case 'azureinference': {
398
+ if (!opts.baseUrl)
399
+ throw new Error('azureinference provider requires --ai-url <endpoint>');
400
+ return azureinferenceProvider(prompt, opts.model ?? 'gpt-4o', resolveEnvVar(opts.apiKey ?? ''), opts.baseUrl);
401
+ }
382
402
  }
383
403
  };
384
404
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"generate-spec.js","sourceRoot":"","sources":["../../src/ai/generate-spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate-spec.js","sourceRoot":"","sources":["../../src/ai/generate-spec.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@
13
13
  * dependencies, works fully offline.
14
14
  *
15
15
  * ollama — local LLM via Ollama REST API (http://localhost:11434).
16
- * Model suggestion: qwen2.5-coder:7b.
16
+ * Model suggestion: gemma-4-e4b-it.
17
17
  *
18
18
  * openai — OpenAI Chat Completions API (requires API key).
19
19
  *
@@ -22,22 +22,22 @@
22
22
  * Usage (engine.ts / CLI):
23
23
  * const { title, description, steps } = await summarizeTest(test, localType, {
24
24
  * provider: 'local',
25
- * model: '/path/to/qwen2.5-coder-1.5b-instruct-q4_k_m.gguf',
25
+ * model: '/path/to/gemma-4-e4b-it-Q4_K_M.gguf',
26
26
  * });
27
27
  * test.title = title;
28
28
  * test.description = description;
29
29
  * test.steps = steps;
30
30
  */
31
31
  import { ParsedStep, ParsedTest } from '../types';
32
- export type AiProvider = 'heuristic' | 'local' | 'ollama' | 'openai' | 'anthropic' | 'huggingface' | 'bedrock' | 'azureai';
32
+ export type AiProvider = 'heuristic' | 'local' | 'ollama' | 'openai' | 'anthropic' | 'huggingface' | 'bedrock' | 'azureai' | 'github' | 'azureinference';
33
33
  export interface AiSummaryOpts {
34
34
  provider: AiProvider;
35
35
  /**
36
36
  * For `local`: absolute path to a GGUF model file
37
- * For `ollama`: model tag, e.g. qwen2.5-coder:7b
37
+ * For `ollama`: model tag, e.g. gemma-4-e4b-it
38
38
  * For `openai`: model name, e.g. gpt-4o-mini
39
39
  * For `anthropic`: model name, e.g. claude-haiku-4-5-20251001
40
- * For `huggingface`: model id, e.g. mistralai/Mistral-7B-Instruct-v0.3
40
+ * For `huggingface`: model id, e.g. google/gemma-4-e4b-it
41
41
  * For `bedrock`: model id, e.g. anthropic.claude-3-haiku-20240307-v1:0
42
42
  * For `azureai`: deployment name, e.g. gpt-4o
43
43
  */