n8n with UberLLM: cheaper AI Agent models and video generation
Create an n8n OpenAI credential with your UberLLM key and Base URL https://api.uberllm.dev/v1, use it in an OpenAI Chat Model node with "Use Responses API" turned off, and pick any UberLLM model. For video, call /v1/video/generations with the HTTP Request node and poll until the job ends.
Part 1: chat models in the AI Agent
- Make a key on your keys page and add credit.
- In n8n go to Credentials → Create credential → OpenAI.
- Fill in:
- API Key: your
ull_…key - Base URL:
https://api.uberllm.dev/v1Leave Organization ID empty. Save: n8n tests the credential by listing models, and it should pass.
- API Key: your
- In your workflow add an AI Agent node and, as its chat model, an OpenAI Chat Model node using that credential.
- In the OpenAI Chat Model node:
- Model: choose By ID and enter
deepseek/deepseek-v4.1-flash(or pick from the list, which now shows UberLLM's models) - Turn Use Responses API off. It is on by default in recent n8n versions. UberLLM serves the Responses API too, but this workflow was tested on chat completions.
- Model: choose By ID and enter
- Run the workflow.
The same credential works in the Basic LLM Chain and other nodes that take a chat model.
Use the AI Agent or Basic LLM Chain with the OpenAI Chat Model node, or the HTTP Request node below. The standalone "OpenAI" node's "Message a model" action always calls the Responses API, and its built-in tools (web search, file search) run only on OpenAI's own servers.
Part 2: make a video with HTTP Request
A video takes a minute or more, so it is a job: start it, wait, check, repeat until it is done.
Credential. Create a Bearer Auth credential with Bearer Token = your ull_… key. (Or pick the OpenAI credential from Part 1 under Predefined Credential Type; it sends the same header.)
Node 1, HTTP Request (start the job)
- Method: POST
- URL:
https://api.uberllm.dev/v1/video/generations - Authentication: Generic Credential Type → Bearer Auth
- Send Body: on, JSON:
{
"model": "fal-ai/vidu/q3/text-to-video/turbo",
"prompt": "a red ball bouncing on green grass, slow motion",
"duration_seconds": 5
}
The answer has the job id, status (queued) and estimated_cost_usd.
Node 2, Wait: Resume = After Time Interval, 10 seconds.
Node 3, HTTP Request (check the job)
- Method: GET
- URL:
https://api.uberllm.dev/v1/video/generations/{{ $('HTTP Request').item.json.id }}(use your first node's name) - Same Bearer Auth credential
Node 4, If: {{ $json.status }} is queued or running → connect back to the Wait node. Otherwise continue.
Node 5: when status is succeeded, the video link is in results[0].url. Download it with one more HTTP Request (GET, same credential, and under Options → Response set Response Format to File) or pass the link on. failed comes with error.message in plain words, and a failed job costs nothing.
Each model makes only certain lengths and sizes. If you ask for one it does not make, the first request is refused with a message listing what it does, before anything is charged. Every model's options are on its page.
Troubleshooting
- Credential test fails: Base URL must be
https://api.uberllm.dev/v1exactly; the key must have no spaces. - 404 from OpenAI Chat Model: the credential's Base URL is missing
/v1. - The agent never calls tools: pick a model from the first table; very small models skip tools.
- 400
wrong_endpoint: a video model was sent to the chat node, or a chat model to the video URL. - The loop never ends: the If node must compare
status, and the Wait must come before every check. - 402 insufficient credits: add credit on the credits page. A video holds its
max_cost_usdwhile it runs.
Keep reading
- Reference page: n8n doc, and ready-made n8n video workflows to import
- Make a video or image: every field
- Video API pricing