@@ -662,10 +662,12 @@ async function main() {
662662 logger.step(1, "Parsing inputs from action.yml");
663663 const llmProviderInput = core.getInput("llm_provider") || "groq";
664664 const llmApiKeyInput = core.getInput("llm_api_key");
665+ const llmProviderUrlInput = core.getInput("llm_provider_url");
665666 const config = {
666667 githubToken: core.getInput("github_token"),
667668 llmProvider: llmProviderInput,
668669 llmApiKey: llmApiKeyInput,
670+ llmProviderUrl: llmProviderUrlInput || undefined,
669671 reviewerModels: (core.getInput("reviewer_models") || DEFAULT_REVIEWER_MODELS.join(","))
670672 .split(",")
671673 .map((m) => m.trim()),
@@ -685,6 +687,9 @@ async function main() {
685687 }
686688 logger.success("✓ Inputs validated");
687689 logger.info(` - LLM Provider: ${config.llmProvider}`);
690+ if (config.llmProviderUrl) {
691+ logger.info(` - LLM Provider URL: ${config.llmProviderUrl}`);
692+ }
688693 logger.info(` - Reviewer Models: ${config.reviewerModels.join(", ")}`);
689694 logger.info(` - Judge Model: ${config.judgeModel}`);
690695 logger.info(` - Max Consensus Rounds: ${config.maxConsensusRounds}`);
@@ -804,6 +809,7 @@ async function main() {
804809 maxConsensusRounds: config.maxConsensusRounds,
805810 debug: config.debug,
806811 provider: config.llmProvider,
812+ providerUrl: config.llmProviderUrl,
807813 });
808814 const reviewResult = await orchestrator.runConsensusReview(llmContext);
809815 logger.success("✓ Consensus review complete");
@@ -964,7 +970,7 @@ class LLMClient {
964970 this.baseUrl =
965971 options.baseUrl ||
966972 (this.provider === "groq"
967- ? "https://api.groq.com/v1/models"
973+ ? "https://api.groq.com/openai/ v1/models"
968974 : "https://generativelanguage.googleapis.com/v1beta/models");
969975 }
970976 /**
@@ -1418,12 +1424,49 @@ RESPOND ONLY WITH THE JSON OBJECT. NO OTHER TEXT.`;
14181424 return this.availableGenerateContentModels;
14191425 }
14201426 if (this.provider === "groq") {
1421- const availableModels = new Set([
1422- ...FALLBACK_MODELS.groq.reviewer,
1423- ...FALLBACK_MODELS.groq.judge,
1424- ]);
1425- this.availableGenerateContentModels = availableModels;
1426- return availableModels;
1427+ const availableModels = new Set();
1428+ const url = new URL(this.baseUrl);
1429+ try {
1430+ const response = await (0, node_fetch_1.default)(url.toString(), {
1431+ method: "GET",
1432+ headers: {
1433+ "Content-Type": "application/json",
1434+ Authorization: `Bearer ${this.apiKey}`,
1435+ },
1436+ });
1437+ if (!response.ok) {
1438+ const errorData = await response.json().catch(() => ({}));
1439+ throw new LLMApiError(response.status, `Groq model list error: ${response.status} - ${errorData.error?.message || "Unknown error"}`);
1440+ }
1441+ const data = (await response.json());
1442+ const models = Array.isArray(data.data)
1443+ ? data.data
1444+ : Array.isArray(data.models)
1445+ ? data.models
1446+ : [];
1447+ for (const model of models) {
1448+ const modelName = this.normalizeModelName(String(model.id || model.name || model.model || ""));
1449+ if (modelName) {
1450+ availableModels.add(modelName);
1451+ }
1452+ }
1453+ if (availableModels.size === 0) {
1454+ this.logger.warn("Could not parse Groq model list response. Falling back to known Groq models.");
1455+ FALLBACK_MODELS.groq.reviewer.forEach((model) => availableModels.add(model));
1456+ FALLBACK_MODELS.groq.judge.forEach((model) => availableModels.add(model));
1457+ }
1458+ this.availableGenerateContentModels = availableModels;
1459+ return availableModels;
1460+ }
1461+ catch (error) {
1462+ this.logger.warn(`Could not fetch Groq model list from ${url.toString()}: ${error instanceof Error ? error.message : String(error)}`);
1463+ const fallbackModels = new Set([
1464+ ...FALLBACK_MODELS.groq.reviewer,
1465+ ...FALLBACK_MODELS.groq.judge,
1466+ ]);
1467+ this.availableGenerateContentModels = fallbackModels;
1468+ return fallbackModels;
1469+ }
14271470 }
14281471 const availableModels = new Set();
14291472 let pageToken;
@@ -2041,6 +2084,7 @@ class ReviewOrchestrator {
20412084 this.llmClient = new llm_client_js_1.LLMClient(apiKey, {
20422085 debug: options.debug,
20432086 provider: options.provider,
2087+ baseUrl: options.providerUrl,
20442088 });
20452089 this.logger = new logger_js_1.Logger(options.debug);
20462090 this.reviewerModels = options.reviewerModels;
0 commit comments