Oxide Dispatchv1.5.0
MinorAdded
- AI dispatch is no longer tied to OpenAI. Each chained stage (speech-to-text, language model, text-to-speech) has its own
Providerinshared/config/ai_dispatch.lua:openai,groq,openrouter,deepinfra,lemonfox, the self-hostedollama,lmstudio,kokoroandspeaches, orcustomwith your ownBaseUrl. Keys go inoxide:ai-dispatch:<provider>_keyconvars (for exampleoxide:ai-dispatch:groq_key). Self-hosted providers need none. The language model must support tool calling. - Realtime mode can run through another gateway: set
Realtime.Provider = 'custom'and anhttps://Realtime.BaseUrl. Realtime always needs a key, a custom gateway included; without one the server console shows an error when the resource starts. - New AI dispatch options:
LLM.Temperature,LLM.MaxTokens(set either tofalseto leave it out of the request),TTS.Format,Realtime.TranscriptionModel, and per-channelchainedVoiceandrealtimeVoice. - 911 and 311 calls from
oxide-phonego through the same dispatch rules as/911and/311, including their rate limit. The departments the phone names for each line (Config.Emergencyinoxide-phone) receive its calls too. - The caller's phone number is saved on civilian alerts that are not anonymous and shown next to their name on the alert pop-up, the Dispatch Hub list and the alert's detail panel, when your server runs a phone resource.
- With a phone resource installed, responder replies arrive on the caller's phone from the department. Without one, they show on screen as before.
- With
oxide-weather, alerts record the weather at the scene (conditions, temperature, wind) and show it on the alert. Turn it off withConfig.Weather.Context. - Optional storm alerts: severe weather from
oxide-weatherraises aWEATHERalert for police, EMS and fire, updates as the storm changes and closes when it ends. Off by default (Config.Weather.Storms). oxide-dispatch:weathershows and changes the weather settings from the server console, or in game for admins. Changes are saved and apply straight away; the file only sets the values for the first start.- AI dispatch can answer "what's it about?": a new
get_alert_detailstool reads back an alert's message, street, caller and number, age, vehicle, weather at the scene and the units on it. It only sees alerts sent to that channel's department, and anonymous callers stay anonymous.list_active_alertsnow gives each alert's message and age too. - Optional spoken alert announcements: with
Config.AIDispatch.AnnounceAlerts = true, the AI dispatcher reads every new alert out on the channels it is sent to. Off by default. In chained mode it costs one text-to-speech request per alert per channel with someone listening. - With
oxide-weather, the AI dispatcher knows the current weather where the officer is, so "what's the weather like?" gets a real answer.Config.Weather.Contextturns it off. - Two new 911 categories for fire: Brush / Wildfire (10-74) and Rescue / Extrication (10-76).
- The fire group recognises
lsfdandfirefighteras well asfire, and any department name you add toConfig.ResponderGroups.fire.jobsis treated as fire everywhere, including the AI dispatcher's channel rules. - 911 and 311 calls save the street and area the caller is in, from the phone,
/911,/311and the radial menu alike. It shows on the alert pop-up, the Dispatch Hub and to the AI dispatcher. A call waits at mostConfig.Civilian.locationTimeoutMs(1 second) for it and goes through without a street otherwise. - Map mode:
inherit,combined,separateordisabled, set withoxide-dispatch:mapmodefrom the server console or by an admin in game. Inseparatemode the Hub has a Mainland / Cayo Perico picker.
Changed
- The alert pop-up map, Hub map and heatmap now use
o-link's shared map, which includes Cayo Perico. This resource no longer ships its own map images. - AI dispatch errors now name the stage that is missing a key (
missing_key_stt,missing_key_llm,missing_key_tts) instead ofmissing_openai_key, and the startup log lists each stage's provider. - The startup key check only looks at the modes your channels use, so a chained-only server is no longer warned about a missing realtime key.
- In chained mode, a request to a provider gives up after 20 seconds and is retried once, so a rate limit or an unreachable provider ends in an error instead of a long silence on the radio. Set them with
Chained.RequestTimeoutSecandChained.MaxRetries. - OpenAI receives the reply length cap as
max_completion_tokens, so OpenAI's newer models can run the dispatcher. - The note an AI dispatcher gets for a new alert includes the street, and for a 911 or 311 call the caller, their number and what they said.
- The dispatcher keeps at most 30 background notes (the officer's location, other officers' radio traffic, alerts filed or cancelled), so a long shift on the channel no longer makes every request larger. Set it with
Chained.LLM.MaxSystemNotes.
Fixed
- Alerts on Cayo Perico now show on the dispatch maps.
- In chained mode, another officer talking while the dispatcher was running a lookup could make the dispatcher's next reply fail.
- An officer on an AI dispatch channel who placed a 911 call themselves never got that call into their dispatcher's awareness. Only the officer whose own AI dispatcher filed an alert is skipped now.
- Fire alerts reached firefighters who were off duty. With
Config.Broadcast.onDutyOnly, the fire group now follows your framework's duty toggle (frameworkDuty = trueinConfig.ResponderGroups), and a firefighter who clocks in gets the open alerts straight away. If your fire job has no way to go on duty, setframeworkDuty = falseon the fire group. /911and/311with a written description, and phone calls, always went to police. They now go to the departments the words point to: a fire to fire, a medical call to EMS, both when both are mentioned. Calls with no recognised words still go to police. The words are each category's newkeywordsinConfig.Civilian.- Alerts for police, EMS and fire together never reached fire, because the job cap cut the list at 12.
Config.Broadcast.maxJobsPerAlertis now 32, and a trim is logged.
Documentation
docs/AI_DISPATCH.md: new "Choosing a provider", "Spoken alert announcements" and "Weather" sections, the realtime key rule, theget_alert_detailstool, and what a rate limit looks like.docs/CONFIGURATION.md: the new AI settings, per-provider keys,Config.Civilian.locationTimeoutMs,shared/config/weather.luaand "Shared map mode".docs/ADMIN.md: theoxide-dispatch:weatherandoxide-dispatch:mapmodecommands.docs/EXPORTS.md: theCivilianCallexport,GetSetting/SetSettingfor the weather settings, and the caller number and weather on alerts.docs/FEATURES.md: phone calls, caller numbers, street names, replies on the phone, weather on alerts, alert details and announcements for the AI dispatcher.docs/INSTALLATION.md: theo-linkversions this release needs, and updating an existing database.docs/TROUBLESHOOTING.md: the new AI error codes.
Migration Guide
- Back up your database.
- Update
o-linkfirst. The maps need 1.8.0 or newer. Phone calls, caller numbers and replies on the phone need 1.11.0 or newer. - On first start, two columns are added to
dispatch_alertsautomatically (caller_numberandweather_context). Your database user needs ALTER permission. To add them by hand instead, runsql/migrate_caller_number.sqlandsql/migrate_weather_context.sqlonce. Both are safe to run more than once. - If you keep your own config files, also copy the new
shared/config/weather.lua. Your currentshared/config/ai_dispatch.luakeeps working as before. To get the fire-routing fixes, also bring overmaxJobsPerAlert = 32inshared/config.lua(the old 12 still drops fire from alerts for police, EMS and fire), thekeywordslists and the two new 911 categories inshared/config/panic.lua, and the fire group's new job names andframeworkDuty = trueinshared/config/jobs.lua. - Restart the whole server, not only the resource. This version adds new files.