# Keyword Reference

This section lists every BASIC keyword implemented in the GeneralBots engine. Each keyword page includes:

* **Syntax** – Exact command format
* **Parameters** – Expected arguments
* **Description** – What the keyword does
* **Example** – A short snippet showing usage

The source code for each keyword lives in `src/basic/keywords/`. Only the keywords listed here exist in the system.

## Important: Case Insensitivity

**All variables in General Bots BASIC are case-insensitive.** The preprocessor normalizes variable names to lowercase automatically.

```basic
' These all refer to the same variable
host = "https://api.example.com"
result = GET Host + "/endpoint"
TALK HOST
```

Keywords are also case-insensitive but conventionally written in UPPERCASE:

```basic
' Both work identically
TALK "Hello"
talk "Hello"
```

## Configuration Variables (param-*)

Variables defined with `param-` prefix in `config.csv` are automatically available in scripts without the prefix:

```csv
name,value
param-host,https://api.example.com
param-limit,100
param-pages,50
```

```basic
' Access directly (lowercase, no param- prefix)
result = GET host + "/items?limit=" + limit
```

See [Script Execution Flow](./script-execution-flow.md) for complete details.

---

## Complete Keyword List (Flat Reference)

| Keyword | Category | Description |
|---------|----------|-------------|
| `ADD BOT` | Multi-Agent | Add a bot to the current session with triggers |
| `ADD MEMBER` | Communication | Add member to a group |
| `ADD SUGGESTION` | UI | Add clickable suggestion button |
| `ADD TOOL` | Tools | Register a tool for the session |
| `AGGREGATE` | Data | Perform SUM, AVG, COUNT, MIN, MAX operations |
| `BOOK` | Special | Book an appointment |
| `BOT REFLECTION` | Multi-Agent | Enable agent self-analysis and improvement |
| `BROADCAST TO BOTS` | Multi-Agent | Send message to all bots in session |
| `CLEAR HEADERS` | HTTP | Clear all HTTP headers |
| `CLEAR KB` | Knowledge | Unload knowledge base from session |
| `CLEAR SUGGESTIONS` | UI | Remove all suggestion buttons |
| `CLEAR TOOLS` | Tools | Remove all registered tools |
| `COMPRESS` | Files | Create ZIP archive |
| `COPY` | Files | Copy a file |
| `CREATE DRAFT` | Communication | Create email draft |
| `CREATE SITE` | Tools | Generate a website |
| `CREATE TASK` | Tools | Create a task |
| `DELEGATE TO BOT` | Multi-Agent | Send task to another bot |
| `DELETE` | Data | Delete records from table |
| `DELETE FILE` | Files | Delete a file |
| `DELETE HTTP` | HTTP | Send HTTP DELETE request |
| `DOWNLOAD` | Files | Download file from URL |
| `EXIT FOR` | Control | Exit loop early |
| `EXTRACT` | Files | Extract ZIP archive |
| `FILL` | Data | Fill template with data |
| `FILTER` | Data | Filter records by condition |
| `FIND` | Data | Search in files or KB |
| `FIRST` | Data | Get first element |
| `FOR EACH ... NEXT` | Control | Loop through items |
| `FORMAT` | Data | Format strings and dates |
| `GENERATE PDF` | Files | Generate PDF from template |
| `GET` | Variables | Get variable or API data |
| `GOTO` | Control | Jump to label (⚠️ use ON instead) |
| `GET BOT MEMORY` | Memory | Retrieve bot-level persisted data |
| `GET USER MEMORY` | Memory | Retrieve user-level persisted data (cross-bot) |
| `GRAPHQL` | HTTP | Execute GraphQL query |
| `GROUP BY` | Data | Group data by field |
| `HEAR` | Dialog | Get input from user |
| `IF ... THEN ... ELSE ... END IF` | Control | Conditional logic |
| `INSERT` | Data | Insert new record |
| `INSTR` | String | Find position of substring |
| `IS NUMERIC` | String | Check if value is numeric |
| `JOIN` | Data | Join two datasets |
| `LAST` | Data | Get last element |
| `LIST` | Files | List directory contents |
| `LLM` | AI | Query language model |
| `MAP` | Data | Map field names |
| `MERGE` | Data | Merge data into table |
| `MERGE PDF` | Files | Merge multiple PDFs |
| `MOVE` | Files | Move or rename file |
| `ON` | Events | Event handler |
| `PATCH` | HTTP | Send HTTP PATCH request |
| `PIVOT` | Data | Create pivot table |
| `POST` | HTTP | Send HTTP POST request |
| `PRINT` | Debug | Debug output to console |
| `PUT` | HTTP | Send HTTP PUT request |
| `READ` | Files | Read file content |
| `REMEMBER` | Memory | Store user-specific memory |
| `RUN BASH` | Code Execution | Execute Bash script in sandbox |
| `RUN JAVASCRIPT` | Code Execution | Execute JavaScript in sandbox |
| `RUN PYTHON` | Code Execution | Execute Python code in sandbox |
| `SAVE` | Data | Save data to table (upsert) |
| `SAVE FROM UNSTRUCTURED` | Data | Extract structured data from text |
| `SEND MAIL` | Communication | Send email |
| `SET` | Variables | Set variable value |
| `SET BOT MEMORY` | Memory | Persist data at bot level |
| `SET CONTEXT` | AI | Add context for LLM |
| `SET HEADER` | HTTP | Set HTTP header |
| `SET SCHEDULE` | Events | Schedule script execution |
| `SET USER` | Session | Set user context |
| `SET USER FACT` | Memory | Store a fact about the user |
| `SET USER MEMORY` | Memory | Persist data at user level (cross-bot) |
| `SOAP` | HTTP | Execute SOAP API call |
| `SWITCH ... CASE ... END SWITCH` | Control | Switch statement |
| `SYNCHRONIZE` | Data | Sync API data to table (planned) |
| `TALK` | Dialog | Send message to user |
| `TRANSFER CONVERSATION` | Multi-Agent | Hand off conversation to another bot |
| `UPDATE` | Data | Update existing records |
| `USE MODEL` | AI | Switch LLM model for subsequent operations |
| `USER FACTS` | Memory | Get all stored user facts |
| `UPLOAD` | Files | Upload file to storage |
| `USE KB` | Knowledge | Load knowledge base |
| `USE TOOL` | Tools | Register tool definition |
| `USE WEBSITE` | Knowledge | Associate website with session |
| `WAIT` | Control | Pause execution |
| `WEATHER` | Special | Get weather information |
| `WEBHOOK` | Events | Create webhook endpoint |
| `WHILE ... WEND` | Control | While loop |
| `WRITE` | Files | Write content to file |

---

## Keywords by Category

### Core Dialog Keywords

| Keyword | Syntax | Description |
|---------|--------|-------------|
| TALK | `TALK "message"` | Send message to user |
| HEAR | `HEAR variable` or `HEAR variable AS TYPE` | Get input from user |
| WAIT | `WAIT seconds` | Pause execution |
| PRINT | `PRINT "debug message"` | Debug output to console |

### Variable & Memory

| Keyword | Syntax | Description |
|---------|--------|-------------|
| SET | `SET variable = value` or `let variable = value` | Set variable value |
| GET | `result = GET "path"` | Get variable or fetch data |
| SET BOT MEMORY | `SET BOT MEMORY "key", value` | Persist data at bot level |
| GET BOT MEMORY | `value = GET BOT MEMORY("key")` | Retrieve persisted data |
| SET USER MEMORY | `SET USER MEMORY "key", value` | Persist data at user level (cross-bot) |
| GET USER MEMORY | `value = GET USER MEMORY("key")` | Retrieve user-level data |
| SET USER FACT | `SET USER FACT "key", value` | Store fact about user |
| USER FACTS | `facts = USER FACTS()` | Get all user facts |
| REMEMBER | `REMEMBER "key", value` | Store user-specific memory |

### AI & Context

| Keyword | Syntax | Description |
|---------|--------|-------------|
| LLM | `result = LLM "prompt"` | Query language model |
| SET CONTEXT | `SET CONTEXT "name" AS "value"` | Add context for LLM |
| SET USER | `SET USER userid` | Set user context |
| USE MODEL | `USE MODEL "modelname"` | Switch LLM model (fast/quality/code/auto) |

### Multi-Agent Orchestration

| Keyword | Syntax | Description |
|---------|--------|-------------|
| ADD BOT | `ADD BOT "name" TRIGGER ON "keywords"` | Add bot with triggers |
| DELEGATE TO BOT | `result = DELEGATE "message" TO BOT "name"` | Send task to bot |
| BROADCAST TO BOTS | `BROADCAST "message" TO BOTS` | Message all bots |
| TRANSFER CONVERSATION | `TRANSFER CONVERSATION TO "botname"` | Hand off to bot |
| BOT REFLECTION | `BOT REFLECTION true` | Enable self-analysis |
| BOT REFLECTION INSIGHTS | `insights = BOT REFLECTION INSIGHTS()` | Get analysis results |

### Code Execution (Sandboxed)

| Keyword | Syntax | Description |
|---------|--------|-------------|
| RUN PYTHON | `result = RUN PYTHON "code"` | Execute Python in sandbox |
| RUN JAVASCRIPT | `result = RUN JAVASCRIPT "code"` | Execute JS in sandbox |
| RUN BASH | `result = RUN BASH "code"` | Execute Bash in sandbox |
| RUN ... WITH FILE | `result = RUN PYTHON WITH FILE "script.py"` | Run script file |

### Knowledge Base

| Keyword | Syntax | Description |
|---------|--------|-------------|
| USE KB | `USE KB "kbname"` | Load knowledge base |
| CLEAR KB | `CLEAR KB` or `CLEAR KB "kbname"` | Unload knowledge base |
| USE WEBSITE | `USE WEBSITE "url"` | Associate website with session |
| FIND | `result = FIND "file", "filter"` | Search in files or KB |

### Tools & Automation

| Keyword | Syntax | Description |
|---------|--------|-------------|
| ADD TOOL | `ADD TOOL "toolname"` | Register tool for session |
| USE TOOL | `USE TOOL "toolname"` | Load tool definition |
| CLEAR TOOLS | `CLEAR TOOLS` | Remove all registered tools |
| CREATE TASK | `CREATE TASK "title", "description"` | Create a task |
| CREATE SITE | `CREATE SITE "alias", "template", "prompt"` | Generate a website |
| CREATE DRAFT | `CREATE DRAFT "to", "subject", "body"` | Create email draft |

### UI & Interaction

| Keyword | Syntax | Description |
|---------|--------|-------------|
| ADD SUGGESTION | `ADD SUGGESTION "key" AS "display text"` | Add clickable button |
| CLEAR SUGGESTIONS | `CLEAR SUGGESTIONS` | Remove all buttons |

### Data Operations

| Keyword | Syntax | Description |
|---------|--------|-------------|
| SAVE | `SAVE "table", var1, var2, var3` | Save data (upsert) |
| INSERT | `result = INSERT "table", data` | Insert new record |
| UPDATE | `rows = UPDATE "table", "filter", data` | Update records |
| DELETE | `rows = DELETE "table", "filter"` | Delete records |
| MERGE | `result = MERGE "table", data, "key"` | Merge data into table |
| FILTER | `result = FILTER data, "condition"` | Filter records |
| AGGREGATE | `result = AGGREGATE "SUM", data, "field"` | Aggregate operations |
| JOIN | `result = JOIN left, right, "key"` | Join datasets |
| PIVOT | `result = PIVOT data, "row", "value"` | Create pivot table |
| GROUP BY | `result = GROUP BY data, "field"` | Group data |
| SYNCHRONIZE | `SYNCHRONIZE endpoint, table, key, pageVar, limitVar` | Sync API to table |
| MAP | `result = MAP data, "old->new"` | Map field names |
| FILL | `result = FILL data, template` | Fill template |
| FIRST | `result = FIRST collection` | Get first element |
| LAST | `result = LAST collection` | Get last element |
| FORMAT | `result = FORMAT value AS "pattern"` | Format strings/dates |

### File Operations

| Keyword | Syntax | Description |
|---------|--------|-------------|
| READ | `content = READ "path"` | Read file content |
| WRITE | `WRITE "path", content` | Write to file |
| DELETE FILE | `DELETE FILE "path"` | Delete a file |
| COPY | `COPY "source", "destination"` | Copy a file |
| MOVE | `MOVE "source", "destination"` | Move/rename file |
| LIST | `files = LIST "path/"` | List directory |
| UPLOAD | `url = UPLOAD file, "path"` | Upload file |
| DOWNLOAD | `path = DOWNLOAD "url", "local"` | Download file |
| COMPRESS | `archive = COMPRESS files, "name.zip"` | Create ZIP |
| EXTRACT | `files = EXTRACT "archive.zip", "dest/"` | Extract ZIP |
| GENERATE PDF | `result = GENERATE PDF "template", data, "output.pdf"` | Generate PDF |
| MERGE PDF | `result = MERGE PDF files, "merged.pdf"` | Merge PDFs |

### HTTP & API Operations

| Keyword | Syntax | Description |
|---------|--------|-------------|
| POST | `result = POST "url", data` | HTTP POST request |
| PUT | `result = PUT "url", data` | HTTP PUT request |
| PATCH | `result = PATCH "url", data` | HTTP PATCH request |
| DELETE HTTP | `result = DELETE HTTP "url"` | HTTP DELETE request |
| SET HEADER | `SET HEADER "name", "value"` | Set HTTP header |
| CLEAR HEADERS | `CLEAR HEADERS` | Clear all headers |
| GRAPHQL | `result = GRAPHQL "url", "query", vars` | GraphQL query |
| SOAP | `result = SOAP "wsdl", "operation", params` | SOAP call |

### Flow Control

| Keyword | Syntax | Description |
|---------|--------|-------------|
| IF...THEN...ELSE | `IF condition THEN ... ELSE ... END IF` | Conditional |
| FOR EACH...NEXT | `FOR EACH item IN collection ... NEXT item` | Loop |
| EXIT FOR | `EXIT FOR` | Exit loop early |
| `WHILE...WEND` | `WHILE condition ... WEND` | While loop |
| `SWITCH...CASE` | `SWITCH value CASE x ... END SWITCH` | Switch statement |
| `REPORT` | `SEND EMAIL admin, REPORT` | Access sync statistics |
| `RESET REPORT` | `RESET REPORT` | Clear sync statistics |

### Events & Scheduling

| Keyword | Syntax | Description |
|---------|--------|-------------|
| ON | `ON "event" CALL handler` | Event handler |
| SET SCHEDULE | `SET SCHEDULE "cron"` | Schedule execution |
| WEBHOOK | `WEBHOOK "endpoint"` | Create webhook |

### Communication

| Keyword | Syntax | Description |
|---------|--------|-------------|
| SEND MAIL | `SEND MAIL "to", "subject", "body"` | Send email |
| ADD MEMBER | `ADD MEMBER "email", "group"` | Add to group |

### Special Functions

| Keyword | Syntax | Description |
|---------|--------|-------------|
| BOOK | `BOOK "appointment"` | Book appointment |
| WEATHER | `weather = WEATHER "location"` | Get weather |
| INSTR | `pos = INSTR(string, search)` | Find substring |
| IS NUMERIC | `result = IS NUMERIC(value)` | Check if numeric |
| SAVE FROM UNSTRUCTURED | `data = SAVE FROM UNSTRUCTURED text, schema` | Extract structured data |

---

## Syntax Rules

### DO ✅

```basic
' Variable names (no underscores in names)
let ticketnumber = "TKT001"
let useremail = "user@example.com"

' SAVE with field names = variable names
SAVE "table.csv", ticketnumber, useremail, status

' Keywords with spaces
SET BOT MEMORY "last_ticket", ticketnumber
SET CONTEXT "name" AS "description"
ADD SUGGESTION "key" AS "Display text"
CLEAR SUGGESTIONS
USE KB "myknowledge"
USE TOOL "mytool"

' GET BOT MEMORY as function
let lastticket = GET BOT MEMORY("last_ticket")
```

### DON'T ❌

```basic
' NO: Complex object operations
SET object.field = value  ' WRONG
SAVE "table", object.id, object  ' WRONG

' NO: IF for input validation (use HEAR AS TYPE instead)
IF value = "" THEN  ' OK for logic, but for input use:
HEAR value AS STRING  ' Better - validates input type
```

---

## Prompt Blocks

Special multi-line blocks for AI configuration and formatted output:

| Block | Purpose | Documentation |
|-------|---------|---------------|
| `BEGIN SYSTEM PROMPT ... END SYSTEM PROMPT` | Define AI persona, rules, capabilities | [Prompt Blocks](./prompt-blocks.md) |
| `BEGIN TALK ... END TALK` | Formatted multi-line messages with Markdown | [Prompt Blocks](./prompt-blocks.md) |

```basic
BEGIN SYSTEM PROMPT
You are a helpful assistant for AcmeStore.
Rules:
1. Always be polite
2. Never discuss competitors
END SYSTEM PROMPT

BEGIN TALK
**Welcome!** 🎉

I can help you with:
• Orders
• Tracking
• Returns
END TALK
```

---

## Script Structure

### No MAIN Function

Scripts execute from line 1 - no `MAIN` or entry point needed:

```basic
' ✅ CORRECT - Start directly
TALK "Hello!"
ADD TOOL "my-tool"

' ❌ WRONG - Don't use MAIN
SUB MAIN()
    TALK "Hello"
END SUB
```

### SUB and FUNCTION for Reuse

Use for helper code within tools, not as entry points:

```basic
FUNCTION CalculateTotal(price, quantity)
    RETURN price * quantity
END FUNCTION

SUB NotifyAdmin(message)
    SEND EMAIL admin1, message
END SUB

' Execution starts here
total = CalculateTotal(19.99, 3)
CALL NotifyAdmin("Order processed")
```

See [Script Execution Flow](./script-execution-flow.md) for entry points and lifecycle.

---

## Notes

- Keywords are case-insensitive (TALK = talk = Talk)
- Variables are case-insensitive (host = HOST = Host)
- String parameters can use double quotes or single quotes
- Comments start with REM or '
- Line continuation uses underscore (_)
- Objects are created with `#{ key: value }` syntax
- Arrays use `[item1, item2, ...]` syntax
- param-* config values become global variables

---

## See Also

- [Script Execution Flow](./script-execution-flow.md) - Entry points and lifecycle
- [Prompt Blocks](./prompt-blocks.md) - BEGIN SYSTEM PROMPT & BEGIN TALK
- [Basics](./basics.md) - Core concepts
- [Examples](./examples-consolidated.md) - Real-world patterns