Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion app/admin/generator/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,28 @@

AI-powered system for generating IntentKit agent schemas from natural language prompts with project-based conversation history and automatic tag generation.

## Configuration

### Default Skills

The Agent Generator can automatically include default skills in all generated agents:

```env
# Enable default skills (disabled by default)
GENERATOR_ADD_DEFAULT_SKILLS=true

# Specify which skills to include as defaults (comma-separated)
GENERATOR_DEFAULT_SKILLS=common,tavily,cdp
```

When enabled, these skills will be automatically added to every generated agent schema with appropriate default configurations from their schemas. Identified skills from prompts will take precedence over defaults.

## Architecture

```
generator/
├── agent_generator.py # Main orchestrator
├── skill_processor.py # Skill identification
├── skill_processor.py # Skill identification + default skills
├── validation.py # Schema validation
├── ai_assistant.py # AI operations + conversation history
├── llm_logger.py # Individual LLM call tracking
Expand Down
50 changes: 48 additions & 2 deletions app/admin/generator/skill_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

from openai import OpenAI

from app.config.config import config
from skills import __all__ as available_skill_categories

if TYPE_CHECKING:
Expand All @@ -30,6 +31,40 @@
_skill_schemas_cache: Dict[str, Dict[str, Any]] = {}


def get_default_skills_config() -> Dict[str, Any]:
"""Get default skills configuration based on config settings.

Returns:
Dict containing default skills configurations
"""
if not config.generator_add_default_skills:
return {}

default_skills = {}
all_real_skills = get_all_real_skills()

for skill_name in config.generator_default_skills:
skill_name = skill_name.strip()
if skill_name in all_real_skills:
# Get states with schema-based defaults
states_dict = {}
for state in all_real_skills[skill_name]:
states_dict[state] = get_skill_state_default(skill_name, state)

default_skills[skill_name] = {
"enabled": True,
"states": states_dict,
"api_key_provider": get_skill_default_api_key_provider(skill_name),
}
logger.debug(f"Added default skill: {skill_name}")
else:
logger.warning(
f"Default skill '{skill_name}' not found in available skills"
)

return default_skills


def load_skill_schema(skill_name: str) -> Optional[Dict[str, Any]]:
"""Load schema.json for a specific skill."""
if skill_name in _skill_schemas_cache:
Expand Down Expand Up @@ -434,11 +469,22 @@ async def identify_skills(
Returns:
Dict containing skill configurations with only real skill states
"""
# Use keyword matching first
skills_config = keyword_match_skills(prompt)
# Start with default skills if enabled
skills_config = get_default_skills_config()

# Use keyword matching
keyword_skills = keyword_match_skills(prompt)

# Merge keyword skills with defaults (keyword skills take precedence)
for skill_name, skill_config in keyword_skills.items():
skills_config[skill_name] = skill_config

# Add skills mentioned by exact name
skills_config = add_skill_by_name(prompt, skills_config)

if config.generator_add_default_skills and skills_config:
logger.info(f"Added default skills: {list(get_default_skills_config().keys())}")

return skills_config


Expand Down
8 changes: 8 additions & 0 deletions app/config/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,14 @@ def __init__(self):
self.nation_api_key = self.load("NATION_API_KEY")
self.nation_api_url = self.load("NATION_API_URL", "")

# Agent Generator - Default Skills
self.generator_add_default_skills = (
self.load("GENERATOR_ADD_DEFAULT_SKILLS", "false") == "true"
)
self.generator_default_skills = self.load(
"GENERATOR_DEFAULT_SKILLS", "common,tavily"
).split(",")

# ===== config loaded
# Now we know the env, set up logging
setup_logging(self.env, self.debug)
Expand Down
5 changes: 5 additions & 0 deletions example.env
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ TWITTER_OAUTH2_CLIENT_SECRET=
TWITTER_OAUTH2_REDIRECT_URI=http://localhost:8000/callback/auth/twitter
TWITTER_ENTRYPOINT_INTERVAL=1

# Set to true to automatically add default skills to generated agents
GENERATOR_ADD_DEFAULT_SKILLS=false
# Comma-separated list of skill categories to add as defaults
GENERATOR_DEFAULT_SKILLS=common,tavily

DAPPLOOKER_API_KEY=

UNREALSPEECH_API_KEY=
Expand Down