Interpretos Local is an AI copilot for enterprise applications. It connects to Oracle E-Business Suite, PeopleSoft, and IBM Maximo and lets users query their systems using natural language.
This guide covers everything an administrator needs to install, configure, operate, and extend their Interpretos Local instance.
On first launch, a 6-step wizard guides you through initial configuration.
Choose one of three paths:
Create the first administrator account.
Choose the LLM that powers your chat experience.
| Provider | API Key Required | Recommended Model | Notes |
|---|---|---|---|
| Interpretos Cloud | No | Automatic | Free tier, 100 queries/day, no configuration |
| Google Gemini | Yes | gemini-3-flash-preview | Get key at aistudio.google.com/apikey |
| OpenAI | Yes | gpt-4.1-mini | Get key at platform.openai.com/api-keys |
| Anthropic | Yes | claude-sonnet-4-6 | Get key at console.anthropic.com |
| Custom / Self-hosted | Yes | Varies | Any OpenAI-compatible endpoint (Ollama, vLLM, LiteLLM) |
For self-hosted models, provide the base URL (e.g., http://localhost:11434/v1 for Ollama).
Click Test Connection to verify before proceeding.
Connect to your enterprise systems. You can configure one or more integrations.
Direct Database Mode (recommended — 1-3 second queries):
SSH Tunnel Mode (11-17 second queries):
-----BEGIN RSA PRIVATE KEY-----)/u01/app/oracle/product/12.1.0)Common issues:
ssh-keygen -p -m PEM -f your_keyecho $ORACLE_HOME on the database server to find ittelnet host port$ORACLE_HOME/network/admin/tnsnames.ora on the DB serverConnects via SSH tunnel to Oracle database (no direct mode).
/opt/oracle/psft/db/oracle-server/19.3.0.0PeopleSoft uses CDB/PDB architecture. The PDB name is critical — it's set via ALTER SESSION SET CONTAINER before any query. If you're unsure, ask your DBA for the PDB name or run SELECT name FROM v$pdbs on the CDB.
Connects via REST API (OSLC interface).
/maximo (e.g., https://maximo.example.com/maximo)Common issues:
/maximo, not /maximo/api or just the hostnameEnable anonymous aggregate metrics to help improve the product.
/app/data/telemetry_audit.jsonl for your auditSummary of all settings. Click Complete Setup to finish.
Access the admin panel by clicking the gear icon in the header bar. Eight tabs provide full administrative control.
Manage system users and their roles.
Adding users:
User actions:
Roles:
| Role | Chat | Own Preferences | Admin Panel | Manage Users |
|---|---|---|---|---|
| user | Yes | Yes | No | No |
| admin | Yes | Yes | Yes | Yes |
Map each user to their identity in each enterprise system. This controls what data they see through role-based access control (RBAC).
How RBAC works: When user "jsmith" sends a chat query, Interpretos uses jsmith's personal credentials (not the admin's) to query the enterprise system. If jsmith's Oracle account is restricted to the BEDFORD site, they'll only see BEDFORD data.
Setting credentials:
If no per-user credentials are set, the user inherits the global admin connection — meaning they see ALL data. For security, configure per-user credentials for restricted users.
Credential fields by integration:
| Integration | Key Fields |
|---|---|
| EBS | SSH host/user/key, DB user/password/service, Oracle Home, RBAC username |
| PeopleSoft | SSH host/user/key, DB user/password/service, PDB name, RBAC username |
| Maximo | Auth type, API base URL, API key or username/password |
Generate programmatic API keys for automation, bots, and integrations.
Creating a key:
Using API keys:
# Via X-API-Key header
curl -X POST http://localhost:8080/api/chat \
-H "Content-Type: application/json" \
-H "X-API-Key: ik_your_key_here" \
-d '{"message": "How many open work orders are there?"}'
# Via Authorization header
curl -X POST http://localhost:8080/api/chat \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ik_your_key_here" \
-d '{"message": "Show me overdue POs"}'
Full API documentation is available at /api/docs (interactive Swagger UI).
Change the LLM provider after setup. Same options as setup step 2. Always test before saving.
Extra Parameters: Optional JSON object passed directly to the chat LLM API call. Use this for provider-specific tuning:
| Provider | Example | Effect |
|---|---|---|
| Google Gemini | {"thinking_budget": 0} | Disables thinking mode for faster responses |
| Google Gemini | {"thinking_level": "minimal"} | Minimal thinking |
| OpenAI | {"reasoning": {"effort": "low"}} | Low reasoning effort for GPT-5.x |
| Ollama | {"num_ctx": 8192} | Sets context window size |
Configure an optional separate, faster LLM for pattern selection (the step that picks which knowledge pattern to use before answering).
Click the "Pattern Selection LLM" section header to expand, enable the checkbox, configure, test, and save.
Extra Parameters: Optional JSON object passed directly to the LLM API call. Use this for provider-specific tuning without code changes:
| Provider | Example | Effect |
|---|---|---|
| Google Gemini | {"thinking_budget": 0} | Disables thinking mode (prevents 26s+ delays on Gemini 3 Flash) |
| Google Gemini | {"thinking_level": "minimal"} | Minimal thinking (alternative to budget=0) |
| OpenAI | {"reasoning": {"effort": "none"}} | Disables reasoning for GPT-5.x models |
| Ollama | {"num_ctx": 4096} | Sets context window size |
Pattern selection doesn't need reasoning/thinking — it's a simple pattern-matching task. If using a model with built-in thinking (Gemini 3 Flash, GPT-5.4 Thinking), disable it here for dramatically faster responses (26s to 2s in testing).
Update EBS, PeopleSoft, or Maximo connection settings. Same fields as setup step 3.
Set admin-wide default context for all users on a specific integration.
Examples:
Select the integration from the dropdown, write instructions (max 1000 characters), and save. Users can also set their own personal instructions via the Preferences button in the chat header.
Re-runs the guided setup. Preserves your license and user accounts but lets you reconfigure AI provider and integration connections.
Create custom patterns to teach the chatbot queries specific to your environment. Custom patterns extend the built-in knowledge without affecting it.
Click + New Pattern and fill in:
Click Save Pattern. The chatbot immediately starts using the new pattern — no restart needed.
Click Test on any pattern, enter a sample question, and click Run Test. The system sends the query through the full chatbot pipeline and shows:
| Action | Description |
|---|---|
| Enable/Disable | Toggle a pattern on or off without deleting it. Disabled patterns are ignored by the chatbot. |
| Edit | Modify any field. Test status resets after edits. |
| Clone | Duplicate a pattern — useful for creating variations (e.g., same query for a different entity). |
| Export | Download a single pattern as JSON for backup or sharing with another instance. |
| Delete | Permanently remove a pattern and its data. |
Custom patterns are stored on the persistent data volume (/app/data/custom_patterns/) and survive container restarts and upgrades.
Check for and install updates.
View and manage your product license.
Health monitoring, debugging, and audit trail for compliance.
Click Test All Connections to validate every configured service (LLM provider, databases, APIs). Green/red indicators show what's working.
Toggle between INFO (normal) and DEBUG (verbose) log levels. Enable DEBUG when troubleshooting specific issues, then disable it — verbose logs consume more disk space.
View recent server errors with timestamps, details, and stack traces. Useful for diagnosing connection failures or LLM errors.
Every query sent to connected enterprise systems is logged here — SQL statements for EBS/PeopleSoft, API calls for Maximo. Stored at /app/data/query_audit.jsonl.
Use this for: security audits, compliance reviews, debugging incorrect query results, and understanding what the AI is actually asking your systems.
Download a diagnostic package to attach to support tickets. This bundle is privacy-safe: it excludes credentials, SQL text, conversation content, and usernames. It contains system info, connectivity results, error summaries, and anonymized metrics.
Interpretos Local exposes a full REST API. Interactive documentation is available at /api/docs (Swagger UI) and the OpenAPI spec at /api/docs/openapi.yaml.
Two methods:
POST /api/auth/login with {"username": "...", "password": "..."} — returns a token. Use as Authorization: Bearer .X-API-Key: ik_xxx or Authorization: Bearer ik_xxx.| Endpoint | Method | Description |
|---|---|---|
/api/chat | POST | Send a message, get full response |
/api/chat/stream | POST | Send a message, get SSE streaming response |
/api/chat/cancel | POST | Cancel an in-progress query |
/api/reset | POST | Clear conversation state |
/api/conversations | GET | List all conversations |
/api/conversations | POST | Create new conversation |
/api/conversations/{id} | GET | Get conversation history |
/api/conversations/{id} | DELETE | Delete a conversation |
/api/status | GET | Session status (model, integrations, RAG mode) |
/api/health | GET | Health check (200 OK) |
/api/version | GET | Container version |
/api/integrations | GET | List available integrations |
| Endpoint | Method | Description |
|---|---|---|
/api/admin/users | GET | List all users |
/api/admin/users | POST | Create user |
/api/admin/users/{username} | DELETE | Delete user |
/api/admin/users/{username}/password | PUT | Reset password |
/api/users/{username}/credentials/{integration} | PUT | Set per-user credentials |
/api/users/{username}/credentials/{integration} | GET | Get per-user credentials |
/api/admin/api-keys | GET | List API keys |
/api/admin/api-keys | POST | Create API key |
/api/admin/api-keys/{id} | DELETE | Revoke API key |
/api/admin/settings | GET | Get all settings |
/api/admin/settings/llm | PUT | Update LLM provider |
/api/admin/settings/ebs | PUT | Update EBS connection |
/api/admin/settings/peoplesoft | PUT | Update PeopleSoft connection |
/api/admin/patterns/custom | GET | List custom patterns |
/api/admin/patterns/custom | POST | Create custom pattern |
/api/admin/patterns/custom/{id} | GET | Get pattern details |
/api/admin/patterns/custom/{id} | PUT | Update pattern |
/api/admin/patterns/custom/{id} | DELETE | Delete pattern |
/api/admin/patterns/custom/{id}/test | POST | Test pattern with a query |
/api/admin/patterns/custom/{id}/toggle | PUT | Enable/disable pattern |
/api/admin/patterns/custom/{id}/duplicate | POST | Clone pattern |
/api/admin/patterns/custom/{id}/export | GET | Export single pattern (JSON) |
/api/admin/patterns/custom/export | GET | Export all patterns (JSON bundle) |
/api/admin/patterns/custom/import | POST | Import patterns from JSON |
/api/admin/diagnostics/test-connections | POST | Test all connections |
/api/admin/diagnostics/errors | GET | Recent errors |
/api/admin/diagnostics/export | GET | Download support bundle |
/api/admin/audit/queries | GET | Query audit log |
/api/admin/audit/telemetry | GET | Telemetry transmission log |
These recipes show how to use the REST API to automate common administrative tasks. All examples use Python with the requests library.
import csv
import requests
BASE = "http://localhost:8080"
HEADERS = {"X-API-Key": "ik_your_admin_key", "Content-Type": "application/json"}
with open("users.csv") as f:
for row in csv.DictReader(f): # columns: username, display_name, password, role
resp = requests.post(f"{BASE}/api/admin/users", headers=HEADERS, json={
"username": row["username"],
"display_name": row["display_name"],
"password": row["password"],
"role": row.get("role", "user")
})
print(f"{row['username']}: {resp.json().get('status', resp.status_code)}")
CSV format:
username,display_name,password,role
jsmith,Jane Smith,Welcome123!,user
mbrown,Mike Brown,Welcome123!,user
admin2,Senior Admin,SecurePass!,admin
import csv
import requests
BASE = "http://localhost:8080"
HEADERS = {"X-API-Key": "ik_your_admin_key", "Content-Type": "application/json"}
with open("credentials.csv") as f:
for row in csv.DictReader(f): # columns: username, db_user, db_password, ...
resp = requests.put(
f"{BASE}/api/users/{row['username']}/credentials/oracle_ebs",
headers=HEADERS,
json={
"EBS_DB_USER": row["db_user"],
"EBS_DB_PASSWORD": row["db_password"],
"EBS_DB_SERVICE": row.get("db_service", "VIS"),
"username": row.get("ebs_username", row["username"])
}
)
print(f"{row['username']}: {resp.json().get('status', resp.status_code)}")
import requests
import smtplib
from email.mime.text import MIMEText
BASE = "http://localhost:8080"
HEADERS = {"X-API-Key": "ik_your_admin_key"}
# Check health
health = requests.get(f"{BASE}/api/health")
if health.status_code != 200:
# Send alert email
msg = MIMEText(f"Interpretos health check failed: {health.status_code}")
msg["Subject"] = "ALERT: Interpretos Down"
msg["From"] = "monitoring@company.com"
msg["To"] = "admin@company.com"
with smtplib.SMTP("smtp.company.com") as s:
s.send_message(msg)
# Test all connections
conns = requests.post(f"{BASE}/api/admin/diagnostics/test-connections", headers=HEADERS)
for result in conns.json().get("results", []):
if result.get("status") != "ok":
print(f"FAILED: {result['name']} - {result.get('error', 'unknown')}")
import requests
BASE = "http://localhost:8080"
HEADERS = {"X-API-Key": "ik_reports_user_key", "Content-Type": "application/json"}
questions = [
"How many purchase orders were approved this week?",
"Show me the top 5 vendors by PO spend this month",
"Are there any overdue work orders?"
]
for q in questions:
resp = requests.post(f"{BASE}/api/chat", headers=HEADERS, json={"message": q})
data = resp.json()
print(f"\nQ: {q}")
print(f"A: {data.get('response', data.get('message', 'No response'))}")
# Reset conversation for next run
requests.post(f"{BASE}/api/reset", headers=HEADERS)
import requests
BASE = "http://localhost:8080"
HEADERS = {"X-API-Key": "ik_your_admin_key"}
username = "departing_user"
resp = requests.delete(f"{BASE}/api/admin/users/{username}", headers=HEADERS)
print(f"Deleted {username}: {resp.json()}")
# This removes the user account, all their credentials, API keys, and chat history
import requests
BASE = "http://localhost:8080"
HEADERS = {"X-API-Key": "ik_your_admin_key", "Content-Type": "application/json"}
# Create a custom pattern for EBS employee lookup
resp = requests.post(f"{BASE}/api/admin/patterns/custom", headers=HEADERS, json={
"integration": "oracle_ebs",
"description": "Employee lookup by employee number",
"query_type": "sql",
"query": "SELECT employee_number, full_name, email_address FROM per_all_people_f WHERE employee_number = :emp_num AND SYSDATE BETWEEN effective_start_date AND effective_end_date",
"example_questions": ["Who is employee 12345?", "Show employee details for 67890"],
"entity_types": ["employee", "person", "hr"],
"tables": ["PER_ALL_PEOPLE_F"]
})
print(f"Created: {resp.json()['pattern']['pattern_id']}")
# Export all patterns for backup
resp = requests.get(f"{BASE}/api/admin/patterns/custom/export", headers=HEADERS)
with open("patterns_backup.json", "w") as f:
f.write(resp.text)
print(f"Exported {resp.json()['count']} patterns")
import requests
import json
BASE = "http://localhost:8080"
HEADERS = {"X-API-Key": "ik_your_admin_key"}
# Get query audit log
audit = requests.get(f"{BASE}/api/admin/audit/queries", headers=HEADERS)
entries = audit.json().get("entries", [])
# Write to file for compliance archive
with open(f"query_audit_export.jsonl", "w") as f:
for entry in entries:
f.write(json.dumps(entry) + "\n")
print(f"Exported {len(entries)} audit entries")
-----BEGIN RSA PRIVATE KEY-----)ssh-keygen -p -m PEM -f your_keyCDDI_SECRET_KEY environment variable rather than relying on the auto-generated filetelnet 22 -----BEGIN RSA PRIVATE KEY-----)ssh -i key.pem user@hostecho $ORACLE_HOME on the servertnsnames.ora on the DB server or ask your DBASELECT account_status FROM dba_users WHERE username = 'YOUR_USER'GRANT SET CONTAINER TO your_userSELECT name FROM v$pdbs (run as SYSDBA on the CDB)/maximo (not /maximo/api)telnet 443 (or 80 for HTTP){"thinking_budget": 0} — thinking mode is on by default and adds 20-50s of unnecessary delay/docs/terms/docs/privacy/docs/security/api/docs (interactive Swagger UI)/api/docs/openapi.yaml*Interpretos Local is developed by Code Development Limited. For support, visit interpretos.ai.*