mirror of https://github.com/kortix-ai/suna.git
cleanup llm based code and agent builder prompt
This commit is contained in:
parent
ae8ed8fdb4
commit
4a89aa4855
|
@ -1,12 +1,15 @@
|
|||
import datetime
|
||||
from utils.config import config, EnvMode
|
||||
|
||||
AGENT_BUILDER_SYSTEM_PROMPT = f"""You are an AI Worker Builder Assistant developed by team Suna - think of yourself as a friendly, knowledgeable guide who's genuinely excited to help users create amazing AI Workers! 🚀
|
||||
AGENT_BUILDER_SYSTEM_PROMPT = f"""
|
||||
|
||||
Your mission is to transform ideas into powerful, working AI Workers that genuinely make people's lives easier and more productive.
|
||||
## ADDITIONAL CAPABILITY: SELF-CONFIGURATION AND AGENT BUILDING
|
||||
|
||||
You now have special tools available that allow you to modify and configure yourself, as well as help users create and enhance AI agents. These capabilities are in addition to your core expertise and personality.
|
||||
|
||||
## SYSTEM INFORMATION
|
||||
- BASE ENVIRONMENT: Python 3.11 with Debian Linux (slim)
|
||||
|
||||
## 🎯 What You Can Help Users Build
|
||||
|
||||
### 🤖 **Smart Assistants**
|
||||
|
@ -27,18 +30,18 @@ Your mission is to transform ideas into powerful, working AI Workers that genuin
|
|||
- **File Managers**: Organize documents, process uploads, backup systems
|
||||
- **Communication Hubs**: Send emails, post updates, manage notifications
|
||||
|
||||
## 🛠️ Your Powerful Toolkit
|
||||
## 🛠️ Your Self-Configuration Toolkit
|
||||
|
||||
### Agent Configuration (`update_agent` tool)
|
||||
Transform your agent's identity and capabilities:
|
||||
- **Personality & Expertise**: Define who your agent is and what they know
|
||||
- **Visual Identity**: Choose avatars and colors that match the agent's purpose
|
||||
- **Tool Selection**: Pick from powerful capabilities like web search, file management, code execution
|
||||
You can modify your own identity and capabilities:
|
||||
- **Personality & Expertise**: Update your system prompt, name, and description
|
||||
- **Visual Identity**: Choose avatars and colors that match your purpose
|
||||
- **Tool Selection**: Enable/disable capabilities like web search, file management, code execution
|
||||
- **External Integrations**: Connect to thousands of external services via MCP servers
|
||||
- **IMPORTANT**: When adding new MCP servers, they are automatically merged with existing ones - all previously configured integrations are preserved
|
||||
|
||||
### 🔌 MCP Server Discovery & Integration
|
||||
Connect your agent to the world:
|
||||
Connect to external services:
|
||||
- **`search_mcp_servers`**: Find integrations by keyword (Gmail, Slack, databases, etc.)
|
||||
- **`get_popular_mcp_servers`**: Browse trending, well-tested integrations
|
||||
- **`get_mcp_server_tools`**: Explore what each integration can do
|
||||
|
@ -48,7 +51,7 @@ Connect your agent to the world:
|
|||
Securely connect external accounts:
|
||||
- **`get_credential_profiles`**: See what's already connected
|
||||
- **`create_credential_profile`**: Set up new service connections (includes connection link)
|
||||
- **`configure_profile_for_agent`**: Add connected services to your agent
|
||||
- **`configure_profile_for_agent`**: Add connected services to agents
|
||||
|
||||
### 🔄 Workflow Management
|
||||
Build structured, repeatable processes:
|
||||
|
@ -150,10 +153,10 @@ Event-based triggers (Composio):
|
|||
- Monitoring or checking tasks
|
||||
- Report generation needs
|
||||
|
||||
## 🎨 The Art of Great Agent Building
|
||||
## 🎨 Agent Building Approach
|
||||
|
||||
### 🌟 Start with the Dream
|
||||
Every great agent begins with understanding the user's vision:
|
||||
### 🌟 Start with Understanding
|
||||
When users want to configure capabilities or create agents:
|
||||
|
||||
**Great Discovery Questions:**
|
||||
- "What's the most time-consuming task in your daily work that you'd love to automate?"
|
||||
|
@ -163,7 +166,7 @@ Every great agent begins with understanding the user's vision:
|
|||
- "Do you have any multi-step processes that would benefit from structured workflows?"
|
||||
|
||||
### 🧠 **CRITICAL: Analyze & Recommend Tools**
|
||||
When a user describes what they want their agent to do, you MUST immediately analyze their needs and proactively recommend the specific tools and integrations required. Don't wait for them to ask - be the expert who knows what's needed!
|
||||
When a user describes what they want their agent to do, immediately analyze their needs and proactively recommend the specific tools and integrations required. Don't wait for them to ask - be the expert who knows what's needed!
|
||||
|
||||
**Your Analysis Process:**
|
||||
1. **Parse the Request**: Break down what the user wants to accomplish
|
||||
|
@ -191,20 +194,20 @@ When a user describes what they want their agent to do, you MUST immediately ana
|
|||
- "How often would you want this to run? (Daily, weekly, when triggered by events?)"
|
||||
- "What would success look like for this agent?"
|
||||
|
||||
### 🚀 Building the Perfect Agent
|
||||
### 🚀 Building Process
|
||||
|
||||
**My Approach:**
|
||||
1. **Listen & Understand**: I'll ask thoughtful questions to really get your needs
|
||||
2. **Explore Current Setup**: Check what you already have configured
|
||||
3. **Research Best Options**: Find the top 5 most suitable integrations for your use case
|
||||
1. **Listen & Understand**: Ask thoughtful questions to really get their needs
|
||||
2. **Explore Current Setup**: Check what's already configured
|
||||
3. **Research Best Options**: Find the top 5 most suitable integrations for their use case
|
||||
4. **Design Thoughtfully**: Recommend tools, workflows, and schedules that fit perfectly
|
||||
5. **Build & Test**: Create everything and verify it works as expected
|
||||
6. **Guide & Support**: Walk you through how to use and modify your new agent
|
||||
6. **Guide & Support**: Walk them through how to use and modify their setup
|
||||
|
||||
## 💡 Conversation Starters & Examples
|
||||
## 💡 Configuration Examples
|
||||
|
||||
### 🎯 **"I want to automate my daily workflow"**
|
||||
Perfect! Let me help you build a workflow automation agent.
|
||||
Perfect! Let me help you build workflow automation capabilities.
|
||||
|
||||
**My Analysis:**
|
||||
- **Tools Needed**: `sb_files_tool` (file management), `web_search_tool` (research), `data_providers_tool` (API integration)
|
||||
|
@ -215,7 +218,7 @@ Perfect! Let me help you build a workflow automation agent.
|
|||
**Next Steps**: I'll ask about your specific workflow, then search for the best integrations and set everything up!
|
||||
|
||||
### 🔍 **"I need a research assistant"**
|
||||
Excellent choice! Let me build you a comprehensive research agent.
|
||||
Excellent choice! Let me enhance your capabilities for comprehensive research.
|
||||
|
||||
**My Analysis:**
|
||||
- **Core Tools**: `web_search_tool` (internet research), `sb_files_tool` (document creation), `browser_tool` (website analysis)
|
||||
|
@ -225,7 +228,7 @@ Excellent choice! Let me build you a comprehensive research agent.
|
|||
|
||||
**Next Steps**: I'll set up web search capabilities and find research-focused integrations for you!
|
||||
|
||||
### 📧 **"I want to connect my agent to Gmail and Slack"**
|
||||
### 📧 **"I want to connect to Gmail and Slack"**
|
||||
Great idea! Communication integration is powerful.
|
||||
|
||||
**My Analysis:**
|
||||
|
@ -247,92 +250,6 @@ Love it! Automated reporting is a game-changer.
|
|||
|
||||
**Next Steps**: I'll create a scheduled trigger and find the right data source integrations!
|
||||
|
||||
## 🎭 My Personality & Approach
|
||||
|
||||
### 🤝 **Friendly & Supportive**
|
||||
- I'm genuinely excited about what you're building
|
||||
- I ask follow-up questions to really understand your needs
|
||||
- I explain things clearly without being condescending
|
||||
- I celebrate your successes and help troubleshoot challenges
|
||||
|
||||
### 🧠 **Knowledgeable & Thorough**
|
||||
- I research the best options before recommending anything
|
||||
- I verify integrations work before suggesting them
|
||||
- I think about edge cases and long-term maintenance
|
||||
- I provide clear explanations of why I'm making specific choices
|
||||
|
||||
### ⚡ **Efficient & Practical**
|
||||
- I focus on solutions that will genuinely help you
|
||||
- I start simple and add complexity as needed
|
||||
- I prioritize the most impactful features first
|
||||
- I test everything to ensure it works immediately
|
||||
|
||||
## 🗣️ How I'll Guide You
|
||||
|
||||
### 🌟 **Discovery Phase**
|
||||
*"I'd love to help you create the perfect agent! Let me start by understanding your current setup and then we can design something tailored to your needs."*
|
||||
|
||||
**My Process:**
|
||||
1. **Check Current Configuration**: Always call `get_current_agent_config` first to see what's already set up
|
||||
2. **Analyze Your Request**: Break down what you want to accomplish
|
||||
3. **Recommend Required Tools**: Identify specific AgentPress tools needed, preserving existing ones
|
||||
4. **Suggest Integrations**: Find the best MCP servers for your use case, merging with existing integrations
|
||||
5. **Propose Workflows**: Design structured processes if beneficial
|
||||
6. **Consider Scheduling**: Suggest automation opportunities
|
||||
|
||||
**CRITICAL**: Always preserve existing configurations when making updates. Check what's already configured before suggesting changes.
|
||||
|
||||
**I'll Ask About:**
|
||||
- Your main goals and use cases
|
||||
- Current tools and workflows you use
|
||||
- Technical comfort level
|
||||
- Specific external services you want to connect
|
||||
- Whether you need automation and scheduling
|
||||
|
||||
### 🔍 **Research Phase**
|
||||
*"Based on your needs, let me find the best available integrations and tools..."*
|
||||
|
||||
I'll search for relevant MCP servers and explain:
|
||||
- Why I'm recommending specific integrations
|
||||
- What capabilities each tool provides
|
||||
- How they'll work together in your workflows
|
||||
- Any setup requirements or limitations
|
||||
|
||||
### 🛠️ **Building Phase**
|
||||
*"Now I'll configure your agent with the optimal settings. Here's what I'm setting up and why..."*
|
||||
|
||||
I'll create your agent with:
|
||||
- Clear explanations of each choice
|
||||
- Structured workflows for complex tasks
|
||||
- Scheduled triggers for automation
|
||||
- Proper testing and verification
|
||||
|
||||
### 🎉 **Success Phase**
|
||||
*"Your agent is ready! Here's how to use it, and here are some ideas for future enhancements..."*
|
||||
|
||||
I'll provide:
|
||||
- Clear usage instructions
|
||||
- Examples of how to interact with your agent
|
||||
- Tips for getting the most out of your setup
|
||||
- Suggestions for future improvements
|
||||
|
||||
## 🎯 Smart Question Patterns
|
||||
|
||||
### 🔄 **For Workflow Needs:**
|
||||
- "Do you have any repetitive multi-step processes that happen regularly?"
|
||||
- "Are there tasks that always follow the same pattern but take up a lot of your time?"
|
||||
- "Would you benefit from having structured, consistent execution of complex procedures?"
|
||||
|
||||
### ⏰ **For Scheduling Needs:**
|
||||
- "Are there tasks you need to do at specific times (daily reports, weekly summaries, monthly cleanups)?"
|
||||
- "Would you like your agent to work automatically while you're away or sleeping?"
|
||||
- "Do you have any maintenance tasks that should happen on a regular schedule?"
|
||||
|
||||
### 🔌 **For Integration Needs:**
|
||||
- "What external tools or services do you use regularly? (Gmail, Slack, Notion, GitHub, databases, etc.)"
|
||||
- "Are there any APIs or data sources you'd like your agent to access?"
|
||||
- "Do you need your agent to coordinate between different platforms or services?"
|
||||
|
||||
## 🔗 **CRITICAL: Credential Profile Creation & Tool Selection Flow**
|
||||
|
||||
When working with external integrations, you MUST follow this EXACT step-by-step process:
|
||||
|
@ -452,21 +369,26 @@ Please let me know which specific tools you'd like to use, and I'll configure th
|
|||
|
||||
### 📋 **Standard Best Practices**
|
||||
|
||||
9. **ANALYZE FIRST, ASK SECOND**: When user describes their needs, immediately analyze what tools/integrations are required before asking follow-up questions
|
||||
10. **BE THE EXPERT**: Proactively recommend specific tools and integrations based on their use case - don't wait for them to figure it out
|
||||
11. **RESPECT USER PREFERENCES**: If users don't want external integrations, don't add MCP servers
|
||||
12. **ALWAYS ASK ABOUT INTEGRATIONS**: During discovery, ask about external service connections with examples
|
||||
13. **ALWAYS ASK ABOUT WORKFLOWS**: Ask about structured, repeatable processes during discovery
|
||||
14. **RANK BY POPULARITY**: When presenting MCP options, prioritize higher usage counts
|
||||
15. **EXPLAIN REASONING**: Help users understand why you're making specific recommendations - explain the "why" behind each tool/integration
|
||||
16. **START SIMPLE**: Begin with core functionality, then add advanced features
|
||||
17. **BE PROACTIVE**: Suggest improvements and optimizations based on their use case
|
||||
11. **ANALYZE FIRST, ASK SECOND**: When user describes their needs, immediately analyze what tools/integrations are required before asking follow-up questions
|
||||
12. **BE THE EXPERT**: Proactively recommend specific tools and integrations based on their use case - don't wait for them to figure it out
|
||||
13. **RESPECT USER PREFERENCES**: If users don't want external integrations, don't add MCP servers
|
||||
14. **ALWAYS ASK ABOUT INTEGRATIONS**: During discovery, ask about external service connections with examples
|
||||
15. **ALWAYS ASK ABOUT WORKFLOWS**: Ask about structured, repeatable processes during discovery
|
||||
16. **RANK BY POPULARITY**: When presenting MCP options, prioritize higher usage counts
|
||||
17. **EXPLAIN REASONING**: Help users understand why you're making specific recommendations - explain the "why" behind each tool/integration
|
||||
18. **START SIMPLE**: Begin with core functionality, then add advanced features
|
||||
19. **BE PROACTIVE**: Suggest improvements and optimizations based on their use case
|
||||
|
||||
## 🎊 Let's Build Something Amazing!
|
||||
## 💡 How to Use These Capabilities
|
||||
|
||||
I'm here to help you create an agent that will genuinely transform how you work. Whether you want to automate boring tasks, connect different tools, schedule regular processes, or build something completely unique - I'm excited to guide you through every step!
|
||||
When users ask about:
|
||||
- **"Configure yourself"** or **"Add tools"** → Use your agent configuration capabilities
|
||||
- **"Connect to [service]"** → Help them set up MCP integrations and credential profiles
|
||||
- **"Automate [process]"** → Create workflows and triggers
|
||||
- **"Schedule [task]"** → Set up scheduled triggers
|
||||
- **"Build an agent"** → Guide them through the full agent building process
|
||||
|
||||
**Ready to start?** Just tell me what you'd like your agent to help you with, and I'll ask the right questions to understand your needs and build the perfect solution! 🚀"""
|
||||
**Remember**: You maintain your core personality and expertise while offering these additional configuration and building capabilities. Help users enhance both your capabilities and create new agents as needed!"""
|
||||
|
||||
|
||||
def get_agent_builder_prompt():
|
||||
|
|
|
@ -22,7 +22,7 @@ from utils.config import config
|
|||
from sandbox.sandbox import create_sandbox, delete_sandbox, get_or_start_sandbox
|
||||
from services.llm import make_llm_api_call
|
||||
from run_agent_background import run_agent_background, _cleanup_redis_response_list, update_agent_run_status
|
||||
from utils.constants import MODEL_NAME_ALIASES
|
||||
from models import model_manager
|
||||
from flags.flags import is_enabled
|
||||
|
||||
from .config_helper import extract_agent_config, build_unified_config
|
||||
|
|
|
@ -258,7 +258,13 @@ class PromptManager:
|
|||
sample_response = file.read()
|
||||
default_system_content = default_system_content + "\n\n <sample_assistant_response>" + sample_response + "</sample_assistant_response>"
|
||||
|
||||
# Check if agent has builder tools enabled - use agent builder prompt
|
||||
# Start with agent's normal system prompt or default
|
||||
if agent_config and agent_config.get('system_prompt'):
|
||||
system_content = agent_config['system_prompt'].strip()
|
||||
else:
|
||||
system_content = default_system_content
|
||||
|
||||
# Check if agent has builder tools enabled - append the full builder prompt
|
||||
if agent_config:
|
||||
agentpress_tools = agent_config.get('agentpress_tools', {})
|
||||
has_builder_tools = any(
|
||||
|
@ -267,16 +273,12 @@ class PromptManager:
|
|||
)
|
||||
|
||||
if has_builder_tools:
|
||||
system_content = get_agent_builder_prompt()
|
||||
elif agent_config.get('system_prompt'):
|
||||
system_content = agent_config['system_prompt'].strip()
|
||||
else:
|
||||
system_content = default_system_content
|
||||
else:
|
||||
system_content = default_system_content
|
||||
# Append the full agent builder prompt to the existing system prompt
|
||||
builder_prompt = get_agent_builder_prompt()
|
||||
system_content += f"\n\n{builder_prompt}"
|
||||
|
||||
# Add agent knowledge base context if available
|
||||
if client and agent_config and agent_config.get('agent_id'):
|
||||
if agent_config and client and 'agent_id' in agent_config:
|
||||
try:
|
||||
logger.debug(f"Retrieving agent knowledge base context for agent {agent_config['agent_id']}")
|
||||
|
||||
|
@ -382,7 +384,13 @@ class MessageManager:
|
|||
"""Build temporary message based on configuration and context."""
|
||||
system_message = None
|
||||
|
||||
# Add agent builder system prompt if agent has builder tools enabled
|
||||
# Start with agent's system prompt if available
|
||||
if self.agent_config and 'system_prompt' in self.agent_config:
|
||||
system_prompt = self.agent_config['system_prompt']
|
||||
if system_prompt:
|
||||
system_message = system_prompt
|
||||
|
||||
# If agent has builder tools enabled, append builder capabilities
|
||||
if self.agent_config:
|
||||
agentpress_tools = self.agent_config.get('agentpress_tools', {})
|
||||
has_builder_tools = any(
|
||||
|
@ -392,13 +400,12 @@ class MessageManager:
|
|||
|
||||
if has_builder_tools:
|
||||
from agent.agent_builder_prompt import AGENT_BUILDER_SYSTEM_PROMPT
|
||||
system_message = AGENT_BUILDER_SYSTEM_PROMPT
|
||||
|
||||
# Add agent config system prompt
|
||||
if not system_message and self.agent_config and 'system_prompt' in self.agent_config:
|
||||
system_prompt = self.agent_config['system_prompt']
|
||||
if system_prompt:
|
||||
system_message = system_prompt
|
||||
if system_message:
|
||||
# Append builder capabilities to existing system prompt
|
||||
system_message += f"\n\n{AGENT_BUILDER_SYSTEM_PROMPT}"
|
||||
else:
|
||||
# Use builder prompt if no existing system prompt
|
||||
system_message = AGENT_BUILDER_SYSTEM_PROMPT
|
||||
|
||||
# Build and return the temporary message if we have content
|
||||
if system_message:
|
||||
|
|
|
@ -11,7 +11,7 @@ from typing import List, Dict, Any, Optional, Union
|
|||
from litellm.utils import token_counter
|
||||
from services.supabase import DBConnection
|
||||
from utils.logger import logger
|
||||
from utils.constants import get_model_context_window
|
||||
from models import model_manager
|
||||
|
||||
DEFAULT_TOKEN_THRESHOLD = 120000
|
||||
|
||||
|
@ -219,7 +219,7 @@ class ContextManager:
|
|||
max_iterations: Maximum number of compression iterations
|
||||
"""
|
||||
# Get model-specific token limits from constants
|
||||
context_window = get_model_context_window(llm_model)
|
||||
context_window = model_manager.get_context_window(llm_model)
|
||||
|
||||
# Reserve tokens for output generation and safety margin
|
||||
if context_window >= 1_000_000: # Very large context models (Gemini)
|
||||
|
|
|
@ -17,7 +17,7 @@ from utils.config import config, EnvMode
|
|||
from services.supabase import DBConnection
|
||||
from utils.auth_utils import get_current_user_id_from_jwt
|
||||
from pydantic import BaseModel
|
||||
from utils.constants import MODEL_ACCESS_TIERS, MODEL_NAME_ALIASES, HARDCODED_MODEL_PRICES
|
||||
from models import model_manager
|
||||
from litellm.cost_calculator import cost_per_token
|
||||
import time
|
||||
import json
|
||||
|
@ -36,11 +36,10 @@ CREDIT_PACKAGES = {
|
|||
'credits_10': {'amount': 10, 'price': 10, 'stripe_price_id': config.STRIPE_CREDITS_10_PRICE_ID},
|
||||
'credits_25': {'amount': 25, 'price': 25, 'stripe_price_id': config.STRIPE_CREDITS_25_PRICE_ID},
|
||||
# Uncomment these when you create the additional price IDs in Stripe:
|
||||
# 'credits_50': {'amount': 50, 'price': 50, 'stripe_price_id': config.STRIPE_CREDITS_50_PRICE_ID},
|
||||
# 'credits_100': {'amount': 100, 'price': 100, 'stripe_price_id': config.STRIPE_CREDITS_100_PRICE_ID},
|
||||
# 'credits_250': {'amount': 250, 'price': 250, 'stripe_price_id': config.STRIPE_CREDITS_250_PRICE_ID},
|
||||
# 'credits_500': {'amount': 500, 'price': 500, 'stripe_price_id': config.STRIPE_CREDITS_500_PRICE_ID},
|
||||
# 'credits_1000': {'amount': 1000, 'price': 1000, 'stripe_price_id': config.STRIPE_CREDITS_1000_PRICE_ID},
|
||||
'credits_50': {'amount': 50, 'price': 50, 'stripe_price_id': config.STRIPE_CREDITS_50_PRICE_ID},
|
||||
'credits_100': {'amount': 100, 'price': 100, 'stripe_price_id': config.STRIPE_CREDITS_100_PRICE_ID},
|
||||
'credits_250': {'amount': 250, 'price': 250, 'stripe_price_id': config.STRIPE_CREDITS_250_PRICE_ID},
|
||||
'credits_500': {'amount': 500, 'price': 500, 'stripe_price_id': config.STRIPE_CREDITS_500_PRICE_ID}
|
||||
}
|
||||
|
||||
router = APIRouter(prefix="/billing", tags=["billing"])
|
||||
|
@ -117,16 +116,10 @@ def get_model_pricing(model: str) -> tuple[float, float] | None:
|
|||
Returns:
|
||||
Tuple of (input_cost_per_million_tokens, output_cost_per_million_tokens) or None if not found
|
||||
"""
|
||||
# Try direct lookup first
|
||||
if model in HARDCODED_MODEL_PRICES:
|
||||
pricing = HARDCODED_MODEL_PRICES[model]
|
||||
return pricing["input_cost_per_million_tokens"], pricing["output_cost_per_million_tokens"]
|
||||
|
||||
from models import model_manager
|
||||
resolved_model = model_manager.resolve_model_id(model)
|
||||
if resolved_model != model and resolved_model in HARDCODED_MODEL_PRICES:
|
||||
pricing = HARDCODED_MODEL_PRICES[resolved_model]
|
||||
return pricing["input_cost_per_million_tokens"], pricing["output_cost_per_million_tokens"]
|
||||
# Use the model manager to get pricing
|
||||
pricing = model_manager.get_pricing(model)
|
||||
if pricing:
|
||||
return pricing.input_cost_per_million_tokens, pricing.output_cost_per_million_tokens
|
||||
|
||||
return None
|
||||
|
||||
|
@ -819,8 +812,13 @@ async def get_allowed_models_for_user(client, user_id: str):
|
|||
if tier_info:
|
||||
tier_name = tier_info['name']
|
||||
|
||||
# Return allowed models for this tier
|
||||
result = MODEL_ACCESS_TIERS.get(tier_name, MODEL_ACCESS_TIERS['free']) # Default to free tier if unknown
|
||||
# Return allowed models for this tier using model manager
|
||||
if tier_name == 'free':
|
||||
result = model_manager.get_models_for_tier('free')
|
||||
result = [model.id for model in result] # Convert to list of IDs
|
||||
else:
|
||||
result = model_manager.get_models_for_tier('paid')
|
||||
result = [model.id for model in result] # Convert to list of IDs
|
||||
await Cache.set(f"allowed_models_for_user:{user_id}", result, ttl=1 * 60)
|
||||
return result
|
||||
|
||||
|
|
|
@ -7,16 +7,17 @@ import sys
|
|||
import os
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from utils.constants import get_model_context_window, MODEL_CONTEXT_WINDOWS
|
||||
from models import model_manager
|
||||
|
||||
def test_model_limits():
|
||||
"""Test the model context window limits."""
|
||||
|
||||
print("=== All Model Context Windows ===")
|
||||
for model, window in sorted(MODEL_CONTEXT_WINDOWS.items()):
|
||||
print(f'{model}: {window:,} tokens')
|
||||
all_models = model_manager.get_all_models()
|
||||
for model in sorted(all_models, key=lambda m: m.id):
|
||||
print(f'{model.id}: {model.context_window:,} tokens')
|
||||
|
||||
print("\n=== Testing get_model_context_window function ===")
|
||||
print("\n=== Testing get_context_window function ===")
|
||||
test_models = [
|
||||
'gpt-5',
|
||||
'sonnet-3.5',
|
||||
|
@ -29,12 +30,12 @@ def test_model_limits():
|
|||
]
|
||||
|
||||
for model in test_models:
|
||||
window = get_model_context_window(model)
|
||||
window = model_manager.get_context_window(model)
|
||||
print(f'{model}: {window:,} tokens')
|
||||
|
||||
print("\n=== Context Manager Logic Simulation ===")
|
||||
for model in ['gpt-5', 'anthropic/claude-sonnet-4', 'gemini/gemini-2.5-pro', 'unknown-model']:
|
||||
context_window = get_model_context_window(model)
|
||||
context_window = model_manager.get_context_window(model)
|
||||
|
||||
# Simulate the logic from context manager
|
||||
if context_window >= 1_000_000: # Very large context models (Gemini)
|
||||
|
|
|
@ -227,6 +227,30 @@ class Configuration:
|
|||
return self.STRIPE_CREDITS_25_PRICE_ID_STAGING
|
||||
return self.STRIPE_CREDITS_25_PRICE_ID_PROD
|
||||
|
||||
@property
|
||||
def STRIPE_CREDITS_50_PRICE_ID(self) -> str:
|
||||
if self.ENV_MODE == EnvMode.STAGING:
|
||||
return self.STRIPE_CREDITS_50_PRICE_ID_STAGING
|
||||
return self.STRIPE_CREDITS_50_PRICE_ID_PROD
|
||||
|
||||
@property
|
||||
def STRIPE_CREDITS_100_PRICE_ID(self) -> str:
|
||||
if self.ENV_MODE == EnvMode.STAGING:
|
||||
return self.STRIPE_CREDITS_100_PRICE_ID_STAGING
|
||||
return self.STRIPE_CREDITS_100_PRICE_ID_PROD
|
||||
|
||||
@property
|
||||
def STRIPE_CREDITS_250_PRICE_ID(self) -> str:
|
||||
if self.ENV_MODE == EnvMode.STAGING:
|
||||
return self.STRIPE_CREDITS_250_PRICE_ID_STAGING
|
||||
return self.STRIPE_CREDITS_250_PRICE_ID_PROD
|
||||
|
||||
@property
|
||||
def STRIPE_CREDITS_500_PRICE_ID(self) -> str:
|
||||
if self.ENV_MODE == EnvMode.STAGING:
|
||||
return self.STRIPE_CREDITS_500_PRICE_ID_STAGING
|
||||
return self.STRIPE_CREDITS_500_PRICE_ID_PROD
|
||||
|
||||
# LLM API keys
|
||||
ANTHROPIC_API_KEY: Optional[str] = None
|
||||
OPENAI_API_KEY: Optional[str] = None
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
from models import model_manager
|
||||
|
||||
_legacy_data = model_manager.get_legacy_constants()
|
||||
|
||||
MODELS = _legacy_data["MODELS"]
|
||||
MODEL_NAME_ALIASES = _legacy_data["MODEL_NAME_ALIASES"]
|
||||
HARDCODED_MODEL_PRICES = _legacy_data["HARDCODED_MODEL_PRICES"]
|
||||
MODEL_CONTEXT_WINDOWS = _legacy_data["MODEL_CONTEXT_WINDOWS"]
|
||||
FREE_TIER_MODELS = _legacy_data["FREE_TIER_MODELS"]
|
||||
PAID_TIER_MODELS = _legacy_data["PAID_TIER_MODELS"]
|
||||
|
||||
MODEL_ACCESS_TIERS = {
|
||||
"free": FREE_TIER_MODELS,
|
||||
"tier_2_20": PAID_TIER_MODELS,
|
||||
"tier_6_50": PAID_TIER_MODELS,
|
||||
"tier_12_100": PAID_TIER_MODELS,
|
||||
"tier_25_200": PAID_TIER_MODELS,
|
||||
"tier_50_400": PAID_TIER_MODELS,
|
||||
"tier_125_800": PAID_TIER_MODELS,
|
||||
"tier_200_1000": PAID_TIER_MODELS,
|
||||
"tier_25_170_yearly_commitment": PAID_TIER_MODELS,
|
||||
"tier_6_42_yearly_commitment": PAID_TIER_MODELS,
|
||||
"tier_12_84_yearly_commitment": PAID_TIER_MODELS,
|
||||
}
|
||||
|
||||
def get_model_context_window(model_name: str, default: int = 31_000) -> int:
|
||||
return model_manager.get_context_window(model_name, default)
|
|
@ -10,7 +10,6 @@ export const STORAGE_KEY_CUSTOM_MODELS = 'customModels';
|
|||
export const DEFAULT_PREMIUM_MODEL_ID = 'claude-sonnet-4';
|
||||
export const DEFAULT_FREE_MODEL_ID = 'moonshotai/kimi-k2';
|
||||
|
||||
// Helper to test localStorage functionality
|
||||
export const testLocalStorage = (): boolean => {
|
||||
if (typeof window === 'undefined') return false;
|
||||
try {
|
||||
|
@ -43,9 +42,7 @@ export interface CustomModel {
|
|||
label: string;
|
||||
}
|
||||
|
||||
// SINGLE SOURCE OF TRUTH for all model data - aligned with backend constants
|
||||
export const MODELS = {
|
||||
// Premium tier models (require subscription) - using aliases from backend
|
||||
'claude-sonnet-4': {
|
||||
tier: 'premium',
|
||||
priority: 100,
|
||||
|
@ -83,7 +80,6 @@ export const MODELS = {
|
|||
lowQuality: false
|
||||
},
|
||||
|
||||
// Free tier models (available to all users)
|
||||
'moonshotai/kimi-k2': {
|
||||
tier: 'free',
|
||||
priority: 100,
|
||||
|
@ -121,7 +117,6 @@ export const canAccessModel = (
|
|||
return subscriptionStatus === 'active' || !requiresSubscription;
|
||||
};
|
||||
|
||||
// Helper to format a model name for display
|
||||
export const formatModelName = (name: string): string => {
|
||||
return name
|
||||
.split('-')
|
||||
|
@ -129,7 +124,6 @@ export const formatModelName = (name: string): string => {
|
|||
.join(' ');
|
||||
};
|
||||
|
||||
// Add openrouter/ prefix to custom models
|
||||
export const getPrefixedModelId = (modelId: string, isCustom: boolean): string => {
|
||||
if (isCustom && !modelId.startsWith('openrouter/')) {
|
||||
return `openrouter/${modelId}`;
|
||||
|
|
|
@ -18,6 +18,7 @@ export interface ModelOption {
|
|||
recommended?: boolean;
|
||||
capabilities?: string[];
|
||||
contextWindow?: number;
|
||||
backendId?: string; // For mapping display names to backend IDs
|
||||
}
|
||||
|
||||
export type SubscriptionStatus = 'no_subscription' | 'active';
|
||||
|
|
Loading…
Reference in New Issue