---
# System prepended metadata

title: LLM Calling via AO Process

---

# LLM Calling via AO Process

AO process handler for calling LLMs via API. This example demonstrates integration with Google's Gemini AI API, but the same pattern can be adapted for other LLM providers like OpenAI, Anthropic, etc.

## Configuration

```lua
GEMINI_API_URL =
    "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=GEMINI_API_KEY"
```

> ⚠️ **WARNING**: The API key will be **PUBLIC** when deployed on AO network. This means anyone can see and potentially use your API key. However, since Gemini provides **free tier**, this is less concerning than with paid services.

> 💡 **Note**: Thinking about a valid solution to address the API key exposure issue.

## Handler: Send-Prompt

Main handler that processes user prompts and sends them to Gemini API.

```lua
Handlers.add('Send-Prompt', 'Send-Prompt', function(msg)
    assert(msg['user-prompt'], 'No user prompt provided')
    print('\nProcessing user prompt...')
    print('\nUser prompt:\n', msg['user-prompt'])

    local promptBody = {
        contents = {{
            parts = {{
                text = msg['user-prompt']
            }}
        }}
    }

    send({
        target = id,
        ['relay-path'] = GEMINI_API_URL, -- or msg['AI-Endpoint'] if you want to use a different endpoint
        ['relay-method'] = 'POST',
        ['relay-body'] = require('json').encode(promptBody),
        ['Content-Type'] = 'application/json',
        resolve = '~relay@1.0/call/~patch@1.0',
        action = 'Receive-Response'
    })
end)

```

## Handler: Receive-Response

Helper handler that processes responses from the Gemini API.

```lua
Handlers.add('Receive-Response', 'Receive-Response', function(msg)
    if msg.body then
        local response = require('json').decode(msg.body)
        print('\nResponse:\n', response.candidates[1].content.parts[1].text)

        print('\nResponse source:', msg['relay-path'])
    else
        print('Error or empty response:', msg)
    end
end)

```

## Usage (AOS CLI)

1. Initialize Hyper-AOS
   ```bash
   aos gemini_agent --url https://hb.arweave.asia
   ```
2. Load the Lua file into the process
   ```bash
   .load gemini.lua
   ```
3. Send a prompt
   ```lua
   send({target=id, action='Send-Prompt', ['user-prompt']='gm gemini from permaweb'})
   ```

## Notes

Alternative node URLs:
- `https://hb.arweave.asia` (recommended)
- `https://hb.arnode.asia`
- `https://workshop.forward.computer` (temporary node – may go offline soon)

## Sample Response 

```
Processing user prompt...

User prompt:
gm gemini from permaweb

Response:
Good morning! I'm ready to assist you with information and tasks related to the Permaweb, Arweave, or any other topics you'd like to discuss. How can I help you today?

Response source: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=GEMINI_API_KEY
```


## Requirements

- `AI_Gateway_Endpoint` AI provider URL
- `AI_API_KEY` environment variable
- AO process with relay capabilities
- JSON library