[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"categories-en":3,"post:\u002Fpost\u002Fhow-to-choose-an-ai-sdk-why-the-fear-of-lock-in-is-a-mistake-and-how-to-decide-based-on-your-apps-format":37},[4,11,17,24,30],{"id":5,"slug":6,"name":7,"colorHex":8,"iconName":9,"postCount":10},"0e2c1225-f78a-4c20-8c93-998ab9dc93b9","frontend","Frontend","#40484f",null,25,{"id":12,"slug":13,"name":14,"colorHex":15,"iconName":9,"postCount":16},"bc8df70e-b7fb-4d89-a80c-fd458d36d58c","code-development","Code & Development","#8b5cf6",23,{"id":18,"slug":19,"name":20,"colorHex":21,"iconName":22,"postCount":23},"550e8400-e29b-41d4-a716-446655440001","inteligencia-artificial","Artificial Intelligence","#6366f1","brain",14,{"id":25,"slug":26,"name":27,"colorHex":28,"iconName":9,"postCount":29},"ea63b69c-2eb4-4100-81f3-70ce52d33743","tech-news","Tech News","#e50606",4,{"id":31,"slug":32,"name":33,"colorHex":34,"iconName":35,"postCount":36},"550e8400-e29b-41d4-a716-446655440017","how-to-guides","How-To & Guides","#be123c","book-open",2,{"post":38,"related":1199,"translations":1266,"resolved":9},{"id":39,"slug":40,"title":41,"excerpt":42,"image":43,"featured":44,"groupId":45,"publishedAt":46,"readingTime":47,"views":48,"author":49,"category":51,"tags":52,"contentJson":59,"metaTitle":1196,"metaDescription":1197,"updatedAt":1198},"e595e2c6-e464-46d7-ba67-810f8d0cd234","how-to-choose-an-ai-sdk-why-the-fear-of-lock-in-is-a-mistake-and-how-to-decide-based-on-your-apps-format","How to choose an AI SDK: why the fear of lock-in is a mistake and how to decide based on your app's format","The fear of being locked into an AI provider is a common mistake. Learn how to choose the best SDK based on your project's format and productivity.","https:\u002F\u002Fmfgiomkkbihnlpfdxwrt.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fblog-assets\u002Fmedia\u002Ffeatured\u002F1782794440171-featured-aqj363.webp",false,"7839c171-0b65-418a-87dc-7ded7786a84a","2026-07-04T19:26:16.054373+00:00",6,0,{"name":50,"avatar":9},"Genildo Souza",{"slug":19,"name":20,"color":21},[53,56],{"slug":54,"name":55},"ai","AI",{"slug":57,"name":58},"llm","LLM",{"type":60,"content":61},"doc",[62,89,99,106,116,135,141,179,188,196,202,214,337,367,374,380,388,395,417,423,443,449,457,463,491,517,918,924,934,976,1039,1045,1064,1072,1096,1102,1176],{"type":63,"attrs":64,"content":66},"paragraph",{"id":65},"p_k1w2dpnq",[67,70,75,77,81,83,87],{"text":68,"type":69},"For a long time, I did the math wrong in my head. When I was about to start an app with AI, I would discard the ","text",{"text":71,"type":69,"marks":72},"Claude Agent SDK",[73],{"type":74},"bold",{"text":76,"type":69}," and the ",{"text":78,"type":69,"marks":79},"Vercel AI SDK",[80],{"type":74},{"text":82,"type":69}," almost out of reflex — “those must be tied to their provider,” I thought. Then I would go with ",{"text":84,"type":69,"marks":85},"Genkit",[86],{"type":74},{"text":88,"type":69},", thinking it was the only “free” option. Until the day the Ollama launcher showed me, right to my face, that I was wrong the whole time.",{"type":90,"attrs":91},"summaryBox",{"id":92,"items":93,"title":98},"sum_3q2rl9st",[94,95,96,97],"No agent SDK locks you into a vendor — they all run Claude, GPT, Gemini, or local models.","The agnostic layer is the same in all of them: pointing to a URL (base-URL \u002F gateway \u002F plugins) + normalization.","The real choice is based on the APP FORMAT, not the brand: code agent, content+RAG, typed logic, or UI.","Batteries-included is worth more than theoretical agnosticism — what comes ready-made saves weeks.","What you take away from this article",{"type":100,"attrs":101,"content":103},"heading",{"id":102,"level":36},"h_4kojkxpd",[104],{"text":105,"type":69},"The premise that cost me dearly",{"type":63,"attrs":107,"content":109},{"id":108},"p_qu1bgxgm",[110,112,114],{"text":111,"type":69},"The question that stalled everything was: “what if one day I want to switch models? Will I be held hostage by Anthropic \u002F Vercel?”. ",{"text":113,"type":69},"With that fear, the selection criteria became the vendor — and not the problem I was solving. ",{"text":115,"type":69},"It is a silent error, because it looks like prudence.",{"type":117,"attrs":118,"content":122},"callout",{"id":119,"type":120,"title":121},"call_hph0vvql","warning","Anti-pattern",[123],{"type":63,"attrs":124,"content":126},{"id":125},"p_z4dpgwub",[127,129,133],{"text":128,"type":69},"Choosing an SDK out of fear of provider lock-in. You might end up with the right tool for the wrong reason — or the wrong tool because of a fear that doesn't even exist. ",{"text":130,"type":69,"marks":131},"Provider lock-in is not a real criterion",[132],{"type":74},{"text":134,"type":69},": no modern agent SDK locks you into a single model.",{"type":100,"attrs":136,"content":138},{"id":137,"level":36},"h_m4y976a6",[139],{"text":140,"type":69},"Ollama toppled the premise",{"type":63,"attrs":142,"content":144},{"id":143},"p_gr67l9op",[145,147,152,154,159,161,165,167,171,173,177],{"text":146,"type":69},"I ran the ",{"text":148,"type":69,"marks":149},"ollama launch",[150],{"type":151},"code",{"text":153,"type":69}," and the menu offered me, among other things, ",{"text":155,"type":69,"marks":156},"“Launch Claude Code (minimax-m3:cloud)”",[157],{"type":158},"italic",{"text":160,"type":69}," and ",{"text":162,"type":69,"marks":163},"“Launch OpenCode”",[164],{"type":158},{"text":166,"type":69},". Notice the detail: it was about to run ",{"text":168,"type":69,"marks":169},"Claude Code",[170],{"type":74},{"text":172,"type":69}," — which uses the Claude Agent SDK under the hood — with a ",{"text":174,"type":69,"marks":175},"minimax-m3",[176],{"type":74},{"text":178,"type":69}," model, which is not from Anthropic. How? It just swaps the base URL pointer.",{"type":180,"attrs":181,"content":185},"codeBlock",{"id":182,"language":183,"highlighted":184},"code_ynru3li2","bash","\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\"># É só isto que o launcher do Ollama faz por baixo dos panos:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">export\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> ANTHROPIC_BASE_URL\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">http:\u002F\u002Flocalhost:11434   \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\"># endpoint Anthropic-compat do Ollama\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">export\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> ANTHROPIC_MODEL\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">minimax-m3:cloud\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">claude\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">            # Claude Code rodando um modelo NÃO-Claude, com subagentes e tudo\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",[186],{"text":187,"type":69},"# É só isto que o launcher do Ollama faz por baixo dos panos:\nexport ANTHROPIC_BASE_URL=http:\u002F\u002Flocalhost:11434   # endpoint Anthropic-compat do Ollama\nexport ANTHROPIC_MODEL=minimax-m3:cloud\nclaude            # Claude Code rodando um modelo NÃO-Claude, com subagentes e tudo",{"type":63,"attrs":189,"content":191},{"id":190},"p_5tm4fbif",[192,194],{"text":193,"type":69},"Zero code. A third-party model running under the Claude Code harness, just because Ollama exposes an endpoint compatible with the Anthropic protocol. ",{"text":195,"type":69},"If this applies to Claude Code, it applies to any app built on the same SDK.",{"type":100,"attrs":197,"content":199},{"id":198,"level":36},"h_7bbp5zxw",[200],{"text":201,"type":69},"The agnostic layer exists in all of them",{"type":63,"attrs":203,"content":205},{"id":204},"p_hxm3y8if",[206,208,212],{"text":207,"type":69},"After that realization, I went to look at the others. They all have the same fundamental mechanism: ",{"text":209,"type":69,"marks":210},"pointing to an endpoint + a normalization layer",[211],{"type":74},{"text":213,"type":69},". Only the name changes:",{"type":215,"attrs":216,"content":218},"table",{"id":217},"tbl_f0fxu8cc",[219,251,281,309],{"type":220,"content":221},"tableRow",[222,233,242],{"type":223,"attrs":224,"content":226},"tableHeader",{"align":9,"colspan":225,"rowspan":225,"colwidth":9},1,[227],{"type":63,"attrs":228,"content":230},{"id":229},"p_3zdxnp2x",[231],{"text":232,"type":69},"SDK",{"type":223,"attrs":234,"content":235},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[236],{"type":63,"attrs":237,"content":239},{"id":238},"p_kn0advnh",[240],{"text":241,"type":69},"How it points to another provider",{"type":223,"attrs":243,"content":244},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[245],{"type":63,"attrs":246,"content":248},{"id":247},"p_45qd3bbj",[249],{"text":250,"type":69},"Normalizes to",{"type":220,"content":252},[253,263,272],{"type":254,"attrs":255,"content":256},"tableCell",{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[257],{"type":63,"attrs":258,"content":260},{"id":259},"p_a2qwuj64",[261],{"text":262,"type":69},"claude-agent-sdk",{"type":254,"attrs":264,"content":265},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[266],{"type":63,"attrs":267,"content":269},{"id":268},"p_xskgm1i8",[270],{"text":271,"type":69},"ANTHROPIC_BASE_URL (endpoint that speaks the Anthropic protocol); Bedrock\u002FVertex backends",{"type":254,"attrs":273,"content":274},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[275],{"type":63,"attrs":276,"content":278},{"id":277},"p_ssleix39",[279],{"text":280,"type":69},"shape Anthropic Messages",{"type":220,"content":282},[283,291,300],{"type":254,"attrs":284,"content":285},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[286],{"type":63,"attrs":287,"content":289},{"id":288},"p_r4x9no9q",[290],{"text":78,"type":69},{"type":254,"attrs":292,"content":293},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[294],{"type":63,"attrs":295,"content":297},{"id":296},"p_7f6e6110",[298],{"text":299,"type":69},"gateway() \u002F createGateway({baseURL}) \u002F createOpenAICompatible({baseURL})",{"type":254,"attrs":301,"content":302},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[303],{"type":63,"attrs":304,"content":306},{"id":305},"p_941du8l3",[307],{"text":308,"type":69},"neutral contract (text\u002Ftool-call\u002Freasoning)",{"type":220,"content":310},[311,319,328],{"type":254,"attrs":312,"content":313},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[314],{"type":63,"attrs":315,"content":317},{"id":316},"p_05pk2jy0",[318],{"text":84,"type":69},{"type":254,"attrs":320,"content":321},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[322],{"type":63,"attrs":323,"content":325},{"id":324},"p_v0y7zygg",[326],{"text":327,"type":69},"provider plugins (googleAI, openai-compat…)",{"type":254,"attrs":329,"content":330},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[331],{"type":63,"attrs":332,"content":334},{"id":333},"p_67kmsbyf",[335],{"text":336,"type":69},"Genkit model abstraction",{"type":117,"attrs":338,"content":342},{"id":339,"type":340,"title":341},"call_d34nmi9e","note","Caution: wiring ≠ behavior",[343],{"type":63,"attrs":344,"content":346},{"id":345},"p_56j6c81t",[347,349,353,355,359,361,365],{"text":348,"type":69},"Pointing the URL is free. But the model on the other side receives a harness molded for ",{"text":350,"type":69,"marks":351},"whoever normalizes",[352],{"type":158},{"text":354,"type":69},". An OpenAI-native model running under the Anthropic shape ",{"text":356,"type":69,"marks":357},"works",[358],{"type":74},{"text":360,"type":69},", but whether it ",{"text":362,"type":69,"marks":363},"behaves well",[364],{"type":74},{"text":366,"type":69}," there is a matter of model quality — not architecture. Claude in Bedrock\u002FVertex is native; non-Claude model via Anthropic-compat runs, but test the behavior.",{"type":368,"attrs":369},"pullquote",{"id":370,"quote":371,"accent":372,"attribution":373},"pull_ae4lhkpd","O vendor não é critério. A escolha real é qual batteries-included bate com o formato do app.","amber","— a régua que eu deveria ter usado desde o começo",{"type":100,"attrs":375,"content":377},{"id":376,"level":36},"h_vejgzd4q",[378],{"text":379,"type":69},"The four SDKs and what each one already brings ready-made",{"type":63,"attrs":381,"content":383},{"id":382},"p_zmol0jk8",[384,386],{"text":385,"type":69},"They are not at the same level of abstraction — and that is exactly what decides the choice. ",{"text":387,"type":69},"It is not “which one is freer” (all are), but rather “which one already solves the type of app I am building”.",{"type":100,"attrs":389,"content":392},{"id":390,"level":391},"h_ysmu0ze7",3,[393],{"text":394,"type":69},"claude-agent-sdk — “Claude Code as a library”",{"type":63,"attrs":396,"content":398},{"id":397},"p_34vs2t2j",[399,401,405,407,409,413,415],{"text":400,"type":69},"It is a ",{"text":402,"type":69,"marks":403},"complete agent harness",[404],{"type":74},{"text":406,"type":69},". It gives you the five most annoying primitives to build for free: ",{"text":408,"type":69},"tool hooks (deterministic guard), human-in-the-loop approval, ",{"text":410,"type":69,"marks":411},"AskUserQuestion",[412],{"type":151},{"text":414,"type":69}," as a protocol, subagents via native tool, and in-process MCP. ",{"text":416,"type":69},"Fits: autonomous code agent with security and approval.",{"type":100,"attrs":418,"content":420},{"id":419,"level":391},"h_lczhpv3b",[421],{"text":422,"type":69},"Genkit — GenAI app framework",{"type":63,"attrs":424,"content":426},{"id":425},"p_njuk91sv",[427,429,433,435,439,441],{"text":428,"type":69},"Strong in ",{"text":430,"type":69,"marks":431},"first-class RAG",[432],{"type":74},{"text":434,"type":69}," (retriever\u002Findexer\u002Fembedder), orchestration flows, and ",{"text":436,"type":69,"marks":437},"OpenTelemetry observability",[438],{"type":74},{"text":440,"type":69}," with dev UI. Fits: content generation, RAG, pipelines, tracing. ",{"text":442,"type":69},"It was the right choice for my editorial — just for the wrong reason at the time.",{"type":100,"attrs":444,"content":446},{"id":445,"level":391},"h_qdjjxgi9",[447],{"text":448,"type":69},"pydantic-ai — typed agents in Python",{"type":63,"attrs":450,"content":452},{"id":451},"p_06zw8t2c",[453,455],{"text":454,"type":69},"Typed agents and tools, structured output validated by Pydantic, multi-agent. Lightweight, no ready-made RAG\u002Fflows\u002Fobservability. ",{"text":456,"type":69},"Fits: typed agent logic. I tested it for the editorial and it didn't fit — it is a battery for another format.",{"type":100,"attrs":458,"content":460},{"id":459,"level":391},"h_ujd2alfj",[461],{"text":462,"type":69},"Vercel AI SDK — model + tools + provider (+ UI)",{"type":63,"attrs":464,"content":466},{"id":465},"p_v3x9wnvz",[467,471,473,477,479,483,485,489],{"text":468,"type":69,"marks":469},"streamText",[470],{"type":151},{"text":472,"type":69},"AI SDK Core",{"text":474,"type":69,"marks":475},"generateText",[476],{"type":151},{"text":478,"type":69}," with neutral parts, ",{"text":480,"type":69,"marks":481},"ToolLoopAgent",[482],{"type":151},{"text":484,"type":69},"the best agnostic provider story, and ",{"text":486,"type":69,"marks":487},"UI hooks (useChat)",[488],{"type":74},{"text":490,"type":69},". Fits: truly provider-neutral (first-class OpenAI-native) + React UI integration.",{"type":117,"attrs":492,"content":496},{"id":493,"type":494,"title":495},"call_n508ez29","tip","The matrix that matters",[497],{"type":63,"attrs":498,"content":500},{"id":499},"p_mtw9cprp",[501,503,507,509,511,515],{"text":502,"type":69},"The five primitives of the claude-agent-sdk (guard, approval, AskUserQuestion, subagents, MCP) ",{"text":504,"type":69,"marks":505},"do not exist ready-made",[506],{"type":74},{"text":508,"type":69}," in the Vercel AI SDK or Genkit — rewriting them in an agent app is weeks of work. ",{"text":510,"type":69},"Conversely, they are ",{"text":512,"type":69,"marks":513},"irrelevant",[514],{"type":158},{"text":516,"type":69}," in a content app, which doesn't edit a repo nor needs approval.",{"type":215,"attrs":518,"content":520},{"id":519},"tbl_0uj09hde",[521,565,609,654,697,741,785,830,872],{"type":220,"content":522},[523,532,540,548,556],{"type":223,"attrs":524,"content":525},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[526],{"type":63,"attrs":527,"content":529},{"id":528},"p_nlax3hgr",[530],{"text":531,"type":69},"Capability (comes ready?)",{"type":223,"attrs":533,"content":534},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[535],{"type":63,"attrs":536,"content":538},{"id":537},"p_o38g0b1k",[539],{"text":262,"type":69},{"type":223,"attrs":541,"content":542},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[543],{"type":63,"attrs":544,"content":546},{"id":545},"p_klkye31x",[547],{"text":78,"type":69},{"type":223,"attrs":549,"content":550},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[551],{"type":63,"attrs":552,"content":554},{"id":553},"p_unkfod1k",[555],{"text":84,"type":69},{"type":223,"attrs":557,"content":558},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[559],{"type":63,"attrs":560,"content":562},{"id":561},"p_7fjnymq5",[563],{"text":564,"type":69},"pydantic-ai",{"type":220,"content":566},[567,576,585,593,601],{"type":254,"attrs":568,"content":569},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[570],{"type":63,"attrs":571,"content":573},{"id":572},"p_9g5hw09k",[574],{"text":575,"type":69},"Agent loop",{"type":254,"attrs":577,"content":578},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[579],{"type":63,"attrs":580,"content":582},{"id":581},"p_26m1s9cu",[583],{"text":584,"type":69},"✓",{"type":254,"attrs":586,"content":587},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[588],{"type":63,"attrs":589,"content":591},{"id":590},"p_zbzeg9rw",[592],{"text":584,"type":69},{"type":254,"attrs":594,"content":595},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[596],{"type":63,"attrs":597,"content":599},{"id":598},"p_bmza7q20",[600],{"text":584,"type":69},{"type":254,"attrs":602,"content":603},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[604],{"type":63,"attrs":605,"content":607},{"id":606},"p_80xv8zql",[608],{"text":584,"type":69},{"type":220,"content":610},[611,620,629,638,646],{"type":254,"attrs":612,"content":613},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[614],{"type":63,"attrs":615,"content":617},{"id":616},"p_gsvyg5cm",[618],{"text":619,"type":69},"Guard \u002F tool hooks",{"type":254,"attrs":621,"content":622},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[623],{"type":63,"attrs":624,"content":626},{"id":625},"p_fwrdzjfm",[627],{"text":628,"type":69},"✓ native",{"type":254,"attrs":630,"content":631},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[632],{"type":63,"attrs":633,"content":635},{"id":634},"p_a6v3quiv",[636],{"text":637,"type":69},"—",{"type":254,"attrs":639,"content":640},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[641],{"type":63,"attrs":642,"content":644},{"id":643},"p_u9hqy4kj",[645],{"text":637,"type":69},{"type":254,"attrs":647,"content":648},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[649],{"type":63,"attrs":650,"content":652},{"id":651},"p_e2s0ooal",[653],{"text":637,"type":69},{"type":220,"content":655},[656,665,673,681,689],{"type":254,"attrs":657,"content":658},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[659],{"type":63,"attrs":660,"content":662},{"id":661},"p_rcv8ts42",[663],{"text":664,"type":69},"Human approval",{"type":254,"attrs":666,"content":667},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[668],{"type":63,"attrs":669,"content":671},{"id":670},"p_al0mnqxl",[672],{"text":584,"type":69},{"type":254,"attrs":674,"content":675},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[676],{"type":63,"attrs":677,"content":679},{"id":678},"p_q8auzx6j",[680],{"text":637,"type":69},{"type":254,"attrs":682,"content":683},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[684],{"type":63,"attrs":685,"content":687},{"id":686},"p_90uk6ylv",[688],{"text":637,"type":69},{"type":254,"attrs":690,"content":691},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[692],{"type":63,"attrs":693,"content":695},{"id":694},"p_92sjb11p",[696],{"text":637,"type":69},{"type":220,"content":698},[699,708,716,724,732],{"type":254,"attrs":700,"content":701},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[702],{"type":63,"attrs":703,"content":705},{"id":704},"p_67tci55k",[706],{"text":707,"type":69},"Native subagents",{"type":254,"attrs":709,"content":710},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[711],{"type":63,"attrs":712,"content":714},{"id":713},"p_dns1yoog",[715],{"text":584,"type":69},{"type":254,"attrs":717,"content":718},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[719],{"type":63,"attrs":720,"content":722},{"id":721},"p_fp2vk1af",[723],{"text":637,"type":69},{"type":254,"attrs":725,"content":726},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[727],{"type":63,"attrs":728,"content":730},{"id":729},"p_nkqz97qr",[731],{"text":637,"type":69},{"type":254,"attrs":733,"content":734},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[735],{"type":63,"attrs":736,"content":738},{"id":737},"p_8vo0mb1r",[739],{"text":740,"type":69},"~",{"type":220,"content":742},[743,752,760,768,777],{"type":254,"attrs":744,"content":745},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[746],{"type":63,"attrs":747,"content":749},{"id":748},"p_5wg691c1",[750],{"text":751,"type":69},"First-class RAG",{"type":254,"attrs":753,"content":754},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[755],{"type":63,"attrs":756,"content":758},{"id":757},"p_cf9uapeg",[759],{"text":637,"type":69},{"type":254,"attrs":761,"content":762},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[763],{"type":63,"attrs":764,"content":766},{"id":765},"p_b82abbdl",[767],{"text":637,"type":69},{"type":254,"attrs":769,"content":770},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[771],{"type":63,"attrs":772,"content":774},{"id":773},"p_5md2z5c4",[775],{"text":776,"type":69},"✓✓",{"type":254,"attrs":778,"content":779},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[780],{"type":63,"attrs":781,"content":783},{"id":782},"p_3at3piw3",[784],{"text":637,"type":69},{"type":220,"content":786},[787,796,805,813,822],{"type":254,"attrs":788,"content":789},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[790],{"type":63,"attrs":791,"content":793},{"id":792},"p_1dly1sx5",[794],{"text":795,"type":69},"Observability \u002F tracing",{"type":254,"attrs":797,"content":798},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[799],{"type":63,"attrs":800,"content":802},{"id":801},"p_bnkqxzwh",[803],{"text":804,"type":69},"basic",{"type":254,"attrs":806,"content":807},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[808],{"type":63,"attrs":809,"content":811},{"id":810},"p_k8f8lg7t",[812],{"text":804,"type":69},{"type":254,"attrs":814,"content":815},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[816],{"type":63,"attrs":817,"content":819},{"id":818},"p_renux3az",[820],{"text":821,"type":69},"✓ OTel",{"type":254,"attrs":823,"content":824},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[825],{"type":63,"attrs":826,"content":828},{"id":827},"p_t0bwrok4",[829],{"text":804,"type":69},{"type":220,"content":831},[832,840,848,856,864],{"type":254,"attrs":833,"content":834},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[835],{"type":63,"attrs":836,"content":838},{"id":837},"p_dm8migbo",[839],{"text":486,"type":69},{"type":254,"attrs":841,"content":842},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[843],{"type":63,"attrs":844,"content":846},{"id":845},"p_m3byn309",[847],{"text":637,"type":69},{"type":254,"attrs":849,"content":850},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[851],{"type":63,"attrs":852,"content":854},{"id":853},"p_7mnge7ts",[855],{"text":584,"type":69},{"type":254,"attrs":857,"content":858},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[859],{"type":63,"attrs":860,"content":862},{"id":861},"p_jg9ost3z",[863],{"text":637,"type":69},{"type":254,"attrs":865,"content":866},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[867],{"type":63,"attrs":868,"content":870},{"id":869},"p_wc3g3nc0",[871],{"text":637,"type":69},{"type":220,"content":873},[874,883,892,901,910],{"type":254,"attrs":875,"content":876},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[877],{"type":63,"attrs":878,"content":880},{"id":879},"p_38x5gztb",[881],{"text":882,"type":69},"Provider agnostic",{"type":254,"attrs":884,"content":885},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[886],{"type":63,"attrs":887,"content":889},{"id":888},"p_i01ykz2m",[890],{"text":891,"type":69},"via base-URL",{"type":254,"attrs":893,"content":894},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[895],{"type":63,"attrs":896,"content":898},{"id":897},"p_5ajzqnqd",[899],{"text":900,"type":69},"✓ neutral",{"type":254,"attrs":902,"content":903},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[904],{"type":63,"attrs":905,"content":907},{"id":906},"p_njjepqp4",[908],{"text":909,"type":69},"✓ plugins",{"type":254,"attrs":911,"content":912},{"align":9,"colspan":225,"rowspan":225,"colwidth":9},[913],{"type":63,"attrs":914,"content":916},{"id":915},"p_lnvhm645",[917],{"text":584,"type":69},{"type":100,"attrs":919,"content":921},{"id":920,"level":36},"h_rjpu8ezs",[922],{"text":923,"type":69},"The decision ruler",{"type":63,"attrs":925,"content":927},{"id":926},"p_f826p5vt",[928,930],{"text":929,"type":69},"After all this, the question I ask today, before any line of code, is just one: ",{"text":931,"type":69,"marks":932},"what is the app format?",[933],{"type":74},{"type":935,"attrs":936,"content":938},"compare",{"id":937},"cmp_p6dxzwzi",[939,958],{"type":940,"attrs":941,"content":945},"compareColumn",{"id":942,"side":943,"title":944},"col_kxhgvnzw","left","❌ How I used to decide",[946,952],{"type":63,"attrs":947,"content":949},{"id":948},"p_tdq8ogs1",[950],{"text":951,"type":69},"“Which SDK locks me in the least to the vendor?”",{"type":63,"attrs":953,"content":955},{"id":954},"p_r27orci5",[956],{"text":957,"type":69},"Result: I chose out of fear, not because of the problem.",{"type":940,"attrs":959,"content":963},{"id":960,"side":961,"title":962},"col_9yyjhg0r","right","✅ How I decide now",[964,970],{"type":63,"attrs":965,"content":967},{"id":966},"p_z38blljq",[968],{"text":969,"type":69},"“Which batteries-included matches the app format?”",{"type":63,"attrs":971,"content":973},{"id":972},"p_fz2vdxj7",[974],{"text":975,"type":69},"Result: the tool that already solves the right type of problem.",{"type":977,"attrs":978,"content":981},"bulletList",{"id":979,"tight":980},"ul_9qczz17w",true,[982,997,1011,1025],{"type":983,"attrs":984,"content":986},"listItem",{"id":985},"li_lwq43csg",[987],{"type":63,"attrs":988,"content":990},{"id":989},"p_5akjgbf4",[991,995],{"text":992,"type":69,"marks":993},"Autonomous code agent",[994],{"type":74},{"text":996,"type":69}," (security, approval, subagents) → claude-agent-sdk",{"type":983,"attrs":998,"content":1000},{"id":999},"li_pll0oyxq",[1001],{"type":63,"attrs":1002,"content":1004},{"id":1003},"p_odzhuhjk",[1005,1009],{"text":1006,"type":69,"marks":1007},"Content + RAG + flows + observability",[1008],{"type":74},{"text":1010,"type":69}," → Genkit",{"type":983,"attrs":1012,"content":1014},{"id":1013},"li_uyh2lrp9",[1015],{"type":63,"attrs":1016,"content":1018},{"id":1017},"p_bota6lo9",[1019,1023],{"text":1020,"type":69,"marks":1021},"Typed agent logic (Python)",[1022],{"type":74},{"text":1024,"type":69}," → pydantic-ai",{"type":983,"attrs":1026,"content":1028},{"id":1027},"li_94jxqyc9",[1029],{"type":63,"attrs":1030,"content":1032},{"id":1031},"p_2jkoja1m",[1033,1037],{"text":1034,"type":69,"marks":1035},"Truly provider-neutral + UI",[1036],{"type":74},{"text":1038,"type":69}," → Vercel AI SDK",{"type":100,"attrs":1040,"content":1042},{"id":1041,"level":36},"h_g8r95u93",[1043],{"text":1044,"type":69},"Bonus: the settingSources trap",{"type":63,"attrs":1046,"content":1048},{"id":1047},"p_hqq5kw3k",[1049,1051,1055,1057,1059,1063],{"text":1050,"type":69},"A technical surprise worth keeping in mind, if you use claude-agent-sdk: your agent ",{"text":1052,"type":69,"marks":1053},"inherits the Claude Code environment",[1054],{"type":74},{"text":1056,"type":69}," (hooks, plugins, CLAUDE.md, permission rules) even if it is not Claude Code. ",{"text":1058,"type":69},"And it is not because of the API key — it is the default of ",{"text":1060,"type":69,"marks":1061},"settingSources",[1062],{"type":151},{"text":1060,"type":69},{"type":180,"attrs":1065,"content":1069},{"id":1066,"language":1067,"highlighted":1068},"code_d1mciiar","typescript","\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">\u002F\u002F sdk.d.ts: \"When omitted, all sources are loaded (matches CLI defaults).\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">\u002F\u002F           Pass [] to disable filesystem settings (SDK isolation mode).\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">buildAgentOptions\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">({\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">  \u002F\u002F settingSources OMITIDO  -> carrega ~\u002F.claude inteiro (hooks\u002FCLAUDE.md\u002Fperms)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">  settingSources: [],        \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">\u002F\u002F &#x3C;- modo ISOLAMENTO: só as regras do teu app\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">})\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",[1070],{"text":1071,"type":69},"\u002F\u002F sdk.d.ts: \"When omitted, all sources are loaded (matches CLI defaults).\n\u002F\u002F           Pass [] to disable filesystem settings (SDK isolation mode).\"\n\nbuildAgentOptions({\n  \u002F\u002F settingSources OMITIDO  -> carrega ~\u002F.claude inteiro (hooks\u002FCLAUDE.md\u002Fperms)\n  settingSources: [],        \u002F\u002F \u003C- modo ISOLAMENTO: só as regras do teu app\n})",{"type":117,"attrs":1073,"content":1077},{"id":1074,"type":1075,"title":1076},"call_i59phcxu","info",". The lesson",[1078],{"type":63,"attrs":1079,"content":1081},{"id":1080},"p_2ybhk3wd",[1082,1084,1088,1090,1092,1095],{"text":1083,"type":69},"Auth (which API key) is ",{"text":1085,"type":69,"marks":1086},"orthogonal",[1087],{"type":74},{"text":1089,"type":69}," to settings loading. ",{"text":1091,"type":69},"If your agent inherits behavior you didn't ask for, the lever is ",{"text":1060,"type":69,"marks":1093},[1094],{"type":151},{"text":1060,"type":69},{"type":100,"attrs":1097,"content":1099},{"id":1098,"level":36},"h_hjuiqki8",[1100],{"text":1101,"type":69},", not the key. Make it explicit — accidental inheritance is debt.",{"type":977,"attrs":1103,"content":1105},{"id":1104,"tight":980},"ul_hiz605hi",[1106,1120,1134,1148,1162],{"type":983,"attrs":1107,"content":1109},{"id":1108},"li_itsv4587",[1110],{"type":63,"attrs":1111,"content":1113},{"id":1112},"p_1seba8km",[1114,1118],{"text":1115,"type":69,"marks":1116},"What I take to every new project",[1117],{"type":74},{"text":1119,"type":69},"Vendor is not a criterion. Every agent SDK is agnostic via base-URL \u002F gateway \u002F plugins.",{"type":983,"attrs":1121,"content":1123},{"id":1122},"li_092x5nrz",[1124],{"type":63,"attrs":1125,"content":1127},{"id":1126},"p_a6qp1eok",[1128,1132],{"text":1129,"type":69,"marks":1130},"Decide by the app format",[1131],{"type":74},{"text":1133,"type":69},", not by the brand or fear of lock-in.",{"type":983,"attrs":1135,"content":1137},{"id":1136},"li_6onq18cz",[1138],{"type":63,"attrs":1139,"content":1141},{"id":1140},"p_q08cx7bz",[1142,1146],{"text":1143,"type":69,"marks":1144},"Batteries-included > theoretical agnosticism. What comes ready-made saves weeks.",[1145],{"type":74},{"text":1147,"type":69},"Testing and migrating without guilt is correct selection, not an error (that's how I went from pydantic-ai to Genkit in a content app).",{"type":983,"attrs":1149,"content":1151},{"id":1150},"li_9226hmna",[1152],{"type":63,"attrs":1153,"content":1155},{"id":1154},"p_75zritlt",[1156,1160],{"text":1157,"type":69,"marks":1158},"What is reusable is UI\u002Finfra",[1159],{"type":74},{"text":1161,"type":69},", not the engine: extract chat, streaming, and retriever into a common package.",{"type":983,"attrs":1163,"content":1165},{"id":1164},"li_819uqj5l",[1166],{"type":63,"attrs":1167,"content":1169},{"id":1168},"p_tujlceq3",[1170,1174],{"text":1171,"type":69,"marks":1172},"The good part about discovering you were wrong is that the remaining ruler is simple and reusable.",[1173],{"type":74},{"text":1175,"type":69},"Not “which SDK is the best” — but rather ",{"type":63,"attrs":1177,"content":1179},{"id":1178},"p_eyx8zusg",[1180,1182,1184,1188,1192,1195],{"text":1181,"type":69},"which SDK is the best for ",{"text":1183,"type":69},"this",{"text":1185,"type":69,"marks":1186}," app",[1187],{"type":158},{"text":1189,"type":69,"marks":1190},".",[1191],{"type":158},{"text":1185,"type":69,"marks":1193},[1194],{"type":158},{"text":1189,"type":69},"How to choose an AI SDK: stop fearing lock-in","Forget the fear of lock-in. Learn to choose the ideal AI SDK by focusing on your app's format and the features that are ready for use.","2026-08-24T14:53:53.315534+00:00",[1200,1223,1239,1253],{"id":1201,"slug":1202,"title":1203,"excerpt":1204,"image":1205,"featured":44,"groupId":1206,"publishedAt":1207,"readingTime":1208,"views":48,"author":1209,"category":1210,"tags":1211},"10ee04ce-fa53-44d7-9603-2e375733d313","the-rise-of-shadow-deployment-and-the-dna-behind-the-hidden-ox-alpha-model","The Rise of Shadow Deployment and the DNA Behind the Hidden Ox Alpha Model","The ghost launch of Ox Alpha revealed a new era in software engineering, where strategic anonymity redefines the future of AI models.","https:\u002F\u002Fmfgiomkkbihnlpfdxwrt.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fblog-assets\u002Fmedia\u002Ffeatured\u002F1787604179257-featured-byxw99.webp","ba241d77-9b03-4c87-8e52-ba727a888e59","2026-08-24T22:56:11.386568+00:00",7,{"name":50,"avatar":9},{"slug":19,"name":20,"color":21},[1212,1215,1216,1219,1220],{"slug":1213,"name":1214},"china","China",{"slug":57,"name":58},{"slug":1217,"name":1218},"infraestrutura","Infraestrutura",{"slug":54,"name":55},{"slug":1221,"name":1222},"performance","Performance",{"id":1224,"slug":1225,"title":1226,"excerpt":1227,"image":1228,"featured":44,"groupId":1229,"publishedAt":1230,"readingTime":29,"views":48,"author":1231,"category":1232,"tags":1233},"99d8b7bf-03aa-4c01-8bc7-ef1aca804b30","conversational-ai-exhausted-how-to-migrate-to-agentic-workflows-and-execute-real-actions","Conversational AI Exhausted? How to Migrate to Agentic Workflows and Execute Real Actions","The chat paradigm is exhausted. Discover agentic workflows: systems that plan, execute, and verify tasks autonomously and in a testable manner.","https:\u002F\u002Fmfgiomkkbihnlpfdxwrt.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fblog-assets\u002Fmedia\u002Ffeatured\u002F1773194326109-featured-g0e36z.jpeg","2438fae0-5c5e-41ce-9543-89007a6888cc","2026-07-08T23:42:19.403576+00:00",{"name":50,"avatar":9},{"slug":19,"name":20,"color":21},[1234,1235,1236],{"slug":54,"name":55},{"slug":57,"name":58},{"slug":1237,"name":1238},"openclaw","OpenClaw",{"id":1240,"slug":1241,"title":1242,"excerpt":1243,"image":1244,"featured":44,"groupId":1245,"publishedAt":1246,"readingTime":1247,"views":48,"author":1248,"category":1249,"tags":1250},"011ee3e7-61c8-4877-a99b-edc119022f4d","glm-52-vs-kimi-k27-why-glm-wins-the-code-reliability-test","GLM-5.2 vs. Kimi K2.7: Why GLM Wins the Code Reliability Test","Five independent evaluators tested GLM-5.2 and Kimi K2.7 on coding tasks. Discover which model wins the battle for reliability and development speed.","https:\u002F\u002Fmfgiomkkbihnlpfdxwrt.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fblog-assets\u002Fmedia\u002Ffeatured\u002F1782256309298-featured-ubiuao.webp","8707b037-1af8-46ff-972a-99c4ead20adc","2026-07-08T22:58:35.7148+00:00",5,{"name":50,"avatar":9},{"slug":19,"name":20,"color":21},[1251,1252],{"slug":54,"name":55},{"slug":1221,"name":1222},{"id":1254,"slug":1255,"title":1256,"excerpt":1257,"image":1258,"featured":44,"groupId":1259,"publishedAt":1260,"readingTime":391,"views":48,"author":1261,"category":1262,"tags":1263},"d9638633-92f1-4ee3-88da-001b4e599233","moving-ai-agents-to-production-why-capability-isnt-enough-anymore","Moving AI Agents to Production: Why Capability Isn't Enough Anymore","The challenge for AI agents has shifted from proving capability to ensuring reliability, governance, and cost-efficiency in real-world production.","https:\u002F\u002Fmfgiomkkbihnlpfdxwrt.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fblog-assets\u002Fmedia\u002Ffeatured\u002F1773890753958-featured-dwbmox.jpeg","6edadcfc-9020-4959-86e3-b8ccb17ab5b8","2026-06-23T23:35:06.18764+00:00",{"name":50,"avatar":9},{"slug":19,"name":20,"color":21},[1264,1265],{"slug":54,"name":55},{"slug":57,"name":58},{"pt":1267,"en":40},"como-escolher-um-sdk-de-ia-por-que-o-medo-de-lock-in-e-um-erro-e-como-decidir-pelo-formato-do-seu-app"]