Agora

LLM Wrapper

Sign in to your dashboard

{{ loginError }}

Agora

Dashboard

System overview and performance metrics

Skills
{{ stats.skills.total }}

{{ stats.skills.activated }} active

Providers
{{ stats.apiKeys.active }}

configured

Cache Hits
{{ stats.cache.stats?.hits || 0 }}

{{ stats.cache.stats?.misses || 0 }} misses

System RAM
{{ formatBytes(stats.system.totalMemory) }}

{{ formatBytes(stats.system.freeMemory) }} free · Process {{ formatBytes(stats.system.memoryUsage.rss) }}

System

Platform
{{ stats.system.platform }}
Node
{{ stats.system.nodeVersion }}
Uptime
{{ formatUptime(stats.system.processUptime) }}
CPUs
{{ stats.system.cpus }}

Loaded Skills

{{ skill.name }}
{{ skill.scriptCount }} scripts
{{ skill.activated ? 'Active' : 'Inactive' }}

Skills

Manage, upload, and configure agent skills

Upload ZIP

Click to upload or drag & drop

.zip files only

{{ selectedSkillFile.name }}

From Git

From URL

{{ skillUploadError }}
{{ skillUploadSuccess }}

Server restart required

New skills won't be available until the server is restarted.

How skill states work

Active

Full instructions and tools are loaded into every LLM request. Use for skills you always need.

Available

LLM sees a summary and can activate on demand. No token cost until used.

Disabled

Completely hidden from the LLM. Kept on disk for future use.

{{ skill.name }} Disabled Active Available

{{ skill.description }}

Hidden from the LLM — not visible or usable

Full instructions loaded into every request

LLM can see this skill and activate it when needed

{{ tag }} v{{ skill.version }} · {{ skill.scriptCount }} scripts

Secrets

Manage environment variables and API keys

Changes to secrets require a server restart to take effect. A backup is created automatically.
{{ secretsError }}
{{ secretsSuccess }}

{{ groupName }}

Set Not set Modified
{{ secret.key }}

Playground

Test your LLM wrapper with custom requests

Request

Response

Served from cache
{{ playgroundResponse.content || '(empty)' }}
{{ JSON.stringify(playgroundResponse.tool_calls, null, 2) }}
Send a request to see the response

Cache

Monitor and manage the Redis cache

Hits
{{ cacheStats.stats?.hits || 0 }}
Misses
{{ cacheStats.stats?.misses || 0 }}
Hit Rate
{{ calculateHitRate(cacheStats.stats) }}%
Redis Memory
{{ formatBytes(cacheStats.stats?.totalSize || 0) }}

Status

Cache
{{ cacheStats.enabled ? 'Enabled' : 'Disabled' }}
Redis
{{ cacheStats.healthy ? 'Connected' : 'Disconnected' }}
Evictions
{{ cacheStats.stats?.evictions || 0 }}
Est. Savings
${{ (cacheStats.stats?.costSavings?.estimatedDollars || 0).toFixed(4) }}

How caching works

Responses are cached when all conditions are met:

  • Request temperature ≤ 0.1 (deterministic)
  • Response size ≤ 100KB
  • Cache is enabled in config

Hit/miss counters reset on server restart.

Logs

Real-time server log viewer

Live — polling every 2s · {{ logs.length }} entries
{{ formatLogTime(log.time) }} {{ log.levelLabel }} {{ log.name || '—' }} {{ log.msg }}
No log entries match your filters

Configuration

Edit the server configuration file

Changes require a server restart. A backup is created automatically.

config/default.yaml

{{ configError }}
{{ configSuccess }}

Quick View

Port
{{ parsedConfig.server?.port || 'N/A' }}
Default Provider
{{ parsedConfig.llm?.defaultProvider || 'N/A' }}
Cache
{{ parsedConfig.cache?.enabled ? 'Enabled' : 'Disabled' }}
Skills
{{ parsedConfig.skills?.enabled ? 'Enabled' : 'Disabled' }}

Users

Manage dashboard access

Username Role Created Last Login Actions
{{ u.username }} {{ u.role }} {{ formatDate(u.created_at) }} {{ u.last_login ? formatDate(u.last_login) : 'Never' }} You Protected

Create User