Auditing a codebase before a cutover
Finding every hardcoded assumption, centralising configuration, and load-testing the target before traffic moves.
A provider migration is rarely difficult because the new API is difficult. It is difficult because the old one is spread out. A model string in a config file, another in a retry branch nobody has read since it was written, a token budget in a constant named MAX_LEN, a base URL in a Terraform variable, an exception class from one vendor’s SDK caught by name in three services. Each of those is a single line. Collectively they are the migration.
These pages are the work that happens before the cutover date: finding every copy of every assumption, moving them behind one configuration point, proving the target survives your real traffic shape, and reading the parts of the agreement that decide whether you are allowed to send the traffic at all. The order matters — the audit is what tells you how long the rest will take.
Auditing a Codebase for Every Place a Model Name Is Hardcoded
A search-and-inventory pass that finds literal model strings, base URLs, token budgets and provider-specific error handling — including the copies no repository grep can reach.
10 min read
Centralizing Model Configuration Before a Migration
Collapsing scattered model strings into one registry that carries capabilities as well as names, so the migration becomes a config change rather than a code change.
10 min read
What a Load Test Should Check Before a Provider Migration Goes Live
What to put under load on a migration target — sustained throughput, burst behaviour against two separate limits, and what happens when responses are long.
10 min read
Comparing Tail Latency Before and After a Provider Migration
How to measure p50, p95 and p99 against two providers on a fixed request set, and the arithmetic that says whether an observed difference means anything.
10 min read
Migrating Idempotency and Deduplication Logic Between Providers
What a provider-side idempotency key actually protects, why an unsupported header fails silently, and how to build the client-side deduplication that replaces it.
9 min read
What a Provider's Terms Say About Using Your Prompts and Outputs to Train
The clause types that decide whether submitted prompts and generated outputs can be used to improve a provider's models, and how to read your own agreement for them.
9 min read
Auditing Data Residency Requirements Before a Provider Migration
How to confirm where a migration target actually processes and stores request content, and how to verify the claim rather than accept the region label.
9 min read
What Changes About Data Processing Agreements During a Migration
The clauses a new processor agreement has to carry, why the old one does not simply transfer, and what a migration owes the customers named in it.
9 min read
Migrating Structured Logging Schemas for LLM Calls
Designing a provider-agnostic call log — canonical usage, cost and stop-reason fields — so that changing providers is not also a logging and dashboard rewrite.
10 min read
What a Provider Migration Does to A/B Test Validity
Changing providers mid-experiment breaks the assumption that an arm names one treatment, and the pooled result is then confounded with time rather than merely noisier.
10 min read
Migrating Prompt Templates Out of a No-Code Platform
A manual extraction procedure for pulling prompt text, variables and model configuration out of a builder UI into a versioned, code-based format that survives the move.
10 min read
What a No-Code AI Platform Doesn't Let You Export
The components of a builder-hosted application that have no serialised form to take with you, why they do not, and what each one costs to rebuild.
9 min read
Migrating Off a No-Code Chatbot Builder to Custom Code
Rebuilds a visual chatbot flow as an explicit code path by mapping each node type to the pattern that replaces it, including the failure behaviour the canvas hid.
11 min read
Mapping Webhook and Callback Payload Fields Between Providers
What an async job-completion notification contains, how the envelope and the status vocabulary differ between provider shapes, and which parts of a handler have to be rewritten rather than remapped.
10 min read
Migrating an Async Job Polling Loop Between Provider APIs
Rewrites a job-status polling loop for a different provider's status field and terminal states, with the backoff, the deadline and the terminal-state test adjusted to match.
10 min read
What Timeout Defaults Change When You Switch Providers
Where the effective timeout on an inference request actually comes from, why the shortest link in the chain wins, and how to reset it against a new provider's latency profile.
10 min read
Migrating a Prompt Injection Test Suite Between Model Families
Adapts an existing injection red-team suite to a new model family by separating each case's intent from its surface wording, and rewriting only the surface.
10 min read
Other topics
- LLM fundamentals & architecture
- Tokens, tokenization & context windows
- Prompt engineering
- Reasoning models & test-time compute
- Multimodal AI: vision, audio, video
- RAG & retrieval
- Embeddings & vector search
- AI agents & tool use
- Structured output & function calling
- Fine-tuning & post-training
- Local inference errors, string by string
- Running local models day to day
- Testing code that calls an LLM
- Snapshot and property testing for model output
- Regression suites for prompts
- Eval gates in CI
- Flaky tests against a model
- Determinism and the cost of testing
- Contract and streaming tests
- Testing tool calls and retrieval
- Inference, serving & latency
- Rolling out a prompt change
- Testing AI systems in practice
- Forecasting a time series
- Machine learning on tabular data
- Geospatial data and models
- Understanding audio that is not speech
- Understanding video
- Core computer vision tasks
- Machine learning on graphs
- Point clouds and 3D
- Evaluation, benchmarks & LLM-as-judge
- Sensor and IoT data
- Logs and event streams
- Models over biological sequences
- Machine learning on molecules
- Embedding and searching code
- Extracting invoices and purchase orders
- Receipts, statements and tax forms
- Insurance policies and contracts
- Deeds, court filings and patents
- Extracting from medical records
- Observability & LLMOps
- CVs, certificates and identity documents
- Shipping, customs and technical documents
- Meetings, email, chat and filled-in forms
- Building an extraction pipeline
- Business, property and inspection documents
- Contract clauses and insurance claims
- Regulated and compliance documents
- Consumer, travel and closing documents
- Mapping one chat API onto another
- SDK and framework migrations
- Hallucination & failure modes
- Re-embedding and model deprecation
- Cutting over between providers
- Parity gaps, shims and legacy endpoints
- Moving between model versions
- Migrating vector stores and caches
- Mapping capabilities and parameters
- Migrating pipelines and agents
- Contracts, runbooks and rollback
- Compliance and fine-tune migration
- LLM cost engineering
- Routing, cost tracking and multi-tenancy
- What a migration does to your prompts
- AI security & prompt injection
- Privacy, compliance & data residency
- AI governance, policy & society
- Building reliable AI applications
- AI hardware, GPUs & compute
- Open-weight models & local inference
- AI for developers & coding agents
- AI in industry: vertical playbooks
- AGI, superintelligence, alignment & the long future
- Machine learning foundations
- NLP fundamentals & classical tasks
- Data engineering for AI
- Synthetic data & dataset curation
- AI product design & UX
- Search, ranking & recommendation
- Enterprise adoption & change management
- AI careers, skills & teams
- Reading AI research
- AI in science & discovery
- Robotics & embodied AI
- AI economics, markets & business models
- AI myths, hype & media literacy
- Context engineering
- Shipping AI features: patterns & anti-patterns
- Build it: end-to-end AI tutorials
- Python for AI: hands-on recipes
- TypeScript, React and the web
- Frameworks and SDKs
- Errors and troubleshooting
- AI facts, numbers and statistics
- The history of AI
- The maths behind AI
- Architectures beyond the transformer
- Reinforcement learning
- Diffusion and generative media
- Speech, audio and voice engineering
- Benchmarks, one at a time
- AI search visibility
- Infrastructure and operations
- Databases and storage for AI
- Knowledge graphs and structured knowledge
- Classical ML in production
- Regulation, jurisdiction by jurisdiction
- Prompt recipes and pattern library
- AI for people who do not write code
- Writing, media and creative work
- Edge and on-device AI
- Interpretability and model internals
- Field notes
- OpenAI model behaviour
- Claude model behaviour
- Gemini model behaviour
- Llama model behaviour
- Mistral model behaviour
- Qwen model behaviour
- DeepSeek model behaviour
- Cohere model behaviour
- Grok model behaviour
- Small model behaviour
- Hybrid model architectures
- Token cost by language and script
- Transliteration, romanization and script handling
- Locale-correct output
- Multilingual generation quality
- Multilingual pipelines
- The EU AI Act, article by article
- AI under the GDPR and EU data law
- US AI regulation, state and sector
- International AI governance and standards
- AI litigation and enforcement
- Running AI workloads on AWS
- Running AI workloads on Google Cloud
- Running AI workloads on Azure
- AI at the edge: Workers, Vercel and Netlify
- Serving models on Kubernetes
- Operating AI infrastructure
- Quantization formats and what they cost
- llama.cpp, flag by flag
- Ollama and the desktop local-model runtimes
- Local models on Apple Silicon
- Hardware for local inference
- Running speech and embedding models locally
- Model files, adapters and conversion
- VRAM arithmetic for local models