File size: 4,484 Bytes
88c4c60 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | import { NextResponse } from "next/server";
import { getProviderConnections } from "@/models";
import {
FREE_PROVIDERS,
OAUTH_PROVIDERS,
APIKEY_PROVIDERS,
OPENAI_COMPATIBLE_PREFIX,
ANTHROPIC_COMPATIBLE_PREFIX,
} from "@/shared/constants/providers";
import { testSingleConnection } from "../[id]/test/testUtils.js";
function getAuthGroup(providerId, connection = null) {
// Prioritize authType from connection if available
if (connection?.authType) {
if (connection.authType === "oauth") {
// Check if it's a free provider
if (FREE_PROVIDERS[providerId]) return "free";
return "oauth";
}
return connection.authType;
}
// Fallback to constants
if (FREE_PROVIDERS[providerId]) return "free";
if (OAUTH_PROVIDERS[providerId]) return "oauth";
if (APIKEY_PROVIDERS[providerId]) return "apikey";
if (
typeof providerId === "string" &&
(providerId.startsWith(OPENAI_COMPATIBLE_PREFIX) || providerId.startsWith(ANTHROPIC_COMPATIBLE_PREFIX))
)
return "compatible";
return "apikey";
}
function isCompatibleProvider(providerId) {
return (
typeof providerId === "string" &&
(providerId.startsWith(OPENAI_COMPATIBLE_PREFIX) || providerId.startsWith(ANTHROPIC_COMPATIBLE_PREFIX))
);
}
// POST /api/providers/test-batch - Test multiple connections by group
export async function POST(request) {
try {
const body = await request.json();
const { mode, providerId } = body;
if (!mode) {
return NextResponse.json({ error: "mode is required" }, { status: 400 });
}
const allConnections = await getProviderConnections({ isActive: true });
let connectionsToTest = [];
if (mode === "provider" && providerId) {
connectionsToTest = allConnections.filter((c) => c.provider === providerId);
} else if (mode === "oauth") {
connectionsToTest = allConnections.filter((c) => getAuthGroup(c.provider, c) === "oauth");
} else if (mode === "free") {
connectionsToTest = allConnections.filter((c) => getAuthGroup(c.provider, c) === "free");
} else if (mode === "apikey") {
connectionsToTest = allConnections.filter((c) => getAuthGroup(c.provider, c) === "apikey");
} else if (mode === "compatible") {
connectionsToTest = allConnections.filter((c) => isCompatibleProvider(c.provider));
} else if (mode === "all") {
connectionsToTest = allConnections;
} else {
return NextResponse.json(
{ error: "Invalid mode. Use: provider, oauth, free, apikey, compatible, all" },
{ status: 400 }
);
}
if (connectionsToTest.length === 0) {
return NextResponse.json({
mode,
providerId: providerId || null,
results: [],
summary: { total: 0, passed: 0, failed: 0 },
testedAt: new Date().toISOString(),
});
}
const results = [];
for (const conn of connectionsToTest) {
try {
const data = await testSingleConnection(conn.id);
results.push({
provider: conn.provider,
connectionId: conn.id,
connectionName: conn.name || conn.email || conn.provider,
authType: conn.authType || getAuthGroup(conn.provider, conn),
valid: data.valid,
latencyMs: data.latencyMs || 0,
error: data.error || null,
diagnosis: data.diagnosis || null,
statusCode: data.statusCode || null,
testedAt: data.testedAt || new Date().toISOString(),
});
} catch (error) {
results.push({
provider: conn.provider,
connectionId: conn.id,
connectionName: conn.name || conn.email || conn.provider,
authType: conn.authType || getAuthGroup(conn.provider, conn),
valid: false,
latencyMs: 0,
error: error.message,
diagnosis: { type: "network_error", source: "local", code: null, message: error.message },
statusCode: null,
testedAt: new Date().toISOString(),
});
}
}
return NextResponse.json({
mode,
providerId: providerId || null,
results,
testedAt: new Date().toISOString(),
summary: {
total: results.length,
passed: results.filter((r) => r.valid).length,
failed: results.filter((r) => !r.valid).length,
},
});
} catch (error) {
console.log("Error in batch test:", error);
return NextResponse.json({ error: "Batch test failed" }, { status: 500 });
}
}
|