Real exports instead of guesses.
Generic coding AIs guess. They call ox_lib.notify_player(), they pass arguments to oxmysql:fetch() in the wrong order, they invent QBCore events that do not exist. SwisserAI writes from the real source of the libraries FiveM actually runs.
You paste less, you reread less, you spend less time explaining that no, that function has never shipped.
The ox_lib hallucination problem
Generic AI models like ChatGPT, Claude and Copilot are trained on the entire public internet. That includes ox_lib documentation, but it also includes every stale forum thread, every PR that never merged, every screenshot of someone's home-grown fork, and every Lua tutorial that confidently teaches a function that was renamed two releases ago.
The result: when you ask a generic model for a notification, it might give you ox_lib.notify_player(source, "hello") a function that has never existed. The correct call is TriggerClientEvent('ox_lib:notify', source, {title = "hello"}). One looks reasonable, one actually works.
Multiply that by every function across ox_lib, oxmysql, ox_inventory, ox_target, QBCore, Qbox, ESX Legacy, ESX v1-final, and the FiveM natives themselves, and you have a developer tax: every AI answer needs a manual pass to check the model did not invent half the call site.
-- Invented / wrong
ox_lib.notify_player(source, "You got paid")
local result = oxmysql:fetch(
"SELECT * FROM players WHERE id = ?",
playerId
)
RegisterNetEvent("QBCore:GiveMoney")
AddEventHandler("QBCore:GiveMoney",
function(amount)
QBCore.Player.AddMoney(source, amount)
end
)-- Grounded against current APIs
TriggerClientEvent("ox_lib:notify", source, {
title = "Paid",
description = "You got paid",
type = "success",
})
local row = MySQL.single.await(
"SELECT * FROM players WHERE id = ?",
{ playerId }
)
local Player = QBCore.Functions.GetPlayer(source)
if Player then
Player.Functions.AddMoney("cash", amount, "payout")
endHow SwisserAI grounds outputs
SwisserAI runs a strong general model, but it never writes FiveM code from memory alone. Three things happen on every generation:
It starts from real code
Your project's framework decides where it reads. The passages that match your request, from 24,133 in 91 repositories, go into the context before the first line is written.
It looks things up while writing
When it is not sure what lib.callback accepts, it searches the same index before it writes the line, instead of guessing.
It checks the UI against the Lua
For resources with a NUI, a checker compares what the Lua sends with what the JavaScript handles, and sends mismatches back to fix. Over 90 days of past projects it found a mismatch in 294 of 2,291 NUI resources.
We are honest about the limit of this: grounding reduces hallucination rate, it does not prove correctness. Edge cases in niche forks, custom resources we have never seen, and frameworks that broke their own exports last week will still produce the occasional miss. But the baseline is no longer "every answer needs a full manual check". It is "the model uses real function names, and the console error you paste back catches the rest."
Compared to a generic model that will happily invent QBCore:TriggerServerCallbackAsync because it sounds right, this is the difference between shipping in an afternoon and debugging console errors for two hours.
What is in the index
The index holds the source of the libraries you use every day on a real FiveM server, so the model reads the current signature instead of remembering an old one.
ox_lib functions
lib.notify, lib.callback, lib.showContext, lib.registerContext, lib.cache, lib.locale, with the argument shapes of the current ox_lib release.
oxmysql syntax
MySQL.query vs MySQL.prepare vs MySQL.scalar vs MySQL.insert, correct parameter arrays, awaitable vs callback variants.
QBCore events
Client and server event names, QBCore:GetCoreObject, PlayerData shape, QBCore.Functions.* and QBCore.Commands.Add.
Qbox state bags
Player.PlayerData via state bags, the Qbox migration deltas from QBCore, and the Qbox-specific helper exports.
fxmanifest structure
fx_version, game, lua54, shared_scripts, client_scripts, server_scripts, dependencies, ui_page, in the right order with correct values.
Resource naming
Folder-matches-resource, kebab-case conventions, avoiding reserved names, and valid dependency references in server.cfg.
Beyond the stock libraries
If your stack includes a library we have not indexed yet, or your own internal resource, paste the relevant exports into the session. SwisserAI treats them as the ground truth for the rest of the conversation.
FAQ
No. Any model can make up a function name, a field or an event, especially for edge cases, niche forks, or custom resources it has never seen. What we do is reduce the hallucination rate dramatically for the FiveM surface area that matters: the stock ox_lib exports, the oxmysql argument shapes, the QBCore and Qbox event names, and the ESX legacy vs v1-final differences.
In practice this means far fewer "this export does not exist" errors in your server console after pasting in generated code, and far fewer wasted back-and-forth turns asking the AI to "please actually use the real function".
qb-core, qbx_core, esx-legacy, ox_lib, oxmysql, ox_inventory, ox_target, the FiveM natives and widely used community resources: 24,133 passages from 91 repositories. QBCore has the most coverage (6,323 passages), then the natives (5,355), vRP, ox_lib, ESX and Qbox.
It was last rebuilt from the current repositories on July 13, 2026. ox_lib in particular moves: exports get renamed and new ones get added. If a call changed after that date, the console error you paste back shows it, and the model fixes the file.
Paste the console error into the chat, as the script generator troubleshooting guide shows. The model looks the call up in the index and fixes the file. For resources with a NUI, a checker also compares what the Lua sends with what the JavaScript handles and sends mismatches back to fix before you download.
Yes. Upload or paste code you got from any AI (ChatGPT, Claude, Copilot, Cursor) and ask the script generator to check the exports and events against your framework. It looks the calls up in the same index and points out the ones it cannot find, with the real call to use instead.
Partially. For custom exports inside your own resource, you can point SwisserAI at your repo (or paste the relevant resource) and it will treat those exports as the ground truth for the rest of the session. For entirely custom frameworks we have not indexed, the model still writes FiveM natives correctly but cannot know your internal exports.