{"id":3998,"date":"2026-11-06T10:00:00","date_gmt":"2026-11-06T07:00:00","guid":{"rendered":"https:\/\/eminbudak.com\/blog\/?p=3998"},"modified":"2026-10-30T20:53:36","modified_gmt":"2026-10-30T17:53:36","slug":"openfilm-wiro-provider-policy","status":"publish","type":"post","link":"https:\/\/eminbudak.com\/blog\/openfilm-wiro-provider-policy\/","title":{"rendered":"OpenFilm Wiro Provider: The Policy Lesson"},"content":{"rendered":"<p><strong>OpenFilm Wiro provider<\/strong> was a proposed provider for <a href=\"https:\/\/github.com\/openfilm\/openfilm\" target=\"_blank\" rel=\"nofollow noopener\">OpenFilm<\/a>, an open-source video agent where coding agents write films as web pages and Studio lets people edit the result. I founded <a href=\"https:\/\/wiro.ai\" target=\"_blank\" rel=\"nofollow noopener\">Wiro<\/a>, and I opened <a href=\"https:\/\/github.com\/openfilm\/openfilm\/pull\/308\" target=\"_blank\" rel=\"nofollow noopener\">pull request 308<\/a> on October 29, 2026.<\/p>\n<p>The pull request was closed without merging on October 30. The maintainers&#8217; decision followed OpenFilm&#8217;s first-party provider policy, not a finding about the quality of the implementation. That is a reasonable boundary for a curated project to draw, and it changes the lesson from this work: provider policy is part of the integration surface, not an afterthought.<\/p>\n<p>OpenFilm builds in first-party services from the companies that offer them, and Wiro brings many companies&#8217; models behind one API.<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/eminbudak.com\/blog\/wp-content\/uploads\/2026\/10\/openfilm-wiro-pr-overview.webp\" alt=\"OpenFilm Wiro provider pull request overview\" \/><figcaption>The pull request proposed Wiro routes for each supported media kind.<\/figcaption><\/figure>\n<h2>What the provider implemented<\/h2>\n<p>The implementation adds Wiro as an own-key route for generated pictures, video, music, sound effects, voice-over, transcripts, and subtitle translation. Pictures use Nano Banana 2, Nano Banana Pro, GPT Image 2, and FLUX.2 [pro]. Video uses Veo 3.1 Fast, Veo 3.1, Kling 3.0, and Seedance 2.0. Music uses ElevenLabs Music v2, Lyria 3 Pro, and Stable Audio 3 Medium, while sound effects use Stable Audio 3 Small SFX.<\/p>\n<p>Voice-over uses Eleven v4, Eleven v4 Turbo, and Gemini 3.1 Flash TTS. Transcripts use Parakeet TDT 0.6B v3 or ElevenLabs Scribe. Subtitle translation uses GPT-6 Luna and GPT-6.1 Sol. The pull request records the media routes and the model choices in the proposed provider.<\/p>\n<h2>A model run is a task, not a request-response call<\/h2>\n<p>Each model run starts a task, then checks that task until it finishes. Wiro reports each outcome in the response body, so the provider reads that result rather than relying on the HTTP status alone.<\/p>\n<p>Wiro supports API-key-only projects through <code>x-api-key<\/code>. Projects that use signed requests need a key and secret together, which is incompatible with integrations that only accept one provider key. OpenFilm&#8217;s settings pattern made that constraint visible early: the integration needed to carry paired configuration where signature authentication was used.<\/p>\n<h2>The small format details caused the real bugs<\/h2>\n<p>Music and voice duration come from the audio header. Lyria can use a higher bitrate, making a size-based estimate wrong, and Lyria 3 Pro chooses its own length. In one run asked for 30 seconds, it returned about three minutes, and OpenFilm&#8217;s receipt reports that difference.<\/p>\n<p>Transparent pictures require two tasks: create the picture, then remove its background. A partner-model refusal can appear in task output rather than an error field, which is another reason to parse all completed results.<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/eminbudak.com\/blog\/wp-content\/uploads\/2026\/10\/openfilm-wiro-pr-details.webp\" alt=\"OpenFilm Wiro provider pull request engineering details\" \/><figcaption>The pull request documents task handling, duration reading and file handling.<\/figcaption><\/figure>\n<h2>Testing against the service<\/h2>\n<p>Every model in the proposed provider was run through OpenFilm against the real service on October 29, 2026. Total usage was about $9.88. OpenFilm&#8217;s full test suite passed: 1,346, 391, and 20 tests across its three packages. The type check was clean.<\/p>\n<p>That does not turn a pull request into a release. It does show that the routes, result parsing, file handling, and model-specific constraints were exercised against the service they were meant to call.<\/p>\n<h2>Using Wiro in OpenFilm today<\/h2>\n<p>OpenFilm&#8217;s Settings, then Providers, then Custom services takes any HTTP service with its address, a key, and a few words about what it does, and the agent calls it from there. Wiro works there with a project set to API-key-only authentication, with the key sent in the <code>x-api-key<\/code> header. A project that signs its requests does not work there, because custom services send fixed headers.<\/p>\n<h2>Where the work lives now<\/h2>\n<p>The full provider remains available in my <a href=\"https:\/\/github.com\/EminBudak\/openfilm\/tree\/studio\/wiro-provider\" target=\"_blank\" rel=\"nofollow noopener\">OpenFilm fork&#8217;s provider branch<\/a>. It is useful as a working reference for asynchronous media jobs, result parsing, media verification, and authentication assumptions, even though it is not part of upstream OpenFilm.<\/p>\n<h2>The conclusion<\/h2>\n<p>Check a curated project&#8217;s policy on providers before building one. An aggregator like Wiro fits better as a custom service than as a built-in provider.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>OpenFilm Wiro provider was a proposed provider for OpenFilm, an open-source video agent where coding agents write films as web pages and Studio lets people edit the result.&hellip;<\/p>\n","protected":false},"author":4,"featured_media":3991,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[310],"tags":[316,356,357],"class_list":["post-3998","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","tag-ai-agents","tag-openfilm","tag-wiro"],"_links":{"self":[{"href":"https:\/\/eminbudak.com\/blog\/wp-json\/wp\/v2\/posts\/3998","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eminbudak.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eminbudak.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eminbudak.com\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/eminbudak.com\/blog\/wp-json\/wp\/v2\/comments?post=3998"}],"version-history":[{"count":7,"href":"https:\/\/eminbudak.com\/blog\/wp-json\/wp\/v2\/posts\/3998\/revisions"}],"predecessor-version":[{"id":4021,"href":"https:\/\/eminbudak.com\/blog\/wp-json\/wp\/v2\/posts\/3998\/revisions\/4021"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/eminbudak.com\/blog\/wp-json\/wp\/v2\/media\/3991"}],"wp:attachment":[{"href":"https:\/\/eminbudak.com\/blog\/wp-json\/wp\/v2\/media?parent=3998"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eminbudak.com\/blog\/wp-json\/wp\/v2\/categories?post=3998"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eminbudak.com\/blog\/wp-json\/wp\/v2\/tags?post=3998"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}