Commits
AI enters Settings: providers, SEO and automatic articles
AI provider configuration, debugging 500 and 429, SEO per article with
Today was AI day: provider configuration in the panel and two new phases. The site is one step away from full semi-automatic writing.
AI Settings: providers, uses and tone
New section at /admin/ajustes/ia with three tabs. In Providers there are preloaded presets (ready-made configurations for OpenAI, Mistral, Groq, OpenRouter, Gemini, Z.ai, Minimax and Ollama), editable base URL, masked key when saving, and a «Load models» button that detects what each model can do. In Uses you decide which model does what: create content, images, vision scanner, translation or voice. And Tone stores the prompts (the instructions the models receive) for tone, audience and article structure.
The 500s of the road
Debugging left three fixes. AIService wasn't saving the database connection and automatic alt text for images was returning 500 (internal server error). The asset URL (the file, in this case) only existed in the schema and the router, which distributes the requests, was generating it incorrectly. And the most useful rule: test via HTTP, not just by calling the service. The 500s only appeared through the router's route.
Minimax and the wrong domain
The Minimax key wasn't working. The account is from the international platform (minimax.io) and the preset pointed to minimaxi.com, the Chinese one. I diagnosed it by testing the key against the three provider domains without exposing it: correct response only at .io, with 8 models. As a bonus, provider errors now show the actual response instead of a generic 502 (a «service unavailable» that explains nothing).
Key typed, key saved
Fixing «send what's being typed» broke the flow after reloading the page. The empty form sent an empty key and the backend (the server side) preferred it over the saved one. Logic corrected: what you type takes priority; what's missing is taken from what's saved.
The free tier and its 429s
The vision batches were blowing past the free tier (the zero-payment plan) request limit: 429: too many requests in a row. Pause between calls and per-image errors within the response. Gemini 2.5 Flash was burning through the token budget (the pieces of text the model processes) «thinking»: thinking is enabled by default, and descriptions came out cut off. Budget raised to 2,000, scanner moved to flash-lite and separate limits pool. And Ollama Cloud returned 402 without credits: vision gets reassigned to a free Gemini.
SEO per article
New columns for meta title, description and social image. In the editor's rail (the new editor arrived with Crepe out, BlockNote in) there are character counters and an SEO score out of 100, with a checklist of 10 checks. The AI assistant offers meta, summary, slug (the article's short address), review and rewriting with the Tone prompts already saved. The public page includes Article JSON-LD (structured data that search engines can read).
Create based on the competition
Full flow: keyword, competitors (with Tavily or pasted URLs), extraction from each page, AI analysis and new article. Real test with «història del café» and Wikipedia: draft of 9,462 characters, 8 sections and complete SEO meta in 63 seconds. Mistral saturated the global free tier quota: content reassigned to MiniMax. It's the reverse path of From my text to draft.
Featured image with AI
Each article can generate its own featured image: the text is summarized, the prompt is composed with the style saved in Tone and generated with the image model. The site publishes it and uses it as a fallback og:image (the image that appears when sharing the link). Curious detail: the scene was coming out in Chinese because Minimax drifts to Chinese. System prompt (the fixed instruction that accompanies each call) forcing Spanish and solved.
Pending on my end: the Tavily key for automatic search mode.