Hardware FixRecommendedDevice not working? Your driver may be the problemCheck updates for common hardware issues.Fix DriversHalloween DealsAmazon USHalloween week deals: useful picks before month-endAmazon US: current deals, useful picks and tech finds.Check DealsSlow PC?RecommendedPC slow today? Run a repair scan before it gets worseResolve common Windows issues and optimize system performance.Scan Now×
FREEDOM251

Freedom251 › Blog › AI development

How to Switch Between AI Model Providers Without Rewriting Your App

By Freedom251 Team · · 13 min read

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.

You can switch AI model providers without replacing your application when model access is isolated behind a deliberate boundary. In practice, that boundary is usually a framework adapter inside your code, an OpenAI-compatible gateway in front of your existing client, or a provider-specific SDK interface. The choice depends on the features you use and how much provider-specific behavior your application can tolerate.

None of these approaches makes models interchangeable. Streaming, tool calls, structured output, multimodal inputs, error formats, usage accounting, latency, and output quality can differ even when two services accept similar requests. Treat the migration as a contract-and-behavior change: inventory your dependencies, select the seam that fits your architecture, test representative workloads, and roll traffic out with a rollback path.

As an Amazon Associate I earn from qualifying purchases.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

What does switching AI providers actually involve?

A provider switch is more than changing an API key. Your application may depend on a client library, model names, prompt formatting, token parameters, streaming events, tool-call schemas, structured-output rules, usage fields, retry behavior, and provider-specific controls. If those details are scattered throughout business logic, a new provider forces a broad rewrite. If they are concentrated behind one interface, most of the application can remain unchanged.

There are two common abstraction points:

  • Inside the application: a framework or adapter gives your code a common model interface and translates calls to provider packages.
  • Outside the application: a compatible endpoint or gateway accepts a familiar request contract and routes it to different providers.

A provider SDK can be the best option when you need advanced features that a generic interface cannot represent. A managed migration service can help when the destination is a particular cloud platform, but it is not a general-purpose portability layer.

#1 Best Overall
Sale
TOZO A1 Wireless Earbuds Bluetooth 5.3 Light Weight in Ear Headphones | IPX5 Waterproof,2 Mics for AI Calls,Immersive Premium Sound Bass Headset with Charging Case,32 EQ via App Black
  • [Ultra-Lightweight Ear Buds Designed for Small Ears] Each earbud weighs only 3.7g and features a compact, ergonomic in-ear design made especially for small ears. Secure, low-profile, and comfortable for workouts, all-day wear or overnight sleeping.The ultra-slim profile sits flush in your ear with no hard edges poking or rubbing, so you can even sleep on your side without discomfort.
  • [Immersive Stereo Sound with TOZO OrigX Technology] TOZO OrigX tuning delivers clear vocals, balanced mids, and natural stereo sound for music, podcasts, and videos.
  • [Long Battery Life for Daily Use] Get up to 7 hours of playtime on a single charge, with up to 32 hours total using the charging case—ideal for workdays, commuting, and extended listening sessions.
  • [Bluetooth 5.3 & Stable Connection] Bluetooth 5.3 provides fast pairing, stable wireless performance, and reduced dropouts as you move around home or office.
  • [Deep Bass with Clear Vocals] High-performance drivers produce punchy bass while keeping vocals clean and detailed for everyday listening.

Where should the provider boundary live?

Framework abstraction inside the app

Frameworks such as the Vercel AI SDK and LangChain document common language-model or chat-model interfaces, with provider packages that implement the interface. This approach keeps routing and model selection close to application code and can make a provider a configuration choice rather than a rewrite.

It works best when your application already uses the framework, the required providers have maintained integrations, and the framework exposes the features you need. It still requires migration work: provider packages may expose different options, and a common interface may omit non-standard response fields or advanced controls. LangChain notes that its OpenAI client targets OpenAI API specifications and does not extract or preserve non-standard response fields from third-party providers. If your application relies on such fields, capture them in an explicit provider extension instead of assuming the common interface will retain them.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Compatible endpoint or gateway

A gateway presents one endpoint to your application and routes requests to multiple upstream providers. LiteLLM, for example, documents an OpenAI-format interface, retries and fallbacks, and a self-hosted gateway with virtual keys and cost tracking.

This can preserve an existing client: change the client’s base URL and credentials, then use the gateway’s model identifier or routing syntax. That syntax is specific to the gateway, not a universal rule. Verify its authentication, endpoint coverage, model naming, streaming behavior, logs, and failure semantics before sending production traffic. A gateway may translate ordinary chat requests well while exposing gaps for provider-specific response fields, image inputs, audio, cached prompts, reasoning controls, or structured-output modes.

Provider-specific SDK or adapter

Use a provider SDK when you need capabilities that a generic contract cannot faithfully express, such as proprietary tool execution, special multimodal inputs, or provider-only controls. The trade-off is tighter coupling and more code that must be revisited if you move again.

The OpenAI Agents SDK documents integration points for non-OpenAI models and per-agent or per-run provider choices. Its Any-LLM and LiteLLM paths are described as best-effort beta options, so exact support and request semantics must be tested with your chosen upstream. Keep the adapter behind your own interface even when you use a vendor SDK directly; that preserves a future exit route.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Destination-specific managed migration

On 2026-06-16, AWS announced an AWS Transform assessment for supported generative-AI code patterns moving to Amazon Bedrock. The announcement describes analysis of direct SDKs, frameworks, agents, and routing layers, and says the service can recommend Bedrock’s OpenAI-compatible endpoints for some workloads.

Rank #2
Smart Watch for Men Women Compatible with iPhone Samsung Android Phone 1.69 inch Full Touch Screen IP68 Waterproof Bluetooh Fitness Tracker Heart Rate/Sleep Monitor (Black)
  • 【IP68 Waterproof Multifunctinal Smart Watch】Torjalph fitness activity tracker smart watch is IP68 waterproof technology ,you can wear it when swimming,handwashing,it's rain-proof which means that you perform multiple exercise modes outside without worrying about sweat or rain corroding your fitness smart watch,and this watch equipped with a 230 mAh large capacity battery magnetic charging ,and this sports activity tracker watch can be used 5-7 days If fully charged.
  • 【Larger 1.83'' Full Screen Watch & Multi-dial Selection】1.83 inch full HD color touch screen smart watch for men / women provides excellent 240*284 resolution image quality ,This Bluetooth smart watch offers a better touch experience and remarkable immersion and ,more than 200 watch faces for you to choose from App"Da Fit ", you can change the dial style according to your mood to wear keeping the world on your wrist
  • 【Accurate Activity Tracker Smart Watch 】sports watch activity tracker uses sweat and dust resistant breathable silicone strap, our Fitness Tracker Smart Watch for Android iOS Phones supports 12 sports modes,walking,running,bicycle,swimming,badminton,basketball,football,rope skipping. This bluetooth calls smart watch for men women is lightweight and stylish, bringing more convenient and relaxing sports experience while also providing more protection.
  • 【Your 24 Hour Personal Daily Health Monitor】Fitness watch for women men full touch screen IP67 waterproof bluetooth smartwatch for Android iOS Phones with heart rate blood pressure monitor multifunction Andriod smart watch with steps counter sleep monitor sports fitness watch, monitoring blood oxygen saturation allows you to understand your physical condition in real time to track fitness progress ,to know your health status in time.
  • 【More Functions Bluetooth Call Smart Watch】This fitness activity smart watch full screen for iPhone and Android phones includes a bunch of new features including:The bluetooth smart watch can hang up the phone, receive and display WhatsAPP /Text /Facebook /Twitter /Messenger reminder.Support sedentary reminder, alarm clock, stopwatch, timer,weather information,music control, remote camera control compatible with Android 5.0 and above or iOS 9.0 and above smartphones.

This is useful when Bedrock is the intended destination. It does not provide a neutral interface for moving among arbitrary providers, and eligibility depends on the workload patterns and AWS service support available to your account and region. Treat the assessment as a planning aid, then validate the generated changes and the resulting application behavior yourself.

How do I choose the right migration seam?

Choose the boundary that minimizes irreversible coupling while preserving the features your application actually uses. The table below compares the main options.

Approach Abstraction location Best fit Main trade-off
Framework interface Application code Apps already using a model framework and needing provider choice in configuration Framework feature coverage and provider adapters determine fidelity
Compatible gateway Client endpoint or proxy Teams that want to keep an existing client contract and centralize routing Gateway behavior, model naming, observability, and an extra failure point
Provider SDK Application integration layer Workloads dependent on advanced provider-specific features More provider-specific code and higher future migration cost
Managed migration service Cloud migration workflow Teams committed to a named destination such as Bedrock Destination-specific; not a general portability solution

Evaluate each candidate against exact providers and model IDs, regional availability, streaming, tool calls, structured output, multimodal input, usage reporting, cancellation or continuation behavior, retries, credential storage, logging, budgets, and monitoring. Also measure the workload results that matter to your users. No provider is a universal winner, and public vendor claims are not substitutes for tests on your data.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

How do I inventory provider-specific coupling before changing anything?

Create an inventory before selecting a replacement. Search the codebase, configuration, deployment manifests, prompt files, and tests for every place where provider behavior enters the system.

  1. List direct calls and clients. Record SDKs, HTTP clients, base URLs, authentication methods, and model-selection code.
  2. Capture request parameters. Include temperature or equivalent controls, token limits, stop rules, response formats, seed settings, safety options, and provider-only fields.
  3. Document response handling. Note text extraction, message roles, citations, tool-call IDs, finish reasons, usage fields, and any parsing assumptions.
  4. Map stateful behavior. Identify streaming loops, conversation continuation, retries, cancellation, background jobs, and persisted message formats.
  5. Record tools and schemas. Preserve JSON Schema definitions, function names, argument validation, parallel-call assumptions, and the code that executes tools.
  6. Separate policy from transport. Keep business rules, authorization, prompt selection, and domain validation independent from the provider client.
  7. Define success criteria. Choose representative requests and specify acceptable quality, latency, cost, error rate, and structured-output validity before testing.

The output should be a short contract for your internal model service. It should say what callers are allowed to request and what the service guarantees, rather than copying every upstream option into your public application API.

How do I create a provider-neutral interface?

Expose the smallest interface that matches your application’s needs. A useful boundary usually accepts messages, optional tools, response-format requirements, cancellation, and a model route; it returns normalized text, tool calls, finish status, usage when available, and a provider-agnostic error category.

result = model_router.generate({
  messages,
  tools,
  response_format: requestedFormat,
  route: "support-answer",
  signal
})

The route should be a logical capability such as support-answer or document-extraction, not a vendor model name embedded throughout the application. Configuration can map that route to a provider and model for each environment. Keep the original provider response available in diagnostic logs when policy permits, but do not make application logic depend on its shape.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #3
Sale
New Bee Guitar Cable 10ft Electric Instrument Bass AMP Cord | 6.35mm Jack, Durable Design, Stage and Home Studio Use, Low Noise Shielded Electric Cord for Bass, Keyboard, Amp, Mixer
  • [Low Noise High Fidelity] New bee guitar cord with 22AWG oxygen-free-copper center conductors provides enhanced signal transfer, the PVC insulation material and the high-density stranded copper double shield provide noise rejection for quiet operation
  • [Ideal for Choice] New bee 1/4 straight and right angle metal connectors, ensures a secure connection in any instrument, pedal, or amp jack. L shape great fro on stage guitar stands
  • [Wide Compatible] Suitable for mixer, power amplifier, microphone, effector, decoder, equalizer, electoronic organ, electric guitar, electric bass and other electronic equipments. Widely used in the installation of smart home, karaoke speaker, professional stage audio, etc
  • [Easy Disassemble] Making incidental repairs quick and easy! Very nice, flexible cable
  • [Dont Hesite to Order] 24 hours customer services and professional technology team are standing by

Normalize deliberately, not aggressively

Normalize fields that every caller genuinely needs: generated content, tool calls, finish status, token or usage information when available, and a small set of error categories. Preserve optional metadata in an extension object so a provider-specific feature can be used without contaminating every call site. Distinguish “field unavailable” from zero, empty, or false; usage data may be absent on some streaming paths.

Define how your interface handles partial output. For streaming, specify event types, ordering, termination, cancellation, and what happens when a connection drops after partial text. For tool calls, specify whether the model may issue several calls, how arguments are validated, how tool results are appended, and how a continuation request is represented. These rules are part of your application contract even if the upstream APIs use different names.

What compatibility should I test?

“OpenAI-compatible” describes a request or response contract, not universal behavioral equivalence. Build a feature matrix for the exact gateway, adapter, provider, and model combination you plan to use.

Capability Questions to answer Typical failure to catch
Basic responses Are roles, content parts, finish reasons, and refusal or safety fields mapped correctly? Parser assumes a text field that is absent or nested differently
Streaming Are token events, tool-call deltas, keepalives, and final usage delivered in the expected order? UI hangs because the new stream uses a different termination event
Tool calls Are names, IDs, JSON arguments, parallel calls, and continuation messages preserved? Arguments arrive as text, or a second turn cannot correlate the tool result
Structured output Is the requested schema enforced, merely encouraged, or unsupported? Malformed JSON reaches application code
Multimodal input Are image, audio, or document parts accepted with the same encoding and limits? Images are silently ignored or rejected at the gateway
Errors and retries Which failures are transient, rate-limited, invalid, or policy-related? Retrying a permanent validation error creates duplicate work
Usage and billing data Which token counts or cost fields are returned, and when? Budget dashboards undercount streamed or cached requests
Cancellation and continuation Can an in-flight request be stopped and resumed safely? Abandoned jobs continue consuming provider capacity

Run the matrix against both normal and adversarial cases: empty content, long context, malformed tool arguments, provider timeouts, rate limits, safety refusals, network disconnects, and cancellation during a stream. Test the same application request through the old and new routes so differences are attributable to the provider change rather than to a changed prompt or parser.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

How should I preserve prompts, tools, and application behavior?

Keep prompts versioned and separate from transport code. A provider may interpret system instructions, stop sequences, token limits, or role ordering differently. Store the exact prompt version with evaluation results so a quality regression can be traced.

Tool definitions deserve their own compatibility review. Confirm property types, required fields, enums, descriptions, nested objects, and maximum sizes. Validate arguments before execution and return a structured tool error to the model rather than allowing an exception to leak into the conversation. If one provider supports parallel tool calls and another does not, make that capability explicit in the route contract and test the serial fallback.

Structured output should be validated twice: first by the provider mechanism when available, then by your application schema. Decide whether an invalid result triggers a repair request, a retry with the same model, a fallback route, or a user-visible error. Do not assume that a gateway’s acceptance of a schema means every upstream enforces it identically.

Rank #4
BSIMB 15.6" Digital Family Calendar & Chore Chart, No Subscription Fees
  • Digital Family Calendar: BSIMB digital calendar wall touch screen puts an end to your chaotic life. Designed for busy families, the digital calendar keeps you organised and in step with your family. Assign different colours and tasks to each family member to make family scheduling easier and more intuitive.
  • Easy Setup and Auto-Sync: Plug in, connect to WLAN and auto-syn your electric calendar in minutes. Digital wall calendar compatible with Google calendar, iCloud calendar, Outlook calendar, Cozi calendar and Yahoo calendar. Add events directly on the device or through the ecalendar app. Electronic calendar stays current whether you're at work or traveling—no manual updates needed.
  • All-In-One Home Assistant: Smart calendar builds habits and encourage independence with personalised chores. Display daily meal plan to reduce the daily ‘What's for dinner?’ stress. To-do lists keep track of everything you want. Turning chores into valuable achievements with stars and rewards, making life easier and more enjoyable.
  • Manage Anytime Anywhere: BSIMB electronic calendar for family stay connected with the powerful ecalendar app. Access and manage your digital wall calendar anytime, anywhere with free features like stars & rewards, photo screensaver, chore charts, meals plans, to-do lists etc. Electronic planner paid features like Magic Import tailor advanced tools for users with special needs.
  • Stay in Touch with Loved Ones: Share photos or videos from your phone to electronic wall calendar with app, instantly update your life moment, and keep in touch with your family, especially those who are far away; you can also surprise your smart calendar digital wall by sending him a wish card; it's also great for keeping tech-illiterate elders in touch with the youngsters.

What operational and security work does a gateway add?

A gateway can centralize virtual keys, routing, retries, fallbacks, and cost tracking. It also becomes another production component. Plan its deployment, scaling, health checks, upgrades, and incident ownership just as you would for any service on the request path.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • Credentials: keep upstream keys in the gateway’s secret store or a dedicated secrets manager; avoid passing long-lived provider keys to browsers or untrusted tenants.
  • Tenant isolation: use separate virtual keys, quotas, and policy boundaries when multiple teams or customers share the gateway.
  • Logs: decide whether prompts, outputs, tool arguments, and metadata may be stored. Redact personal or regulated data and set retention limits.
  • Routing: document whether fallback occurs on timeout, rate limit, provider outage, or model refusal. A fallback can change quality, data residency, or safety behavior.
  • Observability: emit route, provider, model, latency, retry count, status, and usage metrics without logging secrets or unnecessary content.
  • Failure modes: test gateway downtime, stale configuration, partial upstream outages, and a provider returning an unexpected status or response shape.

Centralized cost tracking is useful, but reconcile it with provider invoices and application-level usage. Retries and fallbacks can multiply requests, and a successful response does not prove that the first attempt was free.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

How should I compare cost and latency?

Compare complete application requests, not just advertised per-token prices. Record input and output usage, retries, fallback attempts, gateway charges if any, and the amount of post-processing or tool execution required. Use the same prompts, context, tool definitions, and concurrency profile for each candidate.

Measure median and tail latency separately for non-streaming and streaming requests. For interactive features, time to first token may matter more than total completion time; for batch jobs, throughput and failure recovery may matter more. Include cold starts, queueing, regional network distance, and gateway overhead when they apply.

Quality evaluation should use a labeled sample or a review rubric appropriate to the feature. Check factuality, formatting, refusal behavior, tool-selection accuracy, and consistency. A cheaper model that causes more repair calls or human review may not reduce total cost. Conversely, a higher-priced model may be economical for a narrow route if it avoids retries and failures. The right comparison is your workload’s total cost and outcome, not a vendor’s headline figure.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

What is a safe migration sequence?

  1. Inventory. Map provider calls, configuration, prompts, tools, parsers, persistence formats, and operational dependencies.
  2. Define the contract. Choose normalized inputs, outputs, errors, streaming events, cancellation rules, and extension fields.
  3. Select the seam. Decide between a framework adapter, gateway, SDK integration, or destination-specific migration workflow.
  4. Implement one adapter. Keep provider selection in configuration and make the adapter conform to the internal contract.
  5. Build a compatibility matrix. Mark each required capability as supported, translated, degraded, or unavailable for the candidate route.
  6. Run offline evaluations. Replay representative requests and edge cases; compare quality, schema validity, latency, usage, and errors.
  7. Shadow or canary traffic. Where privacy and cost policies allow, duplicate a small sample or route a limited percentage to the new provider without changing user-visible results initially.
  8. Monitor and tune. Watch error classes, retries, latency percentiles, output quality, tool success, and budget consumption.
  9. Expand gradually. Increase traffic only after the new route meets the agreed thresholds across normal and peak conditions.
  10. Retain rollback. Keep the old provider configuration, prompt version, and adapter deployable until the migration has been stable for a meaningful operating period.

Configuration flags should select a logical route, not expose arbitrary model IDs to every feature team. That keeps approvals, testing, and rollback centralized while still allowing controlled experimentation.

Common pitfalls that cause rewrites

  • Assuming identical semantics: Similar endpoints can differ in defaults, role handling, safety responses, and finish reasons.
  • Leaking vendor types: Returning SDK objects from business logic spreads coupling beyond the adapter.
  • Ignoring non-standard fields: A framework may discard provider-specific metadata your product relies on.
  • Testing only happy paths: Streaming disconnects, malformed tool arguments, rate limits, and refusals often expose the real incompatibility.
  • Retrying blindly: A retry can duplicate a side effect or turn a permanent schema error into a cost spike.
  • Changing prompts and providers together: You lose the ability to attribute quality changes.
  • Forgetting regional constraints: Model availability, data residency, account access, and quotas vary by provider and region.
  • Treating adapter beta support as production parity: The OpenAI Agents SDK’s Any-LLM and LiteLLM integrations are explicitly best-effort beta paths.
  • Leaving rollback until the end: A migration without a tested old route turns an outage into an emergency rewrite.

Bottom line

Switching providers without rewriting your app is an architecture decision, not a one-line endpoint change. Put a narrow model contract between application behavior and provider transport; choose a framework, gateway, SDK adapter, or managed migration path according to the features you need; and verify the exact contract with representative tests. Keep provider-specific extensions explicit, operate gateways as production infrastructure, compare total workload cost and latency, and roll out behind configuration with a proven rollback path. That approach reduces migration effort while acknowledging the behavioral differences that no abstraction can erase.

Frequently Asked Questions

Can I switch providers by changing only the API key?

Only in the narrowest compatible case. You may also need to change the base URL, model identifier, authentication setup, request parameters, response parsing, streaming events, tool-call handling, and error logic.

Is an OpenAI-compatible API fully interchangeable with OpenAI?

No. Compatibility is contract-specific. Endpoints, parameters, response fields, streaming, structured outputs, multimodal inputs, and provider-specific controls can differ. Test the exact provider, gateway, and model combination.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Should I use LangChain or the Vercel AI SDK?

Use a framework that fits your existing architecture and supports the providers and features you require. Both document common model interfaces, but neither guarantees zero migration work or identical provider behavior.

When is a gateway better than an in-app adapter?

A gateway is useful when preserving an existing client is valuable, routing should be centralized, or you need shared retries, fallbacks, virtual keys, and cost controls. It adds deployment, security, observability, and failure-mode responsibilities.

How do I support provider-specific features without losing portability?

Keep a small common contract for shared behavior and place special controls or metadata in an explicit extension object or provider-specific adapter. Do not expose vendor SDK types throughout business logic.

What should I test before sending production traffic?

Test plain responses, streaming, tool calls and continuation, structured-output validation, multimodal inputs if used, errors and retries, usage reporting, cancellation, latency, cost, and representative quality outcomes.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Does AWS Transform make an application provider-neutral?

No. AWS announced an assessment on June 16, 2026, for supported code patterns moving to Amazon Bedrock. It is destination-specific and does not provide a general interface for arbitrary provider switching.

How can I roll back safely?

Keep the old adapter and configuration deployable, select routes through a feature flag, monitor errors and quality, and begin with a canary or limited percentage. Test the rollback path before expanding traffic.

The Bottom Line

Design a narrow model boundary, validate real feature behavior, and route providers through configuration. Frameworks, gateways, and adapters can reduce rewrites, but only disciplined contracts, testing, and rollback make a provider switch safe.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

AI developmentAPI migrationLLM gatewaysmodel providers

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Recommended PC Tool
Recommended PC Tool
Windows Errors? Fix Them Before They SpreadFree repair scan
Outdated Drivers Are Slowing You DownFree scan - exact matches

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.