System NotesXendai / Technical publication
Architecture before the provider
Choosing a provider introduces decisions about how a system will operate, which information it will retain, and what will be difficult to change later. Architecture makes those decisions explicit before they become scattered across integrations and habits. Its purpose is to accept dependencies deliberately, not to eliminate every connection to a particular technology.
A platform can meet important needs and reduce development work. It also proposes a way to organize information, execute actions, and manage operation. Adopting it means deciding how much of that approach fits the service being designed.
Problems arise when selection focuses on visible capabilities and architectural consequences emerge only during integration. At that point, changing direction may affect far more than a single API call.
Designing first does not mean fixing every detail before trying a tool. It means identifying responsibilities, boundaries, and conditions against which fit can be assessed. The provider may influence the design, but that influence should be part of a recognizable decision.
A purchase distributes responsibilities
Adopting a platform can delegate storage, execution, retrieval, or access management. Each externalized capability changes what the organization retains under its control and what it needs from another party.
That distribution cannot be inferred from a feature list alone. Two products can offer similar capabilities while assuming different responsibilities for persistence, error handling, or user administration.
The architectural question is therefore not only what the provider does. It is what the application must still do to fulfill its commitment to users. A managed function can reduce technical work without resolving business rules or accountability for the outcome.
Selection needs to identify these boundaries. Who retains the state of an operation? Where are permissions checked? Which component decides the work is complete? External services may participate in the answers, but the answers must remain understandable to the organization.
Commercial availability also differs from usable capability. A feature existing does not mean it fits the project's environment, volume, or conditions. Its value depends on integration with what already exists and the obligations adoption introduces.
A well-defined purchase decision explains what is delegated and what is retained. That explanation supports comparisons between alternatives without turning them into disconnected feature inventories. It also prevents a capability's managed status from being mistaken for ownership of the complete business outcome.
Contracts matter more than boxes
A diagram can show separate components while concealing a tight dependency between them. Visual separation does not establish that they can evolve independently.
The important relationship is the contract connecting them: the information exchanged, its meaning, and the conditions each party must meet. That includes expected behavior when a request cannot be fulfilled, not only the format used on the successful path.
An interface specification can express part of this agreement. OpenAPI provides a language-independent description of HTTP APIs. Such a description helps explain an interface, but does not by itself establish that two services offer equivalent behavior.
The distinction is particularly relevant in AI systems. Two models may accept similar structures and return outputs valid against the same schema while interpreting tasks or using tools differently. Format compatibility and operational equivalence are separate questions.
Contracts also need to make clear what belongs to the application. A business decision left implicit in provider behavior can be difficult to detect when it changes. When the decision is defined within the system, the contribution of each alternative can be checked against it.
Not every contract needs a custom software layer. It may start as a clear definition and acceptance tests. The essential requirement is a boundary with verifiable meaning, rather than merely a name on an architecture diagram. The implementation can remain modest when that is enough to preserve the agreement.
State shapes the freedom to change
Dependency does not exist only in code calling a service. It can also reside in accumulated information and the way that information is interpreted. When a platform retains state, its meaning and relationship to company work matter.
Exporting data does not guarantee an operation can be reconstructed elsewhere. Relationships between records, decision history, or the meaning of an intermediate state may be missing. Downloading files and continuing a service are different capabilities.
The organization should decide which information needs a representation it controls and which may remain provider-managed. There is no universal answer. Maintaining a separate copy adds synchronization, security, and maintenance work of its own.
The decision depends on the consequences of losing access or changing tools. If state is essential to handling pending work, the architecture should explain how continuity is preserved. Derived information that can be regenerated may not need the same strategy.
Access to operational records matters too. A platform can provide a convenient experience while limiting the information available for investigating problems. That limitation should be understood before accepting a commitment requiring the system's behavior to be explained.
Data and state design therefore concern continuity as well as storage. They determine what the company needs to keep working when a component changes and the effort involved in preserving that option. The objective is an intentional decision, not a duplicate of everything by default.
An abstraction should protect a specific difference
A layer between the application and a provider can centralize translation and stop external details from spreading. It adds value only when the difference being isolated is understood.
If the layer merely renames a function while passing every external concept through unchanged, dependency can remain intact. The application appears separate but is still organized around the provider's information model.
Microsoft's anti-corruption layer pattern describes translation between subsystems with different semantics. It also notes the maintenance work and potential latency introduced by that separation. The pattern supports protecting an internal model; it does not require a layer in every integration.
An overly general abstraction can force every alternative down to a lowest common denominator and make valuable capabilities harder to use. It can also require maintaining an interface that no provider actually needs and whose future usefulness remains uncertain.
The sensible target for isolation is what should remain stable: work concepts, acceptance states, or contracts with other components. Provider-specific details can remain visible at a localized boundary when hiding them adds complexity without a corresponding benefit.
The useful question is which change the abstraction is intended to make cheaper and how much preparing for it costs. If that change cannot be described, the abstraction may serve an aspiration for flexibility rather than a need of the system. Flexibility has value when it preserves an option worth having.
Diagram connections
- Application and work rules Save state → Work state
- Work state Retrieve state → Application and work rules
- Application and work rules Authorized action → Business tools
- Business tools Result → Application and work rules
- Application and work rules System request → Integration boundary
- Integration boundary Adapted response → Application and work rules
- Integration boundary Provider request → Inference provider
- Inference provider Provider response → Integration boundary
A conceptual example of a localized boundary. Adaptation does not guarantee equivalent provider behavior; that behavior needs checking again when a component changes. Boxes represent responsibilities, not mandatory separate services.
The application saves and retrieves state, invokes authorized business tools, and receives results. Inference requests pass through an integration boundary that adapts requests and responses. The provider has no direct connection to business tools in this example.
Switching requires more than another API
Replacing a provider may require code changes, behavior review, and information transfer. Treating it solely as a connectivity problem understates the work.
A new option may interpret instructions differently, impose different limits, or return errors the application does not handle. Even when integration succeeds, the service must demonstrate again that it meets relevant conditions.
Migration must account for ongoing work. It may be preferable to finish existing operations in the previous environment and send new work to the next one, or to prepare a specific transition. The appropriate choice depends on the identity and state of those operations.
Operation can change as well. The team may have different diagnostic tools, access procedures, or ways to inspect consumption. Switching cost includes learning to maintain the replacement and retiring the previous service without abandoning work.
There is no need to build a complete second implementation for every possible provider. There is value in knowing what would need review and which elements would make transition difficult. That knowledge distinguishes an accepted dependency from one discovered too late.
Analysis should be proportionate to the component's role. A replaceable auxiliary tool does not warrant the same effort as a platform concentrating state, integrations, and decisions. Architecture helps identify where preserving options matters.
The cost of not switching also belongs in the decision. A dependency can remain reasonable for a long time if the provider delivers value and meets the required conditions. Being able to evaluate an exit does not create an obligation to take it.
Choose with evidence and accept the tradeoff
Once boundaries are defined, selection can focus on actual fit. Tests should examine the capabilities supporting the work and the conditions that could invalidate an option, rather than only its most favorable demonstration.
This makes tradeoffs visible. One option may reduce maintenance while concentrating more state externally. Another may provide greater control while demanding more operational capacity internally. The decision should explain why that exchange suits the organization.
Relevant conditions can evolve. Business needs, workload, and team capacity change. Revisiting a choice does not mean it was wrong; it means checking whether its reasons still apply.
A brief decision record helps: what was needed, which alternatives were considered, which dependency was accepted, and which facts would require reconsideration? Without it, architectural intent can be reduced to the memories of people involved in the purchase.
The record should distinguish confirmed commitments from expectations. A capability announced for later does not provide the same basis as an available, tested feature. If the project depends on future development, that condition needs to remain visible.
Cost and capacity limits deserve the same treatment. A small test can establish functional fit without describing behavior at the intended volume. Selection should identify what has been checked and which assumptions remain, rather than converting the first successful integration into unconditional approval.
Architecture before the provider is a discipline for making decisions. It allows external capabilities to be used without letting their availability silently determine what the system means. It also permits the design to change when a tool offers enough benefit to justify it.
The result need not be provider-neutral or interchangeable at every point. It should have purposeful dependencies, explainable limits, and maintenance requirements compatible with the company that uses it. Those are more useful properties than neutrality claimed on a diagram but absent from operation.
An explicit dependency is also easier to discuss when needs change. The team can return to the responsibility it delegated, the state it needs to preserve, and the behavior it promised to users. It can then assess whether another arrangement offers a meaningful advantage. This avoids treating the original provider as either an irreversible choice or a component that can be replaced without consequences.
The architecture provides a record of those commitments. Its usefulness lies in helping the organization evaluate the next change with the same care as the first selection, including the effort required to maintain the option of changing at all.
KEY TAKEAWAY
Provider selection requires understanding delegated responsibilities, the contracts connecting components, and the information supporting work continuity. A dependency can be a sound choice when its value and switching cost are understood. Architecture makes it possible to accept that tradeoff with evidence and revisit the decision when its underlying reasons change.
XENDAI CONNECTION
Xendai designs the responsibilities and integrations that make informed technology selection possible. The aim is to use available capabilities, understand accepted dependencies, and maintain a clear relationship between architecture and the work the business needs to resolve.