omni_ai 0.6.1
omni_ai: ^0.6.1 copied to clipboard
One Flutter API for every AI provider: Gemini, Vercel AI Gateway, OpenRouter and more. Stream text, call tools, build agents, and generate images, speech and video.
0.6.1 #
- Fixed: calling
ModelCatalog.load()when the catalog was already fresh left it marked as loading for good, soisLoadingstayed true and every laterloadandrefresh()did nothing, including the refresh that followssetApiKey. A newly added key's models then never appeared until the app restarted. - Fixed:
refresh()during a load now does fetch again when that load ends. 0.6.0 listed this but still returned the same load. - Raised the minimum
speech_to_textto 7.4.0 andflutter_svgto 2.0.17, the first versions this package compiles against, and shortened the package description.
0.6.0 #
- Addis AI: batch generation.
ai.addis.batchessends up to 10,000 text to speech requests at once (off-peak, within 24 hours, half price):createFromRequests,create,retrieve,listandrequests(paged streams),cancel,results,audioandwaitFor(withonProgress; rides out dropped connections and busy answers, and resumes by id after a restart).ai.addis.fileshasupload(one request up to 25 MB, signed upload up to 100 MB),retrieve,delete,contentUrlandcontent. Requests are checked before upload; creating a batch sends anIdempotency-Key, reused across retries, so a retry can't start a second batch; downloads never send the API key to the storage host. Adds a direct dependency onhttp_parser, already used throughhttp. - Jev: pictures and JSON state in every tool.
jev_decide,jev_batch(per item),jev_noul,jev_choice,jev_scoreandjev_boxtakeimages({placeholder: file or link}), turned into bytes by the app'sJevToolkit.resolveImage;JevImage.detectreads PNG/JPEG from the bytes. Each picture is sent under a unique id (JevPictures): Jev swaps a placeholder wherever it appears, so the call's own names are replaced as whole words only, and a picture state doesn't mention is added underimages. Requests with pictures usevisionModel(jev-preview).statewritten as JSON text is sent as JSON (JevToolkit.stateOf).jev_noul/jev_choice/jev_scorenow pass the app'simagestoo (they dropped them before), anddecideEachtakes per-state images, so batches can include box questions. - Fix, Jev:
JevQuestion.fromJsonaccepts options the way models send them: underoptions,choicesorlevelsas well ascriteria; as a map, a list (of names or{name, description}), a JSON string or a comma-separated string. A choice or score with no options now says what shape it expects instead of only "A choice takes 1 to 255 options". - Jev: batches.
JevClient.decideEachasks the same questions about many states (one request each, since the API has no batch endpoint; four at a time, order kept, a failed state holds its error). Thejev_batchtool takes up to 100items(strings or{id, state}) and returns compact answers per item plus totals (choice counts, yes/no counts, mean score), so an agent judges a list in one call instead of one per item. - Fix, Skills:
previewHit/installHituse the catalog's SKILL.md address (Skyllrefs.raw) to read only that skill's folder, instead of scanning every skill in the repository when names differ. SKILL.md and bundled files are fetched six at a time, and each GitHub request gives up after 20 s, so a preview no longer appears to hang. - Fix, MCP: servers that reject the
2026-07-28discovery probe as an unsupported protocol version, while listing older ones ("supported versions: 2025-11-25, …"), now fall back toinitializeinstead of failing to connect. A rejection that lists no older version still does not downgrade. - Security, MCP: a registry server's header templates (
Bearer {api_key}) are filled from the values given (McpCatalogHit.inputs,McpInput); a required one still holding a placeholder throws instead of being saved as if it were a key, andinstallrefuses unfilled{placeholders}. Plainhttp://endpoints are only accepted on localhost or the local network (McpRegistry.isLocalHost). The agent'smcp_install/mcp_install_catalogno longer save local command (stdio) servers unlessallowAgentStdiois set: connecting runs that command. - Security, Jev: the key is only sent over
https://(plainhttpfor localhost). Retried decisions carry one generatedIdempotency-Key, so a retry is billed once. Everyjev_*tool passes the run's cancel token. - Security, skills: remote skills install over
https://only; a SKILL.md or bundled file is at most 512 KB and a skill bundles at most 40 files / 2 MB. Descriptions put in the agent prompt are capped at 300 characters (the full text is inload_skill). - Skills:
SkillRegistryisListenable(installs and removals notify).searchasks Skyll first, so hits carry adescriptionand the SKILL.mdrawUrl, and falls back to skills.sh (searchUrl: ''for skills.sh only).previewHitreviews a hit without installing.load_skill,read_skill_fileanduninstall_skilldeclare their required inputs. - Fixed: a provider whose key was set while the model catalog was loading (e.g. keys restored at app start) never got its models listed, and
refresh()during a load returned that same load. A forced refresh mid-load now fetches again when it ends,setApiKeyrefreshes a catalog that is loading, andModelCatalog.isLoadingsays whether one is under way.
0.5.0 #
-
Fixed misleading MCP response-id errors for redirected endpoints: show the final URL and HTTP status. Manual remote setup adds endpoint/authorization fields, keeps advanced JSON, and fixes controller disposal while the dialog closes.
-
Added on-demand MCP install/configure, installation checks, removal, tool-schema inspection, resource and prompt tools;
managementTools()avoids eager connections. Skills add remote previews and installation checks. Host apps can opt out of automatic installed-skill exposure when enforcing tool permissions. -
Added reusable
ExtensionsViewwith catalog search, skill review/installation/removal, MCP configuration editing, and tool inspection; the example app adds Extensions and a fully editable Jev playground. -
Jev preserves structured JSON criteria, validates score/type/image requirements, supports boolean naming and normalized API base URLs, and cancels during retry backoff.
-
MCP negotiates stateless
2026-07-28or legacy initialization, reads HTTP SSE results without waiting for connection closure, supports immediatemcp_call_toolafter installation, preserves catalog configuration, and migrates credentials to secure storage. -
Fixed skill selectors, GitHub folder filtering, multiline YAML descriptions, root/deep reference files, and concurrent registry loading. Added protocol, persistence, subprocess, cancellation, and UI regression coverage.
-
Jev (TypeSafe System One):
JevClient/JevToolkit/ai.jev/ai.decide(). Full control of the System One API — noul (yes/no), choice, score and box questions, images, long context, retries, idempotency keys, custom base URL/headers, and one-shot helpers (noul,choice,score,box). Agent tools:jev_decide,jev_noul,jev_choice,jev_score,jev_box,jev_models. Same decision contract as the Vercel AI SDKexperimental_decide. -
MCP:
createMcpClient(HTTP, SSE, stdio on desktop) lists tools/resources/prompts and turns tools into omni_aiTools, following@ai-sdk/mcp.McpRegistry/ai.mcpinstalls, lists and uses servers (install,list,connect,tools,toolkits). Search the official MCP Registry (ai.mcp.search,installHit,installFromCatalog) — no API key. -
Skills:
SkillRegistry/ai.skillsinstalls from markdown, a SKILL.md URL, or GitHub (owner/repo,owner/repo@name), lists and uses them (load_skill). Search skills.sh (ai.skills.search,installHit) — the same public catalog asnpx skills find. Installed skills are available to agents on thatOmniAI.
0.4.1 #
- Fixed: Addis AI speech failed with a
FormatExceptionwhen the audio came as adata:URL.GeneratedFile.fromBase64(andfromDataUrl) now take data URLs, line breaks, URL-safe base64 and missing padding;decodeBase64does the same for any string. - Fixed: restricted ElevenLabs keys (without
user_read) failedverify()though they work;ElevenLabsProvider.isMissingPermissiontells the two apart.
0.4.0 #
Found while moving the teleai app onto omni_ai's agents.
- Approvals can edit:
onToolApprovalmay returnToolApprovalDecision.approve(input: …)(run with an edited input, e.g. a message draft the user changed) orToolApprovalDecision.deny('why'); bools still work. ToolContext.currentinside a tool'sexecute: the call (id, name, input) and the cancel token. Agent hooks now get the real call id (it was empty).parallelToolCalls: falseonstreamText,generateText,Agentandai.agent()runs a step's tools one at a time, in order.ToolOutput(modelFiles: …): pictures a tool fetched for the model to look at, sent after the results as a user message.- Tool results stream as each tool finishes, and a tool starts only after listeners have seen its call (UIs can show it running).
Toolkit.where(test)keeps only some of a toolkit's tools (its prompt stays).AgentMemoryis aListenablewithsave,update,removeandclearfor your own screens;rememberandupdate_memoryreturn the content; memories saved with acreateddate load.ai.verifyKey(id, key: …)checks a typed key without setting it, for settings fields.ai.agent()takestemperature,providerOptionsandparallelToolCalls.- Dictation:
onTranscribedreports each cloud transcription with the recording's length (usage, cost). Fixed: errors and status from the device recognizer were lost whendeviceAvailable()ran first. - Voices:
VoicePickerspeaks Addis AI samples in the voice's own language (VoicePicker.samples), tries Addis's preview endpoint, and can stop a generated sample;AiAudio.play(id:).ElevenLabsProvider.speechModelslists the models every account has. - Composio: a new key or user id gets a new session (the old one was kept);
disconnectuses the package's HTTP client. - E2B:
E2BExecution.countand.text(the cell's value, results markedmain),E2BSandbox.startedAt, typedE2BClient.sandboxes()/E2BSandboxInfo,listFileswith paths and dates;killtreats a gone sandbox as stopped; a blank template uses the default. - Cloudflare:
listObjects(delimiter: false)lists everything under a prefix; objects carry their ETag. - Browser:
BrowserSession.hostandstop(). AiHttp.delete.
0.3.0 #
- On-device sandbox:
DeviceSandboxToolkit/ai.deviceSandboxruns Python (Pyodide) or JavaScript in a hidden web view, with input files and output files/charts. Free, no key. - Browser:
BrowserToolkit/ai.browser, a real browser the AI drives (open, read, type, click, back, run JS, close), withBrowserView/showBrowserto watch it live or take over.AiChatViewshows a "Watch the browser" button. - Both are in
ai.allToolkitson Android, iOS and macOS. New dependency:webview_flutter. - Toolkits are only offered where
isConfigured(keyless toolkits included).
0.2.0 #
- Agents, modelled on eve:
Agent/ai.agent()with instructions, tools, toolkits, skills (SKILL.md), memory, helper agents, limits, hooks,ask_user, and sessions you can save and restore.agent.chat()plugs intoAiChatView. - Toolkits:
ExaToolkit(web search, page reading, similar pages, cited answers),E2BToolkit(cloud code sandbox with charts),ComposioToolkit(users' apps: connect, find and run actions),CloudflareToolkit(browser rendering, DNS, cache, Workers, KV, R2),BasicToolkit(time, calculator, fetch). Keys are saved like provider keys and shown inApiKeySettings. - Toolkits on any call:
toolkits:ongenerateText,streamText,ai.ask,ai.chatandAiChatController;ai.allToolkitsgives the basic tools, memory and every toolkit with a key. - Memory:
AgentMemory/ai.memorywith teleai's tools (rememberwith tags,update_memory,forget_memory,list_memories), memories in the prompt asid: content; andMemoryFilesToolkit/ai.memoryFiles, amemorytool with the commands of Claude's native memory tool over/memoriesfiles. Both stored on the device by default, with pluggable stores. CloudflareWorkersAiProvider(workersai:) for Cloudflare's models.- Tools:
ApprovalPolicy(never,always,once,when),ToolOutputto hand files to the app,label. Calls to unknown tools now go back to the model as errors instead of stopping. - Widgets:
showToolApprovalDialog,showAskUserDialog; chat shows tools waiting for approval and helper progress.
0.1.0 #
First release.
OmniAI: one object with keys and providers; model ids likegoogle:gemini-2.5-flash.- Providers: Vercel AI Gateway, Google Gemini (native), OpenRouter, LM Studio, ElevenLabs, Addis AI, any OpenAI-compatible API, and on-device speech.
- Text:
generateText,streamText(text, reasoning, tool and file streams), multi-step tool loops with approval,generateObject,streamObject,classify. - Media:
generateImage(with references),generateSpeech,speak,transcribe, live and cloud dictation,generateVideo,embed,embedMany, ElevenLabs sound effects and music. - Catalog: every provider's models merged with models.dev (prices, context, modalities, logos), cached on device.
- Widgets:
AiChatView,AiChatController,ModelPicker,VoicePickerwith previews,ApiKeySettings,DictationButton,AiAudioplayer. UiMessageStreamClientfor Vercel AI SDK backends.