Skip to content

Commit db0872b

Browse files
committed
feat: enhance provider detection and error handling in LangChain integration
1 parent 1a3764e commit db0872b

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

src/adapters/langchain.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,15 @@ interface ProviderInfo {
1313
envVar: string;
1414
}
1515

16-
function detectProvider(model: string): ProviderInfo {
16+
/** Supported providers. Returns null for any unsupported model. */
17+
function detectProvider(model: string): ProviderInfo | null {
1718
const m = model.toLowerCase();
18-
if (m.startsWith('claude')) return { provider: 'anthropic', pipPackage: 'langchain-anthropic', envVar: 'ANTHROPIC_API_KEY' };
19-
if (m.startsWith('gemini')) return { provider: 'google_genai', pipPackage: 'langchain-google-genai', envVar: 'GOOGLE_API_KEY' };
20-
if (m.startsWith('grok')) return { provider: 'xai', pipPackage: 'langchain-xai', envVar: 'XAI_API_KEY' };
21-
if (m.startsWith('mistral')) return { provider: 'mistralai', pipPackage: 'langchain-mistralai', envVar: 'MISTRAL_API_KEY' };
22-
if (m.startsWith('deepseek')) return { provider: 'deepseek', pipPackage: 'langchain-deepseek', envVar: 'DEEPSEEK_API_KEY' };
23-
if (m.startsWith('command')) return { provider: 'cohere', pipPackage: 'langchain-cohere', envVar: 'COHERE_API_KEY' };
24-
// Default: OpenAI (covers gpt-*, o1-*, o3-*, etc.)
25-
return { provider: 'openai', pipPackage: 'langchain-openai', envVar: 'OPENAI_API_KEY' };
19+
// Anthropic — claude-*
20+
if (m.startsWith('claude')) return { provider: 'anthropic', pipPackage: 'langchain-anthropic', envVar: 'ANTHROPIC_API_KEY' };
21+
// OpenAI — gpt-*, o1-*, o2-*, o3-*, o4-*
22+
if (m.startsWith('gpt') || /^o\d/.test(m)) return { provider: 'openai', pipPackage: 'langchain-openai', envVar: 'OPENAI_API_KEY' };
23+
// Unsupported model
24+
return null;
2625
}
2726

2827
// Make detectProvider available for tests
@@ -52,11 +51,23 @@ export function exportToLangChain(dir: string): string {
5251

5352
// Collect all providers needed (main + sub-agents)
5453
const mainProvider = detectProvider(model);
54+
if (!mainProvider) {
55+
throw new Error(
56+
`Model "${model}" is not supported by the LangChain adapter.\n` +
57+
'gitagent with LangChain currently supports OpenAI (gpt-*, o1-*, o3-*, …) and Anthropic (claude-*) only.'
58+
);
59+
}
5560
const allPipPackages = new Set<string>([mainProvider.pipPackage]);
5661
const allEnvVars = new Set<string>([mainProvider.envVar]);
5762

5863
for (const sub of subAgents) {
5964
const subProv = detectProvider(sub.model ?? model);
65+
if (!subProv) {
66+
throw new Error(
67+
`Sub-agent model "${sub.model ?? model}" is not supported by the LangChain adapter.\n` +
68+
'gitagent with LangChain currently supports OpenAI (gpt-*, o1-*, o3-*, …) and Anthropic (claude-*) only.'
69+
);
70+
}
6071
allPipPackages.add(subProv.pipPackage);
6172
allEnvVars.add(subProv.envVar);
6273
}

src/runners/langchain.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ export function runWithLangChain(agentDir: string, _manifest: AgentManifest, opt
3939
const model = _manifest.model?.preferred ?? 'gpt-4o';
4040
const providerInfo = detectProvider(model);
4141

42+
// Unsupported model — tell the user clearly
43+
if (!providerInfo) {
44+
error(`Model "${model}" is not supported by the LangChain adapter.`);
45+
info('gitagent with LangChain currently supports:');
46+
info(' • OpenAI — gpt-4o, gpt-4, o1-mini, o3-mini, …');
47+
info(' • Anthropic — claude-3-5-sonnet, claude-3-opus, …');
48+
process.exit(1);
49+
}
50+
4251
// Check the appropriate API key env var
4352
if (!process.env[providerInfo.envVar]) {
4453
error(`${providerInfo.envVar} environment variable is not set`);

0 commit comments

Comments
 (0)