This commit is contained in:
Adam Cohen Hillel 2025-04-15 19:07:31 +01:00
parent e51b1076a7
commit f0c3c52cf4
6 changed files with 79 additions and 13 deletions

View File

@ -153,7 +153,7 @@ async def run_agent(thread_id: str, project_id: str, stream: bool = True, thread
stream=stream,
llm_model=model_name,
llm_temperature=0,
llm_max_tokens=64000,
llm_max_tokens=128000,
tool_choice="auto",
max_xml_tool_calls=1,
temporary_message=temporary_message,

View File

@ -121,11 +121,12 @@ def prepare_params(
logger.debug(f"Added {len(tools)} tools to API parameters")
# # Add Claude-specific headers
# if "claude" in model_name.lower() or "anthropic" in model_name.lower():
# params["extra_headers"] = {
if "claude" in model_name.lower() or "anthropic" in model_name.lower():
params["extra_headers"] = {
# "anthropic-beta": "max-tokens-3-5-sonnet-2024-07-15"
# }
# logger.debug("Added Claude-specific headers")
"anthropic-beta": "output-128k-2025-02-19"
}
logger.debug("Added Claude-specific headers")
# Add OpenRouter-specific parameters
if model_name.startswith("openrouter/"):

View File

@ -4,9 +4,9 @@ from services.supabase import DBConnection
# Define subscription tiers and their monthly hour limits
SUBSCRIPTION_TIERS = {
'price_1RDQbOG6l1KZGqIrgrYzMbnL': {'name': 'free', 'hours': 1},
'price_1RC2PYG6l1KZGqIrpbzFB9Lp': {'name': 'base', 'hours': 1},
'price_1RDQWqG6l1KZGqIrChli4Ys4': {'name': 'extra', 'hours': 1}
'price_1RDQbOG6l1KZGqIrgrYzMbnL': {'name': 'free', 'hours': 100},
'price_1RC2PYG6l1KZGqIrpbzFB9Lp': {'name': 'base', 'hours': 100},
'price_1RDQWqG6l1KZGqIrChli4Ys4': {'name': 'extra', 'hours': 100}
}
async def get_account_subscription(client, account_id: str) -> Optional[Dict]:

View File

@ -16,12 +16,12 @@ export const SUBSCRIPTION_PLANS = {
const PLAN_DETAILS = {
[SUBSCRIPTION_PLANS.FREE]: {
name: 'Free',
limit: 1,
limit: 100,
price: 0
},
[SUBSCRIPTION_PLANS.BASIC]: {
name: 'Basic',
limit: 10,
limit: 100,
price: 10
},
[SUBSCRIPTION_PLANS.PRO]: {

View File

@ -4,7 +4,7 @@ import React from 'react';
import { ParsedTag, ToolComponentProps } from '@/lib/types/tool-calls';
import {
File, FileText, Terminal, FolderPlus, Folder, Code, Search as SearchIcon,
Bell, Replace, Plus, Minus, Globe
Bell, Replace, Plus, Minus, Globe, Search
} from 'lucide-react';
import { cn } from '@/lib/utils';
import { diffLines } from 'diff';
@ -521,6 +521,65 @@ export const BrowserNavigateTool: React.FC<ToolComponentProps> = ({ tag, mode })
);
};
/**
* Web Search Tool Component
*/
export const WebSearchTool: React.FC<ToolComponentProps> = ({ tag, mode }) => {
const query = tag.attributes.query || '';
const isRunning = tag.status === 'running';
if (mode === 'compact') {
return (
<CompactToolDisplay
icon={<Search className="h-4 w-4 mr-2" />}
name={isRunning ? "Web search in progress..." : "Web search complete"}
input={query}
isRunning={isRunning}
/>
);
}
const results = tag.result?.output ? JSON.parse(tag.result.output) : [];
return (
<div className="border rounded-lg overflow-hidden border-subtle dark:border-white/10">
<div className="flex items-center px-2 py-1 text-xs font-medium border-b border-subtle dark:border-white/10 bg-background-secondary dark:bg-background-secondary text-foreground">
<Search className="h-4 w-4 mr-2" />
<div className="flex-1">Web Search: {query}</div>
{isRunning && (
<div className="flex items-center gap-2">
<span className="text-amber-500">Searching</span>
<div className="h-2 w-2 rounded-full bg-amber-500 animate-pulse"></div>
</div>
)}
</div>
<div className="p-3 bg-card-bg dark:bg-background-secondary text-foreground">
{results.length > 0 ? (
<div className="space-y-3">
{results.map((result: any, index: number) => (
<div key={index} className="text-sm">
<a href={result.URL} target="_blank" rel="noopener noreferrer" className="font-medium text-blue-600 hover:underline">
{result.Title}
</a>
<div className="text-xs text-muted-foreground mt-1">
{result.URL}
{result['Published Date'] && (
<span className="ml-2">
({new Date(result['Published Date']).toLocaleDateString()})
</span>
)}
</div>
</div>
))}
</div>
) : (
<div className="text-sm text-muted-foreground">No results found</div>
)}
</div>
</div>
);
};
// Tool component registry
export const ToolComponentRegistry: Record<string, React.FC<ToolComponentProps>> = {
'create-file': CreateFileTool,
@ -547,10 +606,15 @@ export const ToolComponentRegistry: Record<string, React.FC<ToolComponentProps>>
'browser-get-dropdown-options': BrowserNavigateTool,
'browser-select-dropdown-option': BrowserNavigateTool,
'browser-drag-drop': BrowserNavigateTool,
'web-search': WebSearchTool,
};
// Helper function to get the appropriate component for a tag
export function getComponentForTag(tag: ParsedTag): React.FC<ToolComponentProps> {
console.log("getComponentForTag", tag);
if (!tag || !tag?.tagName) {
console.warn(`No tag name for tag: ${tag}`);
}
if (!ToolComponentRegistry[tag.tagName]) {
console.warn(`No component registered for tag type: ${tag.tagName}`);
}

View File

@ -53,7 +53,8 @@ export const SUPPORTED_XML_TAGS = [
'browser-close-tab',
'browser-get-dropdown-options',
'browser-select-dropdown-option',
'browser-drag-drop'
'browser-drag-drop',
'web-search'
];
// Tool status labels