HiringCoachAI

AI model inventory

Last reviewed 2026-05-18

Current inventory of approved AI providers, model families, and AI service classes used by HiringCoachAI in production. Any material new provider, model family, or AI feature class requires review under secure development lifecycle and an update to this inventory.

Large Language Models (text)

Model family / identifiers Vendor Endpoint Data in Data out Retention Training opt-out

OpenAI GPT-family models, including configured defaults and route-specific model aliases OpenAI (called both directly via OpenAI API and via Vercel AI Gateway) api.openai.com/v1/chat/completions, api.openai.com/v1/responses, and Vercel AI Gateway equivalents Prompts (resume, job descriptions, questions, coaching and analysis inputs) Text completions Per-request store: false where supported. No Zero Data Retention (ZDR) amendment: OpenAI's then-current standard API retention windows apply. OpenAI's then-current standard API terms govern the no-training default; we have not signed an enterprise no-training amendment. Per-request store: false prevents generated responses from being stored as OpenAI application state for later retrieval.

Anthropic Claude models (claude-haiku-4-5, claude-sonnet-5-5, claude-opus-5-5, claude-fable-5-1), selectable only inside the admin Agents workspace (lib/agents/models.js, audit endpoint admin-agents) Anthropic api.anthropic.com/v1/messages (streaming, tool use) Admin-typed prompts, conversation history, tool results and attached file text from /admin/agents; no customer account data Generated text, tool calls, reasoning summaries Standard API terms; Anthropic's published retention for API data applies No training on API data under Anthropic's standard commercial terms

Perplexity Sonar-family models Perplexity api.perplexity.ai/chat/completions Research queries Search-grounded text Standard API terms; provider default retention applies. Per provider default no-training in standard API terms.

Registered endpoint recruiter-check-classify (Recruiter Scam Check message classifier, lib/recruiterCheck/classify.js): uses the default OpenAI alias through the Responses API, called via callWithAudit with store: false. Input is the message a visitor or signed-in user pastes, framed as untrusted data. Output is limited to a fixed list of scam signal ids, each with a quote that is verified as a substring of the input before use; the response is not stored. The classifier is optional and fails soft to the deterministic rules.

Registered endpoint ghost-job-check-classify (Ghost Job Signals posting reviewer, lib/ghostJob/classify.js): uses the default OpenAI alias through the AI Gateway Responses helper (createResponse with auditEndpoint, log-only safety check, store: false). Input is up to 6,000 characters of job posting text a visitor or signed-in user pastes, or the text of a public job page they link, framed as untrusted data. Output is limited to two ghost job signal ids (evergreen wording, reposted), each with a quote verified as a substring of the input before use; the response is not stored. The pass is optional, shares the Recruiter Scam Check spend caps, and fails soft to the deterministic rules.

Preferred model aliases are defined in the central model registry and AI Gateway configuration. Model strings flow through this registry and are reviewed during quarterly AI inventory refreshes.

Career Copilot answers (flagged, off by default)

Endpoint id Model alias Vendor Data in Data out Retention Training opt-out

career-copilot.answer (function career_copilot_answer) AI gateway default model (AI_GATEWAY_MODEL, default gpt-5-mini) OpenAI (direct or via Vercel AI Gateway) The user's question, up to 3 earlier questions, and excerpts of the user's own records (job titles, stages and notes, the focused job's description and fit analysis, master resume text, goals with progress, interview analysis summaries and gaps, Story Bank stories, offer stage), at most 24,000 characters. Resume contact fields (email, phone, address, links) and the raw text of an uploaded resume file are not sent, but resume body text the user typed can still contain contact details. Answer points with record refs; points without a valid ref, with a number not in the cited records, or with an employer, credential or tool the automatic check recognizes and cannot find in the cited records, are removed server-side before storage. Per-request store: false; audit row is metadata only. Same OpenAI standard API terms as the LLM table above.

Interview question bank scrub (flagged, off by default)

Endpoint id Model alias Vendor Data in Data out Retention Training opt-out

question-bank-scrub (function scrub_question) MODELS.openai.questionBankScrub (audit key openai/questionBankScrub) OpenAI One interview question a user chose to contribute, plus job title and stage hint. No name, email or uid is sent. Cleaned question text (or null), role family, seniority and stage enums. Deterministic checks then reject emails, phone numbers, URLs and interviewer names before storage. Per-request store: false; audit row is metadata only. Same OpenAI standard API terms as the LLM table above.

Interview debrief extraction (flagged, off by default)

Endpoint id Model alias Vendor Data in Data out Retention Training opt-out

interview-debrief-extract (function record_debrief) MODELS.openai.debriefExtract (audit key openai/debriefExtract) OpenAI The user's own debrief: a call transcript or typed text about an interview they attended, plus company, role and stage. Structured JSON (rating, interviewers named by the user, questions asked, next steps, suggested stage, follow-ups, coach note). Interviewer names not present in the source text are dropped after the call. Stored only in the user's own interviewDebriefs subcollection until the user applies or dismisses it. Per-request store: false; audit row is metadata only. Same OpenAI standard API terms as the LLM table above.

Coach front desk intake extraction (flagged, off by default)

Endpoint id Model alias Vendor Data in Data out Retention Training opt-out

coach-front-desk-intake (function record_intake) MODELS.openai.frontDeskIntake (audit key openai/frontDeskIntake) OpenAI The transcript of a call a member of the public placed to a coach's business line (assistant and caller turns), plus the coach's own intake questions and whether a booking text could be offered. The caller's phone number is not sent. Structured JSON (caller name, email, what they want help with, answers to the coach's intake questions, whether they asked for a booking text, and a consent quote). The consent quote is kept only if it is a verbatim substring of the caller's own words; an email that does not parse is dropped. Stored in coachFrontDeskCalls (90-day TTL) and the coach's coachProspects record. Per-request store: false; audit row is metadata only. Same OpenAI standard API terms as the LLM table above.

The spoken turns on these calls run through the existing phone relay turn model (voice-relay-turn) with the front desk persona, whose system prompt is assembled from the coach's configuration snapshot only, never from caller speech. No scoring runs on front desk calls.

Interview practice feedback (kill switch NEXT_PUBLIC_INTERVIEW_PRACTICE_V2=off)

Endpoint id Model alias Vendor Data in Data out Retention Training opt-out

interview-practice-feedback (function get_practice_feedback, analysis type interviewPracticeFeedback), first choice MODELS.openai.practiceFeedback (audit key openai/practiceFeedback) OpenAI The interview question, job title and company name, up to 3,000 characters of the saved job description, the focus the user chose for the take, the previous take's score and up to three fix titles, and the answer text (typed, or the user's edited speech-to-text transcript). Unless the user turned on content-only mode, also summary delivery measurements written as text (pace, filler words, pauses, voice variety and answer length; camera estimates are never sent) and insight titles. No audio, video, images or face data are sent. Structured JSON: an overall score and six component scores with one-sentence explanations, summary sentences, one strength, one to three ranked fixes, STAR flags with quotes, a stronger answer, revision steps, a next focus and a progress note. After the call, quotes that are not verbatim in the answer are dropped, numbers the answer never stated are replaced with placeholders, dashes are removed and emotion wording is scrubbed before the result is stored on the user's interviewPracticeAttempts document. Per-request store: false; audit row is metadata only. Same OpenAI standard API terms as the LLM table above.

Same endpoint, used when the first choice fails or returns an unusable result MODELS.openai.practiceFeedbackFallback (audit key openai/practiceFeedbackFallback) OpenAI Same as the row above. Same as the row above. Per-request store: false; audit row is metadata only. Same OpenAI standard API terms as the LLM table above.

Interview Analysis (transcript analysis)

Runs in lib/interviewAnalysis/runAnalysis.js for /api/interview-analysis/analyze and phone-call completion, through /api/openairequest (Responses API). When the result fails the runtime quality gates (lib/interviewAnalysis/qualityGates.js) and time allows, the same model is called once more with the same inputs plus the list of failed checks.

Endpoint id Model alias Vendor Data in Data out Retention Training opt-out

Analysis type interviewAnalysis (function analyze_interview_performance), first choice MODELS.openai.interviewAnalysis (audit key openai/interviewAnalysis) OpenAI The interview transcript the user pasted (up to 120,000 characters), the job's role title and company name, the user's round label, up to 5,000 characters of the saved job description and qualifications, transcript statistics measured on our side (word counts, talk share, per-answer lengths, filler and hedge counts, pace when the transcript has timestamps), and, for up to 3 earlier completed analyses of the same job, their date, round label, overall score and core gap keys, titles and severities. Structured JSON: overall, dimension and per-question scores, per-question breakdowns, core gaps with fixes, technical accuracy checks of the candidate's claims, pressure-test questions and a practice plan. After the call, scores are rounded to the rubric's increments of 5 and evidence quotes that are not in the transcript are dropped before the result is stored in the user's interviewAnalyses subcollection with the measured statistics and a quality summary. Per-request store: false; audit row is metadata only. Same OpenAI standard API terms as the LLM table above.

Same endpoint, used when the first choice fails (other than by timing out) or returns an unusable result and enough of the time budget remains MODELS.openai.interviewAnalysisFallback (audit key openai/interviewAnalysisFallback) OpenAI Same as the row above. Same as the row above. Per-request store: false; audit row is metadata only. Same OpenAI standard API terms as the LLM table above.

Full-length mock interview (flagged, off by default)

Three model aliases serve the interviewer, the question plan and the end-of-session synthesis of the full-length mock interview. Per-answer scoring in this feature reuses the interview-practice-feedback endpoint and its aliases above. Every call goes through the AI gateway client (lib/aiGateway/responses.js, streamed for interviewer turns), which sends store: false and writes an audit row. The user's audio is never sent to OpenAI.

Endpoint id Model alias Vendor Data in Data out Retention Training opt-out

mock-interview interviewer turns (streamed) and the four-value safety classification (function safety_check, run only on an ambiguous crisis keyword) MODELS.openai.mockInterviewer (audit key openai/mockInterviewer) OpenAI The interviewer rules, the current planned question, the role title and company name, up to 1,500 characters each of the job description and of the user's resume (dates of birth, visa status, salary and employment gap lines are removed first), the recent turns of the same session (the user's answers as typed or speech-to-text text), the notes the user typed in the session notes pad (framed as data), and short notes the model wrote earlier in the session. Spans the user mentioned about sensitive categories are passed as "do not reference". Text the server parses into the interviewer's next action, the open gaps, the spoken sentences (streamed to the user's browser and spoken by the TTS provider) and a note of up to 40 words, or the classification enum. Sentences are filtered before they are spoken. The note is stored on the user's session as a memory line. Per-request store: false; audit row is metadata only. Same OpenAI standard API terms as the LLM table above.

mock-interview question plan (function plan_interview) MODELS.openai.mockInterviewPlanner (audit key openai/mockInterviewPlanner) OpenAI The role title and company name, up to 3,000 characters each of the job description and of the user's resume (the same lines removed first), the titles of the user's saved stories, saved questions and bank questions, the user's focus areas, and the questions asked in the user's recent mock interviews. Strict JSON: spoken question text, type, competency, answer-key topics, resume checks and a harder variant. Private parts are stored in a server-only subdocument of the session. Per-request store: false; audit row is metadata only. Same OpenAI standard API terms as the LLM table above.

mock-interview session synthesis (function synthesize_session) MODELS.openai.mockInterviewSynthesis (audit key openai/mockInterviewSynthesis) OpenAI The user's own per-answer summaries, fixes, strengths and follow-up results from the session, with quotes taken from the normalized transcript, and deterministic statistics. Spans about sensitive categories are excluded. Strict JSON: a headline, strengths, patterns with evidence quotes and a next plan. Quotes that are not in the transcript are dropped before the result is stored on the session. Per-request store: false; audit row is metadata only. Same OpenAI standard API terms as the LLM table above.

LinkedIn Profile Score (flagged, off by default)

Endpoint id Model alias Vendor Data in Data out Retention Training opt-out

linkedin-score-judge (function report_profile_judgments) MODELS.openai.default (gpt-5-mini) OpenAI (direct or via Vercel AI Gateway) The user's own LinkedIn profile text without name, location or contact data (headline, About, experience titles, companies and descriptions, skill names, education degree and field), framed as untrusted data, plus the target role and goal. Callers are anonymous visitors to the public page (no uid) and signed-in users. One band (strong, adequate or weak) per AI-judged rubric check, each with a quote; a judgment whose quote is not a substring of the profile text is dropped, and points are computed in code. Anonymous results are cached in server memory as check ids and bands only; signed-in results keep the same bands on the user's linkedinScores document. Per-request store: false; audit row is metadata only. Same OpenAI standard API terms as the LLM table above.

linkedin-score-rewrite (function draft_section_options) MODELS.openai.default (gpt-5-mini) OpenAI (direct or via Vercel AI Gateway) The same profile text, the section to rewrite (headline, About or one experience entry), the target role and goal, an optional job description, and for signed-in users the master resume text with every line holding an email, phone number, link or street address removed. Callers are anonymous visitors to the public page (no uid) and signed-in users. Three drafts. A draft naming a tool, credential or certification not found in the profile or resume, or holding an AI-tell phrase or buzzword, or presenting the target role as a title the user holds, or describing a draft instead of being one, or outside the section's length bounds, is dropped; unsourced numbers become a placeholder. Kept drafts are re-scored in code and returned to the browser; they are not stored. Per-request store: false; audit row is metadata only. Same OpenAI standard API terms as the LLM table above.

Image generation

Endpoint id Model alias Vendor Data in Data out Retention Training opt-out

admin-agents.generate_image (the admin Agents generate_image tool, through lib/ai/images.js) gpt-image-1 as MODELS.openai.socialImage (audit key openai/socialImage) OpenAI (api.openai.com/v1/images/generations) An admin-typed image prompt (up to 32,000 characters), the size and the image count from /admin/agents; no customer account data. Social Studio image generation sits behind SOCIAL_STUDIO_IMAGES_ENABLED (default off) and is not offered while decision R8 (no generated imagery) stands. One to four PNG images returned as base64 and saved as files in the requesting admin's Agents workspace. The Images API has no store parameter; OpenAI's then-current standard API retention applies. No Zero Data Retention (ZDR) amendment. Audit row is metadata only. Same OpenAI standard API terms as the LLM table above.

Speech synthesis (TTS)

Voice / model Vendor Data in Retention Training opt-out

ElevenLabs voices and speech models, including user-selectable voices ElevenLabs Text to speak Standard API terms; provider default retention applies. Per provider default no-training in standard API terms.

en-US-Neural2-* (the full-length mock interview uses en-US-Neural2-F, -D and -C over the REST text:synthesize method) Google Cloud Text-to-Speech Text to speak (one interviewer sentence per request) Standard API terms; provider default retention applies. Per provider default no-training in standard API terms.

Aura voices for pep talks: the user-selectable aura-2-* pep-talk voices, aura-2-delia-en for the pep talk generated when a user adds a job during onboarding, and aura-asteria-en as the server default when a request names no valid voice (for example the fallback after Google voice synthesis fails) Deepgram Pep-talk text to speak (the whole pep talk in one request, up to 5,000 characters), written by a model from the user's resume and a job description Provider default retention applies. Every request sets mip_opt_out=true to opt out of the Deepgram model improvement program.

aura-2-* (optional voice provider for the full-length mock interview, MOCK_INTERVIEW_TTS_PROVIDER=deepgram) Deepgram Text to speak (one interviewer sentence per request) Provider default retention applies. Every request sets mip_opt_out=true to opt out of the Deepgram model improvement program.

Speech recognition (STT)

Model Vendor Data in Retention Training opt-out

nova-2 Deepgram Audio clip Per-request redact=true to redact sensitive number-like entities from transcripts, such as payment cards and Social Security numbers. Provider default audio retention otherwise applies. Every request sets mip_opt_out=true to opt out of the Deepgram model improvement program.

Embedding / other

HiringCoachAI does not currently run a first-party embedding, reranker, or classification model in production. Any new embedding, reranker, or classification model is added here before deploy.

Endpoint configuration

Endpoint Base URL Timeout Retry policy

Vercel AI Gateway https://ai-gateway.vercel.sh/v1 60 s Up to 3 on 5xx

Perplexity https://api.perplexity.ai 30 s 1

ElevenLabs https://api.elevenlabs.io/v1 30 s 1

Deepgram https://api.deepgram.com/v1 30 s 1

Google TTS texttospeech.googleapis.com 30 s 1

Version pinning

Preferred model aliases live in a central registry consumed by the application and the AI Gateway configuration.

OpenAI aliases route through either direct OpenAI API calls or the Vercel AI Gateway. The provider or gateway may resolve aliases to snapshots at request time. To convert an alias into a hard pin, the relevant configuration is updated with the reviewed snapshot identifier.

A drift detector calls each provider's model-list endpoint monthly, resolves what each alias currently points to, and exits non-zero if the underlying snapshot has rolled since the last review. On drift, the responsible engineer either accepts the new snapshot (updating the central audit record with the new value and a fresh verifiedAt date) or pins to the prior weights (replacing the alias with the previous snapshot string).

Deepgram speech-to-text and text-to-speech, ElevenLabs speech, and Google text-to-speech identifiers are pinned by provider model or voice name in the central registry or feature-specific configuration.

Change log

Date Change Author

2026-04-24 Initial inventory Engineering Lead

2026-04-24 Added the central model-audit record and monthly drift-detection job; documented monthly review process Engineering Lead

2026-05-12 Reframed inventory around approved providers/model families and documented legacy route-specific model-string migration gap Engineering Lead

2026-09-29 Registered the recruiter-check-classify endpoint (Recruiter Scam Check) Engineering

2026-09-30 Registered the interview practice feedback endpoint and its model aliases practiceFeedback and practiceFeedbackFallback Engineering

2026-09-30 Registered the full-length mock interview: model aliases mockInterviewer, mockInterviewPlanner and mockInterviewSynthesis, the optional Deepgram Aura voice provider, and mip_opt_out=true on its Deepgram requests Engineering

2026-10-05 Registered Deepgram Aura text-to-speech for pep talks (user-selectable aura-2-* voices, aura-2-delia-en for generated pep talks, aura-asteria-en server default), which the inventory had omitted. These requests do not set mip_opt_out=true. Engineering

2026-10-05 Every Deepgram request (nova-2 speech-to-text and Aura text-to-speech, pep talks included) now sets mip_opt_out=true, and scripts/verify-ai-zdr.js fails any Deepgram call without it. Engineering

2026-10-07 Dropped the provider default no-training clause from the full-length mock interview aura-2-* row, matching the other Deepgram rows: its opt-out is the per-request mip_opt_out=true that every request sets. Engineering

2026-10-08 Registered the ghost-job-check-classify endpoint (Ghost Job Signals) Engineering

2026-10-08 Registered the career-copilot.answer endpoint (Career Copilot, flagged off) Engineering

2026-10-15 Registered Interview Analysis with model aliases interviewAnalysis and interviewAnalysisFallback (previously hard-coded model strings); inputs now include measured transcript statistics and up to 3 earlier rounds' gap keys and scores for the same job, and outputs include technical accuracy checks Engineering

2026-10-16 Registered the linkedin-score-judge and linkedin-score-rewrite endpoints (LinkedIn Profile Score, flagged off) Engineering

2026-10-22 Registered gpt-image-1 (alias MODELS.openai.socialImage, audit key openai/socialImage), which the admin Agents generate_image tool already used and this inventory had omitted; the call moved into lib/ai/images.js. Social Studio image generation stays off (SOCIAL_STUDIO_IMAGES_ENABLED) Engineering

Quarterly review checklist

During each quarterly review, we verify:

Every AI provider and material model family in production is listed.

Every listed provider/model family has a documented retention and training-opt-out posture.

No new models were introduced without review.

Automated AI inventory parity and retention-flag checks pass.

Vendor certifications and trust-center evidence remain current; see the sub-processors.


showUpgradeModal: false, modalType: migration, planName: