Skip to content

Commit a67e120

Browse files
authored
fix LiteLLM model issue (#68)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * LiteLLM provider no longer requires an API key (like BrowserOperator), reducing spurious "API key not configured" errors. * Model resolution now falls back intelligently (mini → main/model; nano → mini → main/model) and updates context to reflect actual resolved models. * Error messages clarified for missing model fallbacks. * **New Features** * Schema extraction results can include optional metadata for downstream use. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
1 parent 2af0cb8 commit a67e120

File tree

7 files changed

+36
-24
lines changed

7 files changed

+36
-24
lines changed

front_end/panels/ai_chat/agent_framework/ConfigurableAgentTool.ts

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -460,9 +460,10 @@ export class ConfigurableAgentTool implements Tool<ConfigurableAgentArgs, Config
460460
const apiKey = callCtx.apiKey;
461461
const provider = callCtx.provider;
462462

463-
// Check if this provider requires an API key
464-
// BrowserOperator doesn't require an API key (endpoint is hardcoded)
465-
const requiresApiKey = provider !== 'browseroperator';
463+
// Check if API key is required based on provider
464+
// LiteLLM and BrowserOperator have optional API keys
465+
// Other providers (OpenAI, Groq, OpenRouter) require API keys
466+
const requiresApiKey = provider !== 'litellm' && provider !== 'browseroperator';
466467

467468
if (requiresApiKey && !apiKey) {
468469
const errorResult = this.createErrorResult(`API key not configured for ${this.name}`, [], 'error');
@@ -499,15 +500,17 @@ export class ConfigurableAgentTool implements Tool<ConfigurableAgentArgs, Config
499500
// Resolve model name from context or configuration
500501
let modelName: string;
501502
if (this.config.modelName === MODEL_SENTINELS.USE_MINI) {
502-
if (!callCtx.miniModel) {
503-
throw new Error(`Mini model not provided in context for agent '${this.name}'. Ensure context includes miniModel.`);
503+
// Fall back to main model if mini model is not configured
504+
modelName = callCtx.miniModel || callCtx.mainModel || callCtx.model || '';
505+
if (!modelName) {
506+
throw new Error(`Mini model not provided in context for agent '${this.name}'. Ensure context includes miniModel or mainModel.`);
504507
}
505-
modelName = callCtx.miniModel;
506508
} else if (this.config.modelName === MODEL_SENTINELS.USE_NANO) {
507-
if (!callCtx.nanoModel) {
508-
throw new Error(`Nano model not provided in context for agent '${this.name}'. Ensure context includes nanoModel.`);
509+
// Fall back through nano -> mini -> main model chain
510+
modelName = callCtx.nanoModel || callCtx.miniModel || callCtx.mainModel || callCtx.model || '';
511+
if (!modelName) {
512+
throw new Error(`Nano model not provided in context for agent '${this.name}'. Ensure context includes nanoModel, miniModel, or mainModel.`);
509513
}
510-
modelName = callCtx.nanoModel;
511514
} else if (typeof this.config.modelName === 'function') {
512515
modelName = this.config.modelName();
513516
} else if (this.config.modelName) {
@@ -525,16 +528,25 @@ export class ConfigurableAgentTool implements Tool<ConfigurableAgentArgs, Config
525528
if (callCtx.model && !this.config.modelName) {
526529
modelName = callCtx.model;
527530
}
528-
531+
532+
// Update context with resolved fallback models for tools to use
533+
// This ensures tools that check ctx.miniModel or ctx.nanoModel get the fallback
534+
if (this.config.modelName === MODEL_SENTINELS.USE_MINI && !callCtx.miniModel) {
535+
callCtx.miniModel = modelName; // Use the resolved fallback
536+
}
537+
if (this.config.modelName === MODEL_SENTINELS.USE_NANO && !callCtx.nanoModel) {
538+
callCtx.nanoModel = modelName; // Use the resolved fallback
539+
}
540+
529541
// Validate required context
530542
if (!callCtx.provider) {
531543
throw new Error(`Provider not provided in context for agent '${this.name}'. Ensure context includes provider.`);
532544
}
533-
545+
534546
const temperature = this.config.temperature ?? 0;
535547
const systemPrompt = this.config.systemPrompt;
536548
const tools = this.getToolInstances();
537-
549+
538550
// Prepare initial messages
539551
const internalMessages = this.prepareInitialMessages(args);
540552
const runnerConfig: AgentRunnerConfig = {

front_end/panels/ai_chat/tools/CombinedExtractionTool.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ export class CombinedExtractionTool implements Tool<CombinedExtractionArgs, Comb
8787
// Get provider from context
8888
const provider = ctx?.provider;
8989

90-
// BrowserOperator doesn't require API key
91-
const requiresApiKey = provider !== 'browseroperator';
90+
// LiteLLM and BrowserOperator have optional API keys
91+
const requiresApiKey = provider !== 'litellm' && provider !== 'browseroperator';
9292

9393
if (requiresApiKey && !apiKey) {
9494
return {

front_end/panels/ai_chat/tools/FullPageAccessibilityTreeToMarkdownTool.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ export class FullPageAccessibilityTreeToMarkdownTool implements Tool<Record<stri
5555
const provider = ctx.provider;
5656
const model = ctx.nanoModel;
5757

58-
// BrowserOperator doesn't require API key
59-
const requiresApiKey = provider !== 'browseroperator';
58+
// LiteLLM and BrowserOperator have optional API keys
59+
const requiresApiKey = provider !== 'litellm' && provider !== 'browseroperator';
6060

6161
if (requiresApiKey && !apiKey) {
6262
return { error: 'API key not configured.' };

front_end/panels/ai_chat/tools/HTMLToMarkdownTool.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ export class HTMLToMarkdownTool implements Tool<HTMLToMarkdownArgs, HTMLToMarkdo
6767
// Get provider from context
6868
const provider = ctx?.provider;
6969

70-
// BrowserOperator doesn't require API key
71-
const requiresApiKey = provider !== 'browseroperator';
70+
// LiteLLM and BrowserOperator have optional API keys
71+
const requiresApiKey = provider !== 'litellm' && provider !== 'browseroperator';
7272

7373
if (requiresApiKey && !apiKey) {
7474
return {

front_end/panels/ai_chat/tools/SchemaBasedExtractorTool.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ Schema Examples:
108108
// Get provider from context
109109
const provider = ctx?.provider;
110110

111-
// BrowserOperator doesn't require API key
112-
const requiresApiKey = provider !== 'browseroperator';
111+
// LiteLLM and BrowserOperator have optional API keys
112+
const requiresApiKey = provider !== 'litellm' && provider !== 'browseroperator';
113113

114114
if (requiresApiKey && !apiKey) {
115115
return {

front_end/panels/ai_chat/tools/StreamlinedSchemaExtractorTool.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ export class StreamlinedSchemaExtractorTool implements Tool<StreamlinedSchemaExt
113113
// Get provider from context
114114
const provider = ctx?.provider;
115115

116-
// BrowserOperator doesn't require API key
117-
const requiresApiKey = provider !== 'browseroperator';
116+
// LiteLLM and BrowserOperator have optional API keys
117+
const requiresApiKey = provider !== 'litellm' && provider !== 'browseroperator';
118118

119119
if (requiresApiKey && !apiKey) {
120120
return {

front_end/panels/ai_chat/tools/Tools.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2967,8 +2967,8 @@ Important guidelines:
29672967
return { error: 'Missing LLM context (provider/model) for ObjectiveDrivenActionTool' };
29682968
}
29692969

2970-
// BrowserOperator doesn't require API key
2971-
const requiresApiKey = providerForAction !== 'browseroperator';
2970+
// LiteLLM and BrowserOperator have optional API keys
2971+
const requiresApiKey = providerForAction !== 'litellm' && providerForAction !== 'browseroperator';
29722972

29732973
if (requiresApiKey && !apiKey) {return { error: 'API key not configured.' };}
29742974
if (typeof objective !== 'string' || objective.trim() === '') {

0 commit comments

Comments
 (0)