n8n-nodes-github-copilot 3.27.6 → 3.28.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.
- package/dist/credentials/GitHubCopilotApi.credentials.d.ts +1 -1
- package/dist/credentials/GitHubCopilotApi.credentials.js +19 -19
- package/dist/credentials/GitHubCopilotOAuth2Api.credentials.backup.d.ts +1 -1
- package/dist/credentials/GitHubCopilotOAuth2Api.credentials.backup.js +71 -71
- package/dist/credentials/GitHubCopilotOAuth2Api.credentials.d.ts +1 -1
- package/dist/credentials/GitHubCopilotOAuth2Api.credentials.js +67 -67
- package/dist/credentials/GitHubCopilotOAuth2Api.credentials.oauth.d.ts +1 -1
- package/dist/credentials/GitHubCopilotOAuth2Api.credentials.oauth.js +38 -38
- package/dist/nodes/GitHubCopilot/GitHubCopilot.node.d.ts +1 -1
- package/dist/nodes/GitHubCopilot/GitHubCopilot.node.js +188 -181
- package/dist/nodes/GitHubCopilotChatAPI/GitHubCopilotChatAPI.node.d.ts +1 -1
- package/dist/nodes/GitHubCopilotChatAPI/GitHubCopilotChatAPI.node.js +38 -38
- package/dist/nodes/GitHubCopilotChatAPI/nodeProperties.d.ts +1 -1
- package/dist/nodes/GitHubCopilotChatAPI/nodeProperties.js +97 -97
- package/dist/nodes/GitHubCopilotChatAPI/utils/imageProcessor.d.ts +2 -2
- package/dist/nodes/GitHubCopilotChatAPI/utils/imageProcessor.js +16 -15
- package/dist/nodes/GitHubCopilotChatAPI/utils/index.d.ts +3 -3
- package/dist/nodes/GitHubCopilotChatAPI/utils/mediaDetection.d.ts +3 -3
- package/dist/nodes/GitHubCopilotChatAPI/utils/mediaDetection.js +20 -26
- package/dist/nodes/GitHubCopilotChatAPI/utils/modelCapabilities.d.ts +1 -1
- package/dist/nodes/GitHubCopilotChatAPI/utils/modelCapabilities.js +24 -24
- package/dist/nodes/GitHubCopilotChatAPI/utils/types.d.ts +4 -4
- package/dist/nodes/GitHubCopilotChatModel/GitHubCopilotChatModel.node.d.ts +1 -1
- package/dist/nodes/GitHubCopilotChatModel/GitHubCopilotChatModel.node.js +86 -82
- package/dist/nodes/GitHubCopilotOpenAI/GitHubCopilotOpenAI.node.d.ts +5 -0
- package/dist/nodes/GitHubCopilotOpenAI/GitHubCopilotOpenAI.node.js +142 -0
- package/dist/nodes/GitHubCopilotOpenAI/nodeProperties.d.ts +2 -0
- package/dist/nodes/GitHubCopilotOpenAI/nodeProperties.js +326 -0
- package/dist/nodes/GitHubCopilotOpenAI/utils/index.d.ts +2 -0
- package/dist/nodes/GitHubCopilotOpenAI/utils/index.js +24 -0
- package/dist/nodes/GitHubCopilotOpenAI/utils/openaiCompat.d.ts +95 -0
- package/dist/nodes/GitHubCopilotOpenAI/utils/openaiCompat.js +175 -0
- package/dist/nodes/GitHubCopilotOpenAI/utils/types.d.ts +101 -0
- package/dist/nodes/GitHubCopilotOpenAI/utils/types.js +2 -0
- package/dist/nodes/GitHubCopilotTest/GitHubCopilotTest.node.d.ts +1 -1
- package/dist/nodes/GitHubCopilotTest/GitHubCopilotTest.node.js +96 -94
- package/package.json +75 -74
|
@@ -11,12 +11,14 @@ async function listAvailableModels(token, enableRetry = true, maxRetries = 3) {
|
|
|
11
11
|
for (let attempt = 1; attempt <= maxRetries + 1; attempt++) {
|
|
12
12
|
try {
|
|
13
13
|
const response = await fetch(GitHubCopilotEndpoints_1.GitHubCopilotEndpoints.getModelsUrl(), {
|
|
14
|
-
method:
|
|
14
|
+
method: "GET",
|
|
15
15
|
headers: GitHubCopilotEndpoints_1.GitHubCopilotEndpoints.getAuthHeaders(token),
|
|
16
16
|
});
|
|
17
17
|
if (!response.ok) {
|
|
18
18
|
const errorText = await response.text();
|
|
19
|
-
if (GitHubCopilotEndpoints_1.GitHubCopilotEndpoints.isTpmQuotaError(response.status) &&
|
|
19
|
+
if (GitHubCopilotEndpoints_1.GitHubCopilotEndpoints.isTpmQuotaError(response.status) &&
|
|
20
|
+
enableRetry &&
|
|
21
|
+
attempt <= maxRetries) {
|
|
20
22
|
const delay = GitHubCopilotEndpoints_1.GitHubCopilotEndpoints.getRetryDelay(attempt);
|
|
21
23
|
retryInfo.retries.push({
|
|
22
24
|
attempt: attempt,
|
|
@@ -27,12 +29,12 @@ async function listAvailableModels(token, enableRetry = true, maxRetries = 3) {
|
|
|
27
29
|
retryInfo.totalDelay += delay;
|
|
28
30
|
retryInfo.attempts = attempt + 1;
|
|
29
31
|
console.log(`Attempt ${attempt} failed with 403, retrying in ${delay}ms...`);
|
|
30
|
-
await new Promise(resolve => setTimeout(resolve, delay));
|
|
32
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
31
33
|
continue;
|
|
32
34
|
}
|
|
33
35
|
throw new Error(`API Error ${response.status}: ${errorText}`);
|
|
34
36
|
}
|
|
35
|
-
const data = await response.json();
|
|
37
|
+
const data = (await response.json());
|
|
36
38
|
const summary = {
|
|
37
39
|
success: true,
|
|
38
40
|
timestamp: new Date().toISOString(),
|
|
@@ -50,12 +52,12 @@ async function listAvailableModels(token, enableRetry = true, maxRetries = 3) {
|
|
|
50
52
|
}
|
|
51
53
|
catch (error) {
|
|
52
54
|
if (attempt >= maxRetries + 1 || !enableRetry) {
|
|
53
|
-
const errorMessage = error instanceof Error ? error.message :
|
|
55
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
54
56
|
return {
|
|
55
57
|
success: false,
|
|
56
58
|
timestamp: new Date().toISOString(),
|
|
57
59
|
error: errorMessage,
|
|
58
|
-
details:
|
|
60
|
+
details: "Failed to fetch models from GitHub Copilot API",
|
|
59
61
|
retryInfo: {
|
|
60
62
|
totalAttempts: retryInfo.attempts,
|
|
61
63
|
totalRetries: retryInfo.retries.length,
|
|
@@ -71,8 +73,8 @@ async function listAvailableModels(token, enableRetry = true, maxRetries = 3) {
|
|
|
71
73
|
return {
|
|
72
74
|
success: false,
|
|
73
75
|
timestamp: new Date().toISOString(),
|
|
74
|
-
error:
|
|
75
|
-
details:
|
|
76
|
+
error: "Maximum retry attempts exceeded",
|
|
77
|
+
details: "Failed to fetch models after all retry attempts",
|
|
76
78
|
retryInfo: {
|
|
77
79
|
totalAttempts: retryInfo.attempts,
|
|
78
80
|
totalRetries: retryInfo.retries.length,
|
|
@@ -90,13 +92,13 @@ async function consolidatedModelTest(token, enableRetry = true, maxRetries = 3,
|
|
|
90
92
|
let successfulTests = 0;
|
|
91
93
|
let failedTests = 0;
|
|
92
94
|
try {
|
|
93
|
-
console.log(
|
|
95
|
+
console.log("🧪 Starting Consolidated Model Test...");
|
|
94
96
|
const modelsResponse = await listAvailableModels(token, enableRetry, maxRetries);
|
|
95
97
|
if (!modelsResponse.success || !modelsResponse.data) {
|
|
96
98
|
return {
|
|
97
99
|
success: false,
|
|
98
100
|
timestamp: new Date().toISOString(),
|
|
99
|
-
error:
|
|
101
|
+
error: "Failed to fetch models list for consolidated test",
|
|
100
102
|
details: modelsResponse,
|
|
101
103
|
};
|
|
102
104
|
}
|
|
@@ -110,7 +112,7 @@ async function consolidatedModelTest(token, enableRetry = true, maxRetries = 3,
|
|
|
110
112
|
modelInfo: {
|
|
111
113
|
id: modelId,
|
|
112
114
|
name: model.name || modelId,
|
|
113
|
-
vendor: model.vendor ||
|
|
115
|
+
vendor: model.vendor || "unknown",
|
|
114
116
|
capabilities: model.capabilities || {},
|
|
115
117
|
},
|
|
116
118
|
tests: [],
|
|
@@ -130,15 +132,15 @@ async function consolidatedModelTest(token, enableRetry = true, maxRetries = 3,
|
|
|
130
132
|
modelResults.summary.totalAttempts++;
|
|
131
133
|
try {
|
|
132
134
|
const response = await fetch(GitHubCopilotEndpoints_1.GitHubCopilotEndpoints.getChatCompletionsUrl(), {
|
|
133
|
-
method:
|
|
135
|
+
method: "POST",
|
|
134
136
|
headers: GitHubCopilotEndpoints_1.GitHubCopilotEndpoints.getAuthHeaders(token),
|
|
135
137
|
body: JSON.stringify({
|
|
136
138
|
model: modelId,
|
|
137
139
|
messages: [
|
|
138
140
|
{
|
|
139
|
-
role:
|
|
140
|
-
content: testMessage
|
|
141
|
-
}
|
|
141
|
+
role: "user",
|
|
142
|
+
content: testMessage,
|
|
143
|
+
},
|
|
142
144
|
],
|
|
143
145
|
max_tokens: 10,
|
|
144
146
|
temperature: 0.1,
|
|
@@ -147,7 +149,7 @@ async function consolidatedModelTest(token, enableRetry = true, maxRetries = 3,
|
|
|
147
149
|
const testEnd = Date.now();
|
|
148
150
|
const responseTime = testEnd - testStart;
|
|
149
151
|
if (response.ok) {
|
|
150
|
-
const data = await response.json();
|
|
152
|
+
const data = (await response.json());
|
|
151
153
|
successfulTests++;
|
|
152
154
|
modelResults.summary.successful++;
|
|
153
155
|
const choices = data.choices || [];
|
|
@@ -158,9 +160,9 @@ async function consolidatedModelTest(token, enableRetry = true, maxRetries = 3,
|
|
|
158
160
|
testNumber: testNum,
|
|
159
161
|
success: true,
|
|
160
162
|
responseTime: responseTime,
|
|
161
|
-
response: message.content ||
|
|
163
|
+
response: message.content || "No content",
|
|
162
164
|
usage: usage || null,
|
|
163
|
-
finishReason: firstChoice.finish_reason ||
|
|
165
|
+
finishReason: firstChoice.finish_reason || "unknown",
|
|
164
166
|
timestamp: new Date().toISOString(),
|
|
165
167
|
};
|
|
166
168
|
modelResults.tests.push(testResult);
|
|
@@ -191,11 +193,11 @@ async function consolidatedModelTest(token, enableRetry = true, maxRetries = 3,
|
|
|
191
193
|
testNumber: testNum,
|
|
192
194
|
success: false,
|
|
193
195
|
responseTime: responseTime,
|
|
194
|
-
error: error instanceof Error ? error.message :
|
|
196
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
195
197
|
timestamp: new Date().toISOString(),
|
|
196
198
|
});
|
|
197
199
|
}
|
|
198
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
200
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
199
201
|
}
|
|
200
202
|
const successfulResponses = modelResults.tests.filter((t) => {
|
|
201
203
|
const test = t;
|
|
@@ -235,14 +237,14 @@ async function consolidatedModelTest(token, enableRetry = true, maxRetries = 3,
|
|
|
235
237
|
modelResults: testResults,
|
|
236
238
|
recommendations: generateTestRecommendations(testResults),
|
|
237
239
|
};
|
|
238
|
-
console.log(
|
|
240
|
+
console.log("✅ Consolidated test completed successfully!");
|
|
239
241
|
return consolidatedSummary;
|
|
240
242
|
}
|
|
241
243
|
catch (error) {
|
|
242
244
|
return {
|
|
243
245
|
success: false,
|
|
244
246
|
timestamp: new Date().toISOString(),
|
|
245
|
-
error: error instanceof Error ? error.message :
|
|
247
|
+
error: error instanceof Error ? error.message : "Unknown error in consolidated test",
|
|
246
248
|
partialResults: testResults,
|
|
247
249
|
testDuration: Date.now() - testStartTime,
|
|
248
250
|
};
|
|
@@ -262,24 +264,24 @@ function generateTestRecommendations(testResults) {
|
|
|
262
264
|
};
|
|
263
265
|
});
|
|
264
266
|
const bestModels = modelStats
|
|
265
|
-
.filter(m => m.successRate === 100)
|
|
267
|
+
.filter((m) => m.successRate === 100)
|
|
266
268
|
.sort((a, b) => a.avgResponseTime - b.avgResponseTime)
|
|
267
269
|
.slice(0, 3);
|
|
268
270
|
if (bestModels.length > 0) {
|
|
269
271
|
recommendations.push({
|
|
270
|
-
type:
|
|
271
|
-
title:
|
|
272
|
+
type: "best_performance",
|
|
273
|
+
title: "Top Performing Models (100% success rate)",
|
|
272
274
|
models: bestModels,
|
|
273
|
-
description:
|
|
275
|
+
description: "These models completed all tests successfully with fastest response times",
|
|
274
276
|
});
|
|
275
277
|
}
|
|
276
|
-
const problematicModels = modelStats.filter(m => m.successRate < 80);
|
|
278
|
+
const problematicModels = modelStats.filter((m) => m.successRate < 80);
|
|
277
279
|
if (problematicModels.length > 0) {
|
|
278
280
|
recommendations.push({
|
|
279
|
-
type:
|
|
280
|
-
title:
|
|
281
|
+
type: "attention_needed",
|
|
282
|
+
title: "Models Requiring Attention (< 80% success rate)",
|
|
281
283
|
models: problematicModels,
|
|
282
|
-
description:
|
|
284
|
+
description: "These models had reliability issues during testing",
|
|
283
285
|
});
|
|
284
286
|
}
|
|
285
287
|
const vendorStats = modelStats.reduce((acc, model) => {
|
|
@@ -293,103 +295,103 @@ function generateTestRecommendations(testResults) {
|
|
|
293
295
|
stats.avgResponseTime += model.avgResponseTime;
|
|
294
296
|
return acc;
|
|
295
297
|
}, {});
|
|
296
|
-
Object.keys(vendorStats).forEach(vendor => {
|
|
298
|
+
Object.keys(vendorStats).forEach((vendor) => {
|
|
297
299
|
const vendorData = vendorStats[vendor];
|
|
298
300
|
vendorData.avgSuccessRate = Math.round(vendorData.totalSuccessRate / vendorData.count);
|
|
299
301
|
vendorData.avgResponseTime = Math.round(vendorData.avgResponseTime / vendorData.count);
|
|
300
302
|
});
|
|
301
303
|
recommendations.push({
|
|
302
|
-
type:
|
|
303
|
-
title:
|
|
304
|
+
type: "vendor_analysis",
|
|
305
|
+
title: "Performance by Vendor",
|
|
304
306
|
vendors: vendorStats,
|
|
305
|
-
description:
|
|
307
|
+
description: "Comparative analysis of model performance by vendor",
|
|
306
308
|
});
|
|
307
309
|
return recommendations;
|
|
308
310
|
}
|
|
309
311
|
class GitHubCopilotTest {
|
|
310
312
|
constructor() {
|
|
311
313
|
this.description = {
|
|
312
|
-
displayName:
|
|
313
|
-
name:
|
|
314
|
-
icon:
|
|
315
|
-
group: [
|
|
314
|
+
displayName: "GitHub Copilot Test",
|
|
315
|
+
name: "gitHubCopilotTest",
|
|
316
|
+
icon: "file:../../shared/icons/copilot.svg",
|
|
317
|
+
group: ["AI"],
|
|
316
318
|
version: 1,
|
|
317
|
-
subtitle:
|
|
318
|
-
description:
|
|
319
|
+
subtitle: "={{$parameter[\"testFunction\"]}}",
|
|
320
|
+
description: "Test GitHub Copilot API credentials with predefined functions",
|
|
319
321
|
defaults: {
|
|
320
|
-
name:
|
|
322
|
+
name: "GitHub Copilot Test",
|
|
321
323
|
},
|
|
322
324
|
inputs: ["main"],
|
|
323
325
|
outputs: ["main"],
|
|
324
326
|
credentials: [
|
|
325
327
|
{
|
|
326
|
-
name:
|
|
328
|
+
name: "githubCopilotApi",
|
|
327
329
|
required: true,
|
|
328
330
|
displayOptions: {
|
|
329
331
|
show: {
|
|
330
|
-
credentialType: [
|
|
332
|
+
credentialType: ["githubCopilotApi"],
|
|
331
333
|
},
|
|
332
334
|
},
|
|
333
335
|
},
|
|
334
336
|
{
|
|
335
|
-
name:
|
|
337
|
+
name: "githubCopilotOAuth2Api",
|
|
336
338
|
required: true,
|
|
337
339
|
displayOptions: {
|
|
338
340
|
show: {
|
|
339
|
-
credentialType: [
|
|
341
|
+
credentialType: ["githubCopilotOAuth2Api"],
|
|
340
342
|
},
|
|
341
343
|
},
|
|
342
344
|
},
|
|
343
345
|
],
|
|
344
346
|
properties: [
|
|
345
347
|
{
|
|
346
|
-
displayName:
|
|
347
|
-
name:
|
|
348
|
-
type:
|
|
348
|
+
displayName: "Credential Type",
|
|
349
|
+
name: "credentialType",
|
|
350
|
+
type: "options",
|
|
349
351
|
options: [
|
|
350
352
|
{
|
|
351
|
-
name:
|
|
352
|
-
value:
|
|
353
|
-
description:
|
|
353
|
+
name: "GitHub Copilot API (Manual Token)",
|
|
354
|
+
value: "githubCopilotApi",
|
|
355
|
+
description: "Use manual GitHub CLI token",
|
|
354
356
|
},
|
|
355
357
|
{
|
|
356
|
-
name:
|
|
357
|
-
value:
|
|
358
|
-
description:
|
|
358
|
+
name: "GitHub Copilot OAuth2 (with Helper)",
|
|
359
|
+
value: "githubCopilotOAuth2Api",
|
|
360
|
+
description: "Use OAuth2 credential with helper script",
|
|
359
361
|
},
|
|
360
362
|
],
|
|
361
|
-
default:
|
|
362
|
-
description:
|
|
363
|
+
default: "githubCopilotApi",
|
|
364
|
+
description: "Type of credential to use for GitHub Copilot authentication",
|
|
363
365
|
},
|
|
364
366
|
{
|
|
365
|
-
displayName:
|
|
366
|
-
name:
|
|
367
|
-
type:
|
|
367
|
+
displayName: "Test Function",
|
|
368
|
+
name: "testFunction",
|
|
369
|
+
type: "options",
|
|
368
370
|
noDataExpression: true,
|
|
369
371
|
options: [
|
|
370
372
|
{
|
|
371
|
-
name:
|
|
372
|
-
value:
|
|
373
|
-
description:
|
|
373
|
+
name: "List Available Models",
|
|
374
|
+
value: "listModels",
|
|
375
|
+
description: "Get all models available for your GitHub Copilot subscription",
|
|
374
376
|
},
|
|
375
377
|
{
|
|
376
|
-
name:
|
|
377
|
-
value:
|
|
378
|
-
description:
|
|
378
|
+
name: "Consolidated Model Test",
|
|
379
|
+
value: "consolidatedTest",
|
|
380
|
+
description: "Test all available models 5 times each and generate comprehensive report ⚠️ This test may take up to 2 minutes to complete",
|
|
379
381
|
},
|
|
380
382
|
],
|
|
381
|
-
default:
|
|
382
|
-
description:
|
|
383
|
+
default: "listModels",
|
|
384
|
+
description: "Select the test function to execute",
|
|
383
385
|
},
|
|
384
386
|
{
|
|
385
|
-
displayName:
|
|
386
|
-
name:
|
|
387
|
-
type:
|
|
387
|
+
displayName: "Tests Per Model",
|
|
388
|
+
name: "testsPerModel",
|
|
389
|
+
type: "number",
|
|
388
390
|
default: 5,
|
|
389
|
-
description:
|
|
391
|
+
description: "Number of times to test each model (affects accuracy of results)",
|
|
390
392
|
displayOptions: {
|
|
391
393
|
show: {
|
|
392
|
-
testFunction: [
|
|
394
|
+
testFunction: ["consolidatedTest"],
|
|
393
395
|
},
|
|
394
396
|
},
|
|
395
397
|
typeOptions: {
|
|
@@ -398,26 +400,26 @@ class GitHubCopilotTest {
|
|
|
398
400
|
},
|
|
399
401
|
},
|
|
400
402
|
{
|
|
401
|
-
displayName:
|
|
402
|
-
name:
|
|
403
|
-
type:
|
|
404
|
-
placeholder:
|
|
403
|
+
displayName: "Advanced Options",
|
|
404
|
+
name: "advancedOptions",
|
|
405
|
+
type: "collection",
|
|
406
|
+
placeholder: "Add Option",
|
|
405
407
|
default: {},
|
|
406
|
-
description:
|
|
408
|
+
description: "Additional options for the test execution",
|
|
407
409
|
options: [
|
|
408
410
|
{
|
|
409
|
-
displayName:
|
|
410
|
-
name:
|
|
411
|
-
type:
|
|
411
|
+
displayName: "Auto Retry on 403 Error",
|
|
412
|
+
name: "enableRetry",
|
|
413
|
+
type: "boolean",
|
|
412
414
|
default: true,
|
|
413
|
-
description:
|
|
415
|
+
description: "Automatically retry requests when hitting TPM (Transactions Per Minute) quota limits (HTTP 403)",
|
|
414
416
|
},
|
|
415
417
|
{
|
|
416
|
-
displayName:
|
|
417
|
-
name:
|
|
418
|
-
type:
|
|
418
|
+
displayName: "Max Retry Attempts",
|
|
419
|
+
name: "maxRetries",
|
|
420
|
+
type: "number",
|
|
419
421
|
default: 3,
|
|
420
|
-
description:
|
|
422
|
+
description: "Maximum number of retry attempts for 403 errors",
|
|
421
423
|
displayOptions: {
|
|
422
424
|
show: {
|
|
423
425
|
enableRetry: [true],
|
|
@@ -435,14 +437,14 @@ class GitHubCopilotTest {
|
|
|
435
437
|
const returnData = [];
|
|
436
438
|
for (let i = 0; i < items.length; i++) {
|
|
437
439
|
try {
|
|
438
|
-
const testFunction = this.getNodeParameter(
|
|
439
|
-
const advancedOptions = this.getNodeParameter(
|
|
440
|
+
const testFunction = this.getNodeParameter("testFunction", i);
|
|
441
|
+
const advancedOptions = this.getNodeParameter("advancedOptions", i, {});
|
|
440
442
|
const enableRetry = advancedOptions.enableRetry !== false;
|
|
441
443
|
const maxRetries = advancedOptions.maxRetries || 3;
|
|
442
|
-
const testsPerModel = testFunction ===
|
|
443
|
-
? this.getNodeParameter(
|
|
444
|
+
const testsPerModel = testFunction === "consolidatedTest"
|
|
445
|
+
? this.getNodeParameter("testsPerModel", i)
|
|
444
446
|
: 5;
|
|
445
|
-
const credentialType = this.getNodeParameter(
|
|
447
|
+
const credentialType = this.getNodeParameter("credentialType", i, "githubCopilotApi");
|
|
446
448
|
const credentials = await this.getCredentials(credentialType, i);
|
|
447
449
|
const token = (credentials.accessToken ||
|
|
448
450
|
credentials.access_token ||
|
|
@@ -456,10 +458,10 @@ class GitHubCopilotTest {
|
|
|
456
458
|
}
|
|
457
459
|
let result = {};
|
|
458
460
|
switch (testFunction) {
|
|
459
|
-
case
|
|
461
|
+
case "listModels":
|
|
460
462
|
result = await listAvailableModels(token, enableRetry, maxRetries);
|
|
461
463
|
break;
|
|
462
|
-
case
|
|
464
|
+
case "consolidatedTest":
|
|
463
465
|
result = await consolidatedModelTest(token, enableRetry, maxRetries, testsPerModel);
|
|
464
466
|
break;
|
|
465
467
|
default:
|
|
@@ -471,12 +473,12 @@ class GitHubCopilotTest {
|
|
|
471
473
|
});
|
|
472
474
|
}
|
|
473
475
|
catch (error) {
|
|
474
|
-
const errorMessage = error instanceof Error ? error.message :
|
|
476
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
475
477
|
if (this.continueOnFail()) {
|
|
476
478
|
returnData.push({
|
|
477
479
|
json: {
|
|
478
480
|
error: errorMessage,
|
|
479
|
-
testFunction: this.getNodeParameter(
|
|
481
|
+
testFunction: this.getNodeParameter("testFunction", i),
|
|
480
482
|
},
|
|
481
483
|
pairedItem: { item: i },
|
|
482
484
|
});
|
package/package.json
CHANGED
|
@@ -1,74 +1,75 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "n8n-nodes-github-copilot",
|
|
3
|
-
"version": "3.
|
|
4
|
-
"description": "n8n community node for GitHub Copilot with CLI integration, Chat API access, and AI Chat Model for workflows - access GPT-5, Claude, Gemini and more using your Copilot subscription",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"homepage": "https://github.com/sufficit/n8n-nodes-github-copilot",
|
|
7
|
-
"author": {
|
|
8
|
-
"name": "Sufficit",
|
|
9
|
-
"email": "development@sufficit.com.br"
|
|
10
|
-
},
|
|
11
|
-
"repository": {
|
|
12
|
-
"type": "git",
|
|
13
|
-
"url": "https://github.com/sufficit/n8n-nodes-github-copilot.git"
|
|
14
|
-
},
|
|
15
|
-
"main": "index.js",
|
|
16
|
-
"scripts": {
|
|
17
|
-
"build": "tsc && gulp build:icons",
|
|
18
|
-
"dev": "tsc --watch",
|
|
19
|
-
"format": "prettier nodes credentials --write",
|
|
20
|
-
"lint": "eslint nodes credentials package.json",
|
|
21
|
-
"lintfix": "eslint nodes credentials package.json --fix",
|
|
22
|
-
"prepublishOnly": "npm run build && npm run lint -s"
|
|
23
|
-
},
|
|
24
|
-
"files": [
|
|
25
|
-
"dist"
|
|
26
|
-
],
|
|
27
|
-
"n8n": {
|
|
28
|
-
"n8nNodesApiVersion": 1,
|
|
29
|
-
"credentials": [
|
|
30
|
-
"dist/credentials/GitHubCopilotApi.credentials.js",
|
|
31
|
-
"dist/credentials/GitHubCopilotOAuth2Api.credentials.js",
|
|
32
|
-
"dist/credentials/GitHubCopilotOAuth2Api.credentials.oauth.js"
|
|
33
|
-
],
|
|
34
|
-
"nodes": [
|
|
35
|
-
"dist/nodes/GitHubCopilot/GitHubCopilot.node.js",
|
|
36
|
-
"dist/nodes/GitHubCopilotChatAPI/GitHubCopilotChatAPI.node.js",
|
|
37
|
-
"dist/nodes/GitHubCopilotChatModel/GitHubCopilotChatModel.node.js",
|
|
38
|
-
"dist/nodes/
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"ai",
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
"
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
"
|
|
62
|
-
|
|
63
|
-
"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
"@
|
|
68
|
-
"@typescript-eslint/
|
|
69
|
-
"eslint": "^
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
|
|
74
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "n8n-nodes-github-copilot",
|
|
3
|
+
"version": "3.28.0",
|
|
4
|
+
"description": "n8n community node for GitHub Copilot with CLI integration, Chat API access, and AI Chat Model for workflows - access GPT-5, Claude, Gemini and more using your Copilot subscription",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://github.com/sufficit/n8n-nodes-github-copilot",
|
|
7
|
+
"author": {
|
|
8
|
+
"name": "Sufficit",
|
|
9
|
+
"email": "development@sufficit.com.br"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://github.com/sufficit/n8n-nodes-github-copilot.git"
|
|
14
|
+
},
|
|
15
|
+
"main": "index.js",
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc && gulp build:icons",
|
|
18
|
+
"dev": "tsc --watch",
|
|
19
|
+
"format": "prettier nodes credentials --write",
|
|
20
|
+
"lint": "eslint nodes credentials package.json",
|
|
21
|
+
"lintfix": "eslint nodes credentials package.json --fix",
|
|
22
|
+
"prepublishOnly": "npm run build && npm run lint -s"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"n8n": {
|
|
28
|
+
"n8nNodesApiVersion": 1,
|
|
29
|
+
"credentials": [
|
|
30
|
+
"dist/credentials/GitHubCopilotApi.credentials.js",
|
|
31
|
+
"dist/credentials/GitHubCopilotOAuth2Api.credentials.js",
|
|
32
|
+
"dist/credentials/GitHubCopilotOAuth2Api.credentials.oauth.js"
|
|
33
|
+
],
|
|
34
|
+
"nodes": [
|
|
35
|
+
"dist/nodes/GitHubCopilot/GitHubCopilot.node.js",
|
|
36
|
+
"dist/nodes/GitHubCopilotChatAPI/GitHubCopilotChatAPI.node.js",
|
|
37
|
+
"dist/nodes/GitHubCopilotChatModel/GitHubCopilotChatModel.node.js",
|
|
38
|
+
"dist/nodes/GitHubCopilotOpenAI/GitHubCopilotOpenAI.node.js",
|
|
39
|
+
"dist/nodes/GitHubCopilotTest/GitHubCopilotTest.node.js"
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"keywords": [
|
|
43
|
+
"n8n-community-node-package",
|
|
44
|
+
"github",
|
|
45
|
+
"copilot",
|
|
46
|
+
"n8n-ai-agent",
|
|
47
|
+
"ai",
|
|
48
|
+
"gpt-5",
|
|
49
|
+
"claude",
|
|
50
|
+
"gemini",
|
|
51
|
+
"chat-completion",
|
|
52
|
+
"image-analysis",
|
|
53
|
+
"audio-transcription",
|
|
54
|
+
"code-generation",
|
|
55
|
+
"automation"
|
|
56
|
+
],
|
|
57
|
+
"engines": {
|
|
58
|
+
"node": ">=16.10",
|
|
59
|
+
"pnpm": ">=7.1"
|
|
60
|
+
},
|
|
61
|
+
"packageManager": "pnpm@7.1.0",
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"@langchain/openai": "^0.6.12",
|
|
64
|
+
"n8n-workflow": "*"
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@types/node": "^18.16.16",
|
|
68
|
+
"@typescript-eslint/eslint-plugin": "^5.45.0",
|
|
69
|
+
"@typescript-eslint/parser": "^5.45.0",
|
|
70
|
+
"eslint": "^8.28.0",
|
|
71
|
+
"gulp": "^4.0.2",
|
|
72
|
+
"prettier": "^2.7.1",
|
|
73
|
+
"typescript": "^5.9.2"
|
|
74
|
+
}
|
|
75
|
+
}
|