Waymore Docs
Step-by-step tutorials to help you get the most out of LLM Portal.
Create your account and start chatting with AI in under 5 minutes.
Go to https://chat.waymore.ai/register and create your account using email, Google, or GitHub.
Check your inbox for a verification email and click the link to activate your account. If you signed up with Google or GitHub, this step is automatic.
After signing in, you will see the chat interface. Type a message in the input box and press Enter. The AI will respond in real-time with streaming text.
Try attaching a file to your message, creating a new chat session from the sidebar, or enabling two-factor authentication in your profile settings.
Generate an API key and send your first chat completion request programmatically.
Navigate to your API Keys page in the dashboard. Click "Create New Key" and give it a descriptive name.
| 1 | { |
| 2 | "name": "My First API Key", |
| 3 | "permissions": ["chat"] |
| 4 | } |
Important: Copy the API key immediately. It will only be shown once.
Use cURL or any HTTP client to send a chat completion request:
| 1 | curl https://chat.waymore.ai/api/chat/completions \ |
| 2 | -H "Authorization: Bearer YOUR_API_KEY" \ |
| 3 | -H "Content-Type: application/json" \ |
| 4 | -d '{ |
| 5 | "model": "Waymore-A1-Instruct-1011", |
| 6 | "messages": [ |
| 7 | {"role": "system", "content": "You are a helpful assistant."}, |
| 8 | {"role": "user", "content": "What is machine learning?"} |
| 9 | ] |
| 10 | }' |
The response follows the OpenAI-compatible format. The assistant's message is in choices[0].message.content:
| 1 | { |
| 2 | "id": "chatcmpl-abc123", |
| 3 | "model": "Waymore-A1-Instruct-1011", |
| 4 | "choices": [ |
| 5 | { |
| 6 | "message": { |
| 7 | "role": "assistant", |
| 8 | "content": "Machine learning is a subset of artificial intelligence..." |
| 9 | }, |
| 10 | "finish_reason": "stop" |
| 11 | } |
| 12 | ], |
| 13 | "usage": { |
| 14 | "prompt_tokens": 25, |
| 15 | "completion_tokens": 150, |
| 16 | "total_tokens": 175 |
| 17 | } |
| 18 | } |
The usage field in the response shows token consumption. Monitor your overall usage from the dashboard or via the /api/usage/summary endpoint.
LLM Portal provides an OpenAI-compatible API. If you are using the OpenAI SDK or REST API, you can switch with minimal code changes.
The following are fully compatible — no code changes needed for these:
messages, model, stream, temperaturechoices, usage, finish_reasontools, tool_choice, parallel tool calls)system, user, assistant, toolReplace the OpenAI base URL with the LLM Portal endpoint:
| 1 | curl https://api.openai.com/v1/chat/completions \ |
| 2 | -H "Authorization: Bearer sk-openai-key..." \ |
| 3 | -H "Content-Type: application/json" \ |
| 4 | -d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}]}' |
| 1 | curl https://chat.waymore.ai/api/chat/completions \ |
| 2 | -H "Authorization: Bearer YOUR_API_KEY" \ |
| 3 | -H "Content-Type: application/json" \ |
| 4 | -d '{"model": "Waymore-A1-Instruct-1011", "messages": [{"role": "user", "content": "Hello"}]}' |
If you use the OpenAI Python or Node.js SDK, override the base_url and api_key:
| 1 | from openai import OpenAI |
| 2 | |
| 3 | client = OpenAI( |
| 4 | base_url="https://chat.waymore.ai/api", |
| 5 | api_key="YOUR_API_KEY" |
| 6 | ) |
| 7 | |
| 8 | response = client.chat.completions.create( |
| 9 | model="Waymore-A1-Instruct-1011", |
| 10 | messages=[{"role": "user", "content": "Hello"}] |
| 11 | ) |
| 1 | import OpenAI from "openai"; |
| 2 | |
| 3 | const client = new OpenAI({ |
| 4 | baseURL: "https://chat.waymore.ai/api", |
| 5 | apiKey: "YOUR_API_KEY" |
| 6 | }); |
| 7 | |
| 8 | const response = await client.chat.completions.create({ |
| 9 | model: "Waymore-A1-Instruct-1011", |
| 10 | messages: [{ role: "user", content: "Hello" }] |
| 11 | }); |
Replace OpenAI model names (gpt-4o, gpt-4-turbo, gpt-3.5-turbo) with Waymore-A1-Instruct-1011. Use the /api/chat/models endpoint to list all available models.
https://chat.waymore.ai/apiWaymore-A1-Instruct-1011LLM Portal natively supports the Anthropic Claude API format. You can use Claude-style requests — including the system field, input_schema tool definitions, and tool_result messages — with no format conversion. The API auto-detects the format and responds accordingly.
The only changes required are the URL, auth header, and model name. Your existing request body works as-is:
| 1 | curl https://api.anthropic.com/v1/messages \ |
| 2 | -H "x-api-key: sk-ant-..." \ |
| 3 | -H "anthropic-version: 2023-06-01" \ |
| 4 | -H "Content-Type: application/json" \ |
| 5 | -d '{ |
| 6 | "model": "claude-sonnet-4-5-20250929", |
| 7 | "max_tokens": 1024, |
| 8 | "system": "You are a helpful assistant.", |
| 9 | "messages": [{"role": "user", "content": "Hello"}] |
| 10 | }' |
| 1 | curl https://chat.waymore.ai/api/chat/completions \ |
| 2 | -H "Authorization: Bearer YOUR_API_KEY" \ |
| 3 | -H "Content-Type: application/json" \ |
| 4 | -d '{ |
| 5 | "model": "Waymore-A1-Instruct-1011", |
| 6 | "max_tokens": 1024, |
| 7 | "system": "You are a helpful assistant.", |
| 8 | "messages": [{"role": "user", "content": "Hello"}] |
| 9 | }' |
The API auto-detects the Anthropic format and responds in the same style. All of the following Claude features work without any conversion:
system field for system promptsinput_schematool_use content blockstool_result content blockscontent[], stop_reason, input_tokens/output_tokens)You can use Anthropic-style tool definitions directly. The API detects the format and returns tool calls in Anthropic style:
| 1 | { |
| 2 | "model": "Waymore-A1-Instruct-1011", |
| 3 | "max_tokens": 256, |
| 4 | "messages": [ |
| 5 | {"role": "user", "content": "What is the weather in Athens?"} |
| 6 | ], |
| 7 | "tools": [ |
| 8 | { |
| 9 | "name": "get_weather", |
| 10 | "description": "Get the current weather for a location", |
| 11 | "input_schema": { |
| 12 | "type": "object", |
| 13 | "properties": { |
| 14 | "location": {"type": "string"} |
| 15 | }, |
| 16 | "required": ["location"] |
| 17 | } |
| 18 | } |
| 19 | ] |
| 20 | } |
| 1 | { |
| 2 | "type": "message", |
| 3 | "role": "assistant", |
| 4 | "model": "Waymore-A1-Instruct-1011", |
| 5 | "content": [ |
| 6 | {"type": "text", "text": "I'll check the weather in Athens for you."}, |
| 7 | { |
| 8 | "type": "tool_use", |
| 9 | "id": "toolu_01bt6yap31yeflmplapypx4", |
| 10 | "name": "get_weather", |
| 11 | "input": {"location": "Athens, Greece"} |
| 12 | } |
| 13 | ], |
| 14 | "stop_reason": "tool_use", |
| 15 | "usage": {"input_tokens": 855, "output_tokens": 30} |
| 16 | } |
Send tool results back using the Anthropic tool_result content block:
| 1 | { |
| 2 | "model": "Waymore-A1-Instruct-1011", |
| 3 | "max_tokens": 256, |
| 4 | "messages": [ |
| 5 | {"role": "user", "content": "What is the weather in Athens?"}, |
| 6 | {"role": "assistant", "content": [ |
| 7 | {"type": "text", "text": "I'll check the weather in Athens for you."}, |
| 8 | {"type": "tool_use", "id": "toolu_01bt6yap31yeflmplapypx4", "name": "get_weather", "input": {"location": "Athens, Greece"}} |
| 9 | ]}, |
| 10 | {"role": "user", "content": [ |
| 11 | {"type": "tool_result", "tool_use_id": "toolu_01bt6yap31yeflmplapypx4", "content": "{"temperature": 22, "condition": "Sunny"}"} |
| 12 | ]} |
| 13 | ], |
| 14 | "tools": [...] |
| 15 | } |
| 1 | { |
| 2 | "type": "message", |
| 3 | "role": "assistant", |
| 4 | "content": [ |
| 5 | {"type": "text", "text": "The current weather in Athens is sunny with a temperature of 22°C (about 72°F)."} |
| 6 | ], |
| 7 | "stop_reason": "end_turn" |
| 8 | } |
If you use the Anthropic Python SDK, override the base_url and use your LLM Portal API key:
| 1 | import anthropic |
| 2 | |
| 3 | client = anthropic.Anthropic( |
| 4 | base_url="https://chat.waymore.ai/api", |
| 5 | api_key="YOUR_API_KEY" |
| 6 | ) |
| 7 | |
| 8 | response = client.messages.create( |
| 9 | model="Waymore-A1-Instruct-1011", |
| 10 | max_tokens=1024, |
| 11 | system="You are a helpful assistant.", |
| 12 | messages=[{"role": "user", "content": "Hello"}] |
| 13 | ) |
https://chat.waymore.ai/apiAuthorization: Bearer YOUR_API_KEYWaymore-A1-Instruct-1011anthropic-version header (not required)Enable real-time streaming to receive tokens as they are generated, reducing perceived latency.
Set stream: true in your request body:
| 1 | curl https://chat.waymore.ai/api/chat/completions \ |
| 2 | -H "Authorization: Bearer YOUR_API_KEY" \ |
| 3 | -H "Content-Type: application/json" \ |
| 4 | -d '{ |
| 5 | "model": "Waymore-A1-Instruct-1011", |
| 6 | "messages": [{"role": "user", "content": "Write a poem about coding."}], |
| 7 | "stream": true |
| 8 | }' |
The response is a Server-Sent Events (SSE) stream. Each event contains a JSON chunk with the next token:
| 1 | data: {"id":"chatcmpl-abc123","choices":[{"delta":{"role":"assistant"},"index":0}]} |
| 2 | |
| 3 | data: {"id":"chatcmpl-abc123","choices":[{"delta":{"content":"In"},"index":0}]} |
| 4 | |
| 5 | data: {"id":"chatcmpl-abc123","choices":[{"delta":{"content":" lines"},"index":0}]} |
| 6 | |
| 7 | data: {"id":"chatcmpl-abc123","choices":[{"delta":{"content":" of"},"index":0}]} |
| 8 | |
| 9 | data: {"id":"chatcmpl-abc123","choices":[{"delta":{"content":" code"},"index":0}]} |
| 10 | |
| 11 | data: [DONE] |
Each delta.content field contains a text fragment. Concatenate all fragments to build the complete response. The stream ends with data: [DONE].
Give the model the ability to call custom functions, enabling it to fetch real-time data, interact with external services, or perform calculations. The API supports both OpenAI and Anthropic tool formats — the format is auto-detected from your request.
input_schema, tool_use / tool_result content blocks), see the Migrate from Claude guide or the API Reference for full examples of both formats.Create a tool definition describing your function's name, purpose, and parameters using JSON Schema:
| 1 | { |
| 2 | "type": "function", |
| 3 | "function": { |
| 4 | "name": "get_weather", |
| 5 | "description": "Get the current weather for a given location", |
| 6 | "parameters": { |
| 7 | "type": "object", |
| 8 | "properties": { |
| 9 | "location": { |
| 10 | "type": "string", |
| 11 | "description": "The city and country, e.g. Athens, Greece" |
| 12 | }, |
| 13 | "unit": { |
| 14 | "type": "string", |
| 15 | "enum": ["celsius", "fahrenheit"], |
| 16 | "description": "Temperature unit" |
| 17 | } |
| 18 | }, |
| 19 | "required": ["location"] |
| 20 | } |
| 21 | } |
| 22 | } |
Tip: Write clear descriptions for both the function and each parameter. This helps the model decide when and how to use the tool.
Include the tools array and set tool_choice in your completion request:
| 1 | curl https://chat.waymore.ai/api/chat/completions \ |
| 2 | -H "Authorization: Bearer YOUR_API_KEY" \ |
| 3 | -H "Content-Type: application/json" \ |
| 4 | -d '{ |
| 5 | "model": "Waymore-A1-Instruct-1011", |
| 6 | "messages": [ |
| 7 | {"role": "user", "content": "What is the weather in Athens, Greece?"} |
| 8 | ], |
| 9 | "tools": [ |
| 10 | { |
| 11 | "type": "function", |
| 12 | "function": { |
| 13 | "name": "get_weather", |
| 14 | "description": "Get the current weather for a given location", |
| 15 | "parameters": { |
| 16 | "type": "object", |
| 17 | "properties": { |
| 18 | "location": {"type": "string"}, |
| 19 | "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]} |
| 20 | }, |
| 21 | "required": ["location"] |
| 22 | } |
| 23 | } |
| 24 | } |
| 25 | ], |
| 26 | "tool_choice": "auto" |
| 27 | }' |
When the model wants to use a tool, the response has finish_reason: "tool_calls" and includes a tool_calls array:
| 1 | { |
| 2 | "choices": [ |
| 3 | { |
| 4 | "message": { |
| 5 | "role": "assistant", |
| 6 | "content": "I'll check the current weather in Athens, Greece for you.", |
| 7 | "tool_calls": [ |
| 8 | { |
| 9 | "id": "functions.get_weather:0", |
| 10 | "type": "function", |
| 11 | "function": { |
| 12 | "name": "get_weather", |
| 13 | "arguments": "{"location": "Athens, Greece"}" |
| 14 | } |
| 15 | } |
| 16 | ] |
| 17 | }, |
| 18 | "finish_reason": "tool_calls" |
| 19 | } |
| 20 | ] |
| 21 | } |
Parse the arguments field (it's a JSON string) and execute your function with those parameters.
Run your function using the arguments the model provided. In this example, you would call your weather API with location: "Athens, Greece" and get back the current conditions.
Send the function result back to the model in a follow-up request. Include the full conversation history plus a tool role message with the matching tool_call_id:
| 1 | { |
| 2 | "model": "Waymore-A1-Instruct-1011", |
| 3 | "messages": [ |
| 4 | {"role": "user", "content": "What is the weather in Athens, Greece?"}, |
| 5 | { |
| 6 | "role": "assistant", |
| 7 | "content": "I'll check the current weather in Athens, Greece for you.", |
| 8 | "tool_calls": [{ |
| 9 | "id": "functions.get_weather:0", |
| 10 | "type": "function", |
| 11 | "function": { |
| 12 | "name": "get_weather", |
| 13 | "arguments": "{"location": "Athens, Greece"}" |
| 14 | } |
| 15 | }] |
| 16 | }, |
| 17 | { |
| 18 | "role": "tool", |
| 19 | "tool_call_id": "functions.get_weather:0", |
| 20 | "content": "{"temperature": 18, "unit": "celsius", "condition": "Partly cloudy"}" |
| 21 | } |
| 22 | ], |
| 23 | "tools": [...] |
| 24 | } |
The model uses the tool result to generate a natural language answer:
| 1 | { |
| 2 | "choices": [ |
| 3 | { |
| 4 | "message": { |
| 5 | "role": "assistant", |
| 6 | "content": "In Athens, Greece it's currently partly cloudy with a temperature of 18°C — quite pleasant conditions overall." |
| 7 | }, |
| 8 | "finish_reason": "stop" |
| 9 | } |
| 10 | ] |
| 11 | } |
The model can call multiple tools in one response (e.g., fetching weather for two cities at once). Each call has a unique id. Execute all functions and submit all results as separate tool messages before making the next request.
"auto" (default) — model decides. "none" — never call tools. "required" — must call at least one tool.
Organize conversations into sessions to maintain context and history.
Create a named session to group related messages:
| 1 | curl -X POST https://chat.waymore.ai/api/chat/sessions \ |
| 2 | -H "Authorization: Bearer YOUR_API_KEY" \ |
| 3 | -H "Content-Type: application/json" \ |
| 4 | -d '{ |
| 5 | "title": "Project Research", |
| 6 | "model": "Waymore-A1-Instruct-1011" |
| 7 | }' |
| 1 | { |
| 2 | "id": "clx_session_abc123", |
| 3 | "title": "Project Research", |
| 4 | "model": "Waymore-A1-Instruct-1011", |
| 5 | "messages": [] |
| 6 | } |
Include the session_id in your completion request to associate it with the session:
| 1 | { |
| 2 | "model": "Waymore-A1-Instruct-1011", |
| 3 | "messages": [ |
| 4 | {"role": "user", "content": "Summarize the latest trends in AI."} |
| 5 | ], |
| 6 | "session_id": "clx_session_abc123" |
| 7 | } |
List all messages in a session to review the conversation history:
| 1 | curl https://chat.waymore.ai/api/chat/sessions/clx_session_abc123/messages \ |
| 2 | -H "Authorization: Bearer YOUR_API_KEY" |
Rename a session with PATCH or delete it entirely. Deleting a session removes all its messages.
| 1 | # Rename a session |
| 2 | curl -X PATCH https://chat.waymore.ai/api/chat/sessions/clx_session_abc123 \ |
| 3 | -H "Authorization: Bearer YOUR_API_KEY" \ |
| 4 | -H "Content-Type: application/json" \ |
| 5 | -d '{"title": "AI Research 2025"}' |
| 6 | |
| 7 | # Delete a session |
| 8 | curl -X DELETE https://chat.waymore.ai/api/chat/sessions/clx_session_abc123 \ |
| 9 | -H "Authorization: Bearer YOUR_API_KEY" |
Secure your API keys and follow best practices for production deployments.
Create separate API keys for development, staging, and production. This limits the blast radius if a key is compromised and makes it easy to revoke access for a single environment.
Only grant the permissions each key actually needs. A key used only for chat completions should not have image or vision permissions:
| 1 | { |
| 2 | "name": "Chat Only Key", |
| 3 | "permissions": ["chat"], |
| 4 | "rpmLimit": 30 |
| 5 | } |
For production keys, restrict access to your server's IP addresses:
| 1 | { |
| 2 | "name": "Production Server", |
| 3 | "permissions": ["chat", "vision"], |
| 4 | "ipWhitelist": ["203.0.113.10", "203.0.113.11"], |
| 5 | "monthlyLimit": 500000 |
| 6 | } |
Configure rate limits to prevent runaway costs and set expiration dates for temporary access. Use rpmLimit for requests per minute, dailyLimit and monthlyLimit for token caps, and expiresInDays for auto-expiration.
Regenerate API key secrets periodically. The regenerate endpoint gives you a new secret while keeping the same configuration:
| 1 | curl -X POST https://chat.waymore.ai/api/keys/YOUR_KEY_ID/regenerate \ |
| 2 | -H "Authorization: Bearer YOUR_API_KEY" |
Note: The old key secret is immediately invalidated. Update your applications before or immediately after regenerating.
Regularly review each key's usage to detect anomalies:
| 1 | # Check usage for a specific key |
| 2 | curl "https://chat.waymore.ai/api/keys/YOUR_KEY_ID/usage?days=7" \ |
| 3 | -H "Authorization: Bearer YOUR_API_KEY" |
| 4 | |
| 5 | # Check request history |
| 6 | curl "https://chat.waymore.ai/api/keys/YOUR_KEY_ID/requests?limit=20" \ |
| 7 | -H "Authorization: Bearer YOUR_API_KEY" |
Attach files to your chat messages for the AI to analyze, summarize, or extract information from.
Upload the file using the attachments endpoint. This returns a file URL you can reference in a message:
| 1 | curl -X POST https://chat.waymore.ai/api/chat/attachments \ |
| 2 | -H "Authorization: Bearer YOUR_API_KEY" \ |
| 3 | -F "files=@report.pdf" |
Include the attachment metadata when creating a message:
| 1 | { |
| 2 | "sessionId": "clx_session_abc123", |
| 3 | "role": "user", |
| 4 | "content": "Summarize the key points from this report.", |
| 5 | "model": "Waymore-A1-Instruct-1011", |
| 6 | "attachments": [ |
| 7 | { |
| 8 | "name": "report.pdf", |
| 9 | "type": "application/pdf", |
| 10 | "size": 245000, |
| 11 | "url": "/uploads/abc123/report.pdf" |
| 12 | } |
| 13 | ] |
| 14 | } |
Each file can be up to 50MB. You can attach up to 5 files per message. Supported formats include images (PNG, JPG, GIF, WebP), documents (PDF, DOC, DOCX, TXT), data files (CSV, JSON, XML), and code files.
Save content from conversations and organize it into collections for easy retrieval.
Save images, code snippets, notes, or any valuable content from your conversations:
| 1 | { |
| 2 | "title": "Python Data Processing Script", |
| 3 | "type": "CODE", |
| 4 | "content": "import pandas as pd\n\ndf = pd.read_csv('data.csv')\nresult = df.groupby('category').sum()", |
| 5 | "description": "Pandas script for aggregating data by category", |
| 6 | "tags": ["python", "pandas", "data"] |
| 7 | } |
Group related items into a collection with a custom name and color:
| 1 | { |
| 2 | "name": "Data Science", |
| 3 | "description": "Code snippets and notes for data analysis", |
| 4 | "color": "#8B5CF6", |
| 5 | "icon": "database" |
| 6 | } |
Add content items to your new collection:
| 1 | curl -X POST "https://chat.waymore.ai/api/collections/COLLECTION_ID/items" \ |
| 2 | -H "Authorization: Bearer YOUR_API_KEY" \ |
| 3 | -H "Content-Type: application/json" \ |
| 4 | -d '{"itemId": "CONTENT_ITEM_ID"}' |
Use powerful search and filtering to find content:
| 1 | # Search by keyword |
| 2 | curl "https://chat.waymore.ai/api/stuff?search=pandas&type=CODE" \ |
| 3 | -H "Authorization: Bearer YOUR_API_KEY" |
| 4 | |
| 5 | # Filter by collection |
| 6 | curl "https://chat.waymore.ai/api/stuff?collectionId=COLLECTION_ID&sortBy=newest" \ |
| 7 | -H "Authorization: Bearer YOUR_API_KEY" |
| 8 | |
| 9 | # Get only favorites |
| 10 | curl "https://chat.waymore.ai/api/stuff?favorite=true&limit=10" \ |
| 11 | -H "Authorization: Bearer YOUR_API_KEY" |
Track your API consumption, costs, and performance to stay within budget.
Query the usage summary endpoint for an overview of your consumption:
| 1 | curl "https://chat.waymore.ai/api/usage/summary?period=30d" \ |
| 2 | -H "Authorization: Bearer YOUR_API_KEY" |
| 1 | { |
| 2 | "stats": { |
| 3 | "totalRequests": 1250, |
| 4 | "totalTokens": 320000, |
| 5 | "inputTokens": 120000, |
| 6 | "outputTokens": 200000, |
| 7 | "totalCost": 4.85, |
| 8 | "avgResponseTime": 920, |
| 9 | "errorRate": 0.8 |
| 10 | } |
| 11 | } |
Narrow down usage data using query parameters:
| 1 | # Filter by model |
| 2 | curl "https://chat.waymore.ai/api/usage/summary?period=7d&model=Waymore-A1-Instruct-1011" \ |
| 3 | -H "Authorization: Bearer YOUR_API_KEY" |
| 4 | |
| 5 | # Get available filter options |
| 6 | curl "https://chat.waymore.ai/api/usage/filters" \ |
| 7 | -H "Authorization: Bearer YOUR_API_KEY" |
The usage summary includes a cost breakdown by token type (input vs output) and by model. Use this to understand where your budget is going and optimize your prompts for cost efficiency.
Monitor individual API keys to track which integrations consume the most tokens:
| 1 | # Per-key usage |
| 2 | curl "https://chat.waymore.ai/api/keys/KEY_ID/usage?days=7" \ |
| 3 | -H "Authorization: Bearer YOUR_API_KEY" |
| 4 | |
| 5 | # Per-key request history |
| 6 | curl "https://chat.waymore.ai/api/keys/KEY_ID/requests?limit=10" \ |
| 7 | -H "Authorization: Bearer YOUR_API_KEY" |