Add your own AI provider key in Reactive Resume, test the connection, and choose which provider the assistant and other AI features use.
Reactive Resume doesn’t include an AI model of its own. To use the assistant, AI imports, drafting and the other AI features, connect a provider such as OpenAI, Anthropic or Google Gemini. Everything else in the app works without AI.On a self-hosted instance, the administrator can configure a shared provider.
Settings then show that AI is enabled globally, and personal provider controls are hidden. You can use AI features
without entering your own key. The steps below apply when personal providers are available.
Get an API key from your provider’s dashboard. You pay the provider directly for what you use. A local Ollama server can connect without a key.
Know which model you want to use, such as gpt-6-luna or claude-haiku-5-5. Reactive Resume suggests a default for each provider, but your account may not have access to every model.
Select your name at the bottom of the sidebar, choose Settings, then choose AI & developer. You can also go to https://rxresu.me/dashboard/settings/ai directly. Self-hosted instances use their own address.
2
Start adding a provider
Under AI providers, select Add provider (the dashed button below your saved providers).
3
Choose the provider and fill in the fields
Pick your provider from the Provider list. Reactive Resume fills in that provider’s usual Model and Base URL for you. Paste your key into API key, and change the model if you want a different one.
The Add provider dialog with an example model. Current suggestions are listed below.
4
Save and test
Select Save and test. Reactive Resume saves the provider, then sends it a tiny request to check that the key, model and address work. If the test passes, the dialog closes and the provider is ready to use.
If the test fails, the dialog shows the provider’s own error message, such as an invalid key or an unknown model. The provider is still saved, so you can fix it later with Edit instead of starting again.
The key from your provider’s dashboard. Required except for Ollama, where you can leave it empty for a local server that doesn’t require authentication.
Model
The model name exactly as your provider writes it. Required.
Name
A label you’ll recognize, such as “Work OpenAI”. If you leave it empty, the provider’s name is used.
Base URL
The address requests go to. Leave the default unless you use a gateway, a proxy or an OpenAI-compatible service. Changing it needs the API key again.
Suggestions favor fast, cost-efficient models for everyday AI tasks. They apply when adding a provider; saved models stay as selected. You can enter another model available to your account.
Ollama defaults to a cloud model for its hosted base URL. For a local Ollama server, enter the name of a model installed on that server and change the base URL.Choose OpenAI-compatible for any other service that speaks the OpenAI API, such as a company gateway or LiteLLM. It needs both a model and a base URL.The base URL must start with https:// and point to a public address. On the hosted instance, that means a model running on your own computer (for example, a local Ollama) can’t be connected. Self-hosters can allow local and http:// addresses; see Environment variables.
Each saved provider appears as a row under AI providers, showing its name, model and the last four characters of the key. The row shows Off next to the name when the provider isn’t in use.
A provider after a successful test
Select Test on a row to check it again. The button changes to Connected with the round-trip time (for example, Connected · 420 ms), or to Failed with the provider’s error message underneath. A passed test turns the provider on; a failed test turns it off, so the app never uses a provider that isn’t answering.
Change the key, model, name or base URL, then select Save and test. Leave API key empty to keep the saved key. Changing the key, model or base URL turns the provider off until the new test passes.
Turn it on or off with Use this provider. Only a provider that passed its test can be turned on. A provider that is off stays saved but isn’t offered anywhere in the app.
Delete it with Delete provider, then confirm. The provider and its stored key are removed.
Deleting a provider can’t be undone. Conversations that used it continue on your default provider. Documents and edits
you already accepted aren’t affected.
You can save several providers, for example one per account or one per model.
One provider is your default, marked Default in Settings → AI & developer. To change it, choose Make default on another provider that’s on and tested. Every AI feature where you don’t pick a provider uses the default, and the line under each AI action names it.
If you haven’t chosen a default, or it’s turned off, features use the enabled provider you used most recently, and if you haven’t used one yet, the oldest enabled provider you added.
Conversations keep the provider they started with. When that provider is turned off or deleted, they continue on the default. A scheduled interview briefing does the same.
Voice practice uses the default when its provider offers speech models, otherwise another provider that does, otherwise your browser.
The assistant lets you switch models from the model menu in its header at any time. See Using the assistant.
Check → Writing lets you pick the provider for each review.
If no provider is connected yet, opening the assistant in the editor shows Connect an AI provider with OpenAI, Anthropic and Other · OpenAI-compatible. Enter your key and model there and select Connect. It saves and tests the provider the same way as settings. For the other providers, use AI & developer.
Your personal API key is encrypted on the Reactive Resume server with AES-256-GCM before it’s saved, and it’s never shown again. Settings only ever show the last four characters. When a feature needs the key, the server decrypts it just long enough to call your provider.Self-hosted instances encrypt keys with the ENCRYPTION_SECRET environment variable. Until it’s set, AI & developer shows “AI providers aren’t available on this server until ENCRYPTION_SECRET is set.” If the secret changes later, saved keys can no longer be decrypted. The error asks you to enter the key again: open Settings → AI & developer, select Edit on the provider, paste the key, and select Save and test.
Requests go from the Reactive Resume server to the provider you chose, using your key. Requests run when you use an AI action or when an AI schedule you enabled becomes due. Each action explains its inputs and connection:
Feature
What is sent
Assistant
Your message, the open resume or letter (unless you remove it from the message), the job posting and your notes on the linked application (unless you remove the posting), attachments you add, and the earlier messages in the conversation.
Improve selected line
The line you’re improving and the rest of that field.
Check → Writing
The text of your resume.
Importing a PDF or Word file
The file you import.
Drafting a letter
The linked resume and the application’s job posting.
Adding an application
Job posting text you paste or import from a URL.
Career adds these uses:
Action
What is sent
Workspace drafting and review
The application’s posting and details, relevant interview, notes, selected sent or current documents, usable facts and stories, preferences, and the answer or message being reviewed.
Career coach
Your message, earlier messages and attachments in the conversation, plus the application and Knowledge context you leave switched on. Web research is a separate opt-in.
Scheduled interview briefing
The interview and application context used by Prepare, through the schedule’s chosen AI connection.
Voice transcription
Your recording or chosen audio file, to the speech connection named beside the action.
Reading a practice question aloud
The question text, to the selected speech connection; browser speech can be used instead.
Workspace text actions use your default connection. Voice settings can use another speech-capable connection or browser speech. Speech usage can be billed separately from text coaching. Automatic role discovery uses your web search connection; it does not need an AI model. See Career controls and data.Your provider handles that data under its own terms and privacy policy. Reactive Resume keeps assistant conversations and their attachments in your account until you delete the conversation.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Reactive Resume","description":"A privacy-minded resume builder that is customizable, portable, open-source, and free to use.","colors":{"primary":"#166534","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/reactiveresume/lsEa0V8tmq-7Vofb/logo/light.svg?fit=max\u0026auto=format\u0026n=lsEa0V8tmq-7Vofb\u0026q=85\u0026s=21a2f3c9b27509effa871b216e67c0ce","dark":"https://mintcdn.com/reactiveresume/lsEa0V8tmq-7Vofb/logo/dark.svg?fit=max\u0026auto=format\u0026n=lsEa0V8tmq-7Vofb\u0026q=85\u0026s=fe4e07f4f06411b0ad16fd4644a475de","href":"https://rxresu.me"},"favicon":"https://mintcdn.com/reactiveresume/lsEa0V8tmq-7Vofb/favicon.svg?fit=max\u0026auto=format\u0026n=lsEa0V8tmq-7Vofb\u0026q=85\u0026s=6d7f6f71f71340846e94142b357a89b7","background":{"decoration":"grid"},"navbar":{"links":[{"href":"https://rxresu.me/resume-templates","label":"Resume templates"},{"href":"https://github.com/reactive-resume/reactive-resume/issues","label":"Support"}],"primary":{"type":"button","label":"Build your resume","href":"https://rxresu.me/auth/register"}},"footer":{"socials":{"website":"https://rxresu.me","github":"https://github.com/reactive-resume/reactive-resume"}},"seo":{"metatags":{"canonical":"https://docs.rxresu.me","og:image":"https://rxresu.me/opengraph/banner.jpg"},"indexing":"navigable"},"fonts":{"heading":{"family":"IBM Plex Sans"},"body":{"family":"IBM Plex Sans"}},"icons":{"library":"lucide"},"contextual":{"options":["copy","view"],"display":"header"},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Reactive Resume","icon":"link","href":"https://rxresu.me"},{"anchor":"Source Code","icon":"github","href":"https://github.com/reactive-resume/reactive-resume"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"reactiveresume","hasAudioNarration":false,"actualSubdomain":"reactiveresume","customDomains":["docs.rxresu.me"],"gitSource":{"type":"github","owner":"reactive-resume","repo":"reactive-resume","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae477ec21d44d6b52dc8e6b","collectionId":"dd0be42d-a5b8-4827-ae5e-5b455ea71bbd","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae477ec21d44d6b52dc8e6b"},"feedback":{"edits":true,"thumbs":false,"issues":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae477ec21d44d6b52dc8e6b","clientVersion":"0.0.4039","searchFilterCounts":[{"language":"default","tag":"API Reference","count":209},{"language":"default","tag":"Documentation","count":123},{"language":"default","tag":"Applications","count":42},{"language":"default","tag":"Career","count":31},{"language":"default","tag":"Resumes","count":26},{"language":"default","tag":"Documents","count":24},{"language":"default","tag":"Cover Letters","count":24},{"language":"default","tag":"Comparisons","count":17},{"language":"default","tag":"Agent","count":15},{"language":"default","tag":"Integrations","count":13}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"hello@amruthpillai.com","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[],"page":{"pagePath":"guides/using-ai","slug":"/guides/using-ai","pageMetadata":{"title":"Connecting an AI provider","description":"Add your own AI provider key in Reactive Resume, test the connection, and choose which provider the assistant and other AI features use.","href":"/guides/using-ai"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Add your own AI provider key in Reactive Resume, test the connection, and choose which provider the assistant and other AI features use.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Card,CardGroup,Frame,Heading,OptimizedImage,Step,Steps,Table,Warning}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Reactive Resume doesn’t include an AI model of its own. To use the assistant, AI imports, drafting and the other AI features, connect a provider such as OpenAI, Anthropic or Google Gemini. Everything else in the app works without AI.`}),`\n`,_jsxs(_components.p,{children:[`On a self-hosted instance, the administrator can `,_jsx(_components.a,{href:`/self-hosting/job-search-and-ai`,children:`configure a shared provider`}),`.\nSettings then show that AI is enabled globally, and personal provider controls are hidden. You can use AI features\nwithout entering your own key. The steps below apply when personal providers are available.`]}),`\n`,_jsx(Heading,{level:`2`,id:`before-you-start`,children:`Before you start`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Get an API key from your provider’s dashboard. You pay the provider directly for what you use. A local Ollama server can connect without a key.`}),`\n`,_jsxs(_components.li,{children:[`Know which model you want to use, such as `,_jsx(_components.code,{children:`gpt-6-luna`}),` or `,_jsx(_components.code,{children:`claude-haiku-5-5`}),`. Reactive Resume suggests a default for each provider, but your account may not have access to every model.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`add-a-provider`,children:`Add a provider`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open AI settings`,children:_jsxs(_components.p,{children:[`Select your name at the bottom of the sidebar, choose `,_jsx(_components.strong,{children:`Settings`}),`, then choose `,_jsx(_components.strong,{children:`AI \u0026 developer`}),`. You can also go to `,_jsx(_components.code,{children:`https://rxresu.me/dashboard/settings/ai`}),` directly. Self-hosted instances use their own address.`]})}),_jsx(Step,{title:`Start adding a provider`,children:_jsxs(_components.p,{children:[`Under `,_jsx(_components.strong,{children:`AI providers`}),`, select `,_jsx(_components.strong,{children:`Add provider`}),` (the dashed button below your saved providers).`]})}),_jsxs(Step,{title:`Choose the provider and fill in the fields`,children:[_jsxs(_components.p,{children:[`Pick your provider from the `,_jsx(_components.strong,{children:`Provider`}),` list. Reactive Resume fills in that provider’s usual `,_jsx(_components.strong,{children:`Model`}),` and `,_jsx(_components.strong,{children:`Base URL`}),` for you. Paste your key into `,_jsx(_components.strong,{children:`API key`}),`, and change the model if you want a different one.`]}),_jsx(Frame,{caption:`The Add provider dialog with an example model. Current suggestions are listed below.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/add-provider-dialog.webp?fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=954093e4b8b77ce1e661b2cb75a4c664`,alt:`Add provider dialog with Provider set to OpenAI, a hidden API key, Model gpt-4.1, Name Personal OpenAI and the default OpenAI base URL`,\"data-og-width\":`960`,width:`960`,\"data-og-height\":`924`,height:`924`,\"data-path\":`images/guides/using-ai/add-provider-dialog.webp`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/add-provider-dialog.webp?w=280\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=db103bfe1dbfbe34e7cf619e502240fd 280w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/add-provider-dialog.webp?w=560\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=7b0e2334764883e1ae34fcc7ddc98364 560w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/add-provider-dialog.webp?w=840\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=df388b60b586293272fba879d6c4b1e3 840w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/add-provider-dialog.webp?w=1100\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=f69ddbd0c7bec766b8bf6dd9fe84e038 1100w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/add-provider-dialog.webp?w=1650\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=5fc8df73ea46f2b40aa0bf699167f157 1650w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/add-provider-dialog.webp?w=2500\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=bc7d71c7f6be01a75445cd93ef088de6 2500w`})})]}),_jsx(Step,{title:`Save and test`,children:_jsxs(_components.p,{children:[`Select `,_jsx(_components.strong,{children:`Save and test`}),`. Reactive Resume saves the provider, then sends it a tiny request to check that the key, model and address work. If the test passes, the dialog closes and the provider is ready to use.`]})})]}),`\n`,_jsxs(_components.p,{children:[`If the test fails, the dialog shows the provider’s own error message, such as an invalid key or an unknown model. The provider is still saved, so you can fix it later with `,_jsx(_components.strong,{children:`Edit`}),` instead of starting again.`]}),`\n`,_jsx(Heading,{level:`3`,id:`the-fields`,children:`The fields`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`What to enter`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Provider`})}),_jsx(_components.td,{children:`The company or service that runs the model.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`API key`})}),_jsx(_components.td,{children:`The key from your provider’s dashboard. Required except for Ollama, where you can leave it empty for a local server that doesn’t require authentication.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Model`})}),_jsx(_components.td,{children:`The model name exactly as your provider writes it. Required.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Name`})}),_jsx(_components.td,{children:`A label you’ll recognize, such as “Work OpenAI”. If you leave it empty, the provider’s name is used.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Base URL`})}),_jsx(_components.td,{children:`The address requests go to. Leave the default unless you use a gateway, a proxy or an OpenAI-compatible service. Changing it needs the API key again.`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`supported-providers`,children:`Supported providers`}),`\n`,_jsx(_components.p,{children:`Suggestions favor fast, cost-efficient models for everyday AI tasks. They apply when adding a provider; saved models stay as selected. You can enter another model available to your account.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Provider`}),_jsx(_components.th,{children:`Default model`}),_jsx(_components.th,{children:`Default base URL`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`OpenAI`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`gpt-6-luna`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.openai.com/v1`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Anthropic Claude`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`claude-haiku-5-5`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.anthropic.com/v1`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Google Gemini`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`gemini-3.5-flash-lite`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://generativelanguage.googleapis.com/v1beta`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Vercel AI Gateway`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`openai/gpt-6-luna`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://ai-gateway.vercel.sh/v3/ai`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`OpenRouter`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`anthropic/claude-haiku-5.5`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://openrouter.ai/api/v1`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Mistral AI`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`mistral-small-latest`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.mistral.ai/v1`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Cohere`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`command-r7b-12-2024`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.cohere.com/v2`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`xAI Grok`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`grok-4.3`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.x.ai/v1`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Groq`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`openai/gpt-oss-20b`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.groq.com/openai/v1`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`DeepSeek`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`deepseek-flash`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.deepseek.com/v1`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Together.ai`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Qwen/Qwen3.8-Flash`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.together.xyz/v1`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Fireworks`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`accounts/fireworks/models/deepseek-v4p1-flash-1017`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.fireworks.ai/inference/v1`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Cerebras`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`qwen-3.8-27b`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.cerebras.ai/v1`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Perplexity`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`sonar`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.perplexity.ai`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Ollama`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`gpt-oss:20b-cloud`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://ollama.com/api`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`OpenAI-compatible`}),_jsx(_components.td,{children:`none, enter your own`}),_jsx(_components.td,{children:`none, enter your own`})]})]})]}),`\n`,_jsx(_components.p,{children:`Ollama defaults to a cloud model for its hosted base URL. For a local Ollama server, enter the name of a model installed on that server and change the base URL.`}),`\n`,_jsxs(_components.p,{children:[`Choose `,_jsx(_components.strong,{children:`OpenAI-compatible`}),` for any other service that speaks the OpenAI API, such as a company gateway or LiteLLM. It needs both a model and a base URL.`]}),`\n`,_jsxs(_components.p,{children:[`The base URL must start with `,_jsx(_components.code,{children:`https://`}),` and point to a public address. On the hosted instance, that means a model running on your own computer (for example, a local Ollama) can’t be connected. Self-hosters can allow local and `,_jsx(_components.code,{children:`http://`}),` addresses; see `,_jsx(_components.a,{href:`/self-hosting/environment-variables`,children:`Environment variables`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`test-a-provider-again`,children:`Test a provider again`}),`\n`,_jsxs(_components.p,{children:[`Each saved provider appears as a row under `,_jsx(_components.strong,{children:`AI providers`}),`, showing its name, model and the last four characters of the key. The row shows `,_jsx(_components.strong,{children:`Off`}),` next to the name when the provider isn’t in use.`]}),`\n`,_jsx(Frame,{caption:`A provider after a successful test`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/provider-row-connected.webp?fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=3f1972d4f51328925e4a53b58843cda1`,alt:`AI providers section with one provider named Work gateway, model gpt-5-mini, and a Test button reading Connected · 40 ms, followed by the Add provider button`,\"data-og-width\":`1448`,width:`1448`,\"data-og-height\":`344`,height:`344`,\"data-path\":`images/guides/using-ai/provider-row-connected.webp`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/provider-row-connected.webp?w=280\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=4b65bc9292a05b0a2333bc0df96af444 280w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/provider-row-connected.webp?w=560\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=4632dbed3fb0b225f64cbab0adbfa3ca 560w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/provider-row-connected.webp?w=840\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=b8c32a21a4b95e3580ad81d0dc6f6b49 840w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/provider-row-connected.webp?w=1100\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=3610eff6238befd6fc8f0bd483d1643d 1100w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/provider-row-connected.webp?w=1650\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=5b2becea5690934cc102cfff130ad225 1650w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/provider-row-connected.webp?w=2500\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=e9ea8063fb803132d0a4b48b53cebd1c 2500w`})}),`\n`,_jsxs(_components.p,{children:[`Select `,_jsx(_components.strong,{children:`Test`}),` on a row to check it again. The button changes to `,_jsx(_components.strong,{children:`Connected`}),` with the round-trip time (for example, `,_jsx(_components.strong,{children:`Connected · 420 ms`}),`), or to `,_jsx(_components.strong,{children:`Failed`}),` with the provider’s error message underneath. A passed test turns the provider on; a failed test turns it off, so the app never uses a provider that isn’t answering.`]}),`\n`,_jsx(Heading,{level:`2`,id:`edit-turn-off-or-delete-a-provider`,children:`Edit, turn off or delete a provider`}),`\n`,_jsxs(_components.p,{children:[`Select `,_jsx(_components.strong,{children:`Edit`}),` on a provider’s row.`]}),`\n`,_jsx(Frame,{caption:`Editing a saved provider`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/edit-provider-dialog.webp?fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=670c95bb83e736fcbac8fa06a89391e5`,alt:`Edit dialog for a provider named Work gateway, with an empty API key field reading Leave empty to keep the saved key, the model, name and base URL fields, the Use this provider switch turned on, Delete provider and Save and test`,\"data-og-width\":`960`,width:`960`,\"data-og-height\":`860`,height:`860`,\"data-path\":`images/guides/using-ai/edit-provider-dialog.webp`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/edit-provider-dialog.webp?w=280\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=5d2214b5473c98a451d470fd7228d5c0 280w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/edit-provider-dialog.webp?w=560\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=74bb0a69e40f926f87bfae03ed7c93b6 560w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/edit-provider-dialog.webp?w=840\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=e3e24abaed1d95c100bb74d9bcb9a6ae 840w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/edit-provider-dialog.webp?w=1100\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=535cbeeab675e99422eada7e6024e131 1100w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/edit-provider-dialog.webp?w=1650\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=5a9cf83539944021dc76aa606d15fee5 1650w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/edit-provider-dialog.webp?w=2500\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=c240b5ac28e93fd79f88ae09afe45ac9 2500w`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Change the key, model, name or base URL`}),`, then select `,_jsx(_components.strong,{children:`Save and test`}),`. Leave `,_jsx(_components.strong,{children:`API key`}),` empty to keep the saved key. Changing the key, model or base URL turns the provider off until the new test passes.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Turn it on or off`}),` with `,_jsx(_components.strong,{children:`Use this provider`}),`. Only a provider that passed its test can be turned on. A provider that is off stays saved but isn’t offered anywhere in the app.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Delete it`}),` with `,_jsx(_components.strong,{children:`Delete provider`}),`, then confirm. The provider and its stored key are removed.`]}),`\n`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Deleting a provider can’t be undone. Conversations that used it continue on your default provider. Documents and edits\nyou already accepted aren’t affected.`})}),`\n`,_jsx(Heading,{level:`2`,id:`which-provider-is-used`,children:`Which provider is used`}),`\n`,_jsx(_components.p,{children:`You can save several providers, for example one per account or one per model.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`One provider is your `,_jsx(_components.strong,{children:`default`}),`, marked `,_jsx(_components.strong,{children:`Default`}),` in `,_jsx(_components.strong,{children:`Settings → AI \u0026 developer`}),`. To change it, choose `,_jsx(_components.strong,{children:`Make default`}),` on another provider that’s on and tested. Every AI feature where you don’t pick a provider uses the default, and the line under each AI action names it.`]}),`\n`,_jsx(_components.li,{children:`If you haven’t chosen a default, or it’s turned off, features use the enabled provider you used most recently, and if you haven’t used one yet, the oldest enabled provider you added.`}),`\n`,_jsx(_components.li,{children:`Conversations keep the provider they started with. When that provider is turned off or deleted, they continue on the default. A scheduled interview briefing does the same.`}),`\n`,_jsx(_components.li,{children:`Voice practice uses the default when its provider offers speech models, otherwise another provider that does, otherwise your browser.`}),`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.strong,{children:`assistant`}),` lets you switch models from the model menu in its header at any time. See `,_jsx(_components.a,{href:`/guides/using-the-assistant`,children:`Using the assistant`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Check → Writing`}),` lets you pick the provider for each review.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`connect-from-the-assistant-instead`,children:`Connect from the assistant instead`}),`\n`,_jsxs(_components.p,{children:[`If no provider is connected yet, opening the assistant in the editor shows `,_jsx(_components.strong,{children:`Connect an AI provider`}),` with OpenAI, Anthropic and `,_jsx(_components.strong,{children:`Other · OpenAI-compatible`}),`. Enter your key and model there and select `,_jsx(_components.strong,{children:`Connect`}),`. It saves and tests the provider the same way as settings. For the other providers, use `,_jsx(_components.strong,{children:`AI \u0026 developer`}),`.`]}),`\n`,_jsx(Frame,{caption:`Connecting a provider from the assistant panel`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/assistant-connect-provider.webp?fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=83f5b22744e715d7bacc5066c77d8a78`,alt:`Assistant panel showing Connect an AI provider, with OpenAI, Anthropic and Other · OpenAI-compatible options and a link to Settings for more providers`,\"data-og-width\":`798`,width:`798`,\"data-og-height\":`700`,height:`700`,\"data-path\":`images/guides/using-ai/assistant-connect-provider.webp`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/assistant-connect-provider.webp?w=280\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=7d1300154481aa51b96145bd11866b5a 280w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/assistant-connect-provider.webp?w=560\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=c1092974887bf2a430b32f80580ca779 560w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/assistant-connect-provider.webp?w=840\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=8415df6e99fc9d09699ce993ca4f0a9c 840w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/assistant-connect-provider.webp?w=1100\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=53d17563b4d5046a4e11f911e0583433 1100w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/assistant-connect-provider.webp?w=1650\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=9da74a16a357514049fe7733fc85d496 1650w, https://mintcdn.com/reactiveresume/rtb73NdrPCUreUAd/images/guides/using-ai/assistant-connect-provider.webp?w=2500\u0026fit=max\u0026auto=format\u0026n=rtb73NdrPCUreUAd\u0026q=85\u0026s=99ff50bc65b01b816d2d12efb1f67d10 2500w`})}),`\n`,_jsx(Heading,{level:`2`,id:`how-your-key-is-stored`,children:`How your key is stored`}),`\n`,_jsx(_components.p,{children:`Your personal API key is encrypted on the Reactive Resume server with AES-256-GCM before it’s saved, and it’s never shown again. Settings only ever show the last four characters. When a feature needs the key, the server decrypts it just long enough to call your provider.`}),`\n`,_jsxs(_components.p,{children:[`Self-hosted instances encrypt keys with the `,_jsx(_components.code,{children:`ENCRYPTION_SECRET`}),` environment variable. Until it’s set, `,_jsx(_components.strong,{children:`AI \u0026 developer`}),` shows “AI providers aren’t available on this server until ENCRYPTION_SECRET is set.” If the secret changes later, saved keys can no longer be decrypted. The error asks you to enter the key again: open `,_jsx(_components.strong,{children:`Settings → AI \u0026 developer`}),`, select `,_jsx(_components.strong,{children:`Edit`}),` on the provider, paste the key, and select `,_jsx(_components.strong,{children:`Save and test`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-is-sent-to-your-provider`,children:`What is sent to your provider`}),`\n`,_jsx(_components.p,{children:`Requests go from the Reactive Resume server to the provider you chose, using your key. Requests run when you use an AI action or when an AI schedule you enabled becomes due. Each action explains its inputs and connection:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Feature`}),_jsx(_components.th,{children:`What is sent`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Assistant`}),_jsx(_components.td,{children:`Your message, the open resume or letter (unless you remove it from the message), the job posting and your notes on the linked application (unless you remove the posting), attachments you add, and the earlier messages in the conversation.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Improve selected line`})}),_jsx(_components.td,{children:`The line you’re improving and the rest of that field.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Check → Writing`})}),_jsx(_components.td,{children:`The text of your resume.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Importing a PDF or Word file`}),_jsx(_components.td,{children:`The file you import.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Drafting a letter`}),_jsx(_components.td,{children:`The linked resume and the application’s job posting.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Adding an application`}),_jsx(_components.td,{children:`Job posting text you paste or import from a URL.`})]})]})]}),`\n`,_jsx(_components.p,{children:`Career adds these uses:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Action`}),_jsx(_components.th,{children:`What is sent`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Workspace drafting and review`}),_jsx(_components.td,{children:`The application’s posting and details, relevant interview, notes, selected sent or current documents, usable facts and stories, preferences, and the answer or message being reviewed.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Career coach`}),_jsx(_components.td,{children:`Your message, earlier messages and attachments in the conversation, plus the application and Knowledge context you leave switched on. Web research is a separate opt-in.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Scheduled interview briefing`}),_jsx(_components.td,{children:`The interview and application context used by Prepare, through the schedule’s chosen AI connection.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Voice transcription`}),_jsx(_components.td,{children:`Your recording or chosen audio file, to the speech connection named beside the action.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Reading a practice question aloud`}),_jsx(_components.td,{children:`The question text, to the selected speech connection; browser speech can be used instead.`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Workspace text actions use your default connection. `,_jsx(_components.strong,{children:`Voice settings`}),` can use another speech-capable connection or browser speech. Speech usage can be billed separately from text coaching. Automatic role discovery uses your web search connection; it does not need an AI model. See `,_jsx(_components.a,{href:`/guides/career-workspace-reference#coach-context-and-ai-actions`,children:`Career controls and data`}),`.`]}),`\n`,_jsx(_components.p,{children:`Your provider handles that data under its own terms and privacy policy. Reactive Resume keeps assistant conversations and their attachments in your account until you delete the conversation.`}),`\n`,_jsx(Heading,{level:`2`,id:`related-guides`,children:`Related guides`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Using the assistant`,href:`/guides/using-the-assistant`,children:_jsx(_components.p,{children:`Ask for changes and review the edits it proposes.`})}),_jsx(Card,{title:`Assistant tools`,href:`/guides/ai-agent-tools`,children:_jsx(_components.p,{children:`What the assistant can read and do in a conversation.`})}),_jsx(Card,{title:`Checking your resume`,href:`/guides/checking-your-resume`,children:_jsx(_components.p,{children:`Get an AI review of your wording in Check mode.`})}),_jsx(Card,{title:`Importing resumes`,href:`/guides/importing-resumes`,children:_jsx(_components.p,{children:`Turn an existing PDF or Word resume into an editable one.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Connecting an AI provider","description":"Add your own AI provider key in Reactive Resume, test the connection, and choose which provider the assistant and other AI features use.","href":"/guides/using-ai"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Before you start","slug":"before-you-start","depth":2,"children":[]},{"title":"Add a provider","slug":"add-a-provider","depth":2,"children":[{"title":"The fields","slug":"the-fields","depth":3,"children":[]},{"title":"Supported providers","slug":"supported-providers","depth":3,"children":[]}]},{"title":"Test a provider again","slug":"test-a-provider-again","depth":2,"children":[]},{"title":"Edit, turn off or delete a provider","slug":"edit-turn-off-or-delete-a-provider","depth":2,"children":[]},{"title":"Which provider is used","slug":"which-provider-is-used","depth":2,"children":[]},{"title":"Connect from the assistant instead","slug":"connect-from-the-assistant-instead","depth":2,"children":[]},{"title":"How your key is stored","slug":"how-your-key-is-stored","depth":2,"children":[]},{"title":"What is sent to your provider","slug":"what-is-sent-to-your-provider","depth":2,"children":[]},{"title":"Related guides","slug":"related-guides","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"reactiveresume","siteName":"Reactive Resume","title":"Connecting an AI provider - Reactive Resume","contextualStarterQuestions":[{"_id":"6ae3454b34b84f9706b13160","deploymentId":"696550c78205dc150ed83107","questionText":"Which AI models are supported?","status":"active","generatedBy":"contextual","path":"guides/using-ai","createdAt":"2026-10-29T13:08:27.188Z","updatedAt":"2026-10-29T13:08:27.188Z","__v":0},{"_id":"6ae3454b34b84f9706b1315e","deploymentId":"696550c78205dc150ed83107","questionText":"How do I add an AI provider?","status":"active","generatedBy":"contextual","path":"guides/using-ai","createdAt":"2026-10-29T13:08:27.188Z","updatedAt":"2026-10-29T13:08:27.188Z","__v":0},{"_id":"6ae3454b34b84f9706b1315f","deploymentId":"696550c78205dc150ed83107","questionText":"What API key do I need?","status":"active","generatedBy":"contextual","path":"guides/using-ai","createdAt":"2026-10-29T13:08:27.188Z","updatedAt":"2026-10-29T13:08:27.188Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-29T13:08:22.916Z","originalFileLocation":"guides/using-ai.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Add your own AI provider key in Reactive Resume, test the connection, and choose which provider the assistant and other AI features use.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Reactive Resume\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Connecting an AI provider - Reactive Resume\">\u003cmeta data-mint-head property=\"og:description\" content=\"Add your own AI provider key in Reactive Resume, test the connection, and choose which provider the assistant and other AI features use.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Reactive Resume\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.rxresu.me/guides/using-ai\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://rxresu.me/opengraph/banner.jpg\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Connecting an AI provider - Reactive Resume\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Add your own AI provider key in Reactive Resume, test the connection, and choose which provider the assistant and other AI features use.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://rxresu.me/opengraph/banner.jpg\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/reactiveresume/m9TtW-C9R_eefHpI/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Reactive Resume\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#166534\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.rxresu.me/guides/using-ai\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/using-ai.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.rxresu.me/#organization\",\"name\":\"Reactive Resume\",\"url\":\"https://docs.rxresu.me\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/reactiveresume/lsEa0V8tmq-7Vofb/logo/light.svg?fit=max\u0026auto=format\u0026n=lsEa0V8tmq-7Vofb\u0026q=85\u0026s=21a2f3c9b27509effa871b216e67c0ce\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.rxresu.me#website\",\"name\":\"Reactive Resume\",\"url\":\"https://docs.rxresu.me\",\"publisher\":{\"@id\":\"https://docs.rxresu.me/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.rxresu.me/guides/using-ai#webpage\",\"url\":\"https://docs.rxresu.me/guides/using-ai\",\"name\":\"Connecting an AI provider\",\"description\":\"Add your own AI provider key in Reactive Resume, test the connection, and choose which provider the assistant and other AI features use.\",\"dateModified\":\"2026-10-29T13:08:22.916Z\",\"isPartOf\":{\"@id\":\"https://docs.rxresu.me#website\"},\"breadcrumb\":{\"@id\":\"https://docs.rxresu.me/guides/using-ai#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.rxresu.me/guides/using-ai#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Reactive Resume\",\"item\":\"https://docs.rxresu.me\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Connecting an AI provider\",\"item\":\"https://docs.rxresu.me/guides/using-ai\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.rxresu.me/guides/using-ai#article\",\"headline\":\"Connecting an AI provider\",\"name\":\"Connecting an AI provider\",\"description\":\"Add your own AI provider key in Reactive Resume, test the connection, and choose which provider the assistant and other AI features use.\",\"url\":\"https://docs.rxresu.me/guides/using-ai\",\"mainEntityOfPage\":{\"@id\":\"https://docs.rxresu.me/guides/using-ai#webpage\"},\"image\":\"https://rxresu.me/opengraph/banner.jpg\",\"dateModified\":\"2026-10-29T13:08:22.916Z\",\"publisher\":{\"@id\":\"https://docs.rxresu.me/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.rxresu.me#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Reactive Resume\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Reactive Resume","nav":{"global":{"anchors":[{"anchor":"Reactive Resume","icon":"link","href":"https://rxresu.me"},{"anchor":"Source Code","icon":"github","href":"https://github.com/reactive-resume/reactive-resume"}]},"tabs":[{"tab":"Documentation","icon":"book","groups":[{"group":"Getting Started","pages":[{"title":"Introduction","href":"/getting-started"},{"title":"Quickstart","href":"/getting-started/quickstart"},{"title":"Video Guides","icon":"circle-play","href":"/guides/video-guides"},{"title":"What's new in v6","href":"/guides/whats-new-in-v6"},{"title":"Using the command bar","href":"/guides/using-the-command-bar"},{"title":"Keyboard shortcuts","href":"/guides/keyboard-shortcuts"},{"title":"Checking service status","href":"/guides/checking-service-status"},{"title":"Accessing the previous version","href":"/guides/accessing-the-previous-version"}]},{"group":"Account","pages":[{"title":"Creating an account","href":"/guides/creating-an-account"},{"title":"Signing in","href":"/guides/signing-in"},{"title":"Updating your profile","href":"/guides/updating-your-profile"},{"title":"Changing appearance and language","href":"/guides/changing-appearance-and-language"},{"title":"Linking social accounts","href":"/guides/linking-social-accounts"},{"title":"Setting up two-step verification","href":"/guides/setting-up-two-factor-authentication"},{"title":"Setting up passkeys","href":"/guides/setting-up-passkeys"},{"title":"Exporting your data","href":"/guides/exporting-your-data"},{"title":"Deleting your account","href":"/guides/deleting-your-account"}]},{"group":"Documents","pages":[{"title":"Creating your first resume","href":"/guides/creating-your-first-resume"},{"title":"Managing your documents","href":"/guides/managing-documents"},{"title":"Organizing documents with tags","href":"/guides/organizing-with-tags"},{"title":"Using the Trash","href":"/guides/using-the-trash"},{"title":"Importing a resume","href":"/guides/importing-resumes"}]},{"group":"Resume Editor","pages":[{"title":"Getting to know the resume editor","href":"/guides/editor-overview"},{"title":"Filling in your details","href":"/guides/filling-in-your-details"},{"title":"Formatting text","href":"/guides/formatting-text"},{"title":"Managing sections","href":"/guides/managing-sections"},{"title":"Editing entries","href":"/guides/editing-entries"},{"title":"Entering dates","href":"/guides/entering-dates"},{"title":"Undoing changes and version history","href":"/guides/undoing-changes-and-version-history"},{"title":"Using private notes","href":"/guides/using-private-notes"},{"title":"Editing on a phone or tablet","href":"/guides/editing-on-mobile"}]},{"group":"Design","pages":[{"title":"Choosing a template","href":"/guides/choosing-a-template"},{"title":"Changing how entries look","href":"/guides/changing-how-entries-look"},{"title":"Customizing typography","href":"/guides/customizing-typography"},{"title":"Choosing colors","href":"/guides/choosing-colors"},{"title":"Choosing paper size, margins and language","href":"/guides/selecting-page-format"},{"title":"Arranging the layout","href":"/guides/arranging-the-layout"},{"title":"Fitting content on a page","href":"/guides/fitting-content-on-a-page"},{"title":"Applying custom styles","href":"/applying-custom-styles"}]},{"group":"Checking Your Resume","pages":[{"title":"Checking your resume before you apply","href":"/guides/checking-your-resume"},{"title":"Checking any resume PDF with the ATS checker","href":"/guides/using-the-ats-checker"}]},{"group":"Cover Letters","pages":[{"title":"Writing a cover letter","href":"/guides/writing-a-cover-letter"}]},{"group":"Sharing and Exporting","pages":[{"title":"Sharing your resume as a web page","href":"/guides/sharing-your-resume-publicly"},{"title":"Downloading your resume","href":"/guides/exporting-your-resume"},{"title":"Exporting a resume to Markdown","description":"Download your resume as a Markdown file: plain text with headings for application forms, AI tools, notes, websites and version control.","href":"/guides/exporting-resume-to-markdown"}]},{"group":"AI Assistant","pages":[{"title":"Connecting an AI provider","href":"/guides/using-ai"},{"title":"Using the assistant","description":"Ask the AI assistant to improve your resume or cover letter, then accept or reject each edit it proposes. Nothing changes until you accept.","href":"/guides/using-the-assistant"},{"title":"Assistant tools","href":"/guides/ai-agent-tools"}]},{"group":"Career and Application Workspaces","pages":[{"title":"Your career, in one place","href":"/guides/career-overview"},{"title":"Prepare your first application","href":"/guides/first-career-application"},{"title":"Tell your story once","href":"/guides/building-career-knowledge"},{"title":"Apply when your experience is different","href":"/guides/checking-job-fit"},{"title":"Answer another application form","href":"/guides/writing-application-answers"},{"title":"Get ready for interview day","href":"/guides/preparing-for-interview-day"},{"title":"Find roles while you are busy","href":"/guides/finding-roles-automatically"},{"title":"Reply to a recruiter","href":"/guides/replying-to-recruiters"},{"title":"Choose between two offers","href":"/guides/comparing-job-offers"},{"title":"Career and workspace controls","href":"/guides/career-workspace-reference"}]},{"group":"Application Tracker","pages":[{"title":"Tracking job applications","href":"/guides/tracking-job-applications"},{"title":"Adding an application","href":"/guides/adding-an-application"},{"title":"Managing an application","href":"/guides/managing-an-application"},{"title":"Customizing application stages","href":"/guides/customizing-application-stages"},{"title":"Scheduling interviews","href":"/guides/scheduling-interviews"},{"title":"Tailoring a resume for a job","href":"/guides/tailoring-a-resume-for-a-job"},{"title":"Viewing application insights","href":"/guides/viewing-application-insights"},{"title":"Importing applications from CSV","href":"/guides/importing-applications-from-csv"}]},{"group":"Integrations","pages":[{"title":"Using the API","href":"/guides/using-the-api"},{"title":"Using the patch API","href":"/guides/using-the-patch-api"},{"title":"JSON resume schema","href":"/guides/json-resume-schema"},{"title":"Using the MCP server","href":"/guides/using-the-mcp-server"},{"title":"Using WebMCP","href":"/guides/using-webmcp"},{"title":"Managing applications with MCP","href":"/guides/managing-applications-with-mcp"},{"title":"Using agent skills","href":"/guides/using-agent-skills"},{"title":"Large RPC requests","href":"/guides/large-rpc-requests"}]},{"group":"Use Cases","pages":[{"title":"Free resume builder","href":"/use-cases/free-resume-builder"},{"title":"Open-source resume builder","href":"/use-cases/open-source-resume-builder"},{"title":"Privacy-focused resume builder","href":"/use-cases/privacy-focused-resume-builder"},{"title":"Self-hosted resume builder","href":"/use-cases/self-hosted-resume-builder"},{"title":"API and MCP resume automation","href":"/use-cases/api-mcp-resume-automation"},{"title":"Export and share resumes","href":"/use-cases/export-and-share-resumes"},{"title":"AI resume builder","href":"/use-cases/ai-resume-builder"}]},{"group":"Comparisons","pages":[{"title":"Reactive Resume vs Canva","href":"/comparisons/reactive-resume-vs-canva"},{"title":"Reactive Resume vs Adobe Express","href":"/comparisons/reactive-resume-vs-adobe-express"},{"title":"Reactive Resume vs Overleaf","href":"/comparisons/reactive-resume-vs-overleaf"},{"title":"Reactive Resume vs Resume.com","href":"/comparisons/reactive-resume-vs-resume-com"},{"title":"Reactive Resume vs MyPerfectResume","href":"/comparisons/reactive-resume-vs-myperfectresume"},{"title":"Reactive Resume vs Resume-Now","href":"/comparisons/reactive-resume-vs-resume-now"},{"title":"Reactive Resume vs Resume.io","href":"/comparisons/reactive-resume-vs-resume-io"},{"title":"Reactive Resume vs Zety","href":"/comparisons/reactive-resume-vs-zety"},{"title":"Reactive Resume vs Kickresume","href":"/comparisons/reactive-resume-vs-kickresume"},{"title":"Reactive Resume vs ResumeGemini","href":"/comparisons/reactive-resume-vs-resumegemini"},{"title":"Reactive Resume vs Jobscan","href":"/comparisons/reactive-resume-vs-jobscan"},{"title":"Reactive Resume vs Resumod","href":"/comparisons/reactive-resume-vs-resumod"},{"title":"Reactive Resume vs Rezi","href":"/comparisons/reactive-resume-vs-rezi"},{"title":"Reactive Resume vs CareerCircle","href":"/comparisons/reactive-resume-vs-careercircle"},{"title":"Reactive Resume vs Novorésumé","href":"/comparisons/reactive-resume-vs-novoresume"},{"title":"Reactive Resume vs LiveCareer","href":"/comparisons/reactive-resume-vs-livecareer"},{"title":"Reactive Resume vs Freesumes","href":"/comparisons/reactive-resume-vs-freesumes"}]},{"group":"Self-Hosting","pages":[{"title":"Self-hosting with Docker","href":"/self-hosting/docker"},{"title":"Self-hosting with Kubernetes","href":"/self-hosting/kubernetes"},{"title":"Self-hosting on Vercel","href":"/self-hosting/vercel"},{"title":"Self-hosting on Hostinger","href":"/self-hosting/hostinger"},{"title":"Self-hosting on Cloudflare","href":"/self-hosting/cloudflare"},{"title":"Self-hosting on your NAS","href":"/self-hosting/nas"}]},{"group":"Server Configuration","pages":[{"title":"Environment variables","href":"/self-hosting/environment-variables"},{"title":"Sharing domains","href":"/self-hosting/sharing-domains"},{"title":"Mirror Computer Modern fonts","href":"/self-hosting/fonts"},{"title":"Deployment examples","href":"/self-hosting/examples"},{"title":"Job search and AI","href":"/self-hosting/job-search-and-ai"},{"title":"Single sign-on (SSO)","href":"/self-hosting/sso"}]},{"group":"Upgrade Guides","pages":[{"title":"Migrating from v5","href":"/self-hosting/upgrading-to-v6"},{"title":"Migrating from v4","href":"/self-hosting/migration"}]},{"group":"Contributing","pages":[{"title":"Development setup","href":"/contributing/development"},{"title":"Project architecture","href":"/contributing/architecture"},{"title":"Web access adapters","href":"/contributing/web-access"},{"title":"Career platform rollout","href":"/contributing/career-platform"},{"title":"Contributing translations","href":"/contributing/translations"},{"title":"Deployment checks","href":"/contributing/deployment-checks"}]},{"group":"Community","pages":[{"title":"Sponsors","href":"/community/sponsors"},{"title":"Spotlight","href":"/community/spotlight"}]},{"group":"Legal","pages":[{"title":"License","href":"/legal/license"},{"title":"Privacy Policy","href":"/legal/privacy-policy"},{"title":"Terms of Service","href":"/legal/terms-of-service"}]}]},{"tab":"Changelog","icon":"clock","pages":[{"title":"Changelog","href":"/changelog"}]},{"tab":"API Reference","icon":"code","pages":[{"title":"API Reference","href":"/api-reference/system/get-application-health-and-version"}]}]},"basePath":"","title":"Connecting an AI provider - Reactive Resume","buildId":"dpl_77Hw7ZuAABM8E3WMbYAf2ohQCr3v","deploymentId":"dpl_77Hw7ZuAABM8E3WMbYAf2ohQCr3v","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-CNMfPRAk.js","DynamicMarkdown-D9cdbgj9.js","zoom-image-lightbox-CqbnXZMj.js","lightbox-handle-r17bVUz3.js"]}